Spring MVC 之 AbstractCommandController

定义继承AbstractCommandController的控制器,实现数据的自动封装

Controller

package com.hsit.controller;  
 
import java.text.SimpleDateFormat;  
import java.util.Date;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import org.springframework.beans.factory.config.CustomEditorConfigurer;  
import org.springframework.beans.propertyeditors.CustomDateEditor;  
import org.springframework.validation.BindException;  
import org.springframework.web.bind.ServletRequestDataBinder;  
import org.springframework.web.servlet.ModelAndView;  
import org.springframework.web.servlet.mvc.AbstractCommandController;  
import com.hsit.pojo.UserInfo;  
   
public class UserInfoController extends AbstractCommandController {  
   
     @Override  
     protected ModelAndView handle(HttpServletRequest request,  
             HttpServletResponse response, Object command, BindException errors)  
             throws Exception {  
         // TODO Auto-generated method stub  
         UserInfo user = (UserInfo) command;  
         System.out.println(user);  
         return null;  
     }  
}  

JavaBean

package com.hsit.pojo;  
 
import java.util.Date;  
  
public class UserInfo {  
  
   private String username;  
   private String password;  
    
    public String getUsername() {  
        return username;  
    }  
  
     public void setUsername(String username) {  
        this.username = username;  
    }  
  
    public String getPassword() {  
        return password;  
     }  
  
    public void setPassword(String password) {  
         this.password = password;  
    }  
   
    @Override  
    public String toString() {  
        return "username=" + username + ",password=" + password;  
     }  
   
}  

jsp 视图

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>  
 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
<html>  
   <head>  
           
    <title></title>  
       
    <meta http-equiv="pragma" content="no-cache">  
    <meta http-equiv="cache-control" content="no-cache">  
    <meta http-equiv="expires" content="0">      
     <!--  
    <script type="text/javascript" src="js/*.js"></script>  
     <link rel="stylesheet" type="text/css" href="styles.css">  
    -->  
  
   </head>  
    
  <body>  
         <center>  
             <form action="login.do" method="post">  
                 用户名:<input type="text" name="username" size="20"/><br>  
                账  号:<input type="password" name="password" size="20"><br>  
                 <!--name名字一定要和UserInfo的属性名一样,才能正确封装-->  
                <input type="submit" value="提交">  
             </form>  
         </center>  
   </body>  
</html>  

配置如下

 <?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:p="http://www.springframework.org/schema/p"  
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  
       
     <!-- 配置处理器映射采用SimpleUrlHandlerMapping -->  
     <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">  
         <property name="mappings">  
         <!-- props底下的prop标签内填写的key都是符合转发条件的url值,之后跟的是bean的ID,  
         如果输入的url值与key值中的url匹配,则执行对应beanID绑定的Controller -->  
            <props>  
                <prop key="go.do">go</prop>  
                 <prop key="test.do">test</prop>  
                <prop key="goLogin.do">goLogin</prop>  
                <prop key="login.do">login</prop>  
            </props>  
        </property>  
    </bean>  
      
    <!-- 配置视图解释器 -->  
     <bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">  
         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />  
         <!-- 属性prefix和suffix指定的是你的视图文件所在的路径,以及他的后缀是什么(就是类型)  
             以下指的就是  /WEB-INF/jsp/*.jsp  
          -->  
         <property name="prefix" value="/WEB-INF/jsp/" />  
        <property name="suffix" value=".jsp"></property>  
    </bean>  
      
     <!-- 控制器配置 -->  
       
    <bean id="goLogin" class="org.springframework.web.servlet.mvc.ParameterizableViewController">  
         <property name="viewName" value="login" />  
     </bean>  
    <!-- 属性commandClass的value值设置成数据要封装成什么类型,执行到该控制器时就会自动将数据封装成UserInfo-->  
     <bean id="login" class="com.hsit.controller.UserInfoController">  
         <property name="commandClass" value="com.hsit.pojo.UserInfo" />  
    </bean>  
</beans>  

地址栏:http://colo-pc:8080/SpringMVC01/goLogin.do


输入框中输入的用户名和密码将会自动封装到UserInfo对应的属性中去


但是有一种情况我们不能成功将数据封装起来,如果.jsp界面要我们输入的信息有包括时间的话,Controller不能正确将输入框中的时间正确封装成为Date对象,因为输入框中的值带到Controller中时,都是String类型的。这时候我们就要在Controller中重写一个方法initBinder,来进行数据格式转换。

配置文件不变


jsp在表单中添加

日  期:<input type="text" name="date" size="20"><br><br>  

Controller.java

 package com.hsit.controller;  
   
import java.text.SimpleDateFormat;  
import java.util.Date;  
  
import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletResponse;  
  
import org.springframework.beans.propertyeditors.CustomDateEditor;  
import org.springframework.validation.BindException;  
import org.springframework.web.bind.ServletRequestDataBinder;  
import org.springframework.web.servlet.ModelAndView;  
import org.springframework.web.servlet.mvc.AbstractCommandController;  
   
import com.hsit.pojo.UserInfo;  
  
public class UserInfoController extends AbstractCommandController {  
  
    @Override  
     protected ModelAndView handle(HttpServletRequest request,  
             HttpServletResponse response, Object command, BindException errors)  
             throws Exception {  
         // TODO Auto-generated method stub  
        UserInfo user = (UserInfo) command;  
         System.out.println(user);  
         return null;  
    }  
       @Override  
    protected void initBinder(HttpServletRequest request,  
             ServletRequestDataBinder binder) throws Exception {  
                 /*数据转换成Date类型*/  
        binder.registerCustomEditor(Date.class, new CustomDateEditor(  
                new SimpleDateFormat("yyyy-MM-dd"), true));  
    }  
}  

当然还要在UserInfo中添加个Date的属性和相应的setter和getter方法,通过以上的修改,就能成功将表单中的时间信息封装进UserInfo中去了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值