`
persistC
  • 浏览: 73561 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JSP 三

阅读更多
一、JSP的异常处理
<%@page errorPage="xxx.jsp"%> 指定本页面出现异常后要转到的页面
<%@page iserrorPage="true"%> 见本页面指定为异常处理页面,也就是其他出异常的页面可以指定本页面为要转到的异常处理页面。                                 

处理异常

运行时异常
1) 一个程序运行时重获的错误;
2) 能被一固有的异常对象引用所使用;
3) 可以利用异常引用创建或产生一个JSP页面显示异常信息给用户。

创建一个异常跟踪方案
1) 在每一个JSP页面,包含要创建的异常页面名称;  
<%@page import="numberguess.NumberGuessBean" errorPage="error.jsp"%>
2) 创建一个异常页面;  
<%@page isErrorPage="true"%>

JSP页面中的异常处理
1) <%=exception.toString()%>        打印异常名称;
2) <%exception.printStackTrace();%> 打印当前错误流中所有错误的列表;
3) <%=exception.getMessage()%> 打印错误的详细描述信息

二、JSP中隐含内置对象

名称         类型                                     注释和范围
request      javax.servlet.http.HttpServletRequest    request

response     javax.servlet.http.HttpServletResponse   response

page         javax.lang.Object                        page

Exception    java.lang.Throwable                      page

pageContext  javax.servlet.jsp.PageContext            page

session      javax.servlet.http.HttpSession           session

application  javax.servlet.ServletContext             ServletContext

out          javax.servlet.jsp.JspWriter              output stream

config       javax.servlet.ServletConfig              ServletConfig

内置对象request

1)封装了来自客户端的请求:   
2)方法:
   getCookies: 取得Cookie数组;         
   getMethod: 返回请求形成的方式(GET/POST);         
   getParameterNames: 返回form中对象名称的枚举;         
   getParameter:返回指定名称的对象值; 5) getParameterValues: 返回指定名称的对象值数组;         setAttribute: 设置属性;         
   getAttribute: 返回属性值;         
   getAttributeNames: 返回属性名称的枚举

内置对象out

1)JSPWriter的一个实例, 用于发送响应给客户端   
2)方法:
   print(String)/println(String) 用于向页面输出         
   print(int)/println(int)         
   flush() 刷新out对象的缓存

内置对象exception

1) 用于异常对象的异常实例;   
2) 异常页面在page指令中存在属性 isErrorPage="true";   
3) 方法:
   getMessage()/printStackTrace()/toString()

内置对象session

1) HttpSession的一个实例, 用于来维护session的状态   
2) 方法:
   getAttribute(String name)/setAttribute(String name)
   取得设置的属性的对应资源/设置属性的对应资源            
   removeAttribute(String name) 删除属性和队应资源            
   getAttributeNames()
   返回值是一个迭代器,可以获得session中设置的属性的名字也就是在set时使用的与资源对应的那个   名字

内置对象application

1) ServletContext一个实例,用来维护application的状态   
2) 方法:  
   getAttribute()/setAttribute() 和session以及request中的那一对设置属性及其对应资源的方法   
   getInitParameter() 获得初始化参数               
   getServletInfo()  获得Servlet的信息
3) application的作用域比session大得多,一个session和一个client联系, 而application保持了用于所有客户端的状态。

注意:如果要保存的数据量比较大时,就要使用生命周期比较短的request对象,page对象只在本页面中有效,也就是会再翻译后的service方法体内
      的一个局部变量,service运行结束后就会销毁,不像request可以转发。session和application的生命周期都比较长而且作用域比较大。
     
     
三、JSP自定义标签(tag)

什么是自定义标签

1,用户自定义的Java语言元素, 实质是运行一个或者两个接口的JavaBean;
2,可以非常机密地和JSP的表示逻辑联系在一起,又具有和普通JavaBean相同的业务逻辑处理能力;
3,当一个JSP页面转变为servlet时,其间的用户自定义标签转化为操作一个称为标签hander的对象;
4,可操作默认对象,处理表单数据,访问数据库以及其它企业服务;

自定义标签库的特点

1,通过调用页面传递参数实现定制;
2,访问所有对JSP页面可能的对象;
3,修改调用页面生成的响应;
4,自定义标签间可相互通信;
5,在同一个JSP页面中通过标签嵌套,可实现复杂交互。

如何使用自定义标签库

1,声明标签库
2,使标签库执行对Web应用程序可用

声明标签库

1,使用taglib指令声明标签库
2,语法:<%@taglib uri="URI" prefix="pre" %>

注意:a. uri属性可以是绝对的,也可以是相对URL,该URL指向标记库描述符(TLD)文件;     
      b. uri属性也可以是一个并不存在的URL,该URL为web.xml文件中将标记库描述符(TLD)文件的绝对

URL到本地系统的一个映射;

3,范例:<%@taglib uri="/WEB-INF/template.tld" prefix="test" %>              
         <%@taglib uri="http://java.sun.com/jstl/core" prefix="core" %>      

使标签库执行可用

方式一:在WEB-INF/classes目录下部署标记处理程序类;
方式二:将标记处理程序类打包成jar文件并置于WEB-INF/lib目录。

几种典型的标签

1,不带属性和主体的简单标签:<mytaglibs:SomeTag/>;
2,不带主体但有属性的标签:<mytaglibs:SomeTag user="TonyDeng"/>;
3,带有主体和属性的标签:
         <mytaglibs:SomeTag user="TonyDeng">                                                              
                  ...// 标签体                                 
         </mytaglibs:SomeTag>;

注意:a. 属性列于start tag中,它是在标记库描述符(TLD)文件中指定,服务于标记库的自定义行为;       
      b. 标签体位于start tag和end tag间,可以是任何合法的JSP内容或者标签;

定义标签

1,开发实现tag的类(tag handler);
2,编辑标记库描述符(TLD)文件;
3,在web.xml中为标记库描述符(TLD)文件的绝对URL建立一个映射(该步骤可选);

标记库描述符(TLD)文件

1,一个描述标记库的XML文件;
2,内容开始是整个库的描述,然后是tag的描述;
3,标记库描述符(TLD)文件用于Web Container确认tag以及JSP页面发展工具;

实现tag的类(标签处理器)(tag handler)

1,是一些在引用了标签的JSP页面执行期间被Web Container调用以求自定义标签值的对象;
2,必须实现Tag, SimpleTag和BodyTag之一;
3,可以继承TagSupport和BodyTagSupport之一。

标签库的接口和类的继承关系接口的继承关系:      
☉ interface javax.servlet.jsp.tagext.JspTag         
        ☉ interface javax.servlet.jsp.tagext.SimpleTag            
        ☉ interface javax.servlet.jsp.tagext.Tag            
        ☉ interface javax.servlet.jsp.tagext.IterationTag            
        ☉ interface javax.servlet.jsp.tagext.BodyTag

类的继承关系:      
         ☉ class javax.servlet.jsp.tagext.TagSupport
          (implements javax.servlet.jsp.tagext.IterationTag, java.io.Serializable)          
                ☉ class javax.servlet.jsp.tagext.BodyTagSupport
                 (implements javax.servlet.jsp.tagext.BodyTag)       
         ☉ class javax.servlet.jsp.tagext.SimpleTagSupport
            (implements javax.servlet.jsp.tagext.SimpleTag)


                  (Interface)                   
                     JspTag                     
                        |                             
                |ˉˉˉˉˉˉˉˉ|            
           (Interface)      (Interface)JSP2.0            
               Tag           SimpleTag ←--SimpleTagSupport             
                |                                         
                |            
            (Interface)          
           IterationTag←--TagSupport
           支持迭代的标签         |
                |                 |          
                |                 |   
            (Interface)           |               
             BodyTag ←---BodyTagSupport
            可以处理标签体


自定义标签的开发步骤

1,写标签处理器,也就是一个符合自定义标签规范的类 xxx.java
2,写标签库定义文件,也就是定义标签的格式规范,也要符合自定义标签的规范 xxx.tld
3,建上述两步中的相应   文件进行部署。web.xml

tld文件中的配置
  <tag>
    <name>loop</name>
    <tag-class>com.tag.LoopTag</tag-class>
    <body-content>jsp</body-content>
    <!--设定自定义标签体内的内容,可以置为empty,也就是只能写空标签-->
    <attribute>
      <name>counter</name><!--配置自定义标签的属性名-->
      <required>true</required><!--配置属性是否必须出现-->
      <rtexprvalue>true</rtexprvalue><!--允许使用表达式作为属性的值-->
      <type>int<type><!--配置属性的类型-->
      </attribute>
  </tag>


简单的标签处理程序类

1,必须实现Tag接口的doStartTag()和doEndTag()方法;
2,因为不存在Body,doStartTag()方法必须返回SKIP_BODY;
3,如其余页面要执行,doEndTag()方法返回EVAL_PAGE, 否则返回SKIP_PAGE;
4,对于每一个标签属性,你必须在标签处理程序类里定义一个特性以及get和set方法以一致于JavaBeans   体系惯例

带Body的自定义标签

1,必须实现Tag接口的doStartTag()和doEndTag()方法;
2,可以实现IterationTag接口的doAfterBody()方法;
3,可以实现BodyTag接口的doInitBody和setBodyContent方法;
4,doStartTag方法可以返回SKIP_BODY、EVAL_BODY_INCLUDE、或者EVAL_BODY_BUFFERED(当你想使用     BodyContent);
5,doEndTag方法可以返回SKIP_PAGE或EVAL_PAGE;
6,doAfterBody方法可以返回EVAL_BODY_AGAIN, SKIP_BODY;

定义脚本变量的标签(迭代标签)

1,定义脚本标签的二个步骤:  
   . 在标记库描述符(TLD)文件中列明脚本变量;  
   . 定义标签扩展信息类(TEI)并且在TLD文件中包括这个类元素(tei-class);
2,变量必须在标签处理程序类中使用pageContext.setAttribute()方法设置;
3,标签扩展信息类(TEI)必须继承TagExtraInfo以及覆盖getVariableInfo()方法;
4,变量的范围可以是AT_BEGIN, NESTED, AT_END(标签扩展信息类(TEI)的VariableInfo中定义)之一;

脚本变量的有效性
变量     |   有效性                   
---------------------------------------
NESTED   | 标签中的参数在starttag到endtag之间是有效的
AT_BEGIN | 标签中的参数在标签的开始到JSP页面结束是有效的
AT_END   | 标签中的参数在标签的结束到JSP页面结束是有效的

Tag接口的方法

interface javax.servlet.jsp.tagext.Tag
------------------------------------------------------
+EVAL_BODY_INCLUDE:int
+EVAL_PAGE:int//继续执行页面
+SKIP_BODY:int//跳出标签体
+SKIP_PAGE:int//跳出页面,也就是整个JSP不会再运行
------------------------------------------------------
+release():void
+getParent():javax.servlet.jsp.tagext.Tag
+setParent(javax.servlet.jsp.tagext.Tag):void
+doEndTag():int
+doStartTag():int
+setPageContext(javax.servlet.jsp.PageContext):void

Tag的生命周期

1,setPageContext(javax.servlet.jsp.PageContext):void
2,setParent(javax.servlet.jsp.tagext.Tag):void
3,setAttribute:void
4,doStartTag():int
5,doEndTag():int
6,release():void

BodyTag和Tag接口的关系

interface javax.servlet.jsp.tagext.BodyTag-->interface javax.servlet.jsp.tagext.Tag
------------------------------------------
+EVAL_BODY_AGAIN:int//继续执行标签体
-----------------------------------------
+doInitBody():void
+setBodyContent(javax.servlet.jsp.tagext.BodyContext):void
+doAfterBody():int

BodyTag的处理过程

1,setPageContext(javax.servlet.jsp.PageContext):void
2,setParent(javax.servlet.jsp.tagext.Tag):void //设置此标签的父标签,也就是上一层标签
3,setParent()
4,doStartTag():int
5,setBodyContent(javax.servlet.jsp.tagext.BodyContent):void//设置方法体
6,doInitBody():void//
7,doAfterBody():int
/* 这个方法会被不断的调用直到不再满足条件,通过这个方法来控制返回,从而控制循环是否中断
  SKIP_BODY是跳出标签体的,EVAL_BODY_INCLUDE是继续执行标签体,通过返回这两个值来控制循环是否*/
8,doEndTag():int
9,release():void

SimpleTag接口的方法

javax.servlet.jsp.tagext.SimpleTag
------------------------------------------
+doTag():void
+getParent():JspTag
+setJspBody(JspFragment jspBody):void
+setJspContext(JspContext pc):void
+setParent(JspTag parent):void

SimpleTage接口的生命周期(JSP2.0的自定义标签接口)
1,new:      
   每次遇到标签,容器构造一个SimpleTag的实例,这个构造方法没有参数。和红典的标签一样,          SimpleTag不能缓冲,故不能重用,每次都需要构造新的实例。
2,setJspContext()、setParent(): 只有这个标签在另一个标签之,才调用setParent()方法;
3,设置属性:调用每个属性的setter方法;
4,setJspBody();
5,doTag(): 所有标签的逻辑、迭代和Body计算,都在这个方法中;
6,return

例:

package com.tag;
public class HelloTag implements Tag
{
private PageContext pageContext;
private Tag parent;

     public HelloTag(){ 
   super();
     }
    
    /**
      *设置标签的页面的上下文
      */
     public void setPageContext(final PageContext pageContext) {
           this.pageContext=pageContext; 
     }
    /**
      *设置上一级标签
      */
     public void setParent(final Tag parent) {  
          this.parent=parent;  
     }
     /**
      *开始标签时的操作
      */
     public int doStartTag() throws JspTagException{  
          return SKIP_BODY;  //返回SKIP_BODY,表示不计算标签体
     }
     /**
      *结束标签时的操作
      */
     public int doEndTag() throws JspTagException{
       try{  
            pageContext.getOut().write("Hello World!你好,世界!");
       }            
          catch(java.io.IOException e){
            throw new JspTagException("IO Error: " + e.getMessage());
          } 
          return EVAL_PAGE;
      }
     /**
      *release用于释放标签程序占用的资源,比如使用了数据库,那么应该关闭这个连接。
      */
     public void release() {}   
     public Tag getParent(){   
        return parent;
     }
}

xxx.tld

<?xml version="1.0" encoding="ISO-8859-1" ?>
<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 web-jsptaglibrary_2_0.xsd"
    version="2.0">
 
  <tag>
    <description>Extends TagSupport</description>
    <name>hello</name>
    <tag-class>com.tag.HelloWorldTag</tag-class>
    <body-content>jsp</body-content>
  </tag>
</taglib>

web.xml

<web-app>
<taglib-uri>/xxx</taglib-uri>
<taglib-location>/WEB-INF/tlds/xxx.tld</taglib-location>
</web-app>

xxx.jsp

<%@ taglib uri="/xxx" prefix="mytag" %>
<%@ page contentType="text/html; charset=gb2312" %>
<html><head><title>first cumstomed tag</title></head><body>
<p>以下的内容从Taglib中显示: </p>
<p><i><mytag:hello_int/></i>
<br>
<p><mytag:hello_int></mytag:hello_int>
</body></html>    
分享到:
评论

相关推荐

    js+jsp三级联动 源码

    在IT行业中,"js+jsp三级联动 源码"是一个常见的前端与后端交互的实践案例,主要用于实现用户界面的动态筛选和过滤。这里,我们主要探讨的是使用JavaScript(js)和JavaServer Pages(jsp)来创建一个具有三级联动...

    JSP三层实现购物网

    【JSP三层架构实现购物网】是一个典型的Web应用开发模式,它将业务逻辑、数据访问和用户界面分离,提高了代码的可维护性和可扩展性。本文将深入探讨这个主题,帮助你理解如何运用JSP三层架构来构建一个功能完善的...

    mysql分页 jsp实现 servlet+javabean+jsp三级架构

    MySQL分页JSP实现Servlet+JavaBean+JSP三级架构 本文档对MySQL分页技术进行了总结,讨论了在JSP实现中使用Servlet+JavaBean+JSP三级架构的分页技术的实现方式。文章首先讨论了分页技术的重要性,并且提出了一个基本...

    jsp3.rar_Success_jsp3_jsp3.

    实现一个简单的登陆程序,要求应用JavaBean来接收用户输入的用户名和密码,然后判断输入的用户名是否为”...若是则转发到success.jsp页面显示“欢迎登陆”提示信息,否则转发到fault.jsp并显示“登陆失败”提示信息。

    JSP三套试卷有答案

    JSP的生命周期包括三个阶段:翻译、初始化和服务。 1. **翻译**: JSP被转换为一个Servlet源码,这个过程会将JSP页面的静态内容和动态元素分离。 2. **初始化**: Servlet被加载并初始化,JavaBean如果存在也会被...

    jsp-mysql三层架构模板

    **JSP-MySQL三层架构模板详解** 在Web开发中,三层架构是一种常见的设计模式,它将应用程序分为表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access Layer)。这种架构...

    Jsp三级折叠菜单

    Jsp三级折叠菜单

    jsp+ajax 三级联动菜单

    【jsp+ajax 三级联动菜单】是一个典型的Web开发技术应用场景,它主要利用JavaServer Pages(JSP)和Asynchronous JavaScript and XML(AJAX)来实现动态网页中的数据交互和页面更新。在这个例子中,我们看到的是一个...

    JSP三层模型演示

    三层模型是指:1、表现层,主要是JSP和HTML页面,用于接收用户的请求,以及返回操作数据,是应用程序访问的入口。2、业务逻辑层,主要是对数据层进行操作,对数据逻辑层进行处理,如果数据层是积木,那么逻辑层就是...

    sdk.jsp3文件

    在eclipse中安装extjs提示工具spket时,需要提供一个jsb文件,extjs提供的是被打乱的,基于此,献上一个完好的jsb文件,希望对大家有用。

    经典强大的 2个jsp后门

    3. **后门的隐藏技术**:为了逃避检测,黑客可能会将后门代码混淆、加密或嵌入到正常代码中,使其难以被发现。此外,他们还可能使用编码、Base64编码或其他方式来隐藏实际的命令或URL。 4. **防范措施**:对于JSP...

    struts1.2、jstl、jsp三种标签教程

    3. **JSP进阶**:学习EL表达式,理解JSP指令(taglib、page、include等),以及JSP生命周期和内置对象的使用。 4. **集成实践**:将Struts1.2、JSTL和JSP结合起来,创建一个完整的Web应用,比如用户登录、注册、...

    jsp 三种查询分页 resultset,hibernate ,存储过程

    jsp 三种查询分页 resultset,hibernate ,存储过程jsp 三种查询分页 resultset,hibernate ,存储过程jsp 三种查询分页 resultset,hibernate ,存储过程jsp 三种查询分页 resultset,hibernate ,存储过程

    JSP设计(第三版)

    **JSP设计(第三版)** 本资源是关于JSP设计的第三版教材,主要针对Java Server Pages(JSP)技术进行深入讲解。JSP是一种动态网页开发技术,由Sun Microsystems(现已被Oracle公司收购)在1999年推出,用于构建基于...

    jsp 原理 jsp教程

    3. **指令元素**:JSP提供了三种类型的指令,包括`&lt;%@ page %&gt;`, `&lt;%@ include %&gt;`, 和`&lt;%@ taglib %&gt;`,它们分别用于设置页面属性、包含其他文件和引入标签库。 4. **动作元素**:JSP的动作元素如`&lt;jsp:include&gt;`,...

    jsp三层油耗计算器

    用jsp三层开发的一个油耗计算器功能,可以实现,添加,删除,修改功能。

    原生jsp进行Web编程—作业3-JSP内置对象-Part2

    一、JSP内置对象练习 1、使用JSP中的session对象,实现用户登陆检验 (1)(1)web目录下的session-login目录中,...3、使用JSP中的session对象,实现购物车功能。 4、使用application对象的属性存储统计网站访问人数

    服务器安全技术分析:JSP漏洞大观

    文中介绍一下一些服务器(包括Web服务器和JSP服务器)的常见漏洞:Apache泄露重写的任意文件、在HTTP请求中添加特殊字符...Apache泄露重写的任意文件漏洞、Tomcat 暴露JSP文件内容等。并且针对这些漏洞提出了解决方案。

    jsp结合js实现三级菜单联动.pdf

    JSP 结合 JS 实现三级菜单联动 在 Web 开发中,三级菜单联动是非常常见的需求,例如在选择学校、专业、班级时,需要三级菜单联动来选择正确的信息。下面我们将介绍如何使用 JSP 结合 JS 实现三级菜单联动。 JSP ...

Global site tag (gtag.js) - Google Analytics