2011-12-27 19 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字段不一致的名称,它应该可以工作。