Spring MVC处理响应附案例详解

news2024/11/25 12:56:44

目录

一、配置视图解析器

二、控制器方法的返回值

2.1 返回值为void

2.1.1 控制器方法

2.1.2 jsp页面

2.1.3 测试结果

2.2 返回值为String

2.2.1 控制器方法

2.2.2 测试结果

2.3 返回值为ModelAndView

2.3.1 控制器方法

2.3.2 JSP页面

2.3.3 测试结果 

三、某些会话对象设置数据

3.1 request域设置数据

3.1.1 使用参数为原生的HttpServletRequest

3.1.2 使用参数为Model和ModelMap

3.1.3 使用参数为Map集合

3.2 session域设置数据

3.2.1 控制器方法

3.2.2 测试结果 

3.3 context域设置数据

3.2.1 控制器方法

3.2.2 测试结果 

四、请求转发&重定向

4.1 原生请求转发重定向写法

4.1.1 重定向控制器方法

4.1.2 重定向测试结果

4.1.3 请求转发测试结果

4.2 springmvc提供的请求转发重定向写法

往期专栏&文章相关导读 

1. Maven系列专栏文章

2. Mybatis系列专栏文章

3. Spring系列专栏文章

4. Spring MVC系列专栏文章 


一、配置视图解析器

SpringMVC默认情况下会在控制器执行完成后跳转到视图页面,视图解析器能找到相应的视图,之前的404异常就是由于没有配置视图解析器导致找不到视图。在SpringMVC中提供了13个视图解析器,用于支持不同的视图技术。InternalResourceViewResolver是SpringMVC的默认视图解析器,用来解析JSP视图。

添加如下标签就算配置视图解析器了 

<!-- 视图解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 视图前缀 -->
        <property name="prefix" value="/"/>
        <!-- 视图后缀 -->
        <property name="suffix" value=".jsp"/>
    </bean>

二、控制器方法的返回值

我们可以通过控制器方法的返回值设置跳转的视图,控制器方法支持以下返回值类型:

2.1 返回值为void

此时会跳转到名字是 前缀+方法路径名+后缀 的jsp页面

2.1.1 控制器方法

    /**
     * SpringMVC处理响应——控制器方法(根据返回值)
     */
    // 路径是helloMVC,方法执行完后会跳转到/helloMVC.jsp
    @RequestMapping("helloMVC")
    public void helloMVC(){
        System.out.println("hello SpringMVC!");
    }

2.1.2 jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>MVC</title>
</head>
<body>
    <h1>欢迎来到SpringMVC!</h1>
</body>
</html>

2.1.3 测试结果

访问路径:http://localhost:8080/helloMVC

 OK,确实返回了jsp页面

2.2 返回值为String

此时会跳转到名字是 前缀+返回值+后缀 的jsp页面

2.2.1 控制器方法

// 返回值是String,此时会跳转到名字是 前缀+返回值+后缀 的jsp页面
    @RequestMapping("c2/hello1")
    public String helloMVC1(){
        System.out.println("Hello SpringMVC!");
        return "helloMVC";
    }

2.2.2 测试结果

访问路径:http://localhost:8080/c2/hello1

OK,这次返回的也不是helloMVC1页面,确实成功实现了。 

2.3 返回值为ModelAndView

        这是SpringMVC提供的对象,该对象可以向request域设置数据并指定跳转的页面。该对象中包含Model对象和View对象。

  1. Model:向request域中设置数据。
  2. View:指定跳转的页面。

2.3.1 控制器方法

// 返回值为ModelAndView
    @RequestMapping("/c2/hello2")
    public ModelAndView useMAV(){
        System.out.println("返回值类型为ModelAndView");
        // 1.创建ModelAndView对象
        ModelAndView modelAndView = new ModelAndView();
        // 2.获取Model对象,本质是一个Map
        Map<String,Object> model = modelAndView.getModel();
        // 3.使用Model对象向request域设置数据
        model.put("username","黄庆禧");
        // 4.使用view对象设置跳转的路径
        modelAndView.setViewName("lyl-HQX");
        return modelAndView;
    }

OK,这里设置了一个username的属性,属性值为黄庆禧

2.3.2 JSP页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>lyl-HQX</title>
</head>
<body>
<h1>name: 你好!${requestScope.name}</h1>
  <h1>username: 你好!${requestScope.username}</h1>
  <h1>request-Map 你好!${requestScope.usernameMap}</h1>
  <h1>session 地址是:${sessionScope.address}</h1>
  <h1>context 年龄是:${applicationScope.age}</h1>
</body>
</html>

OK,这里解释一下,这里用到的参数是后面需要的。

2.3.3 测试结果 

OK,确实可以成功打印出黄庆禧的名字了。 

三、某些会话对象设置数据

        当控制器返回值为ModelAndView时我们可以向request域设置数据,我们还有以下方法可以向request域设置数据:

3.1 request域设置数据

3.1.1 使用参数为原生的HttpServletRequest

控制器方法

    /**
     * SpringMVC处理响应-request域
     */
    // 使用原生的HttpServletRequest
    @RequestMapping("/c2/hello3")
    public String setRequestModel(HttpServletRequest request){
        request.setAttribute("username","会洗碗的CV工程师");
        return "lyl-HQX";
    }

OK,username属性值为会洗碗的CV工程师,看一下能否成功获取 

测试结果

OK,可以看到确实成功获取了。 接下来尝试其他一些参数。

3.1.2 使用参数为Model和ModelMap

        SpringMVC提供了Model接口和ModelMap类,控制器方法添加这两个类型的参数,使用该参数设置数据,该数据就会存到request域中。

控制器方法

//使用Model、ModelMap
    @RequestMapping("/c2/hello4")
    public String setRequestModel2(Model model, ModelMap modelMap){
        // 使用Model将数据存入request域
        model.addAttribute("username","LYL");
        // 使用ModelMap将数据传入request域
        modelMap.addAttribute("usernameMap","HQX");
        return "lyl-HQX";
    }

测试结果

OK,可以看得到两个属性都已经成功获取。 

3.1.3 使用参数为Map集合

Model接口底层就是一个Map集合,我们可以给控制器方法设置Map类型的参数,向Map中添加键值对,数据也会存到request域中。

控制器方法

// 使用Map集合
    @RequestMapping("/c2/hello5")
    public String setRequestModel3(Map map){
        map.put("username","程序员");
        map.put("usernameMap","程序员");
        return "lyl-HQX";
    }

测试结果

OK,可以看得出来和上面也是一样可以使用的。 

3.2 session域设置数据

        Session作用域表示在当前会话中有效。在SpringMVC中对于Session作用域传值,只能使用HttpSession对象来实现。

3.2.1 控制器方法

    /**
     * SpringMVC处理响应-session域设置数据
     */
    @RequestMapping("/c2/hello6")
    public String setSessionModel(HttpSession session){
        session.setAttribute("address","北京");
        return "lyl-HQX";
    }

OK,这次是在session域设置了一个地址属性,看一下能否成功获取 

3.2.2 测试结果 

Ok,可以看到确实成功获取了。 

3.3 context域设置数据

        context作用域表示在整个应用范围都有效。在SpringMVC中对context作用域传值,只能使用ServletContext对象来实现。但是该对象不能直接注入到方法参数中,需要通过HttpSession对象获取。

3.2.1 控制器方法

    /**
     * SpringMVC处理响应-context域设置数据
     */
    @RequestMapping("/c2/hello7")
    public String setContextModel(HttpSession session){
        ServletContext servletContext = session.getServletContext();
        servletContext.setAttribute("age",10);
        return "lyl-HQX";
    }

这次利用context域设置了一个年龄属性,看一下能否获取对应的值。

3.2.2 测试结果 

OK,确实成功获取到了。 

四、请求转发&重定向

之前的案例,我们发现request域中的值可以传到jsp页面中,也就是通过视图解析器跳转到视图的底层是请求转发。
如果我们跳转时不想使用视图解析器,可以使用原生HttpServletRequest进行请求转发或HttpServletResponse进行重定向:

4.1 原生请求转发重定向写法

4.1.1 重定向控制器方法

    /**
     * SpringMVC处理响应-请求转发&重定向
     */
    @RequestMapping("/c2/hello8")
    public void myForward1(HttpServletRequest request, HttpServletResponse response) throws Exception{
        request.setAttribute("name","程序员");
        // 请求转发
        //request.getRequestDispatcher("/c2/hello9").forward(request,response);
        // 原生重定向
        response.sendRedirect("/c2/hello9");
    }

OK,这是重定向到/c2/hello9,接下来写一个/c2/hello9的控制器方法,看一下控制台能否打印出来。

    @RequestMapping("/c2/hello9")
    public void myForward2(HttpServletRequest request){
        System.out.println("hello");
        System.out.println(request.getAttribute("name"));
    }

4.1.2 重定向测试结果

OK,可以看得到确实重定向去了。注意看,这里重定向出来后是无法获取request域的属性值的,待会试一下请求转发可不可以。 重定向地址栏会发生变化,而请求转发地址栏是不会变化的。

4.1.3 请求转发测试结果

OK,,可以看得到请求转发就可以获取属性值,并且地址栏没有发生变化。

4.2 springmvc提供的请求转发重定向写法

// SpringMVC提供一种关于重定向和请求转发更为简单的写法
    @RequestMapping("/c2/hello10")
    public String myForward3(HttpServletRequest request){
        request.setAttribute("name","程序员");
        // 请求转发
        return "forward:/c2/hello9";
        // 重定向
        //return "redirect:/c2/hello9";
    }

 OK,本次就学习到这里,有兴趣的朋友可以看一下我下面的专栏文章。

往期专栏&文章相关导读 

     大家如果对于本期内容有什么不了解的话也可以去看看往期的内容,下面列出了博主往期精心制作的Maven,Mybatis等专栏系列文章,走过路过不要错过哎!如果对您有所帮助的话就点点赞,收藏一下啪。其中Spring专栏有些正在更,所以无法查看,但是当博主全部更完之后就可以看啦。

1. Maven系列专栏文章

Maven系列专栏Maven工程开发
Maven聚合开发【实例详解---5555字】

2. Mybatis系列专栏文章

Mybatis系列专栏MyBatis入门配置
Mybatis入门案例【超详细】
MyBatis配置文件 —— 相关标签详解
Mybatis模糊查询——三种定义参数方法和聚合查询、主键回填
Mybatis动态SQL查询 --(附实战案例--8888个字--88质量分)
Mybatis分页查询——四种传参方式
Mybatis一级缓存和二级缓存(带测试方法)
Mybatis分解式查询
Mybatis关联查询【附实战案例】
MyBatis注解开发---实现增删查改和动态SQL
MyBatis注解开发---实现自定义映射关系和关联查询

3. Spring系列专栏文章

Spring系列专栏Spring IOC 入门简介【自定义容器实例】
IOC使用Spring实现附实例详解
Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式
Spring DI简介及依赖注入方式和依赖注入类型
Spring IOC相关注解运用——上篇
Spring IOC相关注解运用——下篇
Spring AOP简介及相关案例
注解、原生Spring、SchemaBased三种方式实现AOP【附详细案例】
Spring事务简介及相关案例
Spring 事务管理方案和事务管理器及事务控制的API
Spring 事务的相关配置、传播行为、隔离级别及注解配置声明式事务

4. Spring MVC系列专栏文章 

SpringMVC系列专栏Spring MVC简介附入门案例
Spring MVC各种参数获取及获取方式自定义类型转换器和编码过滤器
Spring MVC获取参数和自定义参数类型转换器及编码过滤器
Spring MVC处理响应附案例详解
Spring MVC相关注解运用 —— 上篇

Spring MVC相关注解运用 —— 中篇

Spring MVC相关注解运用 —— 下篇
Spring MVC多种情况下的文件上传
Spring MVC异步上传、跨服务器上传和文件下载
Spring MVC异常处理【单个控制异常处理器、全局异常处理器、自定义异常处理器】
Spring MVC拦截器和跨域请求
SSM整合案例【C站讲解最详细流程的案例】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/702723.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于蒙特卡罗法评估智能电网可靠性研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

python爬虫_django+vue+echarts可视化查询所有CSDN用户质量分

文章目录 ⭐前言⭐ 效果⭐django简介⭐vue3简介⭐vue引入echarts ⭐前后分离实现&#x1f496; django代码层&#x1f496; vue3代码层结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于前后分离djangovueecharts可视化查询CSDN用户质量分。 该系列文章&#…

一种基于linux内核双向链表的移植

1.简介 双向链表&#xff08;Doubly Linked List&#xff09;是一种常见的数据结构&#xff0c;由一系列的节点组成&#xff0c;每个节点都包含两个指针&#xff0c;分别指向前一个节点和后一个节点。与单向链表不同&#xff0c;双向链表可以在 O(1) 的时间复杂度内向前或向后遍…

【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

工具效果&#xff1a; 第一步&#xff0c;把psd图层转换为可编辑的节点树&#xff0c;并自动解析UI类型、自动绑定UI子元素&#xff1a; 第二步, 点击“生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单手动点选UI类型)&#xff1a; 验证一键生成UI效果: 书接上…

idea双击打不开怎么办?

今天在敲代码的时候&#xff0c;突然出现了一个bug&#xff0c;idea打不开了&#xff0c;这个问题怎么解决&#xff1f; 只要找到C:\Users\Administrator .IntelliJIdea2019.3这个文件把所有文件都给删了就可以重启了 哈哈&#xff0c;重启成功

Bayes贝叶斯定理

问题的关键在于&#xff1a;人们是否考虑过大背景/先验/问题的前提&#xff0c;从而做出一个大致的估计。这就引出了我们关于理性的探讨&#xff0c;理性不是说知道事实&#xff0c;而是认识到哪些因素是有关的。 x.1 一个关于贝叶斯定理的例子 引入一个steve假设。我们已知大…

开源进展 | WeIdentity v3.1.1发布,提供无存储依赖的纯功能接口

作为连接实体对象&#xff08;人或物&#xff09;的现实身份与链上身份的可信映射&#xff0c;实现实体对象之间安全可信的数据授权与交换&#xff0c;分布式身份技术解决方案在推动区块链应用繁荣及可信数据流转的过程中扮演着重要角色。 WeIdentity是由微众银行自主研发并完全…

parcel打包工具搭建热开发项目环境

parcel是一款WEB端打包工具 能够提供热开发的项目环境 使用了的话不然Webpack 但相对搭建项目会更快一些 我们现在本地创建一个目录 然后 用编辑器打开我们创建的目录 运行终端 在终端中输入 npm init 初始化一个项目 运行完毕之后 我们就会得到一个package.json文件 然后…

Spring Boot 中的 RedisCacheManager 是什么,原理,如何使用

Spring Boot 中的 RedisCacheManager 是什么&#xff0c;原理&#xff0c;如何使用 介绍 在现代应用程序中&#xff0c;缓存是提高应用程序性能的重要组成部分。Spring Boot 提供了一个强大的缓存框架&#xff0c;它支持多种缓存提供程序&#xff0c;包括 Redis、Ehcache、Ca…

国金QMT量化交易系统的Bug及应对策略

国金QMT量化交易系统中的 账号成交状态变化主推 deal_callback() &#xff0c; 当账号成交状态有变化时&#xff0c;这个函数被客户端调用。 我的策略是&#xff0c;在handlebar()里面挂单&#xff0c;等待成交&#xff0c;而判断成交的方式是根据系统主推deal_callback()通知…

数据结构与算法:查找、排序、动态规划、数学

1 查找表 查找表是同一数据类型构成的集合。只进行查找操作的称为静态查找表&#xff1b;在查找的同时进行插入和删除操作的称为动态查找表。 查找算法衡量好坏的依据为&#xff1a;查找成功时&#xff0c;查找的关键字和查找表中比较过的数据元素的个数的平均值&#xff0c;…

MKS SERVO4257D 闭环步进电机_系列10 arduino 例程

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&a…

HiEV独家|余承东力推L3标准,华为ADS更高阶产品将至

作者 | 张祥威 编辑 | 德新 L3标准出台提速&#xff0c;智驾江湖的厮杀将更加惨烈。 近日&#xff0c;多位接近华为的人士告诉HiEV&#xff0c;余承东正在力推自动驾驶L3标准尽快出台&#xff0c;华为的多位技术专家深度参与了L3标准制定。 本月稍早前&#xff0c;余承东在重庆…

计算机网络-数据链路层下篇

目录 计算机网络 七、MAC地址&#xff0c;IP地址及ARP地址 &#xff08;一&#xff09;MAC地址 &#xff08;二&#xff09;IP地址 &#xff08;三&#xff09;ARP地址 八、集线器和交换机的区别 九、以太网交换机自学习和转发帧的流程 十、以太网交换机的生成树协议ST…

一步一步学OAK之十三:实现RGB相机上的空间对象跟踪

前面我们实现了在RGB相机上进行物体的对象跟踪&#xff0c;能够实时跟踪我们想要追踪的物探&#xff0c;但是&#xff0c;如果我们要想知道这个物体的三维空间坐标&#xff0c;该如何实现呢&#xff1f;要想实现这个功能&#xff0c;我们需要用到DepthAI API提供的MobileNetSpa…

无人机动力测试台-50公斤级-Flight Stand 50

Flight Stand 50测试台通过测量电机和螺旋桨的拉力、扭矩、转速、电流、电压、温度、螺旋桨效率和电机效率来精准地描述和评估无人机动力系统的性能。 产品应用 Flight Stand 50测试台可以用于以下方向&#xff1a; 实时动态测试 FS50 Pro的1000 Hz采样率使测试成为可能&am…

使用 OAT 工具替换 OceanBase 云平台节点

OceanBase 环境基本都会先安装 OCP 来部署、监控、运维数据库集群。但如果有机器过保等问题&#xff0c;就需要有平稳的 OCP 节点的替换方案。 作者&#xff1a;张瑞远 上海某公司 DBA&#xff0c;曾经从事银行、证券数仓设计、开发、优化类工作&#xff0c;现主要从事电信级 I…

android:DataPicker控件使用

一、前言&#xff1a;我真的服了&#xff0c;刚开始再发布运行的时候一直报这个错误“ Attempt to invoke virtual method void android.widget.TextView.setText(java.lang.CharSequence) on a null object reference”说空指针。我也上网查了&#xff0c;网上说在这个错误不是…

mysql行数据转为列数据

最近在开发过程中遇到问题&#xff0c;需要将数据库中一张表信息进行行转列操作&#xff0c;再将每列&#xff08;即每个字段&#xff09;作为与其他表进行联表查询的字段进行显示。 借此机会&#xff0c;在网上查阅了相关方法&#xff0c;现总结出一种比较简单易懂的方法备用…

BI商业智能工具改变企业发展态势

BI商业智能工具在当今企业环境中扮演着越来越重要的角色&#xff0c;成为企业实现高速增长的关键因素之一。这些工具能够帮助企业应对海量数据挑战&#xff0c;提供更高效的数据处理和分析能力&#xff0c;为企业决策提供有力支持。以瓴羊Quick BI为例&#xff0c;它凭借其强大…