JSP 這門技術(shù)最大的特點在于,寫 JSP就" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營銷資訊 > 網(wǎng)站運營 > JavaWeb詳解(第四篇)之JSP 簡介

JavaWeb詳解(第四篇)之JSP 簡介

時間:2023-05-30 21:57:01 | 來源:網(wǎng)站運營

時間:2023-05-30 21:57:01 來源:網(wǎng)站運營

JavaWeb詳解(第四篇)之JSP 簡介:

1、JSP概述

1.1、什么是JSP

  JSP 全稱是 Java Servlet Pages,它是和 servlet 技術(shù)一樣,都是 SUN 公司定義的一種用于動態(tài)開發(fā) web 資源的技術(shù)。

  JSP 這門技術(shù)最大的特點在于,寫 JSP就像在寫 html ,但:它相比 html 而言,html 只能為用戶提供靜態(tài)數(shù)據(jù),而 JSP 技術(shù)允許在頁面中嵌套 java 代碼,為用戶提供動態(tài)數(shù)據(jù)。

  jsp=html+css+javascript+java代碼+jsp標(biāo)簽(servlet)

1.2、為什么需要JSP

  我們在之前的學(xué)習(xí)中,經(jīng)常這樣寫:

相比Servlet 而言,servlet 很難對數(shù)據(jù)進(jìn)行排版(需要寫很多的標(biāo)簽、換行等),而 JSP 出了可以用 java 代碼產(chǎn)生動態(tài)數(shù)據(jù)的同時,也很容易對數(shù)據(jù)進(jìn)行排版,JSP就是替代Servlet輸出HTML的。

1.3、JSP的本質(zhì)

jsp頁面本質(zhì)上是一個Servlet程序。

如果是第一次訪問該 jsp 文件,web 服務(wù)器就會把 該 jsp 文件翻譯成一個同名的 Servlet 文件,然后再把 class 加載進(jìn)內(nèi)存,如果是第二次(或者以后)訪問,就直接訪問內(nèi)存中的實例,因此 jsp 也是單例,所以第一次訪問 jsp 網(wǎng)站的速度比較慢。 如果這個 jsp 文件被修改了,就相當(dāng)于重新訪問該 jsp 文件。

例如:新建一個a.jsp如下:

<%@ page contentType="text/html;charset=GBK" language="java" isErrorPage="true"%><!DOCTYPE html><html><head><title>a.jsp</title></head><body> <h1>我是a.jsp</h1> <% String s = "HelloWorld"; out.println(s); %></body></html> 當(dāng)我第一次訪問時,找到我們項目的部署位置:

然后找到Catalina目錄:../work/Catalina/localhost/JspWeb/org/apache/jsp

package org.apache.jsp;?import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.jsp.*;?public final class a_jsp extends org.apache.jasper.runtime.HttpJspBase implements org.apache.jasper.runtime.JspSourceDependent, org.apache.jasper.runtime.JspSourceImports {? private static final javax.servlet.jsp.JspFactory _jspxFactory = javax.servlet.jsp.JspFactory.getDefaultFactory();? private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;? private static final java.util.Set<java.lang.String> _jspx_imports_packages;? private static final java.util.Set<java.lang.String> _jspx_imports_classes;? static { _jspx_imports_packages = new java.util.HashSet<>(); _jspx_imports_packages.add("javax.servlet"); _jspx_imports_packages.add("javax.servlet.http"); _jspx_imports_packages.add("javax.servlet.jsp"); _jspx_imports_classes = null; }? private volatile javax.el.ExpressionFactory _el_expressionfactory; private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;? public java.util.Map<java.lang.String,java.lang.Long> getDependants() { return _jspx_dependants; }? public java.util.Set<java.lang.String> getPackageImports() { return _jspx_imports_packages; }? public java.util.Set<java.lang.String> getClassImports() { return _jspx_imports_classes; }? public javax.el.ExpressionFactory _jsp_getExpressionFactory() { if (_el_expressionfactory == null) { synchronized (this) { if (_el_expressionfactory == null) { _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory(); } } } return _el_expressionfactory; } //JSP也是Servlet,運行時只有一個實例 public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() { if (_jsp_instancemanager == null) { synchronized (this) { if (_jsp_instancemanager == null) { _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig()); } } } return _jsp_instancemanager; }? public void _jspInit() { }? public void _jspDestroy() { }? public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException {? //9大內(nèi)置對象 final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request); //頁面聲明了isErrorPage="true"屬性才會有 if (exception != null) { response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null;? try { response.setContentType("text/html;charset=GBK"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); out = pageContext.getOut(); _jspx_out = out;? out.write("/r/n"); out.write("<!DOCTYPE html>/r/n"); out.write("<html>/r/n"); out.write("<head>/r/n"); out.write("<title>a.jsp</title>/r/n"); out.write("</head>/r/n"); out.write("<body>/r/n"); out.write(" <h1>我是a.jsp</h1>/r/n"); out.write(" ");? String s = "HelloWorld"; out.println(s); out.write("/r/n"); out.write("</body>/r/n"); out.write("</html>"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { if (response.isCommitted()) { out.flush(); } else { out.clearBuffer(); } } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } }}  我們發(fā)現(xiàn)有個叫a_jsp.java的文件,跟蹤原代碼看到它它繼承了HttpJspBase 類。 HttpJspBase 類又繼承了 HttpServlet 類。 也就是說。 jsp 翻譯出來的 java 類, 它間接了繼承了 HttpServlet 類。 也就是說, 翻譯出來的是一個 Servlet 程序 。細(xì)心的人可能發(fā)現(xiàn),輸出跟我們手寫的很像,是的jsp幫我們完成了這部分復(fù)雜的工作。

JSP比Servlet更方便更簡單的一個重要原因就是:內(nèi)置了9個對象!內(nèi)置對象有:out、session、response、request、config、page、application、pageContext、exception。

2、JSP的語法

2.1、JSP的指令

JSP指令用來聲明JSP頁面的相關(guān)屬性,用于從 JSP 發(fā)送一個信息到容器,比如設(shè)置全局變量,文字編碼,引入包等。常用的指令如下:

JSP指令用來聲明JSP頁面的相關(guān)屬性,用于從 JSP 發(fā)送一個信息到容器,比如設(shè)置全局變量,文字編碼,引入包等。常用的指令如下:

<%@ page language="java" import="java.util.*" pageEncoding="GBK"%><%@ include file=" " %><%@ taglib prefix=" " uri="" %>

2.1.1、jsp 頭部的page指令

<%@ page contentType="text/html;charset=GBK" language="java" %> page 指令中常用屬性有:

2.1.2、include指令

注:被引入的 JSP 頁面中,不能夠存在與當(dāng)前頁面有沖突的變量。

語法<%@ include file=文件路徑 %>案例它會把b.jsp的內(nèi)容都包含進(jìn)來,再一起編譯<%@ include file=b.jsp %>

2.1.3、taglib指令

用來引入在JSP頁面中使用到的第三方標(biāo)簽庫。這個后面再詳細(xì)介紹。

2.2、JSP常用腳本

腳本元素就是 java頁面中的java代碼,也叫片段的scriplet。JSP腳本有三種方式:

1)JSP聲明:變量、方法和類的聲明。語法: <%!聲明變量、方法和類的代碼%>

2)JSP中嵌入Java代碼(片段)。語法:<% java代碼 %>

3)JSP表達(dá)式。語法:<%=變量或可以返回值的方法或 Java 表達(dá)式%>

注:函數(shù)不能在<% %>(java片段)中定義

2.3、JSP文件的注釋

三種方式:

1)<!-- 注釋的內(nèi)容 --> html的注釋方法,可以在 JSP 中使用

2)<%-- 注釋的內(nèi)容 --%> jsp 專用的注釋

3)//單行注釋 /*多行注釋*/ /**文檔注釋*/java 注釋

區(qū)別:

<!-- -->會在 servlet 中生成對應(yīng)的 out.write(“<!-- -->”),這樣在返回給瀏覽器的靜態(tài)頁面中也有<!-- --> ,只是用戶看不到而已;

<%-- --%> 則在 servlet 中沒有任何輸出,建議使用<%-- --%>

java 注釋,會被翻譯到j(luò)ava源代碼中!

2.4、JSP的動作

JSP動作(JSP Actions)是一組JSP內(nèi)置的標(biāo)簽,只書寫少量的標(biāo)記代碼就能夠使用JSP提供豐富的功能,JSP行為是對常用的JSP功能的抽象和封裝。
JSP Actions是使用 xml 語法寫的,是 jsp 規(guī)定的一些列標(biāo)準(zhǔn)動作,在容器處理 jsp 時,當(dāng)容器遇到動作元素時,就執(zhí)行相應(yīng)的操作??赡芸赐旮拍钸€是很抽象。

常用的JSP動作有:

<jsp:include page="relativeURL|<%=expressicry%>"></jsp:include>

<jsp:forword file=”/WEB-INF/xx.jsp”></jsp:forword>

<jsp:forward page="跳轉(zhuǎn)的jsp頁面"> [<jsp:param name="" value=""/>] [<jsp:param name="" value=""/>] </jsp:forward> 轉(zhuǎn)發(fā)

JSP Actions語法描述
include<jsp:include page="relativeURL|<%=expressicry%>"></jsp:include>動態(tài)引入另一個文件
forward<jsp:forward page="跳轉(zhuǎn)的jsp頁面">[<jsp:param name="" value=""/>][<jsp:param name="" value=""/></jsp:forward>轉(zhuǎn)發(fā)在開發(fā)jsp的過程中,我們通常把jsp放入WEB-INF目錄,目的是為了防止用戶直接訪問這些jsp文件.在WebRoot下我們有一個入口頁面,它的主要轉(zhuǎn)發(fā)<jsp:forward file="/WEB-INF/xx.jsp"></jsp:forward>
param<jsp:param name="" value=""/>給一個 JSP 設(shè)置參數(shù),常常與<jsp:include>或者<jsp:forward>集合使用<jsp:include page=""><jsp:param name="" value=""/><jsp:param name="" value=""/></jsp:include>,也可以給Bean或Applet傳遞參數(shù)。
useBean<jsp:useBean class="" id=""></jsp:useBean>創(chuàng)建一個 javaBean 實例
setProperty<jsp:setProperty name="對象" property="屬性" value="屬性值" scope="作用域"/>給一個 javaBean 實例屬性賦值
getProperty<jsp:getProperty property="" name=""/>取得一個 javaBean 實例的成員變量
plugin<sp:plugin code="" codebase="" type="bean"></jsp:plugin>使用插件
fallback<jsp:fallback></jsp:fallback>指定瀏覽器不支持或無法啟動Bean或Applet時,在頁面上打印輸出信息
directive<jsp:directive.include file="head.jsp"></jsp:directive.include>替代指令`<%@%>`的語法的

2.4.1、include動作

  前面已經(jīng)提及到了,include指令是靜態(tài)包含,include動作是動態(tài)包含其實include行為就是封裝了request.getRequestDispatcher(String url).include(request,response)。

動態(tài)包含也可以像靜態(tài)包含一樣。 把被包含的內(nèi)容執(zhí)行輸出到包含位置。而include動作和include指令的區(qū)別:

1)屬性不同

 include 指令通過 file 屬性來指定被包含的頁面,該屬性不支持任何表達(dá)式。

<jsp:include> 動作是通過 page 屬性來指定被包含頁面的,該屬性支持 JSP 表達(dá)式。

2)處理方式不同

  使用 include 指令包含文件時,被包含文件的內(nèi)容會原封不動地插入到包含頁中使用該指令的位置,然后 JSP 編譯器再對這個合成的文件進(jìn)行翻譯,所以最終編譯后的文件只有一個。(靜態(tài)包含,被包含文件盡量不要使用<html></html>、<body></body>這種標(biāo)記,還要避免變量沖突)

  而使用<jsp:include> 動作包含文件時,只有當(dāng)該標(biāo)記被執(zhí)行時,才會引入被包含的的頁面進(jìn)行編譯,再將譯之后的視圖再引入到當(dāng)前頁面,然后繼續(xù)執(zhí)行后面的代碼。所以被引入的頁面即使有與當(dāng)前相同的Java變量也沒影響。

(如果被包含的文件改變,則靜態(tài)包含的主頁面需要重新編譯。而動態(tài)包含只須重新編譯被包含的文件即可。)

注:動態(tài)包含的原理(使用如下代碼去調(diào)用被包含的 jsp 頁面)

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "b.jsp", out, false);

2.4.2、forward動作

  前面我們學(xué)習(xí)servlet的時候,我們使用request.getRequestDispatcher(String url).forward(request,response),進(jìn)行跳轉(zhuǎn),而使用forward動作其實是對他的封裝。

使用案例1:

1)新建一個b.jsp

2)在a.jsp中加入

<%@ page contentType="text/html;charset=GBK" language="java"%><!DOCTYPE html><html><head><title>a.jsp</title></head><body> <h1>我是a.jsp</h1> <% String s = "HelloWorld"; out.println(s); %> <jsp:forward page="b.jsp"></jsp:forward></body></html>3)案例效果

4)查看編譯后的源碼

if (true) { _jspx_page_context.forward("b.jsp"); return;}使用案例2:

1)在a.jsp中加入

<jsp:forward page="b.jsp"> <jsp:param name="username" value="mjx"/> <jsp:param name="password" value="123"/></jsp:forward>2)在b.jsp中使用

我獲取到的參數(shù):<% String username = request.getParameter("username"); String password = request.getParameter("password");%><br>用戶名:<%=username %><br>密碼:<%=password %>3)案例效果

2.4.3、param動作

當(dāng)使用<jsp:include></jsp:forword>時可以使用param動作向這個資源傳遞參數(shù)。上面的案例中已經(jīng)使用到了,這里就不再演示了。

擴(kuò)展:什么是javaBean

在學(xué)習(xí)useBean動作之前我們先了解下,什么是javaBean?

1)什么是javaBean

JavaBean是一個遵循特定寫法的Java類,它通常具有如下特點:

a)這個Java類必須具有一個無參的構(gòu)造函數(shù);

b)屬性必須私有化;

c)私有化的屬性必須通過public類型的方法暴露給其它程序,并且方法的命名也必須遵守一定的命名規(guī)范;

2)為什么需要javaBean

Java語言欠缺屬性、事件、多重繼承功能。不像html的標(biāo)簽、js對象都有很多內(nèi)置的屬性。當(dāng)我們在JSP頁面嵌入大量的HTML 代碼、JS 代碼、CSS 代碼、Java 代碼,這就使得我們的頁面結(jié)構(gòu)很混亂。而且需要我們自己手寫大量的膠水代碼,重復(fù)的聲明使用,javaBean正是編寫這套膠水代碼的慣用模式或約定,JavaBean 使得 JSP編程模式變得清晰,程序可讀性強(qiáng)。JavaBean 將程序的業(yè)務(wù)邏輯封裝成 Java 類,提高了程序的可維護(hù)性和代碼的可重用性。

例如:

public class User {? //------------------User類封裝的私有屬性--------------------------------------- // 姓名 String類型 private String name; // 性別 String類型 private String sex; // 年齡 int類型 private int age; //------------------User類的無參數(shù)構(gòu)造方法--------------------------------------- public User() { }? //------------------User類對外提供的用于訪問私有屬性的public方法----------------------- public String getName() { return name; }? public void setName(String name) { this.name = name; }? public String getSex() { return sex; }? public void setSex(String sex) { this.sex = sex; }? public int getAge() { return age; }? public void setAge(int age) { this.age = age; } } 在學(xué)useBean之前,我們要使用一個對象,可能會這樣寫:

<%@ page contentType="text/html;charset=GBK" language="java"%><%@ page import="com.cn.domain.User" %>?<!DOCTYPE html><html><head><title>a.jsp</title></head><body> <h1>我是a.jsp</h1> <% User u = new User(); u.setName("mjx"); u.setAge(18); u.setSex("男"); %> <% String userInfo = "姓名:"+u.getName() +" 性別:"+u.getSex()+" 年齡:"+u.getAge();%> <%=userInfo %></body></html>案例效果:

2.4.4、useBean動作

<jsp:useBean>用于在指定的域范圍內(nèi)查找指定名稱的JavaBean對象。

1)如果在指定的范圍已經(jīng)存在該 bean 實例,那么將使用這個實例,而不會重新創(chuàng)建。

2)如果不存在則實例化一個新的JavaBean對象并將它以指定的名稱存儲到指定的域范圍中。

語法一(常用):<jsp:useBean id="實例化對象的名稱" class="類的全名" scope="保存范圍page|request|session|application" ></jsp:useBean>?語法二:<jsp:useBean id="stu" class="com.Bean.StudentInfo" type="com.Bean.StudentBase(父類)" scope="session" />使用案例:

<%@ page contentType="text/html;charset=GBK" language="java"%>?<!DOCTYPE html><html><head><title>a.jsp</title></head><body> <h1>我是a.jsp</h1> <jsp:useBean id="user" class="com.cn.domain.User" scope="page"/> <% user.setName("mjx"); user.setAge(18); user.setSex("男"); %> <% String userInfo = "姓名:"+user.getName() +" 性別:"+user.getSex()+" 年齡:"+user.getAge();%> <%=userInfo %></body></html>案例編譯部分源碼:

com.cn.domain.User user = null;user = (com.cn.domain.User) _jspx_page_context.getAttribute("user", javax.servlet.jsp.PageContext.PAGE_SCOPE);if (user == null){ //這里就是為什么需要一個無參構(gòu)造了 user = new com.cn.domain.User(); _jspx_page_context.setAttribute("user", user, javax.servlet.jsp.PageContext.PAGE_SCOPE);}user.setName("mjx");user.setAge(18);user.setSex("男");String userInfo = "姓名:"+user.getName() +" 性別:"+user.getSex()+" 年齡:"+user.getAge();

2.4.5、setProperty動作

<jsp:setProperty> 動作標(biāo)記通常與<jsp:useBean>動作標(biāo)記一起使用,它以請求中的參數(shù)給創(chuàng)建的JavaBean中對應(yīng)的屬性賦值,通過調(diào)用 bean 中的 setXxx() 方法來完成。

使用案例1:

以前我們可能會這樣寫:

1)修改b.jsp為

<%@ page contentType="text/html;charset=GBK" language="java"%><!DOCTYPE html><html><head><title>b.jsp</title></head><body> <form action="a.jsp" method="post"> 用戶名:<input type="text" name="name"><br> 性別:<input type="text" name="sex"><br> 年齡:<input type="text" name="age"><br> <input type="submit" value="提交"> </form></body></html>2)修改a.jsp

<%@ page contentType="text/html;charset=GBK" language="java"%>?<!DOCTYPE html><html><head><title>a.jsp</title></head><body> <h1>我是a.jsp</h1> <jsp:useBean id="user" class="com.cn.domain.User" scope="page"/> <% String name = request.getParameter("name"); String sex = request.getParameter("sex"); int age = Integer.parseInt(request.getParameter("age")); user.setName(name); user.setSex(sex); user.setAge(age); %> <% String userInfo = "姓名:"+user.getName() +" 性別:"+user.getSex()+" 年齡:"+user.getAge();%> <%=userInfo %></body></html>使用案例2:

<%@ page contentType="text/html;charset=GBK" language="java"%>?<!DOCTYPE html><html><head><title>a.jsp</title></head><body> <h1>我是a.jsp</h1> <% request.setCharacterEncoding("GBK"); %> <jsp:useBean id="user" class="com.cn.domain.User" scope="page"/> <!--name:對象名稱 property:屬性名稱,如果指定為*號則自動匹配 value:指定值 --> <jsp:setProperty name:"user" property="name" value="自定義名字"/> <jsp:setProperty name="user" property="age"/> <jsp:setProperty name="user" property="sex" /> <% String userInfo = "姓名:"+user.getName() +" 性別:"+user.getSex()+" 年齡:"+user.getAge(); %> <%=userInfo %></body></html>案例使用原理:

org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("user"), "name", "自定義名字", null, null, false); out.write("/r/n"); out.write(" "); org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("user"), "age", request.getParameter("age"), request, "age", false); out.write("/r/n"); out.write(" "); org.apache.jasper.runtime.JspRuntimeLibrary.introspecthelper(_jspx_page_context.findAttribute("user"), "sex", request.getParameter("sex"), request, "sex", false); 需要保持表單中的屬性名和定義的javaBean屬性名一致的原因就是,編譯后是使用request.getParameter("sex")的值。并且,類型都會幫我們自動轉(zhuǎn)換。

2.4.6、getProperty動作

<jsp:getProperty>標(biāo)記用來獲得 bean中的屬性,并將其轉(zhuǎn)換為字符串,再在 JSP 頁面中輸出,該 bean 中必須具有 getXxx() 方法。

在上面的案例中,我們雖然設(shè)置好了對象的值,但是還是手動獲取的。有了這個動作之后,我們就可以使用這個動作獲取了。

使用案例:

<%@ page contentType="text/html;charset=GBK" language="java"%>?<!DOCTYPE html><html><head><title>a.jsp</title></head><body> <h1>我是a.jsp</h1> <% request.setCharacterEncoding("GBK"); %> <jsp:useBean id="user" class="com.cn.domain.User" scope="page"/> <%--自動匹配并設(shè)置值--%> <jsp:setProperty name="user" property="*"/> <%--自動匹配并設(shè)置值--%> 姓名:<jsp:getProperty name="user" property="name"/> 性別:<jsp:getProperty name="user" property="sex"/> 年齡:<jsp:getProperty name="user" property="age"/></body></html>案例效果:

3、JSP的內(nèi)置對象

前面我們發(fā)現(xiàn),不管是request也好、out也好,我們都能在jsp頁面中直接使用。在前面我們也提到過JPS內(nèi)置了9大對象:

3.1、request對象

request對象是javax.servlet.HttpServletRequest類型的對象。該對象代表了客戶端的請求信息,主要用于接受通過HTTP協(xié)議傳送到服務(wù)器的數(shù)據(jù)。(包括頭信息、系統(tǒng)信息、請求方式以及請求參數(shù)等)。request對象的作用域為一次請求。

在介紹servlet一文中,已經(jīng)介紹過HttpServletRequest,用法差不多,這里就不再詳細(xì)介紹了。

3.2、response對象

response對象是HttpServletResponse類型的對象,代表的是服務(wù)器對客戶端的響應(yīng),主要是將JSP容器處理過的對象傳回到客戶端。response對象也具有作用域,它只在JSP頁面內(nèi)有效。

在介紹servlet一文中,已經(jīng)介紹過HttpServletResponse,用法差不多,這里就不再詳細(xì)介紹了。

3.3、application對象

application 對象是ServletContext類型的對象,用于保存應(yīng)用程序的公用數(shù)據(jù),服務(wù)器啟動并自動創(chuàng)建 application 對象后,只要沒有關(guān)閉服務(wù)器,application 對象就一直存在,所有用戶共享 application 對象。

在介紹servlet一文中,已經(jīng)介紹過ServletContext,用法差不多,這里就不再詳細(xì)介紹了。

3.4、session對象

session對象是HttpSession類型的對象,作用域一次會話的所有頁面之間,只要保持同一會話,把一個鍵值對設(shè)置到session中,無論跳轉(zhuǎn)到哪個頁面都可以取到session中的鍵值對。

在介紹servlet會話技術(shù)一文中,已經(jīng)介紹過HttpSession,用法差不多,這里就不再詳細(xì)介紹了。

3.5、config對象

config 對象是 javax.servlet.Servlet類的實例,表示 Servlet 的配置信息。

在介紹servlet一文中,已經(jīng)介紹過ServletConfig,用法差不多,這里就不再詳細(xì)介紹了。

3.6、out對象

out 對象是一個輸出流,用來向客戶端輸出數(shù)據(jù),可以是各種數(shù)據(jù)類型的內(nèi)容,同時,它還可以管理應(yīng)用服務(wù)器上的輸出緩沖區(qū),緩沖區(qū)的默認(rèn)值是 8KB,可以通過頁面指令 page 來改變默認(rèn)大小。

out 對象是一個繼承自抽象類 javax.servlet.jsp.JspWriter 的實例,在實際應(yīng)用中,out 對象會通過 JSP 容器變換為 java.io.PrintWriter 類的對象。(可以簡單理解:JspWriter就是帶緩存的PrintWrieter)

常用API:

3.6.1、jsp 中 out 和 response.getwriter()的區(qū)別

使用案例:

<%@ page contentType="text/html;charset=GBK" language="java"%><!DOCTYPE html><html><head><title>c.jsp</title></head><body> <h1>我是c.jsp</h1> <% // out 輸出 out.write("這是 out 的第一次輸出<br/>"); // out flush 之后。 會把輸出的內(nèi)容寫入 writer 的緩沖區(qū)中 out.flush(); // 最后一次的輸出, 由于沒有手動 flush, 會在整個頁面輸出到客戶端的時候, 自動寫入到 writer緩沖區(qū) out.write("這是 out 的第二次輸出<br/>"); // writer 的輸出 response.getWriter().write("這是 writer 的第一次輸出<br/>"); response.getWriter().write("這是 writer 的第二次輸出<br/>"); %></body></html>案例效果:

只有向out對象中寫入了內(nèi)容,且滿足如下任何一個條件時,out對象才去調(diào)用ServletResponse.getWriter方法,并通過該方法返回的PrintWriter對象將out對象的緩沖區(qū)中的內(nèi)容真正寫入到Servlet引擎提供的緩沖區(qū)中

1)設(shè)置page指令的buffer屬性關(guān)閉了out對象的緩存功能(或主動調(diào)用flush()方法刷新緩沖區(qū))

2)out對象的緩沖區(qū)已滿

3)整個JSP頁面結(jié)束

3.7、page對象

page 對象是為了執(zhí)行當(dāng)前頁面應(yīng)答請求而設(shè)置的 Servlet類的實體,即顯示 JSP頁面自身,與類的 this 指針類似,使用它來調(diào)用 Servlet 類中所定義的方法,只有在本頁面內(nèi)才是合法的。它是 java.lang.Object 類的實例。

常用API:

3.8、exception對象

java.lang.Throwable 的實例,該實例代表其他頁面中的異常和錯誤。只有當(dāng)頁面是錯誤處理頁面,即編譯指令page 的isErrorPage 屬性為true 時,該對象才可以使用。常用的方法有g(shù)etMessage()和printStackTrace()等。

使用案例:

1)新建一個d.jsp

<%@ page contentType="text/html;charset=GBK" language="java" errorPage="error.jsp" %><html><head> <title></title></head><body><%--模擬空指針異常的錯誤--%><% String isnull = null; isnull.length();%></body></html>2)新建一個error.jsp

<%@ page language="java" contentType="text/html; charset=GBK" pageEncoding="GBK" isErrorPage="true"%><!--注意:isErrorPage="true"時才能使用exception--><!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; GBK"><title>Insert title here</title></head><body> <%out.println("程序拋出了異常:" + exception); %></body></html>3)案例效果:

3.9、pageContext對象

pageContext對象是JSP技術(shù)中最重要的一個對象,它代表JSP頁面的運行環(huán)境,這個對象不僅封裝了對其它8大隱式對象的引用,它自身還是一個域?qū)ο螅梢杂脕肀4鏀?shù)據(jù)。并且,這個對象還封裝了web開發(fā)中經(jīng)常涉及到的一些常用操作,例如引入和跳轉(zhuǎn)其它資源、檢索其它域?qū)ο笾械膶傩缘取?/b>

官方文檔上描述:
PageContext 為頁面/組件作者和頁面實現(xiàn)者提供了許多工具,其中包括:
-管理各種范圍名稱空間的單個 API
-許多便捷 API,用于訪問各種公共對象
-獲取 JspWriter 以供輸出的機(jī)制
- 通過頁面管理會話使用的機(jī)制
-向腳本環(huán)境公開頁面指令屬性的機(jī)制
-將當(dāng)前請求轉(zhuǎn)發(fā)或包含到應(yīng)用程序中其他活動組件的機(jī)制
-處理 errorpage 異常處理的機(jī)制
pageContext對象常用API:

使用案例:

1)新建e.jsp

<%@ page contentType="text/html;charset=GBK" language="java"%><!DOCTYPE html><html><head><title>e.jsp</title></head><body> <h1>我是e.jsp</h1> <% request.setAttribute("info","value of request scope"); session.setAttribute("info","value of request scope"); application.setAttribute("info","value of application scope"); %> pageContext 查找各個范圍內(nèi)的值:查找順序page—>request->session->application <br> 輸出: <%=pageContext.findAttribute("info") %> <hr> pageContext 取出以下范圍內(nèi)的值(方法一):<br> request 設(shè)定的值:<%=pageContext.getRequest().getAttribute("info") %> <br> session 設(shè)定的值:<%=pageContext.getSession().getAttribute("info") %> <br> application 設(shè)的值:<%=pageContext.getServletContext().getAttribute("info") %> <hr> pageContext取出以下范圍內(nèi)各值(方法二):<br> 范圍1(page)內(nèi)的值:<%=pageContext.getAttribute("info",1) %> <br> 范圍2(request)內(nèi)的值:<%=pageContext.getAttribute("info",2) %> <br> 范圍3(session)內(nèi)的值:<%=pageContext.getAttribute("info",3) %> <br> 范圍4(application)內(nèi)的值:<%=pageContext.getAttribute("info",4) %> <hr> pageContext 修改或刪除某個范圍內(nèi)的值: 1)修改 request 設(shè)定的值:<br> <% pageContext.setAttribute("info","value of request scope is modified by pageContext",2); %> <br> 修改后的值:<%=pageContext.getRequest().getAttribute("info") %> <br> 2)刪除 session 設(shè)定的值:<% pageContext.removeAttribute("info"); %> 刪除后的值:<%=session.getAttribute("info") %></body></html>2)案例效果

4、JSP的四大域?qū)ο?/b>

域?qū)ο罂梢韵馦ap一樣存取數(shù)據(jù)對象。四個域?qū)ο蟮墓δ芤粯?,不同的是它們對?shù)據(jù)的存取范圍。在使用上它們是有優(yōu)先順序的。

四大域?qū)ο蠓謩e是:

優(yōu)先順序(范圍從小到大):

使用案例:

1)新建scope.jsp

<%@ page contentType="text/html;charset=GBK" language="java"%><!DOCTYPE html><html><head><title>c.jsp</title></head><body> <h1>scope.jsp</h1> <% // 往四個域中都分別保存了數(shù)據(jù) pageContext.setAttribute("key", "pageContext"); request.setAttribute("key", "request"); session.setAttribute("key", "session"); application.setAttribute("key", "application"); %> pageContext 域是否有值: <%=pageContext.getAttribute("key")%> <br> request 域是否有值: <%=request.getAttribute("key")%> <br> session 域是否有值: <%=session.getAttribute("key")%> <br> application 域是否有值: <%=application.getAttribute("key")%> <br> <% session.setAttribute("findKey", "session"); application.setAttribute("findKey", "application"); %><br> 使用key去查找值:按作用域從小到大查<br> key:<%=pageContext.findAttribute("key")%><br> findKey:<%=pageContext.findAttribute("findKey")%></body></html>2)案例效果



關(guān)鍵詞:

74
73
25
news
  • 網(wǎng)站
  • 營銷
  • 設(shè)計
  • 運營
  • 優(yōu)化
  • 效率
  • 專注
  • 電商
  • 方案
  • 推廣
為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點擊下載Chrome瀏覽器
關(guān)閉