Struts1 配置

 Action, ActionForm, ActionForward ,这三个对象构成了Struts 的核心。
Struts 最核心的控制器是ActionServlet ,该Servlet 拦截用户请求,井将用户请求转入到Struts 体系内。
一、配置ActionServlet
ActionServlet 是一个标准的Servlet ,在web.xml 文件中配置,该Servlet 用于拦所有的HTTP 请求。因此,应将该Servlet 配置成自启动Servlet ,即为该Servlet 配置load-on-startup 属性。
注意:在应用Struts 的很多场景下,为Servlet 配直load-on-startup 属性都是必需的。因此,笔者建议应为ServletAction 配直load-an-startup 属性。
在web.xml 文件中配置ActionServlet 应增加如下片段:

Xml代码 复制代码
  1. <!-- 将ActionServlet配置成自启动的Servlet -->  
  2. <servlet>  
  3.     <!-- 指定Servlet 的名字 -->  
  4.     <servlet-name>actionSevlet</servlet-name>  
  5.     <!-- 指定该Servlet 的实现类 -->  
  6.     <servlet-class>  
  7.         org.apache.struts.action.ActionServlet   
  8.     </servlet-class>  
  9.     <!-- 配置自启动的级别 -->  
  10.     <load-on-startup>2</load-on-startup>  
  11. </servlet>  
  12. <servlet-mapping>  
  13.     <!-- 配置ActionServlet的URL 映射 -->  
  14.     <servlet-name>actionSevlet</servlet-name>  
  15.     <!-- 所有以.do 结尾的请求由ActionServlet拦截 -->  
  16.     <url-pattern>*.do</url-pattern>  
  17. </servlet-mapping>  


该ActionServlet作为一个标准Servlet,配置在Web 应用中,负责拦截用户请求。该Servlet 还有加载Struts 配置文件的责任。但这里并未告诉它如何加载Struts 的配置文
件,以及Struts 的配置文件放在哪里及文件名是什么。ActionServlet默认加载WEB-INF 下的struts-config.xml文件。如果需要Struts 的配置文件不在WEB-INF路径下,或者改变了文件名,则应采用如下方式配置:

Xml代码 复制代码
  1. <servlet>  
  2.     <servlet-name>actionSevlet</servlet-name>  
  3.     <servlet-class>  
  4.         org.apache.struts.action.ActionServlet   
  5.     </servlet-class>  
  6.     <init-param>  
  7.         <param-name>config</param-name>  
  8.         <param-value>/WEB-INF/struts-config-user.xml</param-value>  
  9.     </init-param>  
  10.     <load-on-startup>2</load-on-startup>  
  11. </servlet>  


在上面的配置中,指定了ActionServlet 的配置文件: struts-config-user.xml文件,该文件作为init-param参数载入,载入时候指定了参数名:config ,config 是Struts 固定的参数名, struts负责解析该参数,并加载该参数的指定的配置文件。Struts 支持使用多个配置文件,当有多个配置文件时,应将不同的配置文件配置成不同的模块,并指定不同的URI。下面的片段配置了两个配置文件:

Xml代码 复制代码
  1. <servlet>  
  2.     <!-- ActionServlet 的名 -->  
  3.     <servlet-name>actionSevlet</servlet-name>  
  4.     <!-- 配置Servlet 的实现类 -->  
  5.     <servlet-class>  
  6.         org.apache.struts.action.ActionServlet   
  7.     </servlet-class>  
  8.     <!-- 指定Struts 的第一个配置文件 -->  
  9.     <init-param>  
  10.         <!-- 指定配置文件的映射 -->  
  11.         <param-name>config</param-name>  
  12.         <param-value>/WEB-INF/struts-con工fgl.xml</param-value>  
  13.     </init-param>  
  14.     <!-- 指定Struts 的第二个配置文件 -->  
  15.     <init-param>  
  16.         <!-- 指定配置文件的映射 -->  
  17.         <param-name>config/wawa</param-name>  
  18.         <param-value>/WEB-INF/struts-config2.xml</param-value>  
  19.     </init-param>  
  20.     <!-- 将ActionServlet配置成自启动Servlet -->  
  21.     <load-on-startup>2</load-on-startup>  
  22. </servlet>  


上面的配置片段中指定了两个配置文件:struts-config l.xml 和struts-config2.xml 文件。这两个配置文件分别被配置到config 和config/wawa 的路径下。表明将struts-config 1.xml 中的Action 映射到应用的根路径下,而struts-config2.xml 文件中的Action 则被映射到应用的wawa 子路径下。也就是说wawa 将作为系统的一个模块使用。
二、配置ActionForm
配置ActionForm ,必须包含ActionForm 类才行。Struts 要求ActionForm 必须继承Struts 的基类: org.apache.struts.action.ActionForm,ActionForm 的实现非常简单,该类只是一个普通的JavaBean,只要为每个属性提供对应的setter 和getter 方法即可。根据前面的讲解, ActionForm 用于封装用户的请求参数,而请求参数是通过JSP 页面的表单域传递过来的。因此应保证ActionForm 的参数与表单域的名字相同。
注意: JavaB ean 的参数是根据getter 、setter 方法确定的。如果希望有一个A 的属性,则应该提供getA 和setA 的方法。
(1)ActionForm的实现
ActionForm 的属性必须与JSP 页面的表单域相同。本示例的表单包含如下两个表单域:
• usemame
• password
因此, ActionForm 必须继承org.apache.struts.action.ActionForm,并为这两个域提供对应的setter 和getter 方法,下面是ActionForm 的源代码:

Java代码 复制代码
  1. import org.apache.struts.action.ActionForm;   
  2. public class LoginForm extends ActionForm {   
  3.     private String username;   
  4.     private String password;   
  5.   
  6.     // 表单域username对应的setter 方法   
  7.     /**  
  8.      * @return the username  
  9.      */  
  10.     public String getUsername() {   
  11.         return username;   
  12.     }   
  13.   
  14.     /**  
  15.      * @param username  
  16.      *            the username to set  
  17.      */  
  18.     public void setUsername(String username) {   
  19.         this.username = username;   
  20.     }   
  21.   
  22.     /**  
  23.      * @return the password  
  24.      */  
  25.     public String getPassword() {   
  26.         return password;   
  27.     }   
  28.   
  29.     /**  
  30.      * @param password  
  31.      *            the password to set  
  32.      */  
  33.     public void setPassword(String password) {   
  34.         this.password = password;   
  35.     }   
  36.   
  37. }  
import org.apache.struts.action.ActionForm;
public class LoginForm extends ActionForm {
	private String username;
	private String password;

	// 表单域username对应的setter 方法
	/**
	 * @return the username
	 */
	public String getUsername() {
		return username;
	}

	/**
	 * @param username
	 *            the username to set
	 */
	public void setUsername(String username) {
		this.username = username;
	}

	/**
	 * @return the password
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * @param password
	 *            the password to set
	 */
	public void setPassword(String password) {
		this.password = password;
	}

}


另外,该ActionForm 的两个属性名可以不是usemame 和password。只要提供了usemame 和password 的setter 和getter 方法即可。
注意: FormBean 类应尽量声明成public。
(2)ActionForm 的配置
所有的ActionForm 都被配置在struts-config.xml 文件中,该文件包括了一个form-beans 的元素,该元素内定义了所有的ActionForm,每个ActionForm 对应一个form-bean 元素。
为了定义LoginForm. 必须在struts-config.xml文件中增加如下代码:

Xml代码 复制代码
  1. <!-- 用于定义所有的ActionForm -->  
  2. <form-beans>  
  3.     <!-- 定义ActionForm,至少指定两个属性: name , type-->  
  4.     <form-bean name="loginForm" type="lee.LoginForm" />  
  5. </form-beans>  


配置ActionForm非常简单,只需指定ActionForm 的name 属性即可。该属性定义了ActionForm的id. 用于标识该Form; 另外还需要一个type 属性,该属性定义了ActionForm的实现类。
下面将介绍Action 如何使用该ActionForm. 以及Action 如何与该ActionForm关联。
三、配置Action
Action 的配置比ActionForm 相对复杂一点,因为Action 负责管理与之关联的ActionForm. 它不仅需要配置实现类,还需要配置Action 的path 属性,该属性用于被用
户请求。对于只需在本Action 内有效的Forward. 还应在Action 元素内配置局部Forward。
(1)Action 的实现
通过ActionForm. 可使Action 无须从HTTP 请求中解析参数。因为所有的参数都被封装在ActionForm中,下面是Action 从AcitionForm 取得请求参数的源代码:

Java代码 复制代码
  1. import javax.servlet.http.HttpServletRequest;   
  2. import javax.servlet.http.HttpServletResponse;   
  3. import org.apache.struts.action.Action;   
  4. import org.apache.struts.action.ActionForm;   
  5. import org.apache.struts.action.ActionForward;   
  6. import org.apache.struts.action.ActionMapping;   
  7. public class LoginAction extends Action {   
  8.     // 必须重写该核心方法,该方法actionForm 将表单的请求参数封装成值对象   
  9.     public ActionForward execute(ActionMapping mapping, ActionForm form,   
  10.             HttpServletRequest request, HttpServletResponse response)   
  11.             throws Exception {   
  12.         //将ActionForm强制类型转换为LoginForm   
  13.         LoginForm loginForm = (LoginForm) form;   
  14.         // 从ActionForm中解析出请求参数: username   
  15.         String username = loginForm.getUsername();   
  16.         // 从ActionForm中解析出请求参数: password   
  17.         String pass = loginForm.getUsername();   
  18.         //后面的处理与前一个示例的Action 相同。   
  19.         ...   
  20.     }   
  21. }  
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
public class LoginAction extends Action {
	// 必须重写该核心方法,该方法actionForm 将表单的请求参数封装成值对象
	public ActionForward execute(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		//将ActionForm强制类型转换为LoginForm
		LoginForm loginForm = (LoginForm) form;
		// 从ActionForm中解析出请求参数: username
		String username = loginForm.getUsername();
		// 从ActionForm中解析出请求参数: password
		String pass = loginForm.getUsername();
		//后面的处理与前一个示例的Action 相同。
		...
	}
}


该Action 从转发过来的ActionForm 中解析请求参数,对应的ActionForm 则由ActionServlet 在接收到用户请求时,负责实例化。
实际的过程是: ActionServlet 拦截到用户请求后,根据用户的请求,在配置文件中查找对应的Action , Action 的name 属性指定了用于封装请求参数的ActionForm; 然后ActionServlet 将创建默认的ActionForm 实例,并调用对应的setter 方法完成ActionForm的初始化。
ActionServlet 在分发用户请求时,也将对应ActionForm 的实例一同分发过来。
(2)Action 的配置
Action 需要配置如下几个方面。
• Action 的path: ActionServlet 根据该属性来转发用户的请求,即将用户请求转发与之同名的Action 。同名的意思是:将请求的.do 后缀去掉,匹配Action 的path属性值。
• Action 的name: 此处的name 属性并不是Action 本身的名字,而是与Action 关联的ActionForm。因此该name 属性必须是前面存在的ActionForm 名。
• Action 的type: 该属性用于指定Action 的实现类,也就是负责处理用户请求的业
务控制器。
• 局部Forward: Action 的转发并没有转发到实际的JSP 资源,而是转发到逻辑名,即Forward 名。在Action 内配置的Forward 都是局部Forward (该Forward 只在该Action 内有效)。
下面是该Action 的配置代码:

Xml代码 复制代码
  1. <!-- 该元素里配置所有的Action -->  
  2. <action-mappings>  
  3.     <!-- 配置Action. 指定了path , name , type 等属性 -->  
  4.     <action path="/login" type="lee.LoginAction" name="loginForm">  
  5.         <!-- 配置局部Forward -->  
  6.         <forward name="welcome" path="/WEB-INF/jsp/welcome.jsp" />  
  7.         <forward name="input" path="/login.jsp" />  
  8.     </action>  
  9. </action-mappings>  


四、配置Forward
正如前面所讲, Forward 分局部Forw缸d 和全局Forward 两种。前者在Action 里配置,仅对该Action 有效:后者单独配置,对所有的Action 都有效。
配置Forward 非常简单,主要需要指定以下三个属性。
• name: 该Forward 的逻辑名。
• path: 该Forward 映射到的JSP 资源。
• redirect: 是否使用重定向。
局部Forward 作为Action 的子元素配置;全局Forward 配置在global-forwards 元素里。
下面是配置全局Forward 的代码:

Xml代码 复制代码
  1. <!-- 配置全局Forward -->  
  2. <global-forwards>  
  3.     <!-- 配置Forward对象的name 和path 属性 -->  
  4.     <forward name="error" path="/WEB-INF/jsp/error.jsp" />  
  5. </global-forwards>  


上面的配置代码中,配置了一个全局Forward,该Forward 可以被所有的Action 访问。通常,只将全局资源配置成全局Forward。当每个Action 在转发时,首先在局部Forward 中查找与之对应的Forward,如果在局部Forward 中找不到对应的Forward 对象,才会到全局Forward 中查找。因此,局部Forward 可以覆盖全局Forward。
下面提供了该应用的struts-config.xm1文件的全部源代码:

Xml代码 复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!-- Struts 配置文件的文件头,包含DTD 等信息 -->  
  3. <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">  
  4. <!--Struts 配置文件的根元素 -->  
  5. <struts-config>  
  6.     <!--配置所有的ActionForm -->  
  7.     <form-beans>  
  8.         <!--配置第一个ActionForm,指定ActionForm的name 和type 属性 -->  
  9.         <form-bean name="loginForm" type="lee.LoginForm" />  
  10.     </form-beans>  
  11.     <!--配置全局Forward对象 -->  
  12.     <global-forwards>  
  13.         <!--该Forward对象的name 属性为error. 映射资源为/WEB-INF/jsp/error.jsp -->  
  14.         <forward name="error" path="/WEB-INF/jsp/error.jsp" />  
  15.     </global-forwards>  
  16.     <!--此处配置所有的Action 映射-->  
  17.     <action-mappings>  
  18.         <!--配置Action 的path. type 属性name 属性配置Action 对应的ActionForm-->  
  19.         <action path="/login" type="lee.LoginAction" name="loginForm">  
  20.             <!--还配置了两个局部Forward. 这两个局部Forward仅对该Action有效-->  
  21.             <forward name="welcome" path="/WEB-INF/jsp/welcome.jsp" />  
  22.             <forward name="input" path="/login.jsp" />  
  23.         </action>  
  24.     </action-mappings>  
  25. </struts-config>  
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值