zoukankan      html  css  js  c++  java
  • JavaWeb Day6

    本节内容

    1.JSP简介

    2.JSP组成

    3.JSP运行原理

    4.JSP基本语法

    5.JSP指令

    6.JSP9大内置对象

    7.JSP属性范围

    8.JSP标签

    一、JSP简介

    JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。
      JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。

    二、JSP组成

      JSP组成: HTML、CSS、JS、Java脚本、注释、JSP标签、JSP指令

    三、JSP的运行原理

    1. WEB容器JSP页面的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。
    2. 每个JSP页面在第一次被访问时,JSP引擎先将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序

    四、JSP基本语法

      任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用。

    JSP页面中的HTML内容称之为JSP模版元素。
    JSP模版元素定义了网页的基本骨架,即定义了页面的结构和外观

     1.JSP表达式

        JSP脚本表达式(expression)用于将程序数据输出到客户端
          语法:<%= 变量或表达式 %>
          举例:输出当前系统时间:

    <%= new java.util.Date() %> 
    

    JSP引擎在翻译脚本表达式时,会将程序数据转成字符串,然后在相应位置用out.print(…) 将数据输给客户端。
    JSP脚本表达式中的变量或表达式后面不能有分号(;)

    2.JSP脚本  

      用与在JSP页面书写多行Java代码

    <% 
      多行java代码 
    %> 
      在<% %>中可以定义变量、编写语句,不能定义方法。
    <%
        int sum=0;//声明变量
    
        /*编写语句*/
        for (int i=1;i<=100;i++){
            sum+=i;
        }
        out.println("<h1>Sum="+sum+"</h1>");
    %>

    注意事项:

    • 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语句

    <%
        for (int i=1; i<5; i++) 
        {
    %>
        <H1>使用JSP脚本循环输出标题</H1>
    <%
        }
    %>

    3.JSP声明

    JSP页面中编写的所有代码,默认会翻译到servlet的service方法中, 而Jsp声明中的java代码被翻译到_jspService方法的外面。语法

    <%! 
            java代码
    %>

    所以,JSP声明可用于定义JSP页面转换成的Servlet程序的静态代码块、成员变量和方法
      多个静态代码块、变量和函数可以定义

    <%!
    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声明中,也可以分别单独定义在多个JSP声明中。
    JSP隐式对象的作用范围仅限于Servlet的_jspService方法,所以在JSP声明中不能使用这些隐式对象。

    4.JSP注释

      

    在JSP中,注释有两大类:

       显式注释:直接使用HTML风格的注释:<!- - 注释内容- ->

       隐式注释:直接使用JAVA的注释:///*……*/

     JSP自己的注释:<%- - 注释内容- -%>

    <!--这个注释可以看见-->
    
    <%
        //JAVA中的单行注释
    
        /*
            JAVA中的多行注释
        */
    %>
    
    <%--JSP自己的注释--%>

    HTML的注释在浏览器中查看源文件的时候是可以看得到的,而JAVA注释和JSP注释在浏览器中查看源文件时是看不到注释的内容的,这就是这三种注释的区别。

    四、JSP指令

    JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

    有3个指令

    page指令

    include指令

    taglib指令

    JSP指令的基本语法格式:<%@ 指令 属性名="值" %>
     <%@ page contentType="text/html;charset=utf-8"%>

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

    <%@ page contentType="text/html;charset=utf-8"%>
    <%@ page import="java.util.Date"%>
    <%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>

    page指令

       page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。

    page指令有很多的属性:各个属性的租用不尽相同。

    在这里我只简单简绍几个

    page指令的import属性:导包

    可以在一条page指令的import属性中引入多个类或包,其中的每个包或类之间使用逗号(,)分隔

    <%@ page import="java.util.*,java.io.*,java.sql.*"%>

    page指令的errorPage属性:跳转错误页

    使用errorPage属性指明出错后跳转的错误页面

     一运行就会跳转到:

    错误页也可以在web.xml中配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>WebDemo1</display-name>
       <!-- 针对404错误的处理页面 -->
      <error-page>
          <error-code>404</error-code>
          <location>/error.jsp</location>
      </error-page>
      
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

    如果某一个jsp页面是作为系统的错误处理页面,那么建议将page指令的isErrorPage属性(默认为false)设置为"true"来显式声明这个Jsp页面是一个错误处理页面。

    将error.jsp页面显式声明为错误处理页面后,有什么好处呢,好处就是Jsp引擎在将jsp页面翻译成Servlet的时候,在Servlet的 _jspService方法中会声明一个exception对象,然后将运行jsp出错的异常信息存储到exception对象中

    由于Servlet的_jspService方法中声明了exception对象,那么就可以在error.jsp页面中使用exception对象,这样就可以在Jsp页面中拿到出错的异常信息了

     如果没有设置isErrorPage="true",那么在jsp页面中是无法使用exception对象的,因为在Servlet的_jspService方法中不会声明一个exception对象

    Jsp有9大内置对象,而一般情况下exception对象在Jsp页面中是获取不到的,只有设置page指令的isErrorPage属性为"true"来显式声明Jsp页面是一个错误处理页面之后才能够在Jsp页面中使用exception对象

    2.Include指令

     在JSP中对于包含有两种语句形式:

    1. @include指令
    2. <jsp:include>指令

    @include指令

    @include可以包含任意的文件,当然,只是把文件的内容包含进来。

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

    语法:<%@ include file="relativeURL"%>,其中的file属性用于指定被引入文件的路径

    include指令细节注意问题:

    1. 被引入的文件必须遵循JSP语法。
    2. 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments(片段))作为静态引入文件的扩展名。
    3. 由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
      <h1>网页头部</h1>
    </body>
    </html>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>内容</title>
    </head>
    <body>
         <%@ include file="head.jspf"%>
    
    
    
        <h1>内容</h1>
    </body>
    </html>

    使用@include可以包含任意的内容,文件的后缀是什么都无所谓。这种把别的文件内容包含到自身页面的@include语句就叫作静态包含,作用只是把别的页面内容包含进来,属于静态包含。

    jsp:include指令

      jsp:include指令为动态包含,如果被包含的页面是JSP,则先处理之后再将结果包含,而如果包含的是非*.jsp文件,则只是把文件内容静态包含进来,功能与@include类似。后面再具体介绍

    taglib指令后面具体介绍

    六、JSP9大内置对象

    每个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大对象的引用

    9大内置对象

    编号 内置对象 类型
    1 pageContext javax.servlet.jsp.PageContext
    2 request javax.servlet.http.HttpServletRequest
    3 response javax.servlet.http.HttpServletResponse
    4 session javax.servlet.http.HttpSession
    5 application javax.servlet.ServletContext
    6 config javax.servlet.ServletConfig
    7 out javax.servlet.jsp.JspWriter
    8 page java.lang.Object
    9 exception java.lang.Throwable

    request,response 、session、application,config这些对象在前面都已经作了详细的介绍,这里重点介绍一下剩下的pageContext对象,out对象,page对象。

    page对象

      page对象表示当前一个JSP页面,可以理解为一个对象本身,即:把一个JSP当作一个对象来看待。page对象在开发中几乎不用,了解一下即可

    out对象

     out对象用于向客户端发送文本数据。out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。

    pageContext对象

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

    通过pageContext获得其他对象

    • getException方法返回exception隐式对象
    • getPage方法返回page隐式对象
    • getRequest方法返回request隐式对象
    • getResponse方法返回response隐式对象
    • getServletConfig方法返回config隐式对象
    • getServletContext方法返回application隐式对象
    • getSession方法返回session隐式对象
    • getOut方法返回out隐式对象

    七、属性范围

    JSP中提供了四种属性范围,四种属性范围分别指以下四种:

    • 当前页:一个属性只能在一个页面中取得,跳转到其他页面无法取得
    • 一次服务器请求:一个页面中设置的属性,只要经过了服务器跳转,则跳转之后的页面可以继续取得。
    • 一次会话:一个用户设置的内容,只要是与此用户相关的页面都可以访问(一个会话表示一个人,这个人设置的东西只要这个人不走,就依然有效)
    • 上下文中:在整个服务器上设置的属性,所有人都可以访问

    属性的操作方法:

      

    public void setAttribute(String name,Object value)//设置属性
    
    
    public object getAttribute(String name)//获取属性
    
    
    public void removeAttribute(String name)//删除属性

    设置属性:属性名必须是String类型,value可以是任意类型。

    1.page属性范围(pageContext)

    page属性范围相对好理解一些:在一个页面设置的属性,跳转到其他页面就无法访问了。但是在使用page属性范围的时候必须注意的是,虽然习惯上将页面范围的属性称为page范围,但是实际上操作的时候是使用pageContext内置对象完成的。

    2.request属性范围

    request属性范围表示在一次服务器跳转中有效,只要是服务器跳转,则设置的request属性可以一直传递下去。

    通俗来说就是一次请求之内有效,一次请求结束后,在第二次请求中不能获取了。

    3.session属性范围

    session设置的属性不管如何跳转,都可以取得的。当然,session只针对一个用户,在一次会话之内有效。

    4.application属性范围

    因为application属性范围是在服务器上设置的一个属性,所以一旦设置之后任何用户都可以浏览到此属性

    八、JSP标签

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

    jsp的常用标签有以下三个

    • <jsp:include>标签  
    • <jsp:forward>标签  
    • <jsp:param>标签

    <jsp:include>标签

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

    <jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
      page属性用于指定被引入资源的相对路径,它也可以通过执行一个表达式来获得。
      flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。

    <jsp:forward>标签

    <jsp:forward>标签用于把请求转发给另外一个资源。
      语法:
          <jsp:forward page="relativeURL | <%=expression%>" />
      page属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得

    <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>标签来传递多个参数

  • 相关阅读:
    20172310 2017-2018-2 《程序设计与数据结构》第十一周学习总结
    20172310 实验四 Android程序设计
    20172310 2017-2018-2 《程序设计与数据结构》实验三报告(敏捷开发与XP实践)
    20172310 2017-2018-2 《程序设计与数据结构》第十周学习总结
    20172310 2017-2018-2 《程序设计与数据结构》第九周学习总结
    20172321 2017-2018-2 《程序设计与数据结构》实验3报告
    23172321 2017-2018-2 《程序设计与数据结构》第10周学习总结
    20172321 2017-2018-2 《程序设计与数据结构》第九次学习总结
    20172321『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结
    20172321 2017-2018-2 《程序设计与数据结构》第8周学习总结
  • 原文地址:https://www.cnblogs.com/wuzhilong/p/9518214.html
Copyright © 2011-2022 走看看