2011-12-27 40 views
0

相同的EL表達式${taskId}在不同的地方給出兩個不同的值。不一致的表達式語言行爲,相同的表達式不同的值

我正在使用Stripes框架,以及MongoDB和Morphia的對象映射(當然還有Java/JSP /等)。

使用以下JSP /表達式語言代碼:

<c:forEach items="${actionBean.tasks}" var="listTask"> 
<c:set var="taskId" scope="page" value="${listTask.id}"/> 
<s:form method="post" beanclass="action.TaskActionBean"> 
    ${taskId}<s:hidden name="task.id" value="${taskId}"/> 
    <s:submit name="promoteTask" value="Up" /> 
</s:form> 
</c:forEach> 

提供了以下生成的代碼:

<form method="post" action="/scrumyogi/"> 
    4ef99b730364de7ec70dbd68 
    <input type="hidden" value="4ef99b6c0364de7ec70dbd67" name="task.id"> 
    <input type="submit" value="Up" name="promoteTask"> 
    <div style="display: none;"> 
     <input type="hidden" value="NPNEJw6tUWfRBXf-vVOLTw==" name="_sourcePage"> 
     <input type="hidden" value="XbfUDiSHGrU=" name="__fp"> 
    </div> 
</form> 

正如你可以看到$ {任務id}正在打印4ef99b730364de7ec70dbd68然後4ef99b6c0364de7ec70dbd67,這對我沒有意義,我需要$ {taskId}打印出相同的值4ef99b730364de7ec70dbd68是正確的。

是否有一些已知問題可能導致此問題。

編輯:真正的問題是隱藏窗體標記中的$ {taskId}不正確,我打印另一個值來查看錶達式包含的內容,然後發現它在不同位置有所不同 - 這使得事物嚴重混淆。

的ActionBean代碼:

@UrlBinding("/") 
public class TaskActionBean extends BaseActionBean{ 

    String taskId; 
    Task task = new Task(); 
    List<Task> tasks; 

    public final static String DISPLAY = "/index.jsp"; 

    @DefaultHandler 
    public Resolution listTasks(){ 
     tasks = Dao.datastore().find(Task.class).order("rank").asList(); 
     return new ForwardResolution(DISPLAY); 
    } 


    public Resolution promoteTask(){ 

     task.promoteTask();  
     tasks = Dao.datastore().find(Task.class).order("rank").asList(); 

     return new ForwardResolution(DISPLAY); 
    } 



    // ... getters and setters 
+0

該代碼片段化,我不認爲其他代碼是相關的,但如果這是不夠的,我可以包括更多。 – Ankur 2011-12-27 11:08:58

+0

發佈您的動作bean代碼。 – soulcheck 2011-12-27 11:30:34

+0

目前我已經通過使用對象解決了這個問題,但是如果有人知道,我仍然很想理解這裏發生了什麼。 – Ankur 2011-12-27 11:33:45

回答

0

你有一個taskId場在你的行動豆,並根據stripes taglib documentation

隱藏的標籤通過掃描按以下順序分配屬性的值:

  1. 對於一個或多個在HttpServlet中具有相同名稱的值請求

  2. 爲具有相同名稱的的ActionBean一個字段(如果Bean實例是存在的)

  3. 通過摺疊的主體內容爲字符串,如果身體存在

  4. 參照包含在標籤的值屬性中的EL表達式的結果。

所以它可能發現您的行動豆場,並從那裏取值。

另一個(jsp el)${taskId}從任務列表元素分配。

taskId更改爲與您的動作bean字段不一致的名稱,它應該可以工作。