JSP的基本原理

JSP的本質是Servlet

JSP的本質是Servlet,當用戶向指定的Serlet發送請求時,Servlet利用輸出流動態生成HTML頁面包括每一個靜態的HTML標籤和所有在HTML頁面出現的內容
JSP頁面內容包括兩部分:

  • 靜態部分:html標籤,靜態的頁面內容
  • 動態部分:受Java程序控制的內容,這些由Java腳本動態生成JSP頁面代碼:
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage=""%>
<html>
<head>
  <title>
    web
  </title>
<body>
  這是一個簡單的web應用<br>
  現在時間爲:<% out.println(new java.util.Date());%>
</body>
</head>
</html>

這裏寫圖片描述

JSP頁面是Servlet的一種簡化,其實還是使用了Servlet,在Web應用中每個JSP頁面都會有Servlet容器生成對應的Servlet,在Tomcat中,JSP頁面生成的Servlet放在work路徑對應的Web應用下
這裏寫圖片描述

JSP的四種基本語法

JSP註釋

兩種註釋格式:

<%– 註釋內容 –%>
<!– 註釋內容 –>

JSP聲明

語法格式:

<%! 
   //聲明部分 
   //聲明一個方法
   public String prin(){
      return "這是一個聲明";
   }
%>

注意:JSP頁面的聲明部分將轉換成對應的成員或成員方法,其中不能使用abstract修飾聲明部分的方法,因爲抽象方法將導致JSP對應的Servlet變成抽象類,從而無法實例化

JSP輸出表達式

用輸出的簡單表達式,相當於out.println,表達式語法後沒有分號

<%=表達式%>

JSP腳本

<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage=""%>
<html>
<head>
  <title>
    web
  </title>
<body>
  Jsp腳本<br>
  <%
   for(int i=1;i<10;i++){
   %>
      腳本輸出:<%=i%> <br>
  <% } %>
</body>
</head>
</html>

這裏寫圖片描述
JSP腳本聲明的變量是局部變量,但是不可以使用private,public 等控制訪問修飾符,也不能用static,JSP腳本里不能定義方法

JSP的三個編譯指令

語法格式

<% 編譯指令名 屬性名=”屬性值”····%>

page指令

page指令各屬性的意義:

  • extends:指定JSP頁面編譯所產生的Java類所繼承的父類,或所實現的接口
  • import:導入包,默認導入的包有:java.lang.*,javax.servlet.*,javax.servlet.jsp.*,javax.servlet.http.*
  • session:是否需要HTTP Session
  • buffer:指定輸出緩衝區大小,默認8KB
  • autoFlush:輸出緩衝區溢出時,是否需要強制輸出緩衝區內容
  • info:設置該JSP程序的信息,在jsp中可以直接調用getServletInfo()獲取
  • errorPage:指定錯誤處理頁面
  • isErrorPage:設置JSP頁面是否爲錯誤處理程序
  • contentType:指定文件格式和編碼字符集
  • pageEncoding:指定編碼字符集

include指令

include編譯指令語法

<%@include file=”relativeURLSpec”%>

靜態的includeb編譯指令,會把目標頁面的其他編譯指令包含起來加入到本頁面,融合成一個頁面,也就是說被包含頁面的內容完全融入了包含頁面所生成的Servlet中,所以被包含頁面甚至不需要一個完整的頁面,但兩個頁面的編譯指令衝突,那麼頁面就會出錯。

JSP的七個動作指令

include指令

該指令是一個動態include指令,也用於包含某個頁面,它不會導入被include頁面的編譯指令,僅僅將導入頁面的body內容插入到本頁面

<jsp:include page="{relativeURL|<%=experssion%>}" flush="true"/>

flush屬性用於指定輸出緩存是否轉移到被導入文件中,對與JSP1.1以前版本,只能設置成flase

forward,param指令

forward用於將頁面響應轉發到另一個頁面,可以轉到HTML靜態頁面,動態的JSP頁面和轉發到容器中的Servlet

對於JSP1.0
<jsp:forward page="{relative|<%=expression%>}"/>
對於JSP1.1
<jsp:forward page="{relative|<%=expression%>}">
    <jsp:param name="paramName" value="paramValue"/>
</jsp:forward>

執行forward指令時,用戶請求的地址欄依然沒有發生改變,但頁面的內容卻完全被forward目標頁的內容

param指令用於設置參數值,這個指令不能單獨使用,可以和jsp:include,jsp:forward,jsp:plugin這三個指令結合使用

useBean,setProperty,getProperty指令

都是和JavaBean相關的指令,其中useBean指令用於在JSP頁面中初始化一個Java實例,setProperty指令用於爲JavaBean實例的屬性設置;getPorperty指令用於輸出JavaBean實例屬性
這裏寫圖片描述

package jspDemo;
public class Person {
    private String name="wee";
    private int age=21;
    private String ad="meizhou";
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getAd() {
        return ad;
    }
    public void setAd(String ad) {
        this.ad = ad;
    }

}

index.jsp

<%@page import="jspDemo.Person"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" errorPage="" %>
<html>
<head><title>javaBean test</title></head>
<body>
  //第一種方法
  <jsp:useBean id="id" class="jspDemo.Person" scope="page"/>
  <jsp:setProperty name="id" property="name" value="zy"/>
  <jsp:setProperty name="id" property="age" value="23"/>
  <jsp:getProperty name="id" property="name"/>
  <jsp:getProperty name="id" property="age"/>
  <jsp:getProperty name="id" property="ad"/>
  //---------------------------------------------
  //第二種方法
  <%
      Person per = new Person();
      pageContext.setAttribute("pe",per);
      per.setName("hlc");
      per.setAge(22); 
   %>
   <%=per.getName()%>
   <%=per.getAge()%>
   <%=per.getAd() %>
</body>
</html>

這裏寫圖片描述

JSP腳本中的內置對象

這九個內置對象都是ServletAPI接口的實例,是JSP規範對它們進行了默認初始化,可以直接使用。

application對象

application對象代表Web應用本身,使用application操作web應用相關數據,主要有兩個作用
1.在整個web應用的多個jsp,servlet之間共享數據。
2.獲取web應用配置參數

config對象

config對象代表當前jsp配置信息,但jsp頁面通常無需配置,因此就不存在配置信息,但Servlet需要在web.xml中配置參數。
獲取配置信息的方法:getInitParameter(String paramName)

<%@ page contentType="text/html; charset=utf-8" errorPage="" %>
<html>
  <head><title>config</title></head>
  <body>
      name:的配置參數:<%=config.getInitParameter("name") %>
  </body>
</html>

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" version="3.0">
  <display-name>config</display-name>
  <servlet>
    <description>JAX-RS Tools Generated - Do not modify</description>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <jsp-file>/confitest.jsp</jsp-file>
    <init-param>
      <param-name>name</param-name>
      <param-value>lcy</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/jaxrs/*</url-pattern>
  </servlet-mapping>
</web-app>

這裏寫圖片描述
jsp頁面獲取web.xml配置文件中的信息,需要通過jsp配置的路徑來訪問。

pageContext對象

pageContext可以訪問page,request,session,application範圍的變量
getAttribute(String name)獲取page範圍內的name的屬性值
getAttribute(String name ,int scope):獲取指定範圍內的name屬性,其中scope可以有:

  • PageContext.PAGE_SCOPE 對應page範圍
  • PageContext.REQUEST_SCOPE 對應request範圍
  • PageContext.SESSION_SCOPE 對應session範圍
  • PageContext.APPLICATION_SCOPE 對應application範圍

    <%@ page contentType="text/html;charset=utf-8" language="java" errorPage="" %>
    <html>
    <head><title>pageContext</title></head>
    <body>
    <%
    pageContext.setAttribute("page","p");
    request.setAttribute("request","p");
    pageContext.setAttribute("request2","p",pageContext.REQUEST_SCOPE);
    session.setAttribute("session","p");
    pageContext.setAttribute("session2","p",pageContext.SESSION_SCOPE);
    application.setAttribute("application","p");
    pageContext.setAttribute("application2","p",pageContext.APPLICATION_SCOPE);
    out.println(pageContext.getAttributesScope("page")+"<br>");
    out.println(pageContext.getAttributesScope("request")+"<br>");
    out.println(pageContext.getAttributesScope("request2")+"<br>");
    out.println(pageContext.getAttributesScope("session")+"<br>");
    out.println(pageContext.getAttributesScope("session2")+"<br>");
    out.println(pageContext.getAttributesScope("application")+"<br>");
    out.println(pageContext.getAttributesScope("application2")+"<br>");
    out.println(pageContext.getAttribute("page",pageContext.PAGE_SCOPE)+"<br>");
    out.println(pageContext.getAttribute("request",pageContext.REQUEST_SCOPE)+"<br>");
    out.println(pageContext.getAttribute("request2",pageContext.REQUEST_SCOPE)+"<br>");
    out.println(pageContext.getAttribute("session",pageContext.SESSION_SCOPE)+"<br>");
    out.println(pageContext.getAttribute("application",pageContext.APPLICATION_SCOPE)+"<br>");
    %>
    </body>
    </html>

    這裏寫圖片描述

request對象

1.獲取請求頭/請求參數
服務器端負責解析請求頭/請求參數的就是JSP或Servlet,而JSP和Servlet取得請求參數的途徑就是request。request是HttpServletRequest的接口實例,提供了幾個方法獲取參數:

  • String getParameter(String paramName):獲取paramName請求參數的值.
  • Map getParameterMap():獲取所有請求參數名和參數值所組成的map對象
  • Enumberation getParameterNames():獲取所有請求參數名所組成的Enumeration對象
  • String[] getParameterValues(String name):parameter請求參數值,有多個值是,返回一個數組

獲取訪問請求頭

  • String getHeader(String name):請求頭的值
  • java.util.Enumeration < String > getHeaderNames():獲取所有請求頭的名稱
  • java.util.Enumeration < String > getHeaders(String name):獲取指定請求頭的多個值
  • int getIntHeader(String name):獲取指定請求頭的值,並將該值轉爲整數值。

——————————————————————————–

關注微信公衆號“閱享屋”可獲取900G IT教學視頻和JAVA、前端電子書籍
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章