SpringMVC(4)request和response
返回值分类
字符串
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。 指定逻辑视图名,经过视图解析器解析为 jsp 物理路径: /WEB-INF/pages/xxxx.jsp
jsp代码
<a href="user/testString">返回响应</a>
控制器代码
@Controller
@RequestMapping("user")
public class HelloController {
@RequestMapping("/testString")
public String testString(){
System.out.println("testString方法执行了");
return "success";
}
}
输出结果
在页面上显示user对象,模拟从数据库中查到User对象,需要借助Model,在jsp页面开启表达式支持,
编写User实体类
package com.ben.domain;
import java.io.Serializable;
/**
* @ClassName: User
* @author: benjamin
* @version: 1.0
* @description: TODO
* @createTime: 2019/08/10/16:07
*/
public class User implements Serializable {
String username;
String password;
Integer age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
'}';
}
}
编写控制器代码
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("从数据库中查找数据了");
User user = new User();
user.setUsername("小强");
user.setPassword("123");
user.setAge(18);
model.addAttribute("user",user);
System.out.println("testString方法执行了");
return "success";
}
编写解析后的success.jsp代码
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>执行成功</h1>
${user.username}
</body>
</html>
输出结果
void
控制器方法
@RequestMapping("/testVoid")
public void testVoid(Model model){
System.out.println("testVoid方法执行了");
}
jsp代码
<a href="user/testVoid">testVoid方法</a>
可以看到,对于无返回值的控制器方法,它找到的是默认请求路径.jsp
借用Servlet中的API,在controller 方法形参上可以定义 request 和 response,使用 request或response 指定响应结果;
-
使用request重定向页面;
-
通过 response 页面重定向;
-
通过 response 指定响应结果,直接响应json
代码如下:
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception{
// 使用request重定向页面;
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
// // 重定向
// response.sendRedirect(request.getContextPath()+"/index.jsp");
//
// // 直接进行响应
// // 设置中文乱码
// response.setCharacterEncoding("UTF-8");
// response.setContentType("text/html;charset=UTF-8");
// response.getWriter().print("您好");
// return;
}
ModelAndView对象
ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。
该对象有两个方法:
addObject(String attributeName, Object attributeValue):添加对象到模型中;
setViewName(String viewName):用于设置逻辑视图名称,视图解析器会根据名称前往指定的视图;
jsp页面
<a href="user/testModelAndView">testModelAndView</a>
控制器代码
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(Model model){
ModelAndView mv = new ModelAndView();
System.out.println("testString方法执行了");
System.out.println("从数据库中查找数据了");
User user = new User();
user.setUsername("小强");
user.setPassword("123");
user.setAge(18);
//把user对象存储到mv对象中,也会把user对象存入到request对象中
mv.addObject("user",user);
// 跳转到哪个页面
mv.setViewName("success");
return mv;
}
转发和重定向
forward请求转发
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。
需要注意的是,如果用了 formward:
则路径必须写成实际视图 url,不能写逻辑视图。它相当于“request.getRequestDispatcher("url").forward(request,response)” 。使用请求转发,既可以转发到 jsp,也可以转发到其他的控制器方法。
redirect重定向
contrller 方法提供了一个 String 类型返回值之后, 它需要在返回值里使用:redirect:
举例:
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("testForwardOrRedirect方法执行了...");
// 请求的转发
return "forward:/WEB-INF/pages/success.jsp";
// 重定向
// return "redirect:/index.jsp";
}
ResponseBody响应json数据
该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的
数据如: json,xml 等,通过 Response 响应给客户端
-
web app下创建新的js文件夹,引入jquery
-
在springmvc.xml中配置,哪些静态资源不拦截
mvc:resources标签:配置哪些资源不过滤
- location元素表示webapp目录下的包下的所有文件
- mapping元素表示以/static开头的所有请求路径,如/static/a 或者/static/a/b
<!-- 设置静态资源不过滤 --> <mvc:resources location="/css/" mapping="/css/**"/> <!-- 样式 --> <mvc:resources location="/images/" mapping="/images/**"/> <!-- 图片 --> <mvc:resources location="/js/" mapping="/js/**"/> <!-- javascript -->
-
编写jsp页面代码,编写发送ajax函数
<script src="js/jquery.min.js"></scrpt> <script> // 页面加载,绑定单击事件 $(function(){ $("#btn").click(function(){ // alert("hello btn"); // 发送ajax请求 $.ajax({ // 编写json格式,设置属性和值 url:"user/testAjax", contentType:"application/json;charset=UTF-8", data:'{"username":"hehe","password":"123","age":30}', dataType:"json", type:"post", success:function(data){ // data服务器端响应的json的数据,进行解析 alert(data); alert(data.username); alert(data.password); alert(data.age); } }); }); }); </script> <body> <br/> <button id="btn">发送ajax的请求</button> </body> </html>
-
获取请求体的数据
@RequestMapping("/testAjax") public @ResponseBody String testAjax(@RequestBody String body){ System.out.println("testAjax方法执行了..."); System.out.println(body); return "success"; }
-
使用RequestBody注解把Json字符串转为JavaBean对象。发送的key值和javaBean中的属性名相同,则框架自动封装,需要导入三个jar包
/** * JSON -JavaBean; JavaBean->JSON * @param user */ @RequestMapping("/testAjax") // @ResponseBody User 将User对象转为字符串 public @ResponseBody User testJson(@RequestBody User user) { System.out.println("testAjax方法执行了..."); System.out.println(user); // 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中 // 做响应,模拟查询数据库 user.setUsername("haha"); user.setAge(40); // 做响应 return user; }
json字符串和JavaBean对象互相转换的过程中,需要使用jackson的jar包
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
本文作者:benjieqiang
本文链接:https://www.cnblogs.com/benjieqiang/p/11348888.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步