javascript
Servlet与JSP学习笔记(五) JSP核心(下)
同樣可以參考菜鳥筆記。
JSP標(biāo)簽
JSP除了包括以"<%"開頭的JSP標(biāo)記,還包括以"<jsp:"開頭的JSP標(biāo)簽。實(shí)際上,前者的每種標(biāo)記都有后者的替代。例如:
Java程序片段又可以寫成:<jsp:scriptlet>代碼片段</jsp:scriptlet>
JSP聲明又可以寫成:<jsp:declaration>代碼片段</jsp:declaration>
JSP表達(dá)式又可以寫成:<jsp:expression>JAVA表達(dá)式</jsp:expression>
-
甚至JSP指令都被JSP標(biāo)簽替代了:
Page指令:<jsp:directive.page attribute="value" />
Include指令:<jsp:directive.include file="相對url地址" />
Taglib指令:<jsp:directive.taglib uri="uri" prefix="prefixOfTag" />
直觀是直觀,可以搞兩種表示寶寶記不住啊!
JSP動(dòng)作元素
JSP動(dòng)作元素就是一組以"<jsp:"開頭的JSP標(biāo)簽,在請求處理階段起作用,可以動(dòng)態(tài)地做一些事情。下面是標(biāo)準(zhǔn)的動(dòng)作元素:
| jsp:include | 在頁面被請求的時(shí)候引入一個(gè)文件。 |
| jsp:useBean | 尋找或者實(shí)例化一個(gè)JavaBean。 |
| jsp:setProperty | 設(shè)置JavaBean的屬性。 |
| jsp:getProperty | 輸出某個(gè)JavaBean的屬性。 |
| jsp:forward | 把請求轉(zhuǎn)到一個(gè)新的頁面。 |
| 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頁面和文檔中使用寫入文本的模板 |
具體的解釋在下面講解。
包含
也許你會(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)來,然后編譯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") %>訪問main.jsp會(huì)有正常的響應(yīng)。如果改為動(dòng)態(tài)包含,則瀏覽器會(huì)顯示異常:content.jsp的編譯有問題,因?yàn)関ar沒有被定義。
訪問JavaBean
JavaBean我的理解就是一種domain class,特點(diǎn)是有個(gè)無參構(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 = "菜鳥教程";public String getMessage() {return(message);}public void setMessage(String message) {this.message = message;} }JSP中操作Bean主要用到三個(gè)動(dòng)作元素:
-
<jsp:useBean>. 通過id屬性指定變量名,class屬性指定Bean的類名,scope屬性指定JavaBean對象的存放范圍(可選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"屬性不存在,就通過TestBean類的默認(rèn)構(gòu)造方法創(chuàng)建一個(gè)對象,并把它存放在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>. 通過前面的id來定位Bean。
最后用一個(gè)示例來說明用法:
<%@ 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="菜鳥教程..." /><p>輸出信息....</p><jsp:getProperty name="test" property="message" /></body> </html>過濾器
Web組件常常會(huì)做一些相同的工作。比如都要檢查客戶的IP地址是否在黑名單中。過濾器(Filter)就是為了解決重復(fù)編寫相同操作代碼而產(chǎn)生的,可以實(shí)現(xiàn)以下目的:
在客戶端的請求訪問后端資源之前,攔截這些請求。
在服務(wù)器的響應(yīng)發(fā)送回客戶端之前,處理這些響應(yīng)。
過濾器接口javax.servlet.Filter定義了三個(gè)方法:
| void doFilter (ServletRequest, ServletResponse, FilterChain) | 完成實(shí)際的過濾操作。FilterChain用于訪問后續(xù)過濾器或Web組件。 |
| void init(FilterConfig filterConfig) | Web應(yīng)用程序啟動(dòng)時(shí),容器會(huì)創(chuàng)建Filter的實(shí)例對象,并調(diào)用其init方法,讀取web.xml配置,完成對象的初始化功能。 |
| void destroy() | Servlet容器在銷毀過濾器實(shí)例前調(diào)用該方法,釋放其占用的資源。 |
下面是一個(gè)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在黑名單里,就直接返回拒絕信息,不再調(diào)用后續(xù)組件if (!checkRemoteIP(request, response)) {return;}// 把請求轉(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>對不起,你的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>參數(shù)值</param-value></init-param> </filter> <filter-mapping><filter-name>IPFilter</filter-name><url-pattern>/*</url-pattern> </filter-mapping> ...也可以配置多個(gè)過濾器。如果它們指向的url一致,就是串聯(lián)的關(guān)系,串聯(lián)順序就是<filter-mapping>出現(xiàn)的順序。
總結(jié)
以上是生活随笔為你收集整理的Servlet与JSP学习笔记(五) JSP核心(下)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AngularJS 2.0 学习记录(一
- 下一篇: Oracle存储过程语法