一、Struts初始化过程:
Struts的启动通常从加载ActionServlet类开始。Web容器首次启动时,Struts应用的第一个请求会加载ActionServlet类,ActionServlet类第一次被加载后,其init()方法将被自动调用。在init()方法中,Struts执行所有必要的初始化工作。
Struts程序执行过程总结:表单-->提交给ActionServlet-->调用ActionForm存储表单信息(在struts-config.xml文件中,根据<action-mapping>元素的<action>子元素找与ActionServlet相应的ActionForm)-->根据ActionServlet的mapping.findForward跳转页面(在struts-config.xml文件中,根据<forward>的path跳转到指定的页面)。
二、ActionServlet使用ActionForm来保存网页中请求的参数,这些ActionForm类中的属性名称与网页中请求参数中的名称要相同。
实际上,ActionForm就是一个简单的JavaBean,用于保存用户输入的数据。在struts-config.xml文件中使用<form-beans>子元素
来声明ActionForm。如下:
<form-beans>
<form-bean name="userform" type="com.actionForm.UserForm"/>
</form-beans>
三、struts-config.xml配置文件的代码及说明:
配置代码:
<struts-config>
<form-beans>
<form-bean name="rightForm" type="form.UserInfoForm" />
</form-beans>
<action-mapping>
<action name="rightForm" path="/rightAction" parameter="method"
scope="request" type="com.action.RightAction" validate="true" input="/index.jsp" forward="/sunnces.jsp">
<forward name="insertRight" path="/index.jsp"/>
<forward name="selectRight" path="/selectRight.jsp"/>
</action>
</action-mapping>
</struts-config>
说明:
1。以下是<action>的主要属性介绍。
path:和Action类匹配的请求页面相对路径,不包括后缀(如".do"),该相对路径必须以"/"开头。
type:指定处理请求的Action类,必须是包含完整路径的包(package)路径的类名称。(type即为包含name的Action)
name:指定要用到的ActionForm类的名称,该类的名称必须在<form-beans>元素声明过。
scope:ActionForm实例的使用范围,默认为session范围内。
input:表单验证出错时要转向的错误处理页面。
validate:指定是否自动调用ActionForm类中的validate()方法进行表单验证。
forward:指定目标相应页面。
2。<forward>属性含义如下:
name:唯一的转发标识的名称(Mapping对象调用findForward()方法返回的参数)。
path:转发的路径。
redirect:当前属性为true时,将调用sendRedirect()方法,表示执行重定向操作(它不保留request的属性),该方法为客户端跳转,地址栏会改变;该属性为false或redirect属性不存在的时候,表示请求转发操作,将调用RequestDispatcher.forward()方法,默认为false。
使用ForwardAction类实现请求转发,只需在配置文件中声明,无需编写程序代码,如下所示为一段配置使用ForwardAction类的代码。
<action input="index.jsp" name=userForm scope="session" validate="true" path="/user" type="org.apache.struts.actions.ForwardAction"
parameter="/user/userPage.jsp"></action>
说明:
path:Action类的匹配请求路径。
type:实现Action类,这与普通自定义Action类意思相同。
parameter:用于指定往哪里转发,也就是转发的目的URL。
这三个属性时必须的,其他属性都可以省略。
四、多个业务操作的类--DispathAction类、LookupDispatchAction类
通常在一个Action类中只完成一个业务操作,如果在一个Action类中完成一组紧密相关的业务操作,可以使用DispathAction类。DispathAction类继承自Action类,它是一个抽象类,封装了一些基础方法,来解决使用一个Action类处理多个操作的能力。例如,实现商品的添加、修改、删除。
不同于一般的Action类,创建一个DispathAction类的子类时,不必覆盖execute()方法,而是创建一些实现具体业务操作的方法,这些方法与
execute()方法有一样的参数和返回值,以及声明可能抛出同样的异常。例如:
public ActionForward selectUserInfo(ActionMapping mapping, ActionForm form,HttpServletRequest request,HttpServletResponse response) throws UnsupportedEncodingException {
request.setCharacterEncoding("gb2312");
request.setAttribute("list", operation.userList());
System.out.println("list="+operation.userList());
return mapping.findForward("select");
}
在配置DispathAction类时,需要指定parameter的属性为method,下面为配置UserInfoAction的代码:
<action-mappings>
<action name="userInfoForm" parameter="method" path="/userInfoAction" scope="request" type="com.action.UserInfoAction" validate="true">
<forward name="success" path="/success.jsp" />
<forward name="select" path="/select.jsp" />
<forward name="selectOne" path="/selectOne.jsp" />
</action>
</action-mappings>
DispathAction根据参数的值判断用户自定义DispathAction中的哪个方法,因此,在编写触发DispathAction的代码时,不仅仅指明映射的路径,还需要附加一个名为
method的参数,指明要调用的方法名称。例如:
http://localhost:8080/jsp/userInfoAction.do?method=selectUserInfo 这里的selectUserInfo即为上面的public方法名。
LookupDispatchAction类是DispathAction的一个子类,在LookupDispatchAction类中也可以定义多个业务方法。每种方法的调用都是由配置文件中指定的一个特殊请求参数的值来决定的。两者不同之处于,DispathAction类使用请求参数的值确定调用哪种方法,而LookupDispatchAction类利用请求参数的值,反向查询资源绑定,并将它与类中的一种方法匹配。通常LookupDispatchAction类主要用于在一个表单中有多个提交按钮,而这些按钮又有一个共同的名字的场合,这些按钮的名字和具体的ActionMapping的parameter属性值相对应。例如,删除、添加、修改三个按钮具有相同的名称,但是每个按钮的值都不同,每个按钮的值就将映射到不同的方法。
例如:<html:submit property="action" >
<bean:message key="delete"/>
</html:submit>
<html:submit property="action" >
<bean:message key="selectone"/>
</html:submit>
创建LookupDispathAction类的子类。创建LookupDispathAction类需要实现getKeyMethodMap()方法,这种方法返回一个java.util.Map类的对象,LookupDispathAction
类就从这个Map对象中查找与按钮名称对应的方法,如下面的UserInfoAction类中的getKeyMethodMap()的代码:
public class UserInfoAction extends LookupDispatchAction {
protected Map getKeyMethodMap() {
Map map = new HashMap();
map.put("selectone","selectOneUserInfo");
map.put("update","updateUserInfo");
map.put("delete","deleteUserInfo");
return map;
}
//根据上面的map.put的值可知update选择的方法为updateUserInfo
public ActionForward updateUserInfo(ActionMapping mapping, ActionForm form,HttpServletRequest request,HttpServletResponse response) throws
UnsupportedEncodingException {
。。。。。
return mapping.findForward("success");
}