Correction: JSTL and expression language problem: According to TLD or attribute directive in tag file, attribute value does not

68 篇文章 0 订阅
53 篇文章 0 订阅

Correction: JSTL and expression language problem

In my older post I wrote about problem in using JSTL.
For a summary, my problem is I kept seeing this error message:

According to TLD or attribute directive in tag file, attribute value does not accept any expressions

And I find out that problem occurs because I was using JSTL-1.0 in a JSP-2.0 environment. Details can be found here.

Lately, when working on my project and using JSTL again I come against a strange problem. I am trying to use <c:out value="${foo.bar}" /> and it simply prints ${foo.bar}.

After a quick inspection I found the source of the problem. Again I made mistake using auto-complete in IntelliJ ( sometimes i found this after error occurs, like this time:) ).
So using auto complete, i define core taglib definition like this:
<%@ taglib prefix="c" 
uri="http://java.sun.com/jsp/jstl/core"%>

This definition is for JSTL-1.1 and guess what I am using JSTL-1.1 jar and Servlet-2.3/JSP-1.2 web-app(due to some code-generation issues). So i fix this error by changing tld description like this:
<%@ taglib prefix="c" 
uri="http://java.sun.com/jstl/core"%>

In conclusion of my older post I state :

So here is the summary for all of my words:
  • Servlet 2.3/JSP 1.2 + JSTL 1.0 - OK
  • Servlet 2.3/JSP 1.2 + JSTL 1.1 - OK
  • Servlet 2.4/JSP 2.0 + JSTL 1.1 - OK
  • Servlet 2.4/JSP 2.0 + JSTL 1.0 - PROBLEM

If problem occurs first check web.xml and JSTL verisons.
Upgrade if you can (highly recommended), if you can't then use " c-rt.tld"

This is still true. BUT if you want to use Servlet 2.3/JSP 1.2 + JSTL 1.1 option, you should avoid using JSTL-1.1 tld definition.

First let me give you a small introduction then I will talk about my problem :)

Small Introduction
I've been using JSTL in my projects partially quite some time (partially because of my company's internal taglib). JSTL is a useful tag library for JSPs. You can use expression language (EL) features easily, cause they save you writing a lot of code and they are really simple.

This is a simple example for creating a simple select input


<%@ page contentType="text/html;charset=UTF-8"
language="java" %>
<%@ taglib prefix="fmt"
uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="c"
uri="http://java.sun.com/jstl/core" %>
<fmt:setbundle basename="com.foo.Application">

...

<select name="wfn">
<option value=""><fmt:message
key="form.select.choose"></option>
<c:forEach items="${workflows}" var="wf">
<c:set var="selected" value=""/>
<c:if test="${param.wfn==wf.name}">
<c:set var="selected" value="selected"/>
</c:if>
<option value="<c:out value="${wf.name}">"
<c:out value="${selected}"> >
<c:out value="${wf.label}">
</option>
</c:forEach>
</select>


There may be some other (and simple) ways for this routine but if you are not able to use some other [powerful] tag libraries this can save you from confusing scriptlets and provides easily understandable and maintainable code. In this example you can see iteration, flow control, assignment, output and internationalization features provided by standard tag library.

THE PROBLEM
After this small introduction let me tell you about my problem and a solution that I found about it.

Lately I've started to learn about Spring (and MVC). I will try to write about that in the future. Anyway, I've downloaded "spring-framework-1.2.9-with-dependencies" and start inspecting some tutorials. On my sample I use jars from the package I downloaded.

But when i try to use JSTL in pages I keep getting exception:
" According to TLD or attribute directive in tag file, attribute value does not accept any expressions"

After a small inspection i found the source of the problem. In c.tld file I found these lines:

...
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
...

When I change rtexprvalue to true it works. But I never encountered such problem (and web.xml file is defined by Servlet 2.4 descriptor:

<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" >
...

I mentioned that JSTL uses EL. When JSTL 1.0 released JSP technology(Sevlet 2.3/JSP 1.2) was not supporting EL. So JSTL handled EL by its own. When JSP 2.0 (Sevlet 2.4/JSP 2.0) technology came out, it is now supporting EL and starting from JSTL 1.1 it uses JSP support for EL. You can find these in specifications of both JSTL and JSP.

My IDE (IntelliJ) generated web.xml file and I don't copy it from tutorial. When I compare web.xml file from the tutorial and my sample (and my other projects) I found that they are all defined by Servlet 2.3.
When I use Servlet 2.3 my sample works. After small inspection I found out that I was using JSTL-1.0. Spring distribution comes with JSTL-1.0 and it isn't denoted on jar file. It simply says "standard.jar" not "standard-1.0" and I thought it was JSTL-1.1

That explains why comments like "If you want to use EL in JSPs you must define web.xml by 2.4 version". Since it is correct for using EL in JSPs it creates conflicts with JSTL-1.0. If you want to use JSTL-1.0 in this configuration you should use " c-rt.tld" file.

So here is the summary for all of my words:
  • Servlet 2.3/JSP 1.2 + JSTL 1.0 - OK
  • Servlet 2.3/JSP 1.2 + JSTL 1.1 - OK
  • Servlet 2.4/JSP 2.0 + JSTL 1.1 - OK
  • Servlet 2.4/JSP 2.0 + JSTL 1.0 - PROBLEM

If problem occurs first check web.xml and JSTL verisons.
Upgrade if you can (highly recommended), if you can't then use " c-rt.tld"

Note: if you want to use Servlet 2.3/JSP 1.2 + JSTL 1.1 option, you should avoid using JSTL-1.1 tld definition. Details are in here

I try to explain it as simple as I can.
Here are some links about JSTL:
- JSR 52 - place where you can download JSTL specifications
- JSR 152 - place where you can download JSP specification
- java.sun.com - you can find API and some documentation
- Jakarta Apache - Apache implementation of JSTL
http://arcuan.blogspot.com/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值