2016-09-28 54 views
0

我想記錄一個Action傳遞給View的所有輸出視圖範圍對象(就像一個JSP)。如何獲取所有視圖範圍對象?

我想從行動本身打印所有。我的意思是:在動作執行結束時,就在'ActionResult'返回語句之前。

例如,我想這樣做如下:

public class HelloWorldAction extends ActionSupport 
{ 
    private String errorMessage; 

    public String getErrorMessage() 
    { 
     return this.errorMessage; 
    } 

    public void setErrorMessage(String errorMessage) 
    { 
     this.errorMessage = errorMessage; 
    } 

    public String execute() 
    { 
     this.setErrorMessage("Error!!!"); 

     Enumeration keys = ServletActionContext.getResponse().getParameterNames(); 
     StringBuilder strB5r = new StringBuilder(); 
     strB5r.append("Response parameters : "); 
     while (keys.hasMoreElements()) 
     { 
      String key = (String)keys.nextElement(); 
      strB5r.append("[").append(key).append(": ").append(ServletActionContext.getResponse().getAttribute(key).toString()).append("]"); 
     } 

     System.out.println(strB5r.toString()); 

     return Action.SUCCESS; 
    } 
} 

我想看看在cosole輸出爲:

Response parameters : [errorMessage : Error!!!] 

的問題是,

ServletActionContext.getResponse()。getParameterNames(); 。

不存在,相反的是,我們可以要求做到:

ServletActionContext.getRequest()getParameterNames();

我們應該怎麼做才能列出操作中的所有輸出視圖範圍對象?

Ps。我更喜歡不使用java反射的原因很多:主要是性能。

+0

沒有這樣的範圍可用。這個問題不清楚。請澄清您的具體問題或添加更多的細節,以確切地突出你所需要的。正如目前所寫,很難確切地說出你在問什麼。請參閱「如何問問」頁面以獲取有關澄清此問題的幫助。 –

+0

如果您在Action中聲明變量及其getter和setter,則Struts2允許將對象傳遞給視圖。現在:我怎樣才能讓所有傳遞給視圖的對象不使用java反射?謝謝 – 0bot

+0

@ 0bot傳遞給視圖的對象是動作本身。 –

回答

1

只有反思纔有效。

在視圖層之前,動作本身被壓入值棧。

S2標籤(和通過請求包裝器的JSP EL)使用OGNL從值棧中檢索值。 OGNL使用反射。例如,${errorMessage}正在使用反射來從位於值棧頂部的動作檢索值。

這些值不是單獨存在,而是嵌入到置於值棧中的對象中。

你會需要通過反射來獲取值棧的動作,遍歷堆棧內容,並取回所有可公開訪問的值(方法和道具)來獲取堆棧訪問的內容。 (我不記得堆棧內容的其餘部分是否已經在動作中可用,或者稍後是否添加了更多內容,但這也沒有考慮可能會修改堆棧預覽的其他機制。)

這是S2調試標籤在視圖層上執行的操作;你可以直接使用它。

+0

好的,你澄清了很多方面,但我有一個疑問: 我知道一個變量傳遞給視圖可以通過3種方式訪問​​: - s2標籤(例如) - OGNL(如$ {} nameVariable) - JSP標籤(例如<%= request.getAttribute( 「nomeVariabile」);%> 最後一個讓我覺得,所有的變量都包裹然後插入請求屬性映射中,就有了我錯過了什麼?謝謝 – 0bot

+0

@ 0bot是的。 S2請求包裝「正常化」訪問值堆棧和定期範圍的屬性(請求,應用程序等)。如果在值堆棧中找不到值,那麼servlet規範作用域將被正常搜索。 –

相關問題