SpringMVC注解完全解析(下)

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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";
    }
}

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

testServletApi, org.apache.catalina.connector.RequestFacade@12809813, org.apache.catalina.connector.ResponseFacade@5b9d0d97

处理模型数据

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;
    }
}

这里将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>

如果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";
    }
}

我们通过一个方法参数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>

访问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";
    }
}

首先通过方法参数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>

访问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的充分解耦。

相关文章
|
26天前
|
负载均衡 算法 Java
Spring Cloud全解析:负载均衡算法
本文介绍了负载均衡的两种方式:集中式负载均衡和进程内负载均衡,以及常见的负载均衡算法,包括轮询、随机、源地址哈希、加权轮询、加权随机和最小连接数等方法,帮助读者更好地理解和应用负载均衡技术。
|
10天前
|
Java 对象存储 开发者
解析Spring Cloud与Netflix OSS:微服务架构中的左右手如何协同作战
Spring Cloud与Netflix OSS不仅是现代微服务架构中不可或缺的一部分,它们还通过不断的技术创新和社区贡献推动了整个行业的发展。无论是对于初创企业还是大型组织来说,掌握并合理运用这两套工具,都能极大地提升软件系统的灵活性、可扩展性以及整体性能。随着云计算和容器化技术的进一步普及,Spring Cloud与Netflix OSS将继续引领微服务技术的发展潮流。
24 0
|
3月前
|
设计模式 监控 Java
解析Spring Cloud中的断路器模式原理
解析Spring Cloud中的断路器模式原理
|
3月前
|
安全 Java 数据安全/隐私保护
解析Spring Security中的权限控制策略
解析Spring Security中的权限控制策略
|
24天前
|
XML 监控 Java
Spring Cloud全解析:熔断之Hystrix简介
Hystrix 是由 Netflix 开源的延迟和容错库,用于提高分布式系统的弹性。它通过断路器模式、资源隔离、服务降级及限流等机制防止服务雪崩。Hystrix 基于命令模式,通过 `HystrixCommand` 封装对外部依赖的调用逻辑。断路器能在依赖服务故障时快速返回备选响应,避免长时间等待。此外,Hystrix 还提供了监控功能,能够实时监控运行指标和配置变化。依赖管理方面,可通过 `@EnableHystrix` 启用 Hystrix 支持,并配置全局或局部的降级策略。结合 Feign 可实现客户端的服务降级。
101 23
|
7天前
|
存储 缓存 Java
在Spring Boot中使用缓存的技术解析
通过利用Spring Boot中的缓存支持,开发者可以轻松地实现高效和可扩展的缓存策略,进而提升应用的性能和用户体验。Spring Boot的声明式缓存抽象和对多种缓存技术的支持,使得集成和使用缓存变得前所未有的简单。无论是在开发新应用还是优化现有应用,合理地使用缓存都是提高性能的有效手段。
14 1
|
2月前
|
缓存 Java 开发者
Spring高手之路22——AOP切面类的封装与解析
本篇文章深入解析了Spring AOP的工作机制,包括Advisor和TargetSource的构建与作用。通过详尽的源码分析和实际案例,帮助开发者全面理解AOP的核心技术,提升在实际项目中的应用能力。
23 0
Spring高手之路22——AOP切面类的封装与解析
|
2月前
|
Java 微服务 Spring
Spring Cloud全解析:配置中心之解决configserver单点问题
但是如果该configserver挂掉了,那就无法获取最新的配置了,微服务就出现了configserver的单点问题,那么如何避免configserver单点呢?
|
2月前
|
XML Java 数据格式
Spring Cloud全解析:注册中心之zookeeper注册中心
使用ZooKeeper作为Spring Cloud的注册中心无需单独部署服务器,直接利用ZooKeeper服务端功能。项目通过`spring-cloud-starter-zookeeper-discovery`依赖实现服务注册与发现。配置文件指定连接地址,如`localhost:2181`。启动应用后,服务自动注册到ZooKeeper的`/services`路径下,形成临时节点,包含服务实例信息。
170 3
|
3月前
|
负载均衡 Java Spring
@EnableFeignClients注解源码解析
@EnableFeignClients注解源码解析
68 14

热门文章

最新文章

推荐镜像

更多
下一篇
无影云桌面