隨筆-34  評論-1965  文章-0  trackbacks-0

          有Struts 1.x經驗的朋友都知道Action是Struts的核心內容,當然Struts 2.0也不例外。不過,Struts 1.x與Struts 2.0的Action模型很大的區(qū)別。

          ? Struts 1.x Stuts 2.0
          接口 必須繼承org.apache.struts.action.Action或者其子類 無須繼承任何類型或實現任何接口
          表單數據 表單數據封裝在FormBean中 表單數據包含在Action中,通過Getter和Setter獲取

          雖然,理論上Struts 2.0的Action無須實現任何接口或繼承任何類型,但是,我們?yōu)榱朔奖銓崿FAction,大多數情況下都會繼承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輸出頁面
          圖1 HelloWorld輸出頁面

          參考JavaDoc,可知ActionSupport類實現了接口:

          默認情況下,當請求HelloWorld.action發(fā)生時,Struts運行時(Runtime)根據struts.xml里的Action映射集(Mapping),實例化tutoiral.HelloWorld類,并調用其execute方法。當然,我們可以通過以下兩種方法改變這種默認調用。這個功能(Feature)有點類似Struts 1.x中的LookupDispathAction。

          1. 在classes/sturts.xml中新建Action,并指明其調用的方法;
          2. 訪問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.actionhttp://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action,可以看到如圖2所示頁面。

          圖2 自定義Action調用方法頁面
          圖2 自定義Action調用方法頁面

          通過上面的兩個例子,細心的朋友應該可能會發(fā)現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 HelloWorld.vm的輸出頁面
          要運行例3需要在WEB-INF/lib中添加以下幾個包:

          前面,我花了不少的時間討論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所示頁面。

          圖4 Login.jsp輸出頁面
          圖4 Login.jsp輸出頁面

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

          圖5 Login成功頁面
          圖5 Login成功頁面

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

          圖6 Login失敗頁面
          圖6 Login失敗頁面?

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

          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的那樣在參數中引入。”開發(fā)Web應用程序當然免不了跟這些對象打交道。在Strutx 2.0你可以有兩種方式獲得這些對象:非IoC(控制反轉Inversion of Control)方式和IoC方式。

          1. 非IoC方式

            要獲得上述對象,關鍵Struts 2.0中com.opensymphony.xwork2.ActionContext類。我們可以通過它的靜態(tài)方法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)的對象。

          2. 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所示頁面。


          圖7 Servlet.jsp的輸出頁面?
          圖7 Servlet.jsp的輸出頁面

          在Servlet.jsp中,我用了兩次property標志,第一次將escape設為false為了在JSP中輸出<br>轉行,第二次的value中的OGNL為“#session.msg”,它的作用與session.getAttribute("msg")等同。
          關于property或其它標志,可以參考我的上一篇文章《常用的Struts 2.0的標志(Tag)介紹 》。
          posted on 2006-10-25 12:10 Max 閱讀(99500) 評論(118)  編輯  收藏 所屬分類: Struts 2.0系列
          評論共2頁: 1 2 下一頁 

          評論:
          # re: Struts 2.0的Action講解[未登錄] 2007-03-27 16:22 | Michael
          我用自己定義的方法怎么沒能把值傳到JSP上?用execute這個方法就行.
          我的方法(在action中)
          public String show()
          {
          return SUCCESS;
          }
          struts.xml中配置如下.
          <action name="ActionShow" class="tutorial.ActionShow" method="show">
          <result name="ok" type="redirect">showAll.jsp</result>
          </action>
          我的action繼承ActionSupport這個類  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-03-27 23:12 | Max
          @Michael
          原因你把result的類型(type)設為了"redirect", 而且名稱(name)也不對。如果Action方法返回SUCCESS時,name應為success。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-03-27 23:14 | Max
          @jintian
          對不起,我忘記把User類的代碼貼上去了,其實就和Seed說的一樣。
          @seed
          謝謝  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-04 15:00 | panka
          好文章,看了很有收獲,繼續(xù)看下去  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2007-04-10 19:54 | yang
          請問一下:
          1、<s:property value="message" escape="false"/>
          如果有多個Action,那怎么知道這個message是哪個Action里的?

          2、表達式的問題,有${表達式}、帶有#的表達式(如上文中的#session.msg),還有%開始的表達式,這些好像都是取出里面的值,請問這些$、#、%開頭的表達式有什么不同?各自在什么情況下使用?

          3、IoC方式不是要注入嗎?那HttpServletRequest request;HttpServletResponse response這兩個怎么注入實例呢?不用寫關聯配置嗎?

          可以幫我解惑一下嗎?謝謝!!  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-12 23:49 | henry
          我是struts新手,struts 1.*也沒怎么接觸過,打算直接學struts 2.0,希望不會有太大困難,看了你的文章得到很大幫助,感謝你的辛勤工作,寫出這么好的介紹文章,希望能看到更多關于介紹struts 2.0的文章,^_^  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-13 09:42 | Max
          @yang
          1、你的“多個Action”是什么意思?

          2、OGNL中的${...}可以在定義Action的result時,傳遞變量,如/deleteBook.action?isbn=${isbn}。也可以在國際化時引用變量;
          #用于在頁面上引用ActionContext的值,也可以構造映射(Map)等,如#request.xxx;
          %{...}在標簽屬性中引用變量,如<s:url value="Edit.action?isbn=%{isbn}" />

          3、IoC也有人叫DI(依賴注入),HttpServletRequest request和HttpServletResponse response可以通過攔截器注入,詳情請參考《Struts 2的基石——攔截器(Interceptor)》。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-13 17:12 | yskey
          終于找到價值的struts2的資料了,謝謝樓主,呵呵,希望能夠給出更多的關于這個主題的內容,謝謝,呵呵!!  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-16 14:10 | hermit
          樓主你好,目前正在struts2的學習中,遇到了一個問題,希望有時間指導一下。
          我在action中把值set到變量里了(比如,user.setPassword("dddd")),但是在頁面為獲得我想要的值<s:textfield name="user.password" value="%{user.password}"></s:textfield>
          不明白為什么?請高手指點!  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-16 22:40 | Max
          @hermit
          我不是很明白你什么問題,能否詳細一點?  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-17 09:40 | hermit
          Max ,我昨天問的問題已經解決了,晚上自習看了一下,是我的屬性名沒有對應上,其實我是做一個修改頁面,獲得數據庫信息傳到頁面上,頁面form對應的就是user中的屬性,由于我的password屬性,和user類中不同名,所以信息沒有傳到頁面。但是以前1.X的版本這種情況就會報錯了,2.0沒有報錯所以沒有發(fā)現。呵呵,謝謝樓主關注,也非常感謝你提供了這么多Structs2的相關介紹,幫助很大。繼續(xù)關注你的blog,希望還可以看到更多更好的文章。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-23 10:27 | javaChicken
          我想得到cookies怎么辦  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-24 14:18 | ddd
          請問, web.xml設置時,如何添加filter, 對encoding進行制定。。

          是否跟以前一樣? 自己做一個filter, 然后讀取web.xml的設置?  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-25 09:23 | Max
          @javaChicken
          先在Action中拿到HttpServletRequest的對象(請參考《Struts 2.0的Action講解》),然后調用request.getCookies()。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-25 09:25 | Max
          @ddd
          我認為不必如此麻煩,關鍵找出亂碼的原因。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-25 11:13 | do
          請問:我在那個IoCServlet里面沒有看到session.setAttribute("msg","Hello World from Session!");,是怎么把msg放到session里面的?
          這個Map att是起什么作用?  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-25 13:30 | ddd
          @Max
          亂碼出現的地方:

          在頁面上輸入的時候, 還不亂碼,進入action(java類)后, 就亂了。。

          通過debug看。。。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-25 13:46 | ddd
          @do

          因為它作為Setter setSession的變量, 是會被自動運行的。。

          Setter是IoC(DI)的必須

            回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-28 14:57 | mm
          在struts.xml中,兩個package中的action如何通信?

          <package name="user" extends="struts-default">
          <action name="login" class="userAction" method="login">
          <result type ="chain">mser</result>
          </action>
          </package>
          <package name="muser" extends="struts-default">
          <action name="mser" class="muserAction" method="login">
          <result>hello.jsp</result>
          </action>
          </package>

          login.action在user包中,mser.action在muser包中,像以上的調用,會不會出錯呢?login.action可以連接到mser.action?請高手指教  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-04-28 15:10 | 小楊
          請教樓主:

          實現方法二,使用http://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action地址來訪問HelloWorld Action

          這個辦法我不行嘛,我用的是get方式提交。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-05-10 17:05 | jiajia
          struts2怎樣控制Action實例在session還是在request里面。struts1是在struts-config里面配置action時,指定scope。struts2怎樣控制?  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-05-11 09:26 | Max
          @jiajia
          你的“Action實例”是指什么?我的理解是:在Struts 1.x中Action是Singleton的,在Struts-config配置是form bean的scope。

          在Struts 2 中可以使用setAttribute的方法控制對象的scope。
            回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-05-11 10:20 | jiajia
          @Max
          你的理解是對的,一般要往request或session里面放東西是會用到setAttribute方法,如果要Action實例在session里面,用你說的setAttribute方法怎么控制對象的scope,能給個例子嗎?  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-05-18 08:54 | 秋雨
          好呀,今后跟您混了.

          太詳細了.好......................  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-05-23 22:28 | 想飛就飛
          請問樓主,我的問題與jiajia類似
          在struts2中,我可以不調用request.setAttribute(xx,xxx)
          比如說
          publicclass LoginX extends ActionSupport {
          private String message;

          public String getMessage() {
          return message;
          }

          public String execute() {
          message ="Welcome, "+ user.getName();
          return SUCCESS;
          }
          }
          頁面就可以直接獲取${message},請問這默認是request級別的嗎?
          如果是session級別的,是不是要在取得session后
          在代碼中明確寫入,session.setAttribute(xx.xxxx)


            回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-05-24 10:26 | Max
          @想飛就飛
          這些值是放在ActionContext中的,所以不是request或session等。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-05-25 03:33 | xiaohong
          我是JAVAEE的初學者,剛剛接觸struts,在上面的login的例子中,struts2 的功能是不是取代了jsp+servlet+javabean+jdbc中前兩個的功能,使jsp+servlet這兩種東西開發(fā)和維護起來更方便,并且把對jsp和servlet的配置從以前的web.xml中分離出來,轉換成了action放在struts.xml中,至于從數據庫中獲得數據還得用以前的 PreparedStatement 結合javabean的方法來實現!


          我這種理解對嗎!
          在線等回復!!  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-05-25 09:52 | Max
          @xiaohong
          1、在JSP中,無論是jsp或struts或者其它框架,其最終起作用的都是Servlet;
          2、訪問數據庫是需要通過JDBC,但是由于直接使用JDBC過于繁鎖,所以現在有很ORM框架幫助開發(fā)者訪問數據庫,如iBatis、hibernate、JDO和Toplink等。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-05-31 17:46 | wangchb
          按照您的提點我寫了一個test

          在實現執(zhí)行非默認 action的時候出錯了,希望能指點下!
          表單頁面
          <form action="helloDemo/Hello!myFunction.action" method="post">

          user: <input type="text" name="user"><p>
          pass:<input type="text" name="pass"><p>
          <input type="submit" value="提交">
          </form>

          struts.xml

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

          <action name ="Hello" class ="demo.Hello" >

          <result name="render" type="freemarker">/${template}</result> <!-- use the template to render the data -->

          </action>

          </package>

          這個是您說的第二種方法,結果報錯說 找不到action
          第一種方法執(zhí)行通過
          幫忙解決下 謝謝了,不勝感激  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-06-04 23:35 | Max
          @wangchb
          檢查一下你form實際提交路徑是否為http://hostname:port/helloDemo/Hello!myFunction.action。  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2007-06-05 16:26 | domy
          初學者,感謝你的無私奉獻!  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-06-21 16:04 | 不吃芹菜
          struts1.2時有一個forward的action,解決的是不用編寫action類達到跳轉頁面的目的,那么struts2應該怎么做呢?  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2007-06-29 11:40 | eric
          如何實現 struts2 + velocity 1.5 的配置?  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2007-07-05 16:50 | Michael
          2 wangchb:
          檢查一下struts.xml里有沒有
          <constant name="struts.enable.DynamicMethodInvocation" value="false" />
          把false改成true  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-07-09 13:45 | yiwuyun
          怎么VMHelloWorld用不起啊 ,咋會說找不到模板喃HelloWorld.vm。其他兩個都用得起
          我完全按照樓主的說法做的啊,也下了4個相應的包,只
          不過有些版本比較高而已,郁悶。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-07-09 15:12 | yiwuyun
          我想樓主所說的那4個包有點問題,或者還不夠,總之我又糊里糊涂地下了許多包,把它拷到WEB-INF/lib下,這次竟然通過了,有意思,哈哈。當然我弄不清楚哪些是必須的,哪些不是,郁悶。有時下多了不行,有時下少了也不行。哎郁悶死了。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-07-09 23:53 | Max
          @yiwuyun
          Sorry for that  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-07-10 19:37 | 冰紅茶
          實現方法二,使用http://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action地址來訪問HelloWorld Action。

          上面方法不行 MAX  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-07-10 19:44 | 冰紅茶
          這個可以
          在瀏覽器地址欄中鍵入http://localhost:8080/Struts2_Action/AliasHelloWorld.action

          下面這個不行
          使用http://localhost:8080/Struts2_Action/HelloWorld!aliasAction.action地址來訪問HelloWorld Action  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-07-20 09:48 | wyg405
          非常好的文章!受宜  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-07-24 17:42 | renminyan
          實例 HelloWorld.vm少了commons-digester-1.8.jar包了
          但是我還是不知道.vm文件的好處,對這個并不了解。
          謝謝樓主的文章~~~~~~  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-07-25 18:42 | 明人
          "雖然,理論上Struts 2.0的Action無須實現任何接口或繼承任何類型,但是,我們?yōu)榱朔奖銓崿FAction,大多數情況下都會繼承com.opensymphony.xwork2.ActionSupport類,并重載(Override)此類里的String execute()方法。"

          max兄,重載是overload,重寫是override,兩者的區(qū)別不用多說,接觸java的朋友自然明白。

          我想這多半是max兄的筆誤,但還是指出,以免一些朋友產生誤會,畢竟您的struts2系列文章影響很大,好多人都是看著您的文章進入struts2的世界的,所以嚴格律己是必要的,這樣才能更好的造福人群。  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2007-07-26 20:03 | 小小
          發(fā)給我點struct2.0的學習資料吧,,謝謝啦,,
          pxcong007@126.com  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-07-28 21:02 | yiwuyun
          @明人
          哈哈max兄沒有筆誤,你去看看java自動生成的源文件就知道了。它就是@override.  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2007-07-31 09:55 | lf
          例3中我導入以下幾個包,但是不成功。
          avalon-logkit-2.2.1.jar
          commons-collections-3.2.jar
          velocity-1.5.jar
          velocity-tools-view-1.3.jar

          頁面提示:
          type Exception report

          message

          description The server encountered an internal error () that prevented it from fulfilling this request.

          exception

          javax.servlet.ServletException: Filter execution threw an exception


          root cause

          java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
          org.apache.velocity.runtime.resource.ResourceManagerImpl.initialize(ResourceManagerImpl.java:165)
          org.apache.velocity.runtime.RuntimeInstance.initializeResourceManager(RuntimeInstance.java:594)
          org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:241)
          org.apache.velocity.runtime.RuntimeInstance.init(RuntimeInstance.java:534)
          org.apache.velocity.app.VelocityEngine.init(VelocityEngine.java:144)
          org.apache.struts2.views.velocity.VelocityManager.newVelocityEngine(VelocityManager.java:473)
          org.apache.struts2.views.velocity.VelocityManager.init(VelocityManager.java:243)
          org.apache.struts2.dispatcher.VelocityResult.doExecute(VelocityResult.java:130)
          org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:178)
          com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:348)
          com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:253)
          com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:221)
          com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:86)
          com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:224)
          com.opensymphony.xwork2.DefaultActionInvocation$2.doProfiling(DefaultActionInvocation.java:223)
          。。。。
          請高手相告我錯在哪了,謝謝  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-07-31 23:36 | Max
          @lf
          使用Struts 2.0.8GA版本,至少需要以下包:
          commons-logging-1.1.jar
          freemarker-2.3.8.jar
          ognl-2.6.11.jar
          readme.txt
          struts2-core-2.0.8.jar
          xwork-2.0.3.jar  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2007-08-01 08:46 | lf
          @Max
          你所說的包除了readme.txt外,我都有了,我的問題是實現例3時我所導入的包是否有錯或者差了哪些包,具體問題提示已在前2樓的發(fā)言中說明了,請指教。
          另這個readme.txt是什么東東哦,能否一起告知,謝謝。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-08-01 17:02 | jht
          @lf
          你的問題我知道,還需要導入
          common-lang
          common-collection
          common-digester
          的jar包
          avalon-logkit-2.2.1.jar 好像找不到下載的,不過我也沒有用到  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2007-08-03 11:44 | 小超
          請問下,一個action執(zhí)行后怎么返回到令一個action中
          <action name="add" class="test.Add">
          <result name="success">/List.action</result>
          </action>
          <action name="List" class="test.List">
          <result name="success">list.jsp</result>
          </action>
          這樣頁面報錯,說找不到List.action,我單獨訪問List.action是沒有問題的.   回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2007-08-03 21:32 | gavin
          我寫的
          <s:form action="/sys/login!input.action" method="post" theme="simple">
          <table style="width:40%;" border="1">

          為什么生成以后就是
          <form id="login" onsubmit="return true;" action="/kangsoft/sys/login" method="post">而不是期望的
          <form id="login" onsubmit="return true;" action="/kangsoft/sys/login!input.action" method="post">呢
          請問各位該怎么解決呢
          上面有人問過但是沒人回答哦  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-08-05 11:28 | binger
          @jht
          avalon-logkit-2.2.1.jar

          我也找不到這個包的下載地址  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-08-05 11:30 | binger
          誰有avalon-logkit-2.2.1.jar 這個包,傳一個吧,先謝謝了~~

          hncj_l.h.x@163.com

            回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-08-07 14:01 | pxcong
          請問MAX
          如何 避免 在未提交前就進行驗證器驗證  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-08-17 11:36 | ArthurWang
          為什么我的Velocity模板輸出的例子,輸出報錯,上面所說的包都已經導入了
          錯誤內容如下,
          java.lang.NoClassDefFoundError: org/apache/velocity/context/Context
          java.lang.Class.getDeclaredMethods0(Native Method)
          java.lang.Class.privateGetDeclaredMethods(Class.java:2365)
          java.lang.Class.getDeclaredMethods(Class.java:1763)
          com.opensymphony.xwork2.inject.ContainerImpl.addInjectors(ContainerImpl.java:103)
          com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:84)
          com.opensymphony.xwork2.inject.ContainerImpl$1.create(ContainerImpl.java:82)
          com.opensymphony.xwork2.inject.util.ReferenceCache$CallableCreate.call(ReferenceCache.java:155)
          java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:269)
          java.util.concurrent.FutureTask.run(FutureTask.java:123)
          com.opensymphony.xwork2.inject.util.ReferenceCache.internalCreate(ReferenceCache.java:81)
          com.opensymphony.xwork2.inject.util.ReferenceCache.get(ReferenceCache.java:121)
          com.opensymphony.xwork2.inject.ContainerImpl.inject(ContainerImpl.java:452)
          com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:492)
          com.opensymphony.xwork2.inject.ContainerImpl$6.call(ContainerImpl.java:491)
          是說org/apache/velocity/context/Context這個類找不到,可導入的velocity-1.4.jar中明明有這個類。
          請Max大哥指教  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-08-30 11:15 | tf
          有誰可以提供
          commons-collections-3.2.jar
          velocity-1.4.jar
          velocity-tools-view-1.2.jar
          avalon-logkit-2.1.jar
          這幾個包嗎?  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2007-09-05 13:57 | william
          請問怎么樣在框架頁面中實現國際化啊?  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-09-08 19:10 |
          從頁面中提交User的數據到Action中 Action 像你所示例的一樣寫:
          public class HelloWorld extends ActionSupport {
          private String name;
          private User user;

          public User getUser()
          {
          return user;
          }
          public void setUser()
          {
          this.user = user;
          }

          public String getName() {
          return name;
          }

          public void setName(String name) {
          this.name = name;
          }

          public String execute() {
          name = "Hello, " + name + "!";
          return SUCCESS;
          }
          }

          但運行到Action是報一個錯,錯誤信息如下:
          2007-9-8 18:42:23 com.opensymphony.xwork2.util.InstantiatingNullHandler nullPropertyValue
          嚴重: Could not create and/or set value back on to object
          ognl.NoSuchPropertyException: tutorial.HelloWorld.user [java.lang.IllegalAccessException: Class ognl.OgnlRuntime can not access a member of class tutorial.HelloWorld with modifiers "private"]
          at ognl.OgnlRuntime.setFieldValue(OgnlRuntime.java:1125)
          at ognl.ObjectPropertyAccessor.setPossibleProperty(ObjectPropertyAccessor.java:77)
          at ognl.ObjectPropertyAccessor.setProperty(ObjectPropertyAccessor.java:132)
          at com.opensymphony.xwork2.util.OgnlValueStack$ObjectAccessor.setProperty(OgnlValueStack.java:68)
          at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:1629)

          我在Action 中使用public修飾user對象就可以了!
          public User user;
          是不是必須使用public 修飾javabean 呢?而你的示例代碼中卻是使用private修飾的.
          后來我嘗試初始化user, 代碼修改為: private User user = new User();運行沒問題.
          為什么private User user;卻不行?為什么public User user; 和 private User user = new User();可以運行通過?

          Max 大哥,請你解釋一下,表單數據如何被封裝為POJO的過程!?
          我的郵箱:yezichen2@163.com  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-09-13 23:13 | mOOnzhaO
          真是很好  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-10-03 00:14 | zyw358486
          辛苦了,老兄!  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-10-18 23:02 | moonboat
          樓主辛苦,正在學習中......  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-10-23 13:11 | Mark
          Mark  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-11-11 11:06 | skycliff
          樓主幸苦了,希望看到你更優(yōu)秀的文章  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2007-11-22 22:52 | 冬國
          我想問一下,就是我想在
          velocity中使用Struts2.0的標簽
          那我該怎樣來實現呢!
          如果有時間的話給點提示,謝謝~~!  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-11-26 10:00 | feek
          你好。。。我的action無法傳遞兩個參數
          比如我要傳username,和password

          在另一頁顯示它們的值  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-11-26 11:12 | feek
          終于解決了。。。原來get和set都要有和變量名相同的部份
          如private pwd;
          那么就要setPwd;和getPwd而不能setPPPP
          真是太不可思議了
          以前沒有弄過struts現在直接學struts2.0
          看了max兄的教程學了不少東西。。
          謝謝  回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-11-27 11:58 | java開發(fā)者
          Avalon-Logkit 1.1 說明以及jar包的下載地址:

          Logkit is a logging API for Java. It can be used directly or as a hidden implementation behind the logging abstractions in either Jakarta's Avalon-Framework or Commons-Logging.

          This release adds more rotation strategies and output targets.

          Avalon-Phoenix 4.0

          After nearly a year since its first alpha release, Phoenix is complete. You can view Phoenix as one of a number of things:

          * A Server for Servers
          * A Container for Unrestricted Components
          * A Micro-Kernel

          The idea is that other servers sit on top of Phoenix. These could be EJB, Mail (refer Jakarta JAMES), HTTP, etc.

          Phoenix has JMX capability via MX4J. Phoenix is configurable via XML, allowing replacement of its components.

          Applications for Phoenix are distributed in server archives (SAR files) Apps are laced together using XML allowing replacement of components post development.

          Background

          All Avalon projects honor some central designs and patterns:

          * Component Orientated Programming
          * Inversion of Control
          * Separation of Concerns
          * Interface and Implementation Separation
          * Minimalization of use of static.

          The Avalon team are continuing development of Logkit and Phoenix as well as other containers for different deployment needs and scenarios. The Avalon project also comprises several reusable jars for server side
          development as well as example applications for Phoenix.

          Links

          Logkit - http://jakarta.apache.org/avalon/logkit/" target="_new">http://jakarta.apache.org/avalon/logkit/
          Phoenix - http://jakarta.apache.org/avalon/phoenix/" target="_new">http://jakarta.apache.org/avalon/phoenix/

          Avalon project - http://jakarta.apache.org/avalon/
          Framework - http://jakarta.apache.org/avalon/framework/

          Avalon's patterns (a good starting point) - http://jakarta.apache.org/avalon/framework/guide-patterns-in-avalon.html
          Avalon-Framework's lifecycle interfaces (another good starting point) - http://jakarta.apache.org/avalon/framework/reference-the-lifecycle.html

          - The Avalon team.   回復  更多評論
            
          # re: Struts 2.0的Action講解 2007-12-03 15:40 | 劉文濤
          我的那個IOC 和 非IOC 那個 ,效果是出來了.但控制臺 打印 :
          --------------------------------------
          嚴重: ParametersInterceptor - [setParameters]: Unexpected Exception caught setti
          ng 'msg' on 'class demo.action.IoCServletNonAction: Error setting expression 'ms
          g' with value '[Ljava.lang.String;@57ae58'
          ----------------------------------------------
          不知道到 max 遇到這個問題沒有.  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-01-08 15:47 | zyhxl66
          最近正在學習struts2.0,今天看了樓主的struts2.0資料總結,幫助很大的!總結的挺細致!支持!  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-01-11 14:34 | asd
          最近正在學習struts2.0,今天看了樓主的struts2.0資料總結,幫助很大的!總結的挺細致!我的第一個事例也做完了,謝謝! 支持!  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-01-11 14:44 |
          avalon-logkit-2.1.jar
          backport-util-concurrent-3.0.jar
          commons-collections-3.2.jar
          commons-collections.jar
          commons-dbcp-1.1.jar
          commons-digester-1.8.jar
          commons-fileupload-1.1.1.jar
          commons-io-1.1.jar
          commons-lang-2.2.jar
          commons-logging-1.1.jar
          commons-pool-1.1.jar
          dwr.jar
          freemarker-2.3.8.jar
          ibatis-2.3.0.677.jar
          msbase.jar
          mssqlserver.jar
          msutil.jar
          ognl-2.6.11.jar
          retrotranslator-runtime-1.2.0.jar
          retrotranslator-transformer-1.2.0.jar
          spring.jar
          struts2-core-j4-2.0.6.jar
          struts2-spring-plugin-j4-2.0.6.jar
          velocity-1.5.jar
          velocity-tools-view-2.0-beta1.jar
          xwork-j4-2.0.1.jar
          這是我的一個項目 struts2+spring+ibatis,和velocity以及要dwr的集合。
          我用了以上的包,基本目的能達到,但是有人說我用的包太多,想請高手指教。我是一個剛剛學struts2的新手,第一次作開發(fā),現謝謝!  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-01-18 17:34 | llddy
          我想問一下 關于 struts2訪問地址的問題
          http://localhost:8000/login/show.action
          他們訪問地址都是 *.action 的形式結尾.
          我現在想把*.action 改成 *.html 不知道怎么處理.
          因為 struts1.*都是修改web文件就可以
          struts2好像不可以我試過 ....

          請您 -----幫我回復----- 一下 謝謝  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-02-22 17:30 | laibin
          感謝MAX!  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-03-08 20:01 | tomson
          it seems that there is no datepicker tag, just datetimepicker.  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-04-01 10:34 | 金昌
          兄弟 你太好了 學習ING...  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-04-11 10:01 | 111
          我想問下。。。我在action中把個bean存入session中。。。為什么取不出來???
          存的時候是
          private Map session;
          session.put(名稱,bean);
          取的時候是
          this.bean = (強制轉換)session.get(名稱);

          請問錯在哪啊???  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-05-08 17:04 | JIAJIAJIAJIA
          我的user怎么點不出來getPassword().....
          高手指點下 謝謝  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-06-02 10:37 | 沉默不是金
          樓主,讀了你的很多篇struts2的介紹,感覺寫得很容易看懂,昨天去書店看了本李剛寫的介紹struts2的書,洋洋灑灑寫了估計有1000多頁吧,看得我云里霧里,現在的java方面的書啊,尤其是國內出版的,根本沒自己的東西,網上copycopy,找國外的技術手冊翻譯翻譯,作者可能幾個月就能出本1000多頁的書,勸大家買書時看仔細了,別浪費銀子和時間。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-06-10 12:55 | jbas
          樓主,你好,
            請教一下,為什么我用
          HttpServletResponse response = ServletActionContext.getResponse();
          response.getWriter().println(str);

          不能輸出一段javascript或string字符串到目標頁去,我以前用struts1是可以的,但現用struts2,不行了,而且如果我加了上面的代碼,展示的jsp頁面也會出現亂碼,把response相關代碼去掉,jsp頁面不會亂碼的。
          請幫一下了,我的代碼如下:

          package example;

          import javax.servlet.http.HttpServletResponse;

          import org.apache.struts2.ServletActionContext;

          import com.opensymphony.xwork2.ActionSupport;


          public class Login extends ActionSupport {


          public String execute() throws Exception {
          String str = "";
          str += "<script language=javascript>" + "\n";
          str += "alert('hello,world!');" + "\n";
          str += "</script>";
          HttpServletResponse response = ServletActionContext.getResponse();
          response.getWriter().println(str);
          return SUCCESS;
          }


          } 


          jsp頁面:
          <%@ page contentType="text/html; charset=UTF-8" %>
          <%@ taglib prefix="s" uri="/struts-tags" %>
          <html>
          <head>
          <title>Sign On</title>
          </head>

          <body>
          <s:form action="Login" >
          中文用戶名:<s:textfield name="username" />
          密碼: <s:password name="password" />
          <s:submit/>

          </s:form>
          </body>
          </html>
            回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-06-10 14:54 | jbas
          return SUCCESS;
          改成
          return null;

          是可以了  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-08-26 20:54 | henry1451
          落伍了啊,max兄06年就接處了struts2.0,而我到08年4月份才接處到.  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-09-03 11:41 | walkes
          我要那些用到的包啊  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-09-03 11:54 | walkes
          commons-digester-1.8.jar
          貌似還要這個包才行 否則vmlocity例子有問題  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2008-09-09 15:39 | tangyong
          multiple operations have reported errors.

          樓主知道這個錯誤是什么么?  回復  更多評論
            
          # re: Struts 2.0的Action講解 2008-11-07 00:18 | lonqi
          真是一篇好文章,謝謝  回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-01-24 17:01 | 小鼬
          不錯,控制反轉有點難……  回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-02-20 15:56 | xuxu
          你老板說的也是扯淡

          寫的程序無非就是對數據庫的增刪改查  回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-02-24 16:17 | unique_zxs
          李剛就是你吧!《Struts2權威指南》的作者。  回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-03-06 17:16 | fancyLeeo
          問個問題:
          如何才能通過JSP頁面用Struts標簽取得message?
            回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-03-06 17:30 | fancyLeeo
          呵呵,自己回答吧,剛犯了一個小錯誤。

          <s:property value="message" />

            回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-03-06 17:31 | fancyLeeo
          @xuxu
          你也是扯蛋,你說的只是一部分;

          程序真的無非就是輸入、處理、輸出!

          程序最終也真的無非就是抽象……  回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-03-10 15:22 | fdsa
          fdsafdsa  回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-03-10 15:22 | fdsa
          @fdsa
          fdssafdsafsadfds  回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-03-26 19:39 | kghzjx
          ActionContext.getContext().getSession()獲取并不是是HttpSession而是一個HashMap對象實例
            回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-04-23 12:01 | marin
          自定義類  回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-09-09 22:47 | dfa
          asdfasdf
            回復  更多評論
            
          # re: Struts 2.0的Action講解 2009-09-09 22:49 | ticky
          我想用Struts2.0架構做一個東西,我有一個數據庫,里面有好幾個表,我要對表進行查詢然后指定要刪除的記錄。現在的問題是,我查詢后怎么寫代碼可以把記錄都列出來,因為查詢條件不同的話是不能預知記錄條數的。。我的信箱tarbaobao@163.com。謝謝  回復  更多評論
            
          # re: Struts 2.0的Action講解[未登錄] 2009-12-11 12:17 | xx
          User是一個實體類,這樣寫實實現對象模型@jintian
            回復  更多評論
            
          # re: Struts 2.0的Action講解 2010-11-10 23:29 | renhong
          Max的功底真的從代碼都看出來了。第一次看到這么規(guī)范的代碼。。。具有美感  回復  更多評論
            
          # re: Struts 2.0的Action講解 2011-03-08 12:47 | taokai
          @jintian
          User 類當然是自己創(chuàng)建的啊, 是把屬性: name和password 封裝到User類中去了, 封裝這個思想你明白?  回復  更多評論
            
          # re: Struts 2.0的Action講解 2011-05-11 14:20 | 宇穹
          樓主,你好。我正在用struts2做畢設 關于ACTION類遇到個很不解的地方希望你指導:
          在提交表單內容后,即是在Action類中包含的Bean中已經getter 和setter,服務器總會報錯,提示“ognl.OgnlException: target is null for setProperty(null, "property", [Ljava.lang.String:@2312]”,其中property為Bean的一個屬性值。并不是所有屬性值都不能傳遞,僅有個別屬性值會出現這樣的情況。
          網上搜到一個解決方法是將Action中的Bean類設置為public,然后問題解決。但是不明白在同一個包中有的Action類Bean類為private會出現上述問題,而有的Action類包含的Bean類同為private卻不會出現問題,很困惑,請博主指教。(注:Action包中只含有Action類,所有Bean類統一放在另外的一個包中)
          qq 272253421 望指教  回復  更多評論
            
          評論共2頁: 1 2 下一頁 
          主站蜘蛛池模板: 涟源市| 司法| 永仁县| 竹山县| 南乐县| 灌阳县| 郎溪县| 乐至县| 阿鲁科尔沁旗| 紫金县| 阿瓦提县| 盐津县| 库车县| 文水县| 虎林市| 光泽县| 海宁市| 扬中市| 康平县| 南陵县| 清徐县| 三河市| 翁牛特旗| 察哈| 营山县| 万载县| 涞水县| 林芝县| 连城县| 左云县| 垫江县| 如东县| 阿图什市| 桂平市| 云林县| 新郑市| 类乌齐县| 罗田县| 东兰县| 孝义市| 阿拉善右旗|