zoukankan      html  css  js  c++  java
  • SpringMVC处理模型数据

    建立一个web项目,具体过程不赘述,

    相关配置文件如下:

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <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">
    	<!-- 配置 DispatcherServlet -->
    	<servlet>
    		<servlet-name>dispatcherServlet</servlet-name>
    		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    		<!-- 配置 DispatcherServlet 的一个初始化参数: 配置 SpringMVC 配置文件的位置和名称 -->
    		<!-- 
    			实际上也可以不通过 contextConfigLocation 来配置 SpringMVC 的配置文件, 而使用默认的.
    			默认的配置文件为: /WEB-INF/<servlet-name>-servlet.xml
    		-->
    		<!--  
    		<init-param>
    			<param-name>contextConfigLocation</param-name>
    			<param-value>classpath:springmvc.xml</param-value>
    		</init-param>
    		-->
    		<load-on-startup>1</load-on-startup>
    	</servlet>
    	<servlet-mapping>
    		<servlet-name>dispatcherServlet</servlet-name>
    		<url-pattern>/</url-pattern>
    	</servlet-mapping>
    </web-app>
    

    dispatcherServlet-servlet.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:mvc="http://www.springframework.org/schema/mvc"
    	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.0.xsd
    		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
    
    	<!-- 配置自定扫描的包 -->
    	<context:component-scan base-package="com.helius.springmvc"></context:component-scan>
    
    	<!-- 配置视图解析器: 如何把 handler 方法返回值解析为实际的物理视图 -->
    	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    		<property name="prefix" value="/WEB-INF/views/"></property>
    		<property name="suffix" value=".jsp"></property>
    	</bean>
    	<!-- 在实际开发中通常都需配置 mvc:annotation-driven 标签 -->
    	<mvc:annotation-driven></mvc:annotation-driven>
    
    </beans>
    
    

    下面的才是重点

    一、处理模型数据之ModelAndView

    直接上代码:

    @RequestMapping("/springmvc")
    @Controller
    public class SpringMVCTest {
    
    	private static final String SUCCESS = "success";	
    /**
    	 * 目标方法的返回值可以是 ModelAndView 类型。 
    	 * 其中可以包含视图和模型信息
    	 * SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中. 
    	 * @return
    	 */
    	@RequestMapping("/testModelAndView")
    	public ModelAndView testModelAndView(){
    		String viewName = SUCCESS;
    		ModelAndView modelAndView = new ModelAndView(viewName);
    		
    		//添加模型数据到 ModelAndView 中.
    		modelAndView.addObject("time", new Date());
    		
    		return modelAndView;
    	}
    }
    
    <a href="springmvc/testModelAndView">Test ModelAndView</a>
    	<br><br>
    

    访问上面的超连接,就会跳转到testModelAndView方法,这个方法根据视图解析器中的配置会跳转到

    /WEB-INF/views/success.jsp文件中,

    下面是success.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
       
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    
    	<h4>Sucess Page</h4>
    	
    	time: ${requestScope.time }
    	<br><br>
    </body>
    </html>
    

    其实这个页面呢,获取到后端ModelAndView中传过来的time的值,显示在浏览器中,

    就像这样:

    小结:

     * 目标方法的返回值可以是 ModelAndView 类型。 
     * 其中可以包含视图和模型信息
     * SpringMVC 会把 ModelAndView 的 model 中数据放入到 request 域对象中. 
    

    二、处理模型数据之Map

    	/**
    	 * 目标方法可以添加 Map 类型(实际上也可以是 Model 类型或 ModelMap 类型)的参数. 
    	 * @param map
    	 * @return
    	 */
    	@RequestMapping("/testMap")
    	public String testMap(Map<String, Object> map){
    		System.out.println(map.getClass().getName()); 
    		map.put("names", Arrays.asList("Tom", "Jerry", "Mike"));
    		return SUCCESS;
    	}
    

    访问该方法后,也是跳转到success.jsp,浏览器显示

    注意这里,将map放在方法参数处,就不用再初始化了。

    三、处理模型数据之@SessionAttributes注解

    前面介绍的ModelAndView、Map、Model等都是将数据放在了request请求域中,若希望在多个请求之间共享模型数据,可以在控制器上标注一个@SessionAttributes注解,SpringMVC会将在模型中的属性暂存到HttpSession中。

    @SessionAttributes(value={"user"}, types={String.class})
    @RequestMapping("/springmvc")
    @Controller
    public class SpringMVCTest {
    /**
     * @SessionAttributes 除了可以通过属性名指定需要放到会话中的属性外(实际上使用的是 value 属性值),
     * 还可以通过模型属性的对象类型指定哪些模型属性需要放到会话中(实际上使用的是 types 属性值)
     * 
     * 注意: 该注解只能放在类的上面. 而不能修饰放方法. 
     */
        @RequestMapping("/testSessionAttributes")
        public String testSessionAttributes(Map<String, Object> map){
           User user = new User("Tom", "123456", "tom@atguigu.com", 15);
           map.put("user", user);
           map.put("school", "beijingdaxue");
           return SUCCESS;
        }
    }
    

    这里创建了一个User类对象,User类有4个属性

    public class User {
    
    	private String username;
    	private String password;
    	private String email;
        private int age;
        // 省略了setter and getter方法等
    }
    

    通过map.put("user", user);我们将user对象放进了Map中,根据前面说的,其实是放在了请求域

    关注success.jsp中的

    	request user: ${requestScope.user }
    	<br><br>
    	
    	session user: ${sessionScope.user }
    	<br><br>
    

    通过浏览器查看结果:

    ,要想放在session域中,需要在controller上加注解@SessionAttributes(value={"user"}, types={String.class})。具体见上面的方法

    此时再看浏览器的结果:

    可以发现此时session域中有值了。

    那这个注解是如何知道将哪些值放到session域中呢,

    我们看下@SessionAttributes的源码

    @Target({ElementType.TYPE}) // 可以放在类上,但不能放在方法上
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface SessionAttributes {
        String[] value() default {};
    
        Class<?>[] types() default {};
    }
    
    

    该注解 有两个值,一个是string类型的值和class类型的值。该注解也就是通过这两个属性的值来匹配需要放到session中的数据,

    比如我们的user对象,通过value={"user"},明确指出了这个user这个值,那types={String.class}是说通过类型去匹配,再回过头看

    map.put("school", "beijingdaxue");这里的"beijingdaxue"是字符串类型,也会放到session域中。

    你所看得到的天才不过是在你看不到的时候还在努力罢了!
  • 相关阅读:
    uniapp判断token多次登录问题
    vue强制刷新子组件到初始状态
    时间戳转化时间过滤器
    axios二次封装具有请求/响应拦截的http请求
    vue常见的工具函数
    解决npm i 初始化,core-js报错
    node环境变量配置
    scss基本使用
    Vue element-ui父组件控制子组件的表单校验
    antd-Calendar(日历)自动嵌入对应时间问题
  • 原文地址:https://www.cnblogs.com/heliusKing/p/11329566.html
Copyright © 2011-2022 走看看