SpringMVC返回值类型及响应数据类型
1.SpringMVC 和 Struts2 的优略分析
共同点:
它们都是表现层框架,都是基于 MVC 模型编写的。
它们的底层都离不开原始 ServletAPI。
它们处理请求的机制都是一个核心控制器。
区别:
Spring MVC 的入口是 Servlet, 而 Struts2 是 Filter。
Spring MVC 是基于方法设计的,而 Struts2 是基于类,Struts2 每次执行都会创建一个动作类。所以 Spring MVC 会稍微比 Struts2 快些。
Spring MVC 使用更加简洁,同时还支持 JSR303, 处理 ajax 的请求更方便。
(JSR303 是一套 JavaBean 参数校验的标准,它定义了很多常用的校验注解,我们可以直接将这些注解加在我们 JavaBean 的属性上面,就可以在需要校验的时候进行校验了。)
Struts2 的 OGNL 表达式使页面的开发效率相比 Spring MVC 更高些,但执行效率并没有比 JSTL 提升,尤其是 struts2 的表单标签,远没有 html 执行效率高。
2.SpringMVC不同返回值类型的响应
准备工作:在webapp下创建一个response.jsp页面
在WEB-INF/pages目录下创建一个success.jsp页面
创建一个User类(username,password,age三个属性)
创建一个UserController
2.1.返回值是String类型的响应
controller 方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
使用这种方法会通过视图解析器解析出对应地址:WEB-INF/pages/xxx.jsp
2.1.1.在response.jsp页面写一个超链接
<a href="user/testString" >testString</a>
2.1.2.在UserController写返回值是String类型的方法
//指定逻辑视图名,经过视图解析器解析为 jsp 物理路径:/WEB-INF/pages/success.jsp
@RequestMapping("/testString")
public String testString(Model model){
System.out.println("testString方法执行了...");
// 模拟从数据库中查询出User对象
User user = new User();
user.setUsername("美美");
user.setPassword("123");
user.setAge(30);
// model对象
model.addAttribute("user",user);
return "success";
}
2.1.3.在success.jsp页面通过el表达式取值
<h3>执行成功</h3>
${user.username}
${user.password}
2.2.返回值是void类型的响应
2.2.1.在response.jsp页面写一个超链接
<a href="user/testVoid" >testVoid</a>
2.2.2.在UserController写返回值是void类型的方法
因为是void类型,不能像上一个String类型一样直接返回一个字符串(一个jsp页面),所以需要用到servlet的原始API,在Controller方法的形参上定义request和response,使用 request 或 response 指定响应结果。
@RequestMapping("/testVoid")
public void testVoid(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("testVoid方法执行了...");
// 1.使用request转向页面,编写请求转发的程序
// request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request,response);
// 2.使用response进行页面重定向
//response.sendRedirect(request.getContextPath()+"/index.jsp");
// 设置中文乱码
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
// 3.直接进行响应,但是在这之前需要设置中文乱码
response.getWriter().print("你好");
return;
}
注意:请求转发是一次请求,使用request对象会调用视图解析器,所以会进入WEB-INF/pages/目录下
重定向是两次请求,且不会进入WEB-INF/pages/目录下
2.3.返回值是ModelAndView类型的响应
2.3.1.在response.jsp页面写一个超链接
<a href="user/testModelAndView" >testModelAndView</a>
2.3.2.在UserController写返回值是ModelAndView类型的方法
这个与最前面的返回值是String类型的类似
ModelAndView是SpringMVC提供的一个对象,也会调用视图解析器帮我们跳转到xxx.jsp页面
/**
* 返回ModelAndView对象
* 可以传入视图的名称(即跳转的页面),还可以传入对象。
* @return
* @throws Exception
*/
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){
// 创建ModelAndView对象
ModelAndView mv = new ModelAndView();
System.out.println("testModelAndView方法执行了...");
// 模拟从数据库中查询出User对象
List<User> users = new ArrayList<>();
User user1 = new User();
user1.setUsername("小凤");
user1.setPassword("456");
user1.setAge(30); User user2 = new User();
user1.setUsername("智障");
user1.setPassword("789"); users.add(user1);
users.add(user2);
// 把users对象存储到mv对象中,也会把user对象存入到request对象
mv.addObject("users",users);
// 跳转到哪个页面(设置逻辑视图名,视图解析器会根据名称前往指定的视图)
mv.setViewName("success");
return mv;
}
2.3.3.在success.jsp页面通过el表达式取值
<h3>执行成功</h3>
${user.username}
${user.password}
2.4.响应之使用关键字forword和redirect进行页面跳转
controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。
/**
* 使用关键字的方式进行转发或者重定向
* @return
*/
@RequestMapping("/testForwardOrRedirect")
public String testForwardOrRedirect(){
System.out.println("testForwardOrRedirect方法执行了...");
// 请求的转发
// return "forward:/WEB-INF/pages/success.jsp";
// 重定向
return "redirect:/index.jsp";
}
注意:如果用了 formward:则路径必须写成实际视图 url,不能写逻辑视图。
使用请求转发,它相当于于“request.getRequestDispatcher("url").forward(request,response)”。使用请求 转发,既可以转发到 jsp,也可以转发到其他的控制器方法。
如果是重定向到 jsp 页面,则 jsp 页面不 能写在 WEB-INF 目录中,否则无法找到。
3.ResponseBody响应json数据
前面所记录的不管通过何种方式,都要先跳转到一个jsp页面进行响应,如果页面发送的是一个ajax请求,则可以通过ResponseBody进行响应。
ResponseBody注解(获得请求体的全部内容):该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的 数据如:json,xml 等,通过 Response 响应给客户端
3.1.首先需要在webapp下建立js/jquery.min.js文件
3.2.在response.jsp页面引入该文件
<script src="${pageContext.request.contextPath}/js/jquery.min.js"></script>
3.3.配置静态文件不拦截
由于之前在web.xml中配置前端控制器的时候拦截了所有资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,不能被使用,
所以此时需要配置不拦截静态资源。
mvc:resource标签配置不过滤
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 -->
3.4.在response.jsp页面写ajax请求
<script>
// 页面加载,绑定单击事件
$(function(){
$("#btn").click(function(){
// alert("hello btn");
// 发送ajax请求
$.ajax({
// 编写json格式,设置属性和值
url:"user/testAjax", //请求地址,必须与controller层请求地址相对应
contentType:"application/json;charset=UTF-8",//发送数据给服务器端时的编码类型,此处为json类型
data:'{"username":"hehe","password":"123","age":30}',//发送到服务器端的数据内容,key值与Javabean中的属性名相同,才能封装到对象
dataType:"json", //服务器返回的数据类型
type:"post", //请求方式,默认get
success:function(data){//请求成功后的回调函数
// data服务器端响应的json的数据,进行解析
alert(data);//弹出对象
alert(data.username);//弹出用户名
alert(data.password);//弹出密码
alert(data.age);//弹出年龄
}
});
});
});
</script>
注意:发送到服务器的内容那块,将key值与Javabean中的属性一一对应,才可以进行封装,除此之外,还需要用到几个jar包:
<dependency>
<goupId>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>
3.5.编写controller方法
/**
* 模拟异步请求响应
*/
@RequestMapping("/testAjax")
public @ResponseBody User testAjax(@RequestBody User user){
System.out.println("testAjax方法执行了...");
// 客户端发送ajax的请求,传的是json字符串,后端把json字符串封装到user对象中
System.out.println(user);
// 做响应,模拟更新数据库,将用户名和年龄改了,密码没有更改
user.setUsername("haha");
user.setAge(40);
// 做响应,只需返回一个User对象即可
return user;
}
注意:由于key值和对象属性一一对应,封装到对象中去了,所以@RequestBody后边就直接写User,
@ResponseBody再将user对象转换成json字符串响应给前端页面。
SpringMVC返回值类型及响应数据类型的更多相关文章
- 05 SpringMVC:02.参数绑定及自定义类型转换&&04.SpringMVC返回值类型及响应数据类型&&05.文件上传&&06.异常处理及拦截器
springMVC共三天 第一天: 01.SpringMVC概述及入门案例 02.参数绑定及自定义类型转换 03.SpringMVC常用注解 第二天: 04.SpringMVC返回值类型及响应数据类型 ...
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_8 响应json数据之响应json格式数据
springMvc的框架已经帮我们做好了.发过来的数据转换为javaBean对象 发过来的键值的形式,如果属性和javaBean对应的话,可以直接封装到对象中. key做额外的转换的时候,需要另外的j ...
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_1 搭建环境
创建项目 使用骨架,创建webapp 为了创建项目更快速maven设置 archetypeCatalog internal 修改编译的版本 从昨天的课程内复制 相关的坐标.上面是版本锁定. 复制前端的 ...
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_5 响应之使用forward和redirect进行页面跳转
这个方式用的比较少. forward 转发或者重定向 返回forward关键字就表现现在想使用的就是请求转发 redirect
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_4 响应之返回值是ModelAndView类型
ModelAndView是SpringMvc提供的一个对象 ModelAndView底层源码用也是ModelMap.ModelMap实现过Model的接口 ModelAndView可以直接new出来. ...
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_3 响应之返回值是void类型
定义先的标签 返回void 测试默认的跳转 虽然是404但是方法执行了. 默认请求了 testVoid.jsp这个页面.请求路径叫什么 就访问哪个jsp页面. 使用request请求转发 抛出的异常 ...
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_2 响应之返回值是String类型
返回字符串 新建一个response的页面 新建后台Controller类 视图解析器配置的前缀地址 是WEB-INF下的pages下的页面. 创建pages文件夹在下面创建success.jsp页面 ...
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_7 响应json数据之发送ajax的请求
编写conroller的方法 @RequestBody获取请求体的内容.当前请求体传递的是json字符串. 拿到了请求的内容
- 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_6 响应json数据之过滤静态资源
先搭建环境 webapp目录下创建js的文件夹.然后里面引入jquery.min.js这个文件. 页面引入这个js文件 先alert弹窗做测试 服务器重新部署 点击ajax的按钮 并没有起作用 我们在 ...
- SSM框架之SpringMVC(4)返回值类型及响应数据类型
SpringMVC(4)返回值类型及响应数据类型 1. 返回值分类 1.1. 返回字符串 Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址. @RequestM ...
随机推荐
- 01-Docker实战,搭建NodeJs环境
目的 实现简单的docker的nodejs容器,使用Dockerfile构建我们的使用nodejs开发的系统 技术栈 Docker Nodejs Express Linux step1 下拉nodej ...
- 读书笔记:A Philosophy of Software Design
今天一位同事在斯坦福的博士生导师John Ousterhout (注,Tcl语言的设计者)来公司做了他的新书<A Philosophy of Software Design>的演讲,介绍了 ...
- 关于CSDN博客上传图片的接口研究
代码实现 import requests from requests_toolbelt import MultipartEncoder import urllib.parse fields = { ' ...
- 【笔面试真题】Flow++赋乐科技-面试-2022年1月25日
一.概括 涉及JVM的GC.三色标记 并发部分的锁 Java集合中的hashmap.list kafka中ISR相关 硬件相关-有无DMA 自定义类(代码) 缺陷:锁.list 二.JVM相关内容 1 ...
- 为什么推荐Kestrel作为网络开发框架
为什么推荐Kestrel 网络框架千千万万,在dotnet平台,我们可以直接手撸Socket,也可以基于dotnetty来开发,或者选择某些第三方类似于dotnetty的网络库,为何我要推荐Kestr ...
- 深度学习GPU加速配置方法
深度学习GPU加速配置方法 一.英伟达官方驱动及工具安装 首先检查自己的电脑驱动版本,未更新至最新建议先将驱动更新至最新,然后点击Nvidia控制面板 2.在如下界面中点击系统信息,点击显示可以看见当 ...
- 异常处理语法结构、yield生成器及其表达式
今日内容回顾 目录 今日内容回顾 异常处理语法结构 异常处理实战应用 生成器对象 自定义range功能 yield冷门用法 yield与return对比 生成器表达式 笔试题 异常处理语法结构 异常处 ...
- js属性对象的hasOwnProperty( )方法,检测一个属性是否是对象的自有属性
hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键). 语法: obj.hasOwnProperty(prop) 参数: prop ...
- P3Depth: Monocular Depth Estimation with a Piecewise Planarity Prior
1. 论文简介 论文题目:P3Depth: Monocular Depth Estimation with a Piecewise Planarity Prior Paper地址:paper Code ...
- MyBatis四大参数两种写法
MyBatis四大参数两种写法 1.在主配置文件中,直接写到value值里面 2.四大参数写入单独配置文件 开始是 为了避免以后其他框架冲突 都加个前缀 jdbc. 主要是红色框里的三个部分 自己定义 ...