SpringMVC注解完全解析(下)

简介: SpringMVC注解完全解析(下)

接着上篇注解解析,我们继续完成对SpringMVC注解的学习。

使用Servlet原生API

尽管SpringMVC的注解注入十分强大,但在实际的开发过程中难免会用到Servlet的原生API。而实际上,SpringMVC可以在目标方法的参数中传入很多类型的Servlet原生API:

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • java.security.Principal
  • Locale
  • InputStream
  • OutputStream
  • Reader
  • Writer

看一个例子:

@RequestMapping("/springmvc")
@Controller
public class HelloWorld {
   
   

    /**
     * 可以使用Servlet原生API作为目标方法的参数
     * @param request
     * @param response
     * @return
     * @throws IOException 
     */
    @RequestMapping("/testServletApi")
    public String testServletApi(HttpServletRequest request,HttpServletResponse response) throws IOException {
   
   
        System.out.println("testServletApi, "+ request + ", " + response);
        return "success";
    }
}
AI 代码解读

访问http://localhost:8080/SpringMVC/springmvc/testServletApi测试,结果为:

testServletApi, org.apache.catalina.connector.RequestFacade@12809813, org.apache.catalina.connector.ResponseFacade@5b9d0d97
AI 代码解读

处理模型数据

SpringMVC提供了以下几种方式输出模型数据:

  1. ModelAndView:处理方法返回值为ModelAndView时,方法体即可通过该对象添加模型数据
  2. Map及Model:方法参数为org.springframework.ui.Model、org.springframework.ui.ModelMap或java.util.Map,处理方法返回时,Map中的数据会自动添加到模型中
  3. @SessionAttributes:将模型中的某个属性暂存到HttpSession中,以便多个请求之间可以共享这个属性
  4. @ModelAttributes:方法参数标注该注解后,参数的对象就会放到数据模型中
1.ModelAndView

看一个例子:

@RequestMapping("/springmvc")
@Controller
public class HelloWorld {
   
   

    /**
     * 目标方法的返回值可以是ModelAndView类型
     * 其中可以包含视图和模型信息
     * @return
     */
    @RequestMapping("/testModelAndView")
    public ModelAndView testModelAndView() {
   
   
        String viewName = "success";
        ModelAndView modelAndView = new ModelAndView(viewName);
        //添加模型数据到ModelAndView中
        modelAndView.addObject("time",new Date());
        return modelAndView;
    }
}
AI 代码解读

这里将success和键值对放入ModelAndView中,然后返回该对象。
我们修改success.jsp的代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"  isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h4>Success Page</h4>

    time:${
   
   requestScope.time }
</body>
</html>
AI 代码解读

如果success.jsp页面能够获取到时间信息,说明ModelAndView能够将键值对信息存入请求域中。
访问http://localhost:8080/SpringMVC/springmvc/testModelAndView测试,结果为:
在这里插入图片描述

2.Map及Model

SpringMVC在内部使用了一个org.springframework.ui.Model接口存储模型数据。
看一个例子:

@RequestMapping("/springmvc")
@Controller
public class HelloWorld {
   
   


    @RequestMapping("/testMap")
    public String testMap(Map<String, Object> map) {
   
   
        map.put("names",Arrays.asList("zhangsan","lisi","wangwu"));
        return "success";
    }
}
AI 代码解读

我们通过一个方法参数Map也可以实现请求域对象的数据存取。
修改success.jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h4>Success Page</h4>
    names:${
   
   requestScope.names }
</body>
</html>
AI 代码解读

访问http://localhost:8080/SpringMVC/springmvc/testMap测试,结果为:
在这里插入图片描述
而事实上,方法参数不仅仅可以使用Map,还可以使用Model或者ModelMap类型,因为SpringMVC在最后传入的其实是一个ExtendedModelMap类型的对象,但通常情况下传入Map即可。

3.@SessionAttributes

若希望在多个请求之间共用某个模型属性数据,则可以在控制器类上标注一个@SessionAttributes,SpringMVC则会将在模型中对应的属性暂存到HttpSession中。
@SessionAttributes除了可以通过属性名指定需要放到会话中的属性外,还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中。
看一个例子:

@SessionAttributes({
   
   "name","age"})
@RequestMapping("/springmvc")
@Controller
public class HelloWorld {
   
   

    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Map<String, Object> map) {
   
   
        map.put("name", "zhangsan");
        map.put("age",20);
        return "success";
    }
}
AI 代码解读

首先通过方法参数Map进行数据存储,在上一点已经说了,通过Map参数会将数据保存到请求域对象中,如果要将数据保存到session对象中,就需要在类上添加注解@SessionAttributes,注解中填入键值。
修改success.jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <h4>Success Page</h4>
    <br> session-name:{
   
   mathJaxContainer[0]}{
   
   sessionScope.age }
</body>
</html>
AI 代码解读

访问http://localhost:8080/SpringMVC/springmvc/testSessionAttributes测试,结果为:
在这里插入图片描述
@SessionAttributes同时还支持传入参数类型保存数据,SpringMVC会自动根据参数类型进行相应的保存操作。
例如@SessionAttributes(types = {String.class,Integer.class})这样的一段
注解同样能够将刚才的参数保存至session。需要注意的是,该注解只能放在类的上面。

视图解析器

当请求处理方法执行完成后,最终返回一个ModelAndView对象,对于那些返回String、View或ModelMap等类型的处理方法,SpingMVC也会在内部将它们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图。
SpringMVC借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是JSP,也可以是Excel、JFreeChart等各种表现形式的视图。
对于最终究竟采用何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现MVC的充分解耦。

目录
打赏
0
0
0
0
3
分享
相关文章
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
371 1
智慧工地云平台的技术架构解析:微服务+Spring Cloud如何支撑海量数据?
慧工地解决方案依托AI、物联网和BIM技术,实现对施工现场的全方位、立体化管理。通过规范施工、减少安全隐患、节省人力、降低运营成本,提升工地管理的安全性、效率和精益度。该方案适用于大型建筑、基础设施、房地产开发等场景,具备微服务架构、大数据与AI分析、物联网设备联网、多端协同等创新点,推动建筑行业向数字化、智能化转型。未来将融合5G、区块链等技术,助力智慧城市建设。
231 0
|
6月前
|
Spring底层架构核心概念解析
理解 Spring 框架的核心概念对于开发和维护 Spring 应用程序至关重要。IOC 和 AOP 是其两个关键特性,通过依赖注入和面向切面编程实现了高效的模块化和松耦合设计。Spring 容器管理着 Beans 的生命周期和配置,而核心模块为各种应用场景提供了丰富的功能支持。通过全面掌握这些核心概念,开发者可以更加高效地利用 Spring 框架开发企业级应用。
182 18
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
666 2
探索Spring MVC:@Controller注解的全面解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序的基石之一。它不仅简化了控制器的定义,还提供了一种优雅的方式来处理HTTP请求。本文将全面解析`@Controller`注解,包括其定义、用法、以及在Spring MVC中的作用。
198 2
Spring MVC中的控制器:@Controller注解全解析
在Spring MVC框架中,`@Controller`注解是构建Web应用程序控制层的核心。它不仅简化了控制器的定义,还提供了灵活的请求映射和处理机制。本文将深入探讨`@Controller`注解的用法、特点以及在实际开发中的应用。
515 0
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问