入门springmvc案例
导入依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 规范使用版本-->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
配置配置文件spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<mvc:annotation-driven></mvc:annotation-driven>
<context:component-scan base-package="com.hx"/>
</beans>
配置前端过滤器web.xml
org.springframework.web.servlet.DispatcherServlet,继承HttpServlet,需要在Web.xml文件中定义
<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>Archetype Created Web Application</display-name>
<!-- 配置SpringMVC的核心控制器 -->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置Servlet的初始化参数,读取配置文件,创建spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param> <!-- 配置servlet启动时加载对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.mvc</url-pattern>
</servlet-mapping>
</web-app>
前端传值到后端入参的绑定
基本数据类型的接收:方法中入参为基本数据类型时保持前后端参数名称一样即可接收;
前端:<input type="number" name="userNo" />
后端:@RequestMapping("/login")
public String login2(int userNo){}
String数据类型的接收:方法中入参为String数据类型时保持前后端参数名称一样即可接收;
前端:<input type="text" name="userNo" />
后端:@RequestMapping("/login")
public String login2(String userNo){}
对象数据类型的接收:需要后端的对象属性名和前端的请求参数名一样才可接收;
实体类:public class User implements Serializable {
private String userName;
private String password;
private Address address;
//getters and setters
}
前端:<input type="text" name="userName" /><br/>
<input type="text" name="password" /><br/>
<input type="text" name="address.provinceName" ><br/>
后端:@RequestMapping("/login")
public String login2(User user){}
集合数据类型的接收:如果是集合类型,有两种方式:
第一种:
要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
给 List 集合中的元素赋值,使用下标。
给 Map 集合中的元素赋值,使用键值对。
第二种:
接收的请求参数是 json 格式数据。需要借助一个注解(@ResponseBody)实现。并且后端接收json数据是使用request.getReader();
实体类:public class User implements Serializable {
private String userName;
private String password;
private Integer age;
private List<Address> addresses;
private Map<String,Address> addressMap;
//getters and setters
}
前端:
名称:<input type="text" name="userName" /><br/>
<!-- type="text"类型也可以自动转换,下边有自动转换类型说明-->
密码:<input type="text" name="password" /><br/>
年龄:<input type="text" name="age" ><br/>
地址1省份:<input type="text" name="addresses[0].provinceName" ><br/>
地址1城市:<input type="text" name="addresses[0].cityName" ><br/>
地址2省份:<input type="text" name="addresses[1].provinceName" ><br/>
地址2城市:<input type="text" name="addresses[1].cityName" ><br/>
…
地址one省份:<input type="text" name="addressMap['one'].provinceName" ><br/>
地址one城市:<input type="text" name="addressMap['one'].cityName" ><br/>
地址two省份:<input type="text" name="addressMap['two'].provinceName" ><br/>
地址two城市:<input type="text" name="addressMap['two'].cityName" ><br/>
后端:@RequestMapping("/login")
public String login(User user){}
传数据到指定页面
ModelMap的使用:默认是request级别的作用域;
后端:@RequestMapping("/login2")
public String login2(User user, String userName, ModelMap map){
map.put("testRequest","testRequestValue2");
return "forward:/jsp/main.jsp";
}
前端:Jsp页面获取数据
${requestScope.testRequest}
ModelMap作用为session的使用:
可以在定义类时使用@SessionAttributes(“属性名”)
或@SessionAttributes({“attr1”,”attr2”})等方式将尝试从modelMap中寻找相同属性名相应的value.
@Controller
@RequestMapping("/user")
@SessionAttributes("user")
public class UserControllor {
@RequestMapping("login")
public String login(User user,ModelMap map){
map.addAttribute("user", user);
return "forward:/home.jsp";
}
常用注解的使用说明
Controller:
标志一个类为web控制器;
RestController:
controller和responsebody的复合注解,
会导致这个类的所有方法返回值为json数据,不可跳转到指定页面;
RequestMapping
属性:
value:用于指定请求的 URL。它和 path 属性的作用是一样的。
method:用于指定请求的方式。 //属于restful调用风格主要特征之一
params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和
配置的一模一样。
例如:
Request
params = {"userName"},表示请求参数必须有 userName
params = {"moeny!100"},表示请求参数中 money 不能是 100。
headers:用于指定限制请求消息头的条件。
Produces:注解@requestMapping注解里面的属性项,作用是指定返回值类型,不但可以设置返回值类型还可以设定返回值的字符编码;例如:
指定返回json类型:produces="application/json"
指定字符编码:produces="text/html;charset=utf-8"
ResponseBody
假如是字符串则直接将字符串写到客户端,假如是一个对象,此时会将对象转化为json(一般需要先导入jackson的jar依赖)串然后写到客户端。这里需要注意的是,如果返回对象,按utf-8编码。
如果返回String,默认按iso8859-1编码,页面可能出现乱码。因此在注解中我们可以手动修改编码格式,例如@RequestMapping(value="/user",produces="text/html;charset=utf-8"),前面是请求的路径,后面是编码格式。
RequestBody
RequestParam
多用于形参名不一样的场景
@RequestMapping("/useRequestParam")
public String useRequestParam(@RequestParam("name")String userName){}
//这个注解的使用感受就是有属性并且控制器方法的形参名可以不和前端的name名不一样
PathVaribale
多用于restful风格的请求
jsp 代码:
<a href="/user/usePathVariable/zcf/123.mvc">test</a> //直接在url放入参数值没有参数名
后端代码:
@RequestMapping("/usePathVariable/{name}/{age}") //这里{}内的名称随便取,只是起到占位符的作用
public String usePathVariable(@PathVariable("age") Integer userAge,@PathVariable("name") String userName){}
RequestHeader
CookieValue
使用时必须事先知道浏览器端的cookie名
控制器中的代码:
@RequestMapping("/useCookieValue")
public String useCookieValue(@CookieValue(value="JSESSIONID",required=false)
String cookieValue){
System.out.println(cookieValue);
return "forward:/home.jsp";
}
SessionAttribute
PostMapping
GetMapping
请求参数乱码的解决
json的处理
下图解析展示