zoukankan      html  css  js  c++  java
  • ActionForm

    鄙人一点struts1.2中ActionForm的理解

    初学struts的人我觉得首先应该struts1.2学精,何精,就是明确struts的控制流程以及它核心API的实现原理(比方 Action/DispatchAction/MappingDispatchAction/LookupDispatchAction /ActionForm的实现原理)然后自己会写一个“山寨版”的struts1.2,仅仅有到达这样的程度你才干深刻体会struts1.2的MVC,也 才明你学会了struts1.2,当你再学struts2.0的候会很的easy,那struts1.2的关键就是能 ActionForm,在此我把自己学struts1.2ActionForm的使用及其实现原理出来晒一晒,望各位不要笑,些意

     

    ActionForm的
    (一)、ActionForm的特性
    1.
    建一个form须继承于四个父中的一个,要么继ActionForm,要么继ValidatorForm,要么继ValidatorActionForm,要么继
    2.一个form
    中的一个属性都将和面中form表中的一个表元素一一相应
    Example:
    一个表
    单为:
    <form>
     <input type="text" name="username"></input>
     <input type="password" name="password"></input>
     <input type="text" name="email"></input>
    </form>
    一个与之
    相应form
    public class UserForm extends ActionForm{
      private String username;
      private String password;
      private String email;
      private String address;
      
      //以下省略getter和setter方法
    }
    一个引用了
    formappAction:
    <form-beans>
     <form-bean name="userForm" type="form.UserForm"></form-bean>
    </form-beans>
    <action-mappings>
    <action path="/test" type="action.TestAction" name="userForm" attribute="uf" scope="request"></action>
    </action-mappings>
    3.在引用了form-bean的action中name属性的
    就是form-bean中name的
    4.
    userForm默会被放在session中,使用scope能够指定存储该form象的地方,自然attribute就是用来存放在中的form象起的,假设不attribute
    属性那
    attribute默的就使用name的
    (二)、普通HTML表
    使用Form的工作原理
    ActionServlet
    struts-config行解析,当解析到某个action中存在一个属性name,那ActionServlet中的 RequestProcessor就会依据name的找到相应form-bean然后建一个相应form类实,放在我的存,当 表提交到action相应appAction之前也就是到达FC的,FC会做以下事情
    1.依据路径找到
    相应的内存中存放着的配置象中的action
    2.依据action中的attribute属性,从session中得到一个
    相应form
    3.
    formreset方法自己行清空
    4.用表
    中的去填充form
    5.假设要
    form要验证form就会validate方法依照我们规定的验证规则进验证
    (三)、struts表
    使用Form的工作原理
    1. 利用struts的HTML
    标签库HTML元素其是服器端的java代,java代编译型代HTML是解型代,所以在使用 struts的HTML标签库HTML元素要更加的严谨,仅仅要某个元素甚至是某个属性没有定义对,那么编译就不能通从而抛出异常,比如在使用 struts的HTML标签库action属性是在编译就要被确定的假设action属性所定的提交路径是空或者是错误,那器 在编译候就会抛出500的异常,而不像普通HTML表action属性是在提交的候才确定的
    2.原理跟普通HTML表
    使用Form的工 作原理大同小异,不同在于当服form表单进编译候会向action所指定的地址一个,看是否正确,所以候其就已提交了一次 表,当表到达FC的候跟上面做的几件事情中就第三件不同,不同在于表form中的都将互相填充,就是struts的回添机制
    Example:
    单为:
    //先
    struts的html标签库
    <html:form action="test.do" method="post">
     <html:text property="username"></html:text>
     <html:text property="salary"></html:text>
     中文<html:multibox property="lang" value="zh"></html:multibox>
     英文<html:multibox property="lang" value="en"></html:multibox>
     俄
    <html:multibox property="lang" value="ey"></html:multibox>
     <html:submit value="click me"></html:submit>
    </html:form>

    form类为:
    public class UserForm extends ActionForm{
     private String username;
     private double salary=1000.00;
     private String[] lang;
     
     //省略getter和setter方法
    }

    配置文件:
    <form-beans>
     <form-bean name="userForm" type="form.UserForm"></form-bean>
    </form-beans>
    <action-mappings>
     <action path="/test" type="action.TestAction" name="userForm" attribute="uf">
      <forward name="success" path="/show.do"></forward>
     </action> 
     <action path="/show" type="action.ShowAction" >
      <forward name="success" path="/test.do"></forward>
     </action>
    </action-mappings>
    经验:
    1.
    面之前服器会向text.do送一次,该请求也就是提交表
    2.当上面的
    求到FC的候会用form中的去填充个表然后回显给所以用看到的果是salary文本框中有一个值为1000
    3. 当用
    再次提交表,求到达FC的候服器会首先检查你所提交的表元素的session中form与之相应的属性的是否同样,假设同样就直接利用form去填充表,假设不同样就先把提交的表元素的值赋给form中与之相应的属性再利用form去填充表
    4.
    该实例有一个 ,就是当用第一次选择了两种语,然后提交,第二次用种语言都没,然后提交,这时候回果出人意料,复选框中的既然是第一次用选择,原因是,复选框有一个特性,假设用都不选择,那提交表候就不提交复选,假设我使用get求提交的就能明的看到这样的情况表提 交的属性仅仅有username和salary两个,两个元素即使没有也会提交,就因为这一点,当表到达FC的,服器仅仅看到提交的两个表元素 username和salary,然后检查form中的属性也仅仅会检查username和salary两个,而不会检查lang,假设表中的 username和salary与form中与之相应username和salary属性不一,那就先把表中的username和salary 赋给form中的username和salary属性,然后利用form去填充表,假设一,那就利用原来的form去填充表,在情况下 form中的lang属性都将不会被检查更不用提改,所以lang用的是上一次的,自然回form中的复选框的就是上一次的
    5.解决
    问题能够有两种办,在提交表以后就把session中的form给删除掉,一次提交都新建一个form象也就是在面的末尾加一个
    <%session.removeAttribute("uf")%>
    第二
    解决法是在UserForm中覆盖父reset方法,reset方法将在form填充之前做,这样就能在reset中把我想要位的属性先
    当然利用第二
    是最好的
    5.我
    能够利用struts的form回添机制行回添操作,回添的机是在form到达面之前,能够在Action中来做也能够在reset中来做

    (四)、Form与象之
    有的
    候我们为了方便会把取到的form中的直接拷象中去然后把象再存到数 据,这样给来了非常多的方便,但前提是象中须要拷的属性,form中要拷贝过去的属性,与form相应的表元素他三者必一一 相应.这样就能够把表中的得到封装到form中然后再把form中与象中属性同样的象中
    Example:
    entity:
    public class User{
     private String name;
     private String password;
     private double salary;
     private String address;
     //省略getter和setter方法
    }
    form:
    public class UserForm{
     private String name;
     private String password;
     private String salary;
     //省略getter和setter方法
    }
    :
    <form>
     <input type="text" name="name"></input>
     <input type="password" name="password"></input>
     <input type="text" name="salary"></input>
    </form>
    1.把表
    中的值赋值给UserForm
    2.把UserForm中的
    User象中:
    //以下
    句是在action的某个方法中做的所以form直接能够用
    BeanUtils.copyProperties(user,form);
    3.将user
    象存放在数据

     

  • 相关阅读:
    nodejs 教程
    文摘
    TED字幕摘抄
    Gamma函数相关matlab代码
    js以excel为模板的打印
    ASP.NET动态生成GridView的使用
    IE报错:缺少标识符、字符串或数字
    ExtJS Ext.Ajax.request最好设为同步
    javascript onclick 函数不执行
    Ext.grid.GridPanel数据转json
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4006690.html
Copyright © 2011-2022 走看看