zoukankan      html  css  js  c++  java
  • Jsp学习笔记

    一.什么是JSP
        JSP(Java Server Pages),它和Servlet技术一样,都是sun公司定义的一种用于开发动态web页面(资源)的技术.
        ·写JSP虽然就像是在写html,但Jsp技术允许在页面中编写java代码,并且允许开发人员在页面中获取request、response等web开发常用对象,实现与浏览器的交互,所以jsp也是一种动态web资源的开发技术。
        几个问题
        ·浏览器访问jsp页面时,Web服务器是如何调用并执行一个jsp页面的
        ·Web服务器在执行jsp页面时,是如何把jsp页面中的html排版标签输出给浏览器的
        ·Jsp页面中的java代码服务器是如何执行的
        ·Web服务器在调用jsp时,会给jsp提供一些什么java对象

    二.JSP最佳实践
        不管是JSP还是Servlet,虽然都可以用于开发动态web资源,但由于这两门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用,其原因是,程序的数据通常要美化后再输出.
        ·让jsp既用java代码产生动态数据,又做美化会导致页面难以维护
        ·让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护.
        ·因此最好的办法就是根据这两门技术的特点,让它们各自负责各自的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做.

    三.JSP语法
        JSP语法包含的内容:模板元素、表达式、脚本片段、注释、指令、标签、内置对象等等

    1.JSP模板元素
        ·JSP页面中的HTML内容称之为JSP模板元素.
        ·JSP模板元素定义了网页的基本骨架,即定义了页面的结构和外观
    2.JSP表达式
        ·JSP表达式(expression)用于将程序数据输出到客户端
          语法:  <%= 变量或表达式 %>
          举例: 当前时间 <%= new java.util.Date() %>
        ·JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(...)将数据输出给客户端.
        ·JSP脚本表达式中的变量或表达式后面不能有分号(;).
    3.JSP脚本片段
        ·JSP脚本片段(scriptlet)用于在JSP页面中编写多行Java代码,语法:
           <%
              多行java代码
           %>
        ·注意: JSP脚本片段中只能出现java代码,不能出现其它模板元素,JSP引擎在翻译JSP页面时,会将JSP脚本片段中的java代码原封不动地放到Servlet的_jspService方法中.
        ·JSP脚本片段中的Java代码必须严格遵循Java语法,例如,每执行语句后面必须用分号(;)结束.
        ·在一个JSP页面中可以有多个脚本片段,在两个或多个脚本片段之间可以嵌入文本、HTML标记和其他JSP元素。例如
          <%
             int x = 10;
             out.println(x);
          %>
          <p>这是JSP页面文本</p>
          <%
             int y = 20;
             out.println(y);
          %>
        ·多个脚本片段中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。如: out.println(x);
        ·单个脚本片段中的java语句可以是不完整的,但是,多个脚本片段组合后的结果必须是完整的java语句.
        JSP声明--在JSP中定义方法
        ·JSP页面中编写的所有代码,默认会翻译到servlet的service方法中,而Jsp声明中的java代码被翻译到_jspService方法的外面。语法:
          <%!
            java代码
          %>
        ·所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法。
        ·多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。
        ·JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。
    4.JSP注释
        ·注释格式: <%-- 注释信息 --%>,不同于html注释:<!-- 注释信息 -->。
        ·JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。

    5.JSP指令
        ·JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。在JSP2.0规范中共定义了三个指令:
           page指令、include指令、taglib指令
        ·JSP指令的基本语法格式:
           <%@ page contentType="text/html;charset=gb2312" %>
        ·如果一个指令有多个属性,这多个属性可以写在一个指令中,也可以分开写。例如:
           <%@ page contentType="text/html;charset=gb2312" %>
           <%@ page import="java.util.Date" %>
          也可以写为:
           <%@ page contentType="text/html;charset=gb2312" import="java.util.Date" %>

        ·page指令:
            ·page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面.
              为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置.
            ·JSP2.0规范中定义的page指令的完整语法:
              <%@ page
                  [ language="java" ]
                  [ extends="package.class" ]
                  [ import="{package.class | package.*}, ..." ]
                  [ session="true | false" ]
                  [ buffer="none | 8kb |sizekb" ]
                  [ autoFlush="true | false" ]
                  [ isThreadSafe="true | false" ]
                  [ info="text" ]
                  [ errorPage="relative_url" ]
                  [ isErrorPage="true | false" ]
                  [ contentType="mimeType[;charset=characterSet]" | "text/heml;charset=ISO-8859-1" ]
                  [ pageEncoding="characterSet | ISO-8859-1" ]
                  [ isELIgnored="true | false" ]
              %>
            ·可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号分隔:
                <%@ page import="java.util.Date,java.sql.*,java.io.*" %>
              上面的语句也可以改写为使用多条page指令的import属性来分别引入各个包或类:
                <%@ page import="java.util.Date" %>
                <%@ page import="java.sql.*" %>
                <%@ page import="java.io.*" %>
            ·JSP引擎会自动导入以下包:
                java.lang.*
                javax.servlet.*
                javax.servlet.jsp.*
                javax.servlet.http.*
            ·errorPage属性的设置值必须使用相对路径,如果以"/"开头,表示相对于当前Web应用程序的根目录(注意不时站点根目录),否则,表示相对于当前页面.
            ·可以在web.xml文件中使用<error-page>元素为整个Web应用程序设置错误处理页面.
              其中的<exception-type>子元素指定异常类的完全限定名.
              <location>元素指定以"/"开头的错误处理页面的路径.

        ·include指令:
            ·include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet,所以include指令引入通常称之为静态引入.
            ·语法: <%@ include file="relativeURL" %>
              其中的file属性用于指定被引入文件的路径,路径以"/"开头,代表当前web应用.
            ·被引入的文件必须遵循JSP语法
              被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理JSP页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
              由于使用include指令将会涉及到两个JSP页面,并会把两个JSP翻译成一个servlet,所以这两个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。

    6.JSP标签
        ·JSP标签也称之为JSP Action(JSP动作)元素,它用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
        ·JSP常用标签
            ·<jsp:include>标签
               语法: <jsp:include page="relativeURL | <%=expression%>" flush="true|false"/>
               page属性用于制定被引入资源的相对路径,它也可以通过执行一个表达式来获得
               flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。
               <jsp:include>标签是动态引入,<jsp:include>标签涉及到的两个JSP页面会被翻译成两个servlet,这两个servlet的内容在执行时进行合并.
               而include指令是静态引入,涉及到的两个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。
               不管是<jsp:include>标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档.
            ·<jsp:forward>标签
               语法: <jsp:forward page="relativeURL | <%=expression%>"/>
            ·<jsp:param>标签
               当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给其它资源时,可以使用<jsp:param>标签向这个资源传递参数。
               语法1:
                 <jsp:include page="relativeURL | <%=expression%>">
                    <jsp:param name="parameterName" value="parameterValue|<%=expression%>">
                 </jsp:include>
               语法2:
                 <jsp:forward page="relativeURL | <%=expression%>">
                    <jsp:param name="parameterName" value="parameterValue|<%=expression%>">
                 </jsp:include>
               <jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值,在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。

    7.JSP九大隐式对象
        JSP运行原理
        ·每个JSP页面在第一次被访问时,Web容器都会把请求交给JSP引擎(即一个Java程序)去处理,JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet),然后按照servlet的调用方式进行调用.
        ·由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不会再翻译,而是直接调用,所以程序的执行效率不会受到影响。
        ·JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用,JSP技术的设计者为方便开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。

        九大隐式对象:
        ·Request
        ·Response
        ·Session
        ·Application
        ·Config
        ·Page
        ·Out
        ·Exception
        ·pageContext

        out隐式对象
        ·out隐式对象用于向客户端发送文本数据
        ·out对象是通过调用pageContext对象的getOut方法返回的,其作用与用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
        ·JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存.
        ·只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才会调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中.
            ·设置page指令的buffer属性关闭了out对象的缓存功能
            ·out对象的缓冲区已满
            ·整个JSP页面结束

        pageContext隐式对象
        ·pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境.
            ·这个对象封装了对其它8大隐式对象的引用。获取隐式对象,可以用在自定义标签开发技术里面。
            ·它自身还是一个域对象,可以用来保存数据.
            ·这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其它资源,检索其它域对象中的属性等.
        ·通过pageContext获得其他对象
            ·getException方法返回exception隐式对象
            ·getPage方法返回page隐式对象
            ·getRequest方法返回request隐式对象
            ·getResponse方法返回response隐式对象
            ·getServletConfig方法返回config隐式对象
            ·getServletContext方法返回application隐式对象
            ·getSession方法返回session隐式对象
            ·getOut方法返回out隐式对象
            ·pageContext封装其它8大内置对象的意义: 获取隐式对象,可以用在自定义标签开发技术里面。
        ·pageContext作为域对象
            ·pageContext对象的方法
                public void setAttribute(java.lang.String name,java.lang.object value)
                public java.lang.Object getAttribute(java.lang.String name)
                public void removeAttribute(java.lang.String name)
            ·pageContext对象还封装了访问其它域的方法
                public java.lang.Object getAttribute(java.lang.String name,int scope)
                public void setAttribute(java.lang.String name,java.lang.Ojbect value,int scope)
                public void removeAttribute(java.lang.String name,int scope)
            ·代表各个域的常量
                PageContext.APPLICATION_SCOPE
                PageContext.SESSION_SCOPE
                PageContext.REQUEST_SCOPE
                PageContext.PAGE_SCOPE
            ·查找各个域中的属性 findAttribute方法 (重点)
        ·引入和跳转到其他资源
            ·PageContext类中定义了一个forward方法和两个include方法来分别简化和替代RequestDispatcher.forward方法和include方法。
            ·方法接收的资源如果以"/"开头,"/"代表当前web应用。

    8.映射JSP
        配置web.xml文件
        <servlet>
           <servlet-name>SimpleJspServlet</servlet-name>
           <jsp-file>/jsp/simple.jsp</jsp-file>
           <load-on-startup>1</load-on-startup>
        </servlet>
        ...
        <servlet-mapping>
           <servlet-name>SimpleJspServlet</servlet-name>
           <url-pattern>/xxx/yyy.html</jsp-file>
        </servlet-mapping>

    四.JavaBean与JSP.
    1.关于JavaBean
        JavaBean是一个遵循特定写法的Java类,它通常具有如下特点:
        ·这个java类必须具有一个无参的构造函数
        ·属性必须私有化
        ·私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
        JavaBean在JavaEE开发中,通常用于封装数据,对于遵循以上写法的JavaBean组件,其它程序可以通过反射技术实例化JavaBean对象,并且通过反射那些遵守命名规范的方法,从而获知JavaBean的属性,进而调用其属性保存数据。

    2.在JSP中使用JavaBean
        JSP提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别是:
        ·<jsp:useBean>标签: 用于在JSP页面中查找或实例化一个JavaBean组件.
        ·<jsp:setProperty>标签: 用于在JSP页面中设置一个JavaBean组件的属性.
        ·<jsp:getProperty>标签: 用于在JSP页面中获取一个JavaBean组件的属性.

    3.<jsp:useBean>标签
        <jsp:useBean>标签用于在指定的域范围内查找指定名称的JavaBean对象:
        ·如果存在则直接返回该JavaBean对象的引用.
        ·如果不存在则实例化一个新的JavaBean对象,并将它以指定的名称存储到指定的域范围中。
        常用语法:
        <jsp:useBean id="beanName" class="package.class" scope="page|request|session|application" />
        ·id属性用于指定JavaBean实例对象的引用名称和存储在域范围中的名称.
        ·class属性用于指定JavaBean的完整类名(即必须带有包名).
        ·scope属性用于指定JavaBean实例对象所存储的域范围,其取值只能是page、request、session和application四个值中的一个,其默认值是page.
        带标签体的<jsp:useBean>标签
          <jsp:useBean ...>
             Body
          </jsp:useBean>
        ·Body部分的内容只有在<jsp:useBean>标签创建JavaBean的实例对象时才执行.

    4.<jsp:setProperty>标签
        <jsp:setProperty>标签用于设置和访问JavaBean对象的属性。
        语法格式:
        <jsp:setProperty name="beanName"
        {
           property="propertyName" value="{string|<%=expression%>}"|
           property="propertyName" [param="parameterName"]|
           property="*"
        }/>
        ·name属性用于指定JavaBean对象的名称.
        ·property属性用于指定JavaBean实例对象的属性名.
        ·value属性用于指定JavaBean对象的某个属性的值,value的值可以是字符串,也可以是表达式,为字符串时,该值会自动转化为JavaBean属性相应的类型,如果value的值是一个表达式,那么该表达式的计算结果必须与所要设置的JavaBean属性的类型一致.
        ·param属性用于将JavaBean实例对象的某个属性值设置为一个请求参数值,该属性值同样会自动转换成要设置的JavaBean属性的类型.

    五.JSP开发模式.
        SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式.
        ·JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用程序,这种模式下,JavaBean用于封装业务数据,JSP即负责处理用户请求,又显示数据.
        ·Servlet+JSP+JavaBean模式是模式MVC模式,适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。这种模式程序各个模块之间层次清晰,web开发推荐采用此种模式。
        MVC模式(Model View Controller)
        ·Model      -- JavaBean
        ·View       -- JSP
        ·Controller -- Servlet
        Web开发的三层结构:
        ·Web层: 包括 浏览器、Servlet、JSP
        ·业务逻辑层(service层): 包括 service、javabean
        ·数据访问层(dao层): 包括 dao、db

    六.EL表达式和JSTL标签
        EL表达式的应用
        ·EL表达式用于获取数据,在JSP页面中可以使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象中获取对象,如果域对象不存在标识符所对应的对象,则返回结果为""(注意,不是null).
          示例: 使用EL表达式获取request、session、application域中的数据   ${data}
        ·EL表达式中也可以使用${customerBean.address}的形式来访问JavaBean对象的属性.
          示例: 使用EL表达式获取Bean属性   ${person.name}
        ·结合JSTL标签,EL表达式也可轻松获取各种集合中的元素
          示例: 使用EL表达式获取List、Map集合中的元素  ${list[1].name}  ${map1.aa.name}  ${map1.['111'].name}
        ·EL表达式也可以使用类如${1==1}的形式进行简单的逻辑判断.
        ·得到web应用的名称: ${pageContext.request.contextPath}

        JSTL标签库
        ·JSTL是sun公司开发的一套标签库,使用JSTL可以在页面中实现一些简单的逻辑,从而替换页面中的脚本代码.
        ·在页面中使用JSTL标签需完成以下两个步骤:
           ·导入jstl.jar和standerd.jar这两个jstl的jar文件.
           ·在JSP页面中使用<%@ tablib url="" prifix="" %>元素导入标签库.
        ·JSTL标签库中常用标签:
           <c:foreach var="" items="">
           <c:if test="">
           使用JSTL标签迭代获取集合元素
           <c:foreach var="entry" items="${map}">
              ${entry.key} : ${entry.value.name} <br/>
           </c:foreach>

    七.自定义标签
        自定义标签主要用于移除jsp页面中的java代码.
        要使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤:
        ·编写一个实现Tag接口的Java类,把页面java代码移到这个java类中(标签处理器类)。
        ·编写标签库描述符(tld)文件,在tld文件中对标签处理器类描述成一个标签。

        自定义标签入门:
        ·编写一个实现tag接口的java类.
          public class ViewIPTag extends TagSupport {
             @Override
             public int doStartTag() throws JspException {
                HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();
                JspWriter out = this.pageContext.getOut();
                String ip = request.getRemoteAddr();
                try{
                   out.print(ip);
                } catch (IOException e){
                   throw new RuntimeException(e);
                }
                return super.doStartTag();
             }
          }
        ·在tld文件中对标签处理器类进行描述(tld文件的位置:WEB-INF下,例如文件可以取名libhost)
     <?xml version="1.0" encoding="UTF-8" ?>
     <taglib 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-jsptaglibrary_2_0.xsd"
         version="2.0">
         <description>A tag library exercising SimpleTag handlers.</description>
         <tlib-version>1.0</tlib-version>
         <short-name>SimpleTagLibrary</short-name>
         <uri>http://www.company.com</uri>
         <tag>
      <description>Display IP Address</description>
      <name>viewIP</name>
      <tag-class>com.company.web.Tag.ViewIPTag</tag-class>
      <body-content>empty</body-content>
         </tag>
     </taglib>
        ·jsp页面中引用自定义标签
          <%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>
          <%@taglib uri="http://www.company.com" prefix="libhost" %>
          <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
          <html>
             <head>
                <title>JSP</title>
             </head>
             <body>
                您的ip是:  <libhost:viewIP/>
             </body>
          </html>

        自定义标签调用过程:
        ·浏览器向web服务器发请求
        ·web服务器调用jsp/servlet
        ·遇到自定义标签,首先实例化标签对应的标签处理器类.
        ·调用setPageContext方法,把页面的pageContext对象传递给标签处理器类.
        ·看标签是否有父标签,如果有父标签,则把父标签作为一个对象,调用setParent方法传递给标签处理器类,如果没有,传一个null.
        ·完成以上标签的初始化工作后,服务器就开始执行标签,这时遇到标签的开始标签,就调用doStartTag方法.
        ·如果标签有标签体,这时服务器一般会执行标签体.
        ·服务器遇到jsp页面结束标签,则调用标签处理器类的doEndTag方法.
        ·这个标签执行完后,服务器一般情况会调用release()方法释放标签工作时所占用的资源.
        ·服务器接着再执行标签余下的jsp页面.

        Tag接口的执行流程:
        JSP引擎将遇到自定义标签时,首先创建标签处理器类的实例对象,然后按照JSP规范定义的通信规则依次调用它的方法.
        ·public void setPageContext(PageContext pc), JSP引擎实例化标签处理器后,将调用setPageContext方法将JSP页面的pageContext对象传递给标签处理器,标签处理器以后可以通过这个pageContext对象与JSP页面进行通信.
        ·public void setParent(Tag t),  setPageContext方法执行完后,web容器接着调用setParent方法将当前标签的父标签传递给当前标签处理器,如果当前标签没有父标签,则传递给setParent方法的参数值为null.
        ·public int doStartTag(), 调用了setPageContext方法和setParent方法后,web容器执行到自定义标签的开始标记时,就会调用标签处理器的doStartTag方法.
        ·public int doEndTag(), web容器执行完自定义标签的标签体后,就会接着去执行自定义标签的结束标记,此时,web容器会去调用标签处理器的doEndTag方法.
        ·public void release(), 通常web容器执行完自定义标签后,标签处理器会驻留在内存中,为其它请求服务,直至停止web应用时,web容器才会调用release方法.

        自定义标签功能扩展
        ·开发人员在编写jsp页面时,经常还需要在页面中引入一些逻辑,例如:
           ·控制jsp页面中某一部分内容是否执行.
           ·控制整个jsp页面是否执行.
           ·控制jsp页面内容重复执行.
           ·修改jsp页面内容输出.
        ·自定义标签除了可以移除jsp页面java代码外,它也可以实现以上功能.
        ·tld文件中的4种标签体类型
           ·EMPTY JSP scriptless tagdepentend

        简单标签(SimpleTag接口,SimpleTagSupport实现类)
        ·doTag()
        ·getParent()
        ·setJspBody(JspFragment jspBody)
        ·setJspContext(JspContext pc)
        ·setParent(JspTag parent)
        简单标签的tld文件标签体<body-content>设为scriptless.

        简单标签调用过程:
        ·浏览器向web服务器发请求
        ·web服务器调用jsp/servlet
        ·遇到简单标签,实例化标签处理器类.
        ·调用setJspContext,把页面pageContext传递给标签处理器类.
        ·调用setParent把父标签传递进去,如果没有父标签,传null.
        ·调用setJspBody方法,把封装了标签体JspFragment传递给标签处理器类.
        ·执行页面中的自定义标签,实际上就是调用doTag方法.
        ·标签执行完成.

        开发带属性的标签
        ·自定义标签可以定义一个或多个属性,这样,在JSP页面中应用自定义标签时就可以设置这些属性的值,通过这些属性为标签处理器传递参数信息,从而提高标签的灵活性和复用性.
        ·要想让一个自定义标签具有属性,通常需要完成两个任务:
           ·在标签处理器中编写每个属性对应的set方法
           ·在TLD文件中描述标签的属性
        ·为自定义标签定义属性时,每个属性都必须按照JavaBean的属性命名方式,在标签处理器中定义属性名对应的set方法,用来接受JSP页面调用自定义标签时传递来的属性值,例如属性url,在标签处理器类中就要定义相应的setUrl(String url)方法.
        ·在标签处理器中定义相应的set方法后,JSP引擎在解析执行开始标签时,也就是调用doStartTag方法前,会调用set属性方法,为标签设置属性.
        ·在tld中描述标签的属性attribute
           ·description: 用于制定属性的描述信息
           ·name: 用于指定属性的名称,必须指定,属性名称是大小写敏感的,并且不能以jsp、_jsp、java和sun开头.
           ·required: 用于指定在JSP页面中调用自定义标签时是否必须设置这个属性,其取值包括true和false,默认为false.
           ·rtexprvalue: 是runtime expression value(运行时表达式)的英文简写,用于指定属性值是一个静态值或动态值,其取值包括true和false,默认false.
                          静态值只能为该指定静态文本值,如"123",动态值可以为该属性指定一个JSP动态元属,其结果作为属性值,如JSP表达式<%=value %>
           ·type: 用于指定属性值的Java类型.

        自定义标签控制页面逻辑案例:
        ·开发防盗链标签
        ·开发<c:if>标签
        ·开发<c:if><c:else>标签
        ·开发迭代标签
        ·开发html转义标签
        ·打包标签库

    八.JSTL标签库
        sun公司jstl标签库包含以下内容:
        ·核心标签库: 在META-INF/c.tld文件中描述
        ·国际化标签: 在META-INF/fnt.tld文件中描述
        ·数据库标签(实际开发不需要了): 在META-INF/sql.tld文件中描述
        ·XML标签(实际开发不需要了): 在META-INF/x.tld文件中描述
        ·JSTL函数(EL函数): 在META-INF/fn.tld文件中描述

        核心标签库:
        ·<c:out>标签: 用于输出一段文本内容到pageContext对象当前保存的"out"对象中(将输出到浏览器),有以下属性
           value: Object类型,指定要输出的内容
           cscapcXml: Boolean类型,指定是否将>、<、&、'、"等特殊字符进行HTML编码转换后再输出,默认为true
           default: Object,指定如果value属性的值为null时所输出的默认值.
        ·<c:set>标签: 用于把某个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性.
           value: Object类型,指定属性值
           var: String类型,指定要设置的Web域属性的名称.
           scope: String类型,指定属性所在的Web域.
           target: Object类型,用于指定要设置属性的对象,这个对象必须是JavaBean对象或java.util.Map对象.
           property: String类型,用于指定当前要为对象设置的属性名称.
        ·<c:remove>标签: 用于删除各种Web域中的属性.
           语法格式:  <c:remove var="varName" [scope="page|request|session|application"]/>
        ·<c:catch>标签: 用于捕获嵌套在标签体中的内容抛出的异常
           语法格式: <c:catch [var="varName"]>nested actions</c:catch>
           var: var属性用于标识<c:catch>标签捕获的异常对象,它将保存在page这个Web域中.
           <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
           <%@ page contentType="text/heml;charset=gb2312" %>
           <c:catch var="myex" scope="page">
              <%
                  10/0;
              %>
           </c:catch>
           异常: <c:out value="${myex}"/>${myex}<br/>
           异常:myex.getMessage: <c:out value="${myex.message}"/><br/>
           异常:myex.getCause: <c:out value="${myex.cause}"/><br/>
           异常:myex.getStackTrace: <c:out value="${myex.stackTrace}"/><br/>
        ·<c:if>标签: 可以构造简单的"if-then"结构的条件表达式
           test: boolean类型,决定是否处理标签体中的内容的条件表达式.
           var:  String类型,用于指定将test属性的执行结果保存到某个Web域中的某个属性的名称.
           scope: String类型,指定将test属性的执行结果保存到哪个Web域中.
        ·<c:choose>标签: 用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用.可以构造类似"if-else if-else"的复杂条件判断结构.
           <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
           <%@ page contentType="text/heml;charset=gb2312" %>
           <c:set value="${param.count}" var="count" />pageContext(count,2)
           <c:choose>
              <c:when test="${count==0}">
                 没有符合要求的记录.
              </c:when>
              <c:otherwise>
                 符合要求的记录共有${count}条
              </c:otherwise>
           </c:choose>
        ·<c:forEach>标签: 用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容.
           var: String类型,指定将当前迭代到的元素保存到page这个Web域中的属性名称
           varstatus: String类型,记住用于保存迭代信息的对象
           items: 任何支持的类型,将要迭代的集合对象
           begin: int类型,如果制定items属性,就从集合中的第begin个元素开始进行迭代,begin的索引值从0开始,如果没有指定items属性,就从begin指定的值开始迭代,直到end值时结束迭代.
           end: int类型
           step: int类型,指定迭代的步长,即迭代因子的迭代增量.
        ·<c:param>标签:
           在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数,<c:param>标签可以嵌套在<c:import>、<c:url>或<c:redirect>标签内,为这些标签所使用的URL地址附加参数.
           <c:param>标签在为一个URL地址附加参数时,将自动对参数值进行URL编码,例如,如果传递的参数值为"中国",则将其转换为"%d6%d0%b9%fa"后再附加到URL地址后面,这也就是使用<c:param>标签的最大好处.
           例:<c:param name="name" value="value" />
        ·<c:url>标签: 用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写,URL重写就是将会话标识
           value: String类型,指定要构造的URL.
           var: String类型,指定将构造出的URL结果保存到Web域中的属性名称
           scop: String类型,指定将构造出的URL结果保存到哪个Web域中.
           <c:url>标签与<c:param>标签例子:
           <c:url var="index" value="/index.jsp">
               <c:param name="name" value="中国"></c:param>
           </c:url>
        ·<c:redirect>标签: 用于实现请求重定向
           url: String类型,指定要转发或重定向到的目标资源的URL地址.
           context: String类型,当要使用相对路径重定向到同一个服务器下的其他Web应用程序中的资源时,context属性指定其他Web应用程序的名称.

  • 相关阅读:
    linux docker常用命令
    angular input输入框自动消除前后空格
    angular 一览数据全选符合条件数据
    linux MySQL出现错误的一些常见解决办法
    linux crontab定时任务一些命令
    Linux下定时访问指定url地址
    直接打印对象的结果
    java中变量的作用域
    请求转发后地址栏显示传入的值,页面不显示的原因
    String不是基本数据类型,但是
  • 原文地址:https://www.cnblogs.com/lichone2010/p/3356009.html
Copyright © 2011-2022 走看看