<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 495,  comments - 11,  trackbacks - 0
     

    Struts 2.0的Action講解
    有Struts 1.x經驗的朋友都知道Action是Struts的核心內容,當然Struts 2.0也不例外。不過,Struts 1.x與Struts
    2.0的Action模型很大的區別。
    ???????? Struts 1.xStuts 2.0
    ??????? 接口必須繼承org.apache.struts.action.Action或者其子類無須繼承任何類型或實現任何接口
    ??????? 表單數據表單數據封裝在FormBean中表單數據包含在Action中,通過Getter和Setter獲取

    雖然,理論上Struts
    2.0的Action無須實現任何接口或繼承任何類型,但是,我們為了方便實現Action,大多數情況下都會繼承com.opensymphony.xwork2.ActionSupport類,并重載(Override)此類里的String
    execute()方法。具體的實現,如例1所示:
    <% @ page contentType = " text/html; charset=UTF-8 " %>
    <% @ taglib prefix = " s " uri = " /struts-tags " %>
    < html >
    < head >
    ????? < title > Hello World! </ title >
    </ head >
    < body >
    ????? < h2 >< s:property value ="message" /></ h2 >
    </ body >
    </ html > 例1 HelloWorld.jsp

    package tutorial;

    import java.text.DateFormat;
    import java.util.Date;

    import com.opensymphony.xwork2.ActionSupport;

    public class HelloWorld extends ActionSupport??? {
    ?????? private String message;
    ????
    ?????? public String getMessage()??? {
    ?????????? return message;
    ????? }
    ????
    ????? @Override
    ?????? public String execute()??? {
    ????????? message = " Hello World, Now is " + DateFormat.getInstance().format( new
    Date());
    ?????????? return SUCCESS;
    ????? }
    } 例1 classes/tutorial/HelloWorld.java

    < package name ="ActionDemo" extends ="struts-default" >
    ????? < action name ="HelloWorld" class ="tutorial.HelloWorld" >
    ????????? < result > /HelloWorld.jsp </ result >
    ????? </ action >
    </ package > 例1 classes/struts.xml中HelloWorld Action的配置


    在瀏覽器地址欄中鍵入http://localhost:8080/Struts2_Action/HelloWorld.action,可以看到如圖1所示頁面。
    ??
    圖1 HelloWorld輸出頁面

    參考JavaDoc,可知ActionSupport類實現了接口:
    ??? com.opensymphony.xwork2.Action
    ??? com.opensymphony.xwork2.LoaleProvider
    ??? com.opensymphony.xwork2.TextProvider
    ??? com.opensymphony.xwork2.Validateable
    ??? com.opensymphony.xwork2.ValidationAware
    ??? com.uwyn.rife.continuations.ContinuableObject
    ??? java.io.Searializable
    ??? java.lang.Cloneable
    默認情況下,當請求HelloWorld.action發生時,Struts運行時(Runtime)根據struts.xml里的Action映射集(Mapping),實例化tutoiral.HelloWorld類,并調用其execute方法。當然,我們可以通過以下兩種方法改變這種默認調用。這個功能(Feature)有點類似Struts
    1.x中的LookupDispathAction。
    ??? 在classes/sturts.xml中新建Action,并指明其調用的方法;
    ??? 訪問Action時,在Action名后加上“!xxx”(xxx為方法名)。
    實現方法請參考例2:
    在classes/tutorial/HelloWorld.java中加入以下方法:
    public String aliasAction() {
    ????? message ="自定義Action調用方法";
    ????? return SUCCESS;
    }例2 classes/tutorial/HelloWorld.java代碼片段

    實現方法一,在classes/sturts.xml中加入下面代碼:
    <action name="AliasHelloWorld" class="tutorial.HelloWorld" method="aliasAction">
    ???? <result>/HelloWorld.jsp</result>
    </action>例2 classes/struts.xml中AlaisHelloWorld Action的配置

    實現方法二,使用http://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action地址來訪問HelloWorld
    Action。
    在瀏覽器地址欄中鍵入http://localhost:8080/Struts2_Action/AliasHelloWorld.action
    http://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action,可以看到如圖2所示頁面。

    圖2 自定義Action調用方法頁面
    通過上面的兩個例子,細心的朋友應該可能會發現classes/tutorial/HelloWorld.java中Action方法(execute和aliasAction)返回都是SUCCESS。這個屬性變量我并沒有定義,所以大家應該會猜到它在ActionSupport或其父類中定義。沒錯,SUCCESS在接口com.opensymphony.xwork2.Action中定義,另外同時定義的還有ERROR,
    INPUT, LOGIN, NONE。
    此外,我在配置Action時都沒有為result定義名字(name),所以它們默認都為success。值得一提的是Struts
    2.0中的result不僅僅是Struts
    1.x中forward的別名,它可以實現除forward外的很激動人心的功能,如將Action輸出到FreeMaker模板、Velocity模板、JasperReports和使用XSL轉換等。這些都過result里的type(類型)屬性(Attribute)定義的。另外,您還可以自定義result類型。
    下面讓我們來做一個Velocity模板輸出的例子,首先在classes/struts.xml中新建一個Action映射(Mapping),將其result類型設為velocity,如以下代碼所示:
    <action name="VMHelloWorld" class="tutorial.HelloWorld">
    ????? <result type="velocity">/HelloWorld.vm</result>
    </action>例3 classes/struts.xml中VMHelloWorld Action的配置

    新建HelloWorld.vm,內容如下所示:
    <html>
    ??? <head>
    ????? <title>Velocity</title>
    ????? <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    ??? </head>
    ??? <body>
    ????? <h2>Message rendered in Velocity: $message</h2>
    ??? </body>
    </html>例3 HelloWorld.vm

    在瀏覽器地址欄中鍵入http://localhost:8080/Struts2_Action/VMHelloWorld.action,頁面輸出如下圖3所示。

    圖3 HelloWorld.vm的輸出頁面
    ??????? 要運行例3需要在WEB-INF/lib中添加以下幾個包:
    ????????? commons-collections-3.2.jar
    ????????? velocity-1.4.jar
    ????????? velocity-tools-view-1.2.jar
    ????????? avalon-logkit-2.1.jar


    前面,我花了不少的時間討論Action的輸出。我老板有句名言——程序無非就是輸入、操作和輸出。因此,現在我們要討論一下輸入——表單輸入。
    使用Struts
    2.0,表單數據的輸入將變得非常方便,和普通的POJO一樣在Action編寫Getter和Setter,然后在JSP的UI標志的name與其對應,在提交表單到Action時,我們就可以取得其值。
    讓我們看一個例子,新建Login
    Action,它通過Login.jsp的表單獲得用戶名和密碼,驗查用戶名是否為“max”,密碼是否則為“secret”。如果,兩者都符合,就在HelloWorld中顯示“Welcome,
    max”,否則顯示“Invalid user or Password”。
    package tutorial;

    import com.opensymphony.xwork2.ActionSupport;

    publicclass Login extends ActionSupport {
    ????? private String name;
    ????? private String password;
    ????? private String message;
    ????
    ????? public String getName() {
    ????????? return name;
    ????? }
    ????
    ????? publicvoid setName(String name) {
    ????????? this.name = name;
    ????? }
    ????
    ????? public String getPassword() {
    ????????? return password;
    ????? }
    ????
    ????? publicvoid setPassword(String password) {
    ????????? this.password = password;
    ????? }
    ????
    ????? public String getMessage() {
    ????????? return message;
    ????? }

    ????? @Override
    ????? public String execute() {
    ????????? if("max".equals(name) &&"Secret".equals(password)) {
    ????????????? message ="Welcome, "+ name;
    ????????? }else{
    ????????????? message ="Invalid user or password";
    ????????? }
    ????????? return SUCCESS;
    ????? }
    }例4 classes/tutorial/Login.java

    <%@ page contentType="text/html; charset=UTF-8" %>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head>
    ????? <title>Login</title>
    </head>
    <body>
    <s:form action="Login" method="POST">
    ????? <s:textfield name="name" label="User name"/>
    ????? <s:password name="password" label="Password"/>
    ????? <s:submit value="Submit"/>
    </s:form>
    </body>
    </html>例4 Login.jsp

    <action name="Login" class="tutorial.Login">
    ????? <result>/HelloWorld.jsp</result>
    </action>例4 classes/struts.xml中Login Action的配置

    運行Tomcat,在瀏覽器地址欄中鍵入http://localhost:8080/Struts2_Action/Login.jsp,出現如圖4所示頁面。


    分別在User name中輸入“max”和“secret”,點擊“Submit”按鈕,出現如圖5所示頁面。


    在瀏覽器地址欄中鍵入http://localhost:8080/Struts2_Action/Login.jsp,分別在User
    name中輸入“Scott”和“password”,點擊“Submit”按鈕,出現如圖6所示頁面。


    ;
    Struts
    2.0更厲害的是支持更高級的POJO訪問,如user.getPassword()。我們可以用另一寫法實現例4。首先,將name和password從Login類中分離出來,到新建類User中。這樣對我們開發多層系統尤其有用。它可以使系統結構更清晰。
    package tutorial;

    import com.opensymphony.xwork2.ActionSupport;

    publicclass LoginX extends ActionSupport {
    ????? private User user;
    ????? private String message;
    ????
    ????? publicvoid setUser(User user) {
    ????????? this.user = user;
    ????? }
    ????
    ????? public User getUser() {
    ????????? return user;
    ????? }
    ????
    ????? public String getMessage() {
    ????????? return message;
    ????? }
    ????
    ????? @Override
    ????? public String execute() {????????
    ????????? if("max".equals(user.getName()) &&"secret".equals(user.getPassword())) {
    ????????????? message ="Welcome, "+ user.getName();
    ????????? }else{
    ????????????? message ="Invalid user or password";
    ????????? }
    ????????? return SUCCESS;
    ????? }
    }例5 classes/tutorial/LoginX.java

    <%@ page contentType="text/html; charset=UTF-8" %>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head>
    ????? <title>Login</title>
    </head>
    <body>
    <s:form action="LoginX" method="POST">
    ????? <s:textfield name="user.name" label="User name"/>
    ????? <s:password name="user.password" label="Password"/>
    ????? <s:submit value="Submit"/>
    </s:form>
    </body>
    </html>例5 LoginX.jsp

    <action name="LoginX" class="tutorial.LoginX">
    ????? <result>/HelloWorld.jsp</result>
    </action>例5 classes/struts.xml中的LoginX Action配置??
    很多時候我的同事會問我:“如果我要取得Servlet
    API中的一些對象,如request、response或session等,應該怎么做?這里的execute不像Struts
    1.x的那樣在參數中引入。”開發Web應用程序當然免不了跟這些對象打交道。在Strutx
    2.0你可以有兩種方式獲得這些對象:非IoC(控制反轉Inversion of Control)方式和IoC方式。
    ??? 非IoC方式
    ??? 要獲得上述對象,關鍵Struts
    ??? 2.0中com.opensymphony.xwork2.ActionContext類。我們可以通過它的靜態方法getContext()獲取當前Action的上下文對象。
    ??? 另外,org.apache.struts2.ServletActionContext作為輔助類(Helper Class),可以幫助您快捷地獲得這幾個對象。

    ????? HttpServletRequest request = ServletActionContext.getRequest();
    ????? HttpServletResponse response = ServletActionContext.getResponse();
    ????? HttpSession session = request.getSession();
    ??? 如果你只是想訪問session的屬性(Attribute),你也可以通過ActionContext.getContext().getSession()獲取或添加session范圍(Scoped)的對象。
    ??? IoC方式
    ??? 要使用IoC方式,我們首先要告訴IoC容器(Container)想取得某個對象的意愿,通過實現相應的接口做到這點。具體實現,請參考例6
    ??? IocServlet.java。
    package tutorial;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

    import org.apache.struts2.ServletActionContext;

    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;

    publicclass NonIoCServlet extends ActionSupport {
    ????? private String message;
    ????
    ????? public String getMessage() {
    ????????? return message;????????
    ????? }
    ????
    ????? @Override
    ????? public String execute() {????
    ????????? ActionContext.getContext().getSession().put("msg", "Hello World from
    Session!");
    ????????
    ????????? HttpServletRequest request = ServletActionContext.getRequest();
    ????????? HttpServletResponse response = ServletActionContext.getResponse();???????

    ????????? HttpSession session = request.getSession();
    ????????
    ????????? StringBuffer sb =new StringBuffer("Message from request: ");
    ????????? sb.append(request.getParameter("msg"));
    ????????? sb.append("<br>Response Buffer Size: ");
    ????????? sb.append(response.getBufferSize());
    ????????? sb.append("<br>Session ID: ");
    ????????? sb.append(session.getId());
    ????????
    ????????? message = sb.toString();
    ????????? return SUCCESS;
    ????? }
    }例6 classes/tutorial/NonIoCServlet.java

    package tutorial;

    import java.util.Map;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;

    import org.apache.struts2.interceptor.ServletRequestAware;
    import org.apache.struts2.interceptor.ServletResponseAware;
    import org.apache.struts2.interceptor.SessionAware;

    import com.opensymphony.xwork2.ActionContext;
    import com.opensymphony.xwork2.ActionSupport;

    publicclass IoCServlet extends ActionSupport implements SessionAware,
    ServletRequestAware, ServletResponseAware {
    ????? private String message;
    ????? private Map att;
    ????? private HttpServletRequest request;
    ????? private HttpServletResponse response;????
    ????
    ????? public String getMessage() {
    ????????? return message;????????
    ????? }
    ????
    ????? publicvoid setSession(Map att) {
    ????????? this.att = att;
    ????? }
    ????
    ????? publicvoid setServletRequest(HttpServletRequest request) {
    ????????? this.request = request;
    ????? }
    ????
    ????? publicvoid setServletResponse(HttpServletResponse response) {
    ????????? this.response = response;
    ????? }
    ????
    ????? @Override
    ????? public String execute() {????????
    ????????? att.put("msg", "Hello World from Session!");
    ????????
    ????????? HttpSession session = request.getSession();
    ????????
    ????????? StringBuffer sb =new StringBuffer("Message from request: ");
    ????????? sb.append(request.getParameter("msg"));
    ????????? sb.append("<br>Response Buffer Size: ");
    ????????? sb.append(response.getBufferSize());
    ????????? sb.append("<br>Session ID: ");
    ????????? sb.append(session.getId());
    ????????
    ????????? message = sb.toString();
    ????????? return SUCCESS;
    ????? }
    }例6 classes/tutorial/IoCServlet.java

    <%@ page contentType="text/html; charset=UTF-8" %>
    <%@ taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head>
    ????? <title>Hello World!</title>
    </head>
    <body>
    ????? <h2>
    ????????? <s:property value="message" escape="false"/>
    ????????? <br>Message from session: <s:property value="#session.msg"/>
    ????? </h2>
    </body>
    </html>例6 Servlet.jsp

    <action name="NonIoCServlet" class="tutorial.NonIoCServlet">
    ????? <result>/Servlet.jsp</result>
    </action>
    <action name="IoCServlet" class="tutorial.IoCServlet">
    ????? <result>/Servlet.jsp</result>
    </action>例6 classes/struts.xml中NonIocServlet和IoCServlet Action的配置
    運行Tomcat,在瀏覽器地址欄中鍵入http://localhost:8080/Struts2_Action/NonIoCServlet.action?msg=Hello%20World!
    http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello%20World!,出現如圖7所示頁面。


    ??????? 在Servlet.jsp中,我用了兩次property標志,第一次將escape設為false為了在JSP中輸出<br>轉行,第二次的value中的OGNL為“#session.msg”,它的作用與session.getAttribute("msg")等同。
    ??????? 關于property或其它標志,可以參考我的上一篇文章《常用的Struts 2.0的標志(Tag)介紹 》

    posted @ 2007-09-24 15:14 jadmin 閱讀(88) | 評論 (0)編輯 收藏

    筆者一直相信(呵呵,我也這樣認為):要想成為一個優秀的程序員,應該從基本功練起,所有的代碼都應該用簡單的文本編輯器(包括EditPlus、UtraEdit等工具)完成。筆者經常見到一些有兩三年開發經驗的程序員,一旦離開了熟悉的IDE(集成開發環境,如Eclipse、JBuilder等),完全不能動手寫任何代碼。而他們往往還振振有詞:誰會不用任何工具來開發?

    實際上,真正優秀的程序員當然可以使用IDE工具,但即使使用VI(UNIX下無格式編輯器)、記事本也一樣可以完成非常優秀的項目。筆者對于IDE工具的態度是:可以使用IDE工具,但絕不可依賴于IDE工具。學習階段,千萬不要使用IDE工具;開發階段,才去使用IDE工具。

    ?提醒??? 對于IDE工具,業內有一個說法:IDE工具會加快高手的開發效率,但會使初學者更白癡。

    為了讓讀者更加清楚Struts 2應用的核心,筆者下面將“徒手”建立一個Struts 2應用。

    2.3.1??? 創建Web應用

    建立一個Web應用請按如下步驟進行

    ?在任意目錄新建一個文件夾,筆者將以該文件夾建立一個Web應用。

    ?在第1步所建的文件夾內建一個WEB-INF文件夾。

    ?進入Tomcat,或任何Web容器內,找到任何一個Web應用,將Web應用的WEB-INF下的web.xml文件復制到第2步所建的WEB-INF文件夾下。

    ?修改復制的web.xml文件,將該文件修改成只有一個根元素的XML文件,修改后的web.xml文件代碼如下:

    <?xml version="1.0" encoding="GBK"?>

    <!-- web-app是Web應用配置文件的根元素,指定Web應用的Schema信息 -->

    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"

    ?????????????????????????????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?????????????????????????????????? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.

    ????????????????????????????????????? com/xml/ns/j2ee/web-app_2_4.xsd">

    </web-app>

    ?在第2步所建的WEB-INF路徑下,新建兩個文件夾:classes和lib,它們分別用于保存單個*.class文件和JAR文件。

    經過上面步驟,已經建立了一個空Web應用。將該Web應用復制到Tomcat的webapps路徑下,該Web應用將可以自動部署在Tomcat中。

    將2.2節所定義的JSP頁面文件復制到第1步所建的文件夾下,該JSP頁面將成為該Web應用的一個頁面。該Web將有如下文件結構:

    Struts2qs

    |-WEB-INF

    |?????? |-classes

    |?????? |-lib

    |?????? |-web.xml

    |-login.jsp

    上面的Struts2qs是Web應用所對應文件夾的名字,可以更改;login.jsp是該Web應用下JSP頁面的名字,也可以修改。其他文件夾、配置文件都不可以修改。

    啟動Tomcat,在瀏覽器中瀏覽2.2節定義的JSP頁面,將看到如圖2.1所示的頁面。

    2.3.2??? 增加Struts 2功能

    為了給Web應用增加Struts 2功能,只需要將Struts 2安裝到Web應用中即可。在Web應用中安裝Struts 2框架核心只需要經過如下三個步驟。

    ?修改web.xml文件,在web.xml文件中配置Struts 2的核心Filter。

    ?將Struts 2框架的類庫復制到Web應用的WEB-INF/lib路徑下。

    ?在WEB-INF/classes下增加struts.xml配置文件

    下面是增加了Struts 2功能后Web應用的文件結構:

    Struts2qs

    |-WEB-INF

    |?????? |-classes(struts.xml)

    |?????? |-lib(commons-logging.jar,freemarker.jar,ognl.jar,struts2-core.jar,xwork.jar)

    |?????? |-web.xml

    |-login.jsp

    在上面的文件結構中,lib下Struts 2框架的類庫可能有版本后綴。例如commons-logging.jar,可能是commons-logging-1.1.jar;struts2-core.jar可能是struts2-core-2.0.6.jar。

    修改后的web.xml文件在2.1節已經給出了,故此處不再贅述。

    此處需要給讀者指出的是,Struts 2的Web應用默認需要Java 5運行環境,需要Web容器支持Servlet API 2.4和JSP API 2.0。如果讀者需要使用更低版本的Java運行時環境,則需要使用Struts 2框架的JDK 1.4支持。為了簡單起見,筆者建議讀者使用Java 5運行時環境,使用Tomcat 5.5或者更高版本。

    ?注意??? Struts 2應用默認需要Java 5運行時環境,需要支持Servlet API 2.4和JSP API 2.0的Web容器。

    posted @ 2007-09-24 14:57 jadmin 閱讀(88) | 評論 (0)編輯 收藏
    Struts 2已經發布了其產品化GA(General Availability)版,其實最新的產品化GA版是Struts 2.06(已經是2.0.9了),故本書的所有應用都是基于該版本的Struts 2。建議讀者下載Struts 2.06版,而不是下載最新的Beta版,如果Struts 2有最新的GA版,讀者也可以下載更新的GA版,相信不會有太大差異。

    下載和安裝DWR請按如下步驟進行。

    *登錄http://struts.apache.org/download.cgi#Struts206站點,下載Struts 2的最新GA版。在Struts 2.06下有如下幾個選項:

    —??? Full Distribution:下載Struts 2的完整版。通常建議下載該選項。

    —??? Example Applications:下載Struts 2的示例應用,這些示例應用對于學習Struts 2有很大的幫助,下載Struts 2的完整版時已經包含了該選項下全部應用。

    —??? Blank Application only:僅下載Struts 2的空示例應用,這個空應用已經包含在Example Applications選項下。

    —??? Essential Dependencies:僅僅下載Struts 2的核心庫,下載Struts 2的完整版時將包括該選項下的全部內容。

    —??? Documentation:僅僅下載Struts 2的相關文檔,包含Struts 2的使用文檔、參考手冊和API文檔等。下載Struts 2的完整版時將包括該選項下的全部內容。

    —??? Source:下載Struts 2的全部源代碼,下載Struts 2的完整版時將包括該選項下的全部內容。

    —??? Alternative Java 4 JARs:下載可選的JDK 1.4的支持JAR。下載Struts 2的完整版時將包括該選項下的全部內容。

    通常建議讀者下載第一個選項:下載Struts 2的完整版,將下載到的Zip文件解壓縮,該文件就是一個典型的Web結構,該文件夾包含如下文件結構:

    —??? apps:該文件夾下包含了基于Struts 2的示例應用,這些示例應用對于學習者是非常有用的資料。

    —??? docs:該文件夾下包含了Struts 2的相關文檔,包括Struts 2的快速入門、Struts 2的文檔,以及API文檔等內容。

    —??? j4:該文件夾下包含了讓Struts 2支持JDK 1.4的JAR文件。

    —??? lib:該文件夾下包含了Struts 2框架的核心類庫,以及Struts 2的第三方插件類庫。

    —??? src:該文件夾下包含了Struts 2框架的全部源代碼。

    將lib文件夾下的Struts2-core-2.0.6.jar、xwork-2.0.1.jar和ognl-2.6.11.jar等必需類庫復制到Web應用的WEB-INF/lib路徑下。當然,如果你的Web應用需要使用Struts 2的更多特性,則需要將更多的JAR文件復制到Web應用的WEB-INF/lib路徑下。如果需要在DOS或者Shell窗口下手動編譯Struts 2相關的程序,則還應該將Struts2-core-2.0.6.jar和xwork-2.0.1.jar添加到系統的CLASSPATH環境變量里。

    提示??? 大部分時候,使用Struts 2的Web應用并不需要利用到Struts 2的全部特性,因此沒有必要一次將該lib路徑下JAR文件全部復制到Web應用的WEB-INF/lib路徑下。

    編輯Web應用的web.xml配置文件,配置Struts 2的核心Filter。下面是增加了Struts 2的核心Filter配置的web.xml配置文件的代碼:

    <?xml version="1.0" encoding="GBK"?>

    <!-- web-app是Web應用配置文件的根元素,指定Web應用的Schema信息 -->

    <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"

    ?????????????????????????????????? xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    ?????????????????????????????????? xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.

    ????????????????????????????????????? com/xml/ns/j2ee/web-app_2_4.xsd">

    ?????????????????????????????????? <!-- 定義Struts 2的FilterDispatcher的Filter -->

    ??????????????????????????????????? <filter>

    ????????????????????????????????????? <!-- 定義核心Filter的名字 -->

    ??????????????????????????????????? <filter-name>struts2</filter-name>

    ????????????????????????????????????? <!-- 定義核心Filter的實現類 -->

    ??????????????????????????????????? <filter-class>org.apache.Struts2.dispatcher.FilterDispatcher

    ????????????????????????????????????????? </ filter-class>

    ??????????????????????????????????? </filter>

    ?????????????????????????????????? <!-- FilterDispatcher用來初始化Struts 2并且處理所有的Web請求 -->

    ??????????????????????????????????? <filter-mapping>

    ??????????????????????????????????? <filter-name>Struts2</filter-name>

    ??????????????????????????????????? <url-pattern>/*</url-pattern>

    ??????????????????????????????????? </filter-mapping>

    </web-app>

    經過上面3個步驟,我們已經可以在一個Web應用中使用Struts 2的基本功能了,下面將帶領讀者進入Struts 2 MVC框架的世界。

    posted @ 2007-09-24 14:56 jadmin 閱讀(95) | 評論 (0)編輯 收藏
    index.jsp中設計表單(只包含<body>標簽內的內容):

    <body>

    ??<h4>請輸入你的基本信息</h4>

    ????<formname="infoForm"action="go.action"method="POST">

    ????????姓名:<inputtype="text"name="person.name"/><br>

    ????????性別:<selectname="person.sex">

    ?????????????<optionvalue=""></option>

    ?????????????<optionvalue=""></option>

    ????????</select><br>

    ????????地址:<inputtype="text"name="person.address"/><br>

    ????????電話:<inputtype="text"name="person.phone"/><br>

    ????????<inputtype="submit"value="提交"/>&nbsp;&nbsp;<inputtype="reset"value="重置"/><br>

    ????</form>

    ??</body>

    創建com.action包,其中寫MyAction.java文件,注意它是ActionSupport類的子類。ActionSupport類在com.opensymphony.xwork2.ActionSupport中。

    packagecom.action;

    importcom.bean.Person;

    importcom.opensymphony.xwork2.ActionSupport;

    publicclassMyActionextendsActionSupport {

    ????privatePersonperson;

    ????@Override

    ????publicString execute()throwsException {

    ???????//TODOAuto-generated method stub

    ???????returnSUCCESS;

    ????}

    ????publicPerson getPerson() {

    ???????returnperson;

    ????}

    ????publicvoidsetPerson(Person person) {

    ???????if(person ==null) person =newPerson();

    ???????this.person= person;

    ????}

    }

    posted @ 2007-09-24 14:48 jadmin 閱讀(98) | 評論 (0)編輯 收藏

    這時web.xml中相應的地方就改為:

    <filter>

    ???????<filter-name>struts</filter-name>

    ???????<filter-class>

    ???????????com.filter.NewFilterDispatcher

    ???????</filter-class>

    ???????<init-param>

    ????????????<param-name>encoding</param-name>

    ????????????<param-value>GB2312</param-value>

    ????????</init-param>

    ????</filter>

    ????

    ????<filter-mapping>

    ???????<filter-name>struts</filter-name>

    ???????<url-pattern>/*</url-pattern>

    ????</filter-mapping>

    說明

    (1)該類是FilterDispatcher類的子類。

    (2)該類有個成員變量,名為encoding,默認是“GB<?xml:namespace prefix = st1 />2312

    (3)注意在web.xml中,<filter>標簽里多了<init-param>標簽,顧名思義,它的作用是初始化一個參數,里面定義了參數名和參數值。因此,在子類中,需要重寫init方法,其中:

    String encodingParam = filterConfig.getInitParameter("encoding");

    ???就是從web.xml中讀出了參數名為encoding的值,然后賦給子類中的encoding成員。

    (4)重寫dofilter方法,加上:

    ??request.setCharacterEncoding(encoding);

    然后再調用父類的dofilter方法,這樣就完成了編碼的轉換。

    (5)如果需要使用其它編碼(如“UTF-8等),只要改變<param-value>中的值即可。

    這樣就把struts2.0加入到工程中了。

    三、Struts2.0的配置文件

    除了在web.xml中配置以外,struts2.0還有幾個自己的配置文件,其中最重要的兩個是struts.propertiesstruts.xml都要放到src目錄下

    Struts.properties的原文件可以在struts-core-2.0.x.jar中找到,原名叫default.properties,將其解壓出來,并改名為struts.properties,放到工程的src目錄下,然后還需要修改里面的值。比如:

    struts.locale=zh_CN

    struts.i18n.encoding=GB2312

    修改以后,這樣struts才能認識中文。

    再比如:

    struts.action.extension=action

    這是個默認值,意思說,struts的每個action的后綴都是.action

    修改后的struts.properties文件在ftp上。

    Struts.xml文件用于配置所有的action,在后文有詳細的配置方法。

    四、創建JavaBean

    創建com.bean包,確定需要輸入的個人信息有“姓名”、“性別”、“地址”、“電話”,因此先定義一個JavaBean,名為Person.java,放到com.bean包中,它包括四個成員以及相應的getset方法:(待續)

    posted @ 2007-09-24 14:48 jadmin 閱讀(91) | 評論 (0)編輯 收藏
    創建工程,比如Struts2

    struts-<?xml:namespace prefix = st1 />2.0.6\lib中的的jar文件全部(為了后面的功能擴張)粘貼工程Struts2lib目錄中。

    二、???????????配置項目的web.xml??????

    Struts2.0所有的配置被整合在一個Filter里面,該Filter位于org.apache.struts2.dispatcher.FilterDispatcher,因此,在web.xml中應該這樣聲明:

    <filter>

    ???????<filter-name>struts</filter-name>

    ???????<filter-class>

    ???????????org.apache.struts2.dispatcher.FilterDispatcher

    ???????</filter-class>

    ????</filter>

    ????

    ????<filter-mapping>

    ???????<filter-name>struts</filter-name>

    ???????<url-pattern>/*</url-pattern>

    </filter-mapping>

    但是,該Filter一個問題,就是從頁面傳到后臺的中文經過這個過濾器后會變成亂碼,為了解決這個問題,需要重寫這個過濾器,最簡單的方法是寫一個類繼承FilterDispatcher,在src目錄下創建com.filter包,在包中建立NewFilterDispatcher類,繼承FilterDispatcher,代碼如下:

    packagecom.filter;

    importjava.io.IOException;

    importjavax.servlet.FilterChain;

    importjavax.servlet.FilterConfig;

    importjavax.servlet.ServletException;

    importjavax.servlet.ServletRequest;

    importjavax.servlet.ServletResponse;

    importorg.apache.struts2.dispatcher.FilterDispatcher;

    publicclassNewFilterDispatcherextendsFilterDispatcher {

    ????privatestaticStringencoding="GB2312";

    ????????publicvoidinit(FilterConfig filterConfig)throwsServletException {

    ????????????super.init(filterConfig);

    ????????????String encodingParam = filterConfig.getInitParameter("encoding");

    ????????????if(encodingParam !=null&& encodingParam.trim().length() != 0) {

    ???????????????encoding= encodingParam;

    ????????????}

    ????????}

    ????????publicvoiddoFilter(ServletRequest request, ServletResponse response,

    ????????????????FilterChain chain)throwsIOException, ServletException {

    ????????????request.setCharacterEncoding(encoding);

    ????????????super.doFilter(request, response, chain);

    ????????}

    ????

    }(待續)

    posted @ 2007-09-24 14:46 jadmin 閱讀(116) | 評論 (0)編輯 收藏
    Question: constant name="struts.action.extension" value="action"???? 問題
    Answer:這個是系統從struts.properties默認繼承這個配置,所以用的時候會自動加上.action
    The URL extension to use to determine if the request is meant for a Struts action
    用URL擴展名來確定是否這個請求是被用作Struts action,其實也就是設置 action的后綴,例如login.do的'do'字。
    s:form 的時候用

    Question:Struts2的xml的配置
    Answer:Struts2默認會讀取classpath下的struts-default.xml,struts-plugin.xml,struts.xml這三個文件。
    struts-plugin.xml的位置struts-plugin.xml會在你下載的plugin的jar包中,如struts2-spring-plugin-2.0.6.jar。

    Question:java.lang.NullPointerException 異常
    Answer:應該沒在web.xml有配置struts 2的filter,試下將以下列代碼加到web.xml的元素之間:
    好像需要Tomcat 5.5以上,5.0會有問題,諸如NullPointerExceptio之類的

    Question:Could not find or error in struts.properties
    java.lang.IllegalStateException: struts.properties missing
    問題解決:把struts.properties 放到classes下即可了

    Question:的action才與struts.xml中的Action名一樣,
    而 <form> 中的action應為你的Action的路徑的全名如/mypath/myaction.action;
    Answer:Action中的屬性值可以通過Javabean規范與請求是的參數綁定,
    所以等Form標志的name屬性必須與Action屬性名一致。

    Question:取得Servlet API中的一些對象,如request、response或session等,應該怎么做?
    Answer:com.opensymphony.xwork2.ActionContext,可以通過它的靜態方法getContext()獲取當前Action的上下文對象,
    非IOC:
    另外,org.apache.struts2.ServletActionContext作為輔助類(Helper Class),可以幫助您快捷地獲得這幾個對象,
    HttpServletRequest request = ServletActionContext.getRequest();
    HttpServletResponse response = ServletActionContext.getResponse();
    HttpSession session = request.getSession();
    IOC:
    import org.apache.struts2.interceptor.ServletRequestAware;
    import org.apache.struts2.interceptor.ServletResponseAware;
    import org.apache.struts2.interceptor.SessionAware;
    publicclass IoCServlet extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {
    ???? private String message;
    ???? private HttpServletRequest request;
    ???? private HttpServletResponse response;
    }

    Question:表達式的問題,有${表達式}、帶有#的表達式(如上文中的#session.msg),還有%開始的表達式,
    這些好像都是取出里面的值,請問這些$、#、%開頭的表達式有什么不同?各自在什么情況下使用?
    Answer:OGNL中的${...}可以在定義Action的result時,傳遞變量,如/deleteBook.action?isbn=${isbn}。也可以在國際化時引用變量;
    #用于在頁面上引用ActionContext的值,也可以構造映射(Map)等,如#request.xxx;
    %{...}在標簽屬性中引用變量,如

    Question:如何得到cookies
    Answer:先在Action中拿到HttpServletRequest的對象(請參考《Struts 2.0的Action講解》),然后調用request.getCookies()。

    Question:
    頁面就可以直接獲取${message},請問這默認是request級別的嗎?
    如果是session級別的,是不是要在取得session后
    在代碼中明確寫入,session.setAttribute(xx.xxxx)
    Answer:這些值是放在ActionContext中的,所以不是request或session等

    轉載資料 from http://m.tkk7.com/max

    posted @ 2007-09-24 14:40 jadmin 閱讀(134) | 評論 (0)編輯 收藏
    Struts2與Struts1的對比

    Action 類:
    ? Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。
    ? Struts 2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定制的服務成為可能。Struts2提供一個ActionSupport基類去實現 常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。
    線程模式:
    ? Struts1 Action是單例模式并且必須是線程安全的,因為僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,并且要在開發時特別小心。Action資源必須是線程安全的或同步的。
    ? Struts2 Action對象為每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,并且不會導致性能和垃圾回收問題)
    Servlet 依賴:
    ? Struts1 Action 依賴于Servlet API ,因為當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。
    ? Struts 2 Action不依賴于容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。
    可測性:
    ? 測試Struts1 Action的一個主要問題是execute方法暴露了servlet API(這使得測試要依賴于容器)。一個第三方擴展--Struts TestCase--提供了一套Struts1的模擬對象(來進行測試)。
    ? Struts 2 Action可以通過初始化、設置屬性、調用方法來測試,“依賴注入”支持也使測試更容易。
    捕獲輸入:
    ? Struts1 使用ActionForm對象捕獲輸入。所有的ActionForm必須繼承一個基類。因為其他JavaBean不能用作ActionForm,開發者經常創建多余的類捕獲輸入。動態Bean(DynaBeans)可以作為創建傳統ActionForm的選擇,但是,開發者可能是在重新描述(創建)已經存在的JavaBean(仍然會導致有冗余的javabean)。
    ? Struts 2直接使用Action屬性作為輸入屬性,消除了對第二個輸入對象的需求。輸入屬性可能是有自己(子)屬性的rich對象類型。Action屬性能夠通過web頁面上的taglibs訪問。Struts2也支持ActionForm模式。rich對象類型,包括業務對象,能夠用作輸入/輸出對象。這種ModelDriven 特性簡化了taglib對POJO輸入對象的引用。
    表達式語言:
    ? Struts1 整合了JSTL,因此使用JSTL EL。這種EL有基本對象圖遍歷,但是對集合和索引屬性的支持很弱。
    ? Struts2可以使用JSTL,但是也支持一個更強大和靈活的表達式語言--"Object Graph Notation Language" (OGNL).
    綁定值到頁面(view):
    ? Struts 1使用標準JSP機制把對象綁定到頁面中來訪問。
    ? Struts 2 使用 "ValueStack"技術,使taglib能夠訪問值而不需要把你的頁面(view)和對象綁定起來。ValueStack策略允許通過一系列名稱相同但類型不同的屬性重用頁面(view)。
     
    類型轉換:
    ? Struts 1 ActionForm 屬性通常都是String類型。Struts1使用Commons-Beanutils進行類型轉換。每個類一個轉換器,對每一個實例來說是不可配置的。
    ? Struts2 使用OGNL進行類型轉換。提供基本和常用對象的轉換器。
    校驗:
    ? Struts 1支持在ActionForm的validate方法中手動校驗,或者通過Commons Validator的擴展來校驗。同一個類可以有不同的校驗內容,但不能校驗子對象。
    ? Struts2支持通過validate方法和XWork校驗框架來進行校驗。XWork校驗框架使用為屬性類類型定義的校驗和內容校驗,來支持chain校驗子屬性
    Action執行的控制:
    ? Struts1支持每一個模塊有單獨的Request Processors(生命周期),但是模塊中的所有Action必須共享相同的生命周期。
    ? Struts2支持通過攔截器堆棧(Interceptor Stacks)為每一個Action創建不同的生命周期。堆棧能夠根據需要和不同的Action一起使用。
    posted @ 2007-09-24 14:36 jadmin 閱讀(55) | 評論 (0)編輯 收藏

    Struts安裝:
    首先請到http://jakarta.apache.org/Struts下載Struts,建議使用release版,現在最高版本為1.1,下載后得到的是一個ZIP文件。
    將ZIP包解開,可以看到這個目錄:lib和webapps,webapps下有一些WAR文件。假設你的Tomcat裝在c:\Tomcat下,則將那些WAR文件拷貝到C:\Tomcat\webapps,重新啟動Tomcat即可。打開瀏覽器,在地址欄中輸入:http://localhost:8080/Struts-example/index.jsp,若能見到“powered by Struts”的深藍色圖標,即說明成功了。這是Struts自帶的一個例子,附有詳細的說明文檔,可以做為初學者的入門教程。另外,Struts還提供了一系統實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息等
    一個實例:
    一個用戶注冊系統,用戶通過網頁輸入相關信息:注冊ID號,密碼,EMAIL,若注冊成功,則返回成功提示信息,反之出現注冊失敗提示信息。
    以下是相關文件的部分核心代碼。

    項目建立:
    正式開發前,需要在Tocmat(我的tomcat裝在c:\tomcat)中建立此項目。比較快的一種建立方式為:在C:\tomcat\webapps下新建目錄test,再將C:\tomcat\webapps\struts-example下的
    WEB-INF目錄拷貝到test目錄下,然后將test\WEB-INF下的src和classes目錄清空,以及struts-config.xml文件中內容清空即可。這樣,我們需要的Struts類包及相關的配置文件就都齊了。
    開發時,將JSP文件放在test目錄下,Java原文件放在test\WEB-INF\src下,編譯后的類文件放在test\WEB-INF\classes下。

    注冊頁面:reguser.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@ taglib uri="/WEB-INF/Struts-bean.tld" prefix="bean" %>
    <%@ taglib uri="/WEB-INF/Struts-html.tld" prefix="html" %>
    <html:html locale="true">
    <head>
    <title>RegUser</title>
    <html:base/>
    </head>
    <body bgcolor="white">
    <html:errors/>
    <html:form action="/regUserAction" focus="logname">
    <table border="0" width="100%">
    <tr>
    <th align="right">
    Logname:
    </th>
    <td align="left">
    <html:text property="logname" size="20" maxlength="20"/>
    </td>
    </tr>
    <tr>
    <th align="right">
    Password:
    </th>
    <td align="left">
    <html:password property="password" size="20" maxlength="20"/>
    </td>
    </tr>
    <tr>
    <th align="right">
    E-mail:
    </th>
    <td align="left">
    <html:password property="email" size="30" maxlength="50"/>
    </td>
    </tr>
    <tr>
    <td align="right">
    <html:submit property="submit" value="Submit"/>
    </td>
    <td align="left">
    <html:reset/>
    </td>
    </tr>
    </table>
    </html:form>
    </body>
    </html:html>

    此JSP頁面不同于普通的JSP頁,因為它大量運用了taglib,這些taglib對初學者而言,可能難于掌握,可這卻是Struts的精華之一。靈活運用,將大大提高開發效率。

    Struts-config.xml:

    <Struts-config>
    <form-beans>
    <form-bean name="regUserForm"
    type="org.cjea.Struts.example. RegUserForm "/>
    </form-beans>
    <action-mappings>
    <action path="/regUserAction"
    type=" org.cjea.Struts.example.RegUserAction "
    attribute=" regUserForm "
    scope="request"
    validate="false">
    <forward name="failure" path="/ messageFailure.jsp"/>
    <forward name="success" path="/ messageSuccess.jsp"/>
    </action>
    </action-mappings>
    </Struts-config>

    Struts的核心是Controller,即ActionServlet,而ActionServlet的核心就是Struts-config.xml,Struts-config.xml集中了所有頁面的導航定義。對于大型的WEB項目,通過此配置文件即可迅速把握其脈絡,這不管是對于前期的開發,還是后期的維護或升級都是大有裨益的。掌握Struts-config.xml是掌握Struts的關鍵所在。

    FormBean:RegUserForm

    package org.cjea.Struts.example;

    import javax.Servlet.http.HttpServletRequest;
    import org.apache.Struts.action.ActionForm;
    import org.apache.Struts.action.ActionMapping;

    public final class RegUserForm extends ActionForm{

    private String logname;
    private String password;
    private String email;

    public RegUserForm(){
    logname = null;
    password = null;
    email = null;
    }

    public String getLogName() {
    return this.logname;
    }
    public void setLogName(String logname) {
    this.logname = logname;
    }
    public void setPassWord(String password) {
    this.password = password;
    }
    public String getPassWord() {
    return this.password;
    }
    public void setEmail(String email) {
    this.email = email;
    }
    public String getEmail() {
    return this.email;
    }

    public void reset(ActionMapping mapping, HttpServletRequest request)
    {
    logname = null;
    password = null;
    email = null;
    }
    }

    每一個FormBean 都必須繼承ActionForm類,FormBean是對頁面請求的封裝。即把HTTP request 封裝在一個對象中,需要說明的一點就是多個HTTP request可以共用一個FormBean,便于維護和重用。

    ActionBean:RegUserAction

    package org.cjea.Struts.example;

    import javax.Servlet.http.*;
    import org.apache.Struts.action.*;

    public final class RegUserAction extends Action
    {

    public ActionForward perform(ActionMapping mapping,
    ActionForm form, HttpServletRequest req,
    HttpServletResponse res)
    {
    String title = req.getParameter("title");
    String password = req.getParameter("password");
    String email = req.getParameter("email");
    /*
    取得用戶請求,做相應數據庫操作,略
    */
    }
    }

    FormBean的產生是為了提供數據給ActionBean,在ActionBean中可以取得FormBean中封裝的數據,經相應的邏輯處理后,調用業務方法完成相應業務要求。

    Servlet的演變:在常規的 JSP,Servlet,JavaBean三層結構中,JSP實現View的功能,Servlet實現Controller的功能,JavaBean實現Model的實現。

    在Struts中,將常規情況下的Servlet拆分與ActionServlet、FormBean、ActionBean三個部分。ActionServlet配合Struts-config.xml,專職完成頁面導航,而不再負責具體的數據獲取與相應邏輯,這兩部分功能由FormBean和ActionBean來完成。

    Struts優缺點
    優點:
    Struts跟Tomcat、Turbine等諸多Apache項目一樣,是開源軟件,這是它的一大優點。使開發者能更深入的了解其內部實現機制。
    除此之外,Struts的優點主要集中體現在兩個方面:Taglib和頁面導航。Taglib是Struts的標記庫,靈活動用,能大大提高開發效率。另外,就目前國內的JSP開發者而言,除了使用JSP自帶的常用標記外,很少開發自己的標記,或許Struts是一個很好的起點。
    關于頁面導航,我認為那將是今后的一個發展方向,事實上,這樣做,使系統的脈絡更加清晰。通過一個配置文件,即可把握整個系統各部分之間的聯系,這對于后期的維護有著莫大的好處。尤其是當另一批開發者接手這個項目時,這種優勢體現得更加明顯。
    缺點:
    Taglib是Struts的一大優勢,但對于初學者而言,卻需要一個持續學習的過程,甚至還會打亂你網頁編寫的習慣,但是,當你習慣了它時,你會覺得它真的很棒。
    Struts將MVC的Controller一分為三,在獲得結構更加清晰的同時,也增加了系統的復雜度。
    Struts從產生到現在還不到半年,但已逐步越來越多運用于商業軟件。雖然它現在還有不少缺點,但它是一種非常優秀的J2EE MVC實現方式,如果你的系統準備采用J2EE MVC架構,那么,不妨考慮一下Struts。

    Struts實施經驗:
    1、基于Struts架構的項目開發,首先需要有一個很好的整體規劃,整個系統中包括哪幾個模塊,每個模塊各需要多少FormBean和ActionBean等,而且最好有專人負責Struts-config.xml的管理。開發基于Struts的項目的難點在于配置管理,尤其是對Struts-config.xml的管理

    2、如果你的項目非常緊,并且項目組中又沒有富有經驗的Struts開發人員,建議不要冒然采用Struts。Struts的掌握需要一個過程,對于一個熟練的JSP程序員,自學大概需要半個月左右的時間。如果結合titls,則需要更長的時間

    3、如果你在網頁中大量運用taglib,那么你的美工將做出部分犧牲。當你結合Tiles,功能增強的同時,這種犧牲尤為明顯。當然,你對功能和美觀的取舍由你自己決定

    4、Taglib是一個好東西,但靈活運用它卻需要一個過程,如果你不想在Taglib上花太多的時間,那么只需理解與FORM有關的幾個標記,其它的標記就放著吧,以后再看,先去研究ActionServlet和Struts-config.xml,你會覺得很有成就感

    5、Struts是否只適合于大型項目呢?No!Struts適合于各種大小的項目,當然,對于大型項目,它所體現出來的優勢更加明顯。

    posted @ 2007-09-24 09:27 jadmin 閱讀(63) | 評論 (0)編輯 收藏

    struts.action.extension
    ?????????? The URL extension to use to determine if the request is meant for a Struts action
    ??????????? 用URL擴展名來確定是否這個請求是被用作Struts action,其實也就是設置 action的后綴,例如login.do的'do'字。

    struts.configuration
    ?????????? The org.apache.struts2.config.Configuration implementation class
    ???????????? org.apache.struts2.config.Configuration接口名

    struts.configuration.files
    ?????????? A list of configuration files automatically loaded by Struts
    ??????????? struts自動加載的一個配置文件列表

    struts.configuration.xml.reload
    ?????????? Whether to reload the XML configuration or not
    ??????????? 是否加載xml配置(true,false)

    struts.continuations.package
    ??????????? The package containing actions that use Rife continuations
    ??????????? 含有actions的完整連續的package名稱

    struts.custom.i18n.resources
    ?????????? Location of additional localization properties files to load
    ??????????? 加載附加的國際化屬性文件(不包含.properties后綴)

    struts.custom.properties
    ?????????? Location of additional configuration properties files to load
    ??????????? 加載附加的配置文件的位置


    struts.devMode
    ?????????? Whether Struts is in development mode or not
    ??????????? 是否為struts開發模式

    struts.dispatcher.parametersWorkaround
    ?????????? Whether to use a Servlet request parameter workaround necessary for some versions of WebLogic
    ???????????? (某些版本的weblogic專用)是否使用一個servlet請求參數工作區(PARAMETERSWORKAROUND)

    struts.enable.DynamicMethodInvocation
    ?????????? Allows one to disable dynamic method invocation from the URL
    ???????????? 允許動態方法調用

    struts.freemarker.manager.classname
    ?????????? The org.apache.struts2.views.freemarker.FreemarkerManager implementation class
    ??????????? org.apache.struts2.views.freemarker.FreemarkerManager接口名

    struts.i18n.encoding
    ?????????? The encoding to use for localization messages
    ??????????? 國際化信息內碼

    struts.i18n.reload
    ?????????? Whether the localization messages should automatically be reloaded
    ??????????? 是否國際化信息自動加載

    struts.locale
    ?????????? The default locale for the Struts application
    ??????????? 默認的國際化地區信息

    struts.mapper.class
    ?????????? The org.apache.struts2.dispatcher.mapper.ActionMapper implementation class
    ???????????? org.apache.struts2.dispatcher.mapper.ActionMapper接口

    struts.multipart.maxSize
    ?????????? The maximize size of a multipart request (file upload)
    ??????????? multipart請求信息的最大尺寸(文件上傳用)

    struts.multipart.parser
    ?????????? The org.apache.struts2.dispatcher.multipart.??????????
    ?????????? MultiPartRequest parser implementation for a multipart request (file upload)
    ?????????? 專為multipart請求信息使用的org.apache.struts2.dispatcher.multipart.MultiPartRequest解析器接口(文件上傳用)


    struts.multipart.saveDir
    ?????????? The directory to use for storing uploaded files
    ??????????? 設置存儲上傳文件的目錄夾

    struts.objectFactory
    ?????????? The com.opensymphony.xwork2.ObjectFactory implementation class
    ??????????? com.opensymphony.xwork2.ObjectFactory接口(spring)

    struts.objectFactory.spring.autoWire
    ?????????? Whether Spring should autoWire or not
    ??????????? 是否自動綁定Spring

    struts.objectFactory.spring.useClassCache
    ?????????? Whether Spring should use its class cache or not
    ??????????? 是否spring應該使用自身的cache

    struts.objectTypeDeterminer
    ?????????? The com.opensymphony.xwork2.util.ObjectTypeDeterminer implementation class
    ???????????? com.opensymphony.xwork2.util.ObjectTypeDeterminer接口

    struts.serve.static.browserCache
    ????????? If static content served by the Struts filter should set browser caching header properties or not
    ??????????? 是否struts過濾器中提供的靜態內容應該被瀏覽器緩存在頭部屬性中

    struts.serve.static
    ?????????? Whether the Struts filter should serve static content or not
    ??????????? 是否struts過濾器應該提供靜態內容

    struts.tag.altSyntax
    ?????????? Whether to use the alterative syntax for the tags or not
    ??????????? 是否可以用替代的語法替代tags

    struts.ui.templateDir
    ?????????? The directory containing UI templates
    ??????????? UI templates的目錄夾

    struts.ui.theme
    ?????????? The default UI template theme
    ??????????? 默認的UI template主題

    struts.url.http.port
    ?????????? The HTTP port used by Struts URLs
    ??????????? 設置http端口

    struts.url.https.port
    ?????????? The HTTPS port used by Struts URLs
    ??????????? 設置https端口

    struts.url.includeParams
    ?????????? The default includeParams method to generate Struts URLs
    ?????????? 在url中產生 默認的includeParams


    struts.velocity.configfile
    ?????????? The Velocity configuration file path
    ??????????? velocity配置文件路徑

    struts.velocity.contexts
    ?????????? List of Velocity context names
    ??????????? velocity的context列表


    struts.velocity.manager.classname
    ?????????? org.apache.struts2.views.velocity.VelocityManager implementation class
    ??????????? org.apache.struts2.views.velocity.VelocityManager接口名

    struts.velocity.toolboxlocation
    ?????????? The location of the Velocity toolbox
    ?????????? velocity工具盒的位置

    struts.xslt.nocache
    ?????????? Whether or not XSLT templates should not be cached
    ??????????? 是否XSLT模版應該被緩存

    posted @ 2007-09-23 23:40 jadmin 閱讀(76) | 評論 (0)編輯 收藏
    僅列出標題
    共50頁: First 上一頁 25 26 27 28 29 30 31 32 33 下一頁 Last 
    主站蜘蛛池模板: 免费一级毛片在线播放| 亚洲日韩精品无码AV海量| 亚洲an天堂an在线观看| 亚洲国产精品成人AV在线| 18以下岁毛片在免费播放| 亚洲精品少妇30p| 一级特黄录像视频免费| 女人张开腿等男人桶免费视频| 久久精品亚洲综合专区| 中文字幕无码毛片免费看| 免费中文字幕不卡视频| 久久久久久久岛国免费播放 | 中文字幕在线日亚洲9| 无码免费一区二区三区免费播放 | 97久久精品亚洲中文字幕无码| 久久综合久久综合亚洲| 亚洲精品亚洲人成在线观看下载 | 一个人免费观看www视频| 亚洲日本香蕉视频观看视频| 亚洲免费观看在线视频| 亚洲精品无码久久毛片波多野吉衣| 蜜桃成人无码区免费视频网站| 亚洲AV无码一区二区乱孑伦AS| 四虎影院免费在线播放| 免费国产黄网站在线观看视频| 视频免费1区二区三区| 超清首页国产亚洲丝袜| 黄色视频在线免费观看| 亚洲线精品一区二区三区| 久久免费国产精品一区二区| 亚洲精品在线视频观看| 国产亚洲色婷婷久久99精品91| 免费看AV毛片一区二区三区| 国产偷国产偷亚洲高清人| av无码东京热亚洲男人的天堂| 一区二区三区在线观看免费| 亚洲性色AV日韩在线观看| 亚洲成a人在线看天堂无码| 成全视成人免费观看在线看| 亚洲狠狠综合久久| 毛片免费全部播放一级|