响应数据与结果视图
文章目录
- 响应数据与结果视图
-
- 1 String 类型返回值的控制器方法
- 2 void 类型返回值的控制器方法
- 3 ModelAndView 类型返回值的控制器方法
- 4 使用关键字进行转发和重定向
- 5 POJO 类型返回值的控制器方法
本篇博文介绍 springMVC 不同类型返回值的控制器方法处理响应数据。
代码详情已上传至 GitHub,地址:https://github.com/Jacks5320/springMvcStudy
1 String 类型返回值的控制器方法
- 如果控制器方法的返回值是一个 String 类型,springmvc 会根据配置的视图解析器的路径去匹配资源。
- 如果需要返还给前端作数据渲染,可以使用 Model 的实现类来存储。因为 Model 的实现类都直接或间接继承了 Map 集合。
- Model 存储的属性,最终会存入 request 域中,jsp 页面可以使用 el 表达式获取。
@Controller
@RequestMapping("/demo6")
public class Demo6Controller {@GetMapping("/testString")
public String testString(Model model) {System.out.println("<== testString 方法执行了 ==>");
//返还 pojo 类
Book book = new Book();
book.setName("SpringMVC从入门到转行");
book.setAuthor("劝退大师");
book.setVersion(1);
//model 对象,将返回属性存入到 model 对象中,
//进而存到 request 域转发给页面,
//页面可以使用返回值渲染页面。
model.addAttribute("book", book);
return "success";
}
}
请求与结果
操作成功页面 - 锐客网
操作成功跳转的页面
方法返回值为 String 类型,使用 Model 存储对象,转发给页面
书名:${book.name}
作者:${book.author}
版本:${book.version}
文章图片
2 void 类型返回值的控制器方法 默认情况会根据配置的视图解析器去访问对应的资源,如果我作如下配置:
视图解析器:
@Controller
@RequestMapping("/demo6")
public class Demo6Controller {@GetMapping("/testVoid")
public void testVoid(){}
}
- 当我们访问
http://localhost:8080/demo/demo6/testVoid
时( demo 是我的项目路径) - 默认情况 springMVC 会映射到
/demo/WEB-INF/pages/demo6/testVoid.jsp
这个资源。 - 资源路径的拼接方式:项目路径/视图解析器路径/请求路径.jsp,也就是我这里的 /demo + /WEB-INF/pages/ + /demo6/testVoid.jsp
- 如果这个资源不存在,页面会报 404 错误。
- 如果希望处理页面不报 404,有两种方式解决:1 在项目中创建这个资源;2 使用 servlet 的原生接口进行 请求转发、重定向,又或者是使用字符流直接响应到界面。
- 下面演示使用 servlet 原生接口作响应处理。
@GetMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("<== testVoid 方法执行了 ==>");
//请求转发,请求转发一次请求,不需要编写项目的名称
//手动转发,springmvc 就不会再提供视图解析器了,需要手动补全资源路径
request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
}
2 重定向
@GetMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("<== testVoid 方法执行了 ==>");
//请求重定向,重定向是重新发送一个请求。
//前端发送的请求不能直接访问 WEB-INF 文件夹下的资源,所以这里直接重定向到 index.jsp 页面
response.sendRedirect("/demo/index.jsp");
//也可以使用 request.getContextPath() 来获取项目路径
response.sendRedirect(request.getContextPath() + "/index.jsp");
}
3 直接使用字符流响应
@GetMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println("<== testVoid 方法执行了 ==>");
//直接响应页面,使用输出流响应页面
//设置响应类型
response.setContentType("text/html;
charset=utf-8");
//在页面输出一句话,如果是中文,需要设置编码
response.getWriter().println("操作成功了");
}
3 ModelAndView 类型返回值的控制器方法
- ModelAndView 对象是 Spring 提供的一个对象,可以用调整具体的 JSP 视图。
- ModelAndView 对象可以存储数据,进而存入到 request 域对象中。
@GetMapping("/testModelAndView")
public ModelAndView testModelAndView(){//创建 ModelAndView 对象
ModelAndView modelAndView = new ModelAndView();
//创建 pojo 对象
Book book = new Book();
book.setName("MySQL从删库到跑路");
book.setAuthor("跑路大师");
book.setVersion(1);
//使用 ModelAndView 对象以 key-value 的方式存储 pojo 对象
modelAndView.addObject("book",book);
//跳转页面,可以使用 视图解析器 进行解析,然后跳转
//String 类型返回值的方法底层也会使用 ModelAndView 对象来调用视图解析器
modelAndView.setViewName("success");
return modelAndView;
}
文章图片
4 使用关键字进行转发和重定向
- 使用关键字进行转发和重定向不能使用视图解析器,需要手动补全资源路径。
- 重定向依赖不能访问 WEB-INF 中的资源。
- 相比于使用原生 servlet 接口方式的重定向,使用关键字进行重定向可以不加项目路径,直接使用资源路径即可。
- 请求转发关键字:
forward
- 重定向关键字:
redirect
//请求转发
@GetMapping("/testKeyWord")
public String testKeyWord(){//不能使用 视图解析器,所以需要补全资源路径
return "forward:/WEB-INF/pages/success.jsp";
}
//重定向:不能直接访问 WEB-INF 中的资源
@GetMapping("/testKeyWord")
public String testKeyWord(){//不需要再加项目路径,直接映射资源路径
return "redirect:/index.jsp";
}
5 POJO 类型返回值的控制器方法
- 在 [SpringMVC 注解] 一文中已经介绍过注解的使用方式了。
- 使用
@RequestBody
接收ajax
发送的json
格式请求体。 - 使用
@Response
注解返回json
格式响应体给ajax
解析处理。 - 下面依然使用
ajax
发送请求和处理请求。
com.fasterxml.jackson.core
jackson-databind
2.9.9
com.fasterxml.jackson.core
jackson-core
2.9.9
com.fasterxml.jackson.core
jackson-annotations
2.9.9
控制器方法
@PostMapping("/testJson")
@ResponseBody
public Book testJson(@RequestBody Book book){book.setVersion(2);
return book;
}
- 这里将请求体中的 version 从 1 修改成 2,然后返回。
src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js">
>
//页面加载,绑定点击事件。
$(function () {$("#btn").click(function () {// alert("hello btn");
$.ajax({// 编写 json 格式,设置属性和值。
url: "demo6/testJson",
contentType: "application/json;
charset=UTF-8",
data: '{"name":"Linux从入门到入土","author":"秃头大师","version":"1"}',
dataType: "json",
type: "post",
success: function (data) {//data 是服务器端响应的 json 数据,进行解析
console.log(data);
console.log(data.name);
console.log(data.author);
console.log(data.version);
}
})
});
});
文章图片
- 关于响应处理方式就到这里了,可能还有其他方法,仅作参考。
推荐阅读
- SpringMVC使用@RequestBody后台返回前台中文字符串乱码的问题解决方案
- java|【Maven+SSM】超详细Spring+SpringMVC+Mongo集成
- SpringMVC|解决IDEA配置Tomcat虚拟路径问题
- springmvc|SpringMVC使用注意点,由spring的controller是单例还是多例,怎么保证并发的安全问题思考
- SpringMVC|Controller上添加@RequestMapping后导致静态资源文件404的解决办法
- springmvc|springmvc Interceptor 拦截 ajax 请求 成功后,返回至页面
- spring4.x找不到MappingJacksonHttpMessageConverter错误解决
- SpringMVC|springmvc请求路径和请求参数的获取注解- @PathVariable和@RequestParam
- Java|spring4+hibernate4+springmvc+nginx+redis实现session共享