在頭重設置:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
或者:<% String basePath = request.getContextPath(); %>
在head中設置:
<head>
<base href="<%=basePath%>" />
</head>
basePath=http://localhost:8088/StrutsDemo1
即可在body中直接用絕對路徑來訪問
<a href="path/path.action">路徑問題說明</a>
相當於訪問【http://localhost:8088/StrutsDemo1/path/path.action】
2.Action執行的時候並不一定要執行execute方法
可以在配置文件中配置Action的時候用method=來指定執行哪個方法也可以在url地址中動態指定(動態方法調用DMI)(推薦)
<a href="<%=basePath %>/user/userAdd">添加用戶</a>
對應的action如下:
【<action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
<result>/user_add_success.jsp</result>
</action>
】
<a href="<%=basePath %>/user/user!add">添加用戶</a>
對應的action如下:
【 <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>/user_add_success.jsp</result>
</action>】
前者會產生太多的action,所以不推薦使用
3.【使得配置struts更簡單】使用通配符,將配置量降到最低
不過,一定要遵守"約定優於配置"的原則
用例:
<package name="actions" extends="struts-default" namespace="/actions">
<action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
<result>/Student{1}_success.jsp</result>
</action>
<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
<result>/{1}_{2}_success.jsp</result>
<!-- {0}_success.jsp -->
</action>
</package>
http://localhost:8088/StrutsDemo1/actions/Studentadd若請求這個參數表示,訪問add()方法。
訪問方法後調用Studentadd_success.jsp
4.使用Domain Model接收參數
url如下:http://localhost:8088/StrutsDemo1/user/user!add?user.name=a&user.age=8
user.name表示屬性。這裏的user要與方法中的setUser()方法對應 也就是說要用類中定義的user
定義的action類如下:
public class UserAction extends ActionSupport {
private User user;
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
5.使用ModelDriven接收參數:
url請求:http://localhost:8088/StrutsDemo1/user/user!add?name=a&age=8
定義的action類如下:
public class UserAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public String add() {
System.out.println("name=" + user.getName());
System.out.println("age=" + user.getAge());
return SUCCESS;
}
@Override
public User getModel() {
return user;
}
}
6.使用action屬性接收參數,測試中文問題
在sturts加上:<constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->
7.使用addFieldError方法和s:fieldError標籤簡單處理數據校驗
在頭文件導入struts tag:<%@taglib uri="/struts-tags" prefix="s" %>
<s:fielderror fieldName="name" theme="simple"/>
<br />
<s:property value="errors.name[0]"/>
<s:debug></s:debug>【可以點擊觀察這些棧都存在什麼】
8.取得Map類型request,session,application,真實類型 HttpServletRequest, HttpSession, ServletContext的引用:
--前三者:依賴於容器
--前三者:IOC(只用這種)
--後三者:依賴於容器
--後三者:IOC
例子:
傳過來的參數到action類中:
package com.bjsxt.struts2.user.action;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class LoginAction1 extends ActionSupport {
private Map request;
private Map session;
private Map application;
public LoginAction1() {
request = (Map)ActionContext.getContext().get("request");
session = ActionContext.getContext().getSession();
application = ActionContext.getContext().getApplication();
}
public String execute() {
request.put("r1", "r1");
session.put("s1", "s1");
application.put("a1", "a1");
return SUCCESS;
}
}
頁面使用有兩種 jsp語法和struts ongl語言 而#attr.a1是在所有容器中搜索,一般不用,因爲key有可能會重複:
<br />
<s:property value="#request.r1"/> | <%=request.getAttribute("r1") %> <br />
<s:property value="#session.s1"/> | <%=session.getAttribute("s1") %> <br />
<s:property value="#application.a1"/> | <%=application.getAttribute("a1") %> <br />
<s:property value="#attr.a1"/><br />
<s:property value="#attr.s1"/><br />
<s:property value="#attr.r1"/><br />
<s:debug></s:debug>
<br />
9.設置多個struts.xml包含在改文件中。
例如:
在struts.xml中代碼爲:
<struts>
<constant name="struts.devMode" value="true" />
<include file="struts1.xml" />
</struts>
10.在xml中找不到action名字的時候,默認調用一個action 設置方法:
<package name="default" namespace="/" extends="struts-default">
<default-action-ref name="index"></default-action-ref>
<action name="index">
<result>/default.jsp</result>
</action>
</package>
11.action result Type:
例子:
<struts>
<constant name="struts.devMode" value="true" />
<package name="resultTypes" namespace="/r" extends="struts-default">
<action name="r1">
<result type="dispatcher">/r1.jsp</result>
</action>
<action name="r2">
<result type="redirect">/r2.jsp</result>
</action>
<action name="r3">
<result type="chain">r1</result>
</action>
<action name="r4">
<result type="redirectAction">r2</result>
</action>
<!-- 訪問包-->
<action name="r5">
<result type="chain">
<param name="actionName">r1</param>
<param name="namespace">/rr</param>
</result>
</action>
</package>
<!-- 訪問包-->
<package name="rr" namespace="/rr" extends="struts-default">
<action name="r1">
<result type="dispatcher">/r3.jsp</result>
</action>
</package>
</struts>
12.根據方法中的返回選取result:
<result name="error">/user_error.jsp</result>
13.動態結果一定不要忘了爲動態結果的保存值設置set get方法
struts.xml如下:
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result>${r}</result>
</action>
</package>
</struts>
相對應的類如下:
package com.bjsxt.struts2.user.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private int type;
private String r;
public String getR() {
return r;
}
public void setR(String r) {
this.r = r;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
@Override
public String execute() throws Exception {
if(type == 1) r="/user_success.jsp";
else if (type == 2) r="/user_error.jsp";
return "success";
}
}
14.傳參數到頁面(需要ognl-2.6.11.jar包):
<struts>
<constant name="struts.devMode" value="true" />
<package name="user" namespace="/user" extends="struts-default">
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
<result type="redirect">/user_success.jsp?t=${type}</result>
</action>
</package>
</struts>
頁面:
<s:property value="#parameters.t"/>
15.ognl學習:
訪問的url:http://localhost:8088/StrutsDemo1/ognl.action?user.age=321
<li>訪問值棧中對象的普通屬性(get set方法):<s:property value="user.age"/> | <s:property value="user['age']"/> | <s:property value="user[\"age\"]"/> | wrong: <%--<s:property value="user[age]"/>--%></li>
<li>訪問值棧中action的普通方法:<s:property value="m()" /></li>
<li>訪問靜態方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/></li>
<li>訪問靜態屬性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/></li>
<li>訪問Math類的靜態方法:<s:property value="@@max(2,3)" /></li>
<hr />
<li>訪問普通類的構造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/></li>
<hr />
<li>訪問List:<s:property value="users"/></li>
<li>訪問List中某個元素:<s:property value="users[1]"/></li>
<li>訪問List中元素某個屬性的集合:<s:property value="users.{age}"/></li>
<li>訪問List中元素某個屬性的集合中的特定值:<s:property value="users.{age}[0]"/> | <s:property value="users[0].age"/></li>
<li>訪問Set:<s:property value="dogs"/></li>
<li>訪問Map:<s:property value="dogMap"/></li>
<li>訪問Map中某個元素:<s:property value="dogMap.dog101"/> | <s:property value="dogMap['dog101']"/> | <s:property value="dogMap[\"dog101\"]"/></li>
<li>訪問Map中所有的key:<s:property value="dogMap.keys"/></li>
<li>訪問Map中所有的value:<s:property value="dogMap.values"/></li>
<li>訪問容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/> </li>
<li>投影(過濾):<s:property value="users.{?#this.age==1}[0]"/></li>
<li>投影:<s:property value="users.{^#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age}"/></li>
<li>投影:<s:property value="users.{$#this.age>1}.{age} == null"/></li>
結果如下:
22.投影(過濾):user1
23.投影:[2]
24.投影:[3]
25.投影:false
--------------------------------------------------------------------------------
<li>property: <s:property value="username"/> </li>
<li>property 取值爲字符串: <s:property value="'username'"/> </li>
<li>property 設定默認值: <s:property value="admin" default="管理員"/> </li>
<li>property 設定HTML: <s:property value="'<hr/>'" escape="false"/> </li>
<hr />
<li>set 設定adminName值(默認爲request 和 ActionContext): <s:set var="adminName1" value="'xxxxx'" /></li>
<li>set 從request取值: <s:property value="#request.adminName1" /></li>
<li>set 從ActionContext取值: <s:property value="#adminName1" /></li>
<%--<li>set 設定範圍: <s:set name="adminPassword" value="password" scope="page"/></li>
<li>set 從相應範圍取值: <%=pageContext.getAttribute("adminPassword") %></li>
--%>
<li>set 設定var,範圍爲ActionContext: <s:set var="adminPassword" value="password" scope="request"/></li>
<li>set 從相應範圍取值: <s:property value="#request.adminPassword"/> </li>
<li>set 使用#取值xxxxxx: <s:property value="#request.adminPassword"/> </li>
<li>bean 定義bean,並使用param來設定新的屬性值:
<s:bean name="com.bjsxt.struts2.tags.Dog" >
<s:param name="name" value="'pp'"></s:param>
<s:property value="name"/>
</s:bean>
</li>
<li>bean 查看debug情況:
<s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">
<s:param name="name" value="'oudy'"></s:param>
</s:bean>
拿出值:
<s:property value="#myDog.name"/>
</li>
<li>include _include1.html 包含靜態英文文件
<s:include value="/_include1.html"></s:include>
</li>
<li>include _include1.html 包含靜態英文文件,說明%用法
<s:set var="incPage" value="%{'/_include1.html'}" />
<s:include value="%{#incPage}"></s:include>
</li>
<li>if elseif else:
age = <s:property value="#parameters.age[0]" /> <br />
<s:set var="age" value="#parameters.age[0]" />
<s:if test="#age < 0">wrong age!</s:if>
<s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>
<s:else>yeah!</s:else><br />
<s:if test="#parameters.aaa == null">null</s:if>
</li>
<li>遍歷集合:<br />
<s:iterator value="{1, 2, 3}" >
<s:property/> |
</s:iterator>
</li>
輸出:遍歷集合:
1 | 2 | 3 |
<li>自定義變量:<br />
<s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x">
<s:property value="#x.toUpperCase()"/> |
</s:iterator>
</li>
輸出:自定義變量:
AAA | BBB | CCC |
<li>使用status:<br />
<s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status">
<s:property/> |
遍歷過的元素總數:<s:property value="#status.count"/> |
遍歷過的元素索引:<s:property value="#status.index"/> |
當前是偶數?:<s:property value="#status.even"/> |
當前是奇數?:<s:property value="#status.odd"/> |
是第一個元素嗎?:<s:property value="#status.first"/> |
是最後一個元素嗎?:<s:property value="#status.last"/>
<br />
</s:iterator>
</li>