• 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域中。

    你所看得到的天才不过是在你看不到的时候还在努力罢了!
  • 相关阅读:
    js中的原生Ajax和JQuery中的Ajax
    this的用法
    static的特性
    时政20180807
    java compiler没有1.8怎么办
    Description Resource Path Location Type Java compiler level does not match the version of the installed Java project facet Unknown Faceted Project Problem (Java Version Mismatch)
    分词器
    [数算]有一个工程甲、乙、丙单独做,分别要48天、72天、96天完成
    一点感想
    解析Excel文件 Apache POI框架使用
  • 原文地址:https://www.cnblogs.com/heliusKing/p/11329566.html
Copyright © 2020-2023  润新知