1.namespace:表示包所在的空間,訪問包的action路徑是 http://localhost:8080/項目名/namespace/index.action namespace 也可以不寫, 假如訪問的路徑是 http://localhost:8080/aaa/bbb/index.action, 在struts.xml中沒有找到aaa和bbb的包空間 只要找到一個index.action而沒有找到和他精確對應的package是,就叫個namespace為空的package處理 所以說namespace為空的package囊括了其他package處理不了的action
<package name="front" namespace="/front" extends="struts-default"> <action name="index"> <result name="success">/hello.jsp</result> </action> </package> <package name="front2" extends="struts-default"> <action name="index"> <result name="success">/hello.jsp</result> </action> </package>
2.action:
<package name="front3" extends="struts-default"> <action name="index" class="xxx.xxx.xx.FirstAction"> <result name="success">/hello.jsp</result> </action> </package>
實現action的3種方式 a.
public class FirstAction { public String execute(){ return "success"; } }所有的方法都要自己去寫。語法上不好控制 b.
public class FirstAction implements Action{ public String execute(){ return "success"; } } Action 接口里面只有一個execute()抽象方法c.
public class FirstAction extends ActionSupport{ public String execute() throws Exception { return "success"; } } 使用第三種,因為ActionSupport已經封裝了一些可供直接調用非常方便的方法 在子類里面可以直接調用3.動態的方法調用(DMI) 調用UserAction里面的add()方法的url地址為: http://localhost:8080/項目名/namespace/user!add.action
<package name="user" namespace="/user" extends="struts-default" > <action name="user" class="com.zr.struts.user.action.UserAction"> <result>/user_add_success.jsp</result> </action></package>
4.通配符的配置:可以將配置量降到最低 調用UserAction里面的add()方法的url地址為: http://localhost:8080/項目名/namespace/useradd.action
<package name="user" namespace="/user" extends="struts-default" > <action name="user*" class="com.zr.struts.user.action.UserAction" method="{1}"> <result>/user_{1}_success.jsp</result> </action> </package>調用UserAction里面的add()方法的url地址為: http://localhost:8080/項目名/namespace/User_add.action (User得大寫如果是小寫的話找的就是userAction) 相當于調用UserAction 里面的 add()方法 返回到User_add_success.jsp頁面
<package name="User" namespace="/user" extends="struts-default" > <action name="*_*" class="com.zr.struts.user.action.{1}Action" method="{2}"> <result>/{1}_{2}_success.jsp</result> </action> </package>5.action的屬性來接受參數
<package name="user" namespace="/user" extends="struts-default" > <action name="user" class="com.zr.struts.user.action.UserAction"> <result>/user_add_success.jsp</result> </action> </package>
a.方式1: http://localhost:8080/項目名/namespace/user!add?name=xxx&age=XXX.action 在UserAction里面定義兩個屬性: PRivate Sring name; private int age; 提供get/set方法 這樣訪問這個Action時會自動調用get/set方法來接收name 和 age這兩個參數 b.方式2: http://localhost:8080/項目名/namespace/user!add?user.name=xxx&user.age=XXX.action 使用Model模型來接受參數 在UserAction里面定義一個屬性:private User user; modle User 中有兩個屬性:private Sring name; private int age; 并提供get/set方法 UserAction里面有提供getUser/setUser 方法 c.方式3: http://localhost:8080/項目名/namespace/user!add?name=xxx&age=XXX.action UserAction實現了一個ModelDriver<T>接口
public class UserAction extends ActionSupport implements ModelDriver<User>{ private User user; @Override public User getModel(){ return user; } } struts2會自動調用 getModle()并將參數name和age傳遞給user;6.struts2的編碼問題:
只需要在struts.xml中配置<constant name="struts.i18n.encoding" value="UTF-8"/>
不用配置 ,因為他的默認值就是utf—87.SimpleDateValidates http://localhost:8080/項目名/namespace/user!add?name=xxx.action
public class UserAction extends ActionSupport{ pirvate String name; public String add(){ if(name == xxx){ this.addFieldError("name","name is error") } return "error"; } public String getName(){return name;} public void setName(String name){this.name = name;} }在jsp文件中顯示錯誤信息: 1.使用struts2的標簽: <s:fielderror fieldName="name"/>這種方法顯示的錯誤信息會自動的添加CSS格式(<li>) 2.從value Stack中取出錯誤信息(errors或者FieldErrors都可以) <s:property value="errors.name" /> (errors: {name=[name is error]}) (errors是Value Stack中的一個屬性是一個Map<key,value>,其中的value是一個數組) <s:property>標簽專門取Value Stack和Stack Context中的屬性 <s:debug>標簽(頁面會出現一個名為debug的鏈接)可以查看Value Stack中的屬性 8.struts2訪問web元素(獲取Map類型request,session,application 真實類型HttpServletRequest,HttpSession,ServletContext的引用) 方式1:(依賴web容器)
public class LoginAction extends ActionSupport { private Map<String, Object> request; private Map<String, Object> session; private Map<String, Object> application; public LoginAction(){ request = (Map)ActionContext.getContext().get("request"); session = ActionContext.getContext().getSession(); application = ActionContext.getContext().getApplication(); } public String execute(){ request.put("a", "aa"); session.put("b", "bb"); application.put("c", "cc"); return "success"; } }在jsp頁面可以用以下方式取出: (存放在Stack Context里面,需要加#才能取出來,詳情用<s:debug>標簽查看) 方式1:
<s:property value="#request.a" /> <s:property value="#session.b" /> <s:property value="#application.c" />
方式2:(說明struts一定是在三個Map類型和3個真實類型之間建立了某種關系,并且把Map中的值復制進去)
<%=request.getAttribute("a") %> <%=session.getAttribute("b") %> <%=application.getAttribute("c") %>方式3:(attr會自動的尋找屬性名a,b,c所對應的值,前提是屬性名不能重復)
<s:property value="#attr.a" /> <s:property value="#attr.b" /> <s:property value="#attr.c" />
方式2:(最常用)實現RequestAware,SessionAware,ApplicationAware 三個接口 (依賴web容器,體現了IOC inverse of control 控制反轉) 方式一:的3個Map是由自己初始化的,現在是依賴外部的注入(DI dependency injection依賴注入) 過程:struts2接受到一個請求,首先會new一個對應的Action,然后判斷這個Action是否實現了 上面的3個接口,如果實現了接口,struts2調用對應的set方法,用自己得到的3個Map 初始化Action的3個Map;(即struts2初始化了這3個Map充分體現了控制反轉) 補充:request很少會去取他,因為Action里面的成員變量(存放在Stack Value)會起到request的作用 application也很少用, 如果定義全局的內容一般放在數據庫或者定義一個類
public class UserAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware { private Map<String, Object> request; private Map<String, Object> session; private Map<String, Object> application; public String execute(){ request.put("a", "aa"); session.put("b", "bb"); application.put("c", "cc"); return "success"; } @Override public void setRequest(Map<String, Object> arg0) { this.request = request; } @Override public void setApplication(Map<String, Object> application) { this.application = application; } @Override public void setSession(Map<String, Object> session) { this.session = session; } } 方式3:獲取真實類型HttpServletRequest,HttpSession,ServletContext的引用
public class UserAction extends ActionSupport { private HttpServletRequest request; private HttpSession session; private ServletContext application; public UserAction(){ request = ServletActionContext.getRequest(); session = request.getSession(); application = session.getServletContext(); } }方式4:實現ServletRequestAware接口(依賴注入,IOC)
public class UserAction extends ActionSupport implements ServletRequestAware { private HttpServletRequest request; private HttpSession session; private ServletContext application; @Override public void setServletRequest(HttpServletRequest request) { this.request = request; this.session = request.getSession(); this.application = session.getServletContext(); } }8.struts2的模塊的包含<include file="xxx.xml"/>意義遠大9.struts2的默認Action:如果請求的Action不存在或者不指定請求的Action,會自動跳轉到默認的Action。
<package name="user" namespace="/user" extends="struts-default" > <default-action-ref name="default"></default-action-ref> <action name="default" > <result>/default.jsp</result> </action></package>
新聞熱點
疑難解答