五种方式
- 原生api : HttpSession 和 HttpServletRequest
- Map
- Model
- ModelMap
- ModelAndView
项目架构
maven
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.versions>5.1.0.RELEASE</spring.versions>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.versions}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.versions}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.versions}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.versions}</version>
</dependency>
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
</dependencies>
<build>
<finalName>Java_SpringMvc_01</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<welcome-file-list>
<welcome-file>index1.jsp</welcome-file>
</welcome-file-list>
<display-name>Archetype Created Web Application</display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<!-- 指定springmvc配置文件的位置 -->
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-springmvc.xml</param-value>
</init-param>
<!-- load-on-startup服务器启动的时候创建对象,值越小 优先级越高-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<!-- / 拦截所有请求 -->
<url-pattern>/</url-pattern>
</servlet-mapping>
<!-- 设置编码格式 -->
<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>
</web-app>
applicationContext-springmvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.stone.mvc"/>
<!-- 配置视图解析器 InternalResourceViewResolver-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- prefix配置前置 -->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!-- suffix配置后置 -->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<body>
原生aip测试: <br/>
<form action="output1" method="post">
请输入你需要传递的值 : <input type="text" name="value"/>
<input type="submit" />
</form> <br>
map测试: <br/>
<form action="output2" method="post">
请输入你需要传递的值 : <input type="text" name="valueMap"/>
<input type="submit" />
</form>
model测试: <br/>
<form action="output3" method="post">
请输入你需要传递的值 : <input type="text" name="valueModel"/>
<input type="submit" />
</form>
valueModelMap测试: <br/>
<form action="output4" method="post">
请输入你需要传递的值 : <input type="text" name="valueModelMap"/>
<input type="submit" />
</form>
modelandview测试: <br/>
<form action="output5" method="post">
请输入你需要传递的值 : <input type="text" name="modelandview"/>
<input type="submit" />
</form>
modelandview测试2: <br/>
<form action="output6" method="post">
请输入你需要传递的值 : <input type="text" name="modelandview2"/>
<input type="submit" />
</form>
</body>
</html>
OutPutController类
package com.stone.mvc.servlet;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.View;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Map;
@Controller
public class OutPutController
{
// 将数据传输到前台页面 第一种方式 原生api
@RequestMapping("/output1")
public String outPut1(@RequestParam("value") String value, HttpSession session, HttpServletRequest request){
// 设置session域中的值
session.setAttribute("value",value);
// request域当中
request.setAttribute("value",value);
return "success1";
}
// 将数据传输到前台页面 第二种方式 map
@RequestMapping("/output2")
public String outPut2(@RequestParam("valueMap") String valueMap, Map<String ,Object> map){
map.put("map",valueMap);
return "success2";
}
// 将数据传输到前台页面 第三种方式 model
@RequestMapping("/output3")
public String outPut3(@RequestParam("valueModel") String valueModel,Model model){
model.addAttribute("model",valueModel);
return "success3";
}
// 将数据传输到前台页面 第四种方式 modelMap
@RequestMapping("/output4")
public String outPut4(@RequestParam("valueModelMap") String valueModelMap, ModelMap modelMap){
modelMap.addAttribute("valueModelMap",valueModelMap);
return "success4";
}
// 将数据传输到前台页面 第五种方式 modelandview
@RequestMapping("/output5")
public ModelAndView outPut5(@RequestParam("modelandview") String modelandview){
// modelAndView构造器
ModelAndView modelAndView = new ModelAndView("success5");
modelAndView.addObject("modelandview",modelandview);
return modelAndView;
}
// 将数据传输到前台页面 第五种方式 modelandview
@RequestMapping("/output6")
public ModelAndView outPut6(@RequestParam("modelandview2") String modelandview2,ModelAndView modelAndView){
Map<String, Object> model = modelAndView.getModel();
model.put("modelandview2",modelandview2);
modelAndView.setViewName("success6");
return modelAndView;
}
}
success1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
</head>
<body>
<h2> 成功跳转
</h2>
<br>
request域中的值 ${requestScope.value}
session域中的中 ${sessionScope.value}
</body>
</html>
success2.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
</head>
<body>
<h2>map接收值</h2> <br/>
pageContext : ${pageScope.map} <br/>
request : ${requestScope.map} <br/>
session : ${sessionScope.map} <br/>
application : ${applicationScope.map}
</body>
</html>
success3.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
</head>
<body>
<h2>model接收值</h2> <br/>
pageContext : ${pageScope.model} <br/>
request : ${requestScope.model} <br/>
session : ${sessionScope.model} <br/>
application : ${applicationScope.model}
</body>
</html>
success4.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
</head>
<body>
<h2>valueModelMap</h2> <br/>
pageContext : ${pageScope.valueModelMap} <br/>
request : ${requestScope.valueModelMap} <br/>
session : ${sessionScope.valueModelMap} <br/>
application : ${applicationScope.valueModelMap}
</body>
</html>
success5.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
</head>
<body>
<h2>modelAndView</h2> <br/>
pageContext : ${pageScope.modelandview} <br/>
request : ${requestScope.modelandview} <br/>
session : ${sessionScope.modelandview} <br/>
application : ${applicationScope.modelandview}
</body>
</html>
success6.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
</head>
<body>
<h2>modelAndView2</h2> <br/>
pageContext : ${pageScope.modelandview2} <br/>
request : ${requestScope.modelandview2} <br/>
session : ${sessionScope.modelandview2} <br/>
application : ${applicationScope.modelandview2}
</body>
</html>
原生api HttpSession HttpServletRequest
HttpSession:保存的数据存放在session作用域当中
HttpServletRequest :保存的数据存放在请求域当中
存值:session.setAttribute(key,value) request.setAttribute(key,value)
取值:
requestScope.key,sessionScope.key
案例代码
首页
Map
存值:map.put(key,value)
取值:格式:作用域.key 比如requestScope.key
案例
map存储的值默认存放在request域当中
Model
存值:model.addAttribute(key,value)
取值:格式:作用域.key 比如requestScope.key
model存储的值默认存也是放在request域当中
ModelMap
存值:modelmap.addAttribute(key,value)
取值:格式:作用域.key 比如requestScope.key
案例
ModelMap存值默认形式也是存放在request域当中
ModelAndView
ModelAndView和之前的四种有所不同,他即能控制页面的跳转页能够进行数据的传递,前面记录的四种方式方法的返回值都是String,并通过String的返回值,被SpringMVC的前端控制器(DispatcherServlet)拦截器拦,然后把拦截到的返回值,通过视图解析器(InternalResourceViewResolver)进行拼串处理进行对应的页面跳转,而使用ModelAndView的方法的返回值就是ModelAndView,通过ModelAndView中的setViewName方法,对相应的页面进行跳转
存值:modelAndView.addObject(key,value)
取值:格式:作用域.key 比如requestScope.key
页面跳转:
- ModelAndView构造器传参数
- ModelAndView.setViewName()
案例
构造器方式的结果
setViewName方式结构
总结 :
- 除了ModelAndView之外的方式,其他方式的返回值都是String
- 除了原生api以外能,其他四种方式的存在默认存放的作用域在request(请求)作用域当中
补充点 :
- 以上记录的除了原生api能存放在session域当中,其他四种方式默认存放的作用域为request域当中,那么怎么修改他们的作用域 ,并存放在session中
- 解决办法 添加 @SessionAttributes注解
@SessionAttributes的使用
该注解只能存放在类上
@SessionAttributes参数
- value:指定需要存放在session域的key值
- names:指定需要存放在session域的key值
- types:指定需要存放在session域中的类型 比如String类型 填入String.class
案例
并没有存放在session域当中