SpringMVC——第四章:三个域对象

一、Servlet中的三个域对象

请求域:request

会话域:session

应用域:application

三个域都有以下三个方法:

// 向域中存储数据
void setAttribute(String name, Object obj);

// 从域中读取数据
Object getAttribute(String name);

// 删除域中的数据
void removeAttribute(String name);

主要是通过:setAttribute + getAttribute方法来完成在域中数据的传递和共享。

1.request

接口名:HttpServletRequest

简称:request

request对象代表了一次请求。一次请求一个request。

使用请求域的业务场景:在A资源中通过转发的方式跳转到B资源,因为是转发,因此从A到B是一次请求,如果想让A资源和B资源共享同一个数据,可以将数据存储到request域中。

2.session

接口名:HttpSession

简称:session session对象代表了一次会话。从打开浏览器开始访问,到最终浏览器关闭,这是一次完整的会话。每个会话session对象都对应一个JSESSIONID,而JSESSIONID生成后以cookie的方式存储在浏览器客户端。浏览器关闭,JSESSIONID失效,会话结束。

使用会话域的业务场景:

  1. 在A资源中通过重定向的方式跳转到B资源,因为是重定向,因此从A到B是两次请求,如果想让A资源和B资源共享同一个数据,可以将数据存储到session域中。

  2. 登录成功后保存用户的登录状态。

3.application

接口名:ServletContext

简称:application

application对象代表了整个web应用,服务器启动时创建,服务器关闭时销毁。对于一个web应用来说,application对象只有一个。 使用应用域的业务场景:记录网站的在线人数。

二、request域对象

在SpringMVC中,在request域中共享数据有以下几种方式:

  1. 使用原生Servlet API方式。

  2. 使用Model接口。

  3. 使用Map接口。

  4. 使用ModelMap类。

  5. 使用ModelAndView类。

1.使用原生Servlet API方式

在Controller的方法上使用HttpServletRequest:

页面:

超链接:

测试结果:


这种方式当然可以,用SpringMVC框架,不建议使用原生Servlet API。

2.使用Model接口

测试:


3.使用Map接口


4.使用ModelMap类

测试:


5.Model、Map、ModelMap的关系


下面这些是前面代码运行出来的集合,用的笔记的图片


可以在以上Model、Map、ModelMap的测试程序中将其输出,看看输出什么:

看不出来什么区别,从输出结果上可以看到都是一样的。 可以将其运行时类名输出:

通过输出结果可以看出,无论是Model、Map还是ModelMap,底层实例化的对象都是:BindingAwareModelMap。


可以查看BindingAwareModelMap的继承结构:

通过继承结构可以看出:BindingAwareModelMap继承了ModelMap,而ModelMap又实现了Map接口。
另外,请看以下源码:

可以看出ModelMap又实现了Model接口。因此表面上是采用了不同方式,底层本质上是相同的。 SpringMVC之所以提供了这些方式,目的就是方便程序员的使用,提供了多样化的方式,可见它的重要性。

6.使用ModelAndView类

在SpringMVC框架中为了更好的体现MVC架构模式,提供了一个类:ModelAndView。这个类的实例封装了Model和View。也就是说这个类既封装业务处理之后的数据,也体现了跳转到哪个视图。使用它也可以完成request域数据共享。

这种方式需要注意的是:

1. 方法的返回值类型不是String,而是ModelAndView对象。
2. ModelAndView不是出现在方法的参数位置,而是在方法体中new的。
3. 需要调用addObject向域中存储数据。
4. 需要调用setViewName设置视图的名字。


7.ModelAndView源码分析

以上我们通过了五种方式完成了request域数据共享,包括:原生Servlet API,Model、Map、ModelMap、ModelAndView 其中后四种:Model、Map、ModelMap、ModelAndView。

这四种方式在底层DispatcherServlet调用我们的Controller之后,返回的对象都是ModelAndView,这个可以通过源码进行分析。

在以上四种方式中,拿Model举例,添加断点进行调试:

启动服务器,发送请求,走到断点:

查看VM Stack信息:

查看DispatcherServlet的1089行,源码如下:

可以看到这里,无论你使用哪种方式,最终都要返回一个ModelAndView对象。

提醒:大家可以通过以下断点调试方式,采用一级一级返回,最终可以看到都会返回ModelAndView对象。

三、session域对象

在SpringMVC中使用session域共享数据,实现方式有多种,其中比较常见的两种方式:

  1. 使用原生Servlet API

  2. 使用SessionAttributes注解

1.使用原生Servlet API

视图页面:

超链接:

2.使用SessionAttributes注解

使用SessionAttributes注解标注Controller:

注意:SessionAttributes注解使用在Controller类上。标注了当key是 x 或者 y 时,数据将被存储到会话session中。如果没有 SessionAttributes注解,默认存储到request域中。

四、application域对象

在SpringMVC实现application域数据共享,最常见的方案就是直接使用Servlet API了:

测试:


### SpringMVC入门教程第一关 #### 什么是SpringMVCSpringMVC是一个基于Java的轻量级Web开发框架,属于Spring生态系统的一部分。它的设计目标是帮助开发者构建具有高可扩展性和易维护性的MVC架构的应用程序[^2]。 #### MVC模式的核心概念 MVC(Model-View-Controller)是一种软件设计模式,旨在将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这种分离有助于提高代码的模块化程度并简化复杂系统的管理。具体来说: - **模型(Model)** 负责数据管理和业务逻辑。 - **视图(View)** 提供用户界面展示。 - **控制器(Controller)** 处理用户的输入并将请求分发给相应的模型或视图[^3]。 #### 创建第一个SpringMVC项目 以下是创建一个简单的SpringMVC项目的步骤: #### 配置`web.xml` 在传统的SpringMVC项目中,需要定义`DispatcherServlet`作为前端控制器来接收所有的HTTP请求。以下是一个基本的`web.xml`配置示例: ```xml <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> ``` #### 定义`DispatcherServlet`的配置文件 通常情况下,`DispatcherServlet`会加载名为`[servlet-name]-servlet.xml`的配置文件。在这个文件中可以完成诸如视图解析器、处理器映射等功能的配置。例如: ```xml <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".jsp" /> </bean> ``` #### 编写控制器类 下面是一个简单的控制器类示例,展示了如何响应特定URL路径的请求: ```java package com.jmh.mybatis.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller @RequestMapping("/hello") public class HelloController { @RequestMapping("/toHello") public String toHello() { return "hello"; // 返回逻辑视图名 } } ``` 上述代码中的`@Controller`注解表明这是一个Spring MVC控制器,而`@RequestMapping`则用来指定该方法所对应的URL路径[^4]。 #### 启用MVC注解驱动和支持静态资源访问 为了确保Spring IOC容器能识别注解以及支持静态资源(如CSS、JavaScript等),可以在配置文件中加入如下内容: ```xml <mvc:annotation-driven/> <mvc:resources mapping="/resources/**" location="/resources/"/> ``` 这一步骤对于现代Web应用尤为重要[^5]。 --- #### 总结 通过以上几个关键环节的学习——从理解MVC模式的基础理论到实际操作中的环境搭建与简单功能实现,已经完成了SpringMVC的第一步探索。继续深入研究更多高级特性和最佳实践将会进一步提升您的技能水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值