日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Head First JSP---随笔五

發(fā)布時(shí)間:2025/3/15 javascript 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Head First JSP---随笔五 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作為JSP

JSP變成Servlet。這個(gè)servlet不用你來創(chuàng)建。容器會(huì)查看你的JSP,把它轉(zhuǎn)換成Java源代碼,在編譯成完整的Java servlet類。


JSP技術(shù)模型

6.1 識(shí)別或描述以下元素,或?yàn)橐韵略鼐帉慗SP代碼:

  • 模板文本
  • 腳本元素(注釋、指令、聲明、scriptlet和表達(dá)式)
  • 標(biāo)準(zhǔn)動(dòng)作和制定動(dòng)作
  • 表達(dá)式語言元素
  • 6.2 編寫使用以下指令的JSP代碼:

  • page(帶有屬性import、session、contentType和isELIgnored)
  • include
  • taglib
  • 6.3 編寫使用了正確語法的JSP文檔(基于XML的文檔)

    6.4 描述頁面生命周期的作用和事件序列:

  • JSP頁面轉(zhuǎn)換
  • JSP頁面編譯
  • 加載類
  • 創(chuàng)建實(shí)例
  • 調(diào)用jspInit方法
  • 調(diào)用_jspService方法
  • 調(diào)用_jspDestroy方法
  • 6.5 給定一個(gè)設(shè)計(jì)目標(biāo),使用適當(dāng)?shù)仉[式對(duì)象編寫JSP代碼:

  • request
  • response
  • out
  • session
  • config
  • application
  • page
  • pageContext
  • exception
  • 6.6 配置部署描述文件來聲明一個(gè)或多個(gè)標(biāo)記庫,禁用計(jì)算(表達(dá)式)語言,以及禁用腳本語言

    6.7 給定一個(gè)特定的設(shè)計(jì)目標(biāo),要求將一個(gè)JSP片段包含在另一個(gè)頁面中,編寫JSP代碼使用最合適的包含機(jī)制(include指令或jsp:include標(biāo)準(zhǔn)動(dòng)作)


    JSP變成一個(gè)servlet

    這一章將解決下面幾個(gè)問題:

  • JSP文件中的各個(gè)部分最后會(huì)放在servlet源代碼中的說明位置?
  • 能訪問JSP頁面的“servlet性”嗎?例如,JSP中有ServletConfig或ServletContext的概念嗎?
  • JSP中可以放哪些類型的元素?
  • JSP中的不同元素有什么語法?
  • JSP的生命周期是怎樣的?能介入到JSP生命周期中嗎?
  • JSP中的不同元素在最后的servlet中如何交互?

  • 建立一個(gè)JSP顯示被訪問了多少次

    開發(fā)環(huán)境:

    BasicCounter.jsp文件代碼:

    <!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"> </head> <body> The page count is: <% //JSP不認(rèn)識(shí)Counter類,所以需要foo.Counterout.println(foo.Counter.getCount()); %> </body> </html>

    Counter.java文件代碼:

    package foo;public class Counter {private static int count = 0;public static synchronized int getCount() {count++;return count;} }

    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"><welcome-file-list><welcome-file>/BasicCounter.jsp</welcome-file></welcome-file-list></web-app>

    實(shí)驗(yàn)結(jié)果:


    使用page指令導(dǎo)入包

    我們發(fā)現(xiàn)寫foo有點(diǎn)麻煩。所以,使用page指令導(dǎo)入包。將JSP文件代碼更改為:

    <%@ page import="foo.*" %> <!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"> </head> <body> The page count is: <% out.println(Counter.getCount()); %> </body> </html>

    實(shí)驗(yàn)結(jié)果:

    指令有3種:

  • page
  • include
  • taglib
  • page允許你導(dǎo)入包。導(dǎo)入多個(gè)包<%@ page import="foo.*,java.util.*" %>

    記住:<%@ page import = ? %>中的page是指令,import是page的屬性,?是屬性的值


    表達(dá)式

    我們在JSP代碼里面使用了out.println(),我們應(yīng)該盡量的避免這樣的做法。所以可以更改JSP代碼:

    <%@ page import="foo.*" %> <!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"> </head> <body> The page count is: <%= Counter.getCount() %> </body> </html>

    實(shí)驗(yàn)結(jié)果:

    我們已經(jīng)看到3種不同類型的JSP元素:

  • Scriptlet:<% %>
  • 指令:<%@ %>
  • 表達(dá)式:<%= %>
  • 容器看到<%= Counter.getCount()%>就會(huì)把它轉(zhuǎn)換為out.print(Counter.getCount());

    如果看到的是<%= Counter.getCount();%>,注意最后一個(gè)分號(hào),容器會(huì)轉(zhuǎn)換成out.print(Counter.getCount(););這種樣子,明顯會(huì)報(bào)錯(cuò)

    要記住:不要在表達(dá)式的最后加分號(hào)(還有要注意的地方就是,表達(dá)式不能輸出一個(gè)void的類型,想想如果調(diào)用一個(gè)返回值為void的方法,就會(huì)報(bào)錯(cuò))。


    一個(gè)炸彈

    修改JSP文件代碼如下:

    <%@ page import="foo.*" %> <!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"> </head> <body> //定義一個(gè)變量是count,JSP是一個(gè)servlet <% int count = 0; %> The page count is: //count+1 <%= ++count %> </body> </html>

    我們認(rèn)為JSP是一個(gè)servlet,用scriptlet聲明一個(gè)變量,然后去使用它。結(jié)果剛剛開始的時(shí)候還不錯(cuò),如下:

    第二次訪問:

    發(fā)現(xiàn)怎么和結(jié)果1等同呢?

    于是我們查看jsp最后會(huì)變成一個(gè)什么樣的servlet代碼。如下:

    /** Generated by the Jasper component of Apache Tomcat* Version: Apache Tomcat/9.0.4* Generated at: 2018-08-02 12:04:37 UTC* Note: The last modified time of this file was set to* the last modified time of the source file after* generation to assist with modification tracking.*/ package org.apache.jsp;import javax.servlet.*; import javax.servlet.http.*; //與servlet的差別 import javax.servlet.jsp.*; //導(dǎo)入的包 import foo.*;//繼承也不一樣 public final class BasicCounter_jsp extends org.apache.jasper.runtime.HttpJspBaseimplements 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("foo");_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;}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() {}//service方法public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)throws java.io.IOException, javax.servlet.ServletException {final java.lang.String _jspx_method = request.getMethod();if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");return;}//下面是隱式對(duì)象final javax.servlet.jsp.PageContext pageContext;javax.servlet.http.HttpSession session = null;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");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 PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");out.write("<html>\r\n");out.write("<head>\r\n");out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");out.write("</head>\r\n");out.write("<body>\r\n");//我們寫的代碼,定義一個(gè)變量int count = 0; out.write("\r\n");out.write("The page count is:\r\n");//我們寫的代碼,然count+1out.print( ++count );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);}} }

    由上面代碼的注釋就知道了,原來我們定義的count是局部變量。因此我們知道了我們的原因。


    另一個(gè)JSP元素

    我們想要聲明一個(gè)全局變量。

    將JSP代碼修改為(<%! %>設(shè)置全局變量):

    <%@ page import="foo.*" %> <!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"> </head> <body> //設(shè)置全局變量 <%! int count = 0; %> The page count is: <%= ++count %> </body> </html>

    我們在看看JSP.java文件的代碼:

    /** Generated by the Jasper component of Apache Tomcat* Version: Apache Tomcat/9.0.4* Generated at: 2018-08-02 12:20:55 UTC* Note: The last modified time of this file was set to* the last modified time of the source file after* generation to assist with modification tracking.*/ package org.apache.jsp;import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; import foo.*;public final class BasicCounter_jsp extends org.apache.jasper.runtime.HttpJspBaseimplements org.apache.jasper.runtime.JspSourceDependent,org.apache.jasper.runtime.JspSourceImports {//count變成了全局變量int count = 0; 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("foo");_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;}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 {final java.lang.String _jspx_method = request.getMethod();if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");return;}final javax.servlet.jsp.PageContext pageContext;javax.servlet.http.HttpSession session = null;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");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 PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\r\n");out.write("<html>\r\n");out.write("<head>\r\n");out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\r\n");out.write("</head>\r\n");out.write("<body>\r\n");out.write("\r\n");out.write("The page count is:\r\n");out.print( ++count );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);}} }

    正如上面代碼所看見的,count變成了全局變量。實(shí)驗(yàn)效果很好,會(huì)一直累計(jì)訪問次數(shù)。


    方法聲明

    修改JSP文件代碼:

    <%@ page import="foo.*" %> <!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"> </head> <body> //JSP中定義方法 <%! int doubleCount(){count = count*2;return count; } %> <%! int count = 0; %> The page count is: <%= ++count %> </body> </html>

    JSP.java文件在int count的上方增加了下面這樣的一段代碼:

    //方法定義 int doubleCount(){count = count*2;return count; } //全局變量 int count = 0;

    于是乎,我們好像知道了JSP就是一個(gè)servlet。


    容器如何處理JSP

  • 查看指令,得到轉(zhuǎn)換時(shí)可能需要的信息。(比如導(dǎo)包)
  • 創(chuàng)建一個(gè)HttpServlet子類,所生成的servlet會(huì)拓展:org.apache.jasper.runtime.HttpJspBase
  • 如果有聲明,容器會(huì)將這些聲明寫到類文件中,通常放在類聲明下面,并在服務(wù)方法前面。(正如我們所看到的Tomcat聲明了好多靜態(tài)變量和好多方法)
  • 建立服務(wù)方法。服務(wù)方法的具體方法名是_jspService()。這個(gè)方法由servlet超類被覆蓋的service()方法調(diào)用,要接收HttpServletRequest和HttpServletResponse參數(shù)在建立這個(gè)方法時(shí),容器會(huì)聲明并初始化所有隱式對(duì)象
  • 將普通的HTML(稱為模板文本)、scriptlet和表達(dá)式放到服務(wù)方法中,完成格式化,并寫至PrintWriter響應(yīng)輸出。

  • 隱式對(duì)象

    API隱式對(duì)象
    JspWriterout
    HttpServletRequestrequest
    HttpServletResponseresponse
    HttpSessionsession
    ServletContextapplication
    ServletConfigconfig
    Throwableexception
    PageContextpageContext
    Objectpage

    我們這里說說第4個(gè)作用域:pageContext(頁面級(jí)作用域)

    其中PageContext封裝了其他隱式對(duì)象,所以如果向某些輔助對(duì)象提供一個(gè)PageContext引用,這些輔助對(duì)象就可以使用這個(gè)PageContext引用得到其他隱式對(duì)象的引用以及所有作用域的屬性。

    再說說exception,只有指定“錯(cuò)誤頁面”才能用到這個(gè)隱式對(duì)象


    練習(xí)

    開發(fā)環(huán)境:

    hobby.html代碼:

    <%@ page import="java.util.*" %> <html> <body>The friends who share your hobby of<%= request.getParameter("hobby") %>are:<br><% ArrayList al = (ArrayList)request.getAttribute("names");%><% Iterator it = al.iterator(); %><% while(it.hasNext()){ %><%= it.next() %> <br><% } %> </body> </html>

    Hobby.java這個(gè)servlet代碼:

    package foo;import java.io.IOException; import java.util.ArrayList;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class Hobby extends HttpServlet{private static final long serialVersionUID = 1L;@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType("html/text");ArrayList<String> al = new ArrayList<String>();al.add("Fred");al.add("Pradeep");al.add("Philippe");request.setAttribute("names", al);request.getRequestDispatcher("/BasicCounter.jsp").forward(request, response);} }

    BasicCounter.jsp代碼:

    <%@ page import="java.util.*" %> <html> <body>The friends who share your hobby of<%= request.getParameter("hobby") %>are:<br><% ArrayList al = (ArrayList)request.getAttribute("names");%><% Iterator it = al.iterator(); %><% while(it.hasNext()){ %><%= it.next() %> <br><% } %> </body> </html>

    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"><servlet><servlet-name>hobby</servlet-name><servlet-class>foo.Hobby</servlet-class></servlet><servlet-mapping><servlet-name>hobby</servlet-name><url-pattern>/HobbyPage.do</url-pattern></servlet-mapping><welcome-file-list><welcome-file>/hobby.html</welcome-file></welcome-file-list></web-app>

    實(shí)驗(yàn)結(jié)果:

    點(diǎn)擊提交后:


    所生成servlet的API

    JSP的UML圖:

    3個(gè)關(guān)鍵方法:

  • jspInit(),這個(gè)方法由init()方法調(diào)用。可以覆蓋這個(gè)方法。
  • jspDestroy(),這個(gè)方法由servlet的destroy()方法調(diào)用。可以覆蓋這個(gè)方法。
  • _jspService(),這個(gè)方法由servlet的service()方法調(diào)用,這說明,對(duì)于每個(gè)請(qǐng)求,它會(huì)在一個(gè)單獨(dú)的線程中運(yùn)行。容器將Request和Response對(duì)象傳遞給這個(gè)方法。不能覆蓋這個(gè)方法。

  • JSP生命周期

  • 部署.jsp文件,此時(shí)不做任何事情
  • 客戶請(qǐng)求.jsp文件,將.jsp文件轉(zhuǎn)換成一個(gè)servlet.java文件
  • 容器嘗試這把這個(gè).java文件被編譯為.class文件
  • 容器加載servlet類
  • 容器實(shí)例化servlet并調(diào)用jspInit()方法
  • 容器創(chuàng)建一個(gè)新線程來處理這個(gè)請(qǐng)求,通過調(diào)用_jspService()方法
  • 調(diào)用jspDestroy()方法銷毀servlet實(shí)例
  • 這里指出:Web應(yīng)用包含JSP,部署這個(gè)應(yīng)用時(shí),在JSP生命周期中,整個(gè)轉(zhuǎn)換和編譯步驟只發(fā)生一次


    初始化JSP

    我們想著既然JSP也是servlet,那么我們能不能能不能像初始化Servlet一樣初始化JSP呢?該怎么做呢?

    開發(fā)環(huán)境:

    配置servlet初始化參數(shù)(DD)

    <?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"><servlet><servlet-name>MyTestInit</servlet-name><jsp-file>/TestInit.jsp</jsp-file><init-param><param-name>email</param-name><param-value>ikickedbutt@wickedlysmart.com</param-value></init-param></servlet><servlet-mapping><servlet-name>MyTestInit</servlet-name><!-- 注意這里的url名字,映射而已 --><url-pattern>/TestInit.do</url-pattern></servlet-mapping></web-app>

    覆蓋jspInit()

    <html> <body><%! public void jspInit(){ServletConfig sConfig = getServletConfig();String emailAddr = sConfig.getInitParameter("email");ServletContext ctx = getServletContext();ctx.setAttribute("mail", emailAddr);}%><%= config.getInitParameter("email") %><%= application.getAttribute("mail") %> </body> </html>

    實(shí)驗(yàn)結(jié)果如下:


    JSP中的屬性

    -servlet中JSP中(隱式對(duì)象)
    應(yīng)用getServletContext()application
    請(qǐng)求requestrequest
    會(huì)話request.getSession()session
    頁面不適用pageContext

    通常我們不需要關(guān)系頁面作用域,除非我們在開發(fā)定制標(biāo)記

    PageContext的UML圖:


    使用pageContext的實(shí)例

    設(shè)置一個(gè)頁面作用域?qū)傩?/p> <% Float one = new Float(42,5);pageContext.setAttribute("foo",one); %>

    獲取一個(gè)頁面作用域?qū)傩?/p> <%= pageContext.getAttribute("foo")%>

    使用pageContext設(shè)置一個(gè)會(huì)話作用域?qū)傩?/p> <%Float two = new Float(22.4);pageContext.setAttribute("foo",two,PageContext.SESSION_SCOPE); %>

    使用pageContext獲得一個(gè)會(huì)話作用域?qū)傩?等價(jià)于session.getAttribute(“foo”))

    <%= pageContext.getAttribute("foo",PageContext.SESSION_SCOPE)%>

    使用pageContext獲得一個(gè)應(yīng)用作用域?qū)傩?等價(jià)于application.getAttribute(“mail”))

    <%= pageContext.getAttribute("mail",PageContext.APPLICATION_SCOPE)%>

    使用pageContext,即使不知道作用域也可以查找一個(gè)屬性(查找順序:先從請(qǐng)求作用域查找,再查找會(huì)話作用域,最后查找應(yīng)用作用域。先找到哪一個(gè)就算“贏”)

    <%= pageContext.findAttribute("foo")%>

    JSP的3個(gè)指令

    指令格式說明
    page指令<%@ page import=”foo.*” session=”false”%>定義頁面特定的屬性,如字符編碼、頁面響應(yīng)的內(nèi)容類型,已經(jīng)這個(gè)頁面是否要有隱式對(duì)象。page指令可以使用至多13個(gè)不同屬性(如import屬性)
    taglib指令<%@ taglib tagdir=”/WEB-INF/tags/cool” prefix=”cool”%>定義JSP可以使用標(biāo)記庫
    include指令<%@ include file=”wickedHeader.html”%>定義在轉(zhuǎn)換時(shí)增加到當(dāng)前頁面的文本和代碼。從而允許你建立可重用的塊,這些可重用的塊能增加到各個(gè)頁面上,而不必在每個(gè)JSP中重復(fù)寫所有這些代碼


    page指令的屬性

    屬性說明
    import導(dǎo)包
    isThreadSafe定義生成的servlet是否需要實(shí)現(xiàn)SingleThreadModel(最好不要這樣做)
    contentType定義JSP響應(yīng)的MIME內(nèi)容
    isELIgnored定義轉(zhuǎn)換(.jsp到.java)這個(gè)頁面時(shí)是否忽略EL表達(dá)式
    errorPage定義一個(gè)資源的URL,如果有未捕獲到的Throwable,就會(huì)發(fā)送到這個(gè)資源。如果這個(gè)屬性指定了一個(gè)JSP,該JSP的page指令中就會(huì)有isErrorPage=”true”屬性
    language定義scriptlet、表達(dá)式和聲明中使用的腳本語言(現(xiàn)在就只有一個(gè)值,就是”java”)
    extendsJSP會(huì)變成一個(gè)servlet類,這個(gè)屬性則定義了這個(gè)類的超類(一般不會(huì)使用這個(gè)屬性)
    session定義頁面是否有一個(gè)隱式的session對(duì)象。默認(rèn)值為”true”
    buffer定義隱式out對(duì)象如何處理緩存
    autoFlush定義緩存的輸出是否自動(dòng)刷新輸出。默認(rèn)值為”true”
    info定義放到轉(zhuǎn)換后頁面中的串,這樣就能使用所生成servlet繼承的getServletInfo()方法來得到這個(gè)信息
    pageEncoding定義JSP的字符編碼。默認(rèn)為”ISO-8859-1”

    EL

    HTML開發(fā)員不懂Java,所以不能再JSP里面寫這種Java代碼。

    于是,EL出現(xiàn)了,它的出現(xiàn)完美的解決下面2個(gè)問題:

  • 不應(yīng)該要求Web頁面設(shè)計(jì)人員必須懂Java
  • JSP中的Java代碼很難修改和維護(hù)

  • EL小試牛刀

    EL表達(dá)式:${applicationScope.mail}等價(jià)于<%= application.getAttribute("mail")%>


    禁用scriptlet

    在DD中配置:

    <web-app ...><jsp-config><jsp-property-group>//作用于所有的.jsp文件<url-pattern>*.jsp</url-pattern>//只要配置上這個(gè)就行了,記住true是禁用scriptlet<scripting-invalid>true</scripting-invalid></jsp-property-group></jsp-config> </web-app>

    禁用EL表達(dá)式

    兩種方式:

    (1)在DD中配置:

    <web-app ...><jsp-config><jsp-property-group>//作用于所有的.jsp文件<url-pattern>*.jsp</url-pattern><el-ignored>true</el-ignored></jsp-property-group></jsp-config> </web-app>

    (2)在JSP中用page指令(注意前面還有一個(gè)is):

    <%@ page isELIgnored="true"%>

    初見JSP的“動(dòng)作”

    標(biāo)準(zhǔn)動(dòng)作:<jsp:include page="wickedFooter.jsp">
    其他動(dòng)作:<c:set var="rate" value="32">

    看看動(dòng)作的語法,把它與其他類型JSP元素的語法做個(gè)比較。我們回答下面問題:

    (1)動(dòng)作元素與scriptlet有什么區(qū)別?
    本質(zhì)上沒有區(qū)別,只是代碼形式改變了。

    (2)看到一個(gè)動(dòng)作時(shí),怎么才能認(rèn)出來?
    不知道= =


    本章完

    總結(jié)

    以上是生活随笔為你收集整理的Head First JSP---随笔五的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。