Spring MVC笔记
前言
Spring MVC学习笔记
一、Spring MVC概念
Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。
Spring MVC 是结构最清晰的 Servlet+JSP+JavaBean 的实现,是一个典型的教科书式的 MVC 构架,不像 Struts 等其它框架都是变种或者不是完全基于 MVC 系统的框架。
Spring MVC 角色划分清晰,分工明细,并且和 Spring 框架无缝结合。Spring MVC 是当今业界最主流的 Web 开发框架,以及最热门的开发技能。
在 Spring MVC 框架中,Controller 替换 Servlet 来担负控制器的职责,用于接收请求,调用相应的 Model 进行处理,处理器完成业务处理后返回处理结果。Controller 调用相应的 View 并对处理结果进行视图渲染,最终客户端得到响应信息。
Spring MVC 框架采用松耦合可插拔的组件结构,具有高度可配置性,比起其它 MVC 框架更具有扩展性和灵活性。
二、一个简单Spring MVC项目工程
1.创建一个maven工程,pom.xml导入Spring MVC依赖
<!-- Spring MVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.22</version>
</dependency>
2.在web.xml中配置Spring MVC的DispatcherServlet
<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>
3.创建一个配置文件resource,新建一个springmvc.xml文件
springmvc.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"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置自动扫包-->
<context:component-scan base-package="com.mvc"></context:component-scan>
<!-- 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/"></property>
<!--后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
4.新建java->com->mvc文件夹,新建HelloHandler处理器
HelloHandler.class
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value = "/index",method = RequestMethod.POST)
public String index(){
System.out.println("接收了请求");
//返回逻辑视图
return "index";
}
}
method = RequestMethod.POST指定了客户端的请求类型只能为post请求,不写可以接收get和post请求类型。
5.启动项目。需要配置Tomcat
6.总结
三、参数绑定
1.在@RequestMapping注解中添加params进行参数绑定
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value = "/index",method = RequestMethod.POST,params = {"id","name"})
public String index(Integer id,String name){
System.out.println("接收了请求"+id+"-"+name);
//返回逻辑视图
return "index";
}
//在此方式注解的前提下保证请求参数名称和形参参数名称一致,params = {"id","name"}可以不写,
//也可以再params = {"id","name"}添加数据验证,比如:
//params = {"id=1","name"},即id=1时才会调用此URL方法
}
2.@RequestParam注解绑定
params是对URL请求参数进行限制,不满足条件的URL无法访问该方法,需要在业务方法中获取URL的参数值。
1、在业务方法定义时声明参数列表
2、给参数列表添加@RequestParam注解进行绑定
@Controller
@RequestMapping("/hello")
public class HelloHandler {
@RequestMapping(value = "/index",method = RequestMethod.POST)
public String index(@RequestParam("num") Integer id, @RequestParam("str") String name){
System.out.println("接收了请求"+id+"-"+name);
//返回逻辑视图
return "index";
}
}
(@RequestParam(“num”) Integer id, @RequestParam(“str”)在此参数列表里面添加@RequestParam注解是在请求参数名称和形参名称不一致的时候进行参数绑定,如果一致则不需要进行@RequestParam注解绑定
3.Spring MVC支持RESTful风格的URL参数获取
传统的URL:http://localhost:8081/hello/index?id=12&name=李四
RESTful URL:http://localhost:8081/hello/index/12/李四
@RequestMapping("/restful/{id}/{name}")
public String restful(@PathVariable("id") Integer id,@PathVariable("name") String name){
System.out.println(id+"-"+name);
return "index";
}
4.映射Cookie
@RequestMapping("/cookie")
public String getCookie(@CookieValue("JSESSIONID") String sessionId){
System.out.println(sessionId);
return "index";
}
5.使用POJO绑定参数
Address实体类
@Data
public class Address {
private Integer code;
private String value;
}
User实体类
@Data
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private Address address;
}
Handler处理器类
@RequestMapping(value = "/addUser",method = RequestMethod.POST)
public String addUser(User user){
System.out.println(user);
return "addUser";
}
web.xml解决中文乱码
<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>
<init-param>
<param-name>foreResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
addUser.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/hello/addUser" method="post">
<table>
<tr>
<td>编号</td>
<td>
<input type="text" name="id">
</td>
</tr>
<tr>
<td>name</td>
<td>
<input type="text" name="name">
</td>
</tr>
<tr>
<td>地址编号</td>
<td>
<input type="text" name="address.code">
</td>
</tr>
<tr>
<td>地址</td>
<td>
<input type="text" name="address.value">
</td>
</tr>
<tr>
<td>
<input type="submit" value="提交">
</td>
</tr>
</table>
</form>
</body>
</html>
结果:
注意:主体对象可以没有无参构造,但是级联对象必须有无参构造,因为主体对象可以通过其他构造器构造,但级联对象不行。