使用@Controller 注解的处理器的处理器方法,其返回值常用的有四种类型:
- ModelAndView
- String
- 无返回值 void
- 返回自定义类型对象
返回 ModelAndView
有数据和视图,对视图执行forward ,处理器方法处理完,需要跳转到其他资源,且又要在跳转的资源传递数据
Model:数据,View:视图(页面)
@Controller
public class myController {
@RequestMapping(value = "/receice.do",method = RequestMethod.POST)
public ModelAndView receivce(user user){
ModelAndView mv = new ModelAndView();
mv.addObject("name",user.getUsername());
mv.addObject("age",user.getAge());
mv.addObject("sex",user.getSex());
mv.addObject("date",user.getBirthday());
mv.addObject("tell",user.getTellphone());
mv.setViewName("/WEB-INF/show2.jsp");
return mv;
}
}
返回 String
表示视图,可以逻辑名称,也可以是完整视图路径,这个就是返回View部分,可以使用视图解析器,访问路径拼接。
硬要是自己要传一些数据的话,也是可以自己加的HttpServletRequest request参数在处理器方法中
可以传入数据到需要跳转的页面上,Model model
@RequestMapping("/hello")
public String returnString(Model model){
User u = new User();
u.setDate(new Date());
u.setAge(21);
u.setName("ycy");
model.addAttribute("user",u);
return "success";
}
在页面上可以获取到这个数据,使用这个对象的(数据)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>成功登录!!!</h1>
姓名:${user.name}<br/>
年龄:${user.age}<br/>
生日:${user.date}
</body>
</html>
在springmvc.xml文件中:
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/"/>
<property name="suffix" value=".jsp"/>
</bean>
@Controller
public class myController {
@RequestMapping(value = "/return-View.do",method = RequestMethod.POST)
public String ReturnView(){
return "/WEB-INF/showString.jsp";
}
}
返回 void
对于处理器方法返回 void 的应用场景,AJAX 响应. 若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void
代码演示:
1、页面index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<meta http-equiv="Content-Type" content="textml; charset=UTF-8">
<title>Title</title>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
<script type="text/javascript">
$(function () {
$("#btn").click(function () {
$.ajax({
url:"returnVoid.do",
data:{
username:$("#name").val(),
//后台获取的数据都是字符串的格式。需要和user对象的属性类型对应
age:Number($("#age").val()),
birthday:$("#birthday").val(),
sex:$(":radio:checked").val(),
tellphone:$("#tellphone").val()
},
type:"post",
dataType:"json",
success:function (data) {
//jQuery会把字符串转为json对象,赋值给data形参
alert(data.username+" "+data.age+" "+data.sex);
},
error:function () {
alert("error!!");
}
})
})
})
</script>
<style>
input {
outline: none;
border: none;
}
</style>
</head>
<body>
<form action="return-View.do" method="post">
<table width="300px" border="1" cellpadding="0" cellspacing="0">
<tr>
<td>姓名</td>
<td><input type="text"name="username" id="name"/></td>
</tr>
<tr>
<td>年龄</td>
<td><input type="text"name="age" id="age"></td>
</tr>
<tr>
<td>出生日期</td>
<td> <input type="date"name="birthday" id="birthday"/> </td>
</tr>
<tr>
<td>性别</td>
<td>
<input type="radio"name="sex" value="男">男
<input type="radio" name="sex" value="女">女
</td>
</tr>
<tr>
<td>电话号码</td>
<td><input type="text" name="tellphone" id="tellphone"></td>
</tr>
<tr>
<td><input type="submit" value="注册"></td>
</tr>
</table>
</form>
<br/>
<button id="btn">发起ajax请求</button>
</body>
</html>
2、user对象
public class user {
private String username;
private int age;
private String birthday;
private String sex;
private String tellphone;
//set/get方法
}
@Controller
public class myController {
@RequestMapping(value = "/returnVoid.do",method = RequestMethod.POST)
public void Returnvod(HttpServletResponse response, user user) throws IOException {
String json="";
if(user !=null){
//1.把结果的对象转为json格式的数据
ObjectMapper mapper = new ObjectMapper();
json = mapper.writeValueAsString(user);
}
System.out.println(json);
response.setContentType("application/json;charset=utf-8");
//2.输出数据,响应ajax的请求
PrintWriter wr = response.getWriter();
wr.println(json);
wr.flush();
wr.close();
}
}
void方式的小结 :首先需要导入依赖json的,需要加入需要加入jQuery的文件 js/jquery-3.3.1.min.js
手工实现ajax,json数据:代码有重复的:
1、java对象转为json
ObjectMapper mapper = new ObjectMapper();
json = mapper.writeValueAsString(user);
2、通过HttpServletResponse输出json数据
PrintWriter wr = response.getWriter();
wr.println(json);
wr.flush();
wr.close();
有重复的代码,所以我们需要在学习返回类型为Object的
注意:
在返回值是void时,默认是会访问以请求的路径,在加上.jsp页面(这时没有这个页面,就会出现)404错误
@RequestMapping("/hello")
public void returnVoid(){
System.out.println("returnVoid方法执行了");
}
1、使用 request 转向页面
@RequestMapping("/hello")
public void returnVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("returnVoid方法执行了");
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
}
2、也可以通过 response 页面重定向 不可以访问WEB-INF目录下的文件
@RequestMapping("/hello")
public void returnVoid(HttpServletResponse response) throws ServletException, IOException {
System.out.println("returnVoid方法执行了");
response.sendRedirect("index.jsp");
}
3、也可以通过 response 指定响应结果,例如响应 json 数据 ,就像上面一样。