请求数据:
SpringMVC提供了从请求对象中获取请求数据的方式: 自动获取和手动获取。
注意:
1.若注入的数据乱码或类型不匹配,会导致注入失败.[性别乱码,年龄非数字]
2.被注入数据的对象,无需装入Spring容器[无需@Component标注].
自动获取:

示例:
jsp页面
<a href="test?data=张三">自动获取数据</a>
<form action="test1" method="post">
姓名:<input type="text" name="name"><br/>
性别:<input type="radio" name="sex">男 <input type="radio" name="sex">女<br/>
年龄:<input type="text" name="age"><br/>
地址:<input type="text" name="address"><br/>
<input type="submit" value="提交">
</form>
controller方法:
@RequestMapping("/test")
public String test(String data){ 参数与请求参数同名
System.out.println("test()执行");
System.out.println(data);
return "test";
}
//对象类型数据入参
@RequestMapping("/test1")
public String test1(User user){
System.out.println("test1()执行");
System.out.println(user);
return "test1";
}


POST请求编码处理:
<!-- 配置编码过滤器,防止请求数据类型转换失败: 只对POST请求有效 -->
<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>
手动获取:

备注: @RequestParam/@RequestHeader/@CookieValue/@PathVariable用法和参数完全相同,区别在于获得数据的来源不同。
示例:
<%--手动获取数据 RequestParam--%>
<a href="test2?data=李四">@RequestParam</a>
controller方法
@RequestMapping("/test2")
public String test2(@RequestParam(value = "data1",required = false) String data1){
System.out.println("test2()执行");
System.out.println(data1);
return "test2";
}
请求参数与方法参数名不相同时可以使用RequestMapping注解的value属性来指定赋值,required 默认值为true表示如果没有传过来数据则会报错,false表示没有传过来数据的话参数data的参数值就为null。

PathVariable注解
示例:
<%--手动获取数据 PathVariable--%>
<a href="test3/abc/test?data=李四">@PathVariable</a><br>
controller方法
@RequestMapping("/test3/{myView}/test")
public String test3(@PathVariable("myView") String data){
System.out.println("test3()执行");
System.out.println(data);
return "test3";
}
打印结果为abc。
Servlet API类型参数:

如果IDEA引用不到Servlet的话:

<%--手动获取数据 Servlet API--%>
<a href="test4">Servlet API</a><br>
controller方法
@RequestMapping("/test4")
public String test4(HttpServletRequest request){
System.out.println("test4()执行");
request.setAttribute("name","张三");
return "test4";
}
响应数据
响应方式


响应方式:
解析ModelAndView时,判断"视图名"是以"forward:"或"redirect:“开头或"逻辑视图名”,然后以转发或重定向方式响应.
return "路径A/视图名":
说明:
1.作为逻辑视图名,交给视图解析器,加上前缀和后缀,然后访问该视图文件
2.响应方式为转发
return "forward或redirect:/路径A/视图名":
说明:
1."/"表示"http://localhost:8080/项目名/".参考Web进行搜索文件
2.forward和redirect只能与"/"开头的资源路径配合使用.
3.forward和redirect支持URL传参
4.forward或redirect响应时,不会经过视图解析器的处理,而是直接根据路径到相关位置寻找资源并返回.
示例:
视图解析器和响应方式测试 <br>
<!-- 视图名: return 视图名; [默认为转发方式] -->
<a href="test">return 视图名;</a><br>
controller方法:
@RequestMapping("/test")
public String test(HttpServletRequest request){
System.out.println("test()执行");
request.setAttribute("msg","test中的数据");
return "test";//转发
//return 逻辑视图名-->ModelAndView对象{模型,视图数据}--->前端控制器: Model对象[存入Request容器],View对象[视图解析器处理,生成真实文件的路径]--->在视图文件中渲染Model数据-->浏览器:展示网页
}
测试页面:
<html>
<head>
<title>test</title>
</head>
<body>
test.jsp
${requestScope.msg}
</body>
</html>
示例:
<!-- 视图名: return "forward或redirect:/路径A/视图名" [手动设置响应方式]-->
<a href="test1">return "forward:/路径A/视图名";</a><br>
<a href="test2">return "redirect:/路径A/视图名";</a><br>
controller方法:
@RequestMapping("/test1")
public String test1(){
System.out.println("test1()执行");
return "forward:/WEB-INF/jsp/test1.jsp";//转发:不会交给视图解析器进行拼接前缀和后缀
//return "forward:/..."-->ModelAndView对象{模型,视图数据}--->前端控制器:Model对象[存入Request容器],View对象--->在视图文件中渲染Model数据-->浏览器:展示网页
}
@RequestMapping("/test2")
public String test2(){
System.out.println("test2()执行");
return "redirect:/jsp/test5.jsp"; //重定向:相当于直接在地址栏中输入地址访问,不能重定向到WEB-INF目录下
//return "forward:/..."-->ModelAndView对象{模型,视图数据}--->前端控制器:Model对象[存入Request容器],View对象--->在视图文件中渲染Model数据-->浏览器:展示网页
}
返回数据

示例:
<a href="test">ModelAndView返回数据</a>
controller方法
@RequestMapping("/test")
public ModelAndView test(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("name","张三");//添加模型数据
modelAndView.setViewName("test");//要返回的视图名称
System.out.println("test()执行");
return modelAndView;
}
展示页面:
${requestScope.name}

示例:
<a href="test2">Model返回数据</a>
controller方法
@RequestMapping("/test2")
public String test2(Model model){
model.addAttribute("name","李四");
model.addAttribute("sex","女");
System.out.println("test2()执行");
return "test2";
}
展示页面
${requestScope.name}
${requestScope.sex}

示例:
<a href="test1">Map返回数据</a>
controller方法
@RequestMapping("/test1")
public String test1(Map<String,Object> map){
map.put("name","张三");
map.put("sex","男");
System.out.println("test1()执行");
return "test1";
}
展示页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
${requestScope.name}
${requestScope.sex}
</body>
</html>

示例:
<a href="test">test</a>
<a href="test1">test1</a>
controller方法
@RequestMapping("/test")
public String test(){
System.out.println("test()执行");
return "test";
}
@RequestMapping("/test1")
public String test1(@ModelAttribute User user){//从Request,Session中寻找user,找到则赋给参数.找不到,则反射机制创建,并赋给参数.最后,将创建的对象存入Request容器.
System.out.println("test1()执行");
return "test1";
}
@ModelAttribute("msg")
public String data1(){
System.out.println("data1()");
return "哈哈哈";
}
@ModelAttribute("msg2")
public String data2(Map<String,Object> map){
map.put("name","笑话");
map.put("sex","男");
System.out.println("data2()执行");
return "哈哈哈";
}
展示页面:
<body>
test1.jsp
${user}
${msg}
${msg2}
${name}
${sex}
</body>
运行结果

本文介绍SpringMVC框架中如何获取请求数据及响应数据的方法。包括自动获取与手动获取请求数据的方式,并展示了如何通过配置编码过滤器解决POST请求中的乱码问题。此外,还详细介绍了使用ModelAndView、Model及Map等不同方式返回数据到前端。
2238

被折叠的 条评论
为什么被折叠?



