struts2學習細節

Action

1.struts.xml中加入<constant name="struts.devMode" value="true" />

       value設置成true,應用struts開發模式,每次修改struts.xml就不用重啓服務器了。

 

2.查看struts的源碼。

Referenced Librariesàstruts2-core-2.3.15.jar右鍵—>Propertiesàjava source attachmentàExternal Folderà路徑選:文件夾目錄/struts-2.3.15/src/core/src/main/java

 

3.myeclipse附加上strutsjavadoc

Referenced Librariesàstruts2-core-2.3.15.jar右鍵—>PropertiesàJavadoc Locationà路徑選:文件夾目錄/ struts-2.3.15/docs/struts2-core/apidocs

 

4.namespace命名空間

namespace決定了action的訪問路徑,默認爲"",可以接收所有路徑的action

namespace可以寫爲/,或者/xxx,或者/xxx/yyy,對應的action訪問路徑爲/index.action/xxx/index.action,或者/xxx/yyy/index.action.

namespace最好也用模塊來進行命名

 

5.新引入項目的時候,解決jre system library不匹配的問題

jre system library右鍵build path—remove from build path。項目名右鍵build path—configure build path—》選library標籤add library—》選jre system library—finish

 

6.Action

具體視圖的返回可以由用戶自己定義的Action來決定

具體的手段是根據返回的字符串找到對應的配置項,來決定視圖的內容

具體Action的實現可以是一個普通的java類,裏面有public String execute方法即可

或者實現Action接口

不過最常用的是從ActionSupport繼承,好處在於可以直接使用Struts2封裝好的方法

Srtucts.xml中的配置:

<package name="front" extends="struts-default" namespace="/">

<action name="index" class="com.bjsxt.struts2.front.action.IndexAction1">

            <result name="success">/ActionIntroduction.jsp</result>

        </action>

</package>

 

7.path路徑問題

struts2中的路徑問題是根據action的路徑而不是jsp路徑來確定,所以儘量不要使用相對路徑。

雖然可以用redirect方式解決,但redirect方式並非必要。(少用)

解決辦法非常簡單,統一使用絕對路徑。(在jsp中用request.getContextRoot方式來拿到webapp的路徑)

或者使用myeclipse經常用的,指定basePath

    <%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<base href=”<%=basePath%>”/>

 

8.ActionMethod調用

    Action執行的時候並不一定要執行execute方法

可以在配置文件中配置Action的時候用method=來指定執行哪個方法

也可以在url地址中動態指定(動態方法調用DMI)(推薦)

    <a href="<%=context %>/user/userAdd">添加用戶

    <a href="<%=context %>/user/user!add">添加用戶(推薦)

前者會產生太多的action,所以不推薦使用

public class UserAction extends ActionSupport {

        public String add() {

            return SUCCESS;

        }

}

 

9.通配符設置

       使用通配符將配置量降到最低。不過,一定要遵循“約定優於配置”的原則

    Index.jsp:

        <a href="<%=context %>/actions/Teacher_add">添加老師</a>

<a href="<%=context %>/actions/Teacher_delete">刪除老師</a>

Struts.xml:

<action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">

         <result>/{1}_{2}_success.jsp</result>

       </action>

   TeacherAction.java:

       public String add() {

           return SUCCESS;

       }

       public String delete() {

           return SUCCESS;

       }

 

10.Action接受參數三種方法:

    1)使用Action屬性接收參數:

     <a href=”user/user!add?name=xiao”>添加用戶

     UserAction.java:

   public class UserAction extends ActionSupport {

   private String name;

   public String add() {

       System.out.println("name=" + name);

       return SUCCESS;

   }

   public String getName() {

       return name;

   }

   public void setName(String name) {

       this.name = name;

   }

}

Java類必須包含getset方法,struts會自動幫助填充。

2Domain Model方法

       使用Domain Model接收參數<a href="user/user!add?user.name=a&user.age=8">添加用戶</a>

User.java

package com.bjsxt.struts2.user.model;

public class User {

              private String name;

              private int age;

              public String getName() {

                     return name;

              }

              public void setName(String name) {

                     this.name = name;

              }

              public int getAge() {

                     return age;

              }

              public void setAge(int age) {

                     this.age = age;

              }

}

UserAction.java

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;

              }

      

}

(3)Model Driven(不常用)

使用Model Driven接收參數<a href="user/user!add?user.name=a&user.age=8">添加用戶</a>

UserAction.java

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;

   }

  

}

11.struts2的中文問題

    Struts.xml中加入<constant name="struts.i18n.encoding" value="GBK" /> <!-- i       18n=internationalization -->

web.xml中把

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

換成    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

 

12.簡單的數據校驗

Struts.xml:

    <package name="user" extends="struts-default" namespace="/user">

        <action name="user" class="com.bjsxt.struts2.user.action.UserAction">

            <result>/user_add_success.jsp</result>

            <result name="error">/user_add_error.jsp</result>

        </action>

</package>

UserAction.java

public class UserAction extends ActionSupport {

              private String name;

      

              public String add() {

                     if(name == null || !name.equals("admin")) {

                            this.addFieldError("name", "name is error");

                            this.addFieldError("name", "name is too long");

                            return ERROR;

                     }

                     return SUCCESS;

              }

 

              public String getName() {

                     return name;

              }

 

              public void setName(String name) {

                     this.name = name;

              }

}

User_add_error.jsp:

<%@taglib uri="/struts-tags" prefix="s" %>

    <s:fielderror fieldName="name" theme="simple"/>(有自動的格式,不太好用。)

       <br />

       <s:property value="errors.name[0]"/>(常用,取出值棧的值)

       <s:debug></s:debug>

 

13.struts2訪問Web元素

IoCInversion of Control控制反轉

<form name="f" action="" method="post">

用戶名:<input type="text" name="name"/>

密碼:<input type="text" name="password"/>

<br />

<input type="button" value="submit2"       οnclick="javascript:document.f.action='login/login2';
       document.f.submit();" />

</form>

LoginAction.java:

*繼承SessionAware接口

*重寫public void setSession(Map<String, Object> session) ;方法

public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware,   ApplicationAware {

      

              private Map<String, Object> request;

              private Map<String, Object> session;

              private Map<String, Object> application;

              //DI dependency injection

              //IoC inverse of control

              public String execute() {

                     request.put("r1", "r1");

                     session.put("s1", "s1");

                     application.put("a1", "a1");

                     return SUCCESS;

              }

 

       @Override

       public void setRequest(Map<String, Object> request) {

              this.request = request;

       }

 

       @Override

       public void setSession(Map<String, Object> session) {

              this.session = session;

       }

 

       @Override

       public void setApplication(Map<String, Object> application) {

              this.application = application;

       }    

}

14.struts2模塊包含

Struts.xml:

<struts>

           <constant name="struts.devMode" value="true" />

           <include file="login.xml" />

</struts>

Login.xml:書寫方式和struts.xml一樣,只是爲了分模塊開發方便。

 

15.默認Action

敲不存在的地址或者錯誤地址,默認跳轉到name=index的網頁。

 <package name="default" namespace="/" extends="struts-default">

           <default-action-ref name="index"></default-action-ref>

           <action name="index">

                  <result>/default.jsp</result>

           </action>

 </package>

results

16.Results類型

<li><a href="r/r1">dispatcher</a></li>(默認)服務器跳轉,地址欄不變

       <li><a href="r/r2">redirect</a></li>客戶端跳轉,地址欄變化,顯示jsp地址...../r2.jsp

Action跳轉:

       <li><a href="r/r3">chain</a></li>    forward方式訪問Action,地址欄顯示.../r/r3

       <li><a href="r/r4">redirectAction</a></li>  地址欄顯示..../r2.jsp

Struts.xml:

<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>// *r1前不要加/,如果Action在另外包中,則查文檔

           </action>

          

           <action name="r4">

                  <result type="redirectAction">r2</result>

           </action>   

</package>

 

17.results全局結果集

<ol>

              <li><a href="user/user?type=1">返回success</a></li>

              <li><a href="user/user?type=2">返回error</a></li>

              <li><a href="user/user?type=3">返回global result</a></li>

              <li><a href="admin/admin">admin,繼承user</a></li>

</ol>

Struts.xml

<package name="user" namespace="/user" extends="struts-default">

           <global-results>

                  <result name="mainpage">/main.jsp</result>

           </global-results>

           配置的全局結果集在一個package裏可以通用。

           <action name="index">

                  <result>/index.jsp</result>

           </action>

          

           <action name="user" class="com.bjsxt.struts2.user.action.UserAction">

                  <result>/user_success.jsp</result>

                  <result name="error">/user_error.jsp</result>

           </action>    

    </package>

    如果想用另一個package中的global-reasults,需要extends那個package的包名。

           <package name="admin" namespace="/admin" extends="user">

                  <action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">

                         <result>/admin.jsp</result>

                  </action>

           </package>

UserAction.java

public class UserAction extends ActionSupport {

       private int type;

       public int getType() {

              return type;

       }

       public void setType(int type) {

              this.type = type;

       }

       @Override

       public String execute() throws Exception {

              if(type == 1) return "success";

              else if (type == 2) return "error";

              else return "mainpage";

       }

}

 

18.動態結果集

*一定不要忘了爲動態結果的保存值設置set get方法

<ol>

       <li><a href="user/user?type=1">返回success</a></li>

       <li><a href="user/user?type=2">返回error</a></li>

</ol>

Struts.xml:

<package name="user" namespace="/user" extends="struts-default">

           <action name="user" class="com.bjsxt.struts2.user.action.UserAction">

                  <result>${r}</result>

           </action>    

</package>

UserAction.java:

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";

       }

}

 

19.帶參數的結果集

Redirect方式才需要傳參數,forward方式不需要。

<li><a href="user/user?type=1">傳參數</a></li>

Struts.xml

<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>

UserAction.java

public class UserAction extends ActionSupport {

              private int type;     

              public int getType() {

                     return type;

              }

              public void setType(int type) {

                     this.type = type;

              }

              public String execute() throws Exception {

                     return "success";

              }

}

User_Success.jsp:

from valuestack: <s:property value="t"/><br/>

       from actioncontext: <s:property value="#parameters.t"/>

只能從ActionContext中取,在valuestack中沒有對應的值,不是用一個request對象。   只是傳遞了參數的值。

<s:debug></s:debug>

 

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