-
接下來創(chuàng)建一下Connection的引用 Connection conn=null; Statement stmt=null; ResultSet rs=null; 然后將連接數據庫的業(yè)務邏輯代碼寫到doEndTag()方法中, 這里首先創(chuàng)建一個try-catch塊,因為連接數據庫會拋出異常 try{ Class.forName(this.driver); conn=DriverManager.getConnection(this.url, this.username, this.password); stmt=conn.createStatement(); rs=stmt.executeQuery(this.sql); if(rs!=null){ while(rs.next()){ //打印出name這一列的內容 pageContext.getOut().print(rs.getString("name")+"<br/>"); } } //如果成功了,執(zhí)行標簽下面的代碼 return EVAL_PAGE; }catch(Exception e){ e.printStackTrace(); //如果拋出異常,就不執(zhí)行標簽下面的代碼 return SKIP_PAGE; }finally{ //關閉數據庫的連接,這里依然會拋出異常,在這里對其捕獲 try { if(rs != null){ rs.close(); } if(stmt != null){ stmt.close(); } if(conn != null){ conn.close(); } } catch (Exception e2) { // TODO: handle exception } }查看全部
-
經過前面的學習,我們不僅可以控制標簽體內容的顯示,也可以控制標簽結束后內容是夠顯示,我們還可以在標簽中增加 屬性來豐富自定義標簽的功能 在標簽中增加屬性,只需要在處理類中增加相應字段的set方法以及在標簽描述文檔中的tag標簽中加入 attribute這個標簽來進行配置, 我們這里來定義一個連接數據庫的標簽,來演示如何設置標簽中的屬性 切換到開發(fā)環(huán)境 第一步:創(chuàng)建標簽處理類: 首先創(chuàng)建一個標簽的處理類,DBConnectionTag這里繼承TagSupport,復寫doEndTag()方法 這里來聲明一些與數據庫信息相關的屬性 private String driver; private String url; private String password; private String sql; private Stirng username; 這里要創(chuàng)建一下set方法,因為這些將會是標簽的屬性 public void setDriver(String driver) { this.driver = driver; } public void setUrl(String url) { this.url = url; } public void setPassword(String password) { this.password = password; } public void setSql(String sql) { this.sql = sql; } public void setUsername(String username) { this.username = username; }查看全部
-
第三部:定義一個JSP頁面:demo2.jsp <body> <imooc:SkipPageOrEvalPage/> <h3>中國最大的免費在線培訓平臺--idcbgp.cn</h3> </body> 啟動tomcat,查看jsp頁面 http://localhost:8080/jspCustomTag/demo2.jsp我們通過瀏覽器輸入地址 的方式對它進行訪問,這里可以看到,如果是這種方式訪問的話, 會顯示“不能訪問”,那么接下來我們通過超鏈接的形式對它進行訪問, 在這里再新建一個JSP:access.jsp 這個jsp只包含一個a標簽,然后我們將http://localhost:8080/jspCustomTag/demo2.jsp這個地址 賦予a標簽的href: <body> <a href="http://localhost:8080/jspCustomTag/demo2.jsp">站內訪問</a> </body> 再來訪問access.jsp。 http://localhost:8080/jspCustomTag/access.jsp 點擊這個超鏈接,這時候在jsp頁面中標簽后面的代碼呢,就可以正常的執(zhí)行了。 第四步:總結: 通過控制返回SKIP_PAGE和EVAL_PAGE這兩個常量就能控制標簽后的內容是否可以顯示查看全部
-
下面來得到一個url String url="http://"+request.getServerName(); 然后就可以判斷一下: 請求過來的究竟是通過瀏覽器呢,還是通過點擊超鏈接來訪問的, if(referer != null && referer.startsWith(url)){ } 確保這個請求是通過本站的超鏈接請求過來的, 這里首先來判斷http請求頭中的referer這個屬性,是否為空,并且 是通過本站的鏈接連接進來的,那么如果條件成立的話,就 return EVAL_PAGE;也就是讓它正確的執(zhí)行, 否則就輸出一個提示,pageContext.getOut().print("不能訪問!"); 然后return SKIP_PAGE; 第二步:在標簽描述文件中注冊這個標簽: <tag> <name>SkipPageOrEvalPage</name> <tag-class>com.imooc.tag.SkipPageOrEvalPageTag</tag-class> <body-content>empty</body-content> </tag>查看全部
-
這節(jié)課內容: 如何控制執(zhí)行標簽體結束后的內容: 假設有個需求,對于jsp頁面只能通過本站的超鏈接才能訪問,其他的訪問方式都會使jsp停止執(zhí)行其中的內容 類似防盜鏈的這種功能, 第一步:寫標簽處理類: 切換到開發(fā)環(huán)境,創(chuàng)建一個java類:SkipPageOrEvalPageTag,同樣需要繼承TagSupport這個父類, 這里需要重寫doEndTag()方法,該方法默認是返回EVAL_PAGE,也就是說執(zhí)行標簽結束后的內容, JSP引擎在解析到該結束標記時呢,會回調此方法,下面來實現以下這個方法: 這里需要首先得到一個request對象, HttpServletRequest request=(HttpServletRequest) pageContext.getRequest(); 之后,需要得到HTTP請求頭的一個屬性, String referer=request.getHeader("referer"); 那么這個屬性是屬于http請求頭中的一個屬性, 可以通過這個屬性來判斷客戶是從哪個頁面鏈接過來的, 只有通過超鏈接和表單提交,該鏈接才會有效 ( 意思是:只有通過超鏈接和表單提交向服務器發(fā)送請求,在請求頭里才會有 Referer: http://localhost:8080/jspCustomTag/access.jsp這個屬性, 倘若通過在瀏覽器的地址欄中直接輸入 Referer: http://localhost:8080/jspCustomTag/demo2.jsp的這種方式,它不是超鏈接 也不是表單提交的方式,所以在請求頭里面沒有referer這個屬性,所以 得不到referer這個屬性的值。 )查看全部
-
body-content標簽有4個值: empty,JSP,scriptless,tagdependent empty表名它是一個空的標簽體 JSP是允許標簽體內出現JSP腳本,也就是java代碼 scriptless可以接受文本,EL表達式,和JSP的動作 tagdependent它是指,在標簽體的內容可以直接被寫入bodyContent,由自定義標簽處理類來處理,而不被JSP容器所解析。查看全部
-
這里使用scriptless: 綜上: <tag> <name>SkipBodyOrEvalBodyInclude</name> <tag-class>com.imooc.tag.SkipBodyOrEvalBodyIncludeTag</tag-class> <body-content>scriptless</body-content> </tag> 標簽定義好了,那么再來創(chuàng)建一個JSP頁面,demo1.jsp 這里需要引入標簽庫文件: <%@ taglib prefix="imooc" uri="/imooc-tag" %> 然后在body中: <body> <imooc:SkipBodyOrEvalBodyInclude> <h3>中國最大的免費在線培訓平臺--idcbgp.cn</h3> </imooc:SkipBodyOrEvalBodyInclude> </body> 然后啟動tomcat,查看這個jsp 第一次輸入http://localhost:8080/jspCustomTag/demo1.jsp的時候, 頁面中什么也沒有顯示,接下來加上一個參數: http://localhost:8080/jspCustomTag/demo1.jsp?name=imooc 這時候,由于標簽處理類中接收到了name值,它滿足了要求,所以它就會執(zhí)行標簽體中的內容 也就是在頁面上顯示 中國最大的免費在線培訓平臺--idcbgp.cn 那么我們就可以使用這種方式,在頁面上將一些滿足相應條件的才能顯示的內容,放在 標簽體中,然后對用戶的權限進行判斷,來決定是否顯示相應的內容查看全部
-
這節(jié)課內容: 如何控制標簽體中內容的顯示 首先寫個java類SkipBodyOrEvalBodyIncludeTag繼承TagSupport,并重寫doStartTag()方法 這個方法是調用了父類的doStartTag()方法,查看父類的doStartTag()方法,它返回的是一個 SKIP_BODY的常量,也就是說它是默認不執(zhí)行標簽體的, 這里從url上接收一個參數: String name=pageContext.getRequest().getParameter("name"); 然后來判斷一下這個name的值, 如果name值是imooc,return EVAL_BODY_INCLUDE;也就是執(zhí)行標簽體。 否則返回return SKIP_BODY; 接下來需要在標簽庫描述文件中,對其進行注冊 這里將它命名為:SkipBodyOrEvalBodyInclude,再指明它的標簽處理類 com.imooc.tag.SkipBodyOrEvalBodyIncludeTag 然后看一下body-content標簽 這個標簽有四個值: 分別是empty,JSP,scriptless,tagdependent empty表名它是一個空的標簽體 JSP是允許標簽體內出現JSP腳本,也就是java代碼 scriptless可以接受文本,EL表達式,和JSP的動作 tagdependent它是指,在標簽體的內容可以直接被寫入bodyContent, 由自定義標簽處理類來處理,而不被JSP容器所解析。查看全部
-
IterationTag繼承了Tag接口,除了擁有Tag接口的常量和方法之外呢, 它還增加了doAfterBody()方法和EVAL_BODY_AGAIN常量。 從這個接口的名稱上呢,可以看出它提供了對代碼循環(huán)的功能, 如果doAfterBody()方法向WEB容器返回了EVAL_BODY_AGAIN, WEB容器會把這個標簽體的內容再執(zhí)行一次,執(zhí)行完之后再次執(zhí)行, 直到doAfterBody()方法返回SKIP_BODY,容器才會開始處理標簽的結束 標記,和調用doEndTag這個方法。 TagSupport是IterationTag的實現類,所以在實際的開發(fā)中, 可以繼承該類,而簡化自定義標簽的處理類的開發(fā) 而后來看BodyTag這個接口,這個接口繼承了IterationTag 并且增加了兩個方法,setBodyContent(BodyContent b) doInitBody() 和一個常量 EVAL_BODY_BUFFERED 而EVAL_BODY_TAG是一個已經過時的常量 EVAL_BODY_BUFFERED可以對標簽體的內容進行修改, BodyTagSupport實現了BodyTag的接口,它可以簡化開發(fā), 接下來看一下SimpleTag,這個接口是為了簡化自定義標簽的開發(fā) 在jsp2.0規(guī)范中,所新增加的接口,這里蛀牙看doTag這個方法, 該方法會在執(zhí)行自定義標簽時會被調用,并且只會被調用一次, Tag接口及其子接口所提供的功能呢,在doTag這個方法中,都可以完成, 它有一個實現類SimpleTagSupport,我們平時使用最多的就是 SimpleTagSupport類, 那么經過這個結構圖的學習呢,我們可以對自定義標簽的各個接口和 類有個大概的了解,為我們今后繼續(xù)學習打下基礎查看全部
-
二,這節(jié)課關注jsp規(guī)范提供的自定義標簽的類和接口的層次結構 在源碼中,TagSupport整個類實現了IterationTag整個接口 IterationTag接口又繼承了Tag接口 Tag接口又繼承了JspTag這個接口 JspTag這個接口是一個空的接口,它沒有任何的方法,它是自定義標簽的頂級父接口。 除了子接口Tag之外,它還有另外一個子接口SimpleTag SimpleTag有一個實現類是SimpleTagSupport 為了表名它們之間的層次結構呢,這里有個簡單的類圖: JspTag是所有自定義標簽的父接口,沒有任何的屬性和方法,它有兩個直接的子接口, 分別是Tag和SimpleTag Tag接口是jsp2.0規(guī)范之前就存在的,而SimpleTag是為了簡化自定義標簽的開發(fā),在 jsp2.0以后才出現的 Tag接口中定義了兩個重要的方法doStartTag()和doEndTag() 還定義了四個靜態(tài)常量,EVAL_BODY_INCLUDE SKIP_BODY EVAL_PAGE SKIP_PAGE 在jsp頁面運行過程中,當碰到了自定義標簽的開始標記,就會調用標簽處理類的 doStartTag方法,我們在第一個例子中就是這個方法實現了處理邏輯的, doStartTag方法執(zhí)行完畢后,會向WEB容器返回常量, EVAL_BODY_INCLUDE SKIP_BODY 以此來決定是否執(zhí)行標簽體, EVAL_BODY_INCLUDE是執(zhí)行自定義標簽的標簽體 SkIP_BODY是跳過標簽體,也就是它不執(zhí)行標簽體之間的內容 當我們執(zhí)行自定義標簽的結束標簽時,doEndTag方法就會被調用 它會返回 EVAL_PAGE SKIP_PAGE 這兩個常量 EVAL_PAGE是告訴WEB容器接著執(zhí)行自定義標簽后面的代碼 SKIP_PAGE就是忽略自定義標簽結束后的內容查看全部
-
一,上一節(jié)課的回顧: 自定義標簽的開發(fā)過程: 第一步:編寫一個繼承TagSupport的類。作為標簽的處理類。并且要重寫這個類的doStartTag方法。 該方法包含了,業(yè)務的處理邏輯。該方法由jsp引擎所回調。 第二步:在WEB-INF下定義一個tld文件,也就是標簽庫的描述文件,該文件可以定義多個tag 一個tag代表在jsp頁面中使用的一個標簽, 在tag里,定義了標簽的名字。處理類。之間的對應關系。 將整個文件放到WEB-INF下或其子目錄中。 jsp引擎在對jsp代碼進行編譯時,會自動的加載該文件, 第四步:在jsp頁面中使用該標簽了查看全部
-
簡單的類圖:如視頻查看全部
-
第四步:結論: 結果與之前一樣, 但這樣:jsp頁面清爽很多,并沒有多余的java代碼 那它的執(zhí)行過程,可以這樣理解: jsp頁面在被jsp引擎解析時,當碰到頁面中自定義的標簽時,會通過頁面中的 uri,就是<%@ taglib prefix="imooc" uri="/imooc-tag" %>中的uri的地址 去查找標簽庫文件,根據標簽庫文件再去查找自定義標簽的處理類,也就是這個地方: <tag-class>com.imooc.tag.LoginDateTag</tag-class> 當jsp引擎處理到開始標記時,系統就會自動的調用類LoginDateTag中的doStartTag()方法 我們可以在這個方法上寫入相應的業(yè)務處理邏輯。 這里的標簽實例是線程安全的,也就是每執(zhí)行一次標簽,都會生成一個新的對象。查看全部
-
第三步:在jsp中如何使用該標簽呢? 打開logininfo.jsp, 在開頭引入: <%@ taglib prefix="imooc" uri="/imooc-tag" %> ,然后在body標簽中寫入如下代碼: <body> 歡迎來到imooc,你的登錄時間是:<imooc:loginDate/> </body> 得到: <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="imooc" uri="/imooc-tag" %> <!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"> <title>Insert title here</title> </head> <body> 歡迎來到imooc,你的登錄時間是:<imooc:loginDate/> </body> </html> 再來啟動tomcat,訪問這個jsp頁面。查看全部
-
第二步:在WEB-INF下創(chuàng)建一個后綴名為tld的文件。這是一個標簽庫文件,我們所定義的標簽都要在這里進行注冊 這個tld文件可以在C:\apache-tomcat-7.0.68\webapps\examples\WEB-INF\jsp2中找到。一個示例的文件 這個文件內容比較多,我們拷貝出對我們有用的部分。 然后在WEB-INF下新建一個imooctag.tld,內容如下: <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLibrary</short-name> <uri>/imooc-tag</uri> <tag> <name>loginDate</name> <tag-class>com.imooc.tag.LoginDateTag</tag-class> <body-content>empty</body-content> </tag> </taglib> 這樣一個標簽庫文件就寫完了。查看全部
舉報
0/150
提交
取消