struts1.x小笔记

1、  Struts1.2.jsp中要用到Struts自己的标签,要引入才能用

一般在.jsp的前面写上

<%@ taglib prefix=”html” uri=”http://struts.apache.org/tags-html” %>

 

如果还要用其他的,也必须加上。例如想用bean的,加上

<%@ taglib prefix=”bean” uri=”http://struts.apache.org/tags-bean” %>

 

 

写上后才能用Struts自己的标签,如<html:errors property=”whatwhat”></html:errors>

2、  可以自己自定义一个类用于自动封装.jsp的数据,这个类要继承ActionForm,例如UserForm的字段对应.jsp中的字段,gettersetter的名字要对上.jsp中的字段命名。可以有validate方法,也可以没有。

3、  也可以不自己写封装的类,使用DynaActionForm实现自动封装。

 

一般要在.java里重新得到值,用先把ActionForm的入参转为DynaActionForm,然后用get(“property的名字”)重新得到Object再转为自己需要的类型,如这里的(String)xxx.get(“name1”)

 

4、  明显无论多少个浏览器访问,只会产生某个action类的一个action对象(要注意ActionServletAction这两个的区别,ActionServlet本质是一个Servlet,直接继承HttpServlet,是做总控制用的,是“总统”,而ActionDispatchActionMappingDispatchActionLookupDispatchAction是某一个action,是“总统的秘书”,一个总统可以有n个秘书)。也就是说,每种秘书只有一位。

5、  使用DispatchAction的时候要注意两点,第一,.jsp里面的<form>要用POST方法(如果用<html:form>就不用),用get方法会报错;第二继承DispatchAction的类不要override父类的execute方法,否则无论指定调用哪个方法都会调用execute方法,如userDis.do?method=registeruserDis.do?method=login调用的都是execute方法。

 

用原始的<form>标签,没有指定method=”post”的话报错:

javax.servlet.ServletException: Request[/userDis] does not contain handler parameter named 'method'.  This may be caused by whitespace in the label text.

 

验证:普通的验证,在ActionForm里面override  validate方法,validate方法返回ActionErrors,会涉及到这么几个关系ActionErrorsActionMessages的子类,ActionMessage可以“挂”到ActionMessages上。一般这么写:

 

 

 

ActionErrors errors = new ActionErrors();

if(name==null && name.equals(“”)){

           //ActionMessage am = new ActionMessage(“直接写要返回的信息,自动红色”);

ActionMessage am = new ActionMessage(“empty.name”);//一般在ApplicationResource.properties文件里这么写上返回的信息,比较灵活

errors.add(“invalidname”,am);

}

if(password ==null && password.equals(“”)){

           //ActionMessage am = new ActionMessage(“直接写要返回的信息,自动红色”);

ActionMessage am = new ActionMessage(“empty.password”);//一般在ApplicationResources.properties文件里这么写上返回的信息,比较灵活

errors.add(“invalidpass”,am);

}

 

return errors;

 

ApplicationResources.properties里写上

empty.name=name cannot be empty….

empty. password = password cannot be empty….

 

.jsp中用<html:errors property=”invalidname”></html:errors>接收并显示错误提示信息

7、细节:

6、  表单原来可以直接用名字就拿到,不需要document.getElementById()或者document.getElementsByName()[0]来拿。

表单定义了name就可以直接用,如:

<form name=”myform”>,可以直接在JavaScript里面用myform

 

7、  首先先讲LookupDispatchAction的用法:

首先

<form action=”lookupDis” method=”post”>

           <input type=”submit” value=”增加” name=”abc” >

           <input type=”submit” value=”删除” name=”abc” >

           <input type=”submit” value=”修改” name=”abc” >

           <input type=”submit” value=”查询” name=”abc” >

           <input type=”submit” value=”注册” name=”abc” >

           <input type=”submit” value=”登录” name=”abc” >

</form>

一个表单对应这么多个按钮,这种情况用LookupDispatchAction比较好

 

在继承LookupDispatchAction的类必须实现getKeyMethodMap方法,此方法返回Map类型。可以HashMap map = new HashMap();然后map.put(“这个就是按钮的value”,对应的方法名);最后return map;当然为了写灵活,“这个就是按钮的value值”改写在ApplicationResources文件里,如

map.put(“lookup.add”,addMethod);

map.put(“lookup.del”,delMethod);

map.put(“lookup.update”,updateMethod);

map.put(“lookup.find”,findMethod);

map.put(“lookup.regi”,regiMethod);

map.put(“lookup.login”,loginMethod);

 

ApplicationResources文件里有:

右边的要对应value中的值,注意资源文件里面不能用汉字,要用【/u十六进制】形式

lookup.add=增加

lookup. del =删除

lookup. update =修改

lookup. find =查询

lookup. regi =注册

lookup. login =登录

 

注意parameter的值要对应按钮的name的值

         <action path=”/ lookupDis”

type=”day1.com.action.LookupDisAction” parameter=”abc”></action>

 

 

 

8、  struts的验证,验证分为三种,第一种就是在继承ActionForm的类的validate方法里面写验证逻辑,struts-config.xml中的action标签的validate属性默认是true,所以写不写上validate=”true”都会经过此种验证。第二种是在继承Action(或者DispatchAction之类)的类的execute方法或者其他方法里面写验证逻辑,依然是用ActionErrors ae = new ActionErrors();ActionMessage am = new ActionMessage(“what.in.the.peizhi”);

ae.add(“jubing”,am);但是这时不是return ae;因为人家方法是返回ActionForward的而不是ActionErrors。用this.saveErrors(request,am);this是指集成Action(或者DispatchAction)的类的对象。第三种不是编程式异常处理而是声明式异常处理,在action标签里声明exception子标签,注意要在forward标签之前。exception有三个属性,一是key,映射资源文件,可以在.jsp中直接用<html:errors />显示。不需要像之前那样<html:errors property=”” />,第二个是type,是异常类的full-qualified名。第三个是path,定义异常后要forward的方向(.jsp或者.html文件)。第三种是框架验证

 

框架验证:

使用验证框架的步骤

1)config validate plugin (struts-config.xml)

   <plug-in className="org.apache.struts.validator.ValidatorPlugIn">

    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml" />

   </plug-in>

这部分是写死的照样copy,另外validation.xml可以分成不同的小.xml

 <plug-in className="org.apache.struts.validator.ValidatorPlugIn">

    <set-property property="pathnames" value="/WEB-INF/validator-rules.xml,/WEB-INF/validation1.xml,/WEB-INF/validation2.xml" />

   </plug-in>

 

2)add validator-rule.xml and validation.xml to /WEB-INF/

  copy validator-rule.xml from struts framework

  edit validation.xmlvalidator-rule.xml是不需要你改动的已经帮你写好了验证规则

<?xml version="1.0" encoding="GBK" ?>

  <!DOCTYPE form-validation PUBLIC

   "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"

            "http://jakarta.apache.org/commons/dtds/validator_1_1_3.dtd">

  <form-validation>

      <formset>

          <form name="firstValidatorForm">

              <field property="name" depends="required,maxlength,minlength,mask">

                  <msg name="required" key="error.name.blank" />

                  <msg name="minlength" key="error.name.minLength" />

                  <msg name="maxlength" key="error.name.maxLength" />

                  <msg name="mask" key="error.name.alphanum" />

 

                  <arg name="minlength" key="${var:minlength}" position="0" resource="false" />

                  <arg name="maxlength" key="${var:maxlength}" position="0" resource="false" />

                  <var>

                      <var-name>minlength</var-name>

                      <var-value>5</var-value>

                  </var>

                  <var>

                      <var-name>maxlength</var-name>

                      <var-value>10</var-value>

                  </var>

                  <var>

                      <var-name>mask</var-name>

                      <var-value>^[a-zA-Z0-9]*$</var-value>

                  </var>

              </field>

              <field property="age" depends="required,integer,intRange">

                  <msg name="required" key="error.age.blank" />

                  <msg name="integer" key="error.age.integer" />

                  <msg name="intRange" key="error.age.intRange" />

 

                  <arg name="intRange" key="${var:min}" position="0" resource="false" />

                  <arg name="intRange" key="${var:max}" position="1" resource="false" />

                  <var>

                      <var-name>min</var-name>

                      <var-value>18</var-value>

                  </var>

                  <var>

                      <var-name>max</var-name>

                      <var-value>60</var-value>

                  </var> 

              </field>

              <field property="email" depends="required,email">

                  <msg name="required" key="error.email.blank" />

                  <msg name="email" key="error.email.invalid" />

              </field>

          </form>

      </formset>

</form-validation>

validator.xml文件中的所有配置都放到<form-validation>元素中。在<form-validation>元素中有一个<formset>子元素,这个元素可以定义多个<Form>元素,这个元素用来定义要验证的ValidatorForm类的子类。其中name属性值就是<form-bean>元素中的name属性值。

    <field>元素用来定义某个属性的约束条件,如第一个<field>元素定义了name属性必须存在(required)、必须要满足最小长度(minlength)和最大长度(maxlength)以及还要通过mask所指的正则表达式的验证。

    <msg>元素用来定义出错信息在属性文件中的Key(所有的出错信息都在属性文件中)。<arg>元素用来向出错信息中的参数传递参数值。<var>元素用来定义变量名和变量值。

 

 

 

3)develop ur ActionForm

1自定义ActionForm要继承ValidatorForm

     最好不要重写validate方法如果重写validate方法则必须显式调用

      return super.validate(...)方法

2动态form要在配置文件里使用org.apache.struts.validator.DynaValidatorForm不要用org.apache.struts.action.DynaActionForm)

比如

<form-bean name="" type="org.apache.struts.validator.DynaValidatorForm">     ----不是DynaActionForm

    <form-property name="name" type="java.lang.String"></form-propertty>

    <form-property name="pasword" type="java.lang.String"></form-propertty>

</form-bean>

 

继承关系图

ActionForm自定义的封装类

|---DynaActionForm配置文件里定义的封装类

|     |---DynaValidatorForm(配置文件里定义的、带有验证功能的封装类)

|---ValidatorForm(自定义的、带验证功能的封装类)

   

 

4)<action ..... validate="true">

 

5)copy validation rules to ApplicationResources.properties

注意:errors.required这是对应着validator-rules.xml中的<validator>下的msg属性,不能随便改成其他的,不能改成error.require(少个s和d)。要改成自己定义的  xxx.xxx  ,当然也不一定要.。必须在validation.xml中定义<msg name="required" key="xxx.xxx" />这个name就是映射<validator>下的msg属性,key就是自己爱定义什么就定义什么

errors.required={0} is required.

errors.invalid={0} is invalid.

errors.integer={0} must be an integer.

errors.date={0} is not a date.

errors.email={0} is an invalid e-mail address.

 

注意:form.xxxx这个是用在:用form.xxxx这把key(键)取出等号右边的value(值),然后填充(塞)到上面的{0}啊之类的地方。当然可以用what.xxxx                                         

form.username=User Name

form.password=Password

form.sex=Sex

form.age=Age

form.hometown=Hometown

form.email=Email

form.birthday=Birthday

 

6)active javaScript in Jsp page.(采用客户端验证才需要这一步

<html:form action="/register" method="post"

  onsubmit="return validateRegisterForm(this)">

 

 <html:javascript formName="registerForm"/>        ---------registerForm是在配置文件注册的封装类的名字

猜你喜欢

转载自blog.csdn.net/w8y56f/article/details/6179196