Struts2.1(因為是學習筆記,所以會不定期的更新,接着往下寫)
一:Myeclipse的簡單操作
1. 將類進行源碼展示:
右擊Jar包->Properties->Java Source Attachment->
F:/JAR_Total/Struts/struts2.x/struts-2.1.8.1/src/core/src/main/java
2. 文檔的展示:
右擊Jar包->Properties->JavaDoc Loction->
file:/F:/JAR_Total/Struts/struts2.x/struts-2.1.8.1/docs/struts2-core/apidocs/
之后出現新類的時候直接按F1就可以在Myeclipse中查看文檔
3. Struts.xml不自動提示
a) window – preferences – 搜索 catalog
b) 選擇key type為URI
c) key: http://struts.apache.org/dtds/struts-2.0.dtd
d) location: 對應的dtd文件,位於struts-core包中,解壓開,指定相應位置,如:D:\share\0750_Struts2.1.6\soft\struts-2.1.6\lib\struts2-core-2.1.6\struts-2.0.dtd
4. 右擊項目->java->compliance->compiler compliance level->1.6
5. 常量的配置保存在struts2-core-2.1.8.1.jar->org.apache.struts2->default.properties
二:NameSpace
a) namespace決定了action 的訪問路徑,默認為“”,可以接收所有路徑的action,例如
http://localhost:8080/Test/asdfasdfas/sdgsdg/sdfsdfsd/index.jsp
b) 當將現有的項目拷貝出來一份以后,一定要記得,右擊項目->Properties->Myeclipse->Web,將Web Context-root修改掉。
三:Action
a) 具體視圖的返回可以由用戶自己定義的Action來決定
b) 具體的手段是根據返回的字符串找到對應的配置項,來決定試圖的內容
c) 具體Action的實現可以是一個普通的Java類,里面有public String execute()方法即可
d) 修改默認編碼:windows->preference->JSP
e) Struts2的Action在每次訪問時必定會new一個,而Struts1的Action在每次訪問的時候可能只有new了一個
f) 實現Action的三種方法:
1. 直接寫類名稱+execute()方法
2. 繼承自ActionSupport類+execute()方法
3. 實現自Action接口+execute()方法
四:Path_路徑問題
a) Struts2中的路徑問題是根據Action的路徑而不是Jsp的路徑來確定,所以盡量不要使用相對路徑<br>雖然可以用Redirect方式解決,但是Redirect方式並非必要的。<br>解決方法非常簡單,統一使用絕對路徑(在Jsp中使用request.getContextRoot方式來拿到webapp的路徑,或者使用Myeclipse自己寫的)
五:ActionMethod
1. Action執行的時候不一定要執行execute方法,可以在配置文件中配置Action的時候用method=來制定執行哪個方法 ,也可以在在url地址中動態制定(動態方法調用DMI),還可以使用通配符來進行操作
(user是命名空間,userAdd是Actino的名稱)
http://localhost:8080/Struts2_0400_Path_ActionMethod/user/userAdd
(action!method.action,user是Action的名稱,userAdd是方法名)
http://localhost:8080/Struts2_0400_Path_ActionMethod/user!userAdd
六:ActionWildcard(通配符)
使用通配符,將配置降到最低,不過,一定要遵循“約定優於配置”原則
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action">
<result>/{1}_{2}_success.jsp</result>
</action>
七:接收參數的方式
1. 用Action的屬性接收參數
<a href="<%=basePath%>user/user!add?name=lp&age=20">用Action的參數接收屬性</a>
private String nameString;
private int age;
public void setName(String name){(name的名稱與參數名稱一致就行了)
this.nameString = name;
}
2. 用DomainModel接收參數
private User user;
<a href="user/user!add?user.name=a&user.age=8">添加用戶</a>
3. 用ModelDriven接收參數
<a href="user/user!add?name=a&age=8">添加用戶</a>
//實現ModelDriven接口(記住使用泛型,否則需要類型強制轉換)
public class UserAction extends ActionSupport implements ModelDriven<User>{
//此處必須實例化對象,而不是使用setter和getter方法
private User user = new User();
@Override
public User getModel() {
return user;
}
八:簡單數據驗證
1. 簡單數據驗證1
Action
if(name == null || !name.equals("admin")){
this.addFieldError("name", "name is error");
return ERROR;
}
JSP
<s:fielderror fieldName="name" theme="simple"/>
<br />
<s:property value="errors.name[0]"/>
<s:debug></s:debug>
九:訪問web元素(詳見另外一份文檔)
十:模塊包含(IncludeModlus)
Struts.xml:
<struts>
<include file=”login.xml”>
</struts>
Login.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
<package name="login" extends="struts-default" namespace="/login">
<action name="login" class="com.bjsxt.struts2.user.action.LoginAction">
<result>/user_login_success.jsp</result>
</action>
</package>
</struts>
十一:默認Action
<struts>
<package name="default" extends="struts-default" namespace="/">
<default-action-ref name="index"></default-action-ref>
<action name="index" class="com.bjsxt.struts2.user.action.LoginAction">
<result>/user_login_success.jsp</result>
</action>
</package>
</struts>
十二:默認Result_Type
dispatcher
redirect
chain
redirectAction
freemarker
httpheader
stream
velocity
xslt
plaintext
tils
<struts>
<package name="resultTypes" extends="struts-default" namespace="/r">
<action name="r1" class="com.bjsxt.struts2.user.action.LoginAction">
<!-- 服務器端跳轉,不能跳轉到Action,只能跳轉到試圖 -->
<result type="dispatcher">/user_login_success.jsp</result>
</action>
<action name="r2" class="com.bjsxt.struts2.user.action.LoginAction">
<!-- 客戶端跳轉,不能跳轉到Action,只能跳轉到試圖 -->
<result type="redirect">/user_login_success.jsp</result>
</action>
<action name="r3" class="com.bjsxt.struts2.user.action.LoginAction">
<!-- 使用forward的方式訪問Action -->
<result type="chain">r1</result><!-- aaa/r1 -->
</action>
<action name="r4" class="com.bjsxt.struts2.user.action.LoginAction">
<!-- 客戶端跳轉,跳轉到Action -->
<result type="redirectAction">r2</result> </action>
</package>
</struts>
十三: Global_Results(全局結果集)
Struts.XML代碼:
<package name="user" extends="struts-default" namespace="/user">
<global-results>
<result name="mainpage">/main.jsp</result>
</global-results>
<action name="user" class="com.action.UserAction">
<result>/user_login_success.jsp</result>
<result name="error">/error.jsp</result>
</action>
</package>
<package name="admin" namespace="/admin" extends="user">
<action name="admin" class="com.action.AdminAction">
<result>/admin.jsp</result>
</action>
</package>
UserAction代碼:
public String execute(){
if(type==1){
return SUCCESS;
}else if(type==2){
return ERROR;
}else {
return "mainpage";
}
}
十四: Dynamic_Results(動態結果集)
Action代碼:
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
XML代碼:
<package name="user"namespace="/user"extends="struts-default">
<actionname="user"class="com.bjsxt.struts2.user.action.UserAction">
<result>${r}</result>
</action>
</package>
十五:帶參數的結果集(客戶端跳轉時候才用到)
XML代碼:
<package name="user" namespace="/user" extends="struts-default" >
<action name="user" class="com.action.UserAction">
<result type="redirect">/user_success.jsp?t=${type}</result>
<!-- 原本所有Action公用一個值棧,可以直接訪問type屬性,現在進行客戶端跳轉,不共享同一個值棧了,不可以再訪問到type屬性,所以使用以上方式進行參數的傳遞 -->
</action>
</package>
JSP代碼:
<!-- s:property是從值棧中取值,XML中客戶端重新發了一次請求給JSP,但是此時值棧中已經為null了,故而取不到 -->
from valueStack:<s:property value="t"/><br>
from actionContext:<s:property value="#parameters.t"/>
訪問地址:
http://localhost:8080/.../...?type=1
轉自:http://blog.csdn.net/liupeng_family/article/details/9568035