JSP自定义标签详细
- 格式:doc
- 大小:101.50 KB
- 文档页数:14
jsp⾃定义标签中的Function函数在taglib中我们发现有⼀个标签叫做<function>,这次简单介绍<function>标签的基本⽤法,<function>标签可以做什么呢?它可以让我们在jsp⽤直接调⽤某个⽅法,根据⾃定义的⽅法返回指定的值,兼容jstl标签,省去了在jsp中直接使⽤<%!%>来定义⽅法体再调⽤的繁琐.如果你⽤过el语⾔的话估计会很快上⼿,其实<function>标签就是⼀个拥有⽅法体的el语⾔.注意:function所定义的⽅法必须需要是静态的,如果不是静态的话jstl是不能识别所定义的⽅法.Java代码如下:package org.lxh.taglib;import java.util.List;public class FunctionTag {public static String hello(String name) {return name;}public static Integer bbq(List list) {return list.size();}}⽅法必须静态,可以定义有返回值或者void类型的⽅法.tld:<?xml version="1.0" encoding="UTF-8" ?><taglib xmlns="/xml/ns/j2ee" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee /xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"version="2.0"><tlib-version>1.0</tlib-version><short-name>my</short-name><uri></uri><function><!--EL页⾯调⽤名字--><name>hello</name><!--指定标签的处理类,指定了标签由哪个Java类来处理。
一、概述JSP中有一块重要的技术:自定义标签(Custom Tag),最近这几天在学习Struts的时候发现Struts中使用了很多自定义标签,如html、bean等。
所以我就做了个简单的试验,学习一下这种技术。
首先介绍一下这种技术吧!1.优点:取代了JSP中的Java程序,并且可以重复使用,方便不熟悉Java编程的网页设计人员。
2.开发流程:(1)编写JSP,在JSP中使用自定义标签。
(2)在web.xml中指定JSP中使用的标签的.tld(标签库描述文件)文件的位置。
(3) .tld文件中指定标签使用的类。
3. 自定义标签的分类:(1)简单标签:如< mytag:helloworld/>(2)带属性标签:如<imytag:checkinput dbname = “<myBean.getDBName()>”/>(3)带标签体的标签:在自定义标签的起始和结束标签之间的部分为标签体(Body)。
Body的内容可以是JSP中的标准标签,也可以是HTML、脚本语言或其他的自定义标签。
<mytag:che ckinput dbname = “<myBean.getDBName()>”><mytag:log message=”Table Name”><mytag:checkinput />(4)可以被Script使用的标签:定义了id和type属性的标签可以被标签后面的Scriptlet使用。
<mytag:connection id = “oraDB” type = “DataSource” name = “Oracle”><%oraDB.getConnection(); %>4.接口及其他实际上,自定义标签的处理类实现了Tag Handler对象。
JSP技术在javax.servlet.jsp.tagext中提供了多个Tag Handler 接口,JSP1.2中定义了Tag、BodyTag、IterationTag接口,在JSP2.0中新增了SimpleTag接口。
一、Include指令<jsp:include>标签表示包含一个静态的或者动态的文件。
语法:<jsp:include page="path" flush="true" />or<jsp:include page="path" flush="true"><jsp:param name="paramName" value="paramValue" /></jsp:include>注:1、page="path" 为相对路径,或者代表相对路径的表达式。
2、flush="true" 必须使用flush为true,它默认值是false。
3、<jsp:param>子句能让你传递一个或多个参数给动态文件,也可在一个页面中使用多个<jsp:param> 来传递多个参数给动态文件。
二、Forward指令<jsp:forward>标签表示重定向一个静态html/jsp的文件,或者是一个程序段。
语法:<jsp:forward page="path"} />or<jsp:forward page="path"} ><jsp:param name="paramName" value="paramValue" />……</jsp:forward>注:1、page="path" 为一个表达式,或者一个字符串。
2、<jsp:param> name 指定参数名,value指定参数值。
参数被发送到一个动态文件,参数可以是一个或多个值,而这个文件却必须是动态文件。
Jsp详解1.简介2.Jsp的运行原理3.Jsp的语法1.Jsp模板元素2.Jsp中的脚本表达式3.Jsp中的脚本片段4.Jsp的声明5.Jsp注释6.Jsp指令1.首先我们来看一下page指令的用法2.下面在来看一下include指令3.最后来看一下taglib指令7.Jsp中内置的9个隐式对象8.JSP标签库1.jspinclude标签2.jspforward标签3.jspparam或者jspparams标签4.jspuseBean标签jspsetProperty标签jspgetProperty标签9.Jsp中怎么排查错误简介:JSP全称是JavaServer Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
JSP这门技术的最大的特点在于,写jsp就像在写html,但:它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
相比servlet而言,servlet很难对数据进行排版,而jsp除了可以用java代码产生动态数据的同时,也很容易对数据进行排版。
不管是JSP还是Servlet,虽然都可以用于开发动态web资源。
但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。
其原因为,程序的数据通常要美化后再输出:让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。
让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。
因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。
Jsp的运行原理:目标:Web服务器是如何调用并执行一个jsp页面的?Jsp页面中的html排版标签是如何被发送到客户端的?Jsp页面中的java代码服务器是如何执行的?Web服务器在调用jsp时,会给jsp提供一些什么java对象?思考:JSP为什么可以像servlet一样,也可以叫做动态web资源的开发技术?其实Jsp就是一个Servlet,所以我们要先介绍Servlet的相关技术,当我们第一次访问Jsp 的时候,Jsp引擎都会将这个Jsp翻译成一个Servlet,这个文件存放在Tomcat中的work目录中,这里,我们新建一个MyJsp.jsp页面,然后访问以下,我们看一下翻译后的源码:1.<%@ page language="java"import="java.util.*"pageEncoding="utf-8"%>2.3.<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML4.01 Transitional//EN">4.<html>5.<head>6.7.<title>My JSP 'MyJsp.jsp' starting page</title>8.9.</head>10.11.<body>12. This is my JSP page. <br>13.</body>14.</html>1.package org.apache.jsp;2.3.import javax.servlet.*;4.import javax.servlet.http.*;5.import javax.servlet.jsp.*;6.import java.util.*;7.8.public final class MyJsp_jsp extends org.apache.jasper.runtime.HttpJspBase9.implements org.apache.jasper.runtime.JspSourceDependent {10.11.private static final JspFactory _jspxFactory = JspFactory.getDefaultFactory();12.13.private static java.util.List _jspx_dependants;14.15.private javax.el.ExpressionFactory _el_expressionfactory;16.private org.apache.AnnotationProcessor _jsp_annotationprocessor;17.18.public Object getDependants() {19.return _jspx_dependants;20. }21.22.public void _jspInit() {23. _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();24. _jsp_annotationprocessor = (org.apache.AnnotationProcessor) getServletConfig().getServletContext().getAttribute(org.apache.AnnotationProcessor.class .getName());25. }26.27.public void _jspDestroy() {28. }29.30.public void _jspService(HttpServletRequest request, HttpServletResponse response)31.throws java.io.IOException, ServletException {32.33. PageContext pageContext = null;34. HttpSession session = null;35. ServletContext application = null;36. ServletConfig config = null;37. JspWriter out = null;38. Object page = this;39. JspWriter _jspx_out = null;40. PageContext _jspx_page_context = null;41.42.43.try {44. response.setContentType("text/html;charset=utf-8");45. pageContext = _jspxFactory.getPageContext(this, request, response,46.null, true, 8192, true);47. _jspx_page_context = pageContext;48. application = pageContext.getServletContext();49. config = pageContext.getServletConfig();50. session = pageContext.getSession();51. out = pageContext.getOut();52. _jspx_out = out;53.54. out.write("\r\n");55. out.write("\r\n");56. out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");57. out.write("<html>\r\n");58. out.write(" <head>\r\n");59. out.write(" \r\n");60. out.write(" <title>My JSP 'MyJsp.jsp' starting page</title>\r\n");61. out.write(" \r\n");62. out.write(" </head>\r\n");63. out.write(" \r\n");64. out.write(" <body>\r\n");65. out.write(" This is my JSP page. <br>\r\n");66. out.write(" </body>\r\n");67. out.write("</html>\r\n");68. } catch (Throwable t) {69.if (!(t instanceof SkipPageException)){70. out = _jspx_out;71.if (out != null && out.getBufferSize() != 0)72.try { out.clearBuffer(); } catch (java.io.IOException e) {}73.if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);74. }75. } finally {76. _jspxFactory.releasePageContext(_jspx_page_context);77. }78. }79.}我们看到,这个类继承了org.apache.jasper.runtime.HttpJspBase,要想看到这个类的源码,我1./*2. * Licensed to the Apache Software Foundation (ASF) under one or more3. * contributor license agreements. See the NOTICE file distributed with4. * this work for additional information regarding copyright ownership.5. * The ASF licenses this file to You under the Apache License, Version 2.06. * (the "License"); you may not use this file except in compliance with7. * the License. You may obtain a copy of the License at8. *9. * /licenses/LICENSE-2.010. *11. * Unless required by applicable law or agreed to in writing, software12. * distributed under the License is distributed on an "AS IS" BASIS,13. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.14. * See the License for the specific language governing permissions and15. * limitations under the License.16. */17.18.package org.apache.jasper.runtime;19.20.import java.io.IOException;21.22.import javax.servlet.ServletConfig;23.import javax.servlet.ServletException;24.import javax.servlet.http.HttpServlet;25.import javax.servlet.http.HttpServletRequest;26.import javax.servlet.http.HttpServletResponse;27.import javax.servlet.jsp.HttpJspPage;28.import javax.servlet.jsp.JspFactory;29.30.import piler.Localizer;31.32./**33. * This is the super class of all JSP-generated servlets.34. *35. * @author Anil K. Vijendran36. */37.public abstract class HttpJspBase38.extends HttpServlet39.implements HttpJspPage40.41.42.{43.44.protected HttpJspBase() {45. }46.47.public final void init(ServletConfig config)48.throws ServletException49. {50.super.init(config);51. jspInit();52. _jspInit();53. }54.55.public String getServletInfo() {56.return Localizer.getMessage("");57. }58.59.public final void destroy() {60. jspDestroy();61. _jspDestroy();62. }63.64./**65. * Entry point into service.66. */67.public final void service(HttpServletRequest request, HttpServletResponse response)68.throws ServletException, IOException69. {70. _jspService(request, response);71. }72.73.public void jspInit() {74. }75.76.public void _jspInit() {77. }78.79.public void jspDestroy() {80. }81.82.protected void _jspDestroy() {83. }84.85.public abstract void _jspService(HttpServletRequest request,86. HttpServletResponse response)87.throws ServletException, IOException;88.}好吧,看到了,继承了HttpServlet类,所以说其实Jsp就是一个ServletJsp的语法:1.JSP模版元素2.JSP表达式3.JSP脚本片段4.JSP注释5.JSP指令6.JSP标签7.JSP内置对象8.如何查找JSP页面中的错误Jsp模板元素JSP页面中的HTML内容称之为JSP模版元素。
jsp试题库及答案JSP试题库及答案一、选择题1. JSP技术使用的是哪种语言作为其脚本语言?A. JavaB. JavaScriptC. C#D. Python答案:A2. 在JSP页面中,哪一个指令用于指定信息处理类?A. <%@ page %>B. <%@ include %>C. <%@ taglib %>D. <%@ attribute %>答案:A3. 如果要在JSP页面中包含另一个JSP页面,应该使用哪个JSP元素?A. <jsp:include>B. <jsp:forward>C. <jsp:param>D. <jsp:useBean>答案:A4. JSP页面的默认脚本语言是什么?A. HTMLB. JavaScriptC. JavaD. SQL答案:C5. 在JSP中,使用什么标签可以将Java Bean组件的属性传递给表达式语言(EL)?A. <jsp:useBean>B. <jsp:setProperty>C. <jsp:getProperty>D. <jsp:forward>答案:C二、简答题1. 请简述JSP和Servlet的区别。
答案:JSP(JavaServer Pages)是一种用于生成动态网页的技术,它使用模板和Java代码的混合来实现页面内容的动态生成。
Servlet是一种运行在服务器端的Java小程序,可以处理客户端请求并生成响应。
JSP最终被编译成Servlet,由Servlet容器执行。
JSP主要用于页面内容的生成,而Servlet则可以处理更复杂的业务逻辑。
2. 描述一下JSP的动作元素和标准动作元素的区别。
答案:JSP的动作元素(Action Element)用于控制Servlet引擎的行为,例如包含其他页面、转发请求等。
JSP标签库在这篇文章中,我们主要讨论:·什么是自定义tag标签?·怎么使用tag标签?o 声明要使用的tag库o 找到与之对应的tag处理类o tag标签的类型·自定义tag标签o tag处理类o tag库描述o tag标签示例o 带属性的tago 带body的tago 定义了脚本变量的tago 具有协作关系的tag·自定义tag标签o 一个迭代tag的例子o 一个模板tag库o tag处理类到底是怎样被调用的?什么是自定义的tag?一个自定义的tag标签是用户定义的一种JSP标记。
当一个含有自定义的tag标签的JSP页面被jsp引擎编译成servlet时,tag标签被转化成了对一个称为tag处理类的对象进行的操作。
于是当JSP页面被jsp 引擎转化为servlet后,实际上tag标签被转化成为了对tag处理类的操作。
自定义tag标签有很多特色,诸如:·可以在JSP页面中自定义tag标签的属性·访问JSP页面中的所有对象·可以动态地修改页面输出·彼此这间可以相互通信。
你可以先创建一个JavaBeans组件,然后在一个tag中调用此JavaBeans 组件,同时可以在另一个tag中调用它。
·tag允许相互嵌套,可以在一个JSP页面中完成一些复杂的交互。
使用tag标签本节主要描述怎样在JSP页面中使用tag标签,以及tag标签的不同类型。
要使用tag标签,JSP程序员必须做2件事:·声明此tag标签的tag库·实现此tag标签声明tag标签所在的tag库如果要使用tag标签,则应用JSP的taglib指示符来指定其tag库(注意:taglib要在在使用此tag标签之前声明)<% taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %>uri属性定义了唯一的标签库描述(以下简称TLD),它可以是直接是tld文件名或一个独一无二的名字。
prefix是用来区别其它TLD中和本TLD中有重名的tag的一种手段。
TLD必须以.tld作为扩展名,并且存放在当前应用的WEB-INF目录或其子目录下。
你可以通过它的文件名直接引用它,也可以通过别的方式间接地引用它。
以下taglib指示符直接引用一个TLD:<% taglib uri=”/WEB-INF/tutorial-template.tld” prefix=”tt” %>以下的taglib指示符通过一个逻辑名称间接地引用一个TLD:<% taglib uri=”/tutorial-template” prefix=”tt” %>如果是间接引用TLD的话,那你必须还要在web.xml中定义此逻辑名称与tld文件之间的映射,具体做法是在web.xml中加入一个名为taglib的元素:<taglib><taglib-uri>/tutorial-template</taglib-uri><taglib-location>/WEB-INF/tutorial-template.tld</taglib-location></taglib>实现此tag标签为了实现tag标签,你有2种方法来存放tag处理类。
一、让tag处理类以.class的方式存放于当前应用的WEB-INF/class子目录下,二、如果tag处理类是以JAR包的形式存在的话,那可以放在当前应用的WEB-INF/lib目录下,如果tag处理类要在多个应用中共享,那么它就应放在jsp服务器上的common/lib 目录下,对于tomcat来说,就是tomcat/common/lib目录下。
tag标签类型自定义的tag标签遵循XML语法。
它有一个开始标记和一个结束标记,有的还有body(即文本节点):<tt:tag>body</tt:tag>一个不带body的tag标签如下:<tt:tag />简单的tag标签一个没有body和属性的tag标签如下:<tt:simple />带属性的tag标签自定义标签可以有自己的属性。
属性一般在开始标记中定义,语法为attr=”value”。
属性的作用相当于自定义标签的一个参数,它影响着tag处理类的行为。
你可以在TLD中详细定义它。
你可以用一个String常量给一个属性赋值,也可以通过表达式给它赋值,如<%= ...%>。
以struts为例,它的logic:present标签就是用的String常量来给属性赋值:<loglic:present parameter = “Clear”>而另一个标签logic:iterate是用表达式来给属性赋值:<logci:iterate collection=”<%= bookDB.getBooks() %>”id=”book” type=”database.BookDetails”>带body的tag标签一个自定义标签可以包含其它自定义标签、脚本变量、HTML标记或其它容。
在下述例子中,此JSP页面使用了struts的logic:present标签,如果些标签定义了parameter=”Clear”的属性,则将清除购物车的容,然后打印出一条信息:<logic:present parameter=”Clear”><% cart.clear(); %><font color=”#ff0000” size=”+2”><strong>你选择了清除购物车!</strong></font></logic:present>到底是用属性还是用body来传递信息?如上所述,我们既可以通过属性,也可以通过body来传递信息。
但一般来说,比较简单的类型,如字符串或简单表达式最好采用属性来传递信息。
定义脚本变量的tag标签所谓脚本变量,是指JSP中可以调用的变量或对象。
它可由tag标签产生。
以下示例阐述了一个tag 标签定义了一个名为tx的由JNDI所定义的事务处理对象。
脚本变量可以是ejb对象、事务、数据库连接等等:<tt:lookup id=”tx” type=”UserTransaction” name=”java:comp/UserTransaction” /><% tx.begin(); %>...具有协作关系的tag标签自定义tag标签之间可以通过共享对象来实现协作。
在下述例子中,标签tag1创建了一个名为obj1的对象,在标签tag2仍可以重复使用obj。
<tt:tag1 attr1=”obj1” value1=”value” /><tt:tag2 attr1=”obj1” />在以下这个例子当中,如果外层的tag标签创建了一个对象,那么其层的所有tag标签都可以使用这个对象。
由于这样产生的对象没有一个指定的名字,那么就可以将少重名的冲突。
这个例子阐述了一系列协作的嵌套对象。
<tt:outerTag><tt:innerTag /></tt:outerTag>Tag处理类Tag处理类必须实现Tag接口或BodyTag接口,不过现在一般都流行从TagSupport或BodyTagSupport 类中继承,这些类或接口都可以在javax.servlet.jsp.tagext包中找到。
当JSP引擎看到自己的JSP页面中包含有tag标签时,它会调用doStartTag方法来处理tag标签的开头,调用doEndTag方法来处理tag标签的结束。
下表说明不同类型的tag所需要不同的处理过程:Tag处理类的方法Tag标签类型所调用的方法基本标签doStartTag, doEndTag, release带属性的标签doStartTag, doEndTag, set/getAttribute1...N, release带容的标签doStartTag, doEndTag, release带容的标签,且容重复循环doStartTag, doAfterBody, doEndTag, release带容的标签,且容与JSP交互doStartTag, doEndTag, release, doInitBody, doAfterBody, release一个tag处理类可以通过javax.servlet.jsp.PageContext来与JSP交互,通过javax.servlet.jsp.PageContext类,tag处理类可以访问JSP中的request、session和application对像。
如果tag标签是互相嵌套的,那层的tag处理类可以通过它的parent属性来访问上层的tag处理类。
一般情况都将所有的tag处理类打成了JAR的包,以便于发布。
Tag库描述(简称TLD)Tag库是用xml语言描述的,TLD包括了tag库中所有tag标签的描述,它一般用来被jsp服务器用来校验tag的语确性,或者被jsp开发者用来开发新的标签。
TLD的文件扩展名必须为.tld,而且必须放在当前WEB应用的WEB-INF目录或其子目录中。
一个TLD的容的开头必须遵守标准的XML开头,用于描述DTD和xml的版本,例如:<?xml version="1.0" encoding="ISO-8859-1" ?><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "java.sun./dtd/web-jsptaglibrary_1_2.dtd">TLD必须以<taglib>来作为它的根元素,<taglib>的子元素如下表:<taglib>的子元素Listener元素一个tag库可能定义一些类做为它的事件侦听类,这些类在TLD中被称为listener 元素,jsp服务器将会实例化这些侦听类,并且注册它们。
Listener元素中有一个叫listener-class的子元素,这个元素的值必须是该侦听类的完整类名。
Tag元素每个tag元素在tag库中都要指出它的名字、类名、脚本变量、tag的属性。