您的位置:首页 > 编程语言 > Java开发

struts2 实战(二)

2015-07-20 10:54 399 查看
上一篇文章中这里写链接内容Action类中继承的BaseAction是这样的,BaseAction主要是继承了ActionSupport类,并写了一些公用的方法。

package com.xingguo.action;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class BaseAction extends ActionSupport{

private static final long serialVersionUID = 1L;

//获取session
public Map<String,Object> getSession(){

return ActionContext.getContext().getSession();
}

public void putSession(String key,Object value){
getSession().put(key, value);
}

public HttpServletRequest getHttpServletRequest(){
return ServletActionContext.getRequest();
}

public String getUserIp(){
return getHttpServletRequest().getRemoteAddr();
}
}


下面介绍一下拦截器(interceptor),struts2默认的拦截器名字是defaultStack,也可以自己新建拦截器,新建的拦截器包含默认的和自己新建的。具体如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<!-- 修改默认请求后缀(login.action/login.do/login) -->
<constant name="struts.action.extension" value="action,do,,"></constant>

<!-- 加载product的action配置 -->
<include file="struts-product.xml"/>
<include file="struts-user.xml"/>
<include file="struts-file.xml"/>

<package name="basePackage" extends="struts-default" abstract="true">
<interceptors>
<interceptor name="loginIntercetor" class="com.xingguo.intercetor.LoginIntercetor"/>
<interceptor-stack name="myStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="loginIntercetor"/>
</interceptor-stack>

</interceptors>

<default-interceptor-ref name="myStack"/>

<global-results>
<result name="login" type="redirectAction">
<param name="namespace">/user</param>
<param name="actionName">login</param>
</result>
</global-results>

</package>

</struts>


-标签中name=”basePackage”表示包名可以被继承,extends=”struts-default”表示继承自默认的包,abstract=”true”属性为true表示里面不能写标签,即使写了也不生效。

里面依次写interceptors 、interceptor、interceptor-stack、interceptor-ref标签。其中interceptor为自己新建的拦截器,interceptor-stack拦截器栈,指向默认拦截器和自己新建的拦截器。

更改默认拦截器栈为自己的。

-标签表示全局返回值的请求转发或重定向。

拦截器命名为loginIntercetor。

package com.xingguo.intercetor;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class LoginIntercetor extends AbstractInterceptor{

private static final long serialVersionUID = 1L;

@Override
public String intercept(ActionInvocation arg) throws Exception {

ActionProxy proxy = arg.getProxy();
String namespace = proxy.getNamespace();
String actionName = proxy.getActionName();

if(namespace.equals("/user") && (actionName.equals("login")||actionName.equals("logins"))){
return arg.invoke();
}else{

ActionContext act = arg.getInvocationContext();
Map<String,Object> session = act.getSession();
Object user = session.get("user");
if(user != null){
return arg.invoke();
}else{

return "login";
}
}

}

}


拦截器需要继承AbstractInterceptor,重写intercept方法。如果验证通过,给予放行则使用ActionInvocation的invoke()方法。否则返回“login”,根据struts.xml中的配置转向相应的页面。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: