馬士兵 struts 學習筆記

1.在jsp中使用絕對路徑:
在頭重設置:
<%
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>                                     

發佈了37 篇原創文章 · 獲贊 10 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章