日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

Servlet与JSP学习笔记(五) JSP核心(下)

發(fā)布時(shí)間:2025/7/14 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Servlet与JSP学习笔记(五) JSP核心(下) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

同樣可以參考菜鳥(niǎo)筆記。

JSP標(biāo)簽

JSP除了包括以"<%"開(kāi)頭的JSP標(biāo)記,還包括以"<jsp:"開(kāi)頭的JSP標(biāo)簽。實(shí)際上,前者的每種標(biāo)記都有后者的替代。例如:

  • Java程序片段又可以寫(xiě)成:<jsp:scriptlet>代碼片段</jsp:scriptlet>

  • JSP聲明又可以寫(xiě)成:<jsp:declaration>代碼片段</jsp:declaration>

  • JSP表達(dá)式又可以寫(xiě)成:<jsp:expression>JAVA表達(dá)式</jsp:expression>

  • 甚至JSP指令都被JSP標(biāo)簽替代了:

    • Page指令:<jsp:directive.page attribute="value" />

    • Include指令:<jsp:directive.include file="相對(duì)url地址" />

    • Taglib指令:<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />

直觀是直觀,可以搞兩種表示寶寶記不住啊!

JSP動(dòng)作元素

JSP動(dòng)作元素就是一組以"<jsp:"開(kāi)頭的JSP標(biāo)簽,在請(qǐng)求處理階段起作用,可以動(dòng)態(tài)地做一些事情。下面是標(biāo)準(zhǔn)的動(dòng)作元素:

語(yǔ)法描述
jsp:include在頁(yè)面被請(qǐng)求的時(shí)候引入一個(gè)文件。
jsp:useBean尋找或者實(shí)例化一個(gè)JavaBean。
jsp:setProperty設(shè)置JavaBean的屬性。
jsp:getProperty輸出某個(gè)JavaBean的屬性。
jsp:forward把請(qǐng)求轉(zhuǎn)到一個(gè)新的頁(yè)面。
jsp:plugin根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標(biāo)記。
jsp:element定義動(dòng)態(tài)XML元素
jsp:attribute設(shè)置動(dòng)態(tài)定義的XML元素屬性。
jsp:body設(shè)置動(dòng)態(tài)定義的XML元素內(nèi)容。
jsp:text在JSP頁(yè)面和文檔中使用寫(xiě)入文本的模板

具體的解釋在下面講解。

包含

也許你會(huì)注意到,前面介紹了JSP指令中的Include指令,表示包含一個(gè)文件;后面的JSP動(dòng)作元素又有一個(gè)jsp:include動(dòng)作,這兩者有什么區(qū)別?區(qū)別就是,Include指令用于靜態(tài)包含,而include標(biāo)簽用于動(dòng)態(tài)包含

  • 靜態(tài)包含:在編譯源JSP時(shí),把包含的目標(biāo)文件的所有內(nèi)容融合進(jìn)來(lái),然后編譯JSP文件。

  • 動(dòng)態(tài)包含:把<jsp:include指令編譯成JspRuntimeLibrary.include(request, response, "target.jsp", ...)。執(zhí)行到這個(gè)方法時(shí),再去編譯target.jsp,把它編譯成獨(dú)立的Servlet類,然后調(diào)用它的service()方法。最后再繼續(xù)執(zhí)行源文件的后續(xù)代碼。

示例:主JSP文件代碼如下:

main.jsp is including content.jsp. <% int var=1; request.setAttribute("username","Tom"); %> <%@ include file="content.jsp" %> <p>main.jsp is doing something else.

content.jsp文件:

<p> Output from content.jsp: <br> var=<%=var %> <br> username=<%=request.getAttribute("username") %>

訪問(wèn)main.jsp會(huì)有正常的響應(yīng)。如果改為動(dòng)態(tài)包含,則瀏覽器會(huì)顯示異常:content.jsp的編譯有問(wèn)題,因?yàn)関ar沒(méi)有被定義。

訪問(wèn)JavaBean

JavaBean我的理解就是一種domain class,特點(diǎn)是有個(gè)無(wú)參構(gòu)造函數(shù),以及每個(gè)屬性都有g(shù)et和set方法封裝。JSP中使用Bean,就可以使HTML與Java代碼分離,讓JavaBean負(fù)責(zé)事務(wù)處理,可以分離界面與業(yè)務(wù),也能夠重用業(yè)務(wù)代碼。

下面是一個(gè)標(biāo)準(zhǔn)的Bean:

package com.runoob.main;public class TestBean {private String message = "菜鳥(niǎo)教程";public String getMessage() {return(message);}public void setMessage(String message) {this.message = message;} }

JSP中操作Bean主要用到三個(gè)動(dòng)作元素:

  • <jsp:useBean>. 通過(guò)id屬性指定變量名,class屬性指定Bean的類名,scope屬性指定JavaBean對(duì)象的存放范圍(可選page(默認(rèn))、request、session、application)。
    這行代碼: <jsp:useBean id="test" class="com.runoob.main.TestBean" /> 實(shí)際的處理流程如下:

    • 定義一個(gè)名為test的局部變量。

    • 嘗試從默認(rèn)的page范圍內(nèi)讀取名為"test"的屬性,并賦給test。

    • 如果"test"屬性不存在,就通過(guò)TestBean類的默認(rèn)構(gòu)造方法創(chuàng)建一個(gè)對(duì)象,并把它存放在page范圍內(nèi),屬性名為"test"。

    也就是等價(jià)于以下代碼:

    TestBean test = null; test = (TestBean) pageContext.getAttribute("test"); if (test == null) {test = new TestBean();pageContext.setAttribute("test", test); }
  • <jsp:getProperty>和<jsp:setProperty>. 通過(guò)前面的id來(lái)定位Bean。

最后用一個(gè)示例來(lái)說(shuō)明用法:

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Bean示例</title> </head> <body><h2>Jsp 使用 JavaBean 實(shí)例</h2> <jsp:useBean id="test" class="com.runoob.main.TestBean" /><jsp:setProperty name="test" property="message" value="菜鳥(niǎo)教程..." /><p>輸出信息....</p><jsp:getProperty name="test" property="message" /></body> </html>

過(guò)濾器

Web組件常常會(huì)做一些相同的工作。比如都要檢查客戶的IP地址是否在黑名單中。過(guò)濾器(Filter)就是為了解決重復(fù)編寫(xiě)相同操作代碼而產(chǎn)生的,可以實(shí)現(xiàn)以下目的:

  • 在客戶端的請(qǐng)求訪問(wèn)后端資源之前,攔截這些請(qǐng)求。

  • 在服務(wù)器的響應(yīng)發(fā)送回客戶端之前,處理這些響應(yīng)。

過(guò)濾器接口javax.servlet.Filter定義了三個(gè)方法:

方法描述
void doFilter (ServletRequest, ServletResponse, FilterChain)完成實(shí)際的過(guò)濾操作。FilterChain用于訪問(wèn)后續(xù)過(guò)濾器或Web組件。
void init(FilterConfig filterConfig)Web應(yīng)用程序啟動(dòng)時(shí),容器會(huì)創(chuàng)建Filter的實(shí)例對(duì)象,并調(diào)用其init方法,讀取web.xml配置,完成對(duì)象的初始化功能。
void destroy()Servlet容器在銷毀過(guò)濾器實(shí)例前調(diào)用該方法,釋放其占用的資源。

下面是一個(gè)IP過(guò)濾器的示例:

package mypack; import java.io.*; import javax.servlet.*; import javax.servlet.http.*;public class IPFilter implements Filter {public void init(FilterConfig config) throws ServletException {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {// 如果客戶IP在黑名單里,就直接返回拒絕信息,不再調(diào)用后續(xù)組件if (!checkRemoteIP(request, response)) {return;}// 把請(qǐng)求轉(zhuǎn)發(fā)給后續(xù)組件chain.doFilter(requestWrapper, response);}public void destroy() {}private boolean checkRemoteIP(ServletRequest request, ServletResponse response) {String addr = request.getRemoteAddr();if (addr.indexOf(ipblock) == 0) {response.setContentType("text/html;charset=UTF8");PrintWriter out = response.getWriter();out.println("<h1>對(duì)不起,你的IP地址有毒!</h1>");out.flush();return false;}return true;} }

過(guò)濾器在web.xml中的配置如下:

<?xml version="1.0" encoding="UTF-8"?> <web-app> <filter><filter-name>IPFilter</filter-name><filter-class>mypack.IPFilter</filter-class><init-param><param-name>Site</param-name><param-value>參數(shù)值</param-value></init-param> </filter> <filter-mapping><filter-name>IPFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping> ...

也可以配置多個(gè)過(guò)濾器。如果它們指向的url一致,就是串聯(lián)的關(guān)系,串聯(lián)順序就是<filter-mapping>出現(xiàn)的順序。

總結(jié)

以上是生活随笔為你收集整理的Servlet与JSP学习笔记(五) JSP核心(下)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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