初期环境配置
【1】导入所需jar包
–commons-logging-1.1.3.jar
–spring-aop-4.0.0.RELEASE.jar
–spring-beans-4.0.0.RELEASE.jar
–spring-context-4.0.0.RELEASE.jar
–spring-core-4.0.0.RELEASE.jar
–spring-expression-4.0.0.RELEASE.jar
–spring-web-4.0.0.RELEASE.jar
–spring-webmvc-4.0.0.RELEASE.jar
【2】配置项目总配置文件web.xml
配置前端控制器 DispatcherServlet
默认加载 /WEB- INF/<servletName-servlet>.xml 的 SpringMVC 配置文件
可以通过加载初始化参数配置
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
【3】配置SpringMVC配置文件
<!-- 配置SpingMVC容器要扫描的包! -->
<context:component-scan base-package="XXX"></context:component-scan>
配置视图解析器(InternalResourceViewResolvers)
将逻辑视图转换成实际的物理视图,做一个转发操作
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
使用SpringMVC
【1】@RequestMapping 映射请求 Spring MVC
1、使用 @RequestMapping 注解为控制器指定可以处理哪些 URL 请求
2、在控制器的类定义及方法定义处都可标注
>>DispatcherServlet 截获请求后,就通过控制器上@RequestMapping 提供的映射信息确定请求所对应的处理方法
3、映射请求参数、请求方法或请求头
>>params params={"",""}
①出现在@RequestMapping中表示请求必须包含名为XXX的请求参数
②{"!XXX"}表示请求不能包含名为 XXX 的请求参数
③{"xxx!=values"}表示请求包含名为XXX的请求参数,但其值不能为 values
4、Ant 风格资源地址支持 3 种匹配符:
?:匹配文件名中的一个字符
*:匹配文件名中的任意字符
**:** 匹配多层路径
【2】@PathVariable 映射 URL 绑定的占位符
通过 @PathVariable 可以将 URL 中占位符参数绑定到控制器处理方法的入参中:
URL 中的 {xxx} 占位符可以通过@PathVariable("xxx") 绑定到操作方法的入参中,需要注意的是:该注解的value属性值要与占位符保持一致
【3】REST请求风格
GET、POST、PUT、DELETE
POST请求如何转化为put请求和delele请求
(1)在web.xml文件中配置
<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>
(2)在表单域中需要携带一个name值为_method,value值为put或者delete的参数
<form action="${pageContext.request.contextPath }/order/1" method="post">
<input type="hidden" name="_method" value="put"/>
<input type="submit" value="Submit"/>
</form>
【4】@RequestParam 接收请求的参数
@CookieValue处理方法入参绑定某个 Cookie 值
相当于Servlet的getParameter()方法
用在方法入参内
三个默认属性:
>>value:这个字段要与请求参数的name属性值一致
>>required:布尔值,默认是true,当指定为false的时候,说明这个参数不是必须的,可以不带
>>defaultValue:在我们不传值的时候,默认使用defaultValue的值,传递参数的时候,使用我们传递的参数值
【5】@RequestHeader 获取请求头信息
用在方法入参内
value:这个字段要与请求参数的name属性值一致!
required:布尔值,默认是true,当指定为false的时候,说明这个参数不是必须的,可以不带!
defaultValue:在我们不传值的时候,默认使用defaultValue的值,传递参数的时候,使用我们传递的参数值!
【6】针对POST请求乱码的处理
在web.xml文件中加上CharacterEncodingFilter
<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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
【6】MVC 的 @Controller标注的方法可以接受哪些 ServletAPI 类型的参数
HttpServletRequest
HttpServletResponse
HttpSession
【7】POJO 对象绑定请求参数值
Spring MVC 会按请求参数名和POJO属性名进行自动匹配,支持级联
【8】模型数据–ModelAndView
- 返回值是String类型还是ModelAndView类型,SpringMVC框架执行目标Handler方法之后都会将返回值解析为ModelAndView
- 我们放入到Map或者Model、ModelMap中的数据都会放入ModelAndView对象中,作为Model使用
- 操作步骤
- 添加模型数据addObject
- 设置视图setViewName
【9】SpringMVC如何实现重定向和转发
- redirect:/success.jsp 重定向
- forward:/success.jsp 转发
- 在spingmvc配置文件中配置
- mvc:view-controller path=”/j1sp” view-name=”success”
此标签用于访问静态资源 - 请求不经过Controller,直接进入另一个目标页面
- 但是此时原来访问正常的@RequestMapping URL现在却不能正常访问
需要加入mvc:annotation-driven标签
- mvc:view-controller path=”/j1sp” view-name=”success”
【10】@SessionAttributes
- SpringMVC将在模型中对应的属性放入到reuqest域的同时暂存到 HttpSession 中
【11】@ModelAttribute
- 方法定义上使用 @ModelAttribute 注解
- Spring MVC在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法
- 方法的入参前使用 @ModelAttribute 注解
- SpringMVC会使用value属性值在implicitModel中查找对应的对象,若存在则会直接传入到目标方法的入参中
- SpringMVC会以value为key,POJO类型的对象为value,存入到request域
【12】SpringMVC确定目标方法POJO类型入参的过程
确定一个key:
- 若目标方法的POJO类型的参数木有使用@ModelAttribute作为修饰,则key为POJO类名第一个字母的小写。
- 若使用@ModelAttribute修饰,则key为@ModelAttribute注解的value属性值.
在implicitModel中查找key对应的对象,若存在,则作为入参传入
- 若在@ModelAttribute标记的方法中在Map保存过,且key和1确定的key一致,则会获取到
在implicitModel中不存在key对应的对象,则检查当前的Handler是否使用@SessionAttribute注解修饰,若使用了该注解,且@SessionAttributes注解的value属性值中包含了key,则会从HttpSession中来获取key所对应的value值,若存在则直接传入到目标方法的入参中,若不存在则将抛出异常。
若Handler没有标识@SessionAttributes注解或者@SessionAttributes注解的value值中不包含key,则会通过反射来创建POJO类型的参数,传入为目标方法的参数。
- SpringMVC会把key和POJO对象保存到implicitModel中,进而会保存到request域中!
【13】SpringMVC 的表单标签form:form
- 需要表单回显或者使用下拉列表的时候,就使用form表单标签
form:radiobuttons:单选框组标签,用于构造多个单选框
items:可以是一个 List、String[] 或 Map
itemValue:指定 radio 的 value 值。可以是集合中 bean 的一个 属性值
itemLabel:指定 radio 的 label 值
- delimiter:多个单选框可以通过 delimiter 指定分隔符
【14】自定义视图
- 实现view接口或者继承AbstractView抽象类,并加入到IOC容器中
- 在springmvc配置文件中配置BeanNameViewResolver视图解析器
- SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常
【15】自定义类型转换器
- 实现Converter< S,T >接口并加入到SpringMVC的IOC容器中
- 配置自定义转换器到FormattingConversionServiceFactoryBean工厂中
<!-- 将ConversionService再作为annotation-driven的一个属性存在! --> <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <!-- 配置ConversionService --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <ref bean="employeeConverter"/> </set> </property>
【16】SpringMVC如何处理JSON数据
- 加入json的3个jar包
- jackson-annotations-2.1.5.jar
jackson-core-2.1.5.jar
jackson-databind-2.1.5.jar
- jackson-annotations-2.1.5.jar
- 编写目标方法,使其返回 JSON 对应的对象或集合
- 在方法上添加 @ResponseBody 注解
【17】自定义拦截器
- 自定义实现类实现 HandlerInterceptor接口
- preHandle():该方法在目标方法之前被调用
- postHandle():调用目标方法之后,但渲染视图之前被调用
- afterCompletion():渲染视图之后被调用
在springmvc配置文件中配置相对应的拦截器
<mvc:interceptors> <!--配置自定义拦截器 ,所有的路径都拦截 --> <bean class="com.neuedu.springmvc.filter.MyFilter"></bean> <!-- 关于拦截器的配置问题 ,可以通过<mvc:interceptor>来配置使用哪个拦截器来【不】拦截的路径--> <mvc:interceptor> <!-- 用<mvc:mapping>标签指定要拦截的路径 --> <mvc:mapping path="/employ"/> <!-- 指定使用哪个拦截器进行拦截 --> <bean class="com.neuedu.springmvc.filter.SecondFilter"></bean> </mvc:interceptor> </mvc:interceptors>