今天开始写Spring的了。感觉Spring和Struts差不多,不过Spring更为灵活。用Spring来代管Struts很方便,而且好用。不多说了,开始吧。

       
现在介绍的是SimpleFormController。这个类是用来处理输入中的表单输入的。不多说,直接看例子。

       
今天来介绍一下Spring的AbstractCommandController。Spring的Controller有很多选择,在你的应用中选择最合适的一个将会让你事半功倍。Spring
Controller有一个自上而下的等级分类,基本上是从简单到复杂:

        环境:jdk1.5, Eclipse3.2, Tomcat5.5, 以及Spring1.2的包。

        环境同以前的Spring例子。

        Controller,
AbstractController–>ThrowawayController–>MultiActionController–>BaseCommandController,
AbstractCommandController–>AbstractFormController,
SimpleFormController–>AbstractWizardFormController

       
Spring框架也采用的是一个前端控制器,即DispatcherServlet。符合url-pattern的所有请求都会先送到这个控制器,再由这个控制器转发给不同的控制器来处理各个请求。我们先来配置web.xml。

        首先是web.xml:

       
如果Controller中不需要处理逻辑事务,或者只需要少量的功能,大都可以继承AbstractController。如果需要处理请求中的输入,那么可以继承AbstractCommandController。这就是今天要介绍的内容。注意,环境参照Spring的简单例子。

        web.xml:

<?xml version=”1.0″ encoding=”UTF-8″?>

        首先,我们编写一个index.jsp:

<?

<web-app id=”WebApp_ID” version=”2.4″
xmlns=””
xmlns:xsi=””
xsi:schemaLocation=”
;

<%@

xml version=”1.0″ encoding=”UTF-8″?>

      <servlet>

page language=”java” contentType=”text/html; charset=ISO-8859-1″

<

            <servlet-name>test</servlet-name>

pageEncoding=”ISO-8859-1″%>

web-app id=”WebApp_ID” version=”2.4″
xmlns=””
xmlns:xsi=””
xsi:schemaLocation=”
;

     
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<!

<servlet>

           <load-on-startup>1</load-on-startup>

DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>

<servlet-name>test</servlet-name>

      </servlet>

<

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

 

html>

<load-on-startup>1</load-on-startup>

    <servlet-mapping>

<

</servlet>

        <servlet-name>test</servlet-name>

head>

<servlet-mapping>

        <url-pattern>*.do</url-pattern>

<

<servlet-name>test</servlet-name>

    </servlet-mapping>

meta. http-equiv=”Content-Type” content=”text/html;
charset=ISO-8859-1″>

<url-pattern>*.do</url-pattern>

 

<

</servlet-mapping>

      <display-name>

title>Index Page</title>

<display-name>

      SpringTest</display-name>

</

SpringTest

      <welcome-file-list>

head>

</display-name>

            <welcome-file>index.html</welcome-file>

<

<welcome-file-list>

            <welcome-file>index.htm</welcome-file>

body>

<welcome-file>index.html</welcome-file>

            <welcome-file>index.jsp</welcome-file>

<

<welcome-file>index.htm</welcome-file>

            <welcome-file>default.html</welcome-file>

center>

<welcome-file>index.jsp</welcome-file>

            <welcome-file>default.htm</welcome-file>

<

<welcome-file>default.html</welcome-file>

            <welcome-file>default.jsp</welcome-file>

form. action=”user.do” method=”post”>

<welcome-file>default.htm</welcome-file>

      </welcome-file-list>

Username:

<welcome-file>default.jsp</welcome-file>

</web-app>

<input type=”text” name=”username” /><br/>

</welcome-file-list>

        然后是在/WEB-INF/jsp/下创建一个form.jsp:

Password:

</

<%@ page language=”java” contentType=”text/html; charset=ISO-8859-1″

<input type=”password” name=”password” /><br/>

web-app>

    pageEncoding=”ISO-8859-1″%>

<

       
在这里,我们给DispatcherServlet取名为test,那么,在WEB-INF下,应该有一个名为test-servlet.xml的配置文件。所有以.do结尾的请求将会由test-servlet来分发处理。

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>

input type=”submit” value=”Submit” />

        然后,我们来写一个简单的index.jsp:

<html>

</

<%@

<head>

form>

page language=”java” contentType=”text/html; charset=ISO-8859-1″

<meta. http-equiv=”Content-Type” content=”text/html;
charset=ISO-8859-1″>

</

pageEncoding=”ISO-8859-1″%>

<title>Form. Page</title>

center>

<!

</head>

</

DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>

<body>

body>

<

<center>

</

html>

<form. action=”user.do” method=”post”>

html>

<

Username:<input type=”text” name=”username” /><br/>

        这里我们要接收username和password两个参数。

head>

Password:<input type=”password” name=”password” /><br/>

        然后配置web.xml:

<

<input type=”submit” value=”Submit” />

<?

meta. http-equiv=”Content-Type” content=”text/html;
charset=ISO-8859-1″>

</form>

xml version=”1.0″ encoding=”UTF-8″?>

<

</center>

<

title>Index Page</title>

</body>

web-app id=”WebApp_ID” version=”2.4″
xmlns=””
xmlns:xsi=””
xsi:schemaLocation=”
;

</

</html>

<servlet>

head>

        同样需要输入username和password两个属性。

<servlet-name>test</servlet-name>

<

        在src下面写一个User类:

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

body>

package src;

<load-on-startup>1</load-on-startup>

<

 

</servlet>

center>

public class User {

<servlet-mapping>

<

      private String username;

<servlet-name>test</servlet-name>

form. action=”home.do” method=”post”>

      private String password;

<url-pattern>*.do</url-pattern>

Name:

     

</servlet-mapping>

<input type=”text” name=”name” /><br/>

      public User(){

<display-name>

<

           

SpringTest

input type=”submit” value=”Submit” />

      }

</display-name>

</

     

<welcome-file-list>

form>

      public String getPassword() {

<welcome-file>index.html</welcome-file>

</

            return password;

<welcome-file>index.htm</welcome-file>

center>

      }

<welcome-file>index.jsp</welcome-file>

</

      public void setPassword(String password) {

<welcome-file>default.html</welcome-file>

body>

            this.password = password;

<welcome-file>default.htm</welcome-file>

</

      }

<welcome-file>default.jsp</welcome-file>

html>

      public String getUsername() {

</welcome-file-list>

       
这里就是一个简单的form,提交一个name属性。需要注意这里的action,是以.do结尾的,跟Struts很像,不过并没有以”/”开头。

            return username;

</

        然后,我们来写一个控制器来处理这个请求。

      }

web-app>

        HomeController.java:

      public void setUsername(String username) {

        test-servlet.xml:

package

            this.username = username;

<?

src;

      }

xml version=”1.0″ encoding=”UTF-8″?>

import

     

<!

javax.servlet.http.HttpServletRequest;

}

DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN”
“;

import

        然后写一个UserFormController.java:

<

javax.servlet.http.HttpServletResponse;

package src;

beans>

import

 

<bean name=”/user.do” class=”src.UserCommandController”>

org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.ModelAndView;

<property name=”page”>

import

import org.springframework.web.servlet.mvc.SimpleFormController;

<value>user</value>

org.springframework.web.servlet.mvc.Controller;

 

</property>

public

public class UserFormController extends SimpleFormController{

</bean>

class HomeController implements Controller{

      public UserFormController(){

<bean id=”viewResolver”
class=”org.springframework.web.servlet.view.InternalResourceViewResolver”>

private String greeting;

            setCommandClass(User.class);

<property name=”prefix”>

public String getGreeting() {

      }

<value>/WEB-INF/jsp/</value>

return greeting;

     

</property>

}

      public ModelAndView onSubmit(Object command) throws Exception{

<property name=”suffix”>

public void setGreeting(String greeting) {

            User user = (User)command;

<value>.jsp</value>

this.greeting = greeting;

            String username = user.getUsername();

</property>

}

            String password = user.getPassword();

</bean>

public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response)

            if(username.equals(“Jim”)&&password.equals(“12345”)){

</

throws Exception{

                  return new ModelAndView(getSuccessView(), “info”,
user);

beans>

greeting = request.getParameter(“name”);

            }else{

        我们先写一个User类,可以看成User Bean(User.java):

return new ModelAndView(“home”, “message”, greeting);

                  return new ModelAndView(getFormView());

package

}

            }

src;

}

      }

public

       
Spring的控制器要求返回一个ModelAndView对象,即需要返回一个视图或其逻辑名称。其中包含了处理后的一些数据。这里的数据就是简单的返回一个name属性。在return语句中,new
ModelAndView()有三个参数,第一个参数是返回视图的逻辑名称,第二个是该视图中的一个变量,第三个是该变量的值。我们将index.jsp中的name传递给了home视图中的message变量。

}

class User {

        下面就是test-servlet.xml:

       
这里面,我们继承了SimpleFormController类,并且覆盖了onSubmit()方法,因为需要在成功的页面显示输入的数据。如果不需要显示的话,覆盖doSubmitAction()方法就可以了。SimpleFormController类有两个方法:getSuccessView()方法返回成功后的视图名,而getFormView()方法返回需要重新输入的视图名。其中,successView和formView两个属性稍后在test-servlet.xml中配置。

private String username;

<?

        下面就是test-servlet.xml:

private String password;

xml version=”1.0″ encoding=”UTF-8″?>

<?xml version=”1.0″ encoding=”UTF-8″?>

public User(){

<!

<!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN”
“;

}

DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN”
“;

<beans>

public String getPassword() {

<

<bean name=”/user.do” class=”src.UserFormController”>

return password;

beans>

            <property name=”successView”>

}

<bean name=”/home.do” class=”src.HomeController”>

                  <value>user</value>

public void setPassword(String password) {

</bean>

            </property>

this.password = password;

<bean id=”viewResolver”
class=”org.springframework.web.servlet.view.InternalResourceViewResolver”>

            <property name=”formView”>

}

<property name=”prefix”>

                  <value>form</value>

public String getUsername() {

<value>/WEB-INF/jsp/</value>

            </property>

return username;

</property>

      </bean>

}

<property name=”suffix”>

     

public void setUsername(String username) {

<value>.jsp</value>

      <bean id=”viewResolver”
class=”org.springframework.web.servlet.view.InternalResourceViewResolver”>

this.username = username;

</property>

            <property name=”prefix”>

}

</bean>

                  <value>/WEB-INF/jsp/</value>

}

</

            </property>

       
这里也就两个属性即username和password,同时还有相应的get和set方法。

beans>

            <property name=”suffix”>

        然后就是UserCommandController.java:

       
这里我们采用的是InternalResourceViewResolver,prefix属性表示前缀为/WEB-INF/jsp/,suffix表示后缀为.jsp。那么,视图将会在符合这两个条件的情况下寻找跟ModelAndView中视图逻辑名一样的视图返回给用户。这里要返回的就是/WEB-INF/jsp/home.jsp。注意第一个bean,表示home.do请求由src.HomeController来处理。这个是Spring默认的映射方式即BeanNameUrlHandlerMapping。

                  <value>.jsp</value>

package

        下面就是写/WEB-INF/jsp/下的home.jsp了:

            </property>

src;

<%@

      </bean>

import

page language=”java” contentType=”text/html; charset=ISO-8859-1″

     

java.util.ArrayList;

pageEncoding=”ISO-8859-1″%>

</beans>

import

<!

       
当验证成功,即username为Jim,password为12345时,我们将看到user.jsp,如果失败,则返回到form.jsp重新输入。

java.util.List;

DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>

        下面就是user.jsp:

import

<

<%@ page language=”java” contentType=”text/html; charset=ISO-8859-1″

javax.servlet.http.HttpServletRequest;

html>

    pageEncoding=”ISO-8859-1″%>

import

<

<!DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>

javax.servlet.http.HttpServletResponse;

head>

<html>

import

<

<head>

org.springframework.validation.BindException;

meta. http-equiv=”Content-Type” content=”text/html;
charset=ISO-8859-1″>

<meta. http-equiv=”Content-Type” content=”text/html;
charset=ISO-8859-1″>

import

<

<title>User Information Page</title>

org.springframework.web.servlet.ModelAndView;

title>Home Page</title>

</head>

import

</

<body>

org.springframework.web.servlet.mvc.AbstractCommandController;

head>

<center>

public

<

<b>Welcome ${info.username }!</b><br/>

class UserCommandController extends AbstractCommandController{

body>

<b>Your password is:${info.password }</b>

private String page;

<

</center>

public UserCommandController(){

center>

</body>

setCommandClass(User.

<

</html>

class);

h2>${message }</h2>

       
这里我们可以将用户信息显示出来。注意user.jsp和form.jsp都放在/WEB-INF/jsp/下面。这个例子就完成了。

}

</

 

public ModelAndView handle(HttpServletRequest request,

center>

HttpServletResponse response,

</

Object command,

body>

BindException errors)

</

throws Exception{

html>

User user = (User)command;

       
我们将这个jsp作为一个视图,同时显示出message这个值,这个例子就完成了。

String username = user.getUsername();

String password = user.getPassword();

List list =

new ArrayList();

list.add(0, username);

list.add(1, password);

return new ModelAndView(getPage(), “info”, list);

}

public String getPage() {

return page;

}

public void setPage(String page) {

this.page = page;

}

}

       
这个控制器要处理输入的username和password(很简单),不像在Struts中必须要继承ActionForm。该类有一个要覆盖的handle()方法。在handle()方法中,command就是输入的一个对象,这里需要先转化为User类,并调用相应的方法得到username和password两个参数。然后放到一个list里面,再调用getPage()方法传回到指定的视图去。这个视图名则在test-servlet.xml中指明了为user。这里我们可以看出Spring框架的灵活性。要修改映射或者指定视图等的话只要在配置文件里面修改就可以了,而不用修改源程序。

        那么接下来就是user.jsp:

<%@

page language=”java” contentType=”text/html; charset=ISO-8859-1″

pageEncoding=”ISO-8859-1″%>

<!

DOCTYPE HTML PUBLIC “-//W3C//DTD HTML 4.01 Transitional//EN”>

<

html>

<

head>

<

meta. http-equiv=”Content-Type” content=”text/html;
charset=ISO-8859-1″>

<

title>User Information Page</title>

</

head>

<

body>

<

center>

<

h1>Your username is:${info[0] }</h1><br/>

<

h1>Your password is:${info[1] }</h1>

</

center>

</

body>

</

html>

        这里就把刚刚的username和password显示了出来。

       
处理简单的输入可以采用AbstractCommandController,就像这个例子一样。可以根据实际情况增加相应的代码来满足不同的需求。

       
当然,处理表单还有SimpleFormController和AbstractFormController,以后会讲这类控制器的例子。