∪∩deniable Design

          個人JAVA版GAE(google app engine),struts2+jpa+jQuery開發,互相交流 http://iunbug.appspot.com/
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          struts2.0學習筆記(三)--Action

          Posted on 2008-08-22 22:05 ∪∩BUG 閱讀(1279) 評論(5)  編輯  收藏 所屬分類: Struts2學習筆記
          Struts 2.0 筆記
          2008 08 21

          一.標準Action的編寫
              1.將action描述為ActionSupport的子類,用于實現execut的缺省方法
              2.自定義Action的返回值(默認仍使用的返回值是:SUCCESS,ERROR,INPUT,LOGIN,NONE),
                  (1)重新編寫映射路徑
                  (2)以http訪問地址的區別Action的使用方法
          二.Action獲取頁面提交信息(兩種方法)
              1.將頁面的提交信息直接封裝在Action的控制器中
              2.便用標準的POJO類進行頁面數據的封裝.(必須有無參的構造方法,否則無法生成action實例)[推薦]
          三.獲取Servlet API中的一些對象
              1.非IoC方式
              (1)HttpServletRequest request = ServletActionContext.getRequest();
              (2)Http response = ServletActionContext.getResponse();
              (3)HttpSession session = ServletActionContext.getSession()
              2.IoC方法(使用ActionContext對象獲取Servlet API對象)
                  使用接口:
                  (1)SessionAware
                  (2)ServletRequestAware
                  (3)ServletResponseAware

          src/struts.xml
           1<?xml version="1.0" encoding="GBK"?>
           2<!DOCTYPE struts PUBLIC
           3         "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
           4         "http://struts.apache.org/dtds/struts-2.0.dtd">
           5<struts>
           6    <include file="struts-default.xml" /><!-- 使用缺省的struts的配置文件 -->
           7
           8    <!-- 包空間 ActionDemo 繼承 struts-default -->
           9    <package name="ActionDemo" extends="struts-default">
          10
          11        <!-- 映射名name="HelloAction" ,使用com.Action.HelloAction來實現 -->
          12        <action name="HelloAction" class="com.Action.HelloAction">
          13            <result>/HelloAction.jsp</result><!-- 轉到的頁面為HelloAction.jsp-->
          14        </action>
          15
          16        <!--
          17            1. method="aliasAction"對應 HelloAction.java 中的aliasAction()方法
          18            2.訪問AliasHelloWord Action方法:在地址欄中輸入:
          19            (1)http://localhost:8080/Action/aliasAction.action
          20            (2)http://localhost:8080/Action/HelloAction!aliasAction.action
          21        -->
          22        <action name="AliasHelloWord" class="com.Action.HelloAction"
          23            method="aliasAction">
          24            <result>/HelloAction.jsp</result>
          25        </action>
          26
          27        <!-- 映射名name="Login" 與 Login.jsp 中的 action="Login" 對應,使用com.Action.LoginAction來實現 -->
          28        <action name="Login" class="com.Action.LoginAction">
          29            <result>/Hello.jsp</result>
          30        </action>
          31
          32        <!-- 映射名name="Loginx" 與 Loginx.jsp 中的 action="Login" 對應,使用com.Action.LoginActionx來實現 -->
          33        <action name="Loginx" class="com.Action.LoginActionx">
          34            <result>/Hello.jsp</result>
          35        </action>
          36    </package>
          37</struts>
          38
          39

          WebRoot/WEB-INF/web.xml
           1<?xml version="1.0" encoding="UTF-8"?>
           2<web-app id="WebApp_ID" version="2.4"
           3    xmlns="http://java.sun.com/xml/ns/j2ee"
           4    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           5    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
           6    <display-name>Struts2Hello</display-name>
           7    <filter>
           8        <filter-name>struts2</filter-name>
           9        <filter-class>
          10            org.apache.struts2.dispatcher.FilterDispatcher
          11        </filter-class><!-- 以過慮器的形式出現 -->
          12    </filter>
          13    <filter-mapping>
          14        <filter-name>struts2</filter-name>
          15        <url-pattern>/*</url-pattern><!-- 過慮所有內容 -->
          16    </filter-mapping>
          17    <welcome-file-list>
          18        <welcome-file>index.html</welcome-file>
          19        <welcome-file>index.htm</welcome-file>
          20        <welcome-file>index.jsp</welcome-file>
          21        <welcome-file>default.html</welcome-file>
          22        <welcome-file>default.htm</welcome-file>
          23        <welcome-file>default.jsp</welcome-file>
          24    </welcome-file-list>
          25</web-app>
          26

          WebRoot/Hello.jsp
           1<%@page contentType="text/html;charset=GBK"%>
           2<%@taglib prefix="s" uri="/struts-tags"%>
           3<html>
           4    <head>
           5        <title>HelloAction</title>
           6    </head>
           7    <body>
           8
           9        <h2>
          10            <s:property value="msg" />
          11        </h2>
          12        ${test}<br>
          13        ${nameA}<br>
          14        ${nameB}<br>
          15    </body>
          16</html>

          WebRoot/HelloAction.jsp
           1<%@page contentType="text/html;charset=GBK"%>
           2<%@taglib prefix="s" uri="/struts-tags"%>
           3<html>
           4    <head>
           5        <title>HelloAction</title>
           6    </head>
           7    <body>
           8
           9        <h2>
          10            <s:property value="message" />
          11        </h2>
          12    </body>
          13</html>

          WebRoot/Login.jsp
           1<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
           2<%
           3String path = request.getContextPath();
           4String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
           5
          %>
           6<%@taglib prefix="s" uri="/struts-tags"%>
           7
           8<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
           9<html>
          10  <head>
          11
          12    <title>Login page</title>
          13  </head>
          14  
          15  <body>
          16    <s:form action="Login" method="POST">
          17    <s:textfield name="name" label="User name"/>
          18    <s:password name="pass" label="Password"/>
          19    <s:submit value="Submit"></s:submit>
          20    </s:form>
          21  </body>
          22</html>
          23

          WebRoot/Loginx.jsp
           1<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
           2<%
           3    String path = request.getContextPath();
           4    String basePath = request.getScheme() + "://"
           5            + request.getServerName() + ":" + request.getServerPort()
           6            + path + "/";
           7
          %>
           8<%@taglib prefix="s" uri="/struts-tags"%>
           9
          10<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          11<html>
          12    <head>
          13
          14        <title>Login page</title>
          15    </head>
          16
          17    <body>
          18        <!-- action="Loginx"中與struts.xml中映射名name="Loginx"相同, name="user.name"表示使用com.Action.LoginActionx類的user對象的name屬性-->
          19        <s:form action="Loginx" method="POST">
          20            <s:textfield name="user.name" label="User name" />
          21            <s:password name="user.pass" label="Password" />
          22            <s:submit value="Submit"></s:submit>
          23        </s:form>
          24    </body>
          25</html>
          26

          src/com.Action/HelloAction.java
           1package com.Action;
           2
           3import java.text.DateFormat;
           4import java.util.Date;
           5
           6import com.opensymphony.xwork2.ActionSupport;
           7
           8/**
           9 * @author ∪∩BUG E-mail: tidelgl@163.com
          10 * @version Aug 20, 2008 1:45:28 PM 類說明
          11 */

          12@SuppressWarnings("serial")
          13public class HelloAction extends ActionSupport {
          14
          15    private String message;
          16
          17    // getMessage()方法對應的是頁面的顯示
          18    public String getMessage()
          19    {
          20        return message;
          21    }

          22    
          23    //缺省的方法,將被默認執行
          24    public String execute(){
          25        
          26        message = "HelloAction, Now is" + DateFormat.getInstance().format(new Date());
          27        
          28        //SUCCESS返回的是String類型,
          29        System.out.println(SUCCESS);
          30        return SUCCESS;
          31    }

          32    
          33    //自定義的業務方法
          34    public String aliasAction(){
          35        message ="自定義的Action方法";
          36        return SUCCESS;
          37    }

          38}

          39

          src/com.Action/LoginAction.java
           1package com.Action;
           2
           3import com.opensymphony.xwork2.ActionSupport;
           4
           5/**
           6 * @author ∪∩BUG E-mail: tidelgl@163.com
           7 * @version Aug 21, 2008 11:31:00 PM 類說明
           8 */

           9public class LoginAction extends ActionSupport {
          10    @Override
          11    public String execute() throws Exception {
          12        if("admin".equals(this.name)&"123".equals(this.pass)){
          13            this.msg="歡迎" + this.name;
          14    
          15        }

          16        else {
          17            this.msg="非法輸入!";
          18        }
              
          19        return SUCCESS;
          20    }

          21
          22    private String name;
          23    private String pass;
          24    private String msg;
          25
          26    // 默認構造方法是必須的.否則無法生成action實例
          27    public LoginAction() {
          28
          29    }

          30
          31    public LoginAction(String name, String pass, String msg) {
          32        super();
          33        this.name = name;
          34        this.pass = pass;
          35        this.msg = msg;
          36    }

          37
          38    public String getName() {
          39        return name;
          40    }

          41
          42    public void setName(String name) {
          43        this.name = name;
          44    }

          45
          46    public String getPass() {
          47        return pass;
          48    }

          49
          50    public void setPass(String pass) {
          51        this.pass = pass;
          52    }

          53
          54    public String getMsg() {
          55        return msg;
          56    }

          57
          58    public void setMsg(String msg) {
          59        this.msg = msg;
          60    }

          61
          62}

          63

          src/com.Action/LoginActionx.java
           1package com.Action;
           2
           3import java.util.Map;
           4
           5import javax.servlet.http.HttpServletRequest;
           6import javax.servlet.http.HttpServletResponse;
           7
           8import org.apache.struts2.interceptor.ServletRequestAware;
           9import org.apache.struts2.interceptor.ServletResponseAware;
          10import org.apache.struts2.interceptor.SessionAware;
          11
          12import com.opensymphony.xwork2.ActionContext;
          13import com.opensymphony.xwork2.ActionSupport;
          14import com.pojo.User;
          15
          16/**
          17 * @author ∪∩BUG E-mail: tidelgl@163.com
          18 * @version Aug 21, 2008 11:31:00 PM 類說明
          19 */

          20
          21//IoC方法獲取Servlet API(implements是一個類實現一個接口用的關鍵字, 他是用來實現接口中定義的抽象方法)
          22public class LoginActionx extends ActionSupport implements ServletRequestAware,ServletResponseAware,SessionAware{
          23    private String msg;
          24    private User user;
          25    private HttpServletRequest request;
          26    private HttpServletResponse response;
          27    private Map session;
          28    
          29    @Override
          30    public String execute() throws Exception {
          31        if("admin".equals(user.getName())&"123".equals(user.getPass())){
          32            this.msg="歡迎" + user.getName()+"對象化的提交";
          33    
          34        }

          35        else {
          36            this.msg="非法輸入!";
          37        }
              
          38        //ServletActionContext.getRequest().setAttribute("test","Just Test!" );//非IoC方法獲取Servlet API
          39        
          40        //獲取session
          41        Map map = ActionContext.getContext().getSession();
          42        map.put("nameA""name1");
          43        session.put("nameB""name2");
          44        
          45        
          46        return SUCCESS;
          47    }

          48
          49    // 默認構造方法是必須的.否則無法生成action實例
          50    public LoginActionx() {
          51
          52    }

          53
          54    public String getMsg() {
          55        return msg;
          56    }

          57
          58    public void setMsg(String msg) {
          59        this.msg = msg;
          60    }

          61
          62    public User getUser() {
          63        return user;
          64    }

          65
          66    public void setUser(User user) {
          67        this.user = user;
          68    }

          69
          70    //IoC方法獲取Servlet API
          71    //實現接口中定義的抽象方法setServletRequest(HttpServletRequest arg0)
          72    public void setServletRequest(HttpServletRequest request) {
          73        this.request=request;
          74        request.setAttribute("test","Just Test!" );
          75        
          76    }

          77
          78    //實現接口中定義的抽象方法setServletResponse(HttpServletResponse arg0)
          79    public void setServletResponse(HttpServletResponse response) {
          80        this.response=response;
          81        
          82    }

          83    
          84    //實現接口中定義的抽象方法setSession(Map arg0)
          85    public void setSession(Map e) {
          86        this.session=e;
          87        
          88    }

          89
          90
          91}

          92

          src/com.pojo/User.java
           1package com.pojo;
           2
           3import java.io.Serializable;
           4
           5/**
           6 * @author ∪∩BUG E-mail: tidelgl@163.com
           7 * @version Aug 22, 2008 11:01:56 AM 類說明
           8 */

           9public class User implements Serializable {
          10    private String name;
          11    private String pass;
          12
          13    public User(String name, String pass) {
          14        super();
          15        this.name = name;
          16        this.pass = pass;
          17    }

          18
          19    public User() {
          20
          21    }

          22
          23    public String getName() {
          24        return name;
          25    }

          26
          27    public void setName(String name) {
          28        this.name = name;
          29    }

          30
          31    public String getPass() {
          32        return pass;
          33    }

          34
          35    public void setPass(String pass) {
          36        this.pass = pass;
          37    }

          38}

          39

          評論

          # re: struts2.0學習筆記(三)--Action  回復  更多評論   

          2008-08-22 22:08 by ∪∩BUG
          Action有些難學,筆記有些難寫.萬事開頭難,萬事開頭難.

          # re: struts2.0學習筆記(三)--Action  回復  更多評論   

          2008-09-02 10:33 by
          老大,能講講struts.xml
          中package是干啥使 的嗎,一直沒想通

          # re: struts2.0學習筆記(三)--Action  回復  更多評論   

          2008-09-02 11:35 by ∪∩BUG

          這個其實你學習了XML會好理解些的,這里我給你找了篇有例子的文章:


          Struts2中struts.xml的Action配置詳解
                  使用package可以將邏輯上相關的一組Action,Result,Interceptor等組件分為一組,Package有些像對象,可以繼承其他的Package,也可以被其他package繼承,甚至可以定義抽象的Package。

          Package的可以使用的屬性:

          屬性

          是否必須

          說明

          name Package的表示,為了讓其他的package引用
          extends 從哪個package繼承行為
          namespace 參考Namespace配置說明
          abstract
          定義這個package為抽象的,這個package中不需要定義action


              由于struts.xml文件是自上而下解析的,所以被繼承的package要放在繼承package的前邊。Namespace將action分成邏輯上的不同模塊,每一個模塊有自己獨立的前綴。使用namespace可以有效的避免action重名的沖突,例如每一個package都可以有自己獨立的Menu和Help action,但是事項方式各有不同。Struts2標簽帶有namespace選項,可以根據namespace的不同向服務器提交不同的package的action的請求。
                 “/”表示根namespace,所有直接在應用程序上下文環境下的請求(Context)都在這個package中查找。
                 “”表示默認namespace,當所有的namespace中都找不到的時候就在這個namespace中尋找。

                 例如,有如下配置:
          CODE:
          <package name="default">
               <action name="foo" class="mypackage.simpleAction>
                        <result name="success" type="dispatcher">
                                greeting.jsp
                        </result>
              </action>
              <action name="bar" class="mypackage.simpleAction">
                 <result name="success" type="dispatcher">bar1.jsp</result>
              </action>
          </package>

          <package name="mypackage1" namespace="/">
              <action name="moo" class="mypackage.simpleAction">
                  <result name="success" type="dispatcher">moo.jsp</result>
              </action>
          </package>

          <package name="mypackage2" namespace="/barspace">
              <action name="bar" class="mypackage.simpleAction">
                 <result name="success" type="dispatcher">bar2.jsp</result>
              </action>
          </package>1 如果請求為/barspace/bar.action
          查找namespace:/barspace,如果找到bar則執行對應的action,否則將會查找默認的namespace,在上面的例子中,在barspace中存在名字為bar的action,所以這個action將會被執行,如果返回結果為success,則畫面將定為到bar2.jsp

          2 如果請求為/moo.action
          根namespace('/')被查找,如果moo action存在則執行,否則查詢默認的namespace,上面的例子中,根namespace中存在moo action,所以該action被調用,返回success的情況下畫面將定位到moo.jsp、

          Action配置

                在struts2框架中每一個Action是一個工作單元。Action負責將一個請求對應到一個Action處理上去,每當一個Action類匹配一個請求的時候,這個Action類就會被Struts2框架調用。

                一個Action配置示例:
          CODE:
          <action name="Logon" class="tutorial.Logon">
            <result type="redirect-action">Menu</result>
            <result name="input">/tutorial/Logon.jsp</result>
          </action>每一個Action可以配置多個result,多個ExceptionHandler,多個Intercepter,但是只能有一個name,這個name和package的namespace來唯一區別一個Action。

                每當struts2框架接受到一個請求的時候,它會去掉Host,Application和后綴等信息,得到Action的名字,例如如下的請求將得到Welcome這個Action。 http://www.planetstruts.org/struts2-mailreader/Welcome.action

                在一個Struts2應用程序中,一個指向Action的鏈接通常有Struts Tag產生,這個Tag只需要指定Action的名字,Struts框架會自動添加諸如后綴等的擴展,例如:
          CODE:
          <s:form action="Hello">
              <s:textfield label="Please enter your name" name="name"/>
              <s:submit/>
          </s:form將產生一個如下的鏈接的請求:
          http://Hostname:post/appname/Hello.action
          在定義Action的名字的時候不要使用.和/,最好使用英文字母和下劃線。

          Action中的方法

          Action的默認入口方法由xwork2的Action接口來定義,代碼清單為:
          CODE:
          public interface Action {

              public String execute() throws Exception;

          }有些時候我們想指定一個Action的多個方法,我們可以做如下兩步:
          1  建立一些execute簽名相同的方法,例如:
          Public String forward() throws Exception

          2  在Action配置的時候使用method屬性,例如:
          <action name="delete" class="example.CrudAction" method="delete">

          Action中的方法通配符

              有些時候對Action中方法的調用滿足一定的規律,例如edit Action對應edit方法,delete Action對應 delete方法,這個時候我們可以使用方法通配符,例如:
          <action name="*Crud" class="example.Crud" method="{1}"> 這時,editCrud Action的引用將調用edit方法,同理,deleteCrud Action的引用將調用delete 方法。

              另外一種比較常用的方式是使用下劃線分割,例如:
          <action name="Crud_*" class="example.Crud" method="{1}">
          這樣當遇到如下調用的時候可以找到對應的方法。
          "action=Crud_input"  =>  input方法
          "action=Crud_delete" =>  delete方法

          通配符和普通的配置具有相同的地位,可以結合使用框架的所有其他功能。

          默認的Action

          當我們沒有指定Action的class屬性的時候,例如:
          <action name="Hello">
          我們默認使用com.opensymphony.xwork.ActionSupport
          ActionSupport有兩個方法input和execute,每個方法都是簡單的返回SUCCESS。

          通常情況下,請求的Action不存在的情況下,Struts2框架會返回一個Error畫面:“404 - Page not found”,有些時候或許我們不想出現一個控制之外的錯誤畫面,我們可以指定一個默認的Action,在請求的Action不存在的情況下,調用默認的Action,通過如下配置可以達到要求:
          CODE:
          <package name="Hello" extends="action-default">
          <default-action-ref name="UnderConstruction">
          <action name="UnderConstruction">
            <result>/UnderConstruction.jsp</result>
          </action>默認通配符
          CODE:
          <action name="*" >
            <result>/{1}.jsp</result>
          </action>每個Action將會被映射到以自己名字命名的JSP上。

          struts2中動態方法的調用

          可以采用DMI(Dynamic Method Invocation,動態方法)調用來處理這種請求,動態方法調用是指表單元素的action并不是直接等于某個Action的名字,而是以如下形式來指定Form的action屬性:
           1<!-- action屬性為actionName!methodName的形式 --> 
           2action="ActionName!methodName.action"
           3 
           4<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
           5<struts>
           6<!--include節點是struts2中組件化的方式 可以將每個功能模塊獨立到一個xml配置文件中 然后用include節點引用 -->
           7<include file="struts-default.xml"></include>
           8<!--package提供了將多個Action組織為一個模塊的方式
           9        package的名字必須是唯一的 package可以擴展 當一個package擴展自
          10        另一個package時該package會在本身配置的基礎上加入擴展的package
          11        的配置 父package必須在子package前配置 
          12        name:package名稱
          13        extends:繼承的父package名稱
          14        abstract:設置package的屬性為抽象的 抽象的package不能定義action 值true:false
          15        namespace:定義package命名空間 該命名空間影響到url的地址,例如此命名空間為/test那么訪問是的地址為http://localhost:8080/struts2/test/XX.action
          16     -->
          17<package name="com.kay.struts2"extends="struts-default"namespace="/test">
          18<interceptors>
          19<!--定義攔截器 
          20                name:攔截器名稱
          21                class:攔截器類路徑
          22             -->
          23<interceptor name="timer"class="com.kay.timer"></interceptor>
          24<interceptor name="logger"class="com.kay.logger"></interceptor>
          25<!--定義攔截器棧 -->
          26<interceptor-stack name="mystack">
          27<interceptor-ref name="timer"></interceptor-ref>
          28<interceptor-ref name="logger"></interceptor-ref>
          29</interceptor-stack>
          30</interceptors>
          31<!--定義默認的攔截器 每個Action都會自動引用
          32         如果Action中引用了其它的攔截器 默認的攔截器將無效 -->
          33<default-interceptor-ref name="mystack"></default-interceptor-ref>
          34<!--全局results配置 -->
          35<global-results>
          36<result name="input">/error.jsp</result>
          37</global-results>
          38<!--Action配置 一個Action可以被多次映射(只要action配置中的name不同)
          39             name:action名稱
          40             class: 對應的類的路徑
          41             method: 調用Action中的方法名
          42        -->
          43<action name="hello"class="com.kay.struts2.Action.LoginAction">
          44<!--引用攔截器
          45                name:攔截器名稱或攔截器棧名稱
          46             -->
          47<interceptor-ref name="timer"></interceptor-ref>
          48<!--節點配置
          49                name : result名稱 和Action中返回的值相同
          50                type : result類型 不寫則選用superpackage的type struts-default.xml中的默認為dispatcher
          51             -->
          52<result name="success"type="dispatcher">/talk.jsp</result>
          53<!--參數設置 
          54             name:對應Action中的get/set方法 
          55         -->
          56<param name="url">http://www.sina.com</param>
          57</action>
          58</package>
          59</struts>

          # re: struts2.0學習筆記(三)--Action  回復  更多評論   

          2008-09-03 11:25 by
          多謝博主,看來還得多實踐啊

          # re: struts2.0學習筆記(三)--Action  回復  更多評論   

          2008-09-05 16:34 by qin
          看來你挺歷害的!!
          主站蜘蛛池模板: 和硕县| 吉林省| 石林| 五寨县| 海城市| 上栗县| 庆云县| 大城县| 英吉沙县| 酉阳| 富源县| 寿光市| 太谷县| 白银市| 翁源县| 永丰县| 体育| 五指山市| 吉林省| 郁南县| 凯里市| 三河市| 新郑市| 三都| 承德县| 颍上县| 富顺县| 金秀| 达尔| 金山区| 宁化县| 广昌县| 新干县| 五常市| 东乌珠穆沁旗| 双鸭山市| 宁化县| 北辰区| 墨脱县| 泗水县| 辽源市|