目录
(前置工作)搭建Maven项目的web模块,配置SpringMVC
1.使用原生ServletAPI向request域对象共享数据(了解)
2.使用ModelAndView对象向request域对象共享数据(重要)
(补充)通过Debug来分析控制器方法执行之后都会返回统一的ModelAndView对象
SpringMVC域对象共享数据
回顾:当我们获取请求参数,然后通过请求参数进行service层业务逻辑处理,处理完后进行Dao层持久化操作,操作完成返回的数据到service层,service层处理好之后返回控制层,控制层此时需要将数据共享给页面,这时候就需要域对象了。
(回顾)JSP九大内置对象中的四大域对象
- pageContext (PageContextImpl 类) 当前 jsp 页面范围内有效,比如我在jsp页面存入的数据,我在该jsp页面取出存入的数据数据
- request (HttpServletRequest 类)、 一次请求内有效(浏览器发送给服务器的请求次数),服务器之间通过请求转发,也只算是一次请求(例如:SpringMVC前端控制器DispatcherServlet将请求转发到页面)
- session (HttpSession 类)、 一个会话范围内有效(也就是操作域对象session的浏览器关闭了,session也就失效了,因为服务端保留着与一个客户端之间通信的唯一的ID)。但是对于Idea的Tomcat而言,当idea中tomcat关了,session就没了。一般用于保存登录状态
钝化、活化解释:实际上是当服务器迫不得已想要关闭时,用户会话还在进行相应的操作,这时就需要使用序列化将内存session信息序列化保存起来放在硬盘,这个过程称之为session钝化;服务器重启后,又将磁盘中的Session重新反序列化加载到服务器中,这个过程称之为session活化。这样就保证了用户信息不会丢失,实现永久化保存 - application (ServletContext 类) 整个 web 工程范围内都有效(只要 web 工程不停止,数据都在,重新部署服务器也会失效)
- 域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。
- 四个域在使用的时候,优先顺序是他们从小到大的范围的顺序,因为最容易失效证明内存最容易被释放,从而降低服务器压力
- pageContext ====>>> request(查询) ====>>> session ====>>> application
(前置工作)搭建Maven工程的web模块springMVC-demo3
-
创建项目,引入依赖
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.atguigu.mvc</groupId> <artifactId>springMVC-demo3</artifactId> <version>1.0-SNAPSHOT</version> <!--工程打包方式,默认是jar,如果这是一个web工程,打包方式为war 当前是一个web工程,因此我们需要为这个Maven工程添加web模块, 模块里面有webapp及webapp里面的web.xml--> <packaging>war</packaging> <!--添加依赖群,当导报成war包时,这些依赖都会被放到webapp目录的 WEB-INF目录中的lib目录下--> <dependencies> <!--添加单个依赖SpringMVC,下面同理.由于 Maven 的传递性, 我们不必将所有需要的包全部配置依赖,而是配置最顶端的依赖,其他靠传递性导入, 意味着只要导入了这个SpringMVC依赖,那么 SpringMVC依赖的依赖也会导入进来,其中就有spring的基础框架jar包: aop、beans、context、core、expression,还有自身web框架jar包 传递性对于其他依赖同理--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.1</version> </dependency> <!-- 日志,用于日志输出 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- ServletAPI,之前没导入是因为Tomcat自带了Servlet和JSP的jar包, 因此只要配置了tomcat就能使用Servlet,java不自带Servlet的--> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <!--依赖范围,表示我们什么地方可以使用这个jar包, 这里设置成provided就是该依赖已被服务器提供,因此编译时 这个依赖都会被放到webapp目录的WEB-INF目录中的lib目录下--> <scope>provided</scope> </dependency> <!-- Spring5和Thymeleaf整合包,是视图技术,控制页面显示内容 --> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring5</artifactId> <version>3.0.12.RELEASE</version> </dependency> </dependencies> </project>
-
配置web入口,注册SpringMVC
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--配置springMVC的编码过滤器CharacterEncodingFilter--> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!--设置要使用UTF-8编码--> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <!--强制服务器响应请求为如上所设置的编码,不设置接收请求为true是因为底层代码在 request并没有设置,因此肯定为true,也就是接收请求编码的一定是强制用如上 所设置的编码--> <init-param> <param-name>forceResponseEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <!--"/*"表示所有请求都需