Strusts2笔记9--防止表单重复提交和注解开发

防止表单重复提交:

  用户可能由于各种原因,对表单进行重复提交。Struts2中使用令牌机制防止表单自动提交。以下引用自北京动力节点:

  

  前端表单提交代码:

 1 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
 2 <%@ taglib uri="/struts-tags" prefix="s"%>
 3 
 4 <html>
 5   <head>
 6     <title>index page</title>
 7   </head>
 8   
 9   <body>
10     <form action="test/login.action" method="POST">
11         <s:token/>
12         用户名:<input type="text" name="name"/><br>
13         年龄:<input type="text" name="age"/><br>
14         <input type="submit" value="提交"/>
15     </form>
16   </body>
17 </html>

  表单下添加<s:token/>即可。

  struts.xml配置:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2     <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 <struts>
 6     <package name="demo" namespace="/test" extends="struts-default">
 7         <action name="login" class="com.tongji.actions.LoginAction">
 8             <result>/welcome.jsp</result>
 9             <result name="invalid.token">/message.jsp</result>
10             <interceptor-ref name="token"/>
11             <interceptor-ref name="defaultStack"/>
12         </action>
13     </package>
14 </struts>

   <result name="invalid.token">/message.jsp</result> 表单重复提交无效时,跳转的视图。因为要使用invalid.token视图,所以自定义的Action类要继承自ActionSupporter类。

 

 

Struts2标签:

  Struts2提供了非常强大的标签支持,使用之前首先要加入taglib指令将标签库引入:

  <%@ taglib uri="/struts-tags" prefix="s"%>  在Struts2框架中的docs目录中的tag-reference.html页面,可查看到所有Struts2标签文档。

  但是,该标签只适用于Struts2框架,当框架升级或改变时,该标签就失效了。因此,如果大量使用Struts2标签开发前端页面的话,进行二次开发的时候,换后端框架之后,前端页面基本就不能使用了。

  所以,尽量少用Struts2标签,除非使用Struts2标签能带来很大的方便,比如令牌机制<s:token/>。

 

 

注解式开发:

  使用Struts2注解,需要将注解的Jar包struts2-convention-plugin-2.3.24.jar导入。

  在使用Struts2注解,主要是用于完成对Action的定义。但诸如常量定义、拦截器定义等还需要在struts.xml中完成。所以,根据需要确定Struts2配置文件struts.xml是否删除。

  Struts2注解主要有:@ParentPackage、@NameSpace、@Results、@Result、@Action、@InterceptorRef、@InterceptorRefs

  示例代码一:

 1 package com.tongji.actions;
 2 
 3 import org.apache.struts2.convention.annotation.Action;
 4 import org.apache.struts2.convention.annotation.Namespace;
 5 import org.apache.struts2.convention.annotation.ParentPackage;
 6 import org.apache.struts2.convention.annotation.Result;
 7 
 8 @ParentPackage(value="struts-default")
 9 @Namespace(value="/test")
10 public class LoginAction {
11     private String name;
12     private int age;
13     
14     public String getName() {
15         return name;
16     }
17     
18     public void setName(String name) {
19         this.name = name;
20     }
21     
22     public int getAge() {
23         return age;
24     }
25     
26     public void setAge(int age) {
27         this.age = age;
28     }
29 
30     @Action(value="login",results=@Result(type="redirectAction", location="other", params={"uname","%{name}","uage","%{age}"}))
31     public String execute() {
32         System.out.println("name = " + name);
33         System.out.println("age = " + age);
34         return "success";
35     }
36     
37 }

  

package com.tongji.actions;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;

@ParentPackage(value="struts-default")
@Namespace(value="/test")
public class OtherAction {
    private String uname;
    private int uage;
    
    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public int getUage() {
        return uage;
    }

    public void setUage(int uage) {
        this.uage = uage;
    }

    @Action(value="other", results={@Result(name="success",type="dispatcher",location="/welcome.jsp")})
    public String execute() {
        return "success";
    }
}

  注意:注解中抽象方法,没有默认值的,都要赋值。但是Result注解的name、type、location、params都有默认值,所以可以不赋值。Action注解的results属性是结果视图数组,但是如果只有一个结果视图,可以不用大括号。

    示例一对应的struts.xml配置:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2     <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 <struts>
 6     <package name="demo" namespace="/test" extends="struts-default">
 7         <action name="login" class="com.tongji.actions.LoginAction">
 8             <!-- <result type="redirect">/welcome.jsp?uname=${name}&amp;uage=${age}</result> -->
 9             <result type="redirectAction">
10                 <param name="actionName">other</param>
11                 <param name="uname">${name}</param>
12                 <param name="uage">${age}</param>
13             </result>
14         </action>
15         <action name="other" class="com.tongji.actions.OtherAction">
16             <result>/welcome.jsp</result>
17         </action>
18     </package>
19 </struts>

    

  示例代码二:

 1 package com.tongji.actions;
 2 
 3 import org.apache.struts2.convention.annotation.Action;
 4 import org.apache.struts2.convention.annotation.Namespace;
 5 import org.apache.struts2.convention.annotation.ParentPackage;
 6 import org.apache.struts2.convention.annotation.Result;
 7 import org.apache.struts2.convention.annotation.Results;
 8 
 9 @ParentPackage(value="struts-default")
10 @Namespace(value="/test")
11 @Results({@Result(location="/welcome.jsp"),   //全局视图
12           @Result(name="fail", location="/fail.jsp")})
13 public class LoginAction {
14     private String name;
15     private int age;
16     
17     public String getName() {
18         return name;
19     }
20     
21     public void setName(String name) {
22         this.name = name;
23     }
24     
25     public int getAge() {
26         return age;
27     }
28     
29     public void setAge(int age) {
30         this.age = age;
31     }
32 
33     @Action("some")
34     public String doSome() {
35         if ("qjj".equals(name)) {
36             return "success";
37         }
38         return "fail";
39     }
40     @Action(value="second",results=@Result(name="old", location="/old.jsp"))
41     public String doSecond() {
42         if (age < 15) {
43             return "fail";
44         } else if (age > 50) {
45             return "old";
46         }
47         return "success";
48     }
49 }

    示例二对应的struts.xml配置:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2     <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 <struts>
 6     <package name="demo" namespace="/test" extends="struts-default">
 7         <!-- 定义包全局视图 -->
 8         <global-results>
 9             <result>/welcome.jsp</result>
10             <result name="fail">/fail.jsp</result>
11         </global-results>
12         
13         <action name="some" class="com.tongji.actions.LoginAction" method="doSome" />
14         <action name="second" class="com.tongji.actions.LoginAction" method="doSecond">
15             <result name="old">/old.jsp</result>
16         </action>
17     </package>
18 </struts>

   示例三代码:

 1 package com.tongji.actions;
 2 
 3 import org.apache.struts2.convention.annotation.Action;
 4 import org.apache.struts2.convention.annotation.InterceptorRef;
 5 import org.apache.struts2.convention.annotation.Namespace;
 6 import org.apache.struts2.convention.annotation.ParentPackage;
 7 import org.apache.struts2.convention.annotation.Result;
 8 
 9 @ParentPackage(value="demo")
10 @Namespace(value="/test")
11 public class SystemAction {
12     
13     @Action(value="system",results={@Result(location="/welcome.jsp"),@Result(name="fail", location="/fail.jsp")},
14             interceptorRefs=@InterceptorRef("permissionStack"))
15     public String execute() {
16         System.out.println("已经进入系统");
17         return "success";
18     }
19 }

    还保留struts.xml配置,主要用来定义拦截器:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2     <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 <struts>
 6     <package name="demo" namespace="/test" extends="struts-default">
 7         <interceptors>
 8             <interceptor name="permissionInterceptor" class="com.tongji.interceptors.PermissionInterceptor"/>
 9             <interceptor-stack name="permissionStack">
10                 <interceptor-ref name="permissionInterceptor"/>
11                 <interceptor-ref name="defaultStack"/>
12             </interceptor-stack>
13         </interceptors>
14 
15         <action name="login">
16             <result>/login.jsp</result>
17         </action>
18         <action name="logout">
19             <result>/logout.jsp</result>
20         </action>
21         <action name="index">
22             <result>/index.jsp</result>
23         </action>
24     </package>
25 </struts>

    示例三对应的struts.xml配置:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2     <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
 4     "http://struts.apache.org/dtds/struts-2.3.dtd">
 5 <struts>
 6     <package name="demo" namespace="/test" extends="struts-default">
 7         <interceptors>
 8             <interceptor name="permissionInterceptor" class="com.tongji.interceptors.PermissionInterceptor"/>
 9         </interceptors>
10         <action name="system" class="com.tongji.actions.SystemAction">
11             <result>/welcome.jsp</result>
12             <result name="fail">/fail.jsp</result>
13             <!-- 一旦显示的声明了action要使用拦截器,则系统默认的拦截器栈defaultStack将不再执行-->
14             <interceptor-ref name="permissionInterceptor"/>
15             <interceptor-ref name="defaultStack"/>
16         </action>
17         
18         <action name="login">
19             <result>/login.jsp</result>
20         </action>
21         <action name="logout">
22             <result>/logout.jsp</result>
23         </action>
24         <action name="index">
25             <result>/index.jsp</result>
26         </action>
27     </package>
28 </struts>

 

posted @ 2017-01-02 15:56  拉夫德尔  阅读(397)  评论(0编辑  收藏  举报