jsp總結(jié)(經(jīng)典)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末抵栈,一起剝皮案震驚了整個(gè)濱河市告材,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌古劲,老刑警劉巖斥赋,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異产艾,居然都是意外死亡灿渴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門胰舆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來骚露,“玉大人,你說我怎么就攤上這事缚窿〖遥” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵倦零,是天一觀的道長误续。 經(jīng)常有香客問我吨悍,道長,這世上最難降的妖魔是什么蹋嵌? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任育瓜,我火速辦了婚禮,結(jié)果婚禮上栽烂,老公的妹妹穿的比我還像新娘躏仇。我一直安慰自己,他們只是感情好腺办,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布焰手。 她就那樣靜靜地躺著,像睡著了一般怀喉。 火紅的嫁衣襯著肌膚如雪书妻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天躬拢,我揣著相機(jī)與錄音躲履,去河邊找鬼。 笑死聊闯,一個(gè)胖子當(dāng)著我的面吹牛崇呵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播馅袁,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼荒辕!你這毒婦竟也來了汗销?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤抵窒,失蹤者是張志新(化名)和其女友劉穎弛针,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體李皇,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡削茁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掉房。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茧跋。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卓囚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤讽膏,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贤笆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏讨阻。R本人自食惡果不足惜芥永,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钝吮。 院中可真熱鬧埋涧,春花似錦、人聲如沸搀绣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽链患。三九已至巧鸭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間麻捻,已是汗流浹背纲仍。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贸毕,地道東北人郑叠。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像明棍,于是被迫代替她去往敵國和親乡革。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法摊腋,類相關(guān)的語法沸版,內(nèi)部類的語法,繼承相關(guān)的語法兴蒸,異常的語法视粮,線程的語...
    子非魚_t_閱讀 31,645評(píng)論 18 399
  • 1.學(xué)習(xí)內(nèi)容 JSP技術(shù)入門和常用指令 JSP的內(nèi)置對(duì)象&標(biāo)簽介紹 EL表達(dá)式&EL的內(nèi)置對(duì)象 2.JSP技術(shù)入門...
    WendyVIV閱讀 2,138評(píng)論 1 18
  • Jsp技術(shù)總結(jié) 1. 什么是JSP JSP即Java Server Pages,它和servlet技術(shù)一樣...
    java日記閱讀 1,656評(píng)論 0 18
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評(píng)論 0 11
  • 今天是農(nóng)歷九月初九重陽節(jié)橙凳。 早上5點(diǎn)翻看微博看到搜索框“請(qǐng)把兒時(shí)的陪伴還給父母”我才知道今天是重陽節(jié)蕾殴。 這是央視新...
    叮鈴鐺鐺鐺閱讀 250評(píng)論 0 0