SpringMVC(二)SpringMVC处理Web请求、获取返回值
一、注解
- @Controller
作用:用于创建控制器对象。该对象能够处理Web请求。
位置:该注解位于类名上方。
@Controller
public class MyController {
}
- @RequestMapping
作用:请求映射,用于将指定请求绑定到指定方法上,该方法用于处理对应请求。
属性:value:设置请求的url,值唯一;method:设置提交请求的方式(取值为get/post)
位置:该注解位于方法名上方。
@RequestMapping(value = "/some.do", method = RequestMethod.GET)
public ModelAndView doSome(){
}
二、视图解析器
视图解析器用于简化指定返回视图的操作,直接使用文件名即可——modelAndView.setViewName("文件名称")
prefix:文件路径前缀
suffix:文件后缀名,例如:".jsp"
<!--声明springmvc框架中的视图解析器,帮助开发人员设置视图文件路径-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀:视图文件路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!--后缀:视图文件扩展名-->
<property name="suffix" value=".jsp"/>
</bean>
转发路径:"/WEB-INF/view/" + “文件名称” + “.jsp”
三、接收参数
-
直接在处理器方法中获取
在处理器方法的参数中加入HttpServletRequest、HttpServletResponse、HttpSession三个参数。
@RequestMapping(value = "/return-view.do")
public String returnView(HttpServletRequest request, HttpServletResponse response, HttpSession session){
//可以手工在request域中加入参数
request.setAttribute("name",name);
request.setAttribute("age",age);
return "show";
}
-
接收简单类型参数
表单中代码:
<h1>请输入姓名和年龄:</h1><br>
<form action="receiveproperty.do" method="post">
姓名:<input type="text" name="name"><br><br>
年龄:<input type="text" name="age"><br><br>
<input type="submit" value="提交"><br>
</form>
参数名相同时:在处理器方法中加入与表单参数名称和个数相同的参数。
@RequestMapping(value = "/receiveproperty.do")
public ModelAndView doSome(String name, Integer age){
ModelAndView mv = new ModelAndView();
mv.addObject("myName",name);
mv.addObject("myAge",age);
mv.setViewName("show");
return mv;
}
与表单参数名不同时:在处理器方法中加入相同个数的参数;在对应参数前使用@RequestParam(value = “与表单参数名相同的参数名”),即可将参数赋给对应变量。
<h1>表单中参数名与控制器方法中的参数名不一致时</h1><br>
<form action="receiveparam.do" method="post">
姓名:<input type="text" name="rname"><br><br>
年龄:<input type="text" name="rage"><br><br>
<input type="submit" value="提交"><br>
</form>
@RequestMapping(value = "/receiveparam.do")
public ModelAndView receiveparam(@RequestParam(value = "rname") String name,
@RequestParam(value = "rage") Integer age){
System.out.println("name:"+name+" age:"+age);
ModelAndView mv = new ModelAndView();
mv.addObject("myName",name);
mv.addObject("myAge",age);
mv.setViewName("show");
return mv;
}
- 接收引用类型参数
<h1>使用java对象接收参数</h1><br>
<form action="receiveObj.do" method="post">
姓名:<input type="text" name="name"><br><br>
年龄:<input type="text" name="age"><br><br>
<input type="submit" value="提交"><br>
</form>
Student对象:
public class Student {
private String name;
private Integer age;
public Student() {
System.out.println("执行了Student无参数构造方法"); }
public String getName() {
return name; }
public void setName(String name) {
this.name = name; }
public Integer getAge() {
return age; }
public void setAge(Integer age) {
this.age = age; }
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
在处理器方法中加入Student变量,表单中的参数会通过容器调用对应setXXX()方法,为对应属性赋值。
注意:表单中的参数名必须和对象中的属性名一致。
@RequestMapping(value = "/receiveObj.do")
public ModelAndView receiveObj(Student myStudent){
ModelAndView mv = new ModelAndView();
mv.addObject("myName",myStudent.getName());
mv.addObject("myAge",myStudent.getAge());
mv.addObject("myStudent",myStudent);
mv.setViewName("show");
return mv;
}
- 接收Map、List、数组等(与应用类型赋值相同)
三、设置参数编码
在表单提交时,通过post方式会产生中文乱码,使用过滤器解决——CharacterEncodingFilter,解决POST提交方式中文乱码问题。
在web.xml文件中注册过滤器如下:
<!--注册过虑器,解决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>
<!--强制该对象(HttpServletRequest)使用encoding编码的值-->
<init-param>
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<!--强制该对象(HttpServletResponse)使用encoding编码的值-->
<init-param>
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!-- "/*"表示所有的请求都要先通过过滤器处理 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
四、接收返回值
-
ModelAndView类型
addObject()方法用于添加数据,底层使用reques.setAttribute()方法实现;
setViewName()方法用于转发视图,底层使用forward或redirect实现。
@RequestMapping(value = "/receiveproperty.do")
public ModelAndView doSome(String name, Integer age){
ModelAndView mv = new ModelAndView();
mv.addObject("myName",name);
mv.addObject("myAge",age);
mv.setViewName("show");
return mv;
}
- void类型
void类型通常配合ajax使用。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>发送请求</title>
<script type="text/javascript" src="js/jQuery-3.5.1.js"></script>
<script type="text/javascript">
$(function () {
$("#bt").click(function () {
$.ajax({
url:"returnVoid-ajax.do",
data:{
name:"zhangsan",
age:20
},
type:"post",
dataType:"text",
success(resp){
//resp是从服务器返回的json格式的字符串,{name:"zhangsan",age:"20"}
//jQuery会把字符转化为json对象,赋值给resp
alert(resp.name+" "+resp.age)
}
})
})
})
</script>
</head>
<body>
<button id="bt">发起Ajax请求</button>
</body>
</html>
@RequestMapping(value = "/returnVoid-ajax.do")
public void returnVoid(HttpServletResponse response,String name, Integer age) throws IOException {
Student student = new Student();
student.setName(name);
student.setAge(age);
//转化为json格式
String json = "";
if (student!=null){
ObjectMapper om = new ObjectMapper();
json = om.writeValueAsString(student);
System.out.println("student转换为json:"+json);
}
//输出数据,响应json请求
response.setContentType("application/json;charset=utf-8");
PrintWriter out = response.getWriter();
out.println(json);
out.flush();
out.close();
}
-
String类型
表示数据:
返回值是String类型,表示数据,此时含有@ResponseBody注解
默认编码为:text/plain;charset=ISO-8859-1,会出现中文乱码,使用produces更改编码
@RequestMapping(value = "/returnStringData.do",produces = "text/plain;charset=UTF-8")
@ResponseBody
public String returnStringData(String name, Integer age){
return "Hello SpringMVC ========奥利奥";
}
表示视图:
理器方法返回String(表示视图,此时没有@ResponseBody注解)——表示逻辑视图名称,需要配置视图解析器
当返回值是视图完整路径时需要取消视图解析器,因为视图解析器会进行字符拼接。
@RequestMapping(value = "/return-view.do")
public String returnView(HttpServletRequest request, String name, Integer age){
System.out.println("name:"+name+" age:"+age);
//可以手工在request域中加入参数
request.setAttribute("name",name);
request.setAttribute("age",age);
return "show";
}
-
Object类型
使用Ajax时主要使用json数据类型
<mvc:annotation-driven />
:注解驱动,能够将java对象转化为json、xml、二进制等数据类型
@ResponseBody注解:放到处理器方法上面
处理器将对象转化为json后,在内部通过HttpServletResponse输出数据,相应Ajax请求
@RequestMapping(value = "/returnStudentObject.do")
@ResponseBody
public Student returnStudentObject(String name, Integer age){
Student student = new Student();
student.setName("lisi");
student.setAge(23);
return student;
}