zoukankan      html  css  js  c++  java
  • 08_springmvc数据回显和@ModelAttribute注解详解

    一.数据回显

    提交后,如果出现错误,将刚才提交的数据回显到刚才的提交页面。

    二.pojo数据回显方法

    1.springmvc默认对pojo数据进行回显。

    pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写),使用@ModelAttribute指定pojo回显到页面在request中的key。

    2.@ModelAttribute还可以将方法的返回值传到页面

    页面上可以得到itemTypes数据。

    3、最简单方法使用model,可以不用@ModelAttribute

    简单类型数据回显

    使用最简单方法使用model

    model.addAttribute("id", id);
    
    

    @ModelAttribute使用详解:

    org.springframework.web.bind.annotation.ModelAttribute注解类型将请求参数绑定到Model对象。
    @ModelAttribute注解只支持一个属性value,类型为String,表示绑定的属性名称。

    提示:被@ModelAttribute注释的方法会在Controller每个方法执行前被执行,因此在一个Controller映射到多个URL时,要谨慎使用。

    1.@ModelAttribute(value="")注释返回具体类的方法

    index.jsp
    用于展示调用关于@ModelAttribute注解不同的使用方法。

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      <h3>测试@ModelAttribute</h3>
      <a href="loginForm1">测试@ModelAttribute(value="")注释返回具体类的方法</a>
      <a href="loginForm2">测试@ModelAttribute注释void返回值的方法</a>
      <a href="loginForm3">测试@ModelAttribute注释返回具体类的方法</a>
      <a href="loginForm4">测试@ModelAttribute和@RequestMapping同时注释一个方法</a>
      <a href="loginForm5">测试@ModelAttribute注释一个方法的参数</a>
      </body>
    </html>

    FormController
    用于接受index.jsp页,a标签(超链接)传递的地址。

    @Controller
    public class FormController {
        @RequestMapping(value = "/{formName}")
        public String loginForm(@PathVariable String formName){
            return formName;
        }
    }

    loginForm1.jsp

    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h3>测试@ModelAttribute(value="")注释返回具体类的方法 </h3>
    <form action="login111" method="post">
        <label for="loginName">登录名:</label><input type="text" id="loginName" name="loginName">
        <input type="submit">
    </form>
    </body>
    </html>

    测试@ModelAttribute(value="")注释返回具体类的方法

    使用@ModelAttribute注释的value属性,来指定model属性的名称,model属性的值就是方法的返回值

    @Controller
    public class ModelAttribute1Controller {
        //使用@ModelAttribute注释的value属性,来指定model属性的名称,model属性的值就是方法的返回值
        @ModelAttribute("loginName")
        public String userModel1(
                @RequestParam("loginName") String loginName){
            return loginName;
        }
        @RequestMapping(value = "/login111")
        public String login111(){
            return "result1";
        }
    
    

    result1.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${requestScope.loginName}
    </body>
    </html>

    测试@ModelAttribute注释void返回值的方法

    loginForm2.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h3>测试@ModelAttribute注释void返回值的方法</h3>
    <form action="login222" method="post">
        <label for="loginName">登录名:</label><input type="text" id="loginName" name="loginName">
        <label for="password">密码:</label><input type="password" id="password" name="password">
        <input type="submit" value="登录">
    </form>
    </body>
    </html
    @Controller
    public class ModelAttribute2Controller {
        //model属性名称和值由model.addAttribute()实现,前提是要在方法中加入图个Model类型的参数
        @ModelAttribute
        public void userModel2(
                @RequestParam("loginName") String loginName,
                @RequestParam("password") String password,
                Model model) {
            model.addAttribute("loginName", loginName);
            model.addAttribute("password", password);
        }
        @RequestMapping(value = "/login222")
        public String login222(){
            return "result2";
        }
    }

    result2.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${requestScope.loginName}
    ${requestScope.password}
    </body>
    </html>

    测试@ModelAttribute注释访问具体类的方法

    loginForm3.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h3>测试@ModelAttribute注释返回具体类的方法</h3>
    <form action="login333" method="post">
        <label for="loginName">登录名:</label><input type="text" id="loginName" name="loginName">
        <label for="password">密码:</label><input type="password" id="password" name="password">
        <input type="submit" value="登录">
    </form>
    </body>
    </html>
    
    </body>
    </html>
    @Controller
    public class ModelAttribute3Controller {
        //静态List<User>集合,此处代替数据库用来保存注册的用户信息
        private static List<User> userList;
    
        //此构造器,初始化List<User>集合
        public ModelAttribute3Controller() {
            super();
            userList = new ArrayList<>();
            User user1 = new User("test", "123");
            User user2 = new User("admin", "456");
            userList.add(user1);
            userList.add(user2);
        }
        //根据登录名和密码查询用户,用户存在返回用户信息的User对象,不存在返回null
        private User find(String loginName, String password) {
            for (User user : userList) {
                if (user.getName().equals(loginName) && user.getPwd().equals(password)) {
                    return user;
                }
            }
            return null;
        }
        //model属性的名称没有被锁定,它由返回类型隐含表示,如这个方法返回User类型,
        //那么这个model属性的名称就是user
        @ModelAttribute
        public User userModel3(
                @RequestParam("loginName") String loginName,
                @RequestParam("password") String password) {
            return find(loginName, password);
        }
    
        @RequestMapping(value = "/login333")
        public String login333() {
            return "result3";
        }
    }

    result3.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${requestScope.user.name}
    </body>
    </html>

    测试@ModelAttribute和@RequestMapping同时注释一个方法

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <body>
    <h3>测试@ModelAttribute注释void返回值的方法</h3>
    <form action="login444" method="post">
        <label for="loginName">登录名:</label><input type="text" id="loginName" name="loginName">
        <label for="password">密码:</label><input type="password" id="password" name="password">
        <input type="submit" value="登录">
    </form>
    </body>
    </body>
    </html>
    @Controller
    public class ModelAttribute4Controller {
        /**
         * 视图名称是@RequestMapping的value值——"/login444",即跳转结果
         *
         * @return model属性名称就是value的值
         */
        @RequestMapping(value = "/login444")
        @ModelAttribute(value = "username")
        public String login444() {
            return "admin";
        }
    }

    login444.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${requestScope.username}
    </body>
    </html>

    测试@ModelAttribute注释一个方法的参数

    loginForm5.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <body>
    <h3>测试@ModelAttribute注释一个方法的参数</h3>
    <form action="login555" method="post">
        <label for="loginName">登录名:</label><input type="text" id="loginName" name="loginName">
        <label for="password">密码:</label><input type="password" id="password" name="password">
        <input type="submit" value="登录">
    </form>
    </body>
    </body>
    </html>
    @Controller
    public class ModelAttribute5Controller {
        //model的属性名称就是value的值,即"user",model属性对象就是方法的返回值
        @ModelAttribute("user")
        public User userModel5(
                @RequestParam("loginName") String loginName,
                @RequestParam("password") String password){
            User user =new User();
            user.setName(loginName);
            user.setPwd(password);
            return user;
        }
        @RequestMapping(value = "/login555")
        public String login555(@ModelAttribute("user") User user){
            user.setName("管理员");
            return "result5";
        }
    }

    result5.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    ${requestScope.user.name}
    </body>
    </html>
  • 相关阅读:
    Maven 集成Tomcat插件
    dubbo 序列化 问题 属性值 丢失 ArrayList 解决
    docker 中安装 FastDFS 总结
    docker 从容器中拷文件到宿主机器中
    db2 相关命令
    Webphere WAS 启动
    CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题
    SpringMVC JSONP JSON支持
    CKEDITOR 3.4.2中 按钮事件中 动态改变图标和title 获取按钮
    git回退到远程某个版本
  • 原文地址:https://www.cnblogs.com/jatpeo/p/11767518.html
Copyright © 2011-2022 走看看