接触struts也有两个礼拜了,经历了一开始完全的不理解,到看书对struts有了一定的认识,然<personname w:st="on" productid="后又被"></personname>后又被老师的一堆很烂的例子搞到头大,然后努力拜托那些烂题的阴影后自己找寻出路,到自己用struts做Web层,做出一个完整的CURD的程序来,算是对struts有了更全面的了解。
Struts涉及到最基本的几个东西是 ActionServlet,ActionForm,Action,Form(JSP页面),web.xml,struts-config.xml。ActionServlet虽然是核心的控制,但是我们并没有从他上面做扩展,通常我们在web.xml里面这么配置:
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/struts-config.xml</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
这样的话,我们就把*.do的http请求转到ActionServlet处理,ActionServlet读取struts-config.xml中的内容。
ActionForm实际上是一种Java Bean,拥有一些 get/set 访问器,我们可以 extends 这个类,使之拥有与 JSP 文件中的 struts 的 HTML Tag 对应的 property ,这样的话struts 便会自动把相应页面的表单内容取出来,set 到对应的 ActionForm中去。
我们可以这样配置来使用 Action Form:
<struts-config>
<form-beans>
<form-bean name="AttributeActionForm" type=" dynaattribute.struts.AttributeActionForm"/>
</form-beans>
</struts-config>
与之对应的 Action 是这么写的:
<action-mappings>
<action path = "/AttributeAdd"
type = " dynaattribute.struts.AttributeAddAction"
name = "AttributeActionForm"
scope = "request"
input = "/admin/attribute_add.jsp"
validate = "true">
<forward name="Done" path="/admin/done.jsp" />
<forward name="ErrorBack" path="/admin/attribute_add.jsp"/>
</action>
</action-mappings>
如果我们在 struts-config.xml 中配置了验证(红色标记部分),在 ActionForm 获取了页面提交的值后,会执行 ActionForm 中的 validate() 方法,该方法执行验证操作,验证失败,则返回 JSP 页面,并 return ActionErrors,验证成功,便创建一个 Action 对象,并执行其execute() 方法。
我的一个 validate() 方法是这么写的:
public ActionErrors validate(ActionMapping mapping,
HttpServletRequest request)
{
ActionErrors errors = new ActionErrors();
if (attributeName == null || attributeName.trim().length() == 0
|| subject == null || subject.trim().length() == 0
|| attributeType == null || attributeType.trim().length() == 0
|| length == 0)
errors.add("attributeName", new ActionError(
"attribute.jsp.error.fieldblank"));
if (length > 50 || length < 0)
errors.add("length", new ActionError(
"attribute.jsp.error.lengthtoolong"));
return errors;
}
我们也可以 extends Action这个类,用于对 Model 进行操作,比如存取数据啊,对数据进行一定的逻辑处理啊。如我们可以获取 ActionForm Bean 中的值,用一个DTO 传递给 Business Layer 执行相应的业务逻辑操作。这样 Web Tier 才彻底的独立出来,仅仅负责从 Web 表单取数据的操作。
虽然说 Action Form 是一个 Bean,而 DTO 也是一个 Bean,但我们通常不用 ActionForm Bean 作为 DTO,将数据传递至中间层,因为 ActionForm 依赖 Servlet 的 API,但中间层不需要这些 API,为了减小耦合,应该使用普通的 Java Bean,而不是ActionForm Bean作为 DTO。
虽然我们可以通过 extends ActionForm 来建立和 JSP 之间的关联,但每个页面都扩展一个 ActionForm 确实很不爽,我们可以使用 DynaActionForm ,这样的话,我们只需要在 struts-config.xml中配置DynaActionForm 具有的 property ,就可以了,使用 DynaActionForm 进行验证的话,就要 extends DynaActionForm,并 overrided 其 validate() 方法了,这样也还是不爽,我们还可以使用 Apache 的 Validate 框架执行验证,只需要通过一些配置文件就可以完成了。
我是这么配置 DynaActionForm的:
<form-bean name="searchObjectActionForm" type="org.apache.struts.action.DynaActionForm">
<form-property name="searchObject" type="java.lang.String"/>
</form-bean>