目录
2、引入jar 包 servlet-api.jar、spring-webmvc.jar
4、web.xml文件将来自于spring-webmvc.jar中DispatcherServlet介绍给Tomcat
(二)、使用 SpringMVC 框架 web 请求处理顺序
SpringMVC框架是一款轻量级框架,也是Spring框架的一部分,作 为 Spring 框 架 一 部 分 , 能 够 使 用 Spring 的 IoC 和 Aop 。 方 便 整 合 Strtus,MyBatis,Hiberate,JPA 等其他框架。
一、SpringMVC使用
(一)、基础环境搭建
1、创建web maven项目
2、引入jar 包 servlet-api.jar、spring-webmvc.jar
3、引入Spring核心配置文件
4、web.xml文件将来自于spring-webmvc.jar中DispatcherServlet介绍给Tomcat
5、controller
1.处理器类,帮助DispatcherServlet来调用Service
2.处理器类,声明既不需要继承父类,也不需要实现接口
3.处理器类,它的实例对象必须交给Spring容器对象来创建与初始化
4.处理器类,应该有一个对外的请求路径。SpringMVC框架中使用@RequestMapping 来设置处理器类对外请求路径
5.处理器类,允许声明若干个处理方法,用于service方法调用。处理方法名称随意
6.处理器类中每一个处理器方法,都应该有一个独立的请求地址,这个地址可以使用@RequestMapping
@Component, @Service @Controller 区别
1.这个三个注解关联的类其实例对象,都需要由Spring容器对象来负责创建
2.@Controller关联的类,在业务上表示【处理器类】
3.@Service关联的类,在业务上表示【服务类(Service类)】
4.@Component可以关联任意类
6、spring.xml文件注册组件扫描器
(二)、使用 SpringMVC 框架 web 请求处理顺序
- 浏览器提交请求,给中央处理器(DispatcherServlet)
- 中央处理器直接将请求转发给各个处理器(Controller)
- 处理器映射器(RequestMapping)会根据请求,找到处理改请求的处理器,并将其封装为处理器执行链后,返回给中央处理器
- 中央调度器根据处理器执行链中的处理器,找到能够执行该处理器的处理器适配器。
- 处理器适配器调用执行处理器。
- 处理器将处理结果及要跳转的视图封装到一个对象 ModelAndView 中,并将其返回给 处理器适配器。
- 处理器适配器直接将结果返回给中央调度器.
- 中央调度器调用视图解析器,将 ModelAndView 中的视图名称封装为视图对象。
- 视图解析器将封装了的视图对象返回给中央调度器。
- 中央调度器调用视图对象,让其自己进行渲染,即进行数据填充,形成响应对象。
- 中央调度器响应浏览器。
(三)、@RequestMapping 定义请求规则
1、定义请求路径
我们请求地址都是以 do结尾, 因为在web.xml文件中配置了dispatcherServlet允许的路径*.do。我们也可以不用设置*.do设置成/也可以;
具体见:SpringMVC静态资源配置_code哇咔咔的博客-CSDN博客_springmvc静态资源配置
2、请求提交方式的定义
(四)、 处理方法的参数
处理方法可以分为有参和无参
1、无参形式
2、有参形式
1) HttpServletRequest request 接收浏览器请求的参数
2) HttpServeltResponse response 返回数据
3) HttpSession session [当前用户的会话作用域对象]
4) 自定义类型参数
自定义基础数据类型
基本数据类型:请求包中的请求参数名必须与处理方法中参数名,完全相同
实体类数据类型
实体类数据类型:请求包中的请求参数必须与实体类对象中属性名,完全相同
注意实体类必须要有setter方法,不然spring无法给对象赋值
请求数据必须跟属性名相同,不然无法赋值 ;
5、请求参数中文乱码问题
Spring 对于请求参 Java 框架 SpringMVC给出了专门的字符集过滤器:spring-web-4.3.9.RELEASE.jar 的 org.springframework.web.filter 包下的 CharacterEncodingFilter 类。
解决方案:在 web.xml 中注册字符集过滤器,即可解决 Spring 的请求参数的中文乱码问题。不过, 最好将该过滤器注册在其它过滤器之前。因为过滤器的执行是按照其注册顺序进行的。 直接在项目 receiveParameters-property 上进行修改。
<!-- 注册字符集过滤器:解决post乱码问题 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<!-- spring-web.jar -->
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<!-- 指定字符集 -->
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
<!-- 强制request使用字符集encoding -->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!-- 强制response使用字符集encoding -->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 配置过滤路径 -->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
6、校正请求参数名@RequestParam
所谓校正请求参数名,是指若请求 URL 所携带的参数名称与处理方法中指定的参数名 不相同时,则需在处理方法参数前,添加一个注解@RequestParam(“请求参数名”),指定请 求 URL 所携带参数的名称。该注解是对处理器方法参数进行修饰的。value 属性指定请求参 数的名称。
传递name和age ,报错
传递sname和sage,正常
不传递sage,只传sname,正常
(五)、处理器方法的返回值
1、返回类型String
1、此时表示返回是一个资源文件地址 2、这个地址格式必须是URI的简化版格式 /资源文件名 3、返回的地址交给DispatcherServlet 4、DispatcherServlet默认采用请求转发方式向Tomcat申请调用对应的资源文件
2、返回类型为ModelAndView
1、ModelAndView来自于SpringMVC框架的一个工具类
2、ModelAndView对象既可以存储【请求地址】同时又可以存储【处理结果】
3、ModelAndView对象交给DispatcherServlet之后。DispatcherSevlet将ModelAndView对象中存储的【处理结果】自动存放到【请求作用域对象】 request.setAttribute("key",处理结果)然后,DispatcherServlet默认采用请求转发的方式将地址交给Tomcat;
3、返回类型为void
1、返回类型为void,并不是表示本次服务没有结果。只不过不需要将处理结果交给DispatcherServlet
2、处理器方法返回类型为void时候,要求处理器方法的参数必须有 HttpServletResponse(响应对象),借助于响应对象将服务的结果写入到响应体
4、返回类型为Object
1.此时返回的对象类型可以是List集合,也可以是实体类的实例对象。
2.返回的对象交给DispatcherServlet.
3.DispatcherServlet调用工具了将对象信息解析为【JSON格式字符串】来写入到响应体。
4.返回类型为Object时,表示本次请求是异步请求(AJAX)
处理器方法也可以返回 Object 对象。这个 Object 可以是 Integer,String,自定义对象, Map,List 等。但返回的对象不是作为逻辑视图出现的,而是作为直接在页面显示的数据出 现的。 返回对象,需要使用@ResponseBody 注解,将转换后的 JSON 数据放入到响应体中。
(1) 环境搭建
A、 maven pom.xml
由于返回 Object 数据,一般都是将数据转化为了 JSON 对象后传递给浏览器页面的。而 这个由 Object 转换为 JSON,是由 Jackson 工具完成的。所以需要导入 Jackson 的相关 Jar 包。
pom文件
B、 声明注解驱动
spring核心配置文件
1、实体类对象使用Json返回
2、使用属性的方法,解决后端返回中文数据,给前端出现乱码的问题。
3、使用spring核心配置文件配置的形式,解决后端返回数据乱码的问题(一劳永逸的方式)
<!-- 注册MVC注解驱动
Json格式转换乱码问题
-->
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"></property>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
4、Json返回List类型数据
5、Json返回Date类型数据
json直接返回date对象,前台展示的数据为时间戳,而不是date对象本身的格式
6、解决Json返回Date类型数据,格式问题
7、封装Json工具类
package com.zxb.utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.text.SimpleDateFormat;
/*
* Json工具类
*/
public class JsonUtil {
public static String getJson(Object obj){
return getJson(obj,"yyyy-MM-dd HH:mm:ss");
}
/**
* Json返回date数据类型数据
* @param obj json格式化对象
* @param dateFormat 需要格式的日期格式
* @return json字符串
*/
public static String getJson(Object obj, String dateFormat){
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
mapper.setDateFormat(sdf);
try {
return mapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return "";
}
}
5、重定向与请求转发
6、设置接收请求数据的格式
很简单很实用的一个过滤器,当前台JSP页面和Java代码中使用了不同的字符集进行编码的时候就会出现表单提交的数据或者上传/下载中文名称文件出现乱码的问题,那这个类就可以出场了。
<!--
设置接收数据请求格式filter
-->
<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、返回内部资源逻辑视图名
若要跳转的资源为内部资源,则视图解析器可以使用 InternalResourceViewResolver 内部 资源视图解析器。此时处理器方法返回的字符串就是要跳转页面的文件名去掉文件扩展名后 的部分。这个字符串与视图解析器中的 prefix、suffix 相结合,即可形成要访问的 URI。
<!--
如果处理器方法返回地址以"forward:" 或则"redirect:"来开头,此时
InternalResourceViewResolver将不会提供任何帮助
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/jsp/" />
<property name="suffix" value=".jsp" />
</bean>