作者:让生活洒满阳光_622 | 来源:互联网 | 2023-05-17 13:42
springmvc是一个基于mvc的web框架,他控制着请求相应的整个流程,从请求一进入到应用服务器到相应离开,都离不开mvc框架。请求在应用服务器中先说说请求相应在应用服务器的整
springmvc是一个基于mvc的web框架,他控制着请求相应的整个流程,从请求一进入到应用服务器到相应离开,都离不开mvc框架。
请求在应用服务器中
先说说请求相应在应用服务器的整个过程
- 发起请求到前端控制器(DispatcherServlet)
- 前端控制器请求HandlerMapping查找 Handler可以根据xml配置、注解进行查找
- 处理器映射器HandlerMapping向前端控制器返回Handler
- 前端控制器调用处理器适配器去执行Handler
- 处理器适配器去执行Handler
- Handler执行完成给适配器返回ModelAndView
- 处理器适配器向前端控制器返回ModelAndView ,ModelAndView是springmvc框架的一个底层对象,包括 Model和view
- 前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)
- 视图解析器向前端控制器返回View
- 前端控制器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域
- 前端控制器向用户响应结果
组件:
1、前端控制器DispatcherServlet(不需要程序员开发)
作用接收请求,响应结果,相当于转发器,中央处理器。
有了DispatcherServlet减少了其它组件之间的耦合度。
2、处理器映射器HandlerMapping(不需要程序员开发)
作用:根据请求的url查找Handler
3、处理器适配器HandlerAdapter
作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler
4、处理器Handler(需要程序员开发)
注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
5、视图解析器View resolver(不需要程序员开发)
作用:进行视图解析,根据逻辑视图名解析成真正的视图(view)
6、视图View(需要程序员开发jsp)
View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
关于DisptacherServlet
DisptacherServlet是SpringMVC的调度中心,在这里请求会第一次进入到SpringMVCDisptacherServlet配置着SpringMVC运作的信息在以前,我们会在web.xml中配置SpringMVC,然后SpringMVC会根据web.xml中的配置初始化DisptacherServlet在servlet3.0之后,出现了ServletContainerInitializer,可以在项目启动最开始时,会自动扫描实现了ServletContainerInitializer接口的类,对Servlet、Listener、Filter进行动态注册,利用此技术,可以通过实现ServletContainerInitializer来配置DisptacherServlet(注册controller,ViewResolve),达到SpringMVC零配置的效果
关于ServletContainerInitializer
ServletContainerInitializer的作用和web.xml差不多,都是部署servlet,listener,filter,只是一个是用java代码配置,一个用xml配置在实现了ServletContainerInitializer接口的类上要注解上@HandlesTypes(//要动态注册的class,一定要是Servlet或者Listener或者Filter)ServletContainerInitializer接口中只有一个方法onStart(Set,ServletContext)当应用启动的时候,会调用onStart方法,参数Set就是@HandlesTypes中的类,意味着这些类可以被动态注册实现动态注册的核心方法:
- addServlet(String name,Servlet servlet)
- addFilter(String name,Filter filter)
- addListener(Listener listener)
这些都是注册Servlet、listener、filter的方法显然还是有点麻烦,所以随着spring的发展,有更多简单的方法去配置现在最简单就是继承AbstractAnnotationConfigDispatcherServletInitializer,重写getServletConfigClasses、getServletMappings、getRootConfigClasses来配置DisptacherServlet
配置DisptacherServlet
这一步,跟配置web.xml作用差不多,就是要部署注册servlet在这里我们采用继承重写AbstractAnnotationConfigDispatcherServletInitializer的方法,来配置DisptacherServlet
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer{
//得到中间层(service、dao、aop、po等)的配置
@Override
protected Class>[] getRootConfigClasses() {
return new Class[]{DAOConf.class,ServiceConf.class,AOPConf.class};
}
//得到controler和ViewResolver的配置
@Override
protected Class>[] getServletConfigClasses() {
return new Class[]{SpringMvcConf.class};
}
//标识哪些url要经过这个DisptacherServlet处理
@Override
protected String[] getServletMappings() {
return new String[]{"/"};//所有url都被DisptacherServlet处理
}
}
SpringMVC配置
这一步是完成SpringMvcConf.class,这个类配置了一些controller和ViewResolver
@Configuration
@EnableWebMvc
//扫描控制器
@ComponentScan(includeFilters=@ComponentScan.Filter(type=FilterType.ANNOTATION,value=Controller.class))
public class SpringMvcConf extends WebMvcConfigurerAdapter {
//配置视图解析器
//html解析
@Bean
public ViewResolver htmlResolver(){
InternalResourceViewResolver viewResolver=new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/view/");
viewResolver.setSuffix(".html");
return viewResolver;
}
//静态资源处理
//当DisptacherServlet接收到了他匹配的请求,但是找不到相应的Controller,就会把这个请求返回给默认的处理(比如交给tomcat处理)
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
这里关键有几步:
- @EnableWebMvc,开启springmvc
- @ComponentScan开启自动扫包,扫描所有带有@Controller的Bean
- 添加ViewResolver,这里的配置是使,视图路径为"/WEB-INF/view/"+Controller返回的视图名+".html"
- 因为之前配置了所有路径都被DisptacherServlet接收,这会导致一些静态资源找不到controller去处理,结果出现404,configurer.enable()开启了之后,当springmvc不能处理的时候会交回给默认的处理
配置Controller
最简单配置
@Controller
public class IndexServlet {
@RequestMapping(value="/",method=RequestMethod.GET)//GET方法访问"/"的时候,调用此方法
public String get(Model model){
model.addAttribute("title","index");
return "index";
}
}
这是一个最简单的控制器,几个要点
- 当类被@Controller注释时,该类就是一个控制器
- 控制器中的方法被@RequestMapping标识,配置了这个方法访问的url和method
- get方法有一个参数Model,这跟Request中的Attribute差不多,model.addAttribute就跟request.addAttribute一样
接收参数
接收参数形式有3种:?号传值,路径变量,提交表单
?号传值
访问形式:路径?参数名=值&参数名=值
@RequestMapping(value="/login",method=RequestMethod.GET)
public String login(@RequestParam("username")String username,@RequestParam("password")String password){
return "login";
}
这样子就能拿到参数了
路径变量
这种也是用的比较多的,通过占位符来实现访问形式:路径/参数值
@RequestMapping(value="/logout/{id}",method=RequestMethod.GET)
public String logout(@PathVariable("id")int id){
return "logout";
}
比如访问"/logout/123",123就是id参数
表单变量
当表单要上传一个对象的时候,这种方式就很好用了,springmvc会自动将读取表单数据然后实例化相应bean
@RequestMapping(method=RequestMethod.POST,path="/user")
public String Post(User user){
return "post";
}
新年新气象,祝大家在新的一年学习愉快!
添加微信关注更多干货,欢迎来踩!