springMVC-model

[email protected](String[] value,Class[] types)的使用(一种向session域中添加属性的方式)
    加在handler类上。
    >当响应的目标方法中有向request域中添加属性的操作时,若该属性名与value值中的一个相同,就将它也添加到session中;
        或者该属性类型与types中的一个相同,就将它也添加到session中。

2.ModelAttribute

MyHandler.java

package handler;

import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import model.User;

@SessionAttributes(value = { "username", }, types = { String.class })
@Controller
public class Handler {
    public static final String SUCCESS = "success";

    /**
     * 任何通过这个Handler的请求在执行目标方法之前都要执行@ModelAttribute修饰的getModel方法
     * 形参中的user只有表单上提交的属性值
     * 从数据库中取出对应的属性放到request中
     * */
    @ModelAttribute
    public void getModel(User user, Model map) {
        System.out.println("一"+user);
        if (user.getId() != null) {
            map.addAttribute("abc", new User(1, "Ji", "123"));
        }
    }

    /**(三个标*重点)
     * 模拟edit的一个场景。使表单上提交的项被赋到从数据库中得到的对象,而不是新的空对象。这样不能修改的项就不会为null
     * 表面的运行流程:
     * 1.执行@ModelAttribute注释的方法,从数据库中获取对应的对象并放入到request域中
     * 2.springMVC会将request域中以User(形参类型名)首字母小写为属性名的对象取出,将表单上的值赋给其对应的属性
     * 3.目标方法的形参就接受到了覆盖后的对象
     * 注意:若@ModelAttribute("abc")注释了形参,那么第二步中的user就会变成abc
     *
     * 源码是怎么实现第二步的:(就算没有写 @ModelAttribute 注释的方法也会这么走)
     * 1.实际上把@ModelAttribute修饰的方法中的Map中的数据放到了implicitModel中
     * 2.解析目标方法的参数(就是@ModelAttribute("abc")User user),实际上它来自于WebDataBinder对象的target属性
     *     01.创建WebDataBinder对象
     *         001.*确定objectName属性:若传入的attrName属性为""(即没有用@ModelAttribute("abc")注释),
     *                             则objectName为参数类型名首字母小写;
     *                             若有用@ModelAttribute("abc")注释,attrName为abc,objectName为attrName
     *         002.确定target属性:
     *             >首先在implicitModel中查找objectName对应的属性值若存在就赋给target
     *             >*若不存在:看Handler是否使用了@SessionAttributes(value = { "username", }),再在Session中查找,若
     *                 value中包含objectName,但session中又确实没有对应的属性值,那么抛出异常
     *             >以上若都没有得到target,那么就通过反射创建一个空的user对象
     *     02.springMVC把表单中的请求参数赋给WebDataBinder对象的target属性,实现覆盖。
     *     03*.springMVC把WebDataBinder的objectName和target给到implicitModel(相当于覆盖后又放到request域中了)
     *     04.把WebDataBinder的target传给形参user。
     * */
    @RequestMapping("/testModelAttribute")
    public ModelAndView testModelAttribute(@ModelAttribute("abc")User user) {
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.setViewName(SUCCESS);
        System.out.println(user);
        return modelAndView;
    }

    @RequestMapping("/testSessionAttributes")
    public String testSessionAttributes(Model model, HttpSession session) {

        model.addAttribute("username", "Ji");
        model.addAttribute("username2", "Yun");
        session.setAttribute("username3", "Fei");

        return SUCCESS;
    }

    @RequestMapping("/testSpringMVC")
    public String testSpringMVC() {
        System.out.println("testSpringMVC");
        return SUCCESS;
    }
}
时间: 2024-10-29 19:10:44

springMVC-model的相关文章

SpringMVC model 多余字段 忽略

spring-mybaits的model中如何通过注解忽略非数据库字段?——CSDN问答频道https://ask.csdn.net/questions/643534 ObjectMapper忽略多余字段 - StruggleLT的博客 - CSDN博客https://blog.csdn.net/StruggleLT/article/details/82866327 Jackson ObjectMapper类 - Jackson教程™https://www.yiibai.com/jackson/

maven+springMVC+mybatis+junit详细搭建过程 【转】

springMVC+mybatis框架搭建 首先我们先要弄清搭建项目的一般流程,需要注意哪些方面,想要什么样的效果,自己的功能有哪些? (假设效果:项目目录结构清晰,能够查询到本地数据库中的内容..) 1.  工程目录结构整理清楚 在src/main/java文件夹中,新建包cn.springmvc.model(存放javabean), cn.springmvc.dao(存放spring与mybatis连接接口), cn.springmvc.service(service接口), cn.spri

SpringMVC详细示例实战教程

一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!--configure the setting of springmvcDispatcherServlet and configure the mapping--> <servlet>     <servlet-name>

史上最全最强SpringMVC详细示例实战教程

一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <!--configure the setting of springmvcDispatcherServlet and configure the mapping--> <servlet>     <servlet-name>

史上最全的SpringMVC学习笔记

SpringMVC学习笔记---- 一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--configure the setting of springmvcDispatcherServlet and configure the mapping--> <servlet> <servlet-name>springmvc</servlet

springmvc上传图片并显示图片--支持多图片上传

实现上传图片功能在Springmvc中很好实现.现在我将会展现完整例子. 开始需要在pom.xml加入几个jar,分别是: [java] view plain copy <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3.1</version> </dep

SpringMVC+RestFul详细示例实战教程

一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 <!--configure the setting of springmvcDispatcherServlet and configure the mapping--> <servlet> <servlet-name>springmvc</servlet-name> <serv

maven+springMVC+mybatis+junit详细搭建过程

springMVC+mybatis框架搭建 首先我们先要弄清搭建项目的一般流程,需要注意哪些方面,想要什么样的效果,自己的功能有哪些? (假设效果:项目目录结构清晰,能够查询到本地数据库中的内容..) 1.  工程目录结构整理清楚 在src/main/java文件夹中,新建包cn.springmvc.model(存放javabean), cn.springmvc.dao(存放spring与mybatis连接接口), cn.springmvc.service(service接口), cn.spri

转:史上最全最强SpringMVC详细示例实战教程

一.SpringMVC基础入门,创建一个HelloWorld程序 1.首先,导入SpringMVC需要的jar包. 2.添加Web.xml配置文件中关于SpringMVC的配置 1 <!--configure the setting of springmvcDispatcherServlet and configure the mapping--> 2 <servlet> 3 <servlet-name>springmvc</servlet-name> 4

【转载】springMVC表单校验+全注解

在这篇文章中,我们将学习如何使用Spring表单标签, 表单验证使用 JSR303 的验证注解,hibernate-validators,提供了使用MessageSource和访问静态资源(如CSS,JavaScript,图片)国际化支持我们的视图,使用ResourceHandlerRegistry,全部采用基于注解的配置. 我们将创建一个包含一个学生注册表格的简单应用,用户输入表单提交验证通过 JSR303 的验证注释验证,通过覆盖属性文件可使用国际验证消息的默认消息,还访问静态资源(如应用引