03-Struts1.3 ActionForm

    在J2EE中,绝大部分客户端的数据都是通过表单提交到服务器端,而关于表单数据的收集,都是由Struts核心控制器ActionServlet完成的,它是通过标准的JavaBean命名规范来将表单数据封装在ActionForm中;

         ActionForm用于封装用户的请求参数,而请求参数是通过JSP页面的表单域传递过来的,因此要保证ActionForm的参数属性与表单域的名字相同,注意ActionServlet并不是通过ActionForm中的私有属性的名称来进行封装注值,因为这个私有属性对外部属性是不可见的。因此ActionServlet是通过对应额settergetter方法来封装注值的

 

ActionFrom的生命周期:

 03-Struts1.3 ActionForm

 

 

说明:

         在每次为ActionForm赋值前调用他的reset方法,其作用是使ActionForm中的值恢复初始状态,在应用中,我们可以通过在reset中为变量赋初值的方式,使得页面上的某个对象有显示值。

         如果可视范围是request,则reset方法并不是很重要,因为你每次调用时都会产生一个新的ActionForm实例,所以你所操作的ActionForm不会与别人分享同时也就不会受别人的影响;如果可视范围是 session,由于在session范围内此ActionForm是唯一的,所以你在session范围内需要用到此ActionForm的地方调用的都是同一个ActionForm,要是你没有在reset中对变量赋初值那么前一次调用ActionForm是为它赋的值将在此次调用时有效,这到也没什么。但是,如果恰巧再次调用时你仅仅需要为ActionForm中的一部分变量赋值,那么其余的变量将保持上一次得到的值,这样你就得到了一个新旧混合体,我想这多半不是你所期望的;如果可视范围是application,那其影响就更是不难理解了,这时不但是你自己会影响你自己,使用应用的其他用户的操作也会影响到你。

 

ActionForm Bean从应用和配置的角度分为两类:动态ActionForm和静态ActionForm都是成对出现的作用一样只是实现不一样

 

1、静态ActionForm由程序员手工编写Form

    1.ActionForm提交表单的字段名和form中的属性名一致。

    2.ValidatorForm:用于验证框架的Form,在请求参数前,先使用验证框架验证。 在struts-config中对应的action标签的validate值为true。 基于Form name的校验

    3.ValidatorActionForm:基于Form path的校验

 

二、动态ActionForm:通过配置文件完成ActionForm配置

    Struts提供了动态ActionForm类,通过动态ActionForm,可以完全不用书写ActionForm,只需在struts-config.xml文件中配置即可,所有的动态ActionForm的实现类都必须是org.apache.struts.action.DynaActionForm类,或者是他的子类

    因为系统不清楚动态ActionForm属性,所以必须在配置文件中配置对应的属性,可以form-property元素来配置动态ActionForm的属性

<form-bean name="TeacherForm" type="org.lxh.form.TeacherForm">
	<form-property name="id" type="java.lang.Integer" />
	<form-property name="name" type="java.lang.String" />
</form-bean>

 从上面的配置文件可以看出动态ActionForm的配置必须增加form-property元素每个属性必须对应一个form-property元素其包含两个属性一个是name必须与jsp页面的表单域的名字相同另一个是type为属性的类型

 

    使用动态ActionForm同样用于封装用户请求参数同时也不需要编写ActionForm类了但该ActionForm没有各属性的gettersetter因此无法调用对应的getter方法来解析请求参数我们这样使用

public ActionForward add(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		DynaActionForm dynaActionForm = (DynaActionForm) form;
		String username = (String) dynaActionForm.get("username");
		String password = (String) dynaActionForm.get("password");
		UserPersistent userPersistent = new UserPersistent();
		if (userPersistent.addUser(username, password)) {
			return mapping.findForward("success");
		} else {
			return mapping.findForward("error");
		}
	}

 

使用动态ActionForm请求参数必须使用DynaActionFormgetter方法获取有如下三种;

    Object get(java.lang.String name)根据属性名返回对应的值

    Object get(java.lang.String name,int index):对于有多个重名表单域的情况Struts将其当成数组处理此处根据表单域和索引获取对应值

    Object get(java.lang.String name,java.lang.String key):对于使用Map属性的情况根据属性名及对应key获取对应的值

 

动态ActionForm总结

    使用动态ActionForm的目的是为了减少代码的书写量但是配置变得更复杂了而普通ActionForm使解析请求参数变得更直观动态ActionForm其实就是把页面中的html元素的名称和值放到了map所以通过get方法可以取出相应的值

    但是reset方法和validate方法调用不了不能继承所以不够灵活

 

1.DynaActionForm

<form-bean name="loginForm" type="org.apache.struts.action.DynaActionForm">
  		<form-property name="username" type="java.lang.String"/>
  		<form-property name="password" type="java.lang.String"/>
 </form-bean>

 

DynaActionForm lForm = (DynaActionForm)form;  
	String username = (String) lForm.get("username");  
	String password = (String) lForm.get("password");  
	System.out.println("username:"+username+"->"+password);  
	return mapping.findForward("success");  

无法提供默认的验证行为。

 

    2.DynaValidatorForm :和ValidatorForm一样在使用验证框架时使用。配置和DynaActionForm类似。

    type="org.apache.struts.validator.DynaValidatorForm"

 

    3.DynaValidatorActionForm:

              ValidatorActionFormDynaValidatorActionForm也都是在使用验证框架时使用DynaValidatorFormValidatorForm不同的是在配置validtion.xml<form name=path> name使用的是actionpath属性值。以此来区分不同请求的验证规则。

 

.还有一种特殊的Form ,LazyValidatorForm

<form-bean name="loginForm" type="org.apache.struts.validator.LazyValidatorForm"></form-bean> 

我们没有配置form的属性。所以在jsp页面中必须使用struts标签。

<br>基本使用方式<br>Customer Name:<html:text property="username"></html:text>  
    <br>Customer Code:<html:text property="usercode"></html:text>  
    <br>  
    <br>自动封装Map<br>国家:<html:text property="address(nation)"></html:text>  
    <br>省份:<html:text property="address(state)"></html:text>  
    <br>城市:<html:text property="address(city)"></html:text> 

 

这样就可以直接进行验证框架和action中的取值。

LazyValidatorForm lz = (LazyValidatorForm)form;  
    String username = (String)lz.get("username");  
    String usercode = (String)lz.get("usercode");  
    System.out.println("name---" + username + "   usercode---" + usercode);  
      
    Map m = (Map)lz.get("address");  
    System.out.println(m.get("nation"));  
    System.out.println(m.get("state"));  
    System.out.println(m.get("city"));  
  
    return null;  

 

LazyValidatorForm总结

    1、不需写Java

    2、不需要配置属性

    3、对页面没有任何要求

    4、可以支持验证

 

 

 

你可能感兴趣的:(Struts1.3,ActionFom,DynaActionForm)