调试JSTL碰到的问题,真的是,无语.....

来源:互联网 发布:知乎来日方长 编辑:程序博客网 时间:2024/05/01 03:11

随着各种框架的产生,各种标签语言也越来越多,不过其中官方支持的只有一个那就是JSTL.

看了一下各个框架的例程,几乎所有的框架都对JSTL有支持.

所以下定决心,不怕牺牲了解一下JSTL,并尝试在项目中慢慢过渡..

写了一个Very Simple的例子:

********************************************************************************************

<%@ page contentType="text/html; charset=gbk" import="
    java.io.*,
    java.sql.*,
    java.util.*,
    javax.servlet.jsp.jstl.sql.*"    
%>
<%@ taglib uri="/core" prefix="c" %>
<%@ taglib uri="/format" prefix="fmt" %>

<%@ include file="../include/common.jsp" %>

<%  

 String testid="测试";

//读取数据到JSTL的Result
 Result data=openResult("select * from test");
 if (data.getRowCount()>0){
  System.err.println(data.getColumnNames()[1]);
  System.err.println(data.getRows()[1].get("id"));
 }
//一般分页操作,需要知道总行数
 request.setAttribute("data",data);
 request.setAttribute("testid",testid);
%>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<head>
</head>
<body >
<c:out value="${testid}"/><br>
<c:forEach var="row" items="${data.rows}" varStatus="status">
 字典名称:<c:out value="${data.rows[status.index].id}" /><br>
 字典数据:<c:out value="${row.code}" /><br>
</c:forEach>

<%
 out.println("ok");
//最终关闭连接
  try {
    if ( stat != null ) { stat.close(); }
    if ( conn != null ) { conn.close(); }
  }
  catch ( Exception e ) {
  }

 data=null;
 jrs=null;
 System.gc();
%>
</body>
</html>

********************************************************************************************

结果,我想移值这个代码到Appfuse的框架中时问题出现了...怎么样处理,变量都不能显示...

结果花了四五个小时,才发现是 Jstl版本 和 描述的 fmt.tld c.tld的版本不匹配,而且,这些例子均依赖于Appache 的Taglib

修改了一下,采用默认得的uri(注意,低版本的URI和高版本的URI语法上还有差异T^@#^@^#@^)

<%@ page contentType="text/html; charset=gbk" import="
    java.io.*,
    java.sql.*,
    java.util.*,
    javax.servlet.jsp.jstl.sql.*"    
%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jstl/fmt_rt" prefix="fmt" %>

<%@ include file="../include/common.jsp" %>

<%  

 String testid="测试";

//读取数据到JSTL的Result
 Result data=openResult("select * from test");
 if (data.getRowCount()>0){
  System.err.println(data.getColumnNames()[1]);
  System.err.println(data.getRows()[1].get("id"));
 }
//一般分页操作,需要知道总行数
 request.setAttribute("data",data);
 request.setAttribute("testid",testid);
%>
<html>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<head>
</head>
<body >
<c:out value="${testid}"/><br>
<c:forEach var="row" items="${data.rows}" varStatus="status">
 字典名称:<c:out value="${data.rows[status.index].id}" /><br>
 字典数据:<c:out value="${row.code}" /><br>
</c:forEach>

<%
 out.println("ok");
//最终关闭连接
  try {
    if ( stat != null ) { stat.close(); }
    if ( conn != null ) { conn.close(); }
  }
  catch ( Exception e ) {
  }

 data=null;
 jrs=null;
 System.gc();
%>
</body>
</html>

*********************************************************************************************

在这个过程,我仔细看了一下配置文件,JSTL其实只实现很少的几个标签,而我们常用的大部分功能,很多都是依赖于Apache TagLib的实现

而随着版本的变化,这些细微的配置会造成一些差异,可恨的是,竟然没有明确的错误提示....

结果浪费了我数个小时,最后是到Apache下载了一个最新的Jstl.jar和stander.jar 及描述文件.