⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 14. struts1.x note.txt

📁 在达内培训java笔记
💻 TXT
📖 第 1 页 / 共 4 页
字号:
    <form-validation>    <formset>        <form name="enrollForm">            <field property="name" depends="required">                <arg key="register.name"/>            </field>            <field property="age" depends="required, integer">                <arg key="register.age"/>            </field>            <field property="city" depends="required">                <arg key="register.city"/>            </field>            <field property="gender" depends="required">                <arg key="register.gender"/>            </field>            <field property="email" depends="required,email">                <arg key="register.email"/>            </field>            <field property="birthday" depends="required, date">                <arg key="register.birthday"/>                <var>                    <var-name>datePattern</var-name>                    <var-value>yyyy-MM-dd</var-value>                </var>            </field>        </form>    </formset></form-validation>    注意:如果是使用1.3.x以上的版本,只需要引入:        <plug-in className="org.apache.struts.validator.ValidatorPlugIn">            <set-property property="pathnames"                        value="/org/apache/struts/validator/validator-rules.xml, /WEB-INF/validation.xml"/>          </plug-in>          validation.xml为:<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE form-validation PUBLIC        "-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.3.0//EN"        "http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd"><form-validation>    <formset>        <form name="enrollForm">            <field property="name" depends="required">                <arg key="register.name"/>            </field>            <field property="age" depends="required, integer">                <arg key="register.age"/>            </field>            <field property="city" depends="required">                <arg key="register.city"/>            </field>            <field property="gender" depends="required">                <arg key="register.gender"/>            </field>            <field property="email" depends="required,email">                <arg key="register.email"/>            </field>            <field property="birthday" depends="required, date">                <arg key="register.birthday"/>                <var>                    <var-name>datePattern</var-name>                    <var-value>yyyy-MM-dd</var-value>                </var>            </field>        </form>    </formset></form-validation>    3)develop ur ActionForm (服务器端验证需要遵循的规范)       (1) 自定义ActionForm 要继承 ValidatorForm           最好不要重写validate方法!如果重写validate方法,则必须显式调用 return super.validate(...)方法      (2) 动态form要使用org.apache.struts.validator.DynaValidatorForm     4)(服务器端验证需要遵循的规范)         <action ..... validate="true"  input="假如出错的页面" >    5)copy validation rules to ApplicationResources.properties
     register.title=Super Boy Register Form    register.name=Name:    register.gender=Gender:    register.age=Age:    register.city=City:    register.email=Email:    register.birthday=Birthday:    errors.required={0} is required.    errors.integer={0} must be an integer.    errors.date={0} is not a date.    errors.email={0} is an invalid e-mail address.    6)active javaScript in Jsp page.(采用客户端验证才需要这一步)      <html:javascript formName="enrollForm"/>     <html:form action="/enroll" onsubmit="return validateEnrollForm(this)" method="post">建议:(1) 客户端能做的验证,一般不要在服务器端验证。         一般输入格式等方面的验证     (2) 客户端实在没有能力进行验证的情况,发到服务器端做验证。

禁止表单重复提交:

1.客户端方案(Java Script) 
使用js来实现禁止表单重复提交的方法很多,大体有如下几种:

1)提交时,使提交按钮不可用(disable),或者隐藏按钮,使用进度条
参考实现:


/*
函数名称:disableButtons
函数功能:提交前,将所有表单中的button,reset,submit禁用disabled;
          如果是submit按钮,则添加与之相同隐藏文本框hidden对象,让提交的信息无一漏网
*/
function disableBtns() 
{
    for(k=0;k<document.all.length;k++ ) 
    {
        //当前节点对象
        var obj = document.all(k) 
        if( obj.type=='button' || obj.type=='submit' || obj.type=='reset') 
        {
            obj.disabled = true
            if (obj.type=='submit') 
            {
                //添加隐藏节点
                var oNewNode = document.createElement("input");
                oNewNode.type = "hidden"
                oNewNode.name = obj.name
                oNewNode.value = obj.value
                obj.insertAdjacentElement("afterEnd",oNewNode);
            }        
        }
    }
}


/*
函数名称:disButtons2
函数功能:提交前,将所有表单中的button,reset,submit禁用disabled;
          如果是submit按钮,则添加与之相同隐藏文本框hidden对象,让提交的信息无一漏网

函数说明:与上面的函数功能一样,但适用浏览器范围更广,推荐使用此函数。
*/
function disableBtns() 
{
    for(k=0;k<document.forms.length;k++ ) 
    {
        //获取当前表单
        var frm = document.forms[k]
        for(i=0;i<frm.length;i++) 
        {
            var obj = frm.elements[i]
            if ( obj.type=='button' || obj.type=='submit' || obj.type=='reset' ) 
            {
                obj.disabled = true
                if (obj.type=='submit') 
                {
                    var oNewNode = document.createElement("input");
                    oNewNode.type = "hidden"
                    oNewNode.name = obj.name
                    oNewNode.value = obj.value
                    //frm.insertAdjacentElement("beforeEnd",oNewNode);
                    obj.insertAdjacentElement("afterEnd",oNewNode);
                }
            }
        }
    }
}


/*
函数名称:hiddenForm
函数功能:提交时让表单自动隐藏,而不影响数据的提交
*/
function hideForm(form) 
{
    //waitStr 提交过程中出现的提示,可以自行设置
    var waiting = "<center><img src='progress.jpg'>数据正在提交中,请等候</center>";
    form.innerHTML = "<div style='display:none;'>"+form.innerHTML+"</div>"+waiting;
}




2)使用标识来实现控制客户端多次点击

<script type="text/javascript">
    //控制标志
    var submitted = false;
    function checkSubmit() {
        if(submitted == true) {
            alert("submitted == true");
            return false;
        }
        submitted = true;
        return true;
    }
    
    //控制页面双击行为
    document.ondblclick = function docOnDblClick() {
        window.event.returnValue = false;
    }
    
    //控制页面单击行为
    document.onclick = function docOnClick() {
        if(submitted) {
            window.event.returnValue = false;
        }
    }
</script>



<html:form action="/logon" method="post" onsubmit="return checkSubmit();">
    <html:text property="name"></html:text>
    <html:submit value="login">
    </html:submit>
</html:form>



2.服务器端方案
原理:使用transaction token
1)jsp版









Day4:一、 文件上传
	步骤:
	1)定义表单
	 <html:form action="/fileupload" enctype="multipart/form-data">
      <table>
          <tr>
        <td><b>请选择上传的文件:</b></td>
        <td><html:file property="file"></html:file></td>
          </tr>
          <tr></tr>
          <tr>
          <td colspan=2 align=center>
              <html:submit>上传</html:submit>
          </td>
          </tr>
      </table>
	 </html:form>
	2)配置stuts-config.xml
      *定义Form
      *定制Action

      a)form
      public class FileUploadForm extends ActionForm {
        private FormFile file;
        public FormFile getFile() { return file; }
        public void setFile(FormFile file) { this.file = file; }
      }
      
      b)action
      //处理文件
      FormFile file = fileUploadForm.getFile();
      InputStream is = file.getInputStream();
      OutputStream os = new FileOutputStream(path + filename);
      输出文件





二、Struts Tiles----强大的页面模板与页面布局技术

1.作用:Tiles框架提供模板机制,完成页面布局和内容展示逻辑的解耦
    -------分离变与不变的元素:布局是不变的,而内容是变化的

2.如何使用tiles框架
步骤:
1) 在struts-config.xml配置tiles插件
    <plug-in className="org.apache.struts.tiles.TilesPlugin">
        <set-property property="definitions-config"
                  value="/WEB-INF/tiles-define.xml"/>
    </plug-in>

2) 定义tiles:tiles-define.xml        
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE tiles-definitions PUBLIC
           "-//Apache Software Foundation//DTD Tiles Configuration 1.3//EN"
           "http://struts.apache.org/dtds/tiles-config_1_3.dtd">

    <tiles-definitions>
        <definition name="definition1" page="/layout/baselayout.jsp">
            <put name="title" value="mainspace"></put>
            <put name="header" value="/layout/header.jsp"></put>
            <put name="footer" value="/layout/footer.jsp"></put>
            <put name="body" value="/layout/body.jsp"></put>
            <put name="navigator" value="/layout/navigator.jsp"></put>
        </definition>
        
        <definition name="user" extends="definition1">
            <put name="title" value="another mainspace"></put>
            <put name="body" value="/usermanager/user.jsp"></put>
        </definition>
    </tiles-definitions>

3) 定义布局以及所有的组成部分
    baselayout.jsp
    header.jsp
    footer.sjp
    body.jsp
    navigator.jsp


    变化的内容定义为:
    <tiles:getAsString name="title"/>
    <tiles:insert attribute="header">


    baselayout.jsp参考代码:
    -------------------------------------------------------------------------------------------------------
    <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles"%>

    <html>
      <head>
        <title><tiles:getAsString name="title"/></title>
      </head>
      
      <body>
            <table border="0" width="100%" cellspacing="5">
                <tr><td colspan=2 align=center>
                        <tiles:insert attribute="header"></tiles:insert></td></tr>
                <tr><td width="15%" valign="top">
                        <tiles:insert attribute='navigator'></tiles:insert></td>
                    <td align="left">
                        <tiles:insert attribute='body'></tiles:insert></td></tr>
                <tr><td colspan="2"><hr></td></tr>
                <tr><td colspan=2 align=center>
                        <tiles:insert attribute="footer"></tiles:insert></td></tr>
            </table>
      </body>
    </html>
    -------------------------------------------------------------------------------------------------------


4) 在页面中引用 tiles:
    <tiles:insert definition="defall"/>
    也可以覆盖定义的属性值
    <tiles:insert definition="defall">
        <tiles:put name="title" value="my page"/>
    </tiles:insert>


3.使用tiles-define.xml定义tiles的好处:
    1) tiles可重用(被多个页面) 
    2) tiles的定义可以被"继承"和"覆盖"
    3) 使用已定义的definition



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -