SpringMVC概述
Spring MVC是spring提供的一个强大而灵活地web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使控制器的开发和测试更简单。这些控制器一般不直接处理请求,而是将其委托給Spring上下文中的其他bean,通过spring的依赖注入功能,这些bean被注入到控制器中
SpringMVC:对servlet做的一个封装,换成controller层
SpringMVC主要由DispatcherServlet、处理器映射、处理器适配器、视图解析器、视图组成。它的两个核心是:
**处理器映射:**选择使用哪个控制器来处理请求
**视图解析器:**选择结果应该如何渲染
以上两点,Spring MVC保证了如何选择控制处理请求和如何选择视图展现输出之间的松耦合
Spring的处理流程原理
spring架构:
框架流程如下:
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器。
- 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
- DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
- 执行处理器(Controller,也叫后端控制器)
- Controller执行完成返回ModelAndView
- HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewReslover视图解析器
- ViewReslover解析后返回具体View
- DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
- DispatcherServlet响应用户
配置文件的配置
1、web.xml文件的配置
<!--配置springMVC 入口 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<!--springMVC分发器 前端控制器-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--默认到WEB-INF下加载springmvc的配置文件 <servlet-name></servlet-name> -->
<!--指定位置下的springmvc配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:com/config/springmvc-servlet.xml</param-value>
</init-param>
<!--配置一个大于等于0的数,在服务器启动时,实例化 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!--URI地址规则匹配 *.do 处理器映射 会拦截*.do结尾的请求-->
<servlet-name>springMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
当映射为@RequestMapping("/user/add")时:
- 拦截*.do,例如:/user/add.do,弊端:所有的url都要以.do结尾。不会影响访问静态文件。
- 拦截/app/*,例如:/app/user/add,弊端:请求的url都要包含/app,@RequestMapping("/user/add")中不须要包含/app。
- 拦截/,例如:/user/add,弊端:对jpg,js,css静态文件的访问也被拦截不能正常显示。后面有解决办法。
- 拦截/*,可以走到Action中,但转发到jsp时再次被拦截,不能访问到jsp。
2、添加配置SpringMVC的主配置文件springmvc-servlet.xml
<!--注解处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.servlet"></context:component-scan>
<!--mvc注解启动,自动注册mvc依赖的内置bean 此标签自动加载处理映射器和处理器适配器-->
<mvc:annotation-driven></mvc:annotation-driven>
<!--配置视图解析器,拼接返回的URI 视图解析类-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
3、创建一个普通类,添加对应注释
@Controller
public class ClientController(){
@RequestMapping("/client/loginAction")
public String login(Client client ) {
System.out.println("this is mvc action");
System.out.println("username id:"+client.getCliName());
System.out.println("password id:"+client.getCliPassword());
return "success";
}
}
过滤器
<!--spring提供的字符编码过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!--响应字符编码集 -->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
/init-param>
</filter>
<!--过滤所有地址请求 -->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
工作流程:
加载web.xml,读取配置,启动SpringMVC
发送URL请求,匹配规则*.do 实例化SpringMVC的Servlet对象
扫描注解路径,寻找标记注解@Controller层
根据URI请求的地址,匹配方法上的注解@RequsetMapping的值
执行方法
解析返回值,匹配默认的视图解析器,拼接成一个跳转的URI(默认转发)