Struts2攔截器是在訪問某個Action或者Action的某個方法,在字段前或者以後實施攔截,而且Struts2攔截器是能夠插拔的,攔截器是AOP的一種實現。前端
優勢:通用功能的封裝,提供可重用性。在struts-default.xml文件中能夠看到攔截器棧basicStack.咱們在引用的時候引用的是默認的攔截器棧 <default-interceptor-ref name=」defaultStack」/>咱們寫一個攔截器的例子:看一下攔截器是如何運行的,首先咱們創建一個HelloAction:java
1 public class HelloAction extends ActionSupport{ 2 private String name; 3 public String getName() { 4 return name; 5 } 6 public void setName(String name) { 7 this.name = name; 8 } 9 private static final long serialVersionUID = 1L; 10 @Override 11 public String execute() throws Exception { 12 This.name=」你好,構造器!」; 13 System.out.println("默認執行了Action的默認方法"); 14 return SUCCESS; 15 } 16 }
以後定義咱們本身的攔截器MyInterceptor:session
1 public class Myinterceptor implements Interceptor{ 2 @Override 3 public void destroy() { 4 // TODO Auto-generated method stub
5 System.out.println("攔截器銷燬"); 6 } 7 @Override 8 public void init() { 9 // TODO Auto-generated method stub
10 System.out.println("攔截器初始化"); 11 } 12 @Override 13 public String intercept(ActionInvocation invocation) throws Exception { 14 // TODO Auto-generated method stub
15 System.out.println("Action以前調用攔截器!"); 16 String result=invocation.invoke(); 17 System.out.println("Action以後調用攔截器!"); 18 return result; 19 } 20 }
result可以返回Action默認方法的調用結果。Struts.xml文件中的配置:jsp
1 <struts>
2 <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
3 <package name="manage" namespace="/" extends="struts-default">
4 <interceptors>
5 <interceptor 6 name="myInterceptor" class="com.java1234.Interceptor.Myinterceptor">
7 </interceptor>
8 </interceptors>
9 <global-results>
10 <result name="error">error.jsp</result>
11 </global-results>
12 <action name="hello" class="com.java1234.Action.HelloAction">
13 <result name="success">success.jsp</result>
14 <interceptor-ref name="myInterceptor"></interceptor-ref>
15 <interceptor-ref name="defaultStack"></interceptor-ref>//默認的攔截器是必須的! 16 </action>
17 </package>
18 </struts>
Success.jsp核心代碼:ide
1 <body> 2 Name:${name } 3 </body>
error.jsp代碼:post
1 <body> 2 錯誤信息:${error } <br/> 3 </body>
運行結果顯示:this
① 攔截器首先會被初始化:spa
②以後訪問http://localhost:8080/Struts2Chap04/hello:code
先訪問的是攔截器Myinterceptor------->接着訪問HelloAction--------->訪問攔截器,根據result的值爲success進行模板頁面跳轉到success.jsp頁面。攔截器Myinterceptor中的String result=invocation.invoke();能夠獲取到Action執行後的結果!出現結果爲:orm
咱們有一個簡單功能,就是登陸驗證,對於登陸的用戶能夠直接訪問gril.未登陸的用戶會跳轉到錯誤頁面,須要登陸才能由此功能!
So,咱們開始吧:首先是建一個Model,命名爲User:
1 public class User { 2 private String userName; 3 private String password; 4 public String getUserName() { 5 return userName; 6 } 7 public void setUserName(String userName) { 8 this.userName = userName; 9 } 10 public String getPassword() { 11 return password; 12 } 13 public void setPassword(String password) { 14 this.password = password; 15 } 16 }
service判斷,UserService:
1 public class UserService { 2 public boolean login(User user){ 3 if("java".equals(user.getUserName())&&"123456".equals(user.getPassword())){ 4 return true; 5 }else{ 6 return false; 7 } 8 } 9 }
UserAction:
1 public class UserAction extends ActionSupport{ 2 private User user; 3 private UserService userService=new UserService(); 4 private String error; 5 public User getUser() { 6 return user; 7 } 8 public void setUser(User user) { 9 this.user = user; 10 } 11 public String getError() { 12 return error; 13 } 14 public void setError(String error) { 15 this.error = error; 16 } 17 private static final long serialVersionUID = 1L; 18 @Override 19 public String execute() throws Exception { 20 // TODO Auto-generated method stub
21 if(userService.login(user)){ 22 ActionContext actionContext=ActionContext.getContext(); 23 Map<String, Object>session=actionContext.getSession(); 24 session.put("currentUser", user); 25 return SUCCESS; 26 }else{ 27 this.error="用戶名或者密碼錯誤"; 28 return "error"; 29 } 30 } 31 }
配置struts.xml文件:
1 <struts> 2 <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant> 3 <package name="manage" namespace="/" extends="struts-default"> 4 <interceptors> 5 <interceptor name="loginInterceptor" class="com.java1234.Interceptor.Logininterceptor"> 6 </interceptor> 7 <interceptor-stack name="mystack"> 8 <interceptor-ref name="loginInterceptor"></interceptor-ref> 9 <interceptor-ref name="defaultStack"></interceptor-ref> 10 </interceptor-stack> 11 </interceptors> 12 <default-interceptor-ref name="mystack"></default-interceptor-ref>
方法2 直接引用攔截器棧 能夠省去<interceptor-ref name="loginInterceptor"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>這部分代碼。
14 <global-results>
15 <result name="error">error.jsp</result>
16 </global-results>
17 <action name="user" class="com.java1234.Action.UserAction">
18 <result name="success">success.jsp</result>
19 <interceptor-ref name="defaultStack"></interceptor-ref>
20 </action>
21 <action name="gril" class="com.java1234.Action.GrilAction">
22 <result name="success">success.jsp</result>
23 <interceptor-ref name="loginInterceptor"></interceptor-ref> 24 <interceptor-ref name="defaultStack"></interceptor-ref>
方法1 直接引用各個攔截器。直接明瞭
25 </action>
26 </package>
27 </struts>
Success.jsp文件:
1 <body>
2 當前登陸的用戶爲:${currentUser.userName } 3 </body>
error.jsp文件
1 <body>
2 錯誤信息:${error } <br/>
3 <a href="login.jsp">登陸</a>
4 </body>
Login.jsp文件:
1 <body>
2 <form action="user" method="post">
3 用戶名:<input type="text" name="user.userName">
4 密 碼:<input type="password" name="user.password"><br/>
5 <input type="submit" value="登陸">
6 </form>
7 </body>
根據前端 http://localhost:8080/Struts2Chap04/login.jsp 顯示頁面:
輸入應戶名和密碼。這個時候利用user請求,先通過默認攔截器的攔截驗證,以後根據action=user,strut.xml文件中的配置action=user 由類UserAction處理 UserAction經過調用UserService來進行登陸判斷,進而肯定是否登陸成功?如下兩種狀況:
①用戶名爲java 密碼爲 123456 登陸成功,跳轉到success.jsp,顯示登陸結果!
②用戶名或者密碼錯誤,登陸失敗,跳轉到error.jsp頁面。
GrilAction代碼:
1 public class GrilAction extends ActionSupport{ 2 private static final long serialVersionUID = 1L; 3 @Override 4 public String execute() throws Exception { 5 // TODO Auto-generated method stub
6 System.out.println("看美女!"); 7 return SUCCESS; 8 } 9 }
若是在前端輸入http://localhost:8080/Struts2Chap04/gril ,會先進行攔截器的判斷,進入到Logininterceptor攔截器的攔截判斷中,
第一步:進入intercept方法。獲取到actionContext,以後利用actionContext獲取session,以後利用session獲取當前用戶,根據當前用戶是否爲空作出如下兩個選擇:
①currentUser不爲空,那麼就是說明已經登陸了,能夠直接進行訪問,因此這個時候進入到GrilAction中進行訪問。
②currentUser爲空,那麼就是說明沒有登陸,就不能直接訪問了,這個時候咱們獲取到request,利用request設置error,而且傳遞到前端,result設置爲error。以後struts.xml根據result進行處理。
核心代碼以下:
1 ActionContext actionContext=invocation.getInvocationContext(); 2 Map<String, Object> session=actionContext.getSession(); 3 Object currentUser=session.get("currentUser"); 4 String result=null; 5 if(currentUser!=null){ 6 result=invocation.invoke(); 7 }else{ 8 HttpServletRequest request=(HttpServletRequest)invocation.getInvocationContext().get(ServletActionContext.HTTP_REQUEST); 9 request.setAttribute("error", "您未登陸,請先登陸!"); 10 result="error"; 11 }
攔截器先告一段落,咱們還會回來的!