*struts2如何配置拦截器
*拦截器实现身份验证
*Struts2中可以通过三种方式实现Dynamic Method Invocation
*struts2中配置编码,配置默认action,配置全局结果
1.新建类(该拦截器用户计算执行action的时间)
package net.sxif.vote.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
@SuppressWarnings("serial")
public class MyTimeInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
long startTime=System.currentTimeMillis();
String result=invocation.invoke();
long executionTime=System.currentTimeMillis()-startTime;
System.out.println("The interval time is"+executionTime+"millisecond");
return result;
}
}
2.struts.xml中配置interceptor
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="default" extends="struts-default">
<!-- 定义拦截器 -->
<interceptors>
<!-- 定义myTime拦截器 -->
<interceptor name="myTime" class="net.sxif.vote.interceptor.MyTimeInterceptor">
</interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="myTime"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定义默认拦截器 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
*拦截器实现身份验证
1.设计类
package net.sxif.vote.interceptor;
import java.util.Map;
import net.sxif.vote.entity.User;
import net.sxif.vote.util.AllKeys;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
@SuppressWarnings("serial")
public class AuthorizationInterceptor extends AbstractInterceptor {
@SuppressWarnings("unchecked")
@Override
public String intercept(ActionInvocation invocation) throws Exception {
//如果请求的action是login登陆的话不执行下面的拦截器
String theName=invocation.getInvocationContext().getName();
if(theName.equals("loginAction")){
return invocation.invoke();
}
Map session=invocation.getInvocationContext().getSession();
User user=(User)session.get(AllKeys.SESSION_USER_KEY);
if(user==null){
return "toLogin_success";
}
return invocation.invoke();
}
}
2.配置xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="default" extends="struts-default">
<!-- 定义拦截器 -->
<interceptors>
<interceptor name="author" class="net.sxif.vote.interceptor.AuthorizationInterceptor"></interceptor>
<!-- 定义拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="author"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定义默认拦截器 -->
<default-interceptor-ref name="myStack"></default-interceptor-ref>
***action中如何获取session
public String login(){
Map session=ActionContext.getContext().getSession();//获取session
User u=(User)userBiz.login(user.getName(),user.getPassword());
if(u!=null){
session.put(AllKeys.CURRENTUSER, u);
}
return null;
}
*Struts2中可以通过三种方式实现Dynamic Method Invocation
1.method属性
第一种:在struts.xml的<action/>中指定method属性
如果将<action/>中的method属性设置为method="abc"的话,具体执行过程如下
如果一个<s:form action="login">,那么就会生成LoginAction类的一个实例
接着就会由abc()方法来进行处理表单的请求,而不会自动的调用execute()方法了
2.页面中指定
第二种:在页面中指定调用Action类中的具体的方法
在前台页面中设定成<s:form action="login!hello.action">
在struts.xml中为<action name="login" class="com.jadyer.action.LoginAction">
这样当发送请求时,就会自动跳转到LoginAction中,然后执行里面的hello()方法
这种方式的作用与第一种设定method属性的方式,最终实现的效果都是一样的
3.使用通配符
第三种:使用通配符通过模糊匹配的方式调用Action的方法
符号有三种,分别为 * ** /
在struts.xml中设定为<action name="*User" class="...UserAction" method="{1}">
假设在前台页面中设定成<s:form action="addUser">
*struts2中配置编码,配置默认action,配置全局结果
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!-- 设置编码 -->
<constant name="stuts-il8n-encoding" value="utf-8"></constant>
<package name="default" extends="struts-default">
<!-- 定义默认的action -->
<default-action-ref name="defaultAction"></default-action-ref>
<!-- 定义全局结果,如果出现错误跳转至该页 -->
<global-results>
<result name="error" type="redirect">error.html</result>
</global-results>
<action name="defaultAction">
<result>/fileNotFound.html</result>
</action>