2011-03-09 57 views
0

我使用JSP和Struts2的,我有以下情形:Struts2的OGNL - 請求參數提交訂單

<s:form> 
<s:hidden name="empId" value="123"/> 
<s:textfield name="employee.name"/> 
<s:submit action="save"/> 
</s:form> 

當表單提交,OGNL表達式employee.name(相當於getEmployee的()。 setName())在「save」方法之前被執行。而且,在方法getEmployee()中,「empId」的值不可用。 「empId」的值僅在「save」方法中可用。 getEmployee()中可以獲得「empId」的值嗎?

以下是我的Action類代碼:

public String save() { 
    //empId is available here 
    return SUCCESS; 
} 

public Employee getEmployee(){ 
    if (employee == null){ 
    //empId is not available here 
    employee = employeeService.get(empId); 
    } 
    return employee; 
} 
+0

請提供相關的struts2 xml /註釋它通常更容易閱讀,然後閱讀英文版本。 – Quaternion 2011-03-09 20:40:57

+0

四元數,謝謝你的回覆。我編輯的問題更清楚。請檢查您是否能夠理解該場景。 – 2011-03-10 02:13:59

回答

0

首先,我認爲你做的empId領域的二傳手(你沒有顯示一個),你的問題是參數設置的順序是任意的。

ParametersInterceptor有一個選項可以強制它首先設置頂級屬性。您可以通過自定義攔截器堆棧來啓用它,以使用ordered屬性集定義參數攔截器。

<interceptor-ref name="params"> 
    <param name="ordered">true</param> 
</interceptor-ref> 

然後,在你的Action類,改變setEmpId方法:

public void setEmpId(Integer empId) { // or whatever type it is 
    this.empId = empId; 
    employee = employeeService.get(empId); 
} 

作爲一種替代的setter方法,你也可以創建一個類型轉換爲Employee類,然後改變你形式爲:

<s:form> 
    <s:hidden name="employee" value="123"/> 
    <s:textfield name="employee.name"/> 
    <s:submit action="save"/> 
</s:form> 
+0

謝謝史蒂夫,我添加了屬性「命令」爲「params」攔截器,它的工作就像一個魅力!再次感謝您的建議。 – 2011-03-11 07:14:11

+0

我的榮幸!當我碰到它時,我發現它非常有用。 – 2011-03-11 13:27:31

0

我不知道我這樣理解是明確的,你要調用getEmployee的(),你不知道如何讓員工在方法中的id?

可以說你有一張僱員表。讓我們還假設表提供了以下詳細信息:

  • 員工姓名
  • 員工ID

讓我們假設有一個鏈接也點擊它會帶你到僱員將各行該員工的詳細信息屏幕。由於您剛剛打印了員工ID,因此您可以使用所需的get參數構造一個html錨點元素,以便在調用操作時您將擁有所需的內容。 <s:a>標籤以及<s:param>標籤使這一切變得簡單。

有關如何使用struts2錨標記和屬性標記的示例,請參閱我的答案Tiles2 Struts Switch Locale。雖然該示例使用靜態屬性,但只需使用id變量替換參數標記中的值屬性即可。

有關更多詳細信息,請參見http://struts.apache.org/2.2.1.1/docs/a.html

編輯:我現在看到我在編輯之前就離開了。

我認爲最簡單的事情就是製作一個getEmployee(int id)方法。然後你可以擺脫隱藏的字段值。 之後,它應該是直線前進......

你的JSP將大致如下(未測試):

<s:form> 
    <s:textfield name="%{employee[123].name}"/> 
    <s:submit action="save"/> 
</s:form>