集成Struts组件
我们来看Struts是如何将这三层的组件组合在一起构成完整的应用。Struts应用用struts-config.xml来完成配置。这个配置文件包含了应用的所有可配置信息,包括:
1>要用到的
controller
2>ActionForms和他们对应的HTML forms
3>Actions
4>ActionMappings,它控制应用的整个功能流转
struts-config.xml的重要配置元素都包含在<struts-config>标识下。
配置ActionForm对象:
以上配置声明一个"logonForm"的表单,接着说明需要用com.samjdalton.struts.LogonForm class来完成该表单设置。
下一步,我们声明ActionMappings。
这段配置声明了我们应用中的三个action。前两个(/Login 、/Welcome)很简单,他们的前向都是JSP页面。第三个复杂一些,它在一个表单提交时被调用,它创建一个利用logonForm 元素构建的ActionForm,然后调用LoginAction类来处理信息。我们可以看到两个<forward>元素,这些定义了应用的功能流转控制。应用参考他们的名字(成功或者失败),然后控制被交到相关资源。
实例学习Struts
简单看过了Struts的组成及组装,现在来实现一个简单的应用,它实现与本文开头例子中相同的功能,即用户登陆并显示欢迎信息。
应用中的view由2个简单JSP构成,第一个为登陆页,如下:
这个与不用Struts的例子中的页面非常类似,不同之处仅仅是用Struts <html> tags定义了表单和调用的Action是配置中定义的"/ProcessLogin"。表单提交后相应的ActionForm将被创建,同时相应的action被调用处理该输入。我们还可以看到<html:errors> tag被用到,这个是为了自动显示表单中定义的校验错误信息(下面将提到)。
第二个JSP如下:
本页简单地显示了一个命名为"loginForm"的ActionForm bean的一个属性(username).
接着是controller层。controller层由ActionForm、Action两个类实现。ActionForm类很简单,主要是对应model(本例中是一个简单的JavaBean对象)。
Action类用上面的ActionForm从view获得信息,并且修改model状态。
Action类代码如下:
可以看到,action检查用户在username、password是否输入了"sam"、"password"。如果输入正确,action指明要调用的下一个view。
action类还包含一个方法:validate。本例中,validate方法检查username 和password的输入,如果输入有误,返回错误信息。这些错误信息包含在一个资源文件(为了支持国际化)中,该文件信息在配置文件中被配置。
应用的model是一个不包含持续逻辑的标准JavaBean对象,如下所示:
应用的struts-config.xml配置文件:
大多数文件与上例所示相同,仅有的区别是<message-resources> tag。此tag允许我们具体化应用代码中的string类型,好处是容易国际化。上例中,资源包含在名字为"ApplicationResources.properties"的文件中,它必须存在于应用的classpath(万无一失的方法是将它配置到你的WEB-INF/classes路径下)。
配置成功后,IE中输入如下URL(Tomcat):
http://localhost:8080/<war-file-name>/Login.do
应用运行的显示结果如下:

The login page

The welcome page

The error page
小结
本文中,我们先介绍了MVC模式,用两种技术完成可一个MVC模式的简单实现,包括Struts,这项可以开发更灵活、扩展性更强的基于MVC模式的Web应用。显然这已经远远超出了Struts所覆盖的。
我们来看Struts是如何将这三层的组件组合在一起构成完整的应用。Struts应用用struts-config.xml来完成配置。这个配置文件包含了应用的所有可配置信息,包括:
1>要用到的
controller
2>ActionForms和他们对应的HTML forms
3>Actions
4>ActionMappings,它控制应用的整个功能流转
struts-config.xml的重要配置元素都包含在<struts-config>标识下。
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config> |
配置ActionForm对象:
<form-beans> <form-bean name="logonForm" type="com.samjdalton.struts.LogonForm"/> </form-beans> |
以上配置声明一个"logonForm"的表单,接着说明需要用com.samjdalton.struts.LogonForm class来完成该表单设置。
下一步,我们声明ActionMappings。
<action-mappings> <action path="/Login" forward="/login.jsp"/> <action path="/Welcome" forward="/welcome.jsp"/> <action path="/ProcessLogin" type="com.samjdalton.struts.LoginAction" name="logonForm" scope="request" validate="true" input="/Login.do"> <forward name="success" path="/Welcome.do"/> <forward name="failure" path="/Logon.do"/> </action> </action-mappings> |
这段配置声明了我们应用中的三个action。前两个(/Login 、/Welcome)很简单,他们的前向都是JSP页面。第三个复杂一些,它在一个表单提交时被调用,它创建一个利用logonForm 元素构建的ActionForm,然后调用LoginAction类来处理信息。我们可以看到两个<forward>元素,这些定义了应用的功能流转控制。应用参考他们的名字(成功或者失败),然后控制被交到相关资源。
实例学习Struts
简单看过了Struts的组成及组装,现在来实现一个简单的应用,它实现与本文开头例子中相同的功能,即用户登陆并显示欢迎信息。
应用中的view由2个简单JSP构成,第一个为登陆页,如下:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <html:html> <head></head> <body bgcolor="white"> <html:errors/> <html:form action="/ProcessLogin"> <table border="0" width="100%"> <tr> <td> Username: </td> <td> <html:text property="username"/> </td> </tr> <tr> <td> Password: </td> <td> <html:password property="password"/> </td> </tr> <tr> <td> <html:submit/> </td> <td>   </td> </tr> </table> </html:form> </body> </html:html> |
这个与不用Struts的例子中的页面非常类似,不同之处仅仅是用Struts <html> tags定义了表单和调用的Action是配置中定义的"/ProcessLogin"。表单提交后相应的ActionForm将被创建,同时相应的action被调用处理该输入。我们还可以看到<html:errors> tag被用到,这个是为了自动显示表单中定义的校验错误信息(下面将提到)。
第二个JSP如下:
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <html:html> <h1>Welcome <bean:write name="loginForm" property="username" /></h1> </html:html> |
本页简单地显示了一个命名为"loginForm"的ActionForm bean的一个属性(username).
接着是controller层。controller层由ActionForm、Action两个类实现。ActionForm类很简单,主要是对应model(本例中是一个简单的JavaBean对象)。
package com.samjdalton.struts; import org.apache.struts.action.ActionForm; public class LoginForm extends ActionForm { private LoginBean bean; public LoginForm() { this.bean=new LoginBean(); } public LoginForm(LoginBean bean) { this.bean = bean; } public void setUsername(String username) { bean.setUsername(username); } public String getUsername() { return bean.getUsername(); } public void setPassword(String password) { bean.setPassword(password); } public String getPassword() { return bean.getPassword(); } } |
Action类用上面的ActionForm从view获得信息,并且修改model状态。
Action类代码如下:
package com.samjdalton.struts; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForm; public class LoginAction extends Action { public ActionForward execute(ActionMapping actionMapping, ActionForm actionForm, javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception { // check the username LoginForm form = (LoginForm) actionForm; if (form.getUsername().equalsIgnoreCase("sam") && form.getPassword().equals("password")) { // we are in return actionMapping.findForward("success"); } else { // not allowed return actionMapping.findForward("failure"); } } public ActionErrors validate(ActionMapping actionMapping HttpServletRequest httpServletRequest) { ActionErrors errors = new ActionErrors(); if ( getUsername() == null || getUsername().length() < 1 ) { errors.add("name",new ActionError("error.name.required")); } if ( getPassword() == null || getPassword().length() < 1 ) { errors.add("pw",new ActionError("error.pw.required")); } return errors; } |
可以看到,action检查用户在username、password是否输入了"sam"、"password"。如果输入正确,action指明要调用的下一个view。
action类还包含一个方法:validate。本例中,validate方法检查username 和password的输入,如果输入有误,返回错误信息。这些错误信息包含在一个资源文件(为了支持国际化)中,该文件信息在配置文件中被配置。
应用的model是一个不包含持续逻辑的标准JavaBean对象,如下所示:
package com.samjdalton.struts; public class LoginBean { private String username; private String password; public void setUsername(String username) { this.username=username; } public String getUsername() { return username; } public void setPassword(String password) { this.password = password; } public String getPassword() { return password; } } |
应用的struts-config.xml配置文件:
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://jakarta.apache.org/struts/dtds/struts-config_1_2.dtd"> <struts-config> <form-beans> <form-bean name="loginForm" type="com.samjdalton.struts.LoginForm"/> </form-beans> <action-mappings> <action path="/Login" forward="/login.jsp"/> <action path="/Welcome" forward="/welcome.jsp" name="loginForm" scope="request"/> <action path="/ProcessLogin" type="com.samjdalton.struts.LoginAction" name="loginForm" scope="request" validate="true" input="/Login.do"> <forward name="success" path="/Welcome.do"/> <forward name="failure" path="/Login.do"/> </action> </action-mappings> <message-resources parameter="ApplicationResources" null="false" /> </struts-config> |
大多数文件与上例所示相同,仅有的区别是<message-resources> tag。此tag允许我们具体化应用代码中的string类型,好处是容易国际化。上例中,资源包含在名字为"ApplicationResources.properties"的文件中,它必须存在于应用的classpath(万无一失的方法是将它配置到你的WEB-INF/classes路径下)。
配置成功后,IE中输入如下URL(Tomcat):
http://localhost:8080/<war-file-name>/Login.do
应用运行的显示结果如下:

The login page

The welcome page

The error page
小结
本文中,我们先介绍了MVC模式,用两种技术完成可一个MVC模式的简单实现,包括Struts,这项可以开发更灵活、扩展性更强的基于MVC模式的Web应用。显然这已经远远超出了Struts所覆盖的。