SpringMVC --- 获取请求参数、域对象共享数据、视图

news/2025/1/18 4:37:43/

一、SpringMVC获取请求参数

1.1、通过ServletAPI获取

将 HttpServletRequest 作为控制器方法的形参,此时 HttpServletRequest 类型的参数表示封装了当前请求的请求报文的对象

    @RequestMapping("/param/servletAPI")public String getParamByServletAPI(HttpServletRequest request) {String username = request.getParameter("username");String password = request.getParameter("password");System.out.println("username:"+username+" password:"+password);return "success";}
    <form th:action="@{/param/servletAPI}" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="登录"><br>

 

2.2、通过控制器方法的形参获取请求参数

在控制器方法的形参位置,设置和请求参数同名的形参,当浏览器发送请求,匹配到请求映射时,在 DispatcherServlet中就会将请求参数赋值给相应的形参

    @RequestMapping("/param")public String getParam(String username, String password) {System.out.println("username:"+username+" password:"+password);return "success";}
    <form th:action="@{/param}" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="登录"><br>

注:

若请求所传输的请求参数中有多个同名的请求参数,此时可以在控制器方法的形参中设置字符串 数组或者字符串类型的形参接收此请求参数

若使用字符串数组类型的形参,此参数的数组中包含了每一个数据

若使用字符串类型的形参,此参数的值为每个数据中间使用逗号拼接的结果

 

2.3、@RequestParam

@RequestParam是将请求参数和控制器方法的形参创建映射关系

@RequestParam注解一共有三个属性:

  • value:指定为形参赋值的请求参数的参数名
  • required:设置是否必须传输此请求参数,默认值为true,若设置为true时,则当前请求必须传输value所指定的请求参数,若没有传输该请求参数,且没有设置 defaultValue属性,则页面报错400:Required String parameter 'xxx' is not present;若设置为 false,则当前请求不是必须传输value所指定的请求参数,若没有传输,则注解所标识的形参的值为 null
  • defaultValue:不管required属性值为true或false,当value所指定的请求参数没有传输或传输的值 为" "时,则使用默认值为形参赋值
    @RequestMapping("/param")public String getParam(@RequestParam("userName") String username, String password) {System.out.println("username:"+username+" password:"+password);return "success";}
    <form th:action="@{/param}" method="post">用户名:<input type="text" name="userName"><br>密码:<input type="password" name="password"><br><input type="submit" value="登录"><br>

 

2.4、@RequestHeader

@RequestHeader是将请求头信息和控制器方法的形参创建映射关系

@RequestHeader注解一共有三个属性:value、required、defaultValue,用法同@RequestParam

 

2.5、@CookieValue

@CookieValue是将cookie数据和控制器方法的形参创建映射关系

@CookieValue注解一共有三个属性:value、required、defaultValue,用法同@RequestParam

 

2.6、通过POJO获取请求参数

可以在控制器方法的形参位置设置一个实体类类型的形参,此时若浏览器传输的请求参数的参数名和实体类中的属性名一致,那么请求参数就会为此属性赋值

    @RequestMapping("/param/pojo")public String getParamByPojo(User user) {System.out.println(user);return "success";}
<form th:action="@{/param/pojo}" method="post">用户名:<input type="text" name="username"><br>密码:<input type="password" name="password"><br><input type="submit" value="登录"><br>
</form>

 

2.7、解决获取请求参数的乱码问题

解决获取请求参数的乱码问题,可以使用SpringMVC提供的编码过滤器CharacterEncodingFilter,但是必须在web.xml中进行注册

    <!--配置springMVC的编码过滤器--><filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

注:SpringMVC中处理编码的过滤器一定要配置到其他过滤器之前,否则无效

    

 

二、域对象共享数据

2.1、使用ServletAPI向request域对象共享数据

@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request){request.setAttribute("testScope", "hello,servletAPI");return "success";
}

 

2.2、使用ModelAndView向request域对象共享数据

    @RequestMapping("/test/mav")public ModelAndView testModelAndView() {/*** ModelAndView有Model和View的功能* Model主要用于向请求域共享数据* View主要用于设置视图,实现页面跳转*/ModelAndView mav = new ModelAndView();//向请求域共享数据mav.addObject("testRequestScope", "hello,ModelAndView");//设置视图,实现页面跳转mav.setViewName("success");return mav;}
<a th:href="@{/test/mav}"> 测试通过ModelAndView问请求域共享数据 </a>

获取数据

<p th:text="${testRequestScope}"></p>

 

2.3、使用Model向request域对象共享数据

    @RequestMapping("/test/model")public String testModel(Model model) {model.addAttribute("testRequestScope","hello");return "success";}

 

2.4、使用map向request域对象共享数据

    @RequestMapping("/test/map")public String testMap(Map<String , Object> map) {map.put("testRequestScope","hello,Map");return "success";}

 

2.5、使用ModelMap向request域对象共享数据

    @RequestMapping("/test/modelMap")public String testModelMap(ModelMap modelMap) {modelMap.addAttribute("testRequestScope","hello,ModelMap");return "success";}

 

2.6、Model、ModelMap、Map的关系

Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型的

public interface Model{}
public class ModelMap extends LinkedHashMap<String, Object> {}
public class ExtendedModelMap extends ModelMap implements Model {}
public class BindingAwareModelMap extends ExtendedModelMap {}

 

2.7、向session域共享数据

    @RequestMapping("/test/session")public String testSession(HttpSession session){session.setAttribute("testSessionScope", "hello,session");return "success";}

获取数据

<p th:text="${session.testSessionScope}"></p><br>

 

2.8、向application域共享数据

    @RequestMapping("/test/application")public String testApplication(HttpSession session){ServletContext application = session.getServletContext();application.setAttribute("testApplicationScope", "hello,application");return "success";}

获取数据

<p th:text="${application.testApplicationScope}"></p><br>

 

 

三、SpringMVC的视图

SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户

SpringMVC视图的种类很多,默认有转发视图和重定向视图

当工程引入jstl的依赖,转发视图会自动转换为JstlView

若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视 图解析器解析之后所得到的是ThymeleafView

 

3.1、ThymeleafView

当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置 的视图解析器解析,视图名称拼接视图前缀和视图

后缀所得到的最终路径,会通过转发的方式实现跳转

    @RequestMapping("/test/view/thymeleaf")public String testThymeleafView() {return "hello";}

 

3.2、转发视图

SpringMVC中默认的转发视图是InternalResourceView

SpringMVC中创建转发视图的情况:

当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InternalResourceView视图,此时的视 图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部 分作为最终路径通过转发的方式实现跳转

例如"forward:/","forward:/employee"

    @RequestMapping("/test/view/forward")public String testInternalResourceView() {return "forward:/testHello";}

 

3.3、重定向视图

SpringMVC中默认的重定向视图是RedirectView

当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView视图,此时的视图名称不 会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"去掉,剩余部分作为最 终路径通过重定向的方式实现跳转

例如"redirect:/","redirect:/employee"

    @RequestMapping("/test/redirect")public String testRedirectVies(){return "redirect:/testHello";}

注:重定向视图在解析时,会先将redirect:前缀去掉,然后会判断剩余部分是否以/开头,若是则会自 动拼接上下文路径

 

3.4、视图控制器view-controller

当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用view:controller标签进行表示

    <!--path:设置处理的请求地址view-name:设置请求地址所对应的视图名称--><mvc:view-controller path="/" view-name="index"></mvc:view-controller>

注:当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效,此时需 要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签:<mvc:annotation-driven />


http://www.ppmy.cn/news/37793.html

相关文章

ChatGPT AI国内免魔法使用

什么是ChatGPT? ChatGPT是一种基于深度学习技术的自然语言处理模型。它由OpenAI开发&#xff0c;采用了transformer架构&#xff0c;可以处理各种自然语言任务&#xff0c;如问答、文本生成、对话等。 ChatGPT的优点 ChatGPT的优点在于它具有强大的文本生成能力&#xff0c…

python入门(一)conda的使用,创建修改删除虚拟环境,以及常用命令,配置镜像

文章目录背景1.conda的下载地址:2.安装3.执行常用命令1&#xff09;查看版本2&#xff09;查看所有虚拟环境3&#xff09;创建虚拟环境4&#xff09;激活虚拟环境5&#xff09;关闭虚拟环境6&#xff09;删除虚拟环境7&#xff09;创建python2.7的虚拟环境8&#xff09;使用pyt…

学习通信原理之——频谱/功率谱/功率谱密度(MATLAB演示)

前言 最近在复习通信原理&#xff0c;每次到了功率谱这一块就感到困惑&#xff0c;每次都要去查&#xff0c;我觉得不能再这样循环下去了&#xff0c;这次一定要对这三个概念理解透彻&#xff0c;于是去网上找了资料去学习。 学习了b站视频&#xff1a;NO.31 十分钟搞定频谱/功…

java校园行为分析预警管理系统

目 录 摘 要 II ABSTRACT III 第一章 绪论 1 1.1研究背景 1 1.2选题目的 1 1.3本文研究内容 2 第二章 开发技术介绍 3 2.1开发工具介绍 3 2.2 JAVA技术介绍 3 2.3 MYSQL数据库介绍 4 第三章 系统需求分析 6 3.1可行性分析 6 3.1.1技术…

Python 自动化指南(繁琐工作自动化)第二版:二、流程控制

原文&#xff1a;https://automatetheboringstuff.com/2e/chapter2/ 所以&#xff0c;你知道单个指令的基本原理&#xff0c;程序就是一系列指令。但是编程的真正优势不仅仅是像周末跑腿一样一个接一个地运行指令。根据表达式的求值方式&#xff0c;程序可以决定跳过指令&#…

第18章_主从复制

第18章_主从复制 &#x1f3e0;个人主页&#xff1a;shark-Gao &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是shark-Gao&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f389;目前状况&#xff1a;23届毕业生&#xff0c;目前在某…

代理模式:JDK动态代理和静态代理回顾

背景&#xff1a;Spring主要有两大思想&#xff1a;IoC、AOP。对于IoC依赖注入不多说了&#xff0c;对于Spring的核心AOP来说&#xff0c;我们需要了解其底层的实现原理&#xff1a;java的动态代理机制。 本篇随笔就是对java的动态机制进行一个回顾。 代理模式的理解 类型&…

AtCoder 294F 二分套二分

题意&#xff1a; 两个人分别有nnn&#xff0c;mmm杯糖水&#xff0c;第一个人的第iii杯有a[i]a[i]a[i]克糖&#xff0c;b[i]b[i]b[i]克水&#xff0c;第二个人的第iii杯有c[i]c[i]c[i]克糖&#xff0c;d[i]d[i]d[i]克水。现在从两个人手中各取一杯糖水混合&#xff0c;有nmnm…