超越之JSP總結(jié)(經(jīng)典)

JSP 定義:
? ? 1)Java Server Page, Java EE 組件,本質(zhì)上是 Servlet。
? ? 2)運(yùn)行在 Web Container.接收 Http Request,生成 Http Response(默認(rèn)協(xié)議是 Http 請(qǐng)求和響應(yīng))?
? ? 3)JSP 使得我們能夠分離頁(yè)面的靜態(tài) HTML 和動(dòng)態(tài)部分——我們需要的技術(shù)。
? ? 4)使頁(yè)面可以混和html代碼、Java代碼以及JSP標(biāo)簽;允許訪問(wèn)組件
??
Servlet的缺陷(JSP出現(xiàn)的原因):
? ? 1)寫靜態(tài)頁(yè)面必須部署后才能看到效果,很難控制頁(yè)面的外觀。
? ? 2)從技術(shù)角度來(lái)說(shuō)Servlet是Java代碼和HTML靜態(tài)代碼的混合代碼。
? ? 3)從市場(chǎng)競(jìng)爭(zhēng)角度來(lái)說(shuō),微軟推出了ASP產(chǎn)品。
??
JSP的改進(jìn):
? ? 1)JSP是標(biāo)簽式的文本文件(區(qū)Servlet是Java文件)?
? ? 2)JSP不需要編譯(其實(shí)是由服務(wù)器監(jiān)測(cè)JSP文件的變化,再將其翻譯成 Servlet 代碼)?
? ? ? 服務(wù)器對(duì)其進(jìn)行編譯并在第一次請(qǐng)求時(shí)創(chuàng)建一個(gè)Servlet實(shí)例。所以,第一次訪問(wèn)JSP頁(yè)面時(shí)會(huì)后延遲
? ? 3)JSP不用寫配置文件
? ? 4)JSP以靜態(tài)代碼為主,Java代碼為輔。Servlet反之。
? ? 5)是J2EE藍(lán)圖的一部分(Servlet、JSP以及EJB是J2EE的三大組件)?
? ? JSP從本質(zhì)上來(lái)說(shuō)內(nèi)核還是Servlet,但與Servlet不是替代關(guān)系而是一種互補(bǔ)的關(guān)系。
? ? JSP適合于寫顯示層的動(dòng)態(tài)頁(yè)面,而Servlet則適合寫控制層的業(yè)務(wù)控制(頁(yè)面轉(zhuǎn)發(fā))。
? ? JSP往純標(biāo)簽方向發(fā)展,Servlet往純代碼方向發(fā)展,他們以Servlet內(nèi)核(請(qǐng)求響應(yīng)式的工作方式)往兩個(gè)方向發(fā)展。
??
?
基本語(yǔ)法
一、JSP的聲明(statement)?
? ?用來(lái)定義在產(chǎn)生的類文件中的類的屬性和方法(成員變量)??陕暶黝?即是內(nèi)部類)。
? ?由于servlet是工作在多線程環(huán)境下,所以盡量不要在service方法體外聲明成員變量。
? ?<%!.....%>? //聲明時(shí)要加"!",屬于類成員,最先加載,可寫于任何位置;不加則是腳本的局部變量,必須調(diào)用前寫。
? ?如:? <%!String hello="Hello, World!";%>? //變量的聲明
? ? ? ? <%=hello%>? ?//變量的調(diào)用
? ? ? ? <%! private int counter=0;? public int count(){ return ++counter;} %> //函數(shù)的聲明
? ? ? ? <h1><%=count()%></h1> //函數(shù)的調(diào)用
? ?聲明規(guī)則:
? ? 1) JSP中聲明的變量和方法對(duì)應(yīng)于Servlet中的實(shí)例方法和實(shí)例變量。這些將被同時(shí)請(qǐng)求該頁(yè)面的所有用戶所共享;
? ? 2) 在使用變量或方法前須先定義(不是說(shuō)聲明變量的位置在頁(yè)面中要處于使用變量的前面,而是指變量不聲明不能使用);
? ? 3) 聲明的變量或方法的作用域?yàn)楫?dāng)前頁(yè)面或包含的頁(yè)面;
? ? 4) 語(yǔ)句間以分號(hào)分隔。
??
二、JSP代碼段(Scriptlet)?
? ? ? <% java代碼 %>?
? ?是一段可以在處理請(qǐng)求時(shí)間執(zhí)行的Java代碼。可以產(chǎn)生輸出,也可以是一些流程控制語(yǔ)句。
? ?在代碼段中定義的變量為service方法中的局部變量。
? ?1._jspService()中的局部代碼:
? ? ? <%? System.out.println("Hi,I like JSP."); %>? ?//在控制臺(tái)打印出,網(wǎng)頁(yè)上沒(méi)顯示
? ? ? <%? out.println("Hi,I like JSP."); %>? ? ? ? ? //打印在網(wǎng)頁(yè)上
? ? ? <%? Connection conn=DriverManager.getConnection();? Statement st=conn.createStatement();
? ? ? ? String sql="select * from users";? ? ? ? ? ? ? ?ResultSet rs=st.executeQuery(sql);
? ? ? ? ?//……
? ? ? ?%>
? ? 問(wèn):能否在JSP腳本里定義方法?
? ? 答:不能! //腳本相當(dāng)于方法,不能在方法里定義方法
? ? ? ?<%!public void helloworld(){}%>? //可以聲明方法
? ? ? ?<% public void helloworld(){}%>? //編譯出錯(cuò);腳本不能定義方法
? ?2.比較:
? ? ? ? <%! int i=100;%>? ? ?//成員變量
? ? ? ? <%? int i=101;%>? ? ?//_jspService()方法中的局部變量
? ? ? ? <%=i%>? //同一文件里,局部變量?jī)?yōu)先
? ?3.腳本小程序規(guī)則:
? ? ?1) 你使用的腳本語(yǔ)言決定了腳本小程序的規(guī)則;
? ? ?2) 語(yǔ)句間以分號(hào)分隔;
? ? ?3) 可以使用默認(rèn)的對(duì)象、import進(jìn)的類、declaration聲明的方法和對(duì)象以及useBean tag中聲明的對(duì)象。
??
三、JSP表達(dá)式(expression)?
? ? ? ?<%=……%>? ?// "="號(hào)
? ?在JSP請(qǐng)求處理階段計(jì)算他的值,表達(dá)式生成的代碼是Service方法中的一個(gè)代碼片斷。
? ?JSP對(duì)于聲明的處理:1、計(jì)算表達(dá)式的值
? ? ? ? ? ? ? ? ? ?2、將值轉(zhuǎn)換成String
? ? ? ? ? ? ? ? ? ?3、用out.println發(fā)送標(biāo)簽;把數(shù)據(jù)輸出至頁(yè)面的當(dāng)前位置
? ? ? <%="Hello,JSP world!"%>? ? ?//out.println("Hello,JSP world");
? ? ? <%=name%>? ? ? ? ? ? ? ? ? ?//<%!String name="GiGi";%> out.println(name);
? ? ? <%=new java.util.Date()%>? ?//out.println(new java.util.Date());
? ?表達(dá)式規(guī)則:?
? ? ?1) 你使用的腳本語(yǔ)言決定了腳本小程序的規(guī)則;
? ? ?2) 執(zhí)行的順序?yàn)閺淖蟮接?
? ? ?3) 分號(hào)不能用于表達(dá)式。
??
四、JSP指令(direction)?
? ?指令用于從JSP發(fā)送信息到容器上。用來(lái)設(shè)置全局變量,聲明類,要實(shí)現(xiàn)的方法和輸出內(nèi)容等。
? ?指令在JSP整個(gè)文件內(nèi)有效。它為翻譯階段提供了全局信息。
? ? ? ?<%@......%>? // "@"符號(hào)
? ?指令包括:page、include、taglib
? ?1.page指令
? ? ? ? import、session、errorPage、isThreadSafe
? ? ?頁(yè)面的語(yǔ)言、內(nèi)容類型、字符集、頁(yè)面編碼
? ? ? ? <%@page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>
? ? ? ? language:java唯一值,表示腳本中使用的編程語(yǔ)言
? ? ? ? contentType:設(shè)置了內(nèi)容的類型和靜態(tài)頁(yè)面的編碼 (告訴瀏覽器以什么編碼顯示)?
? ? ? ? pageEncoding:頁(yè)面本身的編碼格式 (寫頁(yè)面時(shí)用的編碼格式)?
? ? ? ? 上面的代碼等價(jià)于servlet里: response.setContentType("text/html; charset=gbk");
? ? ?import:導(dǎo)入其他的包和類; 其中,JSP默認(rèn)導(dǎo)入的包是java.lang.*
? ? ? ? <%@page import="java.util.Date"%> //具體的包和類
? ? ? ? <%@page import="java.sql.*"%>? ? ?//包下的所有類
? ? ? ? <%@page import="java.util.*, java.io.*, java.net.*"%> //連寫,逗號(hào)分隔
? ? ?Session:指示當(dāng)前的jsp是否參與會(huì)話 (默認(rèn)為true; 參與會(huì)話)?
? ? ? ? 通過(guò)指令使當(dāng)前頁(yè)面與session不可會(huì)話:? ? <%@page session="false"%>?
? ? ? ? session="true"時(shí),可用內(nèi)建對(duì)象session直接訪問(wèn)會(huì)話,例如:
? ? ? ? <%? session.setAttribute("username","maxwell");
? ? ? ? ? ? String name = (String)session.getAttribute("username"); %>
? ? ? ? <%=name%>
? ? ?errorPage:
? ? ? ? isErrorPage:Jsp頁(yè)面中出現(xiàn)異常的處理方式
? ? ? ? 對(duì)于有可能出現(xiàn)異常的頁(yè)面:?
? ? ? ? ? ? <%@page errorPage="error.jsp"%> //異常時(shí)會(huì)跳轉(zhuǎn)到處理異常的頁(yè)面;這頁(yè)面自己寫
? ? ? ? ? ? 在有可能異常的地方打印原因:? throw new Exception("數(shù)據(jù)庫(kù)連接出錯(cuò)");
? ? ? ? 對(duì)于處理異常的頁(yè)面(error.jsp)里:
? ? ? ? ? ? <%@page isErrorPage="true"%>,其中使用<%=exception.getMessage() %>把異常信息打印出來(lái)
? ? ?isThreadSafe——此屬性已經(jīng)不再使用(已廢棄)?
? ? ? ? 當(dāng)前Jsp頁(yè)面是否線程安全? ? default--->true
? ? ? ? <%@page isThreadSafe="true"%>? //普通的Servlet,可以并發(fā)處理用戶請(qǐng)求
? ? ? ? <%@page isThreadSafe="false"%> //相當(dāng)于Servlet實(shí)現(xiàn)了SingleThreadModel
? ?2.include指令
? ? ? ? 把目標(biāo)頁(yè)面的內(nèi)容包含到當(dāng)前頁(yè)面,產(chǎn)生頁(yè)面疊加以后的輸出效果 //相當(dāng)于將兩個(gè)頁(yè)面合并;編譯時(shí)就包含進(jìn)來(lái)
? ? ? ? <%@include file="foot.jsp"%> //可插入任意位置
? ?3.taglib指令
? ? ? ? 留在JSTL里講解。
??
五、JSP中的注釋
? ?1.java格式注釋
? ? ? 編譯器會(huì)忽略掉此類注釋中的內(nèi)容(客戶端的源碼看不見)?
? ? ? <%-- JSP注釋;可多行 --%>?
? ? ? <%// java 單行注釋 %>
? ? ? <%/* java multi lines comments */%>?
? ? ? <%/**java 特有的注釋*/%>
? ?2.html風(fēng)格注釋
? ? ? 編譯器會(huì)執(zhí)行此類注釋中的代碼(客戶端的源碼看得見)?
? ? ? <!-- html風(fēng)格注釋 -->? 等價(jià)于out.println("<!-- html風(fēng)格注釋 -->")?
? ? ? 這種注釋方式不好的地方就是當(dāng)頁(yè)面注釋信息太多的時(shí)候會(huì)增大服務(wù)器的負(fù)荷。
? ? ? 還有注釋信息需要在網(wǎng)絡(luò)上傳輸,從而降低效率;內(nèi)部程序員的測(cè)試數(shù)據(jù)一般不能寫在這種注釋中,以免泄露。
??
六、動(dòng)作(Action)?
? ? <jsp:actionName attributeName=attributeValue/>
? ?JSP的動(dòng)作包括:
? ? ?forward、include、useBean、setProperty、getProperty
? ?1.forward動(dòng)作
? ? ?形式:<jsp:forward page="another.jsp"/>
? ? ? ? ? 等價(jià)于 Servlet中通過(guò)RequestDispatcher.forward();
? ? ?可以傳參數(shù)
? ? ? ? ?<jsp:forward? page="another.jsp">
? ? ? ? ? ? <jsp:param name="name" value="maxwell"/>
? ? ? ? ? ? <jsp:param name="age" value="20" />
? ? ? ? ?</jsp:forward>
? ?2.Include動(dòng)作
? ? ?形式:<jsp:include page="another.jsp"/>
? ? ? ? ? 等價(jià)于 Servlet中通過(guò)RequestDispatcher.include();
? ? ? Include動(dòng)作也可以傳參數(shù)
? ? ? ? ? <jsp:include? page="b.jsp" flush="true">
? ? ? ? ? ? ?<jsp:param name="name" value="narci"/>
? ? ? ? ? </jsp:include>?
? ? ? 與<%@include file=""%>比較:
? ? ? ? ?include動(dòng)作在運(yùn)行期處理(include指令編譯期),jsp:include包含的是所包含URI的響應(yīng),而不是URI本身。
? ? ? ? ?這意味著:jsp:include 對(duì)所指出的 URI 進(jìn)行解釋,因而包含的是生成的響應(yīng)。
? ? ? ? ?對(duì)于頁(yè)面是靜態(tài)內(nèi)容,這沒(méi)有太大的關(guān)系。但如果是動(dòng)態(tài)內(nèi)容,include動(dòng)作可傳參數(shù)。
? ? ? flush 屬性
? ? ? ? ?flush 指示在讀入包含內(nèi)容之前是否清空任何現(xiàn)有的緩沖區(qū)。
? ? ? ? ?JSP 1.1 中需要 flush 屬性,因此,如果代碼中不用它,會(huì)得到一個(gè)錯(cuò)誤。
? ? ? ? ?但是,在 JSP 1.2 中, flush 屬性缺省為 false。
? ? ? ? ?建議:由于清空大多數(shù)時(shí)候不是一個(gè)重要的問(wèn)題,因此,對(duì)于 JSP 1.1,將 flush 設(shè)置為 true;
? ? ? ? ? ? ? 而對(duì)于 JSP 1.2 及更高版本,將其設(shè)置為 false 或不設(shè)置(用默認(rèn)值)。
??
?
JSP的生命周期
? ? 1) 每一個(gè)JSP都會(huì)對(duì)應(yīng)有一個(gè)servlet生成
? ? 2) 在 %tomcat%/work/Catalina/localhost/工程名/org/apache/jsp 目錄下可找到對(duì)應(yīng)生成的 Servlet 文件
? ? 3) 一般而言,每一個(gè)JSP對(duì)應(yīng)的servlet都有如下的生命周期方法:
??
一、 _jspInit()方法
? ? JSP容器第一次裝載jsp文件時(shí)調(diào)用一次
? ? public void _jspInit(){……}
??
二、 _jspService()方法
? ? 每當(dāng)服務(wù)器接收到對(duì)該jsp的請(qǐng)求,都需要調(diào)用一次該方法一次。
? ? public void _jspService(HttpServletRequest request, HttpServletResponse response)
? ? ? ?throws java.io.IOException, ServletException { ……}
??
三、 _jspDestroy()方法
? ? jsp文件被修改時(shí),JSP容器會(huì)銷毀舊的jsp文件對(duì)應(yīng)的對(duì)象,重新裝載一次更新后的jsp文件的內(nèi)容(只調(diào)用一次)。
? ? public void _jspDestroy(){……}
??
?
JSP處理過(guò)程:JSP源文件處理分成二個(gè)階段:?
?1) JSP頁(yè)面轉(zhuǎn)換階段:
? ? 頁(yè)面被編譯成一個(gè)Java類,所有的HTML標(biāo)記和JSP標(biāo)記都被轉(zhuǎn)換創(chuàng)建一個(gè)Servlet。這時(shí),腳本和表達(dá)式還沒(méi)有被執(zhí)行;
?2) 請(qǐng)求處理階段:發(fā)生在服務(wù)器,將一個(gè)客戶端請(qǐng)求指向JSP頁(yè)面。
? ? 一個(gè)請(qǐng)求對(duì)象創(chuàng)建、解析以及提交給編譯好的JSP對(duì)應(yīng)的servlet。
? ? 當(dāng)這個(gè)servlet處理請(qǐng)求的時(shí)候它執(zhí)行先前在JSP中定義的處理腳本小程序和表達(dá)式。
??
使用腳本代碼的缺點(diǎn)和指導(dǎo)方針
?1) 缺點(diǎn):
? ? a. 過(guò)度使用腳本代碼使用JSP頁(yè)面混亂和難以維護(hù);?
? ? b. 腳本代碼降低JSP二個(gè)主要的優(yōu)點(diǎn):軟件重用和代碼分開
?2) 指導(dǎo)方針:只在組件功能無(wú)能為力或需要有限的腳本時(shí)使用。
??
?
day2
? POJO: Plain Old Java Object? --> 簡(jiǎn)單傳統(tǒng)的Java對(duì)象
? Java Bean: 組件、構(gòu)件的規(guī)范(屬性,提供get/set方法;還可包含其他方法)?
JSP調(diào)用JavaBean
? 通過(guò)引入JavaBean,JSP才能較好的把頁(yè)面展示與業(yè)務(wù)邏輯分離。
? 其中,業(yè)務(wù)邏輯放到后臺(tái)的Java Bean中,減少JSP中的腳本代碼,有利于程序的可維護(hù)性與可重用性。
一、Java Bean
? ? ?a.無(wú)參構(gòu)造器(也是默認(rèn)的構(gòu)造方法)?
? ? ?b.標(biāo)準(zhǔn)的getter、setter方法
? ? ?c.如要進(jìn)行網(wǎng)絡(luò)傳輸(支持RMI),需實(shí)現(xiàn)Serializable接口
二、如何在JSP中使用JavaBean?
? ?1.定義Java Bean
? ? ?形式:<jsp:useBean id = "BeanName" class = "className"? sope="范圍域">
? ? ? ? id? ?——聲明bean對(duì)象的標(biāo)識(shí)符,方便其他地方使用
? ? ? ? class——bean對(duì)象的類型,注意要使用完全限定名
? ? ? ? scope——java bean對(duì)象的共享范圍(page、request、session、application)?
? ? ? ? ? ?page:當(dāng)前頁(yè)面范圍(范圍最小,生命周期最短)?
? ? ? ? ? ?request:同一個(gè)請(qǐng)求范圍 (forward,include)?
? ? ? ? ? ?session:同一個(gè)會(huì)話(30分鐘不使用,會(huì)自動(dòng)結(jié)束)?
? ? ? ? ? ?application:同一個(gè)應(yīng)用(范圍最大,生命周期最長(zhǎng))? ServletContext
? ? ?例如:? SuperGirl <jsp:useBean id="girl" class="com.tarena.vo.SuperGirl" scope="session"/>?
? ? ?等價(jià)于:<% SuperGirl girl=(SuperGirl)session.getAttribute("girl");
? ? ? ? ? ?if(girl==null){
? ? ? ? ? ? ? girl = new SuperGirl(); //對(duì)應(yīng) id 和 class
? ? ? ? ? ? ? session.setAttribute("girl",girl);? //對(duì)應(yīng) scope 的值
? ? ? ? ? ?} %>?
? ? ?可以用表達(dá)式獲得bean的值:? <%=girl.getName();%>?
? ?2.對(duì)JavaBean的屬性賦值
? ? ?形式:<jsp:setProperty name="JavaBean對(duì)象名" property="JavaBean屬性名" value="屬性值"/>?
? ? ? ? 例子:? ?<jsp:setProperty name="girl" property="name" value="Lily"/>
? ? ? ? 等價(jià)于: <% girl.setName("Lily");%>
? ? ?可以嵌套JSP表達(dá)式:
? ? ? ? <jsp:setProperty name="girl" property="name"
? ? ? ? ?value='<%=request.getParameter("name")%>'/>
? ? ?Java Bean中的屬性名與form中輸入域的名字保持一致的話,可以使用通配符*,一次設(shè)置所有字段的值。
? ? ? ? <jsp:setProperty name="" property="*"/>
? ?3.獲取JavaBean的屬性值
? ? ?形式:<jsp:getProperty name="" property=""/>?
? ? ? ? name:標(biāo)識(shí)具體的Bean對(duì)象,這與<jsp:useBean>標(biāo)準(zhǔn)動(dòng)作中的id值相匹配
? ? ? ? property:標(biāo)識(shí)屬性中的標(biāo)識(shí)符。
??
JSP中的異常處理
一、try/catch/finally/throws/throw
? ? // 在局部代碼里處理異常。
二、errorPage, isErrorPage
? ? // 在整個(gè)頁(yè)面處理異常。
? ?1.errorPage
? ? ?形如: <%@page errorPage="error.jsp"%>
? ? ?表示:需要錯(cuò)誤處理的頁(yè)面
? ?2.isErrorPage
? ? ?形如: <%@page isErrorPage="true"%>?
? ? ?指示:錯(cuò)誤頁(yè)面。其中,有一個(gè)隱式對(duì)象exception可用: <%=exception%>
? ? ? ? ? 產(chǎn)生(隱含)內(nèi)建對(duì)象exception,可通過(guò)它獲得異常信息
? ? ? ? ? <%=exception.getMessage() %> //把異常信息打印出來(lái)
三、聲明的方式處理異常
? ? // 在整個(gè)應(yīng)用處理異常。(范圍比前兩種更大)?
? ?1.配置: 在web.xml進(jìn)行配置異常處理
? ? ? …… <error-page>
? ? ? ? ? ?<exception-type>java.lang.ArithmeticException</exception-type>
? ? ? ? ? ?<location>/MathError.jsp</location>
? ? ? ? ?</error-page>
? ? ? ? ?<error-page>
? ? ? ? ? ?<error-code>404</error-code>
? ? ? ? ? ?<location>/404.jsp</location>
? ? ? ? ?</error-page>? ……
? ?2.復(fù)習(xí):Java中的異常——有2種
? ? ?受查異常(Checked Exception)?
? ? ?非受查異常(Unchecked Exception)? Java中的RuntimeException及其子類是不需要處理的(try/catch)?
? ? ? ? 因?yàn)樗械腞untimeException總是可以通過(guò)優(yōu)化代碼來(lái)避免,因此,這種異常被稱為"Unchecked Exception"。
? ?3.思考:
? ? ?三種異常處理方式同時(shí)啟動(dòng)用,那個(gè)優(yōu)先級(jí)高? 作用域越小,優(yōu)先級(jí)越高。
? ?注意:要使得頁(yè)面自動(dòng)跳轉(zhuǎn)到錯(cuò)誤頁(yè)面,必須關(guān)閉瀏覽器的"顯示友好HTTP錯(cuò)誤信息"選項(xiàng)。
? ? ? public void _jspService(HttpServletRequest request, HttpServletResponse response)?
? ? ? ? throws java.io.IOException, ServletException { /*只處理這兩種兼容的異常*/ …… }
??
?
安全的系統(tǒng)(企業(yè)級(jí)應(yīng)用):
? ?1.身份認(rèn)證(合法用戶)? --登錄
? ?2.授權(quán)(靜態(tài))? ? ? ? --定義權(quán)限
? ?3.訪問(wèn)控制(動(dòng)態(tài))? ? ?--比較
? ?4.安全審計(jì)(日志)? ? ?--修復(fù)bug (只有敏感的部門需要)?
JAAS實(shí)現(xiàn)安全
? ?JAAS——Java Authentication and Authorization Service
? ?(Java認(rèn)證(Authentication)與授權(quán)(Authorization)服務(wù))
? ?是Java EE規(guī)范之一,實(shí)現(xiàn)Java EE應(yīng)用程序安全性的一個(gè)重要途徑
? ?(要求:會(huì)使用,不必深入理解)?
一、網(wǎng)絡(luò)安全的4大要素
? ?認(rèn)證——抵御假冒者(用戶身份的合法性)?
? ?授權(quán)——合法用戶擁有的權(quán)限
? ?機(jī)密性——防止關(guān)鍵數(shù)據(jù)落入其他人手中
? ?數(shù)據(jù)完整性——抵御竊聽者(篡改私有數(shù)據(jù))?
二、對(duì)于Http應(yīng)用是如何進(jìn)行認(rèn)證的(Web端的認(rèn)證方法)?
? ?四種安全認(rèn)證: (http協(xié)議)basic, form, digest, certificate(證書) + ssl
? ?HttpMonitor監(jiān)控受限資源的訪問(wèn)
三、容器是如何完成認(rèn)證與授權(quán)的呢?
? ?圖示(容器做了些什么事情)?
? ?(容器的角度)?
四、聲明式安全以及分工
? ?Servlet的開發(fā)者
? ?應(yīng)用的管理員
? ?部署人員
??
五、實(shí)戰(zhàn)
? 1.定義新用戶與角色
? ? 在Tomcat服務(wù)器中定義:? ? %TOMCAT_HOME%/conf/tomcat-user.xml
? ? ?<?xml version='1.0' encoding='utf-8'?>
? ? ?<tomcat-users>
? ? ? <role rolename="manager"/>
? ? ? ? <role rolename="admin"/>
? ? ? ? <user username="maxwell" password="123" roles="admin,manager"/>
? ? ? ? <user username="lily" password="iloveyou" roles="manager"/>
? ? ?</tomcat-users>
? ? 為什么tomcat可以使用tomcat-users.xml作為它保存用戶和角色信息的文件?原因是在server.xml中,有以下配置:
? ? ?<Resource name="UserDatabase" auth="Container"? type="org.apache.catalina.UserDatabase"
? ? ? ? ?description="User database that can be updated and saved"
? ? ? ? ?factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
? ? ? ? ?pathname="conf/tomcat-users.xml" />
? ? ?在DD中指定角色,則需在 web.xml 中配置:
? ? ?<security-role>
? ? ? ? <description />
? ? ? ? <role-name>admin</role-name>
? ? ?</security-role>
? ?2.聲明安全性約束(指明受限資源)?
? ? ?在DD中加入<security-constraint>元素,其中包含了:
? ? ? ?Web資源集合:<web-resource-collection>
? ? ? ?其中包含了url資源以及http方法。
? ? ?授權(quán)約束:<auth-constraint>
? ? ? <security-constraint>
? ? ? ? <display-name>Constraint-all</display-name>
? ? ? ? <web-resource-collection>
? ? ? ? ? ?<web-resource-name>all-resources</web-resource-name>
? ? ? ? ? ?<description />
? ? ? ? ? ?<url-pattern>/admin/*</url-pattern>? ? //被授權(quán)訪問(wèn)的目錄和文件
? ? ? ? ? ?<url-pattern>/security/*</url-pattern>
? ? ? ? ? ?<http-method>GET</http-method>
? ? ? ? ? ?<http-method>POST</http-method>
? ? ? ? </web-resource-collection>
? ? ? ? <auth-constraint>
? ? ? ? ? ?<description />
? ? ? ? ? ?<role-name>admin</role-name>
? ? ? ? </auth-constraint>
? ? ? </security-constraint>
??
? ? ?要注意的規(guī)則:
? ? ? 不要認(rèn)為:資源本身受到約束;其實(shí),是資源 + Http方法組合受到約束
? ? ? 如果配置中不指定<http-method>,說(shuō)明所有的方法(Get,Post,Trace,Head,Delete,Put,Options等)都受約束;
? ? ? 當(dāng)指定了具體的<http-method>,那么約束只針對(duì)該方法,其他的http方法都不在約束之內(nèi);
? ? ? <auth-constraint>定義的是哪些角色可以做出受約束的請(qǐng)求;而不是定義訪問(wèn)<web-resource-collection>
? ? ? 沒(méi)有<auth-constraint>:任何角色都能訪問(wèn);? ?空的<auth-constraint />任何角色都不能訪問(wèn);
? ? ? 對(duì)于不同的<security-constraint>,指定的url資源<url-pattern>在相同方法上定義了不同的<auth-constrain>,則存在合并規(guī)則。
??
? ? ?問(wèn)題:為什么要設(shè)置<auth-constraint />元素,使得任何角色的任何人都不能訪問(wèn)受限資源呢?其意義何在?
? ? ? ? 為了保護(hù)資源,只允許內(nèi)部跳轉(zhuǎn)去訪問(wèn)
??
? ?3.選擇認(rèn)證方式
? ? ?如果是BASIC認(rèn)證:則無(wú)需指定Form表單的action。
? ? ?<login-config>
? ? ? ? ?<auth-method>BASIC</auth-method>
? ? ? ? ?<realm-name>UserDatabaseRealm</realm-name>
? ? ?</login-config>
? ? ?如果是FORM認(rèn)證:
? ? ?<login-config>
? ? ? ?<auth-method>FORM</auth-method>
? ? ? ?<form-login-config>
? ? ? ? ? <form-login-page>/logon/loginForm.jsp</form-login-page>
? ? ? ? ? <form-error-page>/logon/loginErrorForm.jsp</form-error-page>
? ? ? ?</form-login-config>
? ? ?</login-config>
??
? ? ?對(duì)于Form表單認(rèn)證
? ? ? action的值,用戶名、密碼字段的名稱都是固定的(規(guī)范)?
? ? ? <form method="POST" action="j_security_check">? ? ??
? ? ? ? <input type="text" name="j_username">? ? ??
? ? ? ? <input type="password" name="j_password">? ? ??
? ? ? ? <input type="submit" value="Submit" name="B1">
? ? ? </form>
? ? ?標(biāo)準(zhǔn)的表單提交(固定不變):
? ? ? action:j_security_check
? ? ? name:j_username
? ? ? password:j_password
??
?
Day3
內(nèi)容要點(diǎn): 1.隱含對(duì)象 2.歡迎文件 3 MVC
********************************************************************************************
一、隱含對(duì)象?
?1.什么是隱含對(duì)象(9個(gè))?
? ?————JSP中的隱含對(duì)象:不用我們手工去創(chuàng)建的對(duì)象
? ?類型? ? ? ? ? ? ? ? ? ? 對(duì)象名? ? ? ? ? ? 功能
? ?---------------------------------------------------------------------
? ?JspWriter? ? ? ? ? ? ? out? ? ? ? ? ? ? 往瀏覽器寫內(nèi)容
? ?HttpServletRequest? ? ?request? ? ? ? ? Http請(qǐng)求對(duì)象.
? ?HttpServletResponse? ? response? ? ? ? ?Http響應(yīng)對(duì)象
? ?PageContext? ? ? ? ? ? pageContext? ? ? JSP的頁(yè)面上下文
? ?HttpSession? ? ? ? ? ? session? ? ? ? ? 會(huì)話對(duì)象
? ?ServletContext? ? ? ? ?application? ? ? 應(yīng)用上下文
? ?ServletConfig? ? ? ? ? config? ? ? ? ? ?JSP的ServletConfig
? ?Object? ? ? ? ? ? ? ? ?page? ? ? ? ? ? ?頁(yè)面實(shí)現(xiàn)類的對(duì)象(例如:this)?
? ?Exception? ? ? ? ? ? ? exception? ? ? ? 含有指令<%@page isErrorPage="true"%>
??
?2.范圍對(duì)象
? ?其中,有4個(gè)是范圍對(duì)象: pageContext,request,session,application
? ?對(duì)應(yīng)<jsp:useBean/>指令的scope分別是:page,reqeust,session,application
? ?也就是說(shuō),指定不同scope的bean對(duì)象(Java Bean)會(huì)被綁定到不同的范圍對(duì)象中
? ?// 選擇范圍對(duì)象的原則:作用域的范圍越小越好;因?yàn)樽饔糜蛐〉纳芷诙?,有利于性能提高?/p>
? ?例如:<jsp:useBean id="stu" class="vo.Student" scope="page"/>
? ?表示stu對(duì)象被綁定到j(luò)avax.servlet.jsp.PageContext對(duì)象(pageContext)中,其等價(jià)的代碼
? ?<%? ? Student stu = pageContext.getAttribute("stu");
? ? ? ? ?if(stu==null) {
? ? ? ? ? stu=new Student();
? ? ? ? ? pageContext.setAttribute("stu",stu);
? ?}%>
??
? ?1)pageContext對(duì)象:
? ? ?每一個(gè)jsp頁(yè)面對(duì)應(yīng)著一個(gè)pageContext。一般地,在實(shí)際應(yīng)用中,主要是使用它來(lái)存取屬性。
? ? ?另外,pageContext對(duì)象能夠存取其他隱含對(duì)象。
? ? a.pageContext對(duì)象存取其他隱含對(duì)象屬性的方法,此時(shí)需要指定范圍的參數(shù)。
? ? ? Object getAttribute(String name, int scope)
? ? ? Enumeration getAttributeNamesInScope(int scope)
? ? ? void removeAttribute(String name, int scope)
? ? ? void setAttribute(String name, Object value, int scope)
? ? ?其中,范圍參數(shù)有四個(gè),分別代表四種范圍:
? ? ? PAGE_SCOPE、REQUEST_SCOPE、SESSION_SCOPE、APPLICATION_SCOPE
? ? b.PageContext對(duì)象取得其他隱含對(duì)象的方法
? ? ? Exception getException()? ? ? ? ? ?回傳目前網(wǎng)頁(yè)的異常,不過(guò)此網(wǎng)頁(yè)要為error page,
? ? ? JspWriter getOut()? ? ? ? ? ? ? ? ?回傳目前網(wǎng)頁(yè)的輸出流,例如:out
? ? ? Object getPage()? ? ? ? ? ? ? ? ? ?回傳目前網(wǎng)頁(yè)的Servlet 實(shí)體(instance),例如:page
? ? ? ServletRequest getRequest()? ? ? ? 回傳目前網(wǎng)頁(yè)的請(qǐng)求,例如:request
? ? ? ServletResponse getResponse()? ? ? 回傳目前網(wǎng)頁(yè)的響應(yīng),例如:response
? ? ? ServletConfig getServletConfig()? ?回傳目前此網(wǎng)頁(yè)的ServletConfig 對(duì)象,例如:config
? ? ? ServletContext getServletContext() 回傳目前此網(wǎng)頁(yè)的執(zhí)行環(huán)境(context),例如:application
? ? ? HttpSession getSession()? ? ? ? ? ?回傳和目前網(wǎng)頁(yè)有聯(lián)系的會(huì)話(session),例如:session
? ? c.PageContext對(duì)象提供取得屬性的方法
? ? ? Object getAttribute(String name, int scope)? ? 回傳name 屬性(范圍為scope;類型為Object)?
? ? ? Enumeration getAttributeNamesInScope(int scope)? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?回傳所有屬性范圍為scope 的屬性名稱,回傳類型為Enumeration
? ? ? int getAttributesScope(String name)回傳屬性名稱為name 的屬性范圍
? ? ? void removeAttribute(String name)? 移除屬性名稱為name 的屬性對(duì)象
? ? ? void removeAttribute(String name, int scope)? ?移除屬性名稱為name,范圍為scope 的屬性對(duì)象
? ? ? void setAttribute(String name, Object value, int scope)? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?指定屬性對(duì)象的名稱為name、值為value、范圍為scope
? ? ? Object findAttribute(String name)? 尋找在所有范圍中屬性名稱為name 的屬性對(duì)象
??
? ?2)request 對(duì)象
? ? ?request 對(duì)象包含所有請(qǐng)求的信息,
? ? ?如:請(qǐng)求的來(lái)源、標(biāo)頭、cookies和請(qǐng)求相關(guān)的參數(shù)值等等。
? ? ?request 對(duì)象實(shí)現(xiàn)javax.servlet.http.HttpServletRequest接口的,
? ? ?所提供的方法可以將它分為四大類:
? ? ?(1)儲(chǔ)存和取得屬性方法;
? ? ? void setAttribute(String name, Object value)? ? ? 設(shè)定name屬性的值為value
? ? ? Enumeration getAttributeNamesInScope(int scope)? ?取得所有scope 范圍的屬性
? ? ? Object getAttribute(String name)? ?取得name 屬性的值
? ? ? void removeAttribute(String name)? 移除name 屬性的值
? ? ?(2)取得請(qǐng)求參數(shù)的方法
? ? ? String getParameter(String name)? ?取得name 的參數(shù)值
? ? ? Enumeration getParameterNames()? ? 取得所有的參數(shù)名稱
? ? ? String [] getParameterValues(String name)? ? 取得所有name 的參數(shù)值
? ? ? Map getParameterMap()? ? ? ? ? ? ? 取得一個(gè)要求參數(shù)的Map
? ? ?(3)能夠取得請(qǐng)求HTTP 標(biāo)頭的方法
? ? ? String getHeader(String name)? ? ? 取得name 的標(biāo)頭
? ? ? Enumeration getHeaderNames()? ? ? ?取得所有的標(biāo)頭名稱
? ? ? Enumeration getHeaders(String name) 取得所有name 的標(biāo)頭
? ? ? int getIntHeader(String name)? ? ? 取得整數(shù)類型name 的標(biāo)頭
? ? ? long getDateHeader(String name)? ? 取得日期類型name 的標(biāo)頭
? ? ? Cookie [] getCookies()? ? ? ? ? ? ?取得與請(qǐng)求有關(guān)的cookies
? ? ?(4)其他的方法
? ? ? String getContextPath()? ? ? ? ? ? 取得Context 路徑(即站臺(tái)名稱)
? ? ? String getMethod()? ? ? ? ? ? ? ? ?取得HTTP 的方法(GET、POST)
? ? ? String getProtocol()? ? ? ? ? ? ? ?取得使用的協(xié)議 (HTTP/1.1、HTTP/1.0 )
? ? ? String getQueryString()? ? ? ? ? ? 取得請(qǐng)求的參數(shù)字符串,不過(guò),HTTP的方法必須為GET
? ? ? String getRequestedSessionId()? ? ?取得用戶端的Session ID
? ? ? String getRequestURI()? ? ? ? ? ? ?取得請(qǐng)求的URL,但是不包括請(qǐng)求的參數(shù)字符串
? ? ? String getRemoteAddr()? ? ? ? ? ? ?取得用戶的IP 地址
? ? ? String getRemoteHost()? ? ? ? ? ? ?取得用戶的主機(jī)名稱
? ? ? int getRemotePort()? ? ? ? ? ? ? ? 取得用戶的主機(jī)端口
? ? ? String getRemoteUser()? ? ? ? ? ? ?取得用戶的名稱
? ? ? void getCharacterEncoding(String encoding)? ? 設(shè)定編碼格式,用來(lái)解決窗體傳遞中文的問(wèn)題
??
? ? 3)session 對(duì)象
? ? ?session對(duì)象表示目前個(gè)別用戶的會(huì)話(session)狀況。
? ? ?session對(duì)象實(shí)現(xiàn)javax.servlet.http.HttpSession接口,HttpSession接口所提供的方法
? ? ? long getCreationTime()? ? ? ? ? ? ?取得session產(chǎn)生的時(shí)間,單位是毫秒
? ? ? String getId()? ? ? ? ? ? ? ? ? ? ?取得session 的ID
? ? ? long getLastAccessedTime()? ? ? ? ?取得用戶最后通過(guò)這個(gè)session送出請(qǐng)求的時(shí)間
? ? ? long getMaxInactiveInterval()? ? ? 取得最大session不活動(dòng)的時(shí)間,若超過(guò)這時(shí)間,session 將會(huì)失效
? ? ? void invalidate()? ? ? ? ? ? ? ? ? 取消session 對(duì)象,并將對(duì)象存放的內(nèi)容完全拋棄
? ? ? boolean isNew()? ? ? ? ? ? ? ? ? ? 判斷session 是否為"新"的會(huì)話
? ? ? void setMaxInactiveInterval(int interval)? ?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?設(shè)定最大session不活動(dòng)的時(shí)間,若超過(guò)這時(shí)間,session 將會(huì)失效
? ? 4)application對(duì)象
? ? ?application對(duì)象最常被使用在存取環(huán)境的信息。
? ? ?因?yàn)榄h(huán)境的信息通常都儲(chǔ)存在ServletContext中,所以常利用application對(duì)象來(lái)存取ServletContext中的信息。
? ? ?application 對(duì)象實(shí)現(xiàn)javax.servlet.ServletContext 接口,ServletContext接口容器所提供的方法
? ? ? int getMajorVersion()? ? ? ? ? ? ? 取得Container主要的Servlet API版本
? ? ? int getMinorVersion()? ? ? ? ? ? ? 取得Container次要的Servlet API 版本
? ? ? String getServerInfo()? ? ? ? ? ? ?取得Container的名稱和版本
? ? ? String getMimeType(String file)? ? 取得指定文件的MIME 類型
? ? ? ServletContext getContext(String uripath)? ? ? ? 取得指定Local URL的Application context
? ? ? String getRealPath(String path)? ? 取得本地端path的絕對(duì)路徑
? ? ? void log(String message)? ? ? ? ? ?將信息寫入log文件中
? ? ? void log(String message, Throwable throwable)? ? 將stack trace 所產(chǎn)生的異常信息寫入log文件中
??
?3.其他對(duì)象:
? ? 1)page 對(duì)象
? ? ?page對(duì)象代表JSP本身,更準(zhǔn)確地說(shuō)page對(duì)象是當(dāng)前頁(yè)面轉(zhuǎn)換后的Servlet類的實(shí)例。
? ? ?從轉(zhuǎn)換后的Servlet類的代碼中,可以看到這種關(guān)系: Object page = this;
? ? ?在JSP頁(yè)面中,很少使用page對(duì)象。
? ? 2)response 對(duì)象
? ? ?response 對(duì)象主要將JSP 處理數(shù)據(jù)后的結(jié)果傳回到客戶端。
? ? ?response 對(duì)象是實(shí)現(xiàn)javax.servlet.http.HttpServletResponse 接口。response對(duì)象所提供的方法。
? ? a.設(shè)定表頭的方法
? ? ? void addCookie(Cookie cookie)? ? ? ? ? ? ? ? 新增cookie
? ? ? void addDateHeader(String name, long date)? ?新增long類型的值到name標(biāo)頭
? ? ? void addHeader(String name, String value)? ? 新增String類型的值到name標(biāo)頭
? ? ? void addIntHeader(String name, int value)? ? 新增int類型的值到name標(biāo)頭
? ? ? void setDateHeader(String name, long date)? ?指定long類型的值到name標(biāo)頭
? ? ? void setHeader(String name, String value)? ? 指定String類型的值到name標(biāo)頭
? ? ? void setIntHeader(String name, int value)? ? 指定int類型的值到name標(biāo)頭
? ? b.設(shè)定響應(yīng)狀態(tài)碼的方法
? ? ? void sendError(int sc)? ? ? ? ? ? ? ? ? ? ? ?傳送狀態(tài)碼(status code)
? ? ? void sendError(int sc, String msg)? ? ? ? ? ?傳送狀態(tài)碼和錯(cuò)誤信息
? ? ? void setStatus(int sc)? ? ? ? ? ? ? ? ? ? ? ?設(shè)定狀態(tài)碼
? ? c.用來(lái)URL 重寫(rewriting)的方法? ??
? ? ? String encodeRedirectURL(String url)? ? ? ? ?對(duì)使用sendRedirect()方法的URL予以編碼
? ? 3)out 對(duì)象
? ? ?out對(duì)象的類型是javax.servlet.jsp.JspWriter,該類從java.io.Writer類派生,以字符流的形式輸出數(shù)據(jù)。
? ? ?out對(duì)象實(shí)際上是PrintWriter對(duì)象的帶緩沖的版本(在out對(duì)象內(nèi)部使用PrintWriter對(duì)象來(lái)輸出數(shù)據(jù)),
? ? ?可以通過(guò)page指令的buffer屬性來(lái)調(diào)整緩沖區(qū)的大小,默認(rèn)的緩沖區(qū)是8kb。
? ? ?out 對(duì)象能把結(jié)果輸出到網(wǎng)頁(yè)上。
? ? ?out主要是用來(lái)控制管理輸出的緩沖區(qū)(buffer)和輸出流(output stream)。
? ? ? void clear( )? ? ? ? ? ? ? ?清除輸出緩沖區(qū)的內(nèi)容
? ? ? void clearBuffer( )? ? ? ? ?清除輸出緩沖區(qū)的內(nèi)容
? ? ? void close( )? ? ? ? ? ? ? ?關(guān)閉輸出流,清除所有的內(nèi)容
? ? ? int getBufferSize( )? ? ? ? 取得目前緩沖區(qū)的大小(KB)
? ? ? int getRemaining( )? ? ? ? ?取得目前使用后還剩下的緩沖區(qū)大小(KB)
? ? ? boolean isAutoFlush( )? ? ? 回傳true表示緩沖區(qū)滿時(shí)會(huì)自動(dòng)清除;false表示不會(huì)自動(dòng)清除并且產(chǎn)生異常處理
? ? 4)exception對(duì)象
? ? ?若要使用exception 對(duì)象時(shí),必須在page 指令中設(shè)定:<%@ page isErrorPage="true" %>才能使用。
? ? ?exception提供的三個(gè)方法:
? ? ? getMessage()?
? ? ? getLocalizedMessage()?
? ? ? printStackTrace(new java.io.PrintWriter(out))?
? ? 5)config 對(duì)象
? ? ?config 對(duì)象里存放著一些Servlet 初始的數(shù)據(jù)結(jié)構(gòu)。
? ? ?config 對(duì)象實(shí)現(xiàn)于javax.servlet.ServletConfig 接口,它共有下列四種方法:
? ? ? public String getInitParameter(name)
? ? ? public java.util.Enumeration getInitParameterNames( )?
? ? ? public ServletContext getServletContext()?
? ? ? public Sring getServletName()
??
?
例子:
1.范圍對(duì)象比較
<% pageContext 或request 或session 或application.setAttribute("name", "maxwell");
? ?pageContext.setAttribute("sex", "m");
%>
??
2.輸出對(duì)象out
<%out.println("Hello JSP!");%>
<%System.out.println("Hello JSP!");%>
getBufferSize() //tomcat default:12k
getRemaining()
flush()
clearBuffer()
??
3.request對(duì)象
request:
getProtocol()
getMethod()
getHeader("User-Agent")
getCookies()
getRequestURI()
getRequestURL()
getContextPath()
getServletPath()
getPathInfo()
getQueryString()
isRequestedSessionIdFromCookie()
isRequestedSessionIdFromURL()
isRequestedSessionIdValid()
getLocalPort(),getRemotePort()
getRequestDispatcher(),setCharacterEncoding(),getInputStream()
??
4.session對(duì)象
session:
getId()
isNew()
invalidate()
setMaxInactiveInterval(10)
??
?
5.響應(yīng)對(duì)象
response:
sendRedirect("third.jsp")
sendError(404, "400 Error!")
6.應(yīng)用對(duì)象
application:
log("some body visit our website...");
getMajorVersion()
getMinorVersion()
getServerInfo()
getRequestDispatcher(),getResourceAsStream(),getInitParameter()
??
pageContext:
getAttribute("name")
??
config:
getInitParameter("classNo")
getServletName()
??
page:
getClass()
??
************************************************************************************************
二、歡迎文件
??
?1.缺省情況下,一個(gè)Web App中的? index.html, index.htm, index.jsp? 可作為默認(rèn)的歡迎文件.
? ?當(dāng)用戶請(qǐng)求沒(méi)有指明要訪問(wèn)的資源時(shí),Web Container會(huì)用歡迎文件響應(yīng)客戶端請(qǐng)求.
?2.手工設(shè)置歡迎文件:
? ?web.xml
? ?找welcome.jsp,沒(méi)找到,繼續(xù)往下找
? ?<welcome-file-list>
? ? ?<welcome-file>/welcome.jsp</welcome-file>
? ? ?<welcome-file>/welcome1.jsp</welcome-file>
? ? ?<welcome-file>/welcome2.jsp</welcome-file>
? ?</welcome-file-list>
??
?
三、MVC
?MVC:? ? Model-View-Controller (用戶交互過(guò)程:輸入、處理、輸出)?
?WEB應(yīng)用的MVC;優(yōu)化Web App的結(jié)構(gòu),使用MVC模式
?Model 1:? ? JSP + JavaBean(EJB)
?Model 2:? ? Servlet + JSP + JavaBean(EJB)------>MVC
??
體系結(jié)構(gòu)
??
設(shè)計(jì)模式
? 具體問(wèn)題提出具體的解決辦法
??
習(xí)慣用法
??
?
Day4
內(nèi)容要點(diǎn): 1 實(shí)現(xiàn)文件上傳? 2 數(shù)據(jù)驗(yàn)證? 3 分頁(yè)實(shí)現(xiàn)
*****************************************************************************************
一、文件上傳
1.表單形式
<form action="" method="POST" enctype="multipart/form-data">
? file:<input type="file" name="file"/><br/>
? <input type="submit"/>
</form>
??
2.使用HttpMonitor工具:
查看文件上傳時(shí),請(qǐng)求的內(nèi)容。
??
3.服務(wù)器端對(duì)上傳文件的處理
例子
fileupload
處理步驟(待補(bǔ)充)
??
知識(shí)點(diǎn):
1)通過(guò)HttpServletRequest來(lái)傳送文件內(nèi)容
2)處理request頭,字符串的分析
3)java.io.File API的使用
??
*****************************************************************************************
二、數(shù)據(jù)驗(yàn)證
??
如何完成Web App中的數(shù)據(jù)驗(yàn)證工作
??
1)客戶端校驗(yàn):
輸入域不能為空,只能是數(shù)字,數(shù)據(jù)長(zhǎng)度大于5等等
JavaScript客戶端完成(驗(yàn)證框架,負(fù)責(zé)客戶端方面的驗(yàn)證)
??
2)服務(wù)器端校驗(yàn):
例如:后臺(tái)數(shù)據(jù)庫(kù)要求提交數(shù)據(jù)唯一性
Java服務(wù)器端完成(沒(méi)有現(xiàn)成的框架,因?yàn)椴煌捻?xiàng)目有不同的業(yè)務(wù)規(guī)則)
??
?
重點(diǎn):
1)分清楚什么情況下使用客戶端校驗(yàn),什么情況下使用服務(wù)器端校驗(yàn)
??
?
***************************************************************************************
三、數(shù)據(jù)分頁(yè)
查詢數(shù)據(jù)庫(kù)時(shí),如果滿足條件的記錄很多,該如何返回給頁(yè)面?
1.客戶端分頁(yè)
? 同樣地,使用html/javascript等技術(shù)處理。甚至可以封裝成組件
2.服務(wù)器端分頁(yè)
? 非常重要的,在實(shí)際項(xiàng)目中非常需要————性能問(wèn)題。
這需要結(jié)合JDBC/Hibernate/TopLink/EJB等技術(shù)實(shí)現(xiàn)。
??
查詢分頁(yè)
? 1)一次性從數(shù)據(jù)庫(kù)中查出所有信息,在內(nèi)存中作分頁(yè)(緩存)?
? ? ? 特點(diǎn):速度非???消耗資源大(內(nèi)存?)
??
? 2)分多次查詢數(shù)據(jù)庫(kù),一次查詢的數(shù)據(jù)量就是一個(gè)頁(yè)面可以顯示的數(shù)據(jù)量
? ? ? 特點(diǎn):消耗資源少,相對(duì)來(lái)說(shuō)速度慢
??
? 3)折衷的方案(一次只取n頁(yè),1<n<總頁(yè)數(shù))(部分緩存)?
? ? ? 特點(diǎn):中庸之道(實(shí)現(xiàn)中,置換算法教難)
??
常見的分頁(yè)處理方法:定義如下幾個(gè)參數(shù)
rows:數(shù)據(jù)庫(kù)表中記錄總行數(shù)? ?select count(*) from 表名;
? totalPage:總頁(yè)數(shù)? ? ?(導(dǎo)出屬性:可以由其他屬性計(jì)算而得) int totalPage = rows / size + 1;
size:每頁(yè)顯示的記錄數(shù)目? ? 可定制,可寫死
curPageNo:當(dāng)前頁(yè)? ? ? ? ?客戶端決定
? startRowNo:當(dāng)前頁(yè)在數(shù)據(jù)庫(kù)中的起始行號(hào)(導(dǎo)出屬性)? ? ? ? int startRowNo = (curPageNo -1 ) * size;
??
練習(xí):
重新改造Usermanager例子中的查詢所有的用戶的功能(使用分頁(yè))
??
?
Day5
內(nèi)容要點(diǎn):? 1 EL? ?2 JSTL
**************************************************************
一、EL(Expression Language----表達(dá)式語(yǔ)言)?
?為網(wǎng)頁(yè)美工而設(shè),跟java語(yǔ)句相似;盡量減少java程序的依賴(不能要求美工使用java)?
?1.語(yǔ)法
? ?表達(dá)式? ? ? ? ? vs.? ? EL表達(dá)式語(yǔ)言(JSP2.0)?
? ?<%=name%>? ? ?<=>? ? ? ?${name}?
?2.文字
? ?在 EL 表達(dá)式中,數(shù)字、字符串、布爾值和 null 都可以被指定為文字值(常量)。
? ?字符串可以用單引號(hào)或雙引號(hào)定界。布爾值被指定為 true 和 false 。
? 例子:
? ?表達(dá)式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 值
? ?-----------------------------------------------------------------------
? ?${-168.18}? ? ? ? ? ? ? ? ? ? ? ? ?-168.18
? ?${3.8e-18}? ? ? ? ? ? ? ? ? ? ? ? ?3.8e-18? ? ? ? ? ?//科學(xué)計(jì)數(shù)法
? ?${3.14159265}? ? ? ? ? ? ? ? ? ? ? 3.14159265? ? ? ? ? ? ? ? ??
? ?${"Hello JSP EL!"}? ? ? ? ? ? ? ? ?Hello JSP EL!? ? ?等價(jià)于 <%="Hello JSP EL!"%>? ? ? ? ??
? ?${'Hello JSP EL...'}? ? ? ? ? ? ? ?Hello JSP EL...
? ?${true}? //can be TRUE?? ? ? ? ? ? true
? ?${false} //can be FALSE?? ? ? ? ? ?false
? ?${str==null}? ? ? ? ? ? ? ? ? ? ? ?true? ? ? ? ? ? ? //布爾值的表達(dá)式
??
?3.EL 運(yùn)算符
? ?類別? ? ? ? ? ? ? ?運(yùn)算符
? ?-------------------------------------------------------------
? ?算術(shù)運(yùn)算符? ? ? ? +、? -、? *、? /(或 div)、? ? %(或 mod)
? ?關(guān)系運(yùn)算符? ? ? ? ==(或 eq)、? ? !=(或 ne)、? ? <(或 lt)
? ? ? ? ? ? ? ? ?>(或 gt)、? ? ?<=(或 le)、? ? >=(或 ge)
? ?邏輯運(yùn)算符? ? ? ? &&(或 and)、? ?||(或 or)、? ? !(或 not)
? ?驗(yàn)證運(yùn)算符? ? ? ? empty??
? ? ?其中,empty 判斷一個(gè)變量是否為null或是否包含有效數(shù)據(jù):
? ? ?if(name==null||name.equlas(""))? 等價(jià)于? ${empty name} ->? ? true
? 例子:
? ? 表達(dá)式? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 值
? ?-------------------------------------------------------------
? ? ${3+5.1}? ? ? ? ? ? ? ? ? ? ? ? ? ?8.1
? ? ${"Hello"+",Tarena!"}? ? ? ? ? ? ? 報(bào)錯(cuò)!? // EL的"+"沒(méi)有字符串連接功能
? ? ${5*2}? ? ? ? ? ? ? ? ? ? ? ? ? ? ?10
? ? ${9.3/3}? ? ? ? ? ? ? ? ? ? ? ? ? ?3.1
? ? ${9.3 div 3}? ? ? ? ? ? ? ? ? ? ? ?3.1
? ? ${8 div 0}? ? ? ? ? ? ? ? ? ? ? ? ?Infinity // 表示無(wú)窮大
? ? ${9%2}? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1
? ? ${9 mod 2}? ? ? ? ? ? ? ? ? ? ? ? ?1
? ? ${8*6>68?"Yes":"No"}? ? ? ? ? ? ? ?No? ?//三目表達(dá)式
? ?<% String name="";
? ? request.setAttribute("name",name);? ? ? //如果沒(méi)有 setAttribute ,則必定是空
? ?%>
? ? ${empty name}? ? ? ? ? ? ? ? ? ? ? true //對(duì)范圍對(duì)象內(nèi)的變量或?qū)ο筮M(jìn)行判空
??
?4.變量和JavaBean屬性數(shù)據(jù)輸出
? ?表達(dá)式語(yǔ)言輸出變量,是到范圍對(duì)象(pageContext,request,session,application)中查找相應(yīng)屬性。
? ?而非直接在頁(yè)面中查找實(shí)例或局部變量。
? 表達(dá)式語(yǔ)言查找變量的順序是:
? ?pageContext -> request -> session->application, 所有范圍都未找到時(shí),賦值null
??
?5.存取器
? ?[]? ? ->輸出對(duì)象屬性值,輸出數(shù)組或集合中對(duì)應(yīng)索引值
? ?.? ? ?->輸出對(duì)象屬性值
? 例子:
? ?<% SuperGirl girl = new SuperGirl();? ?girl.setName("Alice");
? ? ? session.setAttribute("girl",girl);? %>? //一定要有這句,設(shè)置成范圍對(duì)象
? ?${girl["name"]}
? ?${girl['name']}? ?//拿屬性時(shí),單引跟雙引等價(jià)
? ?${girl.name}? ? ? //這種方法同樣可以
? ??
? ?<%? List aList = new ArrayList();
? ? ? ?aList.add("China");? aList.add(girl);? aList.add(168.18);
? ? ? ?session.setAttribute("aList", aList); %>
? ?${aList[0]}? ?//使用下標(biāo)來(lái)取值 "China"
? ?${aList[1]}? ?//取得對(duì)象的引用地址? 還可以嵌套:${aList[1]['name']}
? ?${aList[3]}? ?//下標(biāo)越界,不會(huì)報(bào)錯(cuò);只是取不出值
? ??
? ?<%? Map map = new HashMap();
? ? ? ?map.put("name", "Kitty");? map.put("age", "25");? map.put("date", new Date());
? ? ? ?map.put("aList", aList);
? ? ? ?session.setAttribute("map", map); %>
? ?${map.date}? ? ?${map["date"]}? ? ?//這兩個(gè)等效
? ?${map.aList[0]} ${map["aList"][0]} //這兩個(gè)也等效
? ?${map.aList[1][name]}? ? ? ? ? ? ? //嵌套取值
??
?6.隱含對(duì)象
? ?el提供了自己的一套隱含對(duì)象,方便在頁(yè)面內(nèi)對(duì)各種常用數(shù)據(jù)信息的訪問(wèn).
? ? EL隱藏對(duì)象? ? ? ? ? ? ? ? ? ? ? ? ?JSP隱藏對(duì)象
? ?--------------------------------------------------------------------------------
? ? pageScope? ? ? ? ? ? ? ? ? ? ? ? ?pageContext
? ? requestScope? ? ? ? ? ? ? ? ? ? ? request
? ? sessionScope? ? ? ? ? ? ? ? ? ? ? session
? ? applicationScope? ? ? ? ? ? ? ? ? appication
??
? ? param:? ? ? ? ? ? ? ?request.getParameter()?
? ? paramValues:? ? ? ? ?在提交表單里,有多個(gè)輸入域同名getParameterValues
? ? header:? ? ? ? ? ? ? request.getHeader() 按照key-value的形式取出;value:是一個(gè)String類型的值
? ? headerValues? ? ? ? ? 按照key-value的方式取出,但是headerValues里面的value是一個(gè)String類型的數(shù)組
? ? cookie? ? ? ? ? ? ? ? request.getCookies()?
? ? initParam? ? ? ? ? ? ?context param
??
? 例子:
? ? 1)超女登記信息??
? ? ? enroll.html
? ? ? <form action="index.jsp" method="post">?
? ? ? ? <table border="1">?
? ? ? ? <tr><td>姓名:</td>?
? ? ? ? ? ? <td><input type="text" name="name"></td></tr>?
? ? ? ? <tr><td>年齡:</td>?
? ? ? ? ? ? <td><input type="text" name="age"></td></tr>??
? ? ? ? <tr><td>城市:</td>?
? ? ? ? ? ? <td><input type="text" name="city"></td>? </tr>??
? ? ? ? <tr><td align="center" colspan="2"><input type="submit" value="提交"></td></tr>?
? ? ? ? </table>
? ? ? </form>
??
? ? ? index.jsp
? ? ? <jsp:useBean id="SuperGirl" class="vo.SuperGirl" scope="page"></jsp:useBean>
? ? ? <jsp:setProperty name="SuperGirl" property="name" value="${param.name}"/>
? ? ? <jsp:setProperty name="SuperGirl" property="age"? value="${param.age}"/>
? ? ? <jsp:setProperty name="SuperGirl" property="city" value="${param.city}"/>
? ? ? <table border="1">? ?<% //把設(shè)置輸出出來(lái) %>
? ? ? ? <tr><td>姓名:</td>?
? ? ? ? ? ? <td>${SuperGirl.name}</td></tr>?
? ? ? ? <tr><td>年齡:</td>?
? ? ? ? ? ? <td>${SuperGirl.age}</td></tr>??
? ? ? ? <tr><td>城市:</td>?
? ? ? ? ? ? <td>${SuperGirl.city}</td></tr>??
? ? ? </table>
??
? ? 2)范圍對(duì)象
? ? ? <%? pageContext.setAttribute("name", "page");
? ? ? ? request.setAttribute("name", "request");
? ? ? ? session.setAttribute("name", "session");?
? ? ? ? application.setAttribute("name", "application"); %>
??
? ? ? ${name}? ? // pageContext -> request -> session->application
? ? ? ${pageScope.name}
? ? ? ${requestScope.name}
? ? ? ${sessionScope.name}
? ? ? ${applicationScope.name}
??
? ? 3)paramValues
? ? ? 在enroll.html加入: 興趣
? ? ? ? <table>
? ? ? <input type="checkbox" name="habit" value="Reading"/>讀書
? ? ? <input type="checkbox" name="habit" value="Game"/>游戲
? ? ? <input type="checkbox" name="habit" value="Music"/>音樂(lè)
? ? ? ? </table>
? ? ? //提交后,獲取輸入內(nèi)容
? ? ? ${paramValues.habit[0]}
? ? ? ${paramValues.habit[1]}
? ? ? ${paramValues.habit[2]}
??
? ? 4)initParam
? ? ? web.xml
? ? ? ...
? ? ? <context-param>
? ? ? ? <param-name>server</param-name>
? ? ? ? <param-value>Tomcat5.5</param-value>
? ? ? </context-param>
? ? ? ...
? ? ? ${initParam.server}
??
? ? 5)header
? ? ? ${header["host"]}?
? ? ? ${header["accept"]}?
? ? ? ${header["user-agent"]}
??
?
?7.可以自由設(shè)置是否支持表達(dá)式語(yǔ)言
? ?<%@page isELIgnored="false"%> : default:false? 可以使用EL,改成 true 之后,寫EL就會(huì)報(bào)錯(cuò)
??
? ?配置web.xml也可達(dá)到同樣的效果(同時(shí)存在,那種起作用?)?
? ?(禁用腳本和EL)? 默認(rèn)都是false
? ?...
? ?<jsp-config>
? ? ?<jsp-property-group>
? ? ? ?<url-pattern>*.jsp</url-pattern>
? ? ? ?<el-ignored>true</el-ignored>? ? ? ? ? ? ? ?//設(shè)置成所有jsp文件都禁用EL
? ? ? ?<scripting-invalid>true</scripting-invalid> //設(shè)置成禁用腳本
? ? ?</jsp-property-group>
? ?</jsp-config>
? ?....
? ?頁(yè)面的page指令設(shè)置isELIgnored屬性的優(yōu)先級(jí)比web.xml中<el-ignored>設(shè)置的高(當(dāng)然是范圍小的生效)
??
?
***************************************************************************************
二、JSTL(JSP Standard Tag Library )?
?減少java代碼,簡(jiǎn)化頁(yè)面編寫;功能封裝,提高可重用性
?1.如何使用JSTL
? ?1)對(duì)于Java EE之前(即J2EE規(guī)范1.4及之前版本)?
? ? ?a、復(fù)制jstl的jar包(jstl.jar,standard.jar)到/WEB-INF/lib
? ? ?b、在使用jstl功能的jsp頁(yè)面中增加指令
? ? ? ? <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>? ?//核心標(biāo)簽庫(kù)
? ? ? ? <%@taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml"%>? ??
? ? ? ? <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>?
? ? ? ? <%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>? //數(shù)據(jù)庫(kù)標(biāo)簽庫(kù)
? ? ? ? <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>?
? ? ? ? //prefix 表前綴(可改,但通常按這寫的用); uri 指向標(biāo)簽庫(kù)的入口
? ?2)Java EE規(guī)范把jstl作為規(guī)范的一部分
? ? ?所以現(xiàn)在的jstl-1.2已經(jīng)包含了原來(lái)的jstl.jar , standard.jar
??
?2.core:核心標(biāo)簽庫(kù)
? ?一般用途
? ?在JSTL中,一般用途的標(biāo)簽主要是指具有輸出,設(shè)置變量,和錯(cuò)誤處理等功能的標(biāo)簽,他們?cè)趈sp中使用比較頻繁,它們有:
? -----------
? |a、<c:set>|
? -----------
? ?語(yǔ)法:<c:set value="value" var="varName" [scope= "{page|request|session|application}"]/ >
? ? ? ? <c:set value="value" target="target" property="propertyName"/ >
? ?這個(gè)標(biāo)簽用于在某個(gè)范圍(page,request,session,application)里面設(shè)置特定的值
? ?(默認(rèn)為page),或者設(shè)置某個(gè)已經(jīng)存在的javabean的屬性。
? ?例子:
? ? ?<c:set var="counter" value="200"/>
? ? ?${counter}//輸出
? ? ??
? ? ?<c:set var="tarena">Tarena It Traning Ltd.</c:set>
? ? ?${tarena}
??
? ?可以指定范圍,默認(rèn)是page
? ? <c:set value="20" var="maxIdelTime" scope="session"/>
? ? ${maxIdelTime}
??
? ?設(shè)置JavaBean的值
? ? <jsp:useBean id="girl" class="vo.SuperGirl"/>
? ? <c:set value="Shirly" target="${girl}" property="name"/>
? ? <td>girl.name</td>
? ? <td>${girl.name}</td>
??
? --------------
? |b、<c:remove>|
? --------------
? 語(yǔ)法:
? ? <c:remove var="varName" [scope= "{page|request|session|application}"]/ >
? ? 它的作用是刪除某個(gè)變量或者屬性。
? 例子:
? ? <c:set value="10000" var="maxUser" scope="application"/>
? ? <c:set value="10" var="count" scope="session"/>
? ? <c:set value="10" var="count"/>
? ? ${maxUser}
? ? ${count}
? ? <c:remove var="maxUser" scope="application"/>
? ? <c:remove var="count" scope="session"/>
? ? ${maxUser}
? ? ${count}
??
? -----------
? |c、<c:out>|
? -----------
? 語(yǔ)法:<c:out value="value" [escapeXml]="{true|false}" [default="defaultValue"]/>
? 注意:escapeXml的作用是是否將代碼交給xml解析器解釋,true為交給xml解析器解釋(默認(rèn)),false為交給瀏覽器解釋。
? ? ? default 定義缺省值。
??
? 例子:
? ? <c:set var="sessionZhang3" value="zhang3-s" scope="session"/>
? ? <c:set var="table" value="<table><tr><td>sessionZhang</td></tr></table>" scope="page"/>
? ? <c:set var="requestZhang3" value="zhang3-r" scope="request"/>
? ? <c:out value="以下輸出前面設(shè)置的屬性<br>" escapeXml="false"/>
??
? ? <td colspan=2>
? ? ? ? <c:out value="${sessionZhang3}"/><br>
? ? ? ? <c:out value="${table}" escapeXml="false" /><br>//輸出表格;escapeXml="true"時(shí)只顯示字符串
? ? ? ? <c:out value="${requestZhang3}"/><br>
? ? ? ? <c:out value="${nodefined}" default="沒(méi)有nodefined這個(gè)變量"/>
? ? </td>
??
? -------------
? |d、<c:catch>|
? -------------
? 它的作用是捕捉由嵌套在它里面的標(biāo)簽所拋出來(lái)的異常。類似于<%try{}catch{}%>
? 語(yǔ)法:<c:catch [var="varName"]>nested actions</c:catch>
? 例子:
? ? <c:catch var="error"><% Integer.parseInt("abc"); %></c:catch>
? ? <% try{ Integer.parseInt("abc"); }catch(Exception error) {? } %> //等價(jià)
??
? ? ?<c:out value="${error}"/>
? ? ?<c:out value="${error.message}"/>
? ? ?<c:out value="${error.cause}"/>
??
?
? 控制語(yǔ)句:
? -----------
? |a、 <c:if>|??
? -----------
? 語(yǔ)法:?
? ? <c:if test="testCondition" var="varName"
? ? [scope="{page|request|session|application}"]>
? ? ? ?Body內(nèi)容
? ? </c:if>? // 注:沒(méi)有 else?
? 例子:
? ? ?<c:set var="age" value="16"/>
? ? ?<c:if test="${age<18}">
? ? ? ? <h1 align=center>您尚未成年,不能進(jìn)入游戲中心!</h1>
? ? ?</c:if>
??
? --------------
? |b、<c:choose>|
? --------------
? 例子:
? ? <c:set var="tax" value="5000" />
? ? <c:choose>
? ? ? ? ?<c:when test="${tax <=0}">
? ? ? ? ? ? ? 您今年沒(méi)有納稅!
? ? ? ? ?</c:when>
? ? ? ? ?<c:when test="${tax<=1000&&tax>0}">
? ? ? ? ? ?您今年繳納的稅款為${tax},加油!
? ? ? ? ?</c:when>
? ? ? ? ?<c:when test="${tax<=3000&&tax>1000}">
? ? ? ? ? ?您今年繳納的稅款為${tax},再接再勵(lì)哦!
? ? ? ? ?</c:when>
? ? ? ? ?<c:otherwise>
? ? ? ? ? ?您今年納稅超過(guò)了3000元,多謝您為國(guó)家的繁榮富強(qiáng)作出了貢獻(xiàn)!
? ? ? ? ?</c:otherwise>
? ? ?</c:choose>
??
? ---------------
? |c、<c:forEach>| 循環(huán)
? ---------------
? 語(yǔ)法: <c:forEach [var="varName"] items="collection"? [varStatus="varStatusName"]
? ? ? ? ?[begin="begin"] [end="end"] [step="step"]>
? ? ? ? ? ?Body 內(nèi)容
? ? ? ? </c:forEach>
? ?items:需要迭代的集合;var:迭代時(shí)取集合里的值;
? 例子:
? ? <%? List aList=new ArrayList();
? ? ? ? aList.add("You");? ? ? ?aList.add("are");? ?aList.add("a");
? ? ? ? aList.add("beautiful"); aList.add("girl");??
? ? ? ? request.setAttribute("aList",aList);? %>
? ? <center> <table border=1>
? ? ? ?<c:forEach var="word" items="${aList}">
? ? ? ? ?<tr><td>${word }</td></tr>
? ? ? ?</c:forEach>
? ? </table> </center>
??
? ? <c:forEach items='${header}' var='h'>
? ? ? ?<tr>
? ? ? ? ?<td><li>Header name:<c:out value="${h.key}"/></li></td>
? ? ? ? ?<td><li>Header value:<c:out value="${h.value}"/></li></td>
? ? ? ?</tr>
? ? </c:forEach>
??
? 另外一種用法: (類似 for 循環(huán))
? ?<c:forEach var="count" begin="10" end="100" step="10">
? ? ? ?<tr><td>
? ? ? ? ?<c:out value="${count}"/><br>
? ? ? ?</td></tr>
? ?</c:forEach>
??
?
? URL
? ---------------
? |a、<c:import> |
? ---------------
? 相當(dāng)于<jsp:include>
? ?<c:import url="footer.jsp" charEncoding="GBK">
? ? ? <c:param name="name" value="Java"/>
? ?</c:import>
??
? -----------
? |b、<c:url>|
? -----------
? 用于構(gòu)造URL,主要的用途是URL的重寫。
? ? <c:url var="footer1" value="footer.jsp"/>
? ? <c:url var="footer2" value="footer.jsp" scope="page">
? ? ? ? <c:param name="name" value="Sofie"/>
? ? </c:url>
? ? <c:out value="${footer1}"/>
? ? <c:out value="${footer2}"/>
??
? ? <c:url var="next" value="next.jsp"/>
? ? <a href="${next}">next</a><br>
? ? ? ?等價(jià)于
? ? <a href="<c:url value='next.jsp'/>">next</a> //在 Html 里可嵌套 JSTL
??
? ----------------
? |c、<c:redirect>|
? ----------------
? ?//等價(jià)于 <jsp:forward>
? ? <c:redirect url="${footer2}"/>
? 例如:
? ? <c:url var="next" value="next.jsp"/>
? ? <c:redirect url="${next}"/>
??
?3.SQL
? ?<sql:setDataSource>
? ?<sql:query>
? ?<sql:update>
? ?<sql:param>
??
? ? <!-- 設(shè)置數(shù)據(jù)源 -->
? ? <%@page contentType="text/html; charset=GBK"%>
? ? <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
? ? <%@taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
? ? ? <sql:setDataSource? ?var="ds"? driver="com.mysql.jdbc.Driver"
? ? ? ?url="jdbc:mysql://localhost:3306/tarena"
? ? ? ?user="root" password="11111111" />
??
? a、查詢
? ? <sql:query var="rs" dataSource="${ds}" sql="select * from users" ></sql:query>
? ? <c:forEach var="user" items="${rs.rows}">
? ? ? ? <tr>
? ? ? ? ? <td>${user.userid}</td>
? ? ? ? ? <td>${user.username}</td>
? ? ? ? ? <td>${user.password}</td>
? ? ? ? ? <td>${user.role}</td>
? ? ? ? </tr>
? ? </c:forEach>
??
? b、插入記錄
? ? <sql:update dataSource="${ds}" sql="insert into users values(101,'maxwell','123','admin')"
? ? ?var="i"></sql:update>
? ? <hr>插入${i}條記錄.
??
? c、更新記錄
? ? <sql:update dataSource="${ds}"
? ? ?sql="UPDATE users SET username='Gavin King' WHERE userid=101" var="i"></sql:update>
? ? <hr>更新${i}條記錄.
??
?<sql:param>
? 作用:設(shè)置sql語(yǔ)句中"?"表示的占位符號(hào)的值。
?<sql:update dataSource="${ds}" sql="UPDATE users SET username=? WHERE userid=?" var="i">
? ? <sql:param value="Rod Johnson" /> //設(shè)第一個(gè)問(wèn)號(hào)
? ? <sql:param value="100" />? ? ? ? ?//設(shè)第二個(gè)問(wèn)號(hào)
? </sql:update>
? 參數(shù)等價(jià)于
? //pstmt.setString(1,"Rod Johnson");
? //pstmt.setInt(2,100);?
?