JSP技术

来源:互联网 发布:linux 合并相同文件夹 编辑:程序博客网 时间:2024/06/06 07:40

一、什么是JSP?

    1、JSP的全称为Java  Server  Pages ,它和Servlet一样都是SUN公司定义的一种用于开发动态web资源的技术。

    2、JSP这门技术的最大特点在于,写JSP就像在写HTML一样。但它相对HTML而言,HTML只能为用户提供动态web资源,而JSP技术允许在网页中嵌套Java代码,为用户提供动态数据。

二、JSP原理

    1、web服务器是如何调用并执行一个jsp页面的?

    2、JSP页面中的html排版标签时如何发送到客户端的?

    3、JSP页面中的java代码在服务器中是如何运行的?

    4、web服务器在调用JSP时,会给JSP提供一些什么Java对象?

三、JSP语法

    (一)、JSP模板元素

          1、JSP页面中的HTML内容称之为JSP模板元素。

          2、JSP模板元素定义了网站的基本骨架,即定义了页面的内容和外观。

    (二)、JSP表达式

          1、JSP脚本表达式用于将程序数据输出到客户端。

                 语法:<%=变量或表达式%>

          2、JSP在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(...)将数据输给客户端。

          3、JSP脚本表达式中,变量或表达式后面不能有分号(;)。

    (三)、JSP脚本片断

          1、JSP脚本片段(scriptlet)用于在JSP页面中编写Java代码。

                语法:<% 多行Java代码 %>

                注意:JSP脚本片段只能出现Java代码,不能出现其他模板元素,JSP引擎在翻译JSP页面中,会将JSP脚本代码片断中的Java代码原封不动的放到Servlet的_jspService方法中。

          2、JSP脚本片断中的Java代码必须严格遵守Java语法。

          3、在一个JSP页面中,可以有多个脚本片断,在两个或多个脚本片断中可以嵌入文本、HTML标记和其他JSP元素。

          4、多个脚本片断中的代码可以相互访问,犹如将所有的代码放到一对<%%>中的情况。

          5、单个脚本片断中的Java语句可以是不完整的,但是多个脚本片断组合后的结果必须是完整的Java语句。

    (四)、JSP声明

          1、JSP页面中编写的所有代码,默认会翻译到Servlet的service方法中,而JSP声明中的Java代码被翻译到_jspService方法的外面。所以JSP可以用于定义JSP页面转换成的静态代码块、成员变量和方法。

                 语法:<%! Java代码 %>

           2、多个静态代码块、变量和函数可以定义在一个JSP声明中,也可以分别单独定义在多个JSP声明中。

           3、JSP隐式对象的作用范围,仅限于Servlet的JSPService方法,所以在JSP声明中不能使用这些隐式对象。

                 案例:

                           <%!
                                    static {
                                          System.out.println("loading Servlet!");
                                     }
                                     private int globalVar = 0;
                                     public void jspInit(){
                                          System.out.println("initializing jsp!");
                                     }
                            %>
                           <%!
                                    public void jspDestroy(){
                                           System.out.println("destroying jsp!");
                                    }
                            %>

    (五)、JSP注释

         1、JSP注释的格式:<%--  注释信息  --%>

         2、JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。

    (六)、JSP指令

         1、JSP指令(directive)是为了JSP引擎而设计的,他们并不产生任何可见输出,而只是告诉Servlet引擎如何处理JSP页面中的其余部分。在JSP2.0规范中。定义了三个指令:page指令、include指令、talib指令。

         2、JSP指令的基本语法格式:<%@ 指令  属性名="值" %>

         3、如果一个指令有多个属性,多个属性可以写在一个指令中,也可以分开写。

               例如:
                          <%@ page contentType="text/html;charset=gb2312"%>
                          <%@ page import="java.util.Date"%>
                也可以写作:
                          <%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>

  • page指令

        【1】、page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么位置,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的变成习惯,page指令最好是放在这个JSP页面的其实位置。

        【2】、JSP2.0规范中定义的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=charactorSet ] "  |  "text/html ; charset=ISO-8859-1" ]

                                [ pageEncoding=" charactorSet  |  ISO8859-1 " ]

                                [ isEllgnored=" true  |  false " ]

                        %>

  • include指令

        【1】、include指令用于引用其他JSP页面,如果使用了include指令引入了其他JSP页面,那么JSP引擎将把这两个JSP翻译成一个Servlet,所以include指令引入通常也称为静态引入。

        【2】、语法:<%@  include  file=" relativeURL "%>

                      其中的file属性用于指定被引入的文件路径,路径以" / "开头,便是代表当前web应用。

        【3】、细节:

                      被引入的文件必须遵守JSP语法;

                      被引入的文件可以使用任意的扩展名,即使其扩展名为html,JSP引起也会按照JSP页面的方式处理它里面的内容,JSP规范建议使用.jspf作为静态引入文件的扩展名;

                      由于使用include指令将会涉及到2个JSP页面,并会把两个JSP翻译成一个Servlet,所以两个JSP页面的指令不能冲突(pageEncoding和导包除外)。

  • taglib指令

        【1】、taglib指令用于在JSP页面中导入标签库。

    (七)、JSP运行原理和九大隐式对象

         1、每个JSP页面在第一次被访问时,web容器都会把请求交给JSP引擎取出来,JSP引擎先将JSP翻译成一个_JSPServlet,然后按照Servlet的调用方式进行调用。

         2、由于JSP第一次访问会翻译成Servlet,所以第一次访问会比较慢,但第二次访问时JSP引擎如果发现JSP没有变化,就不再翻译而是直接调用,所以程序的执行效率不会影响。

         3、JSP引擎在调用JSP对应的_JSPServlet时,会传递或创建9个与web开发相关的对象供_JSPServlet使用。JSP的设计者为便于开发人员在编写JSP时获取这些web对象的引用,特定定义了9个相应的变量。

  • request----------------------Request
  • response-------------------Response
  • configConfig---------------ServletConfig
  • application-----------------ServletContext
  • exception-------------------Exception
  • session---------------------Session
  • page-------------------------this
  • out----------------------------JspWriter

             【1】、out隐式对象用于向客户端发送文本数据。

             【2】、out对象是通过调用pageContext对象的getOut()方法返回的,其作用和用法与ServletResponse.getWriter()方法返回的PrintWriter对象非常相似。

             【3】、JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一个带缓冲功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整他的缓存大小,甚至关闭他的缓存。

             【4】、只有想out对象写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter()方法,并通过该方法返回的PrintWriter对象将out对象缓冲区中的内容真正写入到Servlet引擎提供的缓冲区。

                          ·设置page指令的buffer属性关闭了out对象的缓冲功能;

                          · out对象的换中去已满;

                          · 整个JSP页面结束。

              

  • pageContext---------------PageContext

             【1】、pageContext对象是JSP技术中最重要的一个对象,它代表JSP页面的运行环境,这个对象不仅封装了其他8大隐式对象的引用,他自身还是一个域对象,可以用来保存数据。并且这个对象还封装了web开发中经常涉及到的一些常用操作,例如引入和跳转其他资源、检索其他域对象中的属性等。

             【2】、通过pageContext获取其他对象:

                       ·getException()方法返回exception隐式对象;

                       ·getPage()方式返回page隐式对象;

                       ·getRequest方法返回request隐式对象

                       ·getResponse方法返回response隐式对象

                       ·getServletConfig方法返回config隐式对象

                       ·getServletContext方法返回application隐式对象

                       ·getSession方法返回session隐式对象

                       ·getOut方法返回out隐式对象

            【3】、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.Object 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方法(重要,查找各个域中的属性,在el表达式中使用

            【4】、引入和跳转到其他资源

                       ·pageContext中定义了一个forward方法和两个include方法,分别简化和替代RequeatDispatcher.forward()方法和include()方法。

                       ·方法接收的资源如果以“/”开头, “/”代表当前web应用。

    (八)、JSP标签

             JSP标签也称之为Jsp Action(JSP动作)元素,它用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接写Java代码,造成JSP页面难以维护。

          1、<jsp:include>标签

              【1】、<jsp:include>标签用于,把另外一个输出资源的内容插入进当前JSP页面的输出内容之中,这种在JSP页面执行时的引入方式,称之为动态引入。

              【2】、语法:<jsp:include  page="relativeURL"  | <%=expression%>" flush="true|false" />

                       ·page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来执行;

                       ·flush属性指定在插入其他资源内容时,是否先将当前JSP页面的已输出内容刷新到客户端。

              【3】、<jsp:include>标签与include指令比较

                       ·<jsp:include>标签时动态引入,<jsp:include>标签涉及到的两个JSP页面会被翻译成2个Servlet,这两个Servlet在执行时进行合并。

                       ·pinclude指令是静态引入,涉及到的2个JSP页面会被翻译成一个Servlet,其内容在原文件级别进行合并。

                       ·不管是<jsp:include>标签,还是include指令,它们都会把2个JSP页面内容进行合并输出,所以两个页面不要出现重复的HTML全局架构标签。

          2、<jsp:forward>标签

              【1】、<jsp:forward>标签用于把请求转发给另外一个资源。

              【2】、语法:<jsp:forward page="relativeURL | <%=expression%>" />

                       ·page属性用于指定请求转发到的资源相对路径,它也可以通过一个表达式来执行。

          3、<jsp:param>标签

              【1】、当使用<jsp:include>标签与<jsp:forward>标签引入或请求转发给其他资源时,可以使用<jsp:param>标签向这个资源传递参数。

              【2】、语法一:

                                    <jsp:include page="relativeURL | <%=expression%>">
                                             <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
                                    </jsp:include>

              【3】、语法二:

                                   <jsp:forward page="relativeURL | <%=expression%>">
                                           <jsp:param name="parameterName" value="parameterValue|<%= expression %>" />
                                   </jsp:include>

                          ·<jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。

                          ·在<jsp:include>和<jsp:forward>标签中使用多个<jsp:param>标签传递多个参数

四、映射JSP

       <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</url-pattern>
      </servlet-mapping>

五、如何查找JSP页面中的错误

  • JSP页面中的JSP语法格式有问题,导致其不能被翻译成Servlet源文件,JSP引擎将提示这类错误发生在JSP页面中的位置(行和列)以及相关信息。
  • JSP页面中的JSP语法格式没有问题,但被翻译成的Servlet源文件中出现了Java语法问题,导致JSP页面翻译成的Servlet源文件不能通过编译,JSP引擎也将提示这类错误发生在JSP页面中的位置(行和列)以及相关信息。
  • JSP页面翻译成的Servlet程序在运行时出现异常,这与普通Java程序的运行时错误完全一样,Java虚拟机将提示错误发生在Servlet源文件中的位置(行和列)以及相关信息。   

六、JSP最佳实践

       1、不管是JSP还是Servlet,虽然都可以用于开发动态web资源。但由于这2门技术各自的特点,在长期的软件实践中,人们逐渐把servlet作为web应用中的控制器组件来使用,而把JSP技术作为数据显示模板来使用。

       2、其原因为,程序的数据通常要美化后再输出:

  • 让jsp既用java代码产生动态数据,又做美化会导致页面难以维护。
  • 让servlet既产生数据,又在里面嵌套html代码美化数据,同样也会导致程序可读性差,难以维护。

因此最好的办法就是根据这两门技术的特点,让它们各自负责各的,servlet只负责响应请求产生数据,并把数据通过转发技术带给jsp,数据的显示jsp来做。

0 0
原创粉丝点击