学习jsp不得不学习jsp标签,一般来说,对于一个jsp开发者,可以理解为jsp页面中出现的java代码越少,对jsp的掌握就越好,而替换掉java代码的重要方式就是使用jsp标签。

 jsp标签的分类:

  1)内置标签(动作标签): 不需要在jsp页面导入标签

  2)jstl标签: 需要在jsp页面中导入标签

  3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签

1、内置标签(动作标签):

<jsp:forward />转发标签:

  1.   语法:<jsp:forward page="/MyJsp001.jsp"></jsp:forward>
  2.   相当于java代码:request.getRequestDispatcher("/MyJsp001.jsp?name=jxf").forward(request, response);
  3.   注意:但是java代码的转发可以通过url带参数的方式进行传递参数,而转发标签需要借助于下面的<jsp:param>标签实现参数传递

<jsp:pararm/>参数标签:

  1. 语法: <jsp:param value="jxf" name="name"/> <%-- 传递一个名为name,值为jxf的参数,参数一般作为其他标签的子标签使用--%>
  2.  
  3. 结合<jsp:forward>标签用法:
  4. <jsp:forward page="/MyJsp001.jsp">
  5.   <jsp:param value="jxf" name="name"/>
  6. </jsp:forward> 

<jsp:include/>包含标签:

  1. 语法:
  2.  
  3. <jsp:include page="/MyJsp001.jsp">
  4. <jsp:param value="jxf" name="name"/><%--可以将参数传递给包含进来的页面--%>
  5. </jsp:include>
  6.  
  7. jsp中还有一个包含指令,也是将一个页面包含另外的页面
  8.  
  9. 他们之间的区别:
  10.  
  11.   1、首先是语法不同
  12.  
  13.     <jsp:include page="/MyJsp001.jsp">
  14.  
  15.     <%@inclue file="被包含的页面"%>
  16.  
  17.   2、<jsp:include>可以传递参数,<%@inclue%>不可以
  18.  
  19.   3、<jsp:include>:包含页面与被包含页面分别编译为两个java源文件,在运行时引用
  20.  
  21.     <%@inclue%>:包含页面与被包含页面合并编译为一个java源文件

2、jstl标签:

    JSTL (java  standard  tag  libarary   -  java标准标签库)

  1.   jstl标签的类型:
  2.  
  3.   核心标签库 c标签库)//这里主要介绍c标签库,因为用的真的很多
  4.  
  5.   国际化标签(fmt标签库)
  6.  
  7.   EL函数库(fn函数库)
  8.  
  9.   xml标签库(x标签库)//一般不用该库,这属于数据操作,而数据操作应于dao层中,jsp页面主要用于展示数据
  10.  
  11.   sql标签库(sql标签库)//与xml标签库类似,不应在jsp页面中操作数据(当然他们是可以在jsp页面写)

使用jstl标签库使用前提(此处以c标签库为例):

1、导入jstl支持包:jstl-1.2.jar(如果用MyEclipse创建项目时候选择java EE5.0,则不需要导包,工程中已经包含)

2、在页面中使用Taglib指令导入标签库  

  1. <%--uri:tld文件中的uri名称,prefix:标签前缀--%>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

uri和prefix怎样写?以标签库的为例:

工程名->Java EE 5 Libraries->jstl-1.2.jar->META-INF-c.tld

c标签库的主要标签:

<c:set>标签:用于保存数据到域对象中

  1.    <%--var为属性名 value为属性值 scope为保存属性到那个域对象,默认为page --%>
  2. <%--相当于java代码<%pageContext.setAttribute("name", "jxf") --%>
  3. <c:set var="name" value="jxf" scope="page"></c:set>
  4. ${name}<%--EL表达式输出page域中的name属性值--%>

<c:out>标签:显示数据

  1. <%--value:输出到浏览器的值,${name}EL表达式取出域对象属性值为name的值,
       default:当value值为null时显示的默认值,
       escapeXml:表示是否转义为xml格式(也可以理解为普通文本格式),true表示转义,默认false --%>
  2. <c:out value="${name}" default="<h1>标题h1<h1>" escapeXml="false"></c:out>

<c:if>标签:但条件判断

  1. <%--test支持EL表达式 --%>
  2. <c:if test="${true}">
  3. 条件成立!
  4. </c:if>

<c:choose>+<c:when>+<c:otherwise>标签:多条件判断

  1. <%--相当于if else结构,当有一条件满足后其他条件都不满足,证:此实例只输出 10>5--%>
  2. <c:choose>
  3. <c:when test="${10>5}">
  4. 10>5<br />
  5. </c:when>
  6. <c:when test="${6>2}">
  7. 6>2<br />
  8. </c:when>
  9. <c:otherwise>
  10. 条件都不成立
  11. </c:otherwise>
  12. </c:choose>

<c:forEach>标签:遍历

  1. <%--
  2. begin : 从哪个元素开始遍历,默认从0开始
  3. end : 到哪个元素结束。默认到最后一个元素
  4. step : 步长,默认1
  5. items : 需要遍历的数据(集合)
  6. var : 每个元素的名称
  7. varStatus: 当前正在遍历元素的状态对象。(count属性:当前位置,从1开始)
    --%>
  8. <%
  1.     //Student{
        //  public String name;
        //  public int age;
        //  public Student(String Name,int Age){
        //    this.name = Name;
        //    this.age = age;
        //  }
        //}
  2. //List数据准备
  3. List<Student> list = new ArrayList<Student>();
  4. list.add(new Student("name001",18));
  5. list.add(new Student("name002",19));
  6. list.add(new Student("name003",20));
  7. pageContext.setAttribute("list",list);//放入域中
  8.  
  9. //Map数据准备
  10. Map<String,Student> map = new HashMap<String,Student>();
  11. map.put("001",new Student("name001",18));
  12. map.put("002",new Student("name002",19));
  13. map.put("003",new Student("name003",20));
  14. pageContext.setAttribute("map",map);//放入域中
  15.  
  16. //array数据准备
  17. Student[] array = new Student[]{
  18. new Student("name001",18),
  19. new Student("name002",19),
  20. new Student("name003",20)};
  21. pageContext.setAttribute("array",array);//放入域中
  22. %>
  23. <%--遍历list --%>
  24. <c:forEach var="student" begin="0" end="2" items="${list}" step="1" varStatus="varSta">
  25. name:${student.name}---age:${student.age}<br/>
  26. </c:forEach>
  27. <%--遍历map --%>
  28. <c:forEach var="student" begin="0" end="2" items="${map}" step="1" varStatus="varSta">
  29. key:${student.key}---name:${student.value.name}---age:${student.value.age}<br/>
  30. </c:forEach>
  31. <%--遍历array --%>
  32. <c:forEach var="student" begin="0" end="2" items="${array}" step="1" varStatus="varSta">
  33. name:${student.name}---age:${student.age}<br/>
  34. </c:forEach>
  35. <%--一般遍历集合或者数组都是全部遍历,所以只写2个属性varitems,其他取默认值 --%>
  36. <c:forEach var="student" items="${array}">
  37. name:${student.name}---age:${student.age}<br/>
  38. </c:forEach>

<c:forTokens>标签:切割字符串

  1. <%--
  2. 切割字符串,相当于split函数
  3. var:切割出来的每一部分字符串
  4. items:要切割的字符串
  5. delims:分割的字符,若内容为字符串,则这个字符串的每个字符都会当作一个分割的字符
  6. 如:items="a-b-c=d=e" dilims="-=",分割的结果为 a,b,c,d,e
  7. --%>
  8. <%
  9. //数据准备
  10. String str = "a-b-c=d=e";
  11. pageContext.setAttribute("str", str);
  12. %>
  13. <c:forTokens var="item" items="${str}" delims="-=">
  14. ${item}<br />
  15. </c:forTokens>

3、自定义标签:

  当JSTL标签库已经无法满足我们的需求时候,就需要自己开发自定义标签,来满足我们的需求,自定义标签实际上是一个普通的java类,继承SimpleTagSupport类。

在介绍自定义标签之前,先介绍SimpleTagSupport类:

SimpleTagSupport类继承自SimpleTag接口,而SimpleTag接口主要有以下4个方法,也可将这四个方法理解为标签处理器类的生命周期:

  1. public interface SimpleTag extends JspTag {   
  2.  
  3.    /**
  4. * 执行标签时调用的方法,一定会调用
  5. */
  6. public void doTag() throws javax.servlet.jsp.JspException, java.io.IOException;
  7.  
  8. /**
  9. * 设置父标签对象,传入父标签对象,当标签存在父标签时会调用
  10. */
  11. public void setParent( JspTag parent );
  12.  
  13. /**
  14. * 设置JspContext对象,其实他真实传入的是其子类PageContext
  15. */
  16. public void setJspContext( JspContext pc );
  17.  
  18. /**
  19. * 设置标签体内容。标签体内容封装到JspFragment对象 中,然后传入JspFragment对象
  20. */
  21. public void setJspBody( JspFragment jspBody );
  22.  
  23. }

SimpleTagSupport类在其基础上封装出了3个方法,方便自定义标签类编写,该方法实现也比较简单,无非就是内部维护一个变量,通过set方法将其赋值,再返回该对象,这样继承SimpleTagSupport拿到如PageContext对象就直接调用getJspContext()即可。

  1. /*SimpleTagSupport 类的一部分*/
  2. public class SimpleTagSupport implements SimpleTag
  3. {
  4. /** Reference to the enclosing tag. */
  5. private JspTag parentTag;
  6.  
  7. /** The JSP context for the upcoming tag invocation. */
  8. private JspContext jspContext;
  9.  
  10. /** The body of the tag. */
  11. private JspFragment jspBody;
  12.  
  13. public void setParent( JspTag parent ) {
  14. this.parentTag = parent;
  15. }
  16.  
  17. public JspTag getParent() {
  18. return this.parentTag;
  19. }
  20.  
  21. public void setJspContext( JspContext pc ) {
  22. this.jspContext = pc;
  23. }
  24.  
  25. protected JspContext getJspContext() {
  26. return this.jspContext;
  27. }
  28.  
  29. public void setJspBody( JspFragment jspBody ) {
  30. this.jspBody = jspBody;
  31. }
  32.  
  33. protected JspFragment getJspBody() {
  34. return this.jspBody;
  35. }
  36. }

编写自定义标签的步骤:

以写一个自定义标签为例:功能:向浏览器输出一句话“酒香逢 博客园欢迎您”

1)编写一个普通的java类(OutInfo.java),继承SimpleTagSupport类,并重写doTag方法。(jsp文件最后编译为java文件,查看该java文件可知_jspService方法中,会创建标签类OutInfo对象,并执行doTag方法。编译后原文件路径:如D:\Program Files\Tomcat\apache-tomcat-6.0.39\work\Catalina\localhost\Tag\org\apache\jsp\xxx.java)

  1. /*
  2. * OutInfo.java
  3. */
  4. public class OutInfo extends SimpleTagSupport {
  5.  
  6. @Override
  7. public void doTag() throws JspException, IOException {
  8. PageContext pageContext = (PageContext)getJspContext();
  9. pageContext.getOut().write("酒香逢 博客园欢迎您");
  10. }
  11. }

2)在web项目的WEB-INF目录下建立tld文件(jxf.tld),这个tld文件为标签库的声明文件,并配置好相应的信息。(可以参考核心标签库的tld文件,如:项目/Java EE 5 Libraries/jstl-1.2jar/META-INF/c.tld)

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2.  
  3. <taglib xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
  6. version="2.1">
  7.  
  8. <description>JSTL 1.1 core library</description>
  9. <display-name>JSTL core</display-name>
  10. <tlib-version>1.1</tlib-version>
  11. <!--标签库前缀 taglib指令中的prefix属性 -->
  12. <short-name>jxf</short-name>
  13. <!--tld文件的唯一标记 taglib指令中的uri属性 -->
  14. <uri>http://jxf.tag</uri>
  15.  
  16. <tag>
  17. <description>
  18. 这是自定义标签的描述信息,可以在MyEclipse中有提示
  19. </description>
  20. <!-- 标签名 -->
  21. <name>outInfo</name>
  22. <!-- 标签类的完名 -->
  23. <tag-class>jxf.OutInfo</tag-class>
  24. <body-content>scriptless</body-content>
  25. <!-- <attribute>
  26. <description>
  27. 这是属性的描述信息
  28. </description>
  29. <name>var</name>
  30. <required>false</required>
  31. <rtexprvalue>false</rtexprvalue>
  32. </attribute> -->
  33. </tag>
  34.  
  35. </taglib>

3)在jsp页面的头部导入自定义标签库

  1. <%@taglib uri="http://jxf.tag" prefix="jxf" %>

4)在jsp中使用自定义标签 

  1. <jxf:outInfo></jxf:outInfo>

5)jsp页面

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%@taglib uri="http://jxf.tag" prefix="jxf" %>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5. <head>
  6. <title>自定义标签</title>
  7. </head>
  8. <body>
  9. <jxf:outInfo></jxf:outInfo>
  10. </body>
  11. </html>

自定义标签能够做的:

1)控制标签体内容输出

  1. /*
  2. * 1)输出标签题内容
  3. */
  4. JspFragment jspBody = getJspBody();
  5. //方法:invoke(java.io.Writer out)
  6. //当参数为null时等价于 jspBody.invoke(getJspContext().getOut());
  7. jspBody.invoke(null);

2)控制标签余下内容输出

  1. /*
  2. * 2)控制标签体余下内容是否输出
  3. * 抛出一个SkipPageException异常后,标签体余下内容输出
  4. */
  5. throw new SkipPageException();

3)改变标签体内容

  1. /*
  2. * 3)改变标签体内容并输出到浏览器
  3. */
  4. //获取到标签体内容,并保存到自定义的款冲字符流中
  5. StringWriter sw = new StringWriter();
  6. //jspBodyString得到的即是标签体的内容
  7. String jspBodyString = sw.toString();
  8. jspBodyString = "简单将字符串的值改变掉";
  9. getJspContext().getOut().write(jspBodyString);//输出到浏览器

4)带属性的标签(以模仿c标签的<c:choose>+<c:when>+<c:otherwise>标签为例)

编写3个自定义标签处理器类 ChooseTag.javaWhen.javaOtherwise.jave

  1. /*
  2. * ChooseTag.java
  3. */
  4. public class ChooseTag extends SimpleTagSupport {
  5. private boolean flag = false;
  6.  
  7. public boolean isFlag() {
  8. return flag;
  9. }
  10.  
  11. public void setFlag(boolean flag) {
  12. this.flag = flag;
  13. }
  14. @Override
  15. public void doTag() throws JspException, IOException {
  16. getJspBody().invoke(null);
  17. }
  18. }
  1. /*
  2. * WhenTag.java
  3. */
  4. public class WhenTag extends SimpleTagSupport {
  5. private boolean test;
  6.  
  7. //tld文件中的属性必须要有对应的set方法,否则报错
  8. public void setTest(boolean test) {
  9. this.test = test;
  10. }
  11. @Override
  12. public void doTag() throws JspException, IOException {
  13. ChooseTag parent = (ChooseTag)getParent();
  14. if(!parent.isFlag()){
  15. if(test){
  16. parent.setFlag(true);
  17. getJspBody().invoke(null);
  18. }
  19. }
  20. }
  21. }
  1. /*
  2. * OtherwiseTag.java
  3. */
  4. public class OtherwiseTag extends SimpleTagSupport {
  5. @Override
  6. public void doTag() throws JspException, IOException {
  7. ChooseTag parent = (ChooseTag)getParent();
  8. if(!parent.isFlag()){
  9. getJspBody().invoke(null);
  10. }
  11. }
  12. }

tld文件

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2.  
  3. <taglib xmlns="http://java.sun.com/xml/ns/javaee"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
  6. version="2.1">
  7.  
  8. <description>JSTL 1.1 core library</description>
  9. <display-name>JSTL core</display-name>
  10. <tlib-version>1.1</tlib-version>
  11. <!--标签库前缀 taglib指令中的prefix属性 -->
  12. <short-name>jxf</short-name>
  13. <!--tld文件的唯一标记 taglib指令中的uri属性 -->
  14. <uri>http://jxf.tag</uri>
  15.  
  16. <tag>
  17. <name>chooseTag</name>
  18. <tag-class>jxf.ChooseTag</tag-class>
  19. <body-content>scriptless</body-content>
  20. </tag>
  21. <tag>
  22. <description>
  23. 自定义的when标签
  24. </description>
  25. <name>whenTag</name>
  26. <tag-class>jxf.WhenTag</tag-class>
  27. <body-content>scriptless</body-content>
  28. <attribute>
  29. <description>
  30. when标签属性test
  31. </description>
  32. <!-- 标签处理器类中的必须要有对应的set方法,否则会报错,如此时对应的标签处理器类中应有getTest()方法。 -->
  33. <name>test</name>
  34. <!-- 该属性是否是必须的 ,true为必须的,false为非必须的-->
  35. <required>true</required>
  36. <!-- 该属性是否支持EL表达式 true支持,false不支持 -->
  37. <rtexprvalue>true</rtexprvalue>
  38. </attribute>
  39. </tag>
  40. <tag>
  41. <name>otherwiseTag</name>
  42. <tag-class>jxf.OtherwiseTag</tag-class>
  43. <body-content>scriptless</body-content>
  44. </tag>
  45. </taglib>

jsp代码

  1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
  2. <%@taglib uri="http://jxf.tag" prefix="jxf"%>
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5. <head>
  6. <title>模仿c标签库的choose,when,otherwise</title>
  7. </head>
  8. <body>
  9. <jxf:demoTag>标签体内容</jxf:demoTag>
  10. 标签体余下内容
  11. <br />
  12. <jxf:chooseTag>
  13. <jxf:whenTag test="${4>5}">
  14. 4>5是不输出的
  15. </jxf:whenTag>
  16. <jxf:whenTag test="${10>5}">
  17. 10>5是成立的
  18. </jxf:whenTag>
  19. <jxf:whenTag test="${9>5}">
  20. 9>5是成立的,但是不输出
  21. </jxf:whenTag>
  22. <jxf:otherwiseTag>
  23. 当条件都不成立时候输出(由于第二个提条件成立,故不应输出)
  24. </jxf:otherwiseTag>
  25. </jxf:chooseTag>
  26. </body>
  27. </html>

学会怎样使用Jsp 内置标签、jstl标签库及自定义标签的更多相关文章

  1. JSP标签:jsp内置标签、jstl标签、自定义标签

     一.jsp标签的分类: 1)内置标签(动作标签): 不需要在jsp页面导入标签 2)jstl标签: 需要在jsp页面中导入标签 3)自定义标签 : 开发者自行定义,需要在jsp页面导入标签    1 ...

  2. JSP内置标签 JSP中JavaBean标签 JSP开发模式 EL和JSTL快速入门

    2 JSP内置标签(美化+业务逻辑)   1)为了取代<%%>脚本形式,使用JSP标签/JSP动作,目的:与JSP页面的美化,即JSP面页都是由标签组成,不再有其它的内容   2)JSP内 ...

  3. JavaWeb之 JSP:内置对象,EL表达式,JSP标签基础

    JSP的内置对象 什么是JSP的内置对象呢? 在JSP页面进行编程的时候,如果我们要使用一些对象,如:HttpSession,ServletConfig,ServletContext这些对象,如果每次 ...

  4. JSP运行过程 JSP脚本 静态动态包含 jsp指令 jsp内置对象jsp四大作用域 jsp动作元素 EL表达式 JSTL 设计模式 JSP开发模式 EL内置对象

    Day38 JSP JSP的运行过程具体如下: (1)客户端发出请求,请求访问JSP文件. (2)JSP容器先将JSP文件转换成一个Java源文件(Java Servlet源程序),在转换过程中,如果 ...

  5. JSP--JSP语法--指令---九大隐式对象--四大域对象--JSP内置标签--JavaBean的动作元素--MVC三层架构

    一.JSP 原理:JSP其实就是一个servlet. Servlet负责业务逻辑处理,JSP只负责显示.开发中,JSP中不能有一行JAVA代码 二.JSP语法 1. JSP模板元素:JSP中HTML标 ...

  6. JSP--JSP语法--指令--include(动态包含/静态包含)--九大隐式对象--四大域对象--JSP内置标签--JavaBean的动作元素--MVC三层架构

    一.JSP 原理:JSP其实就是一个servlet. Servlet负责业务逻辑处理,JSP只负责显示.开发中,JSP中不能有一行JAVA代码 二.JSP语法 1.    JSP模板元素:JSP中HT ...

  7. jsp内置对象和el表达式

    九个内置对象 *out jsp的输出流,用来向客户端响应 *page 当前jsp页面, 它的引用数据类型是Object,即真身中有如下代码 Object page=this; *config 它对应真 ...

  8. Java遇见HTML——JSP篇之JSP内置对象(上)

    一.JSP内置对象简介 1.1.内置对象简介 JSP内置对象是WEB容器中创建的一组对象,可以直接使用不需要new,如截图中的out 对象. JSP有九大内置对象: 五大常用对象: out.reque ...

  9. 转:jsp内置对象中page与pageContext与el内置对象pageScope与pageContext区别

    原文地址:jsp内置对象中page与pageContext与el内置对象pageScope与pageContext区别 首先说明一下jsp9大内置对象 (1)HttpSession类的session对 ...

随机推荐

  1. HTTP Authorization

    谨以此文献给那些需要实现HTTP AUTH的“程序猿”们. 关于HTTP AUTH的文档不多. RFC在 http://www.ietf.org/rfc/rfc2617.txt wiki在 http: ...

  2. linearizing the depth in vertex shader

    please refer to http://www.mvps.org/directx/articles/linear_z/linearz.htm When using a programmable ...

  3. 【转载】zookeeper 分布式锁 实现

      agapple 基于zookeeper的分布式lock实现 博客分类: opensource java distributed   背景 继续上一篇文章:http://agapple.iteye. ...

  4. books

    <<learning opencv>>,   布拉德斯基 (Bradski.G.) (作者), 克勒 (Kaehler.A.) (作者),   这本书一定要第二版的,因为第二版 ...

  5. 从Spark-Shell到SparkContext的函数调用路径过程分析(源码)

     不急,循序渐进,先打好基础 Spark shell的原理 首先,我们清晰定位找到这几个. 1.spark-shell 2. spark-submit 3.spark-class  4.SparkSu ...

  6. radix树

    今天在学Linux内核页高速缓存时,学到了一种新的数据结构radix树(基数),经过分析,感觉此数据结构有点鸡肋,有可能是我理解不到位吧. 先来张图,给大家以直观的印象 当有一个key-value型的 ...

  7. HttpURLConnection的流式输出的缺陷和解决方法

    转自:http://www.mzone.cc/article/198.html 最近在用applet写文件上传控件的时候发现使用URLConnection来对服务器进行流式输出时的一些问题.我们通常要 ...

  8. NIO组件Selector工作机制详解(下)

    转自:http://blog.csdn.net/haoel/article/details/2224069 五.  迷惑不解 : 为什么要自己消耗资源? 令人不解的是为什么我们的Java的New I/ ...

  9. Eclipse中修改SVN用户名和密码方法[转]

    由于在svn 的界面中并没有为我们提供直接更换用户名密码的地方,所以一旦我们需要更换用户名的就需要自己想一些办法. 解决方案: 在Eclipse 使用SVN 的过程中大多数人往往习惯把访问SVN 的用 ...

  10. android 62 手机存储目录的划分

    android下应用程序的路径和javase不同,应用程序的数据要保存自己的文件夹里面 > > getFileDir(); 获取自己的文件夹 /data/data/包名(应用程序的名字)/ ...