您的位置:首页 > 其它

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

2017-01-02 15:56 387 查看
防止表单重复提交:

  用户可能由于各种原因,对表单进行重复提交。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}&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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: