Spring MVC工作流程
在web.xml中前端控制器DispatcherServlet
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Spring MVC Application</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring/springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
后端配置文件(contextConfigLoaction.xml)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
<!-- scan the package and the sub package -->
<context:component-scan base-package="pers.kevin.mvcrest"/>
<!-- if you use annotation you must configure following setting -->
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
配置了<context:component-scan/>
后,就可以不用配置 <context:annotation-config/>
Spring配置项<context:annotation-config>
的解释说明
ViewReslover
这是用来解析“逻辑视图”,将委托给“物理视图”的解析器,以下是它们的实现类:
InternalResourceViewResolver.class
ResourceBundleViewResolver.class
XmlViewResolver.class
BeanNameViewResolver.class
配置方式如下:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
后端控制器 SpringMVC常用注解
@Controller
负责注册一个bean 到spring 上下文中
@RequestMapping
注解为控制器指定可以处理哪些 URL 请求,当写在方法上的时候,指的是该方法的URL请求路径;当写在类上的时候,指的是该类下的方法的URL根路径。
@RequestMapping(method=RequestMethod.POST) 等同 @PostMapping
@RequestMapping(method=RequestMethod.GET) 等同 @GetMapping
RequestMapping中的Class定义:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
String[] value() default {};
RequestMethod[] method() default {};
String[] params() default {};
String[] headers() default {};
String[] consumes() default {};
String[] produces() default {};
}
value: 指定请求的实际地址, 比如 /action/info之类。
method: 指定请求的method类型, GET、POST、PUT、DELETE等
consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回
params: 指定request中必须包含某些参数值是,才让该方法处理
• @RequestMapping(params={"id=1"})
• 只处理参数带有"id=1"的请求(post,get都可以)
headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求
可以使用consumes={“”}相当于headers=”Content-Type=”
可以使用produces={“”}相当于headers=”Accept=”
@RequestBody
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上 ,再把HttpMessageConverter返回的对象数据绑定到 controller中方法的参数上
@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区,@ResponseBody返回的内容不止json一种,还有text,xml和其他,如何控制返回的类型由程序自动选择,可以查找springmvc的HttpMessageConverter部分内容。要想@ResponseBody返回Json,必须要加入json解析的jar包。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.5</version>
</dependency>
@RestController
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。返回json数据不需要在每方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面
@ModelAttribute
在方法定义上使用 @ModelAttribute 注解,Spring MVC 会在Controller每个方法执行之前,会先逐个调用在方法上标注了@ModelAttribute 的方法 。
在方法的形参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数 –绑定到对象中,再传入入参将方法入参对象添加到模型中
@RequestParam
在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法
@RequestMapping("/")
public String Demo1(@RequestParam(name="lid") String id){
System.out.println("----"+id);
return null;
}
@PathVariable
绑定 URL 占位符到入参
@RequestMapping("/edit/{id}/{name}")
public String edit(Model model, @PathVariable long id,@PathVariable String name) {
return page("edit");
}
@SessionAttributes
默认情况下Spring MVC将模型中的数据存储到request域中。当一个请求结束后,数据就失效了。如果要跨页面使用。那么需要使用到session。而@SessionAttributes注解就可以使得模型中的数据存储一份到session域中。
@SessionAttributes参数:
1、names:这是一个字符串数组。里面应写需要存储到session中数据的名称。
2、types:根据指定参数的类型,将模型中对应类型的参数存储到session中
3、value:其实和names是一样的。
springMVC源码分析–@SessionAttribute用法及原理解析SessionAttributesHandler和SessionAttributeStore
cookie中的数据的接收
在Spring MVC中使用CookieValue注解映射请求参数,CookieValue有三个属性,分别如下:
(1) value 请求参数的参数名;
(2) required 该参数是否必填,默认为true(必填),当设置成必填时,如果没有传入参数,报错;
(3) defaultValue 设置请求参数的默认值;
@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue("JSESSIONID") String sessionId ) {
System.out.println("testCookieValue,sessionId="+sessionId);
return SUCCESS;
}
“web context” 对象尽量不用
请求处理方法的形参可以是:
request,response,session,inputStream,outStream,Writer,Reader,
框架会自动识别,并将传入实参,但“侵入度过高”
当形参类型是Map,Model,ModelMap时,框架会将其实参置入request。
也可以利用@ModelAttributer进行指定
关于表单方式的”put”,”delete”
表单不支持put,delete
添加隐藏域:
<input type="hidden" name="_method" value="PUT">
增加过滤器:
<filter>
<filter-name>HiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
新版本解决手段:
<filter>
<filter-name>HttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HttpPutFormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
url-parttern
“/*”:表示”全部匹配”。
“/”:表示”除具体匹配外”的所有匹配。
如果spring配置”/”,将覆盖所有除jsp和jspx外的所有路径
这将导致html,css,js等静态资源无法访问
解决方法一
在web.xml中配置:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.html</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>*.js</url-pattern>
<url-pattern>*.jpeg</url-pattern>
</servlet-mapping>
解决方法二
设置静态资源路由
<!-- 当加入resource时,必须加入,否则无法访问controller-->
</mvc:annotation-driven>
<!--设置资源的可访问性,默认安全保护 -->
<mvc:resources location="/" mapping="/*.html"/>
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
拦截器
preHandle:预处理回调方法,实现处理器的预处理(如登录检查)
postHandle:后处理回调方法
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理
public class UserInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
}
}
配置:
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="pers.kevin.springmvc.interceptor.UserInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>
中文数据提交
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>