Spring MultiActionController 使用 Command 将Form中的数据绑定

MultiActionController 可以处理多个请求,将数据绑定到Command中,可以在代码中减少类似request.getParameter("")的语句。如果能在MultiActionController的子类中使用Command就更好了。步骤如下:


第一步:配置整个环境,有4个配置配置文件:web.xml,<servlet-name>-servlet.xml,applicationContext.xml,persistence.xml,具体配置如下


1. web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>test-maven</display-name>
	<welcome-file-list>
		<welcome-file>/WEB-INF/page/index.jsp</welcome-file>
	</welcome-file-list>

	<context-param>
		<param-name>contextConfigLocation</param-name>
		 <param-value>classpath:*applicationContext.xml</param-value> 
	</context-param>

	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<servlet>
		<servlet-name>spring</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>spring</servlet-name>
		<url-pattern>*.htm</url-pattern>
	</servlet-mapping>

</web-app>



2. spring-servlet.xml

<?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.xsd">

	<!-- 配置视图解析 -->
	<bean id="viewresolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">

		<property name="prefix" value="/WEB-INF/page/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean> 

	 <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
		<property name="mappings">
			<props>
				<prop key="/user.htm">userController</prop>
			</props>
		</property>
	</bean> 

	<!--方法名解析器-->
	<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
		<property name="paramName">
			<value>method</value>
		</property>
	</bean>
	
	<bean id="userController" class="com.test.springmvc.controller.UserFormController">
		<property name="methodNameResolver">
			<ref bean="methodNameResolver"/>
		</property>
	</bean>  
</beans>



3. applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="   
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd   
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd   
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">

	<bean id="oracleDataSource"
		class="org.springframework.jdbc.datasource.DriverManagerDataSource">
		<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
		<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
		<property name="username" value="invoice" />
		<property name="password" value="invoice" />
	</bean>


	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="oracleDataSource" />
		<property name="jpaVendorAdapter">
			<bean class="org.springframework.orm.jpa.vendor.TopLinkJpaVendorAdapter">
				<property name="showSql" value="true" />
				<property name="generateDdl" value="false" />
				<property name="databasePlatform"
					value="oracle.toplink.essentials.platform.database.oracle.OraclePlatform" />
			</bean>
		</property>
		<property name="loadTimeWeaver">
			<bean class="com.test.springmvc.util.MyClassLoader" />
		</property>
	</bean>

	<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>
	
	<!-- Dao的实现 -->
	<bean id="userDao" class="com.test.springmvc.dao.impl.UserDaoImpl">
		<property name="entityManagerFactory" ref="entityManagerFactory" />
	</bean>


</beans>   
 


 
 

4. persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
    http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
	version="1.0">
	<persistence-unit name="invoice">
		<provider>org.hibernate.ejb.HibernatePersistence</provider>
		<class>com.test.springmvc.bean.User</class>
		<!-- <properties>
			<property name="hibernate.connection.driver_class" value="oracle.jdbc.driver.OracleDriver" />
			<property name="hibernate.connection.url" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl" />
			<property name="hibernate.connection.username" value="invoice" />
			<property name="hibernate.connection.password" value="invoice" />
			<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
			<property name="hibernate.show_sql" value="true" />
			<property name="hibernate.hbm2ddl.auto" value="update" />
		</properties> -->

	</persistence-unit>
</persistence> 


第二步:页面  index.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core"%>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<!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>welcome Page</title>
</head>
<body>
	<form:form action="./user.htm?method=login" method="post">
		<table align="center">
			<tr>
				<td><font color="red"> ${msg } </font></td>
			</tr>
			<tr>
				<td>username: 
					<%-- <spring:bind path="user.userName"></spring:bind> --%>
					<%-- <form:input path="userName" /></td> --%>
					<input name="userName">   <%--userName 是POJO中的属性--%>
			</tr>
			<tr>
				<td>password: 
					<%-- <spring:bind path="user.userPassword"></spring:bind>--%>
					<%-- <form:input path="userPassword" /> --%>
					<input name="userPassword">	<%--userPassword 是POJO中的属性--%>
				</td>
			</tr>

			<tr>
				<td><input id="submit" type="submit" value="submit" /></td>
				<td><input id="reset" type="reset" value="reset" /></td>
			</tr>
		</table>
	</form:form>


	<br />
	<form action="./user.htm?method=login" method="post">
		<table>
			<tr>
				<td><input id="submit" type="submit" value="login" /></td>
				<td><input id="reset" type="reset" value="reset" /></td>
			</tr>
			<tr>
				<td><a href="./user.htm?method=add">add</a>
				</td>
			</tr>
		</table>
	</form>

</body>
</html>


第三步:MultiActionController子类 

package com.test.springmvc.controller;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

import com.test.springmvc.bean.User;
import com.test.springmvc.service.UserService;

public class UserFormController extends MultiActionController {

	
	public UserFormController() {

	}

	public ModelAndView login(HttpServletRequest req, HttpServletResponse resp) throws Exception {
		System.out.println("***********in login method*******************");
		/**
		 * 以下两句的作用是将 req 中的参数绑定到 POJO User中去
		 */
		User user = (User) newCommandObject(User.class);
		bind(req, user);

//		User user = (User) command;
		if (user != null) {
			System.out.println("********user is not null**********");
			System.out.println("********username is:****"+user.getUserName());
		}

		String msg = "Well Done, this is very important task you finished";

		ModelAndView modelAndView = new ModelAndView("main");
		modelAndView.addObject("msg", msg);
		return modelAndView;
		
	}

	public ModelAndView add(HttpServletRequest request,
			HttpServletResponse response) throws Exception {

		System.out.println("***********in add method*******************");
		return null;

	}

}



第四步: POJO  (User.java) 

package com.test.springmvc.bean;

import java.io.Serializable;
import javax.persistence.*;


/**
 * The persistent class for the user database table.
 * 
 */
@Entity
public class User implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	@Column(name="user_id")
	private int userId;

	@Column(name="user_name")
	private String userName;

	@Column(name="user_password")
	private String userPassword;

    public User() {
    }

	public int getUserId() {
		return this.userId;
	}

	public void setUserId(int userId) {
		this.userId = userId;
	}

	public String getUserName() {
		return this.userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getUserPassword() {
		return this.userPassword;
	}

	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}

}


至此,整个应用的流程已经走完。


===============================总结==============================

想要在MultiActionController中使用Command,在网上有很多,但是都不能work。经过这次配置,总结起来,关键的是两点:


1. 在Page中form中的数据name为POJO的属性 (文中为User的属性)


2. 在MultiActionController的子类中,

首先 使用newCommandObject(Class)方法创建Command对象

然后 调用MultiActionController的bind(request,Command)方法,将request中的数据绑定到command中



你可能感兴趣的:(spring,String,user,command,Class,encoding)