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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

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

發布時間:2025/7/14 javascript 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Servlet与JSP学习笔记(五) JSP核心(下) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

同樣可以參考菜鳥筆記。

JSP標簽

JSP除了包括以"<%"開頭的JSP標記,還包括以"<jsp:"開頭的JSP標簽。實際上,前者的每種標記都有后者的替代。例如:

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

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

  • JSP表達式又可以寫成:<jsp:expression>JAVA表達式</jsp:expression>

  • 甚至JSP指令都被JSP標簽替代了:

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

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

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

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

JSP動作元素

JSP動作元素就是一組以"<jsp:"開頭的JSP標簽,在請求處理階段起作用,可以動態地做一些事情。下面是標準的動作元素:

語法描述
jsp:include在頁面被請求的時候引入一個文件。
jsp:useBean尋找或者實例化一個JavaBean。
jsp:setProperty設置JavaBean的屬性。
jsp:getProperty輸出某個JavaBean的屬性。
jsp:forward把請求轉到一個新的頁面。
jsp:plugin根據瀏覽器類型為Java插件生成OBJECT或EMBED標記。
jsp:element定義動態XML元素
jsp:attribute設置動態定義的XML元素屬性。
jsp:body設置動態定義的XML元素內容。
jsp:text在JSP頁面和文檔中使用寫入文本的模板

具體的解釋在下面講解。

包含

也許你會注意到,前面介紹了JSP指令中的Include指令,表示包含一個文件;后面的JSP動作元素又有一個jsp:include動作,這兩者有什么區別?區別就是,Include指令用于靜態包含,而include標簽用于動態包含

  • 靜態包含:在編譯源JSP時,把包含的目標文件的所有內容融合進來,然后編譯JSP文件。

  • 動態包含:把<jsp:include指令編譯成JspRuntimeLibrary.include(request, response, "target.jsp", ...)。執行到這個方法時,再去編譯target.jsp,把它編譯成獨立的Servlet類,然后調用它的service()方法。最后再繼續執行源文件的后續代碼。

示例:主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") %>

訪問main.jsp會有正常的響應。如果改為動態包含,則瀏覽器會顯示異常:content.jsp的編譯有問題,因為var沒有被定義。

訪問JavaBean

JavaBean我的理解就是一種domain class,特點是有個無參構造函數,以及每個屬性都有get和set方法封裝。JSP中使用Bean,就可以使HTML與Java代碼分離,讓JavaBean負責事務處理,可以分離界面與業務,也能夠重用業務代碼。

下面是一個標準的Bean:

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

JSP中操作Bean主要用到三個動作元素:

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

    • 定義一個名為test的局部變量。

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

    • 如果"test"屬性不存在,就通過TestBean類的默認構造方法創建一個對象,并把它存放在page范圍內,屬性名為"test"。

    也就是等價于以下代碼:

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

最后用一個示例來說明用法:

<%@ 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 實例</h2> <jsp:useBean id="test" class="com.runoob.main.TestBean" /><jsp:setProperty name="test" property="message" value="菜鳥教程..." /><p>輸出信息....</p><jsp:getProperty name="test" property="message" /></body> </html>

過濾器

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

  • 在客戶端的請求訪問后端資源之前,攔截這些請求。

  • 在服務器的響應發送回客戶端之前,處理這些響應。

過濾器接口javax.servlet.Filter定義了三個方法:

方法描述
void doFilter (ServletRequest, ServletResponse, FilterChain)完成實際的過濾操作。FilterChain用于訪問后續過濾器或Web組件。
void init(FilterConfig filterConfig)Web應用程序啟動時,容器會創建Filter的實例對象,并調用其init方法,讀取web.xml配置,完成對象的初始化功能。
void destroy()Servlet容器在銷毀過濾器實例前調用該方法,釋放其占用的資源。

下面是一個IP過濾器的示例:

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在黑名單里,就直接返回拒絕信息,不再調用后續組件if (!checkRemoteIP(request, response)) {return;}// 把請求轉發給后續組件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>對不起,你的IP地址有毒!</h1>");out.flush();return false;}return true;} }

過濾器在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>參數值</param-value></init-param> </filter> <filter-mapping><filter-name>IPFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping> ...

也可以配置多個過濾器。如果它們指向的url一致,就是串聯的關系,串聯順序就是<filter-mapping>出現的順序。

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。