读书人

基于Struts2.1 annotation的Intercept

发布时间: 2012-09-13 09:51:52 作者: rapoo

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

查阅了网络上的文章,同时结合自己的实践,将今天的学习结果分享如下,欢迎大家拍砖。

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

Interceptor代码如下:

?view plaincopy to clipboardprint?
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();??
??????? }??
??? }??
?
}?
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文件配置如下:

view plaincopy to clipboardprint?
<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"???
??????????????? 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代码如下:

view plaincopy to clipboardprint?
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("显示用户出现异常");??
??????? }??
??? }??
??? ...略...??
}?
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代码如下:

view plaincopy to clipboardprint?
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";??
??????? }??
??? }??
??? ...略...??
}?
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的代码:

view plaincopy to clipboardprint?
@InterceptorRefs({??
?@InterceptorRef("defaultStack")??
})?
@InterceptorRefs({
?@InterceptorRef("defaultStack")
})

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

view plaincopy to clipboardprint?
@InterceptorRefs({??
??? @InterceptorRef("auctionStack")??
})?
@InterceptorRefs({
?@InterceptorRef("auctionStack")
})

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

view plaincopy to clipboardprint?
@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")??
??? }??
)?
?@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")
??}
?)

5. 留意<interceptor-stack name="auctionStack">的定义。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/kompin_dmx/archive/2010/11/06/5992256.aspx

读书人网 >软件架构设计

热点推荐