spring表单标记未解析会话变量

spring表单标记未解析会话变量,spring,jsp,jstl,spring-form,Spring,Jsp,Jstl,Spring Form,我们正在将应用程序从Spring3迁移到Spring4。我现在遇到了一个问题,当我使用c:out时,会话变量得到了解决,而当我使用form:form时,会话变量没有得到解决。我在另一个问题上看到了类似的问题,但仍然没有得到回答。但是,我现在面临着同样的问题 <%@ include file="/common/taglibs.jsp"%> <c:forEach var="item" items="${yesNos}"> <c:out value="${item}"/&

我们正在将应用程序从Spring3迁移到Spring4。我现在遇到了一个问题,当我使用c:out时,会话变量得到了解决,而当我使用form:form时,会话变量没有得到解决。我在另一个问题上看到了类似的问题,但仍然没有得到回答。但是,我现在面临着同样的问题

<%@ include file="/common/taglibs.jsp"%>
<c:forEach var="item" items="${yesNos}">
<c:out value="${item}"/>
</c:forEach>


<form:select path="blocked">
<form:option value="" label=""/>
<form:options items="${yesNos}" itemValue="id" itemLabel="${domainValueProperty}"/>
</form:select>

c:forEach能够迭代列表“yesNos”。 表单:选项似乎无法识别此列表“yesNos”并抛出错误

OptionsTag-Type[java.lang.String]对选项项无效

yesNos是POJO的列表,并定义了相应的属性编辑器。我怀疑房地产编辑是个问题,但下面的认识让我感到困惑

我还意识到,form:form标记还显示了一个问题,即传递给action属性的动态会话变量没有得到解决,即使在生成的HTML源代码上也保持为${}

JSP:formActionURL是字符串类型

<form:form action="${formActionURL}" commandName="pDSearch">

HTML源代码

<form id="pDSearch" action="${formActionURL}" method="post">

  • 我已经配置了taglibs uri,它工作得很好,因为标记正在被处理
  • 这在Spring3.0.7和Servlet2.3中起作用。现在,我们正在迁移到Spring4.0.6和Servlet2.3
  • 另一方面,请求者使用Servlet2.5,但仍然面临这个问题。迁移到Servlet2.5将对我们的应用程序产生巨大影响
  • 下面是页面上导入的taglibs.jsp

    <%@ page language="java" errorPage="/error.jsp" pageEncoding="UTF-8" contentType="text/html; charset=utf-8" %>
    <%@ taglib uri="http://www.springframework.org/security/tags" prefix="security" %>
    <%@ taglib uri="http://www.springmodules.org/tags/commons-validator" prefix="v" %>
    <%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
    <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %>
    <%@ taglib uri="http://displaytag.sf.net/el" prefix="display" %>
    <%@ taglib uri="http://struts-menu.sf.net/tag-el" prefix="menu" %>
    <%@ taglib uri="http://java.sun.com/jstl/core" prefix="c" %>
    <%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
    <%@ taglib uri="http://www.opensymphony.com/oscache" prefix="cache" %>
    <%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator"%>
    <%@ taglib uri="http://www.opensymphony.com/sitemesh/page" prefix="page"%>
    
    
    

    非常感谢有人能将我引向一个我能找到问题答案的来源。如果您需要更多信息,请务必告诉我。

    EL的工作方式在Servlet 2.3-->Servlet 2.4的转换过程中发生了变化

    在Servlet2.3期间,EL作为JSTL1.0的一部分提供。自Servlet2.4以来,EL作为JSP2.0的一部分提供,EL从JSTL1.1中删除

    任何与Servlet2.4+兼容的JSP标记库都希望在JSP中找到EL,而不再是在JSTL中。换句话说,当您仍然在Servlet2.3容器上使用Servlet2.4+兼容的JSP标记库时,所有标记中的EL表达式都将停止工作,因为它在JSP中找不到EL

    因此,当您想要使用与Servlet2.4+兼容的JSP标记库时,比如Spring4+,它实际上需要Servlet2.5,那么您确实需要升级到最低的Servlet版本

    另见:

    在Servlet 2.3-->Servlet 2.4的转换过程中,EL的工作方式发生了变化

    在Servlet2.3期间,EL作为JSTL1.0的一部分提供。自Servlet2.4以来,EL作为JSP2.0的一部分提供,EL从JSTL1.1中删除

    任何与Servlet2.4+兼容的JSP标记库都希望在JSP中找到EL,而不再是在JSTL中。换句话说,当您仍然在Servlet2.3容器上使用Servlet2.4+兼容的JSP标记库时,所有标记中的EL表达式都将停止工作,因为它在JSP中找不到EL

    因此,当您想要使用与Servlet2.4+兼容的JSP标记库时,比如Spring4+,它实际上需要Servlet2.5,那么您确实需要升级到最低的Servlet版本

    另见:

    根据其文档,Spring 4至少需要Servlet 2.5。为什么要让它在Servlet2.3上运行?技术上的解释是,自Servlet2.4以来,EL API已经从JSTL转移到JSP。所以Spring标记不希望在JSTL中找到EL API,而是在JSP中。然而,由于您仍然使用Servlet2.3,JSP中还没有它。@BalusC感谢您回复我的帖子。我们开始迁移时没有(出于某种原因)意识到迁移到Servlet2.5的建议,现在的更改将对应用程序产生巨大影响。正如您所提到的,在Servlet2.4中,EL解析已经从JSTL转移到JSP中。即使我们迁移到Servlet2.5,标记的语法仍然相同。导致此问题的原因是什么?应用程序的其余部分在没有标记的地方运行良好。如果我没有理解你的观点,请原谅,如果是,请详细说明。我仍然在这个问题上犹豫不决。谁能给我指点一下吗@如果可能的话,您能找点时间澄清一下吗?只需使用与目标Servlet版本兼容的Spring版本。最好先升级Servlet版本,然后再升级Spring。@BalusC我最终按照您的建议进行了更改,并迁移了我的Servlet版本,解决了我的问题。如果影响我的遗留代码在其他地方,但我会适应。谢谢你的意见。如果您可以将您的评论移动到一个答案,我可以接受。根据其文档,Spring4至少需要Servlet2.5。为什么要让它在Servlet2.3上运行?技术上的解释是,自Servlet2.4以来,EL API已经从JSTL转移到JSP。所以Spring标记不希望在JSTL中找到EL API,而是在JSP中。然而,由于您仍然使用Servlet2.3,JSP中还没有它。@BalusC感谢您回复我的帖子。我们开始迁移时没有(出于某种原因)意识到迁移到Servlet2.5的建议,现在的更改将对应用程序产生巨大影响。正如您所提到的,在Servlet2.4中,EL解析已经从JSTL转移到JSP中。即使我们迁移到Servlet2.5,标记的语法仍然相同。导致此问题的原因是什么?应用程序的其余部分在没有标记的地方运行良好。如果我没有理解你的观点,请原谅,如果是,请详细说明。我仍然在这个问题上犹豫不决。谁能给我指点一下吗@如果可能的话,您能找点时间澄清一下吗?只需使用与目标Servlet版本兼容的Spring版本。最好先升级Servlet版本,然后再升级Spring。@BalusC我最终按照您的建议进行了更改,并迁移了我的Servlet版本,解决了我的问题。如果影响我的遗产