• springmvc基础篇—掌握三种控制器


    上一篇文章中我们讲过了处理器的映射,接下来我们来一起学习下springmvc的控制器吧。

    首先咱们先创建一个咱们用来测试的实体(model)类:

    package cn.cfs.springmvc.domain;
    
    public class User {
        //主键
        private Integer id;
        //用户名
        private String username;
        //密码
        private String password;
        /**
         * 获取 主键
         *
         * @return 主键
         */
        public Integer getId() {
            return id;
        }
        /**
         * 设置 主键
         *
         * @param id 主键
         */
        public void setId(Integer id) {
            this.id = id;
        }
        /**
         * 获取 用户名
         *
         * @return 用户名
         */
        public String getUsername() {
            return username;
        }
        /**
         * 设置 用户名
         *
         * @param username 用户名
         */
        public void setUsername(String username) {
            this.username = username;
        }
        /**
         * 获取 密码
         *
         * @return 密码
         */
        public String getPassword() {
            return password;
        }
        /**
         * 设置 密码
         *
         * @param password 密码
         */
        public void setPassword(String password) {
            this.password = password;
        }
        @Override
        public String toString() {
            return "User [id=" + id + ", username=" + username + ", password="
                    + password + "]";
        }
        
        
    }
    User实体类

    springmvc的控制器有很多种,这里只讲最常用的三种:

    一、CommandController命令控制器

    package cn.cfs.springmvc.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.validation.BindException;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.AbstractCommandController;
    import cn.cfs.springmvc.domain.User;
    
    public class UserCommandController extends AbstractCommandController {
        //绑定数据
        public UserCommandController() {
            this.setCommandClass(User.class);
            this.setCommandName("user");
        }
    @Override
    protected ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { User user =(User)command; System.out.println(user.toString()); return new ModelAndView("index"); } }

    action-servlet.xml配置文件中的代码:

    <!-- 采用className的方式去访问 -->
        <bean id="userCommandController"  class="cn.cfs.springmvc.controller.UserCommandController"></bean>

    前台通过访问url:http://192.168.1.253:8082/springmvc_01/usercommandcontroller.action?id=99&username=aaa&password=ssss 来测试

    控制台打印语句:User [id=99, username=aaa, password=ssss]

     二、SimpleFormController简单表单控制器

    package cn.cfs.springmvc.controller;
    
    import org.springframework.web.servlet.mvc.SimpleFormController;
    import cn.cfs.springmvc.domain.User;
    
    public class UserFormController extends SimpleFormController {
        //在构造方法里去绑定
        public UserFormController() {
            this.setCommandClass(User.class);
            this.setCommandName("user");
        }
        
        @Override
        protected void doSubmitAction(Object command) throws Exception {
            User user=(User)command;
            System.out.println(user.toString());
        }
    }

    action-servlet.xml配置文件中的代码:

    <!-- 采用className的方式去访问 -->
        <bean id="userFormController" class="cn.cfs.springmvc.controller.UserFormController">
            <property name="formView" value="login" />
            <property name="successView" value="index" />
        </bean>

    ps:formView 是通过get方法访问这个请求处理后跳转的页面,successView是通过post方法访问这个请求处理后跳转的页面。举个例子,例如添加用户,肯定先要跳转到添加用户的页面上,然后在表单中填写一些用户信息,点击保存提交按钮跳转到控制器中,处理完自己的业务代码再跳到指定页面,这种简单表单方式就是为了解决这种需求。

    访问路径:http://192.168.1.253:8082/springmvc_01/userformcontroller.action 跳转到添加页面的地址,因为是直接在浏览器敲的所以是get方式访问的,会跳转到login.jsp页面上

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>登录</title>
    </head>
    <body>
        <form action="${pageContext.request.contextPath}/userformcontroller.action" method="post">
            <table>
                <tr>
                    <td>用户名:</td>
                    <td><input type="text" name="username" /></td>
                </tr>
                <tr>
                    <td>密码:</td>
                    <td><input type="password" name="password" /></td>
                </tr>
                <tr>
                    <td colspan="2"><input type="submit" value="保存提交" /></td>
                </tr>
            </table>
        </form>
    
    </body>
    </html>
    login.jsp页面代码

    根据上面login.jsp中代码所示,输入完用户名和密码后,点击保存提交按钮,通过form中post的方式将表单内容提交到userformcontroller.action这个请求上,回通过控制器找到doSubmitAction这个方法,在这个方法中处理自己业务逻辑,最后跳转到index.jsp页面上,最后总结一下,这种方式是通过get和post提交方式来区分跳转的页面的,只有post提交方式才会跳转到带有处理自己业务逻辑的后台方法中。

    控制台打印语句:User [id=null, username=aaaa, password=123456]

     三、WizardFormController向导控制器

    package cn.cfs.springmvc.controller;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import org.springframework.validation.BindException;
    import org.springframework.web.servlet.ModelAndView;
    import org.springframework.web.servlet.mvc.AbstractWizardFormController;
    import cn.cfs.springmvc.domain.User;
    
    public class UserWizardController extends AbstractWizardFormController {
    
        //绑定数据
        public UserWizardController() {
            this.setCommandClass(User.class);
            this.setCommandName("user");
        }
        
        /**
         * 完成提交的函数
         */
        @Override
        protected ModelAndView processFinish(HttpServletRequest request,
                HttpServletResponse response, Object command, BindException errors)
                throws Exception {
            User user=(User)command;
            System.out.println(user.toString());
            return new ModelAndView("index");
        }
       
        /**
         * 取消方法,配置点击取消后要跳转的页面
         */
        @Override
        protected ModelAndView processCancel(HttpServletRequest request,
                HttpServletResponse response, Object command, BindException errors)
                throws Exception {
            return new ModelAndView("index");
        }   
    }

    action-servlet.xml配置文件中的代码:

    <!-- 采用className的方式去访问 -->
        <bean id="userwizardcontroller" class="cn.cfs.springmvc.controller.UserWizardController">
            <property name="pages">
                <list>
                    <value>/wizard/1</value>
                    <value>/wizard/2</value>
                    <value>/wizard/3</value>
                </list>
            </property>
        </bean>

    ps: list下的value为跳转的页面,对应的上下文中会创建一个叫wizard的文件夹,以及对应的3个页面文件

    访问路径:http://192.168.1.253:8082/springmvc_01/userwizardcontroller.action 会按照list中value的先后顺序去加载页面

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>向导表单控制器</title>
    </head>
    <body>
        <form action="${pageContext.request.contextPath}/userwizardcontroller.action" method="post">
            <table>
                <tr>
                    <td>
                        第一个页面,id
                        <input type="text" name="id" value="${user.id}" />                    
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="submit" name="_target1" value="下一步" />
                        <input type="submit" name="_cancel" value="取消" />
                    </td>
                </tr>
            </table>
        </form>
    
    </body>
    </html>
    wizard/1.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>向导表单控制器</title>
    </head>
    <body>
        <form action="${pageContext.request.contextPath}/userwizardcontroller.action" method="post">
            <table>
                <tr>
                    <td>
                        第二个页面,用户名
                        <input type="text" name="username"  value="${user.username}"/>                    
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="submit" name="_target0" value="上一步" />
                        <input type="submit" name="_cancel" value="取消" />
                        <input type="submit" name="_target2" value="下一步" />
                    </td>
                </tr>
            </table>
        </form>
    
    </body>
    </html>
    wizard/2.jsp
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!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>向导表单控制器</title>
    </head>
    <body>
        <form action="${pageContext.request.contextPath}/userwizardcontroller.action" method="post">
            <table>
                <tr>
                    <td>
                        第三个页面,密码
                        <input type="text" name="password"  value="${user.password}" />                    
                    </td>
                </tr>
                <tr>
                    <td>
                        <input type="submit" name="_target1" value="上一步" />
                        <input type="submit" name="_finish" value="完成" />
                        <input type="submit" name="_cancel" value="取消" />
                    </td>
                </tr>
            </table>
        </form>
    
    </body>
    </html>
    wizard/3.jsp

    ps:上面的jsp文件中主要是通过 提交按钮的 name名称去控制上下页,取消,完成操作的,详细请看下面的表格(1-1);

    向导表单控制器属性一览表(1-1)
    属性 具体的的含义
    _targetN N是可变化的,指具体的页码,从0开始,例如当前为第二页,上一页则为_target0,下一页则为_target1
    _cancel 取消,点击后请求发送到后台的取消方法中,根据具体的配置跳转到指定的取消页面
    _finish 完成,点击后请求发送到后台的完成方法中,会自动将向导页的表单数据做拼接,根据具体的配置跳转到指定的完成请求处理后的页面

    上述为当前springmvc比较常用的控制器,当然还有很多,例如默认的AbstractController这是最简单控制器,很多参数都需要通过原始的方法去获取,后续还待完善。

  • 相关阅读:
    java.lang.OutOfMemoryError: Java heap space解决办法
    android网络图片加载缓存,避免重复加载。
    Android控制软键盘拉起
    mysql create database 指定utf-8编码
    仿黑客帝国文字雨效果
    C++循环去掉文件的后缀名
    使用python读取多重文件夹下的word(doc、docx)文件,并处理存储到excel(xls、xlsx)文件
    Python操作文件夹
    (转载)Python:列表作为参数
    595. Big Countries (Easy)
  • 原文地址:https://www.cnblogs.com/mycifeng/p/6307066.html
Copyright © 2020-2023  润新知