基本概念
- 前端控制器(DispatcherServlet)
- 本质上是一个Servlet,相当于一个中转站,所有的访问都会到这个Servlet,再根据配置进行中转到相应的Handler中进行处理,获取到数据和视图,最后给出相应。相当于整个应用层的调度中心。
- 处理器映射器(HandlerMapping)
- 本质上就是一段映射关系,将访问路径和对应的Handler存储为映射惯性,在需要时供前段控制器查阅。
- 处理器适配器(HandlerAdapter)
- 本质上是一个适配器,可以根据要求找到对应的Handler来运行。
- 视图解析器(ViewResolver)
- 本质上也是一种映射关系,可以将视图名称映射到真正的的试图地址,前端控制器调用处理器适配完成得到modle和view,将view信息传给试图解析器得到真正的view
- 处理器(Handler)
- 本质上是自己开发的一个Controller对应的一个带有RequestMapping的方法。负责处理web层的业务逻辑,控制界面跳转等。
配置视图解析器
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
修改SpringMVC配置文件的位置
- SpringMVC默认是从WEB-INF下找配置文件。
- 可以在web.xml中配置指定文件的位置和名字
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
SpringMVC的注解方式配置
- springmvc常用注解标签详解
- 开启MVC注解驱动
<mvc:annotation-driven/>
- @RequestMapping("/xx") 配置处理器的映射路径
- @RequestParam 请求参数中的名称和属性名称不同的处理。
- value 指定请求的参数名
- defaultValue 指定默认的值
- required 指定是否为必须接收参数,没有参数传经来则报400错
SpingMVC乱码问题解决
- 配置字符集过滤器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>
- 只能处理post请求乱码,get请求还是需要自己处理
-get方式解决乱码问题- 接收参数时通过解码再编码解决
- 自己写过滤器处理get请求乱码
- 修改tomcat参数编码方式
- <Connector port=“8080” protocol=“HTTP/1.1”
connectionTimeout=“20000”
URIEncoding=“UTF-8”
redirectPort=“8443” />
- <Connector port=“8080” protocol=“HTTP/1.1”
- 多用post方式提交数据,尽量避免get方式提交中文问题
SpringMVC日期格式参数处理
- 配置初始化绑定器
@InitBinder
// 方法名不限
public void InitBinder(ServletRequestDataBinder binder){
binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
}
SpringMVC处理文件上传问题
- 配置文件上传Bean
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 解决文件名乱码 -->
<property name="defaultEncoding" value="utf-8"></property>
<!-- ... -->
</bean>
- 处理器(Handler)接收的参数类型
MultipartFile
- 从服务器获取到的流可以不关,服务器会自动处理
IOUtils
处理上传文件FileUtils
处理上传文件
SpringMVC对RESTFul风格的请求处理
- 将请求参数放在请求作为请求路径传递
- 请求url: localhost:80/test5/zs/123.do
@RequestMapping("/test5/{username}/{password}.do")
public String test4(@PathVariable String username, @PathVariable String password) {
System.out.println(username);
System.out.println(password);
return "show.jsp";
}
重定向与请求转发
- 传统方式依然支持
- 请求转发:
req.getRequestDispatcher("/WEB-INF/show.jsp").forward(req, resp);
- 重定向:
resp.sendRedirect("/show.jsp");
- 请求转发:
- SpringMVC方式
- 请求转发:
return "forword:/WEB-INF/show.jsp";
- 重定向:
return "redirect:/show.jsp";
- 请求转发:
- SpringMVC默认为请求转发
return "/WEB-INF/show.jsp";
Session的使用
- 传统Session用法
HttpSession session = req.getSession();
- SpringMVC方式
- 通过参数传递
HttpSession session
@SessionAttributes + Model
- model默认存的属性再request作用域,通过@SessionAttributes类注解的value值标识需要把model存储的属性存储在sesion中
- 通过参数传递
返回Json数据
@ResponseBody
异常处理
- 为当前Controller配置错误处理
@ExceptionHandler
public ModelAndView mx(Exception e) {
ModelAndView mv = new ModelAndView();
mv.addObject("errMsg", e.getMessage());
mv.setViewName("error.jsp");
return mv;
}
- 配置全局的错误处理
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler
public ModelAndView mx(Exception e) {
ModelAndView mv = new ModelAndView();
mv.addObject("errMsg", e.getMessage());
mv.setViewName("error.jsp");
return mv;
}
}
- 通过配置文件方式实现全局错误处理
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.ArithmeticException">error</prop>
</props>
</property>
</bean>
SpringMVC核心配置文件
<?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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd">
<context:component-scan base-package="com.wyq.ssm"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value=""/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
SpringMVC解决静态资源被拦截的问题
- 方案一 : 拦截器中增加针对静态资源不进行过滤(涉及spring-mvc.xml)
1 <mvc:resources location="/" mapping="/**/*.js"/>
2 <mvc:resources location="/" mapping="/**/*.css"/>
3 <mvc:resources location="/assets/" mapping="/assets/**/*"/>
4 <mvc:resources location="/images/" mapping="/images/*" cache-period="360000"/>
5
6 <mvc:interceptors>
7 <mvc:interceptor>
8 <mvc:mapping path="/**/*"/>
9 <mvc:exclude-mapping path="/**/fonts/*"/>
10 <mvc:exclude-mapping path="/**/*.css"/>
11 <mvc:exclude-mapping path="/**/*.js"/>
12 <mvc:exclude-mapping path="/**/*.png"/>
13 <mvc:exclude-mapping path="/**/*.gif"/>
14 <mvc:exclude-mapping path="/**/*.jpg"/>
15 <mvc:exclude-mapping path="/**/*.jpeg"/>
16 <mvc:exclude-mapping path="/**/*login*"/>
17 <mvc:exclude-mapping path="/**/*Login*"/>
18 <bean class="com.luwei.console.mg.interceptor.VisitInterceptor"></bean>
19 </mvc:interceptor>
20 </mvc:interceptors>
- 方案二 : 在spring-mvc.xml中启用默认Servlet
<mvc:default-servlet-handler/>
在web.xml中增加对静态资源的处理
1 <servlet-mapping>
2 <servlet-name>default</servlet-name>
3 <url-pattern>*.js</url-pattern>
4 <url-pattern>*.css</url-pattern>
5 <url-pattern>/assets/*"</url-pattern>
6 <url-pattern>/images/*</url-pattern>
7 </servlet-mapping>
- 方案三 修改Spring的全局拦截设置为*.do的拦截(涉及web.xml)
<servlet>
2 <servlet-name>SpringMVC</servlet-name>
3 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
4 <init-param>
5 <param-name>contextConfigLocation</param-name>
6 <param-value>classpath:spring-mvc.xml</param-value>
7 </init-param>
8 <load-on-startup>1</load-on-startup>
9 <async-supported>true</async-supported>
10 </servlet>
11 <servlet-mapping>
12 <servlet-name>SpringMVC</servlet-name>
13 <url-pattern>*.do</url-pattern>
14 </servlet-mapping>