【问题标题】:spring form tag is not resolving session variables弹簧表单标签不解析会话变量
【发布时间】:2015-08-10 13:10:35
【问题描述】:

我们正在将我们的应用程序从 spring 3 迁移到 spring 4。我现在遇到一个问题,当我使用 c:out 而不是当我使用 form:form 时会话变量得到了解决。我在另一个 post 上查看了类似的问题,但仍未得到答复。但是,我现在面临同样的问题。

<%@ 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”。 form:options 似乎无法识别此列表“yesNos”并引发错误

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

yesNos 是我们的 POJO 列表,并定义了相应的 PropertyEditor。我怀疑 PropertyEditor 是个问题,但下面的认识让我很困惑。

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

JSP: formActionURL 是字符串类型

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

HTML 源代码

<form id="pDSearch" action="${formActionURL}" method="post">
  1. 我已经配置了 taglibs uri,它运行良好,因为标签正在处理中。
  2. 这适用于 Spring 3.0.7 和 servlet 2.3。现在,我们正在迁移到 spring 4.0.6 和 servlet 2.3。
  3. 在另一个post 上,请求者使用了servlet 2.5,但仍然面临这个问题。迁移到 servlet 2.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"%>

如果有人可以将我重定向到可以找到问题答案的来源,我将不胜感激。如果您需要更多信息,请告诉我。

【问题讨论】:

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

标签: spring jsp jstl spring-form


【解决方案1】:

在过渡 Servlet 2.3 --> Servlet 2.4 期间,EL 的工作方式发生了变化。

在 Servlet 2.3 期间,EL 作为 JSTL 1.0 的一部分提供。从 Servlet 2.4 开始,EL 作为 JSP 2.0 的一部分提供,而 EL 从 JSTL 1.1 中删除。

任何与 Servlet 2.4+ 兼容的 JSP 标记库,都希望在 JSP 中找到 EL,而不是在 JSTL 中。换句话说,当你还在 Servlet 2.3 容器上使用 Servlet 2.4+ 兼容的 JSP 标签库时,它所有标签中的 EL 表达式将停止工作,因为它在 JSP 中找不到 EL。

因此,当您想使用与 Servlet 2.4+ 兼容的 JSP 标记库时,例如 Spring 4+,实际上需要 Servlet 2.5,那么您确实需要升级到最低 Servlet 版本。

另见:

【讨论】:

    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2014-05-01
    • 2020-09-19
    • 1970-01-01
    • 2012-02-22
    • 2016-08-18
    相关资源
    最近更新 更多