定义继承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,来进行数据格式转换。
配置文件不变
日 期:<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中去了