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返回值类型及响应数据类型的更多相关文章

  1. 05 SpringMVC:02.参数绑定及自定义类型转换&&04.SpringMVC返回值类型及响应数据类型&&05.文件上传&&06.异常处理及拦截器

    springMVC共三天 第一天: 01.SpringMVC概述及入门案例 02.参数绑定及自定义类型转换 03.SpringMVC常用注解 第二天: 04.SpringMVC返回值类型及响应数据类型 ...

  2. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_8 响应json数据之响应json格式数据

    springMvc的框架已经帮我们做好了.发过来的数据转换为javaBean对象 发过来的键值的形式,如果属性和javaBean对应的话,可以直接封装到对象中. key做额外的转换的时候,需要另外的j ...

  3. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_1 搭建环境

    创建项目 使用骨架,创建webapp 为了创建项目更快速maven设置 archetypeCatalog internal 修改编译的版本 从昨天的课程内复制 相关的坐标.上面是版本锁定. 复制前端的 ...

  4. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_5 响应之使用forward和redirect进行页面跳转

    这个方式用的比较少. forward 转发或者重定向 返回forward关键字就表现现在想使用的就是请求转发 redirect

  5. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_4 响应之返回值是ModelAndView类型

    ModelAndView是SpringMvc提供的一个对象 ModelAndView底层源码用也是ModelMap.ModelMap实现过Model的接口 ModelAndView可以直接new出来. ...

  6. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_3 响应之返回值是void类型

    定义先的标签 返回void 测试默认的跳转 虽然是404但是方法执行了. 默认请求了 testVoid.jsp这个页面.请求路径叫什么 就访问哪个jsp页面. 使用request请求转发 抛出的异常 ...

  7. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_2 响应之返回值是String类型

    返回字符串 新建一个response的页面 新建后台Controller类 视图解析器配置的前缀地址 是WEB-INF下的pages下的页面. 创建pages文件夹在下面创建success.jsp页面 ...

  8. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_7 响应json数据之发送ajax的请求

    编写conroller的方法 @RequestBody获取请求体的内容.当前请求体传递的是json字符串. 拿到了请求的内容

  9. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_6 响应json数据之过滤静态资源

    先搭建环境 webapp目录下创建js的文件夹.然后里面引入jquery.min.js这个文件. 页面引入这个js文件 先alert弹窗做测试 服务器重新部署 点击ajax的按钮 并没有起作用 我们在 ...

  10. SSM框架之SpringMVC(4)返回值类型及响应数据类型

    SpringMVC(4)返回值类型及响应数据类型 1. 返回值分类 1.1. 返回字符串 Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址. @RequestM ...

随机推荐

  1. 01-Docker实战,搭建NodeJs环境

    目的 实现简单的docker的nodejs容器,使用Dockerfile构建我们的使用nodejs开发的系统 技术栈 Docker Nodejs Express Linux step1 下拉nodej ...

  2. 读书笔记:A Philosophy of Software Design

    今天一位同事在斯坦福的博士生导师John Ousterhout (注,Tcl语言的设计者)来公司做了他的新书<A Philosophy of Software Design>的演讲,介绍了 ...

  3. 关于CSDN博客上传图片的接口研究

    代码实现 import requests from requests_toolbelt import MultipartEncoder import urllib.parse fields = { ' ...

  4. 【笔面试真题】Flow++赋乐科技-面试-2022年1月25日

    一.概括 涉及JVM的GC.三色标记 并发部分的锁 Java集合中的hashmap.list kafka中ISR相关 硬件相关-有无DMA 自定义类(代码) 缺陷:锁.list 二.JVM相关内容 1 ...

  5. 为什么推荐Kestrel作为网络开发框架

    为什么推荐Kestrel 网络框架千千万万,在dotnet平台,我们可以直接手撸Socket,也可以基于dotnetty来开发,或者选择某些第三方类似于dotnetty的网络库,为何我要推荐Kestr ...

  6. 深度学习GPU加速配置方法

    深度学习GPU加速配置方法 一.英伟达官方驱动及工具安装 首先检查自己的电脑驱动版本,未更新至最新建议先将驱动更新至最新,然后点击Nvidia控制面板 2.在如下界面中点击系统信息,点击显示可以看见当 ...

  7. 异常处理语法结构、yield生成器及其表达式

    今日内容回顾 目录 今日内容回顾 异常处理语法结构 异常处理实战应用 生成器对象 自定义range功能 yield冷门用法 yield与return对比 生成器表达式 笔试题 异常处理语法结构 异常处 ...

  8. js属性对象的hasOwnProperty( )方法,检测一个属性是否是对象的自有属性

    hasOwnProperty() 方法会返回一个布尔值,指示对象自身属性中是否具有指定的属性(也就是,是否有指定的键). 语法: obj.hasOwnProperty(prop) 参数: prop  ...

  9. P3Depth: Monocular Depth Estimation with a Piecewise Planarity Prior

    1. 论文简介 论文题目:P3Depth: Monocular Depth Estimation with a Piecewise Planarity Prior Paper地址:paper Code ...

  10. MyBatis四大参数两种写法

    MyBatis四大参数两种写法 1.在主配置文件中,直接写到value值里面 2.四大参数写入单独配置文件 开始是 为了避免以后其他框架冲突 都加个前缀 jdbc. 主要是红色框里的三个部分 自己定义 ...