Struts2牛逼的攔截器,臥槽這纔是最牛的核心!

struts 攔截器

攔截器簡介及簡單的攔截器實例

  Struts2攔截器是在訪問某個Action或者Action的某個方法,在字段前或者以後實施攔截,而且Struts2攔截器是能夠插拔的,攔截器是AOP的一種實現。前端

 

優勢:通用功能的封裝,提供可重用性。struts-default.xml文件中能夠看到攔截器棧basicStack.咱們在引用的時候引用的是默認的攔截器棧 <default-interceptor-ref name=」defaultStack」/>咱們寫一個攔截器的例子:看一下攔截器是如何運行的,首先咱們創建一個HelloActionjava

 

 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">&nbsp;&nbsp;
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=userstrut.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         }

攔截器先告一段落,咱們還會回來的!

相關文章
相關標籤/搜索