Strusts2笔记9--防止表单重复提交和注解开发
2017-01-02 15:56
387 查看
防止表单重复提交:
用户可能由于各种原因,对表单进行重复提交。Struts2中使用令牌机制防止表单自动提交。以下引用自北京动力节点:
前端表单提交代码:
表单下添加<s:token/>即可。
struts.xml配置:
<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
示例代码一:
注意:注解中抽象方法,没有默认值的,都要赋值。但是Result注解的name、type、location、params都有默认值,所以可以不赋值。Action注解的results属性是结果视图数组,但是如果只有一个结果视图,可以不用大括号。
示例一对应的struts.xml配置:
示例代码二:
示例二对应的struts.xml配置:
示例三代码:
还保留struts.xml配置,主要用来定义拦截器:
示例三对应的struts.xml配置:
用户可能由于各种原因,对表单进行重复提交。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>
相关文章推荐
- 【学习笔记】Web开发中防止页面刷新后表单重复提交,表单Token设置示例
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Struts2学习笔记之<s:token/>防止表单重复提交
- Spring MVC拦截器+注解方式实现防止表单重复提交
- 移动项目开发笔记(asp.net防止页面刷新引起重复提交数据)
- Spring MVC拦截器+注解方式实现防止表单重复提交
- 开发日志:JS防止表单重复提交【优化版本】
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Web开发设计模式PRG:Post/Redirect/Get,防止重复提交表单
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Spring MVC拦截器+注解方式实现防止表单重复提交
- j2ee开发防止表单重复提交三大解决方案
- Spring MVC拦截器+注解方式实现防止表单重复提交
- Spring MVC拦截器+注解方式实现防止表单重复提交