struts2笔记4
1.自定义struts拦截器
应用场景:如果用户登陆后可以访问action中的所有方法,如果用户没有登陆不允许访问action中的方法,并且提示“你没有操作权限”
1)两个页面,一个用户登陆user.jsp,一个用户退出quit.jsp,都放在WebRoot目录下
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% request.getSession().setAttribute("user","itcast"); %> 用户已经登陆
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% request.getSession().removeAttribute("user"); %> 用户已经退出登陆
2)新建一个Action用于访问
package cn.itcast.action; import java.util.Date; import javax.xml.registry.infomodel.PersonName; public class HelloWorld { private String message; public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } public String execute() throws Exception{ message="execute"; return "SUCCESS"; } public String add() throws Exception{ message="add"; return "SUCCESS"; } }
3)新建拦截器,当session中user有值的时候说明已经登陆,就调用invocation.invoke(),如果没有值,说明没有登陆,返回SUCCESS视图,将提示信息放在request范围
package cn.itcast.action; import java.util.Date; import javax.xml.registry.infomodel.PersonName; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionInvocation; import com.opensymphony.xwork2.interceptor.Interceptor; import com.sun.corba.se.impl.protocol.giopmsgheaders.Message; import com.sun.xml.internal.bind.v2.model.core.ID; public class PermissionInterception implements Interceptor{ /** * */ private static final long serialVersionUID = 1L; public void destroy() { // TODO Auto-generated method stub } public void init() { // TODO Auto-generated method stub } public String intercept(ActionInvocation invocation) throws Exception { Object user = ActionContext.getContext().getSession().get("user"); if(user!=null){ return invocation.invoke(); } ActionContext.getContext().put("message", "没有权限"); return "SUCCESS"; //返回到message视图 } }
4)配置struts.xml,重点是配置拦截器栈,并引用
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.action.extension" value="do,action"></constant> <package name="itcast" namespace="/test" extends="struts-default" > <interceptors> <interceptor name="permission" class="cn.itcast.action.PermissionInterception"></interceptor> <interceptor-stack name="permissionStack"> <interceptor-ref name="defaultStack"></interceptor-ref> <interceptor-ref name="permission"></interceptor-ref> </interceptor-stack> </interceptors> <global-results> <result name="SUCCESS">/WEB-INF/pages/message.jsp</result> </global-results> <action name="list_*" class="cn.itcast.action.HelloWorld" method="{1}"> <interceptor-ref name="permissionStack"></interceptor-ref> </action> </package> </struts>
2.对Action中所有方法进行输入校验
1)新建index页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> <%@ taglib uri="/struts-tags" prefix="s" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> </head> <body> <s:fielderror/> <form action="${pageContext.request.contextPath }/test/list_save.action" method="post"> 用户名:<input type="text" name="username"><br/> 手机号:<input type="text" name="mobile"><br/> <input type="submit" value="提交"/> </form> </body> </html>
这里引用struts的标签<s:fielderror/><%@ taglib uri="/struts-tags" prefix="s" %>,来显示校验的信息
2)struts.xml,配置input页面用来显示fielderror里的校验提示信息
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="itcast" namespace="/test" extends="struts-default" > <action name="list_*" class="cn.itcast.action.Hello" method="{1}"> <result name="message">/WEB-INF/pages/message.jsp</result> <result name="input">/index.jsp</result> </action> </package> </struts>
3)Action的代码,action继承ActionSupport,重写validate()方法,validate()方法会校验所有与execute方法签名相同的方法,当某个数据校验失败时,我们应该调用addFieldError();方法往系统的fielderror添加校验失败信息,如果系统的fielderror包含失败信息,struts2会将请求转发到名为input的result。在input视图中通过<s:fielderror/>来显示失败信息
package cn.itcast.action; import java.util.regex.Pattern; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; public class Hello extends ActionSupport{ private String username; private String mobile; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getMobile() { return mobile; } public void setMobile(String mobile) { this.mobile = mobile; } public String save(){ ActionContext.getContext().put("message", "保存成功"); return "message"; } public String update(){ ActionContext.getContext().put("message", "更新成功"); return "message"; } @Override public void validate() { if(this.username==null||"".equals(this.username.trim())){ this.addFieldError("username", "用户名不能为空"); } if(this.mobile==null||"".equals(this.mobile.trim())){ this.addFieldError("mobile", "手机号不能为空"); }else { if(!Pattern.compile("^1[358]\\d{9}$").matcher(this.mobile).matches()){ this.addFieldError("mobile", "手机号格式不正确"); } } } }
4)当请求的action改为update时也能进行校验,说明validate方法可以对action中的所有方法进行校验
3.对Action中指定方法进行校验,就是将validate方法名称改为validateXxx如:validateSave(S大写),就是对save方法进行校验
4.输入校验的流程
1)类型转换器对请求参数执行类型转换,并把转换后的值赋给Action中的属性
2)如果在执行类型转换的过程中出现异常,系统会将异常信息保存在ActionContext,conversionError拦截器将异常信息添加到fieldErrors里,不管类型转换是否出现异常都会进入第三步
3)系统通过反射技术先调用action中的validateXxx方法,Xxx为方法名
4)再调用action中的validate方法
5)经过上面4步,如果系统的fieldErrors中存在错误信息,系统系统将请求转发至input视图。如果系统中不存在任何错误信息,系统将执行action中的处理方法