SpringMVC学习笔记
1.1、简介
SpringMVC是Spring Framework的一部分,是基于Java实现MVC的轻量级框架。
官方文档:Spring Framework Reference Documentation
SpringMVC特点
- 轻量级,简单易学
- 高效、基于请求响应的MVC框架
- 与Spring兼容性好,无缝结合
- 约定大于配置
- 功能强大:RESTful、数据验证、格式化、本地化、主题、注解、单元测试等
- 简洁灵活
1.2、Hello SpringMVC
resources/springmvc-servlet.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器:DispatcherServlet给它的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!--Handler-->
<bean id="/hello" class="com.zhang.controller.HelloController"/>
</beans>
com.zhang.controller.HelloController
package com.zhang.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author zhangxiny
* @apiNote
* @date 2021-12-30 20:03
*/
public class HelloController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//视图和模型
ModelAndView mv = new ModelAndView();
//封装对象,放在ModelAndView中。Model
mv.addObject("msg", "HelloSpringMVC!");
//封装要跳转的视图,放在ModelAndView中
mv.setViewName("hello");
return mv;
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个Spring配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别1-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- / 匹配所有请求:(不包括 jsp)-->
<!-- /* 匹配所有请求:(包括jsp)-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
pom.xml
<!--依赖-->
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
1.3、Spring执行原理
个人理解:SpringMVC底层还是Servlet,在web.xml配置后,SpringMVC就完全代理了Servlet。所以,所有的web请求,全都转入了SpringMVC。

Spring执行的话,简单分为三步,第一步是调用处理器映射器,有很多种映射方式,选择得到bean的方式。第二步是调用处理器适配器,将Contrller中的设置解析,并返回ModelAndView类,第三步调用视图解析器,解析视图并渲染至浏览器。
@Component
@Service
@Controller
@Repository
1.4、RestFul风格
优点:
- 请求路径更加简洁
- 获得参数更加方便,框架会自动进行类型转换
- 通过路径类型约束访问的类型,类型不一致,则请求不到对应的方法,会出现 405错误。
- 安全,不暴露变量名在url
1.5、重定向与转发
转发
@RequestMapping("login")
public String test2(Model model){
model.addAttribute("msg", "login");
return "admin/hello";
}
重定向
@RequestMapping("login")
public String test2(Model model){
model.addAttribute("msg", "login");
return "redirect:/hello1";
}
1.6、接收请求参数
第一种,普通接收
public String test1(String name, Model model){}
http://localhost:9091/user/t1?name=fdada
第二种,指定名称接收
public String test1(@RequestParam("username") String name, Model model) {
http://localhost:9091/user/t1?username=fdada
第三种,接收对象
public String test2(User user){
http://localhost:9091/user/t2?name=fdada&id=3&age=2
1.7、乱码问题解决
在web.xml中配置
<!--配置SpringMVC乱码过滤-->
<filter>
<filter-name>encoding</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>encoding</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>
在tomcat中配置
<Connector port="9091" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8"/>
1.8、Jackson使用
-
导入包 pom.xml
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.5.1</version> </dependency> -
配置编码 springmvc-servlet.xml
<mvc:annotation-driven> <mvc:message-converters> <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"/> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> -
使用ObjectMapper将Object转成json
@ResponseBody @RequestMapping(value="/t1") public String test1() throws JsonProcessingException { User user = new User(1,"张三",32); ObjectMapper mapper = new ObjectMapper(); String str = mapper.writeValueAsString(user); return str; } -
使用ObjectMapper将LIst转成json
@RequestMapping(value="/j2") public String json2() throws JsonProcessingException { User user = new User(1,"张三",32); User user1 = new User(1,"张三",32); User user2 = new User(1,"张三",32); User user3 = new User(1,"张三",32); User user4 = new User(1,"张三",32); List<User> userList = new ArrayList<User>(); userList.add(user); userList.add(user1); userList.add(user2); userList.add(user3); userList.add(user4); ObjectMapper mapper = new ObjectMapper(); String str = mapper.writeValueAsString(userList); return str; } -
封装工具类 com.zhang.utils
public class JsonUtils { public static String getJson(Object object) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); return objectMapper.writeValueAsString(object); } public static String getJson(Object object,String dateFormat) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); //不使用时间戳的方式 mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); //自定义日期的格式 SimpleDateFormat sdf = new SimpleDateFormat(dateFormat); mapper.setDateFormat(sdf); return mapper.writeValueAsString(object); } }
1.9、fastjson使用
-
导入包
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.60</version> </dependency> -
将JSON转成String
@RequestMapping("j4") public String json4(){ User user = new User(1,"张三",32); User user1 = new User(1,"张三",32); User user2 = new User(1,"张三",32); User user3 = new User(1,"张三",32); User user4 = new User(1,"张三",32); List<User> userList = new ArrayList<User>(); userList.add(user); userList.add(user1); userList.add(user2); userList.add(user3); userList.add(user4); String s = JSON.toJSONString(userList); return s; }
1.10、ssm整合
代码包下载:https://zxy-me.oss-cn-beijing.aliyuncs.com/note/ssmbuild.rar
1.11、ssm总结


浙公网安备 33010602011771号