1 概述
Struts框架中的控制器角色是由一个中心servlet类和众多的Action类合作扮演的。中心Servlet类为控制器提供中心控制点来初步处理多有的用户请求,并选择一个Action来处理具体的业务逻辑,或者本身实现一定的业务逻辑,并决定下一步向用户返回哪一个视图组件。
在Struts框架包中,中心Servlet的默认实现是org.apache.struts.action.ActionServlet 类。
2 Struts初始化过程
从加载ActionServlet开始,当ActionServlet接收到一个用户请求时候,会执行以下流程。
(1) 检索和用户请求相匹配的ActionMapping实例。
(2)如果为ActionMapping配置了form ,则获取对应范围内的ActionForm实例,如果ActionFrom不存在,就创建一个,把客户提交的表单数据保存到ActionFrom中。
(3)根据ActionMapping的配置信息决定是否验证表单。
(4)ActionServlet根据ActionMapping实例包含的映射信息决定将请求转发给哪个Action。
(5)Action的execute()方法返回一个ActionForward对象,ActionServlet将请求转发到这个ActionForward对象指向的组件,通常是一个jsp或者害是其他的Action 。
3 Actionservlet类
4 Action类
用户请求和业务逻辑之间的桥梁, 每个Action负责处理不同的请求,每个Action都要实现execute()方法。
有些大牛在action中使用了门面模式使action中的代码十分简洁。 Action类的实例是线程安全的,Struts为每个Action类只创建一个实例,所有的用户共享一个实例,并且所有的请求可以同时执行Action实例的execute()方法。
(2)支持多线程的Action类
在Struts 的生命周期中,为每个Action类创建一个单独的Action实例。每个用户请求共享一个实例,因此必须保证Action类在多线程环境中正确运行。
5 ActionForward 类
该类代表了web 的资源抽象,典型的web资源是一个jsp页面或者是servlet,也可以是另外一份Action ,创建该类的对象有两种方式。
(1 )
return new ActionForward("Success" , "/shop/listOrder.jsp");
(2) 在配置文件中配置<forward>元素。
6 Struts预定义的Action类
(1) ForwardAction类 和 InclucdeAction 类
ForwardAction 类实现的功能类似于jsp动作<jsp:forward>,都是将请求转发到其他的web组件。
当仅仅需要从一个jsp页面到另一个jsp页面的请求转发操作时,并不一定需要一个真正的Action,这时可以考虑在Struts内建一个实现了 forward功能的ForwardAction类。 该类仅仅是转发,没有其他的业务请求。
(2) DispatchAction类 和 LookupDispatchAction 类
DispatchAction类 通常在Action类中只完成一个业务操作,如果在一个Action类中完成一组紧密相关的业务操作,可是使用DispatchAction类。可以通过创建一个DispatchAction类的子类,来执行一组业务相关的操作。(实质为一个分发action)
创建一个扩展DispatchAction类的子类时候,不必覆盖execute()方法,而是创建一些一些实现具体业务操作的方法。这些方法与execute()方法有着一样的参数和返回值,以及可能抛出的异常。但是在配置DispatchAction时需要指定parameter属性为method ,用以指明调用的方法。
(3)LookDispatchAction
LookDispatchAction 类是DispatchAction类的一个子类,在LookDispatchAction 类中也可以定义多种利用业务的方法,每种方法的调用都是由配置文件中的一个特殊请求参数的值决定的。两者之间的不同之处在于,DispatchAction利用请求参数的值确定调用哪种方法,而KookupDispatchAction利用请求参数值,反向查询资源绑定,并将它们与类中的一种方法绑定。通常LookupDispatchAction用于在多个同名提交按钮的场合。如两个按钮具有相同的actionz,但是每个按钮的value值不同,每个按钮就将映射到不同的方法。
1 首先在资源文件中定义使用到得键值
如 test.add = add , test.remove = remove 。
2 创建一个LookupDispatchAction 类的子类。
扩展LookDispatchAtion类,需要实现 getKeyMethodMap()方法,这种方法返回一个Map类的对象,
LookupDisaptchAction就是从这个Map对象中查找与按钮名称对应的方法。
/*
* Generated by MyEclipse Struts
* Template path: templates/java/JavaClass.vtl
*/
package cn.bupt.duming.struts.action;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.LookupDispatchAction;
import cn.bupt.duming.struts.form.LoginForm;
/**
* MyEclipse Struts
* Creation date: 02-25-2010
*
* XDoclet definition:
* @struts.action path="/testLook" name="loginForm" parameter="method" scope="request" validate="true"
*/
public class TestLookAction extends LookupDispatchAction {
/*
* Generated Methods
*/
/**
* Method execute
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward add(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
return null;
}
public ActionForward remove(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
LoginForm loginForm = (LoginForm) form;// TODO Auto-generated method stub
return null;
}
@Override
protected Map getKeyMethodMap() {
// TODO Auto-generated method stub
Map map = new HashMap() ;
map.put("test.add", "add") ;
map.put("test.remove", "remove") ;
return map ;
}
}
3 编写jsp页面代码。。
注意submit中的元素 property 值应该和action中的parameter相一致
<html:form action="/testLook.do" method="post">
<html:submit property = "method">
<bean:message key="test.add"/>
</html:submit>
<html:submit property = "method">
<bean:message key="test.remove"/>
</html:submit>
</html:form>
经过上面三个步骤即完成了LookUpDispatchAction的创建。。。
7