Spring 全家桶之 Spring Web MVC(二)- Restful(下)

简介: Spring 全家桶之 Spring Web MVC(二)- Restful

@CookieValue注解获取Cookie信息

该注解用来获取Cookie中指定Key的值,在ParamController中增加getCookies方法

@RequestMapping("/cookies")
public String getCookies(@CookieValue(value = "JSESSIONID",required = false, defaultValue = "默认值") String jsessionId){
    System.out.println("Cookies中的Key为JSESSIONID的值为:" + jsessionId);
    return "success";
}
复制代码

浏览器中输入http://localhost:8080/cookies, 控制台打印出Cookie中的key的Value

8ed007e4164345429e2144c60719ef0d_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

Servlet API

Spring MVC 同样支持Servlet API,往request和session中保存数据,

@RequestMapping("/servlet")
public String servletApi(HttpServletRequest request, HttpServletResponse response, HttpSession session){
    request.setAttribute("reqAttr","request中保存的数据");
    session.setAttribute("sessAttr","session中保存到数据");
    return "success";
}
复制代码

取出session和request中保存的值,在success.jsp的body标签中中增加代码

<h3>请求中保存的数据</h3>
<p>${requestScope.reqAttr}</p>
<h3>session中保存的数据</h3>
<p>${sessionScope.sessAttr}</p>
复制代码

重启Tomcat,浏览器访问http://localhost:8080/servlet

5bba4fbf235b468798a6f0f3c8009c30_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

Spring MVC 可以接收的 Servlet API参数,出了HttpServletRequest、HttpServletResponse、HttpSession外还有

  • java.security.Principal
  • Locale
  • InputStream
  • OutputStream
  • Reader
  • Writer

对象入参

增加一辆Tesla为例,前端增加输入Tesla信息的form表单,在index.jsp中改造增加Tesla表单的内容,增加Tesla信息输入框

<h3>增加Tesla车型</h3>
<form action="/tesla" method="post">
  车型: <input type="text" name="name"> <br>
  价格: <input type="text" name="price"> <br>
  <hr>
  <button type="submit">增加Semi Truck</button>
</form>
复制代码

新增entity包,新增一个Tesla对象,属性与表单中的填写的信息一致

public class Tesla {
    private String name;
    private Double price;
    //此处省略getter/setter/toString信息
}    
复制代码

修改TeslaController中的add方法

@RequestMapping(value = "/tesla", method = RequestMethod.POST)
public String add(Tesla tesla){
    System.out.println("增加Tesla车型为:" + tesla);
    return "success";
}
复制代码

重启tomcat,在表单中输入信息,并提交,控制台打印出提交的信息

468c2ed83c2147cab060cfb39084ab5b_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

说明请求中的属性会自动封装到POJO对象

给Tesla实体类增加一个owner属性,表示车主,并增加Owner实体类

public class Owner {
    private String username;
    private Integer age;
    //省略getter/setter/toString方法
}    
复制代码

表单增加owner信息输入框

<h3>增加Tesla车型</h3>
<form action="/tesla" method="post">
  车型: <input type="text" name="name"> <br>
  价格: <input type="text" name="price"> <br>
  车主姓名: <input type="text" name="owner.username"> <br>
  车主年龄: <input type="text" name="owner.age">
  <hr>
  <button type="submit">增加Semi Truck</button>
</form>
复制代码

重启Tomat,控制台输出Tesla级联属性Owner的信息

503f18774d77415a8b7b1ea0445436cc_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

表单中输入中文,会出现乱码

ab5a1eaa76ab47349f3eefe46eceea48_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

中文乱码问题解决方法归类

请求乱码

  • GET请求乱码,修改Tomcat中的server.xml配置文件,在8080端口出增加URIEncoding="UTF-8"
  • POST请求乱码,在获取请求参数前增加request.setCharacterEncoding("UTF-8") 响应乱码
  • 代码最后增加response.setContenttype("text/html;charset=utf-8")

也可以在web.xml中配置过滤器解决乱码问题,解决乱码问题的filter一定要放在所有filter前,字符编码filter放在其他所有filter前面配置

<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>
复制代码

重启Tomcat,再次提交请求

86257f7fafc9483983cb541ce47c2fdb_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

三、Spring MVC 数据输出

如何将数据带到页面上?

Spring MVC出了可以通过request和session将数据带到页面上,还可以在方法处传入Map、Model、ModelMap,在这些参数中保存数据都会被放在请求域中,可以在页面获取

Map

新增一个OutputDataController,增加方法outputByMap方法

@Controller
public class OutputDataController {
    @RequestMapping("/map")
    public String outputByMap(Map<String, Object> map){
        map.put("mapKey","map中保存的数据");
        return "success";
    }
}
复制代码

页面获取数据

<h3>Map中保存的数据</h3>
<p>从Request域中获取:${requestScope.msg}</p>
<p>从Session域中获取:${sessionScope.msg}</p>
<p>从PageContext域中获取:${pageScope.msg}</p>
<p>从Application域中获取:${applicationScope.msg}</p>
复制代码

重启Tomcat,浏览器输入http://localhost:8080/map

657eaa82c8c24569924434195f12b68a_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

只有从请求域中可以获取到数据

Model

新增方法outputByModel

@RequestMapping("/model")
public String outputByModel(Model model){
    model.addAttribute("msg", "I am IRONMAN");
    return "success";
}
复制代码

重启tomcat,浏览器访问

c8693ce9ebf3400d8746230d7016f855_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

ModelMap

ModelMap是Model接口的实现类,也可以用作数据输出

@RequestMapping("/model_map")
public String outputByModelMap(ModelMap modelMap){
    modelMap.addAttribute("msg", "I am IRONMAN");
    return "success";
}
复制代码

重启tomcat,浏览器访问

0ec978aafbc940529864d7232b8a960c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

在三个方法中打印map、model、modelMap的class,重启后在浏览器请求三个方法上标注的URL地址

5bf1913d41eb4477b75f331ae1ae35f4_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

Map、Model、ModelMap最终都是BindingAwareModelMap在实际发挥作用

Spring MVC还可以使用其他方式输出数据

  • ModelAndView:处理方法值返回类型为ModelAndView,方法可以通过该对象添加数据及返回的页面
  • @SessionAttributes:将数据存储到Session中,多个请求之间可以共享数据,不推荐使用
  • @ModelAttribute:方法如惨标注后,入参的对象就可以方法数据模型中,不常用

ModelAndView

页面和数据的合体对象,创建ModelAndView对象时传入的参数就是一个页面,也就是要返回的页面

@RequestMapping("model_and_view")
public ModelAndView outputByModelAndView(){
    ModelAndView modelAndView = new ModelAndView("success");
    modelAndView.addObject("msg","I am IRONMAN");
    return modelAndView;
}
复制代码

重启tomcat,浏览器输入http://localhost:8080/model_and_view

79e1e19b6338435a99d4864c3eaa3f6e_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

@SessionAttributes

新建一个类,增加@SessionAttributes注解,@SessionAttributes注解只能放在类上

@SessionAttributes(value = "msg")
@Controller
public class SessionController {
    @RequestMapping("/session_attributes")
    public ModelAndView outputBySession(){
        ModelAndView modelAndView = new ModelAndView("success");
        modelAndView.addObject("msg","I am God of Thunder");
        return modelAndView;
    }
    @RequestMapping("/user")
    public ModelAndView getUser(){
        ModelAndView modelAndView = new ModelAndView("success");
        return modelAndView;
    }
}
复制代码

先访问http://localhost:8080/session_attributes

90af437babe54a22a3133b16f9e659e9_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

在访问http://localhost:8080/user

a1b6bf5bf986439aad8380796a9402da_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

都可以获取到session中保存的数据

@SessionAttributes有两个属性 value:只要保存的Key是value指定的,就将它保存在Session中 types:只要保存的是指定类型的资源,就将它保存在Session中

测试types属性

@SessionAttributes(types = Tesla.class)
@Controller
public class SessionController {
    @RequestMapping("/session_attributes")
    public ModelAndView outputBySession(){
        ModelAndView modelAndView = new ModelAndView("success");
        modelAndView.addObject("msg","I am God of Thunder");
        return modelAndView;
    }
    @RequestMapping("/user")
    public ModelAndView getUser(){
        ModelAndView modelAndView = new ModelAndView("success");
        return modelAndView;
    }
    @RequestMapping("/session/tesla")
    public ModelAndView getTesla(){
        ModelAndView modelAndView = new ModelAndView("success");
        Tesla tesla = new Tesla();
        tesla.setName("Model 3");
        modelAndView.addObject("msg", tesla);
        return modelAndView;
    }
}
复制代码

重启Tomcat,分被在浏览器中输入三个地址

e75b99eddb6c450eab4a4f7d58df636c_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

3efe06d6b65b42ddb24b9a4f7048f958_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

3efe06d6b65b42ddb24b9a4f7048f958_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

可以看出在Session中存储的是types指定的Tesla数据类型

@SessionAttribute不推荐使用,推荐使用原生API



相关文章
|
4月前
|
缓存 安全 Java
《深入理解Spring》过滤器(Filter)——Web请求的第一道防线
Servlet过滤器是Java Web核心组件,可在请求进入容器时进行预处理与响应后处理,适用于日志、认证、安全、跨域等全局性功能,具有比Spring拦截器更早的执行时机和更广的覆盖范围。
|
4月前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
11月前
|
前端开发 Java 测试技术
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
本文介绍了 `@RequestParam` 注解的使用方法及其与 `@PathVariable` 的区别。`@RequestParam` 用于从请求中获取参数值(如 GET 请求的 URL 参数或 POST 请求的表单数据),而 `@PathVariable` 用于从 URL 模板中提取参数。文章通过示例代码详细说明了 `@RequestParam` 的常用属性,如 `required` 和 `defaultValue`,并展示了如何用实体类封装大量表单参数以简化处理流程。最后,结合 Postman 测试工具验证了接口的功能。
646 0
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestParam
|
11月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestBody
`@RequestBody` 是 Spring 框架中的注解,用于将 HTTP 请求体中的 JSON 数据自动映射为 Java 对象。例如,前端通过 POST 请求发送包含 `username` 和 `password` 的 JSON 数据,后端可通过带有 `@RequestBody` 注解的方法参数接收并处理。此注解适用于传递复杂对象的场景,简化了数据解析过程。与表单提交不同,它主要用于接收 JSON 格式的实体数据。
1165 0
|
11月前
|
前端开发 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@PathVariable
`@PathVariable` 是 Spring Boot 中用于从 URL 中提取参数的注解,支持 RESTful 风格接口开发。例如,通过 `@GetMapping(&quot;/user/{id}&quot;)` 可以将 URL 中的 `{id}` 参数自动映射到方法参数中。若参数名不一致,可通过 `@PathVariable(&quot;自定义名&quot;)` 指定绑定关系。此外,还支持多参数占位符,如 `/user/{id}/{name}`,分别映射到方法中的多个参数。运行项目后,访问指定 URL 即可验证参数是否正确接收。
719 0
|
11月前
|
JSON 前端开发 Java
微服务——SpringBoot使用归纳——Spring Boot中的MVC支持——@RequestMapping
@RequestMapping 是 Spring MVC 中用于请求地址映射的注解,可作用于类或方法上。类级别定义控制器父路径,方法级别进一步指定处理逻辑。常用属性包括 value(请求地址)、method(请求类型,如 GET/POST 等,默认 GET)和 produces(返回内容类型)。例如:`@RequestMapping(value = &quot;/test&quot;, produces = &quot;application/json; charset=UTF-8&quot;)`。此外,针对不同请求方式还有简化注解,如 @GetMapping、@PostMapping 等。
618 0
|
9月前
|
存储 算法 安全
JWT深度解析:现代Web身份验证的通行证为什么现在都是JWT为什么要restful-优雅草卓伊凡
JWT深度解析:现代Web身份验证的通行证为什么现在都是JWT为什么要restful-优雅草卓伊凡
520 41
JWT深度解析:现代Web身份验证的通行证为什么现在都是JWT为什么要restful-优雅草卓伊凡
|
7月前
|
前端开发 Java API
Spring Cloud Gateway Server Web MVC报错“Unsupported transfer encoding: chunked”解决
本文解析了Spring Cloud Gateway中出现“Unsupported transfer encoding: chunked”错误的原因,指出该问题源于Feign依赖的HTTP客户端与服务端的`chunked`传输编码不兼容,并提供了具体的解决方案。通过规范Feign客户端接口的返回类型,可有效避免该异常,提升系统兼容性与稳定性。
534 0
|
7月前
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
225 0
|
7月前
|
JSON 前端开发 Java
第05课:Spring Boot中的MVC支持
第05课:Spring Boot中的MVC支持
329 0