Struts2.0深入学习 命名空间,模型驱动,表单重复提交

Struts2深入探索:
    1,package中的abstract="true"表示该package里面不能包函action元素
   
    2,package中若指定namespace="/mynamespace"则:
        <!--
            包的namespace要以"/"开头,对应的页面的路径前面也加上/mymengya/ActionName.action
            如:<s:form action="/mymengya/register.action" method="post" theme="simple">
         -->
        <package name="mengya" extends="struts-default" namespace="/mymengya">
           
            <action name="register"
                class="com.mengya.action.RegisterAction">
                <result name="success">/show.jsp</result>
                <result name="input">/index.jsp</result>
                <result name="invalid.token">/index.jsp</result>
                <interceptor-ref name="token"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
               
            </action>
           
        </package>
        在页面form的action中也要加上/mynamespase并且还要加上后缀action(不管是不是用的struts标签)
       
    3,模型驱动
        /**
         * 模型Bean
         * @author 张明学
         *
         */
        public class RegisterBean {
            private String username;
       
            private String password;
       
            public String getPassword() {
                return password;
            }
       
            public void setPassword(String password) {
                this.password = password;
            }
       
            public String getUsername() {
                return username;
            }
       
            public void setUsername(String username) {
                this.username = username;
            }
       
        }
        Action则要接实com.opensymphony.xwork2.ModelDriven接口:
        public class RegisterAction extends ActionSupport implements ModelDriven {
   
            /**
             * 模型驱动,该模型Bean必须实例化
             */
            private RegisterBean loginBean = new RegisterBean();
       
            public Object getModel() {
                return loginBean;
            }
       
            @Override
            public String execute() throws Exception {
       
                return SUCCESS;
            }
       
        }
        对应页面则可以直接用模型Bean的属性
        如:<tr>
            <td>
                用户名:   
                <s:textfield name="username"></s:textfield>
                <%-- 将form的theme="simple"就可以自由布局了,对于fielderror加上name属性就可以显示这个属生的错误信息 --%>
                <s:fielderror name="username"></s:fielderror>
            </td>
           </tr>
           <tr>
                <td>
                    密码:
                    <s:password name="password"></s:password>
                    <s:fielderror name="password"></s:fielderror>
                </td>
           </tr>
          
          <s:property value="username"/>
            <s:property value="password"/>
           
      5,表单重复提交:
          一,在form里面加上<s:token id="register"></s:token>标签
          二,在Action里加上<interceptor-ref name="token"></interceptor-ref>拦截器
              默认拦截器:<interceptor-ref name="defaultStack"></interceptor-ref>
          三:原理:
              当页面第一次生成的时候<s:token id="register"></s:token>会生成一个隐藏表单域其中包涵一个值,该值 也同样被存放到session当中去了
              当页面第一次提交的时候token拦截器会比较这两个值是否相同,相同则第一次提交,第一次提交后会把session这个值清空,表单若再一次提交时则
              session当中没有值即两个值不相同提交失败,返回的resut的name为:invalid.token 即:<result name="invalid.token">/index.jsp</result>
              <s:form action="/mymengya/register.action" method="post" theme="simple">
            <s:token id="register"></s:token>
            <table width="50%">
                <tr>
                    <td>
                        用户名:   
                        <s:textfield name="username"></s:textfield>
                        <s:fielderror name="username"></s:fielderror>
                    </td>
                </tr>
                <tr>
                    <td>
                        密码:
                        <s:password name="password"></s:password>
                        <s:fielderror name="password"></s:fielderror>
                    </td>
                </tr>
                <tr>
                    <td>
                        <s:submit value="注册"></s:submit>
                    </td>
               
                </tr>
            </table>
            </s:form>
           
            <package name="mengya" extends="struts-default" namespace="/mymengya">
       
                <action name="register"
                    class="com.mengya.action.RegisterAction">
                    <result name="success">/show.jsp</result>
                    <result name="input">/index.jsp</result>
                    <result name="invalid.token">/index.jsp</result>
                    <interceptor-ref name="token"></interceptor-ref>
                    <interceptor-ref name="defaultStack"></interceptor-ref>
                   
                </action>
               
            </package>
           
            修改Struts2默认的重复提交的错误提示信息:
            在Struts2国际化属性文件中添加一条信息:
            struts.messages.invalid.token = \u8868\u5355\u4e0d\u5141\u8bb8\u91cd\u590d\u63d0\u4ea4
            struts.messages.invalid.token = 不能重复提交

你可能感兴趣的:(jsp,bean,struts)