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

基于Struts2.1 annotation的Interceptor代码实例

2010-11-06 21:18 316 查看
查阅了网络上的文章,同时结合自己的实践,将今天的学习结果分享如下,欢迎大家拍砖。

 

/WEB-INF/lib/下包含以下jar包(但不只这两个)
struts2-core-2.1.6.jar
struts2-convention-plugin-2.1.6.jar

 

Interceptor代码如下:

 
package com.kompin.kind.action;

import java.util.Map;

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

public class AuthorityInterceptor extends AbstractInterceptor {

@Override
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("Enter AuthorityInterceptor");
Map session = ActionContext.getContext().getSession();
Object userId = session.get("userId");
if (userId == null)
{
return "login";
}
else
{
return invocation.invoke();
}
}

}


 

struts.xml文件配置如下:

<struts>

<constant name="struts.118n.encoding" value="GBK"/>
<constant name="struts.custom.i18n.resources" value="globalMessages"/>
<constant name="struts.convention.action.mapAllMatches" value="true"/>

<package name="kompinInterceptor" extends="struts-default">

<interceptors>
<interceptor name="authority"
class="com.kompin.kind.action.interceptor.AuthorityInterceptor"/>
<interceptor-stack name="auctionStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="authority"/>
</interceptor-stack>
</interceptors>

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

<global-results>
<result name="login">/WEB-INF/jsp/login.jsp</result>
<result name="exception">/WEB-INF/jsp/error.jsp</result>
</global-results>

</package>

</struts>


 

User action代码如下:

package com.kompin.kind.action;

import java.util.List;
import java.util.Map;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import com.kompin.kind.business.UserBean;
import com.kompin.kind.service.UserService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

@ParentPackage("kompinInterceptor")
@InterceptorRefs({
@InterceptorRef("defaultStack")
})
@Results({
@Result(name="login", location="/WEB-INF/jsp/login.jsp")
})
public class UserAction extends ActionSupport {

private Integer id;
private String name;
private String pass;
private String email;
private UserService userSvc;
private List<UserBean> users;
private UserBean user;

@Action(value="/regist",
results={
@Result(name="success", type="dispatcher", location="/WEB-INF/jsp/login.jsp")
,@Result(name="failure", type="dispatcher", location="/WEB-INF/jsp/failure.jsp")
,@Result(name="input", type="dispatcher", location="/WEB-INF/jsp/regist.jsp")
}
)
public String regist()throws Exception{
try {
if(null == getName() ||null == getPass() || null == getEmail()){
return "input";
}
if (userSvc.addUser(getName(), getPass(), getEmail()) > 0) {
return "success";
}
return "failure";
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new Exception("注册用户出现异常");
}
}

@Action(value="/proShowUser",
interceptorRefs=@InterceptorRef("authority"),
results={
@Result(name="success", type="dispatcher", location="/WEB-INF/jsp/viewUser.jsp")
,@Result(name="failure", type="dispatcher", location="/WEB-INF/jsp/failure.jsp")
,@Result(name="input", type="dispatcher", location="/WEB-INF/jsp/login.jsp")
}
)
public String show()throws Exception{
try {
setUsers(userSvc.findAllUser());
return "success";
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new Exception("显示用户出现异常");
}
}
...略...
}


 

Kind action代码如下:

package com.kompin.kind.action;

import java.util.List;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;

import com.kompin.kind.business.KindBean;
import com.kompin.kind.service.KindService;
import com.opensymphony.xwork2.ActionSupport;

@ParentPackage("kompinInterceptor")
@InterceptorRefs({
@InterceptorRef("auctionStack")
})
@Results({
@Result(name="login", location="/WEB-INF/jsp/login.jsp")
})
public class KindAction extends ActionSupport {

private KindService kindSvc;
private List kinds;
private String kindName;
private String kindDesc;
private KindBean kind;

/**
*
* @param kindSvc
*/
@Action(value="/proAddKind",
results={
@Result(name="success", type="chain", location="proViewKind")
,@Result(name="failure", type="dispatcher", location="/WEB-INF/jsp/addKind.jsp")
,@Result(name="input", type="dispatcher", location="/WEB-INF/jsp/addKind.jsp")
}
)
public String addKind()throws Exception{
try {
if (kindSvc.addKind(kindName, kindDesc) > 0) {
return "success";
}
return "input";
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
return "input";
}
}
...略...
}
  

 

 

要点说明:

 

1. @ParentPackage("kompinInterceptor")必须和struts.xml的package的name一致,否则启动tomcat会报错:

"Unable to find interceptor class referenced by ref-name ..."

 

2. 如果Action中并不是所有的方法都要auctionStack拦截,参考UserAction的代码:

@InterceptorRefs({
@InterceptorRef("defaultStack")
})


 

3. 如果Action中所有的方法都经过同一个拦截器拦截,,参考KindAction的代码:

@InterceptorRefs({
@InterceptorRef("auctionStack")
})


 

4. 如果Action中的某些方法需要特定的拦截器拦截,参考UserAction的代码(请留意proShowUser的Action注解与regist的Action注解的不同点):

@Action(value="/proShowUser",
interceptorRefs=@InterceptorRef("authority"),
results={
@Result(name="success", type="dispatcher", location="/WEB-INF/jsp/viewUser.jsp")
,@Result(name="failure", type="disp
4000
atcher", location="/WEB-INF/jsp/failure.jsp")
,@Result(name="input", type="dispatcher", location="/WEB-INF/jsp/login.jsp")
}
)
 

 

5. 留意<interceptor-stack name="auctionStack">的定义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息