interceptor是一個攔截器棧 看出來了嗎html
web目錄下java
---web/WEB-INF/web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <!--struts工做原理1 先是配置過濾器 請求過來一系列過濾器 核心是一個StrutsPrepareAndExecuteFilter(以前是FilterDispatcher) StrutsPrepareFilter ExecuteFilter 這兩個--> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> StrutsPrepareAndExecuteFilter過濾器是這個類 注意 這是一個類 之前是FilterDispather 2.1.3開始 分了兩種StrutsPrepareFilter和ExecuteFilter 能夠在action執行以前添加本身的過濾器 </filter> <filter-mapping> <filter-name>struts2</filter-name> <!-- -struts工做原理1.1 全部請求都會通過struts2的過濾器 struts2過濾本身相關的 好比.action 若是是.html .jsp就放行--> <!-- -struts工做原理1.2 只有.action後綴的會到ActionMapper請求這裏查找 當前請求有沒有指定的action 若是有 找到以後會朝上走 回到過濾器StrutsPrepareAndExecuteFilter 而後走到ActionProxy 就像下面--> <!-- -struts工做原理2 而後再往左邊走到ActionProxy ActionProxy經過ConfigurationManger讀 struts.xml 找到具體的action類--> <!-- -struts工做原理3 經過ActionProxy代理建立action的一個反向的實例 再經歷一系列的攔截器執行到Action 返回一個String的Result--> <!-- -struts工做原理4 這個Result對應的就是一個視圖 Template 包括jsp freemarker 等等 再通過一系列的攔截器 經過HttpServletResponse返回到用戶的實例進行顯示--> <url-pattern>/'*'</url-pattern>//這裏沒辦法啊 應該就是/*的 </filter-mapping> </web-app>
---web/WEB-INF/lib
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.2.jar
commons-logging-1.1.3.jar
freemarker-2.3.22.jar
javassist-3.11.0.GA.jar
ognl-3.0.6.jar
struts2-core-2.3.24.1.jar
xwork-core-2.3.24.1.jarweb
---web/WEB-INF
---result.jspapache
<%@ page contentType = "text/html;charset=UTF-8" language = "java" %> <html> <head> <title></title> </head> <body> This is result.jsp </body> </html> http://localhost:8080/HelloWorld/helloworld.action 能夠看到 struts2中Action的execute方法 是沒有傳入 HttpServletRequest和 HttpServletResponse對象的 @Override public String execute() throws Exception { System.out.println("執行Action"); return SUCCESS; } struts2提供了三種方式訪問Servlet Api 1.ActionContext 2.實現***Aware接口 3.ServletActionContext http://localhost:8080/HelloWorld/aaa/aaaa/helloworld.action這樣也能夠...這是爲何? //若是要能夠 namespace不該該改爲/aaa/aaaa/嗎 //找到/最後一級 找到了這個action 因此沒有報錯 <package name="default" namespace="/" extends="struts-default"> <action name="helloworld" class="HelloWordAction"> //<!-- result後面能夠跟name和type的 默認的話 默認的話是SUCCESS--> <result>/result.jsp</result> </action> </package>
這裏講一下Aciton的搜索機制
http:/localhost:8080/sturts/path1/path2/path3/student.action
第一步:判斷package是否存在,如:path1/path2/path3/
存在app
第二步:action是否存在 若是不存在則去默認namespace的package裏面尋找action
第三步:若是沒有,則報錯
不存在
第二步:檢查上一級路徑的package是否存在(直到默認namespace),重複第一步
第三步:若是沒有 則報錯jsp
3.動態方法調用
爲了解決一個Action對應多個請求的處理 以避免Action太多
方法 1.指定method屬性 2.感嘆號方式 3.通配符方式
1.指定method屬性
---HelloWordAction.javaide
public String add(){return SUCCESS;} public String update(){return SUCCESS;}
---struts.xmlpost
<action name="helloworld" class="com.imooc.action.HelloWordAction"> //<!-- result後面能夠跟name和type的 默認的話 默認的話是SUCCESS--> <result>/result.jsp</result> </action> <action name="addAction" method="add" class="com.imooc.action.HelloWordAction"> <result>/add.jsp</result> </action> <action name="updateAction" method="update" class="com.imooc.action.HelloWordAction"> <result>/update.jsp</result> </action>
每一個Action xml裏面都寫一下 也很麻煩測試
2.感嘆號方式 不是很建議使用this
public String add(){return "add";} public String update(){return "update";}
<action name="helloworld" class="com.imooc.action.HelloWordAction"> //<!-- result後面能夠跟name和type的 默認的話 默認的話是SUCCESS--> <result>/result.jsp</result> <result name="add">/add.jsp</result> //<!-- 這裏就不能返回SUCCESS了 而是返回add--> <result name="update">/update.jsp</result> </action> <constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
而後這麼用: http:/localhost:8080/HelloWorld/helloworld!add.action(不加!add是調到result.jsp)
3.通配符方式
<action name="helloworld_*" method="{1}" class="com.imooc.action.HelloWordAction"> //<!-- result後面能夠跟name和type的 默認的話 默認的話是SUCCESS--> <result>/result.jsp</result> <result name="add">/{1}.jsp</result> //<!-- 這裏就不能返回SUCCESS了 而是返回add--> <result name="update">/{1}.jsp</result> </action>
使用方式
http:/localhost:8080/HelloWorld/helloworld_add.action
還能夠這麼寫 *_* 第一個星號是{1} 第二個是{2}
<action name="*_*" method="{2}" class="com.imooc.action.{1}Action">
這個就是在使用的時候 用大寫的helloworld
http:/localhost:8080/HelloWorld/HelloWorld_add_action.action
===============================================================================
<action name="*_*" class="org.itat.zttc.action.{1}Action" method="{2}"> <!-- class類 method方法 User-addInput User對應{1} 對應類(UserAction) addInput對應{2} 對應方法(addInput) 假設傳入User_addInput--> <result>/WEB-INF/{1}/{2}.jsp</result> <!-- /WEB-INF/User對應{1}/addInput.jsp對應{2}--> <result type="redirect" name="r_list">/{1}_list.action</result> <!-- 客戶端的跳轉 跳轉到 好比說User.Action 就是User_list.action--> <!-- 打開User_add.action跳轉到User_list.action--> </action> public class UserAction { public String addInput() { System.out.println("add input"); return "success"; } public String add() { System.out.println("add"); //添加完調到r_list 調用User_add以後會自動跳到User_list return "r_list"; } public String list() { System.out.println("list"); return "success"; } }
==============================================================================
4.指定多個配置文件
<include file="login.xml"></include>
<include file="system.xml"></include>
5.默認action
不會出現404錯誤 會有友好的頁面
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/error.jsp</result>
</action>
6.structs2後綴
.action改了
僞造改爲html等等 還能夠去掉!!!value=""
<constant name="struts.action.extension" value="html"></constant>
struts2包中 default.proerties 裏面有struts.action.extension=action,, 因此能夠是.action或者爲空
7.接收參數
1.使用action的屬性接收
有一點點麻煩 要寫好多action
---LoginAction.java
public class LoginAction extends ActionSupport
{
private String username;
private String password;
public String login()
{
System.out.println(username);//這個只是個測試 成功的話 後臺console會輸出用戶名
//...邏輯處理
return SUCCESS;
}
getandset方法必定要寫
}
配置
<action name="LoginAction" method="login" class="com.imooc.action.LoginAction">
<result>/success.jsp</result>
</action>
還有一個login.jsp和success.jsp 就不寫了 很簡單的
jsp中還能夠這樣寫 ${username}---${password}
!!!!!!!!!!!!!!!!!!!!!!!!!!!用struts2的標籤來寫
<s:property value="username"/>---<s:property value="password"/>
第二種方式的傳值
public String list() { //傳值的第一種方式 直接經過在action中設置相應的方法 this.setUsername("taojiatao"); this.setPassword("123"); //第二種方式 經過ActionContext完成值的傳遞 ActionContext.getContext().put("aaa", 12345); ActionContext.getContext().put("bbb", 56789); System.out.println("list"); return "success"; } ${aaa}---${bbb} //<%--<s:property value="aaa"/>---<s:property value="bbb"/> 這個取出來全是String的 //因此取一些不是String的東西會報錯 能夠所有加# value="#aaa" 只要是ActionContext中的 //數據必定加個# //--%>
2.使用Domain Model接收參數
把username和password封裝到User類中
public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ---LoginAction.java public class LoginAction extends ActionSupport { private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public String login() { System.out.println(user.getUsername()); //...邏輯處理 return SUCCESS; } }
login.jsp
<form action="LoginAction.action" method="post">
UserName:<input type="text" name="user.username">//注意看這裏
PassWord:<input type="password" name="user.password">
<input type="submit" value="submit">
</form>
3.model driven
User.java不變
---LoginAciton.java package com.imooc.action; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; public class LoginAction extends ActionSupport implements ModelDriven<User> { private User user = new User(); public String login() { System.out.println(user.getUsername()); //...邏輯處理 return SUCCESS; } //get set方法必須去掉 @Override public User getModel() { return user; } } <form action="LoginAction.action" method="post"> UserName:<input type="text" name="username"> PassWord:<input type="password" name="password"> <input type="submit" value="submit"> </form>