java SSH第一章學習內容(Struts2攔截器,攔截器堆疊)
Struts2攔截器,需要導相應的jar包及複製Struts.xml檔案到src目錄下,web.xml進行修改
攔截器
在訪問Action的時候進行攔截處理,需要繼承AbstractInterceptor,重寫intercept方法
案例一:在訪問Action輸出一句話(買電腦),使用攔截器在訪問Action之前和之後各輸出一句話(送鍵盤)(送滑鼠)
1.新建一個買電腦的action,繼承ActionSupport,進行輸出一句話
public class BuyAction extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("買電腦");
return SUCCESS;
}
}
2.JSP頁面提交到Action中
<form action="/8.28lanjieqi/login.action">
<input type="submit" value="提交">
</form>
3.新建一個買電腦送優惠的類用作於攔截器,繼承AbstractInterceptor,重寫裡面的intercept方法,這句話代表String obj=arg0.invoke();相當於攔截前輸出或則攔截後輸出,案例中表示攔截前送鍵盤,攔截後送滑鼠
public class YouhuiAction extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("送鍵盤");
String obj=arg0.invoke();
System.out.println("送滑鼠");
return obj;
}
}
4.修改struts.xml,在裡面定義、使用攔截器
<!-- 例項一 -->
<interceptors>
<!-- interceptors標籤裡的interceptor定義攔截器 -->
<interceptor name="YouhuiAction" class="com.action.YouhuiAction">
</interceptor>
</interceptors>
<action name="login" class="com.action.BuyAction">
<!-- 結果為“success”時,跳轉至success.jsp頁面 -->
<result name="success">/index.jsp</result>
<!-- 設定使用攔截器 ,defaultStack是核心攔截器,如果只設置自己的,就不再走Struts核心攔截器 -->
<interceptor-ref name="YouhuiAction"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
執行結果:
攔截器堆疊
如果攔截器過多,可以把打放進一個自定義的攔截器堆疊當中,當有action需要訪問的時候,可以在配置檔案中進行設定堆疊名即可
如在上述案例中多一個攔截器,可以把該攔截器放進攔截堆疊中,讓需要使用攔截器的Action進行呼叫
1.建立送貨攔截器
public class SonghuoAction extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
String obj=arg0.invoke();
System.out.println("點贊好評免費送貨");
return obj;
}
}
2.在配置檔案中設定堆疊
<!-- 堆疊,把需要的攔截器放進堆疊,當呼叫的使用直接輸入堆疊別名即可 -->
<interceptors>
<!-- interceptors標籤裡的interceptor定義攔截器 -->
<interceptor name="YouhuiAction" class="com.action.YouhuiAction">
</interceptor>
<interceptor name="SonghuoAction" class="com.action.SonghuoAction">
</interceptor>
<!-- 定義攔截器堆疊 -->
<interceptor-stack name="tt">
<interceptor-ref name="YouhuiAction"></interceptor-ref>
<interceptor-ref name="SonghuoAction"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 定義預設攔截器引用 -->
<default-interceptor-ref name="YouhuiAction">
</default-interceptor-ref>
<!-- 指定攔截器引用 -->
<action name="login" class="com.action.BuyAction">
<!-- 結果為“success”時,跳轉至success.jsp頁面 -->
<result name="success">/index.jsp</result>
<interceptor-ref name="tt"></interceptor-ref>
</action>
執行結果:
案例二:用攔截器登入驗證,如使用者必須在登入頁面通過使用者名稱和密碼訪問登入的Action跳轉到首頁,防止使用者直接訪問首頁的Action
1.建立實體類,裡面有name+pwd的屬性,get+set方法
2.在login.jsp頁面中設定訪問login.action
<form action="/8.28lanjieqilogin/login.action">
使用者名稱:<input type="text" name="users.name"/>
密碼:<input type="password" name="users.pwd"/>
<input type="submit" value="提交"/>
</form>
3.新建loginAction,呼叫實體類,繼承ActionSupport用於重寫execute()方法,實現SessionAware介面用於獲得Session存值,用於判斷使用者是否通過登入跳轉到首頁
public class loginAction extends ActionSupport implements SessionAware{
private Map session;
private Users users;
public Users getUsers() {
return users;
}
public void setUsers(Users users) {
this.users = users;
}
public Map getSession() {
return session;
}
@Override
public String execute() throws Exception {
if (users.getName().equals("admin")&&users.getPwd().equals("123456")) {
session.put("users", users);
return SUCCESS;
}else {
return ERROR;
}
}
@Override
public void setSession(java.util.Map<String, Object> session) {
this.session=session;
}
}
4.建立首頁的Aciton,當訪問了該Action進行輸出一句話
public class IndexAction extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("謝謝您的光臨");
return SUCCESS;
}
}
5.建立跳轉Action的攔截器,驗證使用者是否通過登入頁面跳轉過來的,需要繼承AbstractInterceptor,重寫intercept方法,判斷之前存的Session是否為空,為空則跳轉為登入頁面,如不為空則正常執行
public class LLAction extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation arg0) throws Exception {
System.out.println("進入攔截器");
Map session = arg0.getInvocationContext().getSession();
if (session.get("users")!=null) {
return arg0.invoke();
}else {
return Action.LOGIN;
}
}
}
6.修改一下配置檔案,定義、配置監聽類
<interceptors>
<interceptor name="LLAction" class="com.action.LLAction"></interceptor>
</interceptors>
<action name="login" class="com.action.loginAction">
<!-- 結果為“success”時,跳轉至success.jsp頁面 -->
<result name="success">/index.jsp</result>
<!-- 結果為"error"時,跳轉至fail.jsp頁面 -->
<result name="error">/login.jsp</result>
<result name="input">/login.jsp</result>
</action>
<action name="index" class="com.action.IndexAction">
<result name="success">/index.jsp</result>
<result name="login">/login.jsp</result>
<result name="error">/login.jsp</result>
<interceptor-ref name="LLAction"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
執行結果:直接拼接專案/Action名字.action無法訪問,當註冊登入可以訪問
直接訪問返回登入頁面