JSTL使用中的一些总结

一、书

 《JSP设计》有一半内容在讲JSTL,很不错的参考书

二、版本

  要注意1.0.x和1.1.x两个版本,目前最新版分别为1.0.6和1.1.2

  1.1版比1.0版多了fn标签库(常用的字符串操作在里面,特别是length、substring、等用于显示的函数)

  各个版本都可以在apache网站下载得到

三、使用中注意的问题

  在仅支持JSP1.2规范的容器中,只能使用jstl 1.0版,所以fn就不能用了,很不爽。${1 + 2}必面都要写在<c:out value='${1 + 2}' />里。在支持JSP2.0规范的容器中,可以直接使用el表达式。

四、一些BUG

  在websphere 6.0(6.0.2.13版以前)中,有fn:length函数的BUG。只有打补丁了。

        在websphere 中,如<c:out value='${var == 0 ? "非" : "是" }'  />这样的句子会出问题,tomcat下刚运行很好。应该是:jstl只是一个规范,各个web容器对其实现不同的原因吧。

五、不错的地方

  易学易用,再也没有空值特别是null的困扰,页面不容易抛出error 500错误,感觉有点象在写ASP

  最常用的只有c、fn、fmt三个库

五、一些不爽的地方

  不支持自定义函数,很郁闷,我想可能是JSTL实现作用域的问题吧。

  只有<c:if test='${}' /></c:if>没有elseif的语法,两个以上有判断只有用

  <c:choose>
  <c:when test="{...}">1</c:when>
  <c:when test="{...}">2</c:when>
  <c:otherwise>3</c:otherwise>
  </c:choose>

       forEach中如果再有个奇偶判断就好了。

  上面几点,webwok中的OGNL就做得非常好。

      <forEach begin="begin" end="end" step="step">中end的值必须大于等于begin,step也就不能继负值了。

 六、常用代码:

<c:out value="${tpaMain.tpaInfo.content}" escapeXml="false" />

 <fmt:formatDate value="${tpaMain.add_date}" pattern="yyyy-MM-dd hh:mm" />

格式化日期、货币单位、数字是用得最多的

<c:forEach var="companyIndustry" items="${current.companyIndustryList}">
<c:out value='${companyIndustry.craft_name} ' escapeXml='false' />
</c:forEach>

forToken有时也很有用

输出复杂的多行多列的表格,可更改columnCount的值

<table width="98%" border="0" align="center" cellpadding="0" cellspacing="0">
  <c:set var="recordCount" value="0" />
  <c:set var="columnCount" value="2" />
  <c:out value='<tr>' escapeXml='false' />
  <c:forEach var="category" items="${categoryList}">
 <c:if test="${(recordCount mod columnCount) eq 0 && recordCount ne 0}">
   <c:out value='</tr><tr>' escapeXml='false' />
 </c:if>
 <c:out value='<td' escapeXml='false' />
 <c:out value='<span style="font-size: 14px;color: #db3210;font-weight: bold;">${category.craft_name}</span><br />' escapeXml='false' />
 <c:forEach var="current" items="${category.categoryList}">
 <a href="<c:url value='${param.url}?craft_index=${current.craft_index}' />"><c:out value="${current.craft_name}" escapeXml='false' /></a>&nbsp;
 </c:forEach>
 <c:out value='</td>' escapeXml='false' />
 <c:set var="recordCount" value="${recordCount + 1}" />
  </c:forEach>
 
  <c:set var="column" value="${recordCount mod columnCount}" />
  <c:if test="${column ne 0}">
 <c:forEach begin="${column}" end="${columnCount - 1}">
   <c:out value='<td>&nbsp;</td>' escapeXml='false' />
 </c:forEach>
  </c:if>
 
  <c:if test="${recordCount eq 0}">
   <c:forEach begin="0" end="${columnCount - 1}">
 <c:out value='<td>&nbsp;</td>' escapeXml='false' />
 </c:forEach>
  </c:if>
 
  <c:out value='</tr>' escapeXml='false' />
</table>

<think>好的,用户现在想了解JSF中是否支持使用JSTL,并请求示例及兼容性说明。我需要结合用户提供的站内引用和之前的对话内容来回答这个问题。首先,回顾之前的对话,用户之前询问了静态渲染与循环结合的问题,现在转向JSF和JSTL的集成,这可能涉及到在JSF页面中使用JSTL标签进行循环或其他逻辑处理。首先,我需要确认JSF是否支持JSTL。根据用户提供的引用[1]和[2],JSF和JSTL可以在同一页面协同工作,但需要注意嵌套限制。引用[1]提到在JSP页面转换阶段,JSF组件和JSTL标签可以同时处理,而引用[2]指出JSF组件不能嵌套在迭代的JSTL标签中,比如<c:forEach>,应该使用JSF自身的迭代组件,比如<h:dataTable>。接下来,我需要提供具体的示例。例如,在JSF页面中使用JSTL的<c:if>和<c:forEach>标签。但要注意,不能在JSTL的循环内嵌套JSF组件,否则可能出现问题。例如,引用[2]中的警告,JSF组件不能放在JSTL的迭代标签里,应该改用JSF的渲染器处理迭代。然后,需要讨论兼容性问题。JSF和JSTL都基于JSP生命周期,但可能存在冲突,特别是JSF的生命周期阶段与JSTL的处理顺序。例如,JSTL在编译时处理,而JSF在运行时处理,可能导致变量作用域的问题。引用[3]提到JSF中设置请求属性需要使用FacesContext,这可能与JSTL的变量设置方式不同,需要注意作用域管理。 另外,用户提供的引用[4]是JSTL的库URI,可能需要指导用户正确导入JSTL核心库,如使用<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>。 需要总结兼容性要点,强调JSF和JSTL可以协同使用,但需注意标签嵌套和作用域处理,避免混合使用迭代标签。同时,给出最佳实践建议,比如优先使用JSF组件,仅在需要复杂逻辑时使用JSTL。最后,生成相关问题,可能涉及性能比较、常见错误处理、替代方案等,帮助用户进一步探索。</think>### JSF与JSTL集成使用详解 JSF与JSTL的集成可以实现**服务端逻辑与视图层的高效协作**,但需注意两者的生命周期差异和标签嵌套规则[^1][^2]。 --- #### 一、基础使用示例 1. **条件判断**(结合`<c:if>`): ```jsp <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %> <%@ taglib prefix="h" uri="http://java.sun.com/jsf/html" %> <c:if test="${user.age >= 18}"> <h:outputText value="成年人"/> </c:if> ``` 2. **循环遍历**(结合`<c:forEach>`): ```jsp <c:forEach items="#{userList}" var="user" varStatus="status"> <h:outputText value="#{status.index + 1}. #{user.name}"/> </c:forEach> ``` --- #### 二、兼容性关键点 1. **生命周期冲突** JSTL标签在**JSP编译阶段**执行,而JSF组件在**页面渲染阶段**处理。当混合使用时,需确保变量作用域正确: ```jsp <c:set var="maxCount" value="5"/> <h:dataTable value="#{bean.items}" var="item" rows="#{maxCount}"> <!-- JSF组件内容 --> </h:dataTable> ``` 2. **标签嵌套限制**[^2] JSF组件**不可嵌套在JSTL迭代标签内**,否则会导致组件树构建异常: ```jsp <!-- 错误示例 --> <c:forEach items="#{list}"> <h:inputText value="#{item}"/> <!-- 将引发渲染错误 --> </c:forEach> <!-- 正确做法 --> <h:dataTable value="#{list}" var="item"> <h:column><h:inputText value="#{item}"/></h:column> </h:dataTable> ``` 3. **作用域变量访问** 通过`FacesContext`访问请求作用域变量[^3]: ```java FacesContext.getCurrentInstance().getExternalContext() .getRequestMap().put("key", value); ``` --- #### 三、集成配置要点 1. **依赖配置** 确保JSTL库正确引入(JSTL 1.2+推荐)[^4]: ```xml <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> ``` 2. **表达式语言协调** JSF使用`#{...}`表达式,JSTL默认使用`${...}`。在JSF页面中需统一使用`#{...}`语法: ```jsp <c:if test="#{not empty bean.data}"> <!-- 内容 --> </c:if> ``` --- ### 兼容性对比矩阵 | 功能 | JSF组件 | JSTL标签 | 混合使用建议 | |---------------------|----------------------|-----------------------|-----------------------| | 条件控制 | `<h:panelGroup>` | `<c:if>` | 简单逻辑用JSTL | | 循环遍历 | `<h:dataTable>` | `<c:forEach>` | 数据绑定用JSF | | 变量设置 | `<f:param>` | `<c:set>` | 作用域明确时可混用 | | 国际化 | `<f:loadBundle>` | `<fmt:message>` | 优先使用JSF机制 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值