当未指定默认命名空间时,函数getMessageData必须与前缀一起使用

Gov*_*iya 7 jsp tomcat jstl el

我收到了这个错误

/WEB-INF/jsp/account/index.jsp(6,0)当未指定默认命名空间时,函数getMessageData必须与前缀一起使用

<c:set var="messageData" scope="session" value="${usermap.getMessageData()}"/>
<c:set var="scheduleData" scope="session" value="${usermap.getScheduleData()}"/>
<c:set var="meetingData" scope="session" value="${usermap.getMeetingData()}"/>
Run Code Online (Sandbox Code Playgroud)

请注意,我可以在本地Tomcat上运行相同的项目而不会出现任何错误.

服务器上的Tomcat版本是"Tomcat 6.0"

sku*_*sel 12

您的代码的问题是本地运行的代码在Tomcat 7上运行,服务器上运行的代码在Tomcat 6上运行.

一旦调用带有参数(那些())的方法是EL 2.2(及更高版本)的特性,它伴随着Servlet 3.0兼容容器(因此Tomcat 7),您的代码在本地运行良好.

只要在Servlet 2.5容器(即Tomcat 6)上运行此代码,就会出现上述错误.

但是,()两个servlet容器都支持"类属性"访问(不带).

  • @StormeHawke这没问题.我们每天都在这里找到新的东西! (2认同)

Sto*_*wke 5

试试这个:

<c:set var="messageData" scope="session" value="${usermap.messageData}"/>
<c:set var="scheduleData" scope="session" value="${usermap.scheduleData}"/>
<c:set var="meetingData" scope="session" value="${usermap.meetingData}"/>
Run Code Online (Sandbox Code Playgroud)

原因是,EL删除了"get"并使getter方法的第一个字母为小写.通常有一个与修改后的getter名称匹配的字段,但这不是必需的.

(实际上,反过来说 - 当你执行usermap.messageData时,EL会自动将其转换为usermap.getMessageData().如果该方法不存在,你将获得异常.)

  • 虽然你的答案可能提供了达到预期效果的方法,但它并没有回答为什么这样做的问题.到目前为止提供的信息不允许对其进行判断.最可能的原因是部署webapp的tomcat没有EL 2.2+ thius是Tomcat 6,而localhost是Tomcat 7. (2认同)