JSP總結(jié)(經(jīng)典)
day1
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 使得我們能夠分離頁面的靜態(tài) HTML 和動(dòng)態(tài)部分——我們需要的技術(shù)从橘。
? ? 4)使頁面可以混和html代碼楼熄、Java代碼以及JSP標(biāo)簽捞镰;允許訪問組件
Servlet的缺陷(JSP出現(xiàn)的原因):
? ? 1)寫靜態(tài)頁面必須部署后才能看到效果闸与,很難控制頁面的外觀毙替。
? ? 2)從技術(shù)角度來說Servlet是Java代碼和HTML靜態(tài)代碼的混合代碼。
? ? 3)從市場(chǎng)競(jìng)爭(zhēng)角度來說践樱,微軟推出了ASP產(chǎn)品厂画。
JSP的改進(jìn):
? ? 1)JSP是標(biāo)簽式的文本文件(Servlet是Java文件)
? ? 2)JSP不需要編譯(其實(shí)是由服務(wù)器監(jiān)測(cè)JSP文件的變化,再將其翻譯成 Servlet 代碼)
? ? ? 服務(wù)器對(duì)其進(jìn)行編譯并在第一次請(qǐng)求時(shí)創(chuàng)建一個(gè)Servlet實(shí)例拷邢。所以袱院,第一次訪問JSP頁面時(shí)會(huì)后延遲
? ? 3)JSP不用寫配置文件
? ? 4)JSP以靜態(tài)代碼為主,Java代碼為輔瞭稼。Servlet反之忽洛。
? ? 5)是J2EE藍(lán)圖的一部分(Servlet、JSP以及EJB是J2EE的三大組件)
? ? JSP從本質(zhì)上來說內(nèi)核還是Servlet环肘,但與Servlet不是替代關(guān)系而是一種互補(bǔ)的關(guān)系欲虚。
? ? JSP適合于寫顯示層的動(dòng)態(tài)頁面,而Servlet則適合寫控制層的業(yè)務(wù)控制(頁面轉(zhuǎn)發(fā))悔雹。
? ? JSP往純標(biāo)簽方向發(fā)展复哆,Servlet往純代碼方向發(fā)展,他們以Servlet內(nèi)核(請(qǐng)求響應(yīng)式的工作方式)往兩個(gè)方向發(fā)展腌零。
基本語法
一梯找、JSP的聲明(statement)
? 用來定義在產(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)求該頁面的所有用戶所共享;
? ? 2) 在使用變量或方法前須先定義(不是說聲明變量的位置在頁面中要處于使用變量的前面氨淌,而是指變量不聲明不能使用);
? ? 3) 聲明的變量或方法的作用域?yàn)楫?dāng)前頁面或包含的頁面;
? ? 4) 語句間以分號(hào)分隔泊愧。
二、JSP代碼段(Scriptlet)
? ? ? <% java代碼 %>
? 是一段可以在處理請(qǐng)求時(shí)間執(zhí)行的Java代碼盛正∩驹郏可以產(chǎn)生輸出,也可以是一些流程控制語句豪筝。
? 在代碼段中定義的變量為service方法中的局部變量痰滋。
? 1._jspService()中的局部代碼:
? ? ? <%? System.out.println("Hi,I like JSP."); %>? //在控制臺(tái)打印出摘能,網(wǎng)頁上沒顯示
? ? ? <%? out.println("Hi,I like JSP."); %>? ? ? ? ? //打印在網(wǎng)頁上
? ? ? <%? Connection conn=DriverManager.getConnection();? Statement st=conn.createStatement();
? ? ? ? String sql="select * from users";? ? ? ? ? ? ? ResultSet rs=st.executeQuery(sql);
? ? ? ? //……
? ? ? %>
? ? 問:能否在JSP腳本里定義方法?
? ? 答:不能敲街! //腳本相當(dāng)于方法团搞,不能在方法里定義方法
? ? ? <%!public void helloworld(){}%>? //可以聲明方法
? ? ? <% public void helloworld(){}%>? //編譯出錯(cuò);腳本不能定義方法
? 2.比較:
? ? ? ? <%! int i=100;%>? ? //成員變量
? ? ? ? <%? int i=101;%>? ? //_jspService()方法中的局部變量
? ? ? ? <%=i%>? //同一文件里多艇,局部變量優(yōu)先
? 3.腳本小程序規(guī)則:
? ? 1) 你使用的腳本語言決定了腳本小程序的規(guī)則;
? ? 2) 語句間以分號(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ù)輸出至頁面的當(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) 你使用的腳本語言決定了腳本小程序的規(guī)則;
? ? 2) 執(zhí)行的順序?yàn)閺淖蟮接?
? ? 3) 分號(hào)不能用于表達(dá)式。
四样刷、JSP指令(direction)
? 指令用于從JSP發(fā)送信息到容器上仑扑。用來設(shè)置全局變量,聲明類置鼻,要實(shí)現(xiàn)的方法和輸出內(nèi)容等镇饮。
? 指令在JSP整個(gè)文件內(nèi)有效。它為翻譯階段提供了全局信息箕母。
? ? ? <%@......%>? // "@"符號(hào)
? 指令包括:page储藐、include、taglib
? 1.page指令
? ? ? ? import嘶是、session钙勃、errorPage、isThreadSafe
? ? 頁面的語言聂喇、內(nèi)容類型辖源、字符集、頁面編碼
? ? ? ? <%@page language="java" contentType="text/html; charset=gbk" pageEncoding="gbk"%>
? ? ? ? language:java唯一值希太,表示腳本中使用的編程語言
? ? ? ? contentType:設(shè)置了內(nèi)容的類型和靜態(tài)頁面的編碼 (告訴瀏覽器以什么編碼顯示)
? ? ? ? pageEncoding:頁面本身的編碼格式 (寫頁面時(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ì)話)
? ? ? ? 通過指令使當(dāng)前頁面與session不可會(huì)話:? ? <%@page session="false"%>
? ? ? ? session="true"時(shí),可用內(nèi)建對(duì)象session直接訪問會(huì)話堕澄,例如:
? ? ? ? <%? session.setAttribute("username","maxwell");
? ? ? ? ? ? String name = (String)session.getAttribute("username"); %>
? ? ? ? <%=name%>
? ? errorPage:
? ? ? ? isErrorPage:Jsp頁面中出現(xiàn)異常的處理方式
? ? ? ? 對(duì)于有可能出現(xiàn)異常的頁面:
? ? ? ? ? ? <%@page errorPage="error.jsp"%> //異常時(shí)會(huì)跳轉(zhuǎn)到處理異常的頁面邀跃;這頁面自己寫
? ? ? ? ? ? 在有可能異常的地方打印原因:? throw new Exception("數(shù)據(jù)庫連接出錯(cuò)");
? ? ? ? 對(duì)于處理異常的頁面(error.jsp)里:
? ? ? ? ? ? <%@page isErrorPage="true"%>霉咨,其中使用<%=exception.getMessage() %>把異常信息打印出來
? ? isThreadSafe——此屬性已經(jīng)不再使用(已廢棄)
? ? ? ? 當(dāng)前Jsp頁面是否線程安全? ? default--->true
? ? ? ? <%@page isThreadSafe="true"%>? //普通的Servlet,可以并發(fā)處理用戶請(qǐng)求
? ? ? ? <%@page isThreadSafe="false"%> //相當(dāng)于Servlet實(shí)現(xiàn)了SingleThreadModel
? 2.include指令
? ? ? ? 把目標(biāo)頁面的內(nèi)容包含到當(dāng)前頁面,產(chǎn)生頁面疊加以后的輸出效果 //相當(dāng)于將兩個(gè)頁面合并;編譯時(shí)就包含進(jìn)來
? ? ? ? <%@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)頁面注釋信息太多的時(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中通過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中通過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ì)于頁面是靜態(tài)內(nè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è)重要的問題游沿,因此,對(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處理過程:JSP源文件處理分成二個(gè)階段:
1) JSP頁面轉(zhuǎn)換階段:
? ? 頁面被編譯成一個(gè)Java類好唯,所有的HTML標(biāo)記和JSP標(biāo)記都被轉(zhuǎn)換創(chuàng)建一個(gè)Servlet竭沫。這時(shí),腳本和表達(dá)式還沒有被執(zhí)行;
2) 請(qǐng)求處理階段:發(fā)生在服務(wù)器骑篙,將一個(gè)客戶端請(qǐng)求指向JSP頁面蜕提。
? ? 一個(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. 過度使用腳本代碼使用JSP頁面混亂和難以維護(hù);
? ? b. 腳本代碼降低JSP二個(gè)主要的優(yōu)點(diǎn):軟件重用和代碼分開
2) 指導(dǎo)方針:只在組件功能無能為力或需要有限的腳本時(shí)使用。
?
day2
? POJO: Plain Old Java Object? --> 簡單傳統(tǒng)的Java對(duì)象
? Java Bean: 組件杨名、構(gòu)件的規(guī)范(屬性脏榆,提供get/set方法;還可包含其他方法)
JSP調(diào)用JavaBean
? 通過引入JavaBean镣煮,JSP才能較好的把頁面展示與業(yè)務(wù)邏輯分離姐霍。
? 其中,業(yè)務(wù)邏輯放到后臺(tái)的Java Bean中典唇,減少JSP中的腳本代碼镊折,有利于程序的可維護(hù)性與可重用性。
一介衔、Java Bean
? ? a.無參構(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)前頁面范圍(范圍最小级野,生命周期最短)
? ? ? ? ? request:同一個(gè)請(qǐng)求范圍 (forward,include)
? ? ? ? ? session:同一個(gè)會(huì)話(30分鐘不使用,會(huì)自動(dòng)結(jié)束)
? ? ? ? ? application:同一個(gè)應(yī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è)頁面處理異常。
? 1.errorPage
? ? 形如: <%@page errorPage="error.jsp"%>
? ? 表示:需要錯(cuò)誤處理的頁面
? 2.isErrorPage
? ? 形如: <%@page isErrorPage="true"%>
? ? 指示:錯(cuò)誤頁面愤估。其中帮辟,有一個(gè)隱式對(duì)象exception可用: <%=exception%>
? ? ? ? ? 產(chǎn)生(隱含)內(nèi)建對(duì)象exception,可通過它獲得異常信息
? ? ? ? ? <%=exception.getMessage() %> //把異常信息打印出來
三、聲明的方式處理異常
? ? // 在整個(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總是可以通過優(yōu)化代碼來避免,因此昔园,這種異常被稱為"Unchecked Exception"蔓榄。
? 3.思考:
? ? 三種異常處理方式同時(shí)啟動(dòng)用,那個(gè)優(yōu)先級(jí)高默刚? 作用域越小甥郑,優(yōu)先級(jí)越高。
? 注意:要使得頁面自動(dòng)跳轉(zhuǎn)到錯(cuò)誤頁面荤西,必須關(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.訪問控制(動(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)控受限資源的訪問
三饵溅、容器是如何完成認(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)訪問的目錄和文件
? ? ? ? ? <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>,說明所有的方法(Get,Post,Trace,Head,Delete,Put,Options等)都受約束奋构;
? ? ? 當(dāng)指定了具體的<http-method>,那么約束只針對(duì)該方法拱层,其他的http方法都不在約束之內(nèi)弥臼;
? ? ? <auth-constraint>定義的是哪些角色可以做出受約束的請(qǐng)求;而不是定義訪問<web-resource-collection>
? ? ? 沒有<auth-constraint>:任何角色都能訪問根灯;? 空的<auth-constraint />任何角色都不能訪問径缅;
? ? ? 對(duì)于不同的<security-constraint>,指定的url資源<url-pattern>在相同方法上定義了不同的<auth-constrain>烙肺,則存在合并規(guī)則纳猪。
? ? 問題:為什么要設(shè)置<auth-constraint />元素,使得任何角色的任何人都不能訪問受限資源呢桃笙?其意義何在氏堤?
? ? ? ? 為了保護(hù)資源,只允許內(nèi)部跳轉(zhuǎn)去訪問
? 3.選擇認(rèn)證方式
? ? 如果是BASIC認(rèn)證:則無需指定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的頁面上下文
? HttpSession? ? ? ? ? ? session? ? ? ? ? 會(huì)話對(duì)象
? ServletContext? ? ? ? application? ? ? 應(yīng)用上下文
? ServletConfig? ? ? ? ? config? ? ? ? ? JSP的ServletConfig
? Object? ? ? ? ? ? ? ? page? ? ? ? ? ? 頁面實(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
? 也就是說虚循,指定不同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頁面對(duì)應(yīng)著一個(gè)pageContext铺遂。一般地,在實(shí)際應(yīng)用中剪廉,主要是使用它來存取屬性娃循。
? ? 另外,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)頁的異常,不過此網(wǎng)頁要為error page,
? ? ? JspWriter getOut()? ? ? ? ? ? ? ? 回傳目前網(wǎng)頁的輸出流丁存,例如:out
? ? ? Object getPage()? ? ? ? ? ? ? ? ? 回傳目前網(wǎng)頁的Servlet 實(shí)體(instance)肩杈,例如:page
? ? ? ServletRequest getRequest()? ? ? ? 回傳目前網(wǎng)頁的請(qǐng)求,例如:request
? ? ? ServletResponse getResponse()? ? ? 回傳目前網(wǎng)頁的響應(yīng)解寝,例如:response
? ? ? ServletConfig getServletConfig()? 回傳目前此網(wǎng)頁的ServletConfig 對(duì)象扩然,例如:config
? ? ? ServletContext getServletContext() 回傳目前此網(wǎng)頁的執(zhí)行環(huán)境(context),例如:application
? ? ? HttpSession getSession()? ? ? ? ? 回傳和目前網(wǎng)頁有聯(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)求的來源说铃、標(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ù)字符串,不過焰枢,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è)定編碼格式,用來解決窗體傳遞中文的問題
?
? ? 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()? ? ? ? 取得用戶最后通過這個(gè)session送出請(qǐng)求的時(shí)間
? ? ? long getMaxInactiveInterval()? ? ? 取得最大session不活動(dòng)的時(shí)間荐绝,若超過這時(shí)間一汽,session 將會(huì)失效
? ? ? void invalidate()? ? ? ? ? ? ? ? ? 取消session 對(duì)象,并將對(duì)象存放的內(nèi)容完全拋棄
? ? ? boolean isNew()? ? ? ? ? ? ? ? ? ? 判斷session 是否為"新"的會(huì)話
? ? ? void setMaxInactiveInterval(int interval)?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 設(shè)定最大session不活動(dòng)的時(shí)間低滩,若超過這時(shí)間召夹,session 將會(huì)失效
? ? 4)application對(duì)象
? ? application對(duì)象最常被使用在存取環(huán)境的信息。
? ? 因?yàn)榄h(huán)境的信息通常都儲(chǔ)存在ServletContext中恕沫,所以常利用application對(duì)象來存取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)確地說page對(duì)象是當(dāng)前頁面轉(zhuǎn)換后的Servlet類的實(shí)例鲸阔。
? ? 從轉(zhuǎn)換后的Servlet類的代碼中偷霉,可以看到這種關(guān)系: Object page = this;
? ? 在JSP頁面中,很少使用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.用來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ì)象來輸出數(shù)據(jù)),
? ? 可以通過page指令的buffer屬性來調(diào)整緩沖區(qū)的大小虏两,默認(rèn)的緩沖區(qū)是8kb愧旦。
? ? out 對(duì)象能把結(jié)果輸出到網(wǎng)頁上。
? ? out主要是用來控制管理輸出的緩沖區(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)求沒有指明要訪問的資源時(shí),Web Container會(huì)用歡迎文件響應(yīng)客戶端請(qǐng)求.
2.手工設(shè)置歡迎文件:
? web.xml
? 找welcome.jsp,沒找到稠屠,繼續(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 (用戶交互過程:輸入、處理权埠、輸出)
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ì)模式
? 具體問題提出具體的解決辦法
習(xí)慣用法
?
Day4
內(nèi)容要點(diǎn): 1 實(shí)現(xiàn)文件上傳? 2 數(shù)據(jù)驗(yàn)證? 3 分頁實(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)通過HttpServletRequest來傳送文件內(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ù)長度大于5等等
JavaScript客戶端完成(驗(yàn)證框架漫雷,負(fù)責(zé)客戶端方面的驗(yàn)證)
?
2)服務(wù)器端校驗(yàn):
例如:后臺(tái)數(shù)據(jù)庫要求提交數(shù)據(jù)唯一性
Java服務(wù)器端完成(沒有現(xiàn)成的框架瓜富,因?yàn)椴煌捻?xiàng)目有不同的業(yè)務(wù)規(guī)則)
?
重點(diǎn):
1)分清楚什么情況下使用客戶端校驗(yàn),什么情況下使用服務(wù)器端校驗(yàn)
?
***************************************************************************************
三降盹、數(shù)據(jù)分頁
查詢數(shù)據(jù)庫時(shí)与柑,如果滿足條件的記錄很多谤辜,該如何返回給頁面?
1.客戶端分頁
? 同樣地,使用html/javascript等技術(shù)處理价捧。甚至可以封裝成組件
2.服務(wù)器端分頁
? 非常重要的丑念,在實(shí)際項(xiàng)目中非常需要————性能問題。
這需要結(jié)合JDBC/Hibernate/TopLink/EJB等技術(shù)實(shí)現(xiàn)结蟋。
?
查詢分頁
? 1)一次性從數(shù)據(jù)庫中查出所有信息脯倚,在內(nèi)存中作分頁(緩存)
? ? ? 特點(diǎn):速度非常快,消耗資源大(內(nèi)存?)
?
? 2)分多次查詢數(shù)據(jù)庫嵌屎,一次查詢的數(shù)據(jù)量就是一個(gè)頁面可以顯示的數(shù)據(jù)量
? ? ? 特點(diǎn):消耗資源少推正,相對(duì)來說速度慢
?
? 3)折衷的方案(一次只取n頁,1<n<總頁數(shù))(部分緩存)
? ? ? 特點(diǎn):中庸之道(實(shí)現(xiàn)中宝惰,置換算法教難)
?
常見的分頁處理方法:定義如下幾個(gè)參數(shù)
rows:數(shù)據(jù)庫表中記錄總行數(shù)? select count(*) from 表名;
? totalPage:總頁數(shù)? ? (導(dǎo)出屬性:可以由其他屬性計(jì)算而得) int totalPage = rows / size + 1;
size:每頁顯示的記錄數(shù)目? ? 可定制植榕,可寫死
curPageNo:當(dāng)前頁? ? ? ? 客戶端決定
? startRowNo:當(dāng)前頁在數(shù)據(jù)庫中的起始行號(hào)(導(dǎo)出屬性)? ? ? ? int startRowNo = (curPageNo -1 ) * size;
?
練習(xí):
重新改造Usermanager例子中的查詢所有的用戶的功能(使用分頁)
?
Day5
內(nèi)容要點(diǎn):? 1 EL? 2 JSTL
**************************************************************
一、EL(Expression Language----表達(dá)式語言)
為網(wǎng)頁美工而設(shè)尼夺,跟java語句相似尊残;盡量減少java程序的依賴(不能要求美工使用java)
1.語法
? 表達(dá)式? ? ? ? ? vs.? ? EL表達(dá)式語言(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的"+"沒有字符串連接功能
? ? ${5*2}? ? ? ? ? ? ? ? ? ? ? ? ? ? 10
? ? ${9.3/3}? ? ? ? ? ? ? ? ? ? ? ? ? 3.1
? ? ${9.3 div 3}? ? ? ? ? ? ? ? ? ? ? 3.1
? ? ${8 div 0}? ? ? ? ? ? ? ? ? ? ? ? Infinity // 表示無窮大
? ? ${9%2}? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ${9 mod 2}? ? ? ? ? ? ? ? ? ? ? ? 1
? ? ${8*6>68?"Yes":"No"}? ? ? ? ? ? ? No? //三目表達(dá)式
? <% String name="";
? ? request.setAttribute("name",name);? ? ? //如果沒有 setAttribute ,則必定是空
? %>
? ? ${empty name}? ? ? ? ? ? ? ? ? ? ? true //對(duì)范圍對(duì)象內(nèi)的變量或?qū)ο筮M(jìn)行判空
?
4.變量和JavaBean屬性數(shù)據(jù)輸出
? 表達(dá)式語言輸出變量流部,是到范圍對(duì)象(pageContext,request,session,application)中查找相應(yīng)屬性戚绕。
? 而非直接在頁面中查找實(shí)例或局部變量。
? 表達(dá)式語言查找變量的順序是:
? 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)來取值 "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ì)象吨凑,方便在頁面內(nèi)對(duì)各種常用數(shù)據(jù)信息的訪問.
? ? 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è)置輸出出來 %>
? ? ? ? <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"/>音樂
? ? ? ? </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á)式語言
? <%@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>
? ....
? 頁面的page指令設(shè)置isELIgnored屬性的優(yōu)先級(jí)比web.xml中<el-ignored>設(shè)置的高(當(dāng)然是范圍小的生效)
?
***************************************************************************************
二痕届、JSTL(JSP Standard Tag Library )
減少java代碼,簡化頁面編寫末患;功能封裝研叫,提高可重用性
1.如何使用JSTL
? 1)對(duì)于Java EE之前(即J2EE規(guī)范1.4及之前版本)
? ? a、復(fù)制jstl的jar包(jstl.jar,standard.jar)到/WEB-INF/lib
? ? b璧针、在使用jstl功能的jsp頁面中增加指令
? ? ? ? <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>? //核心標(biāo)簽庫
? ? ? ? <%@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ù)庫標(biāo)簽庫
? ? ? ? <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
? ? ? ? //prefix 表前綴(可改嚷炉,但通常按這寫的用); uri 指向標(biāo)簽庫的入口
? 2)Java EE規(guī)范把jstl作為規(guī)范的一部分
? ? 所以現(xiàn)在的jstl-1.2已經(jīng)包含了原來的jstl.jar , standard.jar
?
2.core:核心標(biāo)簽庫
? 一般用途
? 在JSTL中探橱,一般用途的標(biāo)簽主要是指具有輸出申屹,設(shè)置變量,和錯(cuò)誤處理等功能的標(biāo)簽隧膏,他們?cè)趈sp中使用比較頻繁哗讥,它們有:
? -----------
? |a、<c:set>|
? -----------
? 語法:<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>|
? --------------
? 語法:
? ? <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>|
? -----------
? 語法:<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="沒有nodefined這個(gè)變量"/>
? ? </td>
?
? -------------
? |d送膳、<c:catch>|
? -------------
? 它的作用是捕捉由嵌套在它里面的標(biāo)簽所拋出來的異常。類似于<%try{}catch{}%>
? 語法:<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}"/>
?
? 控制語句:
? -----------
? |a彤侍、 <c:if>|?
? -----------
? 語法:
? ? <c:if test="testCondition" var="varName"
? ? [scope="{page|request|session|application}"]>
? ? ? Body內(nèi)容
? ? </c:if>? // 注:沒有 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}">
? ? ? ? ? ? ? 您今年沒有納稅晒奕!
? ? ? ? </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>
? ? ? ? ? 您今年納稅超過了3000元脑慧,多謝您為國家的繁榮富強(qiáng)作出了貢獻(xiàn)!
? ? ? ? </c:otherwise>
? ? </c:choose>
?
? ---------------
? |c砰盐、<c:forEach>| 循環(huán)
? ---------------
? 語法: <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語句中"?"表示的占位符號(hào)的值。
<sql:update dataSource="${ds}" sql="UPDATE users SET username=? WHERE userid=?" var="i">
? ? <sql:param value="Rod Johnson" /> //設(shè)第一個(gè)問號(hào)
? ? <sql:param value="100" />? ? ? ? //設(shè)第二個(gè)問號(hào)
? </sql:update>
? 參數(shù)等價(jià)于
? //pstmt.setString(1,"Rod Johnson");
? //pstmt.setInt(2,100);
轉(zhuǎn)自:http://www.cnblogs.com/cyjch/archive/2012/03/28/2420798.html