上一篇文章中我们讲过了处理器的映射,接下来我们来一起学习下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这是最简单控制器,很多参数都需要通过原始的方法去获取,后续还待完善。

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

springmvc基础篇—修改默认的配置文件名称及位置详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。