`
liudaoru
  • 浏览: 1575839 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jstl的使用方式

    博客分类:
  • java
阅读更多

jstl相关的jar包有两个:jstl.jar,standard.jar,jstl.jar中是核心的jstl定义,如c,fmt等,而standard.jar中包含声明的tld文件,其位置是:standard.jar\META-INF。

在系统加载时会扫描所有的jar包,并加载所有的tld文件。spring中的tld也是此种处理方式。

我们在jsp页面中一般使用

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

的方式引用,其中关键的是uri。如果是tld放在jar包中,则直接是tld声明的uri。而如果是自己在web.xml中直接声明,则可以更改uri,如下面:

<taglib>   
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>   
    <taglib-location>/WEB-INF/tld/c.tld</taglib-location>   
</taglib>  

  

其他文章请参考:

http://www.blogjava.net/crabhn/archive/2006/10/25/50858.html

http://www.iteye.com/topic/69331

EL和jstl使用方法:http://www.zxbc.cn/html/javajc/2719295115579.html

2
2
分享到:
评论
2 楼 liudaoru 2008-05-19  
From:http://www.yesky.com/23/1894523.shtml
Taglib原理和实现之循环的Tag

 1、问题:在request里的 People 对象,有个属性叫 men ,men 是一个Collection ,有许多个man 。现在,把 collection里的man的名字都显示出来。

  显然,这是一个嵌套Tag的问题。有三个Tag互相作用:最外层的Tag找到People对象,中间的Tag取得Collection,子Tag负责打印。

  例如:

<diego:withObject value="${people}">
 <diego:withCollection property="men">
  <diego:elementout property="name"/>
 </diego:withCollection>
</diego:withObject>

  思路如下:

  1) 编写WithObjectTag,负责从El表达式中取得对象

  2) 编写WithCollectionTag,负责从对象中取得 Collection ,遍历 Collection ,每遍历一次 Collection ,执行一次body

  3) 编写ElementoutTag ,把 Collection 中每个men对象的 name 打印出来

  2. 完整程序如下:

  在上例的diegoyun.vo包内,编写 People 类

package diegoyun.vo;
import java.util.Collection;
public class People
{
 private Collection men = null;
 public Collection getMen()
 {
  return men;
 }
 public void setMen(Collection men)
 {
  this.men = men;
 }
}

  编写 withObject ,这是从request里取得People对象的最外层Tag

package diegoyun;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
import org.apache.taglibs.standard.lang.support.ExpressionEvaluatorManager;
public class WithObjectTag extends BodyTagSupport
{
 private Object value = null;

 public Object getValue()
 {
  return value;
 }
 public void setValue(Object value)throws JspException
 {
  this.value = ExpressionEvaluatorManager.evaluate("value", value.toString(), Object.class, this, pageContext);
 }
 public int doStartTag()
 {
  return EVAL_BODY_INCLUDE;
 }
 public int doEndTag()throws JspException
 {
  return EVAL_PAGE;
 }


  编写WithCollectionTag,该Tag负责取得Collection,并遍历执行子Tag

package diegoyun;

import java.util.Collection;
import java.util.Iterator;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;

import org.apache.commons.beanutils.PropertyUtils;

public class WithCollectionTag extends BodyTagSupport {
 private Object element = null;

 private Collection list = null;

 private Iterator iterator = null;

 public Object getElement() {
  return element;
 }

 public void setProperty(String property) throws JspException {
  //取得父Tag对象,并且得到Collection
  WithObjectTag parent = (WithObjectTag) getParent();
  if (parent == null)
   throw new JspException("parent tag is null");
   try {
    Object propertyValue = PropertyUtils.getProperty(parent.getValue(),property);
    this.list = (Collection) propertyValue;
    if (list == null)
     throw new JspException("Collection is null");
   } catch (Exception e) {
    throw new JspException(e);
  }
 }

 public int doStartTag() throws JspException {
  //设置第一个元素,然后执行子Tag
  iterator = list.iterator();
  if (iterator.hasNext())
   element = iterator.next();
   return EVAL_BODY_INCLUDE;
 }

 public int doAfterBody() {
  if (iterator.hasNext()) {
   //如果还存在子元素,设置子元素,并且再次执行子Tag
   //循环由此而来
   //否则不再执行子Tag
   element = iterator.next();
   return EVAL_BODY_AGAIN;
  }
  else
   return EVAL_PAGE;
 }
}

  编写 ElementOutputTag

package diegoyun;
import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

import org.apache.commons.beanutils.PropertyUtils;

public class ElementOutputTag extends TagSupport
{
 private Object propertyValue = null;
 public void setProperty(String property)throws JspException
 {
  WithCollectionTag parent = (WithCollectionTag)getParent();
  if(parent == null)
   throw new JspException("parent tag is null");
  try
  {
   //判断上层tag中是否存在该属性名称,如果存在,取得属性值,否则报错
   propertyValue = PropertyUtils.getProperty(parent.getElement(), property);
  }
  catch (Exception e)
  {
   throw new JspException(e);
  }
 }
 public int doEndTag()throws JspException
 {
  try
  {
   //简单的把值打印到jsp页面
   pageContext.getOut().print(propertyValue);
  }
  catch (IOException e)
  {
   throw new JspException(e);
  }
  return EVAL_PAGE;
 }
}

  编写tld

<!--WithObjectTag-->
<tag>
 <name>withObject</name>
 <tag-class>diegoyun.WithObjectTag</tag-class>
 <body-content>JSP</body-content>
 <attribute>
  <name>value</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
 </attribute>
</tag>
<!--WithCollectionTag-->
<tag>
 <name>withCollection</name>
 <tag-class>diegoyun.WithCollectionTag</tag-class>
 <body-content>JSP</body-content>
 <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
 </attribute>
</tag>
<!--ElementOutputTag-->
<tag>
 <name>elementout</name>
 <tag-class>diegoyun.ElementOutputTag</tag-class>
 <body-content>empty</body-content>
 <attribute>
  <name>property</name>
  <required>false</required>
  <rtexprvalue>true</rtexprvalue>
 </attribute>
</tag>

  编写jsp

<%@ page language="java" %>
<%@ page import="diegoyun.vo.*"%>
<%@ page import="java.util.*"%>
<%@ taglib uri="/WEB-INF/tlds/diego.tld" prefix="diego"%>

<html>
<body bgcolor="#FFFFFF">
<%
 Collection c = new ArrayList();

 Man man1 = new Man();
 man1.setName("diego");
 c.add(man1);

 Man man2 = new Man();
 man2.setName("Zidane");
 c.add(man2);

 Man man3 = new Man();
 man3.setName("Rui");
 c.add(man3);

 People p =new People();
 p.setMen(c);
 request.setAttribute("people",p);
%>
Test loop tag:
<br>
<diego:withObject value="${people}">
<diego:withCollection property="men">
<diego:elementout property="name"/>
<br>
</diego:withCollection>
</diego:withObject>
</body>
</html>

  运行,则可以看到: 

Test loop tag:
diego
Zidane
Rui 
1 楼 liudaoru 2008-05-19  
From: http://www.wyxg.com/2007626145456/2007725203414.htm
taglib原理和实现之支持el表达式
1.先看这么一个例子

<%@ page contenttype="text/html; charset=gb2312" language="java"%>
<%@ taglib uri="/web-inf/tlds/c.tld" prefix="c"%>
<!doctype html public "-//w3c//dtd html 4.01 transitional//en" "http://www.w3.org/tr/html4/loose.dtd">
<html>
<body>
<%
string tut = "tutorial";
request.setattribute("tut",tut);
%>
the string in request is :
<c:out value="${tut}"/> 
</body>
</html> 

  2.如何支持el表达式

  在路径org.apache.taglibs.standard.lang.support下,有个叫 expressionevaluatormanager.evaluate 的方法,当el表达式作为入参时,调用这个方法,在tag内即可自动把el表达式转化。例如,你想tag的value字段支持el表达式,那么只需在set方法里如下调用:

public void setvalue(object value)throws jspexception
{
this.value = expressionevaluatormanager.evaluate(
"value", value.tostring(), object.class, this, pagecontext); 


  expressionevaluatormanager.evaluate有四个参数。第一个表示tag的名字,在取el表达式出错时使用。一般和属性名字相同。第二个要求字符串,通常简单调用输入对象的tostring方法。第三个是类,通常用object.class。第四个用this即可,第五个是pagecontext变量。

  通常不用对这个方法思考太多。只需改改属性名字,其他照搬即可。

  注意:当你的tag属性支持el表达式时,你必须把它声明为object对象。如上述的value,应该声明为:

private object value = null; 

  3.实例:让outputtag支持el表达式

package diegoyun;

import javax.servlet.jsp.jspexception;
import javax.servlet.jsp.jspwriter;
import javax.servlet.jsp.tagext.tagsupport;

import org.apache.taglibs.standard.lang.support.expressionevaluatormanager;

public class newoutputtag extends tagsupport
{
private object name = null;

public void setname(object name) throws jspexception
{
this.name = expressionevaluatormanager.evaluate(
"name", name.tostring(), object.class, this, pagecontext);
}
public int dostarttag() throws jspexception{
try
{
jspwriter out = pagecontext.getout();
out.print("hello! " + name);
}
catch (exception e)

throw new jspexception(e);
}
return eval_page;


}


  在diego.tld里添加声明

<!--newoutputtag-->
<tag>
<name>newout</name>
<tag-class>diegoyun.newoutputtag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag> 

  编写jsp测试

<%@ page language="java" %>
<%@ taglib uri="/web-inf/tlds/diego.tld" prefix="diego"%>
<html>
<body bgcolor="#ffffff">
<%
string s = "diego";
request.setattribute("name",s);
%>
test el supported tag:
<br>
<diego:newout name="${name}"/>

</body>
</html> 

  可以看到页面输出为:

  test el supported tag: 
  hello! diego 

相关推荐

    jstl使用xml出错

    总的来说,JSTL提供了一种强大的方式来处理XML数据,但同时也需要开发者对XML、XSLT以及JSTL标签库有深入的理解。通过正确配置和使用这些库,可以大大提高Java Web应用程序处理XML数据的效率和灵活性。

    JSTL使用手册 帮助文档

    JSTL的使用通常与EL(Expression Language)配合,EL是JSP 2.0引入的一种轻量级表达式语言,它简化了获取和设置JavaBean属性以及执行其他常见任务的方式。JSTL和EL的结合使用,使得JSP页面变得更加简洁,提高了代码...

    JSTL官方使用手册

    JSTL通常与Expression Language (EL)一起使用,EL提供了一种简洁的方式来访问JavaBean属性和其他数据源。两者结合,可以构建出更高效、更易读的JSP页面。 **8. JSTL的最佳实践** - 避免在JSP页面中混入过多的Java...

    jstl使用所需jar包

    在实际应用中,引入JSTL后,可以通过以下方式在JSP页面中使用它: ```jsp &lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt; &lt;%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %&gt;...

    jstl开发使用手册

    ### JSTL开发使用手册概览与核心知识点 #### JSTL简介 JSTL(JavaServer Pages Standard Tag Library)是一种标准的标签库,旨在简化JavaServer Pages (JSP) 页面的开发。它提供了一系列预定义的标签,帮助开发者...

    JSTL使用项目和lib资源

    **JSTL(JavaServer Pages Standard Tag Library)**是Java EE平台中用于增强JSP页面功能的一组标准标签库,它允许开发者使用更简洁、更易于维护的方式编写JSP页面,减少页面中的Java脚本。JSTL的核心库主要包含了...

    jstl的两个jar包

    JSTL,全称JavaServer Pages Standard Tag Library,是JavaServer Pages(JSP)标准标签库,它提供了一系列标签来简化JSP页面的编写,...同时,开发者应该注意使用现代的依赖管理方式,以避免版本冲突和不必要的麻烦。

    jstl使用的两个jar包

    在Java Servlet和JSP开发中,JSTL(Java...使用JSTL时,首先需要在JSP页面上引入JSTL库,这通常通过在页面指令中声明`taglib`来完成: ```jsp &lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt; ...

    JSTL标签 参考手册

    对于想要深入了解和使用JSTL的开发者,可以通过阅读提供的文档,如《JSTL_Functions标签库.doc》、《JSTL_C标签库.pdf》以及《JSTL_fmt格式化标签库.txt》,来更全面地掌握JSTL的各种功能和用法。

    JSTL连接数据库的操作

    通过本实验的学习,我们不仅了解了 JSTL SQL 标签库的基本用法,还掌握了如何在 JSP 页面中使用 JSTL 来连接数据库并展示数据。这种方法极大地简化了页面开发过程中的数据库操作,提高了开发效率。未来在实际项目...

    JSTL标签库-tomcat10-简化JSP中java代码

    接着,在JSP页面中引入JSTL的标签库,通常通过以下方式: ```jsp &lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt; &lt;%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %&gt; ``` 然后...

    JSTL标签库依赖,内含Tomcat8、Tomcat10所需JSTL依赖

    3. 使用JSTL标签:现在可以在JSP页面中使用JSTL标签,如`&lt;c:forEach&gt;`进行迭代,`&lt;c:if&gt;`进行条件判断,`&lt;fmt:formatDate&gt;`格式化日期等。 总之,JSTL是提升JSP页面编写效率的重要工具,而依赖注入则是现代Java应用...

    JSTL中if标签使用方法

    ### JSTL中if标签使用方法详解 JSTL(JavaServer Pages Standard Tag Library)是为简化JSP页面开发而设计的一组标准标签库。它提供了处理数据、条件逻辑等功能的强大工具,使得开发者无需编写复杂的Java代码即可...

    JSTL教程

    JSTL还包括一个简化版的表达式语言,允许在不使用完整编程语言的情况下设置动态属性值。EL用于从页面上下文中获取和设置值,它简化了与JSP页面中对象的交互。 ### JSTL版本 JSTL 1.0发布于2002年,包含四个主要的...

    JSTL中文帮助文档

    - 使用方式:`&lt;c:tagname&gt;` 2. **XML处理标签库**:提供了对XML文档进行操作的能力。 - URI前缀:`http://java.sun.com/jstl/xml` - 使用方式:`&lt;x:tagname&gt;` 3. **国际化格式化标签库**:用于处理日期、时间、...

    jstl标准开发jar包

    7. **最佳实践**:尽管JSTL提供了一种更简洁的方式来编写JSP,但过度依赖标签可能导致代码过于复杂。推荐结合使用JSTL和自定义标签库(Tag Libraries),以及现代的MVC框架如Spring MVC,以获得更好的结构和可维护性...

    JSTL操作XML JSTL操作XML

    通过本实验的学习,我们不仅掌握了如何使用JSTL操作XML的基本方法,还学会了如何将XML作为配置文件使用,并在JSP中利用JSTL来读取配置文件以实现数据库连接。这种方式大大提高了Web应用程序的灵活性和可维护性。此外...

    JSTL标签配置文件

    JSTL经常与JSP表达式语言(EL)一起使用,EL提供了一种简洁的方式来访问JavaBeans中的属性。通过EL,JSTL标签可以更方便地引用和操作页面作用域、请求作用域等范围内的对象。 8. **性能与优化** 尽管JSTL提高了...

    javaweb使用的Jstl.zip

    JSTL的使用可以极大地提高开发效率,因为它允许我们用更简洁、更易读的方式来处理常见的JavaWeb任务,比如迭代、条件判断、数据操作等,而无需使用传统的Java脚本语法`&lt;% %&gt;`。 **JSTL的主要组成部分:** 1. **...

Global site tag (gtag.js) - Google Analytics