一. 获得基本数据类型
UserController中的方法:
@RequestMapping("/quick8")
@ResponseBody
public void save8(String name,int age) {
System.out.println(name);
System.out.println(age);
}
网页中网址:
http://localhost:8080/springioc_mvc_war_exploded/user/quick8?name=zhangsan&age=333
得到:
二. 获得POJO数据类型
UserController中的方法:
@RequestMapping("/quick8")
@ResponseBody
public void save8(User user) {
System.out.println(user);
System.out.println(user.getName());
System.out.println(user.getAge());
}
网页中网址,网址中的属性名称和bean中的属性名称一样,springMVC就会自动封装:
http://localhost:8080/springioc_mvc_war_exploded/user/quick8?name=zhangsan&age=123
得到
三. 获得数组类型
UserController中的方法:
@RequestMapping("/quick9")
@ResponseBody
public void save8(User user) {
System.out.println(user);
System.out.println(user.getName());
System.out.println(user.getAge());
}
网页中网址,网址中的数组名称和接受的数组名称一样,springMVC就会自动封装:
http://localhost:8080/springioc_mvc_war_exploded/user/quick9?strs=1&strs=11&strs=111
得到:
四. 集合类型
1. 实现
在success.jsp中写上表单:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
<title>success</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/user/quick10" method="post">
<%-- name中的属性名必须和VO中list的对象名一样--%>
<input type="text" name="userList[0].name"/><br/>
<input type="text" name="userList[0].age"/><br/>
<input type="text" name="userList[1].name"/><br/>
<input type="text" name="userList[1].age"/><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
界面:
VO.java
public class VO {
//
private List<User> userList;
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
@Override
public String toString() {
return "VO{" +
"userList=" + userList +
'}';
}
}
userController.java:
@RequestMapping("/quick10")
@ResponseBody
public void save10(VO vo) {
System.out.println(Arrays.asList(vo));
}
在网页界面中提交表单之后就能看到:
2. 中文乱码问题
如果输入数据是中文
就会出现乱码:
解决方法是在web.xml中配置一个filter,让去往后端的数据全部转成utf-8格式:
<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>
五. 接收ajax数据
先创建一个ajax.jsp的前端页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%-- 加载jquery--%>
<script src="${pageContext.request.contextPath}/statics/jquery-3.6.0.js"></script>
<script>
var userList=new Array();
// 在userList数组中放入json,表示用户
userList.push({name:"zhangsan",age:22});
userList.push({name:"lisi",age:222});
$.ajax({
type:"post",
// ajax提交到的页面
url:"${pageContext.request.contextPath}/user/quick11",
// 提交json格式的参数
data:JSON.stringify(userList),
// 自定义传输的数据类型
contentType:"application/json;charset=utf-8"
})
</script>
</head>
<body>
</body>
</html>
配置userController.java:
@RequestMapping("/quick11")
@ResponseBody
// 这里必须要加RequestBody的注解才能将json封装到userList
public void save11(@RequestBody List<User> userList) {
System.out.println(userList);
}
访问ajax.jsp会发现报错:
为什么会找不到jquery?
因为访问ajax.jsp后,前端会向后端发送找jquery包的请求。这个请求是发送到servlet那里去了。他会先搜索@requestmapping看有没有配置好的servlet,如果没有,就自动去找前端控制器。前端控制器一般都是配的缺省地址,也就是 <url-pattern>/</url-pattern>。这个地址显然也不是jquery在的地方。
解决办法:
在spring-mvc.xml中配置:
<!-- 开放资源的访问-->
<!-- 我的jquery放在了webapp/statics/中-->
<!-- 发送的请求只要满足mapping的格式,他就会去扫描location中的资源,看是否匹配-->
<mvc:resources mapping="/statics/**" location="/statics/"></mvc:resources>
或者:
<!-- 如果没有找到资源,就会去询问tomcat服务器,tomcat是能找到静态资源的-->
<mvc:default-servlet-handler/>
六. 参数映射
UserController.java:
@RequestMapping("/quick12")
@ResponseBody
public void save12(@RequestParam("name") String username) {
System.out.println(username);
}
如果不要@requestparam,直接在网页中输入
http://localhost:8080/springioc_mvc_war_exploded/user/quick12?name=张三
会报错,得用username才行。这里用了@requestparam就建立了name到username的映射。
七. Restful风格
可以直接在网址中写上
http://localhost:8080/springioc_mvc_war_exploded/user/quick12/张三
就可以把张三作为username传到后端。
实现方法是:
// {}表示占位符,其中的名称需要与@PathVariable的value参数一致
@RequestMapping("/quick13/{username}")
@ResponseBody
// @PathVariable注解,指定要映射的参数
public void save13(@PathVariable(value = "username") String username) {
System.out.println(username);
}
然后输入上述网址,就可以实现:
八. 类型转换器
前端送到后端的数据,都会被转成字符串形式,但是在后端接收的时候,用int也能接受到数字,这说明springMVC自动做了一些类型转换。但有的类型是不进行自动转换的,比如日期。
这就需要自定义类型转换器:
首先定义一个DataConverter.java:
//范型:<原本的类型,要转成的类型>
public class DataConverter implements Converter<String, Date> {
@Override
// source:原本的数据
public Date convert(String source) {
// 日期格式转换,yyyy-MM-dd表示可以在网址中输入的日期格式
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd");
Date parse = null;
try {
parse = simpleDateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return parse;
}
}
告诉springMVC我有这个转换器,在springMVC.xml中配置:
<bean id="ConversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 这个类中有一个converters参数,即转换器列表-->
<property name="converters">
<list>
<bean class="com.guazicola.converter.DataConverter"></bean>
</list>
</property>
</bean>
将这个类配置到<mvc:annotation-driven/>:
<mvc:annotation-driven conversion-service="ConversionService"/>
浏览器输入地址:
http://localhost:8080/springioc_mvc_war_exploded/user/quick14?date=2022-03-03
就可以得到:
九. 获得servlet相关API
springMVC会自动为请求的方法注入servletAPI:
userController.java:
@RequestMapping("/quick15")
@ResponseBody
public void save15(HttpServletRequest request, HttpServletResponse response, HttpSession session) {
System.out.println(request);
System.out.println(response);
System.out.println(session);
}
访问后得到: