SpringMVC

本文深入探讨了SpringMVC框架的核心组件,包括前端控制器、处理器映射器、处理器适配器、视图解析器和处理器的功能与配置。详细介绍了如何处理请求、配置视图解析、解决乱码问题、日期格式化、文件上传、RESTful风格请求、异常处理及静态资源拦截等关键操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

  • 前端控制器(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” />
    • 多用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方式
    • 通过参数传递
      1. HttpSession session
      2. @SessionAttributes + Model
      3. model默认存的属性再request作用域,通过@SessionAttributes类注解的value值标识需要把model存储的属性存储在sesion中

返回Json数据

  • @ResponseBody

异常处理

  1. 为当前Controller配置错误处理
@ExceptionHandler
public ModelAndView mx(Exception e) {
	ModelAndView mv = new ModelAndView();
	mv.addObject("errMsg", e.getMessage());
	mv.setViewName("error.jsp");
	return mv;
}
  1. 配置全局的错误处理
@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;
	}
}

  1. 通过配置文件方式实现全局错误处理
<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>

学习网址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值