JSP總結(經典)
07-09
day1
JSP 定義:
1)Java Server Page, Java EE 組件,本質上是 Servlet。
2)運行在 Web Container.接收 Http Request,生成 Http Response(默認協議是 Http 請求和響應)
3)JSP 使得我們能夠分離頁面的靜態 HTML 和動態部分——我們需要的技術。
4)使頁面可以混和html代碼、Java代碼以及JSP標籤;允許訪問組件
Servlet的缺陷(JSP出現的原因):
1)寫靜態頁面必須部署後才能看到效果,很難控制頁面的外觀。
2)從技術角度來說Servlet是Java代碼和HTML靜態代碼的混合代碼。
3)從市場競爭角度來說,微軟推出了ASP產品。
JSP的改進:
1)JSP是標籤式的文本文件(區Servlet是Java文件)
2)JSP不需要編譯(其實是由伺服器監測JSP文件的變化,再將其翻譯成 Servlet 代碼)
伺服器對其進行編譯並在第一次請求時創建一個Servlet實例。所以,第一次訪問JSP頁面時會後延遲
3)JSP不用寫配置文件
4)JSP以靜態代碼為主,Java代碼為輔。Servlet反之。
5)是J2EE藍圖的一部分(Servlet、JSP以及EJB是J2EE的三大組件)
JSP從本質上來說內核還是Servlet,但與Servlet不是替代關係而是一種互補的關係。
JSP適合於寫顯示層的動態頁面,而Servlet則適合寫控制層的業務控制(頁面轉發)。
JSP往純標籤方向發展,Servlet往純代碼方向發展,他們以Servlet內核(請求響應式的工作方式)往兩個方向發展。
基本語法
一、JSP的聲明(statement)
用來定義在產生的類文件中的類的屬性和方法(成員變數)。可聲明類(即是內部類)。
由於servlet是工作在多線程環境下,所以盡量不要在service方法體外聲明成員變數。
<%!.....%>
//聲明時要加"!",屬於類成員,最先載入,可寫於任何位置;不加則是腳本的局部變數,必須調用前寫。
如: <%!String hello=
"Hello, World!"
;%>
//變數的聲明
<%=hello%>
//變數的調用
<%!
private
int
counter=0;
public
int
count(){
return
++counter;} %>
//函數的聲明
<h1><%=count()%></h1>
//函數的調用
聲明規則:
1) JSP中聲明的變數和方法對應於Servlet中的實例方法和實例變數。這些將被同時請求該頁面的所有用戶所共享;
2) 在使用變數或方法前須先定義(不是說聲明變數的位置在頁面中要處於使用變數的前面,而是指變數不聲明不能使用);
3) 聲明的變數或方法的作用域為當前頁面或包含的頁面;
4) 語句間以分號分隔。
二、JSP代碼段(Scriptlet)
<% java代碼 %>
是一段可以在處理請求時間執行的Java代碼。可以產生輸出,也可以是一些流程式控制制語句。
在代碼段中定義的變數為service方法中的局部變數。
1._jspService()中的局部代碼:
<% System.
out
.println(
"Hi,I like JSP."
); %>
//在控制台列印出,網頁上沒顯示
<%
out
.println(
"Hi,I like JSP."
); %>
//列印在網頁上
<% Connection conn=DriverManager.getConnection(); Statement st=conn.createStatement();
String sql=
"select * from users"
; ResultSet rs=st.executeQuery(sql);
//……
%>
問:能否在JSP腳本里定義方法?
答:不能!
//腳本相當於方法,不能在方法里定義方法
<%!
public
void
helloworld(){}%>
//可以聲明方法
<%
public
void
helloworld(){}%>
//編譯出錯;腳本不能定義方法
2.比較:
<%!
int
i=100;%>
//成員變數
<%
int
i=101;%>
//_jspService()方法中的局部變數
<%=i%>
//同一文件里,局部變數優先
3.腳本小程序規則:
1) 你使用的腳本語言決定了腳本小程序的規則;
2) 語句間以分號分隔;
3) 可以使用默認的對象、import進的類、declaration聲明的方法和對象以及useBean tag中聲明的對象。
三、JSP表達式(expression)
<%=……%>
// "="號
在JSP請求處理階段計算他的值,表達式生成的代碼是Service方法中的一個代碼片斷。
JSP對於聲明的處理:1、計算表達式的值
2、將值轉換成String
3、用
out
.println發送標籤;把數據輸出至頁面的當前位置
<%=
"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());
表達式規則:
1) 你使用的腳本語言決定了腳本小程序的規則;
2) 執行的順序為從左到右;
3) 分號不能用於表達式。
四、JSP指令(direction)
指令用於從JSP發送信息到容器上。用來設置全局變數,聲明類,要實現的方法和輸出內容等。
指令在JSP整個文件內有效。它為翻譯階段提供了全局信息。
<%@......%>
// "@"符號
指令包括:page、include、taglib
1.page指令
import、session、errorPage、isThreadSafe
頁面的語言、內容類型、字符集、頁面編碼
<%@page language=
"java"
contentType=
"text/html; charset=gbk"
pageEncoding=
"gbk"
%>
language:java唯一值,表示腳本中使用的編程語言
contentType:設置了內容的類型和靜態頁面的編碼 (告訴瀏覽器以什麼編碼顯示)
pageEncoding:頁面本身的編碼格式 (寫頁面時用的編碼格式)
上面的代碼等價於servlet里: response.setContentType(
"text/html; charset=gbk"
);
import:導入其他的包和類; 其中,JSP默認導入的包是java.lang.*
<%@page import=
"java.util.Date"
%>
//具體的包和類
<%@page import=
"java.sql.*"
%>
//包下的所有類
<%@page import=
"java.util.*, java.io.*, java.net.*"
%>
//連寫,逗號分隔
Session:指示當前的jsp是否參與會話 (默認為
true
; 參與會話)
通過指令使當前頁面與session不可會話: <%@page session=
"false"
%>
session=
"true"
時,可用內建對象session直接訪問會話,例如:
<% session.setAttribute(
"username"
,
"maxwell"
);
String name = (String)session.getAttribute(
"username"
); %>
<%=name%>
errorPage:
isErrorPage:Jsp頁面中出現異常的處理方式
對於有可能出現異常的頁面:
<%@page errorPage=
"error.jsp"
%>
//異常時會跳轉到處理異常的頁面;這頁面自己寫
在有可能異常的地方列印原因:
throw
new
Exception(
"資料庫連接出錯"
);
對於處理異常的頁面(error.jsp)里:
<%@page isErrorPage=
"true"
%>,其中使用<%=exception.getMessage() %>把異常信息列印出來
isThreadSafe——此屬性已經不再使用(已廢棄)
當前Jsp頁面是否線程安全
default
--->
true
<%@page isThreadSafe=
"true"
%>
//普通的Servlet,可以並發處理用戶請求
<%@page isThreadSafe=
"false"
%>
//相當於Servlet實現了SingleThreadModel
2.include指令
把目標頁面的內容包含到當前頁面,產生頁面疊加以後的輸出效果
//相當於將兩個頁面合併;編譯時就包含進來
<%@include file=
"foot.jsp"
%>
//可插入任意位置
3.taglib指令
留在JSTL里講解。
五、JSP中的注釋
1.java格式注釋
編譯器會忽略掉此類注釋中的內容(客戶端的源碼看不見)
<%-- JSP注釋;可多行 --%>
<%
// java 單行注釋 %>
<%
/* java multi lines comments */
%>
<%
/**java 特有的注釋*/
%>
2.html風格注釋
編譯器會執行此類注釋中的代碼(客戶端的源碼看得見)
<!-- html風格注釋 --> 等價於
out
.println(
"<!-- html風格注釋 -->"
)
這種注釋方式不好的地方就是當頁面注釋信息太多的時候會增大伺服器的負荷。
還有注釋信息需要在網路上傳輸,從而降低效率;內部程序員的測試數據一般不能寫在這種注釋中,以免泄露。
六、動作(Action)
<jsp:actionName attributeName=attributeValue/>
JSP的動作包括:
forward、include、useBean、setProperty、getProperty
1.forward動作
形式:<jsp:forward page=
"another.jsp"
/>
等價於 Servlet中通過RequestDispatcher.forward();
可以傳參數
<jsp:forward page=
"another.jsp"
>
<jsp:param name=
"name"
value=
"maxwell"
/>
<jsp:param name=
"age"
value=
"20"
/>
</jsp:forward>
2.Include動作
形式:<jsp:include page=
"another.jsp"
/>
等價於 Servlet中通過RequestDispatcher.include();
Include動作也可以傳參數
<jsp:include page=
"b.jsp"
flush=
"true"
>
<jsp:param name=
"name"
value=
"narci"
/>
</jsp:include>
與<%@include file=
""
%>比較:
include動作在運行期處理(include指令編譯期),jsp:include包含的是所包含URI的響應,而不是URI本身。
這意味著:jsp:include 對所指出的 URI 進行解釋,因而包含的是生成的響應。
對於頁面是靜態內容,這沒有太大的關係。但如果是動態內容,include動作可傳參數。
flush 屬性
flush 指示在讀入包含內容之前是否清空任何現有的緩衝區。
JSP 1.1 中需要 flush 屬性,因此,如果代碼中不用它,會得到一個錯誤。
但是,在 JSP 1.2 中, flush 屬性預設為
false
。
建議:由於清空大多數時候不是一個重要的問題,因此,對於 JSP 1.1,將 flush 設置為
true
;
而對於 JSP 1.2 及更高版本,將其設置為
false
或不設置(用默認值)。
JSP的生命周期
1) 每一個JSP都會對應有一個servlet生成
2) 在 %tomcat%/work/Catalina/localhost/工程名/org/apache/jsp 目錄下可找到對應生成的 Servlet 文件
3) 一般而言,每一個JSP對應的servlet都有如下的生命周期方法:
一、 _jspInit()方法
JSP容器第一次裝載jsp文件時調用一次
public
void
_jspInit(){……}
二、 _jspService()方法
每當伺服器接收到對該jsp的請求,都需要調用一次該方法一次。
public
void
_jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException { ……}
三、 _jspDestroy()方法
jsp文件被修改時,JSP容器會銷毀舊的jsp文件對應的對象,重新裝載一次更新後的jsp文件的內容(只調用一次)。
public
void
_jspDestroy(){……}
JSP處理過程:JSP源文件處理分成二個階段:
1) JSP頁面轉換階段:
頁面被編譯成一個Java類,所有的HTML標記和JSP標記都被轉換創建一個Servlet。這時,腳本和表達式還沒有被執行;
2) 請求處理階段:發生在伺服器,將一個客戶端請求指向JSP頁面。
一個請求對象創建、解析以及提交給編譯好的JSP對應的servlet。
當這個servlet處理請求的時候它執行先前在JSP中定義的處理腳本小程序和表達式。
使用腳本代碼的缺點和指導方針
1) 缺點:
a. 過度使用腳本代碼使用JSP頁面混亂和難以維護;
b. 腳本代碼降低JSP二個主要的優點:軟體重用和代碼分開
2) 指導方針:只在組件功能無能為力或需要有限的腳本時使用。
day2
POJO: Plain Old Java Object --> 簡單傳統的Java對象
Java Bean: 組件、構件的規範(屬性,提供
get
/
set
方法;還可包含其他方法)
JSP調用JavaBean
通過引入JavaBean,JSP才能較好的把頁面展示與業務邏輯分離。
其中,業務邏輯放到後台的Java Bean中,減少JSP中的腳本代碼,有利於程序的可維護性與可重用性。
一、Java Bean
a.無參構造器(也是默認的構造方法)
b.標準的getter、setter方法
c.如要進行網路傳輸(支持RMI),需實現Serializable介面
二、如何在JSP中使用JavaBean?
1.定義Java Bean
形式:<jsp:useBean id =
"BeanName"
class
=
"className"
sope=
"範圍域"
>
id ——聲明bean對象的標識符,方便其他地方使用
class
——bean對象的類型,注意要使用完全限定名
scope——java bean對象的共享範圍(page、request、session、application)
page:當前頁面範圍(範圍最小,生命周期最短)
request:同一個請求範圍 (forward,include)
session:同一個會話(30分鐘不使用,會自動結束)
application:同一個應用(範圍最大,生命周期最長) ServletContext
例如: SuperGirl <jsp:useBean id=
"girl"
class
=
"com.tarena.vo.SuperGirl"
scope=
"session"
/>
等價於:<% SuperGirl girl=(SuperGirl)session.getAttribute(
"girl"
);
if
(girl==
null
){
girl =
new
SuperGirl();
//對應 id 和 class
session.setAttribute(
"girl"
,girl);
//對應 scope 的值
} %>
可以用表達式獲得bean的值: <%=girl.getName();%>
2.對JavaBean的屬性賦值
形式:<jsp:setProperty name=
"JavaBean對象名"
property=
"JavaBean屬性名"
value=
"屬性值"
/>
例子: <jsp:setProperty name=
"girl"
property=
"name"
value=
"Lily"
/>
等價於: <% girl.setName(
"Lily"
);%>
可以嵌套JSP表達式:
<jsp:setProperty name=
"girl"
property=
"name"
value=
"<%=request.getParameter("name")%>"
/>
Java Bean中的屬性名與form中輸入域的名字保持一致的話,可以使用通配符*,一次設置所有欄位的值。
<jsp:setProperty name=
""
property=
"*"
/>
3.獲取JavaBean的屬性值
形式:<jsp:getProperty name=
""
property=
""
/>
name:標識具體的Bean對象,這與<jsp:useBean>標準動作中的id值相匹配
property:標識屬性中的標識符。
JSP中的異常處理
一、
try
/
catch
/
finally
/throws/
throw
// 在局部代碼里處理異常。
二、errorPage, isErrorPage
// 在整個頁面處理異常。
1.errorPage
形如: <%@page errorPage=
"error.jsp"
%>
表示:需要錯誤處理的頁面
2.isErrorPage
形如: <%@page isErrorPage=
"true"
%>
指示:錯誤頁面。其中,有一個隱式對象exception可用: <%=exception%>
產生(隱含)內建對象exception,可通過它獲得異常信息
<%=exception.getMessage() %>
//把異常信息列印出來
三、聲明的方式處理異常
// 在整個應用處理異常。(範圍比前兩種更大)
1.配置: 在web.xml進行配置異常處理
…… <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.複習:Java中的異常——有2種
受查異常(Checked Exception)
非受查異常(Unchecked Exception) Java中的RuntimeException及其子類是不需要處理的(
try
/
catch
)
因為所有的RuntimeException總是可以通過優化代碼來避免,因此,這種異常被稱為
"Unchecked Exception"
。
3.思考:
三種異常處理方式同時啟動用,那個優先順序高? 作用域越小,優先順序越高。
注意:要使得頁面自動跳轉到錯誤頁面,必須關閉瀏覽器的
"顯示友好HTTP錯誤信息"
選項。
public
void
_jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
/*只處理這兩種兼容的異常*/
…… }
安全的系統(企業級應用):
1.身份認證(合法用戶) --登錄
2.授權(靜態) --定義許可權
3.訪問控制(動態) --比較
4.安全審計(日誌) --修復bug (只有敏感的部門需要)
JAAS實現安全
JAAS——Java Authentication and Authorization Service
(Java認證(Authentication)與授權(Authorization)服務)
是Java EE規範之一,實現Java EE應用程序安全性的一個重要途徑
(要求:會使用,不必深入理解)
一、網路安全的4大要素
認證——抵禦假冒者(用戶身份的合法性)
授權——合法用戶擁有的許可權
機密性——防止關鍵數據落入其他人手中
數據完整性——抵禦竊聽者(篡改私有數據)
二、對於Http應用是如何進行認證的(Web端的認證方法)?
四種安全認證: (http協議)basic, form, digest, certificate(證書) + ssl
HttpMonitor監控受限資源的訪問
三、容器是如何完成認證與授權的呢?
圖示(容器做了些什麼事情)
(容器的角度)
四、聲明式安全以及分工
Servlet的開發者
應用的管理員
部署人員
五、實戰
1.定義新用戶與角色
在Tomcat伺服器中定義: %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方法。
授權約束:<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>
//被授權訪問的目錄和文件
<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>
要注意的規則:
不要認為:資源本身受到約束;其實,是資源 + Http方法組合受到約束
如果配置中不指定<http-method>,說明所有的方法(Get,Post,Trace,Head,Delete,Put,Options等)都受約束;
當指定了具體的<http-method>,那麼約束只針對該方法,其他的http方法都不在約束之內;
<auth-constraint>定義的是哪些角色可以做出受約束的請求;而不是定義訪問<web-resource-collection>
沒有<auth-constraint>:任何角色都能訪問; 空的<auth-constraint />任何角色都不能訪問;
對於不同的<security-constraint>,指定的url資源<url-pattern>在相同方法上定義了不同的<auth-constrain>,則存在合併規則。
問題:為什麼要設置<auth-constraint />元素,使得任何角色的任何人都不能訪問受限資源呢?其意義何在?
為了保護資源,只允許內部跳轉去訪問
3.選擇認證方式
如果是BASIC認證:則無需指定Form表單的action。
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>UserDatabaseRealm</realm-name>
</login-config>
如果是FORM認證:
<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>
對於Form表單認證
action的值,用戶名、密碼欄位的名稱都是固定的(規範)
<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>
標準的表單提交(固定不變):
action:j_security_check
name:j_username
password:j_password
Day3
內容要點: 1.隱含對象 2.歡迎文件 3 MVC
********************************************************************************************
一、隱含對象
1.什麼是隱含對象(9個)?
————JSP中的隱含對象:不用我們手工去創建的對象
類型 對象名 功能
---------------------------------------------------------------------
JspWriter
out
往瀏覽器寫內容
HttpServletRequest request Http請求對象.
HttpServletResponse response Http響應對象
PageContext pageContext JSP的頁面上下文
HttpSession session 會話對象
ServletContext application 應用上下文
ServletConfig config JSP的ServletConfig
Object page 頁面實現類的對象(例如:
this
)
Exception exception 含有指令<%@page isErrorPage=
"true"
%>
2.範圍對象
其中,有4個是範圍對象: pageContext,request,session,application
對應<jsp:useBean/>指令的scope分別是:page,reqeust,session,application
也就是說,指定不同scope的bean對象(Java Bean)會被綁定到不同的範圍對象中
// 選擇範圍對象的原則:作用域的範圍越小越好;因為作用域小的生命周期短,有利於性能提高。
例如:<jsp:useBean id=
"stu"
class
=
"vo.Student"
scope=
"page"
/>
表示stu對象被綁定到javax.servlet.jsp.PageContext對象(pageContext)中,其等價的代碼
<% Student stu = pageContext.getAttribute(
"stu"
);
if
(stu==
null
) {
stu=
new
Student();
pageContext.setAttribute(
"stu"
,stu);
}%>
1)pageContext對象:
每一個jsp頁面對應著一個pageContext。一般地,在實際應用中,主要是使用它來存取屬性。
另外,pageContext對象能夠存取其他隱含對象。
a.pageContext對象存取其他隱含對象屬性的方法,此時需要指定範圍的參數。
Object getAttribute(String name,
int
scope)
Enumeration getAttributeNamesInScope(
int
scope)
void
removeAttribute(String name,
int
scope)
void
setAttribute(String name, Object value,
int
scope)
其中,範圍參數有四個,分別代表四種範圍:
PAGE_SCOPE、REQUEST_SCOPE、SESSION_SCOPE、APPLICATION_SCOPE
b.PageContext對象取得其他隱含對象的方法
Exception getException() 回傳目前網頁的異常,不過此網頁要為error page,
JspWriter getOut() 回傳目前網頁的輸出流,例如:
out
Object getPage() 回傳目前網頁的Servlet 實體(instance),例如:page
ServletRequest getRequest() 回傳目前網頁的請求,例如:request
ServletResponse getResponse() 回傳目前網頁的響應,例如:response
ServletConfig getServletConfig() 回傳目前此網頁的ServletConfig 對象,例如:config
ServletContext getServletContext() 回傳目前此網頁的執行環境(context),例如:application
HttpSession getSession() 回傳和目前網頁有聯繫的會話(session),例如:session
c.PageContext對象提供取得屬性的方法
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 的屬性對象
void
removeAttribute(String name,
int
scope) 移除屬性名稱為name,範圍為scope 的屬性對象
void
setAttribute(String name, Object value,
int
scope)
指定屬性對象的名稱為name、值為value、範圍為scope
Object findAttribute(String name) 尋找在所有範圍中屬性名稱為name 的屬性對象
2)request 對象
request 對象包含所有請求的信息,
如:請求的來源、標頭、cookies和請求相關的參數值等等。
request 對象實現javax.servlet.http.HttpServletRequest介面的,
所提供的方法可以將它分為四大類:
(1)儲存和取得屬性方法;
void
setAttribute(String name, Object value) 設定name屬性的值為value
Enumeration getAttributeNamesInScope(
int
scope) 取得所有scope 範圍的屬性
Object getAttribute(String name) 取得name 屬性的值
void
removeAttribute(String name) 移除name 屬性的值
(2)取得請求參數的方法
String getParameter(String name) 取得name 的參數值
Enumeration getParameterNames() 取得所有的參數名稱
String [] getParameterValues(String name) 取得所有name 的參數值
Map getParameterMap() 取得一個要求參數的Map
(3)能夠取得請求HTTP 標頭的方法
String getHeader(String name) 取得name 的標頭
Enumeration getHeaderNames() 取得所有的標頭名稱
Enumeration getHeaders(String name) 取得所有name 的標頭
int
getIntHeader(String name) 取得整數類型name 的標頭
long
getDateHeader(String name) 取得日期類型name 的標頭
Cookie [] getCookies() 取得與請求有關的cookies
(4)其他的方法
String getContextPath() 取得Context 路徑(即站台名稱)
String getMethod() 取得HTTP 的方法(GET、POST)
String getProtocol() 取得使用的協議 (HTTP/1.1、HTTP/1.0 )
String getQueryString() 取得請求的參數字元串,不過,HTTP的方法必須為GET
String getRequestedSessionId() 取得用戶端的Session ID
String getRequestURI() 取得請求的URL,但是不包括請求的參數字元串
String getRemoteAddr() 取得用戶的IP 地址
String getRemoteHost() 取得用戶的主機名稱
int
getRemotePort() 取得用戶的主機埠
String getRemoteUser() 取得用戶的名稱
void
getCharacterEncoding(String encoding) 設定編碼格式,用來解決窗體傳遞中文的問題
3)session 對象
session對象表示目前個別用戶的會話(session)狀況。
session對象實現javax.servlet.http.HttpSession介面,HttpSession介面所提供的方法
long
getCreationTime() 取得session產生的時間,單位是毫秒
String getId() 取得session 的ID
long
getLastAccessedTime() 取得用戶最後通過這個session送出請求的時間
long
getMaxInactiveInterval() 取得最大session不活動的時間,若超過這時間,session 將會失效
void
invalidate() 取消session 對象,並將對象存放的內容完全拋棄
boolean isNew() 判斷session 是否為
"新"
的會話
void
setMaxInactiveInterval(
int
interval)
設定最大session不活動的時間,若超過這時間,session 將會失效
4)application對象
application對象最常被使用在存取環境的信息。
因為環境的信息通常都儲存在ServletContext中,所以常利用application對象來存取ServletContext中的信息。
application 對象實現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的絕對路徑
void
log(String message) 將信息寫入log文件中
void
log(String message, Throwable throwable) 將stack trace 所產生的異常信息寫入log文件中
3.其他對象:
1)page 對象
page對象代表JSP本身,更準確地說page對象是當前頁面轉換後的Servlet類的實例。
從轉換後的Servlet類的代碼中,可以看到這種關係: Object page =
this
;
在JSP頁面中,很少使用page對象。
2)response 對象
response 對象主要將JSP 處理數據後的結果傳回到客戶端。
response 對象是實現javax.servlet.http.HttpServletResponse 介面。response對象所提供的方法。
a.設定表頭的方法
void
addCookie(Cookie cookie) 新增cookie
void
addDateHeader(String name,
long
date) 新增
long
類型的值到name標頭
void
addHeader(String name, String value) 新增String類型的值到name標頭
void
addIntHeader(String name,
int
value) 新增
int
類型的值到name標頭
void
setDateHeader(String name,
long
date) 指定
long
類型的值到name標頭
void
setHeader(String name, String value) 指定String類型的值到name標頭
void
setIntHeader(String name,
int
value) 指定
int
類型的值到name標頭
b.設定響應狀態碼的方法
void
sendError(
int
sc) 傳送狀態碼(status code)
void
sendError(
int
sc, String msg) 傳送狀態碼和錯誤信息
void
setStatus(
int
sc) 設定狀態碼
c.用來URL 重寫(rewriting)的方法
String encodeRedirectURL(String url) 對使用sendRedirect()方法的URL予以編碼
3)
out
對象
out
對象的類型是javax.servlet.jsp.JspWriter,該類從java.io.Writer類派生,以字元流的形式輸出數據。
out
對象實際上是PrintWriter對象的帶緩衝的版本(在
out
對象內部使用PrintWriter對象來輸出數據),
可以通過page指令的buffer屬性來調整緩衝區的大小,默認的緩衝區是8kb。
out
對象能把結果輸出到網頁上。
out
主要是用來控制管理輸出的緩衝區(buffer)和輸出流(output stream)。
void
clear( ) 清除輸出緩衝區的內容
void
clearBuffer( ) 清除輸出緩衝區的內容
void
close( ) 關閉輸出流,清除所有的內容
int
getBufferSize( ) 取得目前緩衝區的大小(KB)
int
getRemaining( ) 取得目前使用後還剩下的緩衝區大小(KB)
boolean isAutoFlush( ) 回傳
true
表示緩衝區滿時會自動清除;
false
表示不會自動清除並且產生異常處理
4)exception對象
若要使用exception 對象時,必須在page 指令中設定:<%@ page isErrorPage=
"true"
%>才能使用。
exception提供的三個方法:
getMessage()
getLocalizedMessage()
printStackTrace(
new
java.io.PrintWriter(
out
))
5)config 對象
config 對象里存放著一些Servlet 初始的數據結構。
config 對象實現於javax.servlet.ServletConfig 介面,它共有下列四種方法:
public
String getInitParameter(name)
public
java.util.Enumeration getInitParameterNames( )
public
ServletContext getServletContext()
public
Sring getServletName()
例子:
1.範圍對象比較
<% pageContext 或request 或session 或application.setAttribute(
"name"
,
"maxwell"
);
pageContext.setAttribute(
"sex"
,
"m"
);
%>
2.輸出對象
out
<%
out
.println(
"Hello JSP!"
);%>
<%System.
out
.println(
"Hello JSP!"
);%>
getBufferSize()
//tomcat default:12k
getRemaining()
flush()
clearBuffer()
3.request對象
request:
getProtocol()
getMethod()
getHeader(
"User-Agent"
)
getCookies()
getRequestURI()
getRequestURL()
getContextPath()
getServletPath()
getPathInfo()
getQueryString()
isRequestedSessionIdFromCookie()
isRequestedSessionIdFromURL()
isRequestedSessionIdValid()
getLocalPort(),getRemotePort()
getRequestDispatcher(),setCharacterEncoding(),getInputStream()
4.session對象
session:
getId()
isNew()
invalidate()
setMaxInactiveInterval(10)
5.響應對象
response:
sendRedirect(
"third.jsp"
)
sendError(404,
"400 Error!"
)
6.應用對象
application:
log(
"some body visit our website..."
);
getMajorVersion()
getMinorVersion()
getServerInfo()
getRequestDispatcher(),getResourceAsStream(),getInitParameter()
pageContext:
getAttribute(
"name"
)
config:
getInitParameter(
"classNo"
)
getServletName()
page:
getClass()
************************************************************************************************
二、歡迎文件
1.預設情況下,一個Web App中的 index.html, index.htm, index.jsp 可作為默認的歡迎文件.
當用戶請求沒有指明要訪問的資源時,Web Container會用歡迎文件響應客戶端請求.
2.手工設置歡迎文件:
web.xml
找welcome.jsp,沒找到,繼續往下找
<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應用的MVC;優化Web App的結構,使用MVC模式
Model 1: JSP + JavaBean(EJB)
Model 2: Servlet + JSP + JavaBean(EJB)------>MVC
體系結構
設計模式
具體問題提出具體的解決辦法
習慣用法
Day4
內容要點: 1 實現文件上傳 2 數據驗證 3 分頁實現
*****************************************************************************************
一、文件上傳
1.表單形式
<form action=
""
method=
"POST"
enctype=
"multipart/form-data"
>
file:<input type=
"file"
name=
"file"
/><br/>
<input type=
"submit"
/>
</form>
2.使用HttpMonitor工具:
查看文件上傳時,請求的內容。
3.伺服器端對上傳文件的處理
例子
fileupload
處理步驟(待補充)
知識點:
1)通過HttpServletRequest來傳送文件內容
2)處理request頭,字元串的分析
3)java.io.File API的使用
*****************************************************************************************
二、數據驗證
如何完成Web App中的數據驗證工作
1)客戶端校驗:
輸入域不能為空,只能是數字,數據長度大於5等等
JavaScript客戶端完成(驗證框架,負責客戶端方面的驗證)
2)伺服器端校驗:
例如:後台資料庫要求提交數據唯一性
Java伺服器端完成(沒有現成的框架,因為不同的項目有不同的業務規則)
重點:
1)分清楚什麼情況下使用客戶端校驗,什麼情況下使用伺服器端校驗
***************************************************************************************
三、數據分頁
查詢資料庫時,如果滿足條件的記錄很多,該如何返回給頁面?
1.客戶端分頁
同樣地,使用html/javascript等技術處理。甚至可以封裝成組件
2.伺服器端分頁
非常重要的,在實際項目中非常需要————性能問題。
這需要結合JDBC/Hibernate/TopLink/EJB等技術實現。
查詢分頁
1)一次性從資料庫中查出所有信息,在內存中作分頁(緩存)
特點:速度非常快,消耗資源大(內存?)
2)分多次查詢資料庫,一次查詢的數據量就是一個頁面可以顯示的數據量
特點:消耗資源少,相對來說速度慢
3)折衷的方案(一次只取n頁,1<n<總頁數)(部分緩存)
特點:中庸之道(實現中,置換演算法教難)
常見的分頁處理方法:定義如下幾個參數
rows:資料庫表中記錄總行數
select
count(*)
from
表名;
totalPage:總頁數 (導出屬性:可以由其他屬性計算而得)
int
totalPage = rows / size + 1;
size:每頁顯示的記錄數目 可定製,可寫死
curPageNo:當前頁 客戶端決定
startRowNo:當前頁在資料庫中的起始行號(導出屬性)
int
startRowNo = (curPageNo -1 ) * size;
練習:
重新改造Usermanager例子中的查詢所有的用戶的功能(使用分頁)
Day5
內容要點: 1 EL 2 JSTL
**************************************************************
一、EL(Expression Language----表達式語言)
為網頁美工而設,跟java語句相似;盡量減少java程序的依賴(不能要求美工使用java)
1.語法
表達式 vs. EL表達式語言(JSP2.0)
<%=name%> <=> ${name}
2.文字
在 EL 表達式中,數字、字元串、布爾值和
null
都可以被指定為文字值(常量)。
字元串可以用單引號或雙引號定界。布爾值被指定為
true
和
false
。
例子:
表達式 值
-----------------------------------------------------------------------
${-168.18} -168.18
${3.8e-18} 3.8e-18
//科學計數法
${3.14159265} 3.14159265
${
"Hello JSP EL!"
} Hello JSP EL! 等價於 <%=
"Hello JSP EL!"
%>
${
"Hello JSP EL..."
} Hello JSP EL...
${
true
}
//can be TRUE? true
${
false
}
//can be FALSE? false
${str==
null
}
true
//布爾值的表達式
3.EL 運算符
類別 運算符
-------------------------------------------------------------
算術運算符 +、 -、 *、 /(或 div)、 %(或 mod)
關係運算符 ==(或 eq)、 !=(或 ne)、 <(或 lt)
>(或 gt)、 <=(或 le)、 >=(或 ge)
邏輯運算符 &&(或 and)、 ||(或 or)、 !(或 not)
驗證運算符 empty
其中,empty 判斷一個變數是否為
null
或是否包含有效數據:
if
(name==
null
||name.equlas(
""
)) 等價於 ${empty name} ->
true
例子:
表達式 值
-------------------------------------------------------------
${3+5.1} 8.1
${
"Hello"
+
",Tarena!"
} 報錯!
// 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
//三目表達式
<% String name=
""
;
request.setAttribute(
"name"
,name);
//如果沒有 setAttribute ,則必定是空
%>
${empty name}
true
//對範圍對象內的變數或對象進行判空
4.變數和JavaBean屬性數據輸出
表達式語言輸出變數,是到範圍對象(pageContext,request,session,application)中查找相應屬性。
而非直接在頁面中查找實例或局部變數。
表達式語言查找變數的順序是:
pageContext -> request -> session->application, 所有範圍都未找到時,賦值
null
5.存取器
[] ->輸出對象屬性值,輸出數組或集合中對應索引值
. ->輸出對象屬性值
例子:
<% SuperGirl girl =
new
SuperGirl(); girl.setName(
"Alice"
);
session.setAttribute(
"girl"
,girl); %>
//一定要有這句,設置成範圍對象
${girl[
"name"
]}
${girl[
"name"
]}
//拿屬性時,單引跟雙引等價
${girl.name}
//這種方法同樣可以
<% List aList =
new
ArrayList();
aList.add(
"China"
); aList.add(girl); aList.add(168.18);
session.setAttribute(
"aList"
, aList); %>
${aList[0]}
//使用下標來取值 "China"
${aList[1]}
//取得對象的引用地址 還可以嵌套:${aList[1]["name"]}
${aList[3]}
//下標越界,不會報錯;只是取不出值
<% 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"
]}
//這兩個等效
${map.aList[0]} ${map[
"aList"
][0]}
//這兩個也等效
${map.aList[1][name]}
//嵌套取值
6.隱含對象
el提供了自己的一套隱含對象,方便在頁面內對各種常用數據信息的訪問.
EL隱藏對象 JSP隱藏對象
--------------------------------------------------------------------------------
pageScope pageContext
requestScope request
sessionScope session
applicationScope appication
param: request.getParameter()
paramValues: 在提交表單里,有多個輸入域同名getParameterValues
header: request.getHeader() 按照key-value的形式取出;value:是一個String類型的值
headerValues 按照key-value的方式取出,但是headerValues裡面的value是一個String類型的數組
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"
> <%
//把設置輸出出來 %>
<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)範圍對象
<% 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>
//提交後,獲取輸入內容
${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.可以自由設置是否支持表達式語言
<%@page isELIgnored=
"false"
%> :
default
:
false
可以使用EL,改成
true
之後,寫EL就會報錯
配置web.xml也可達到同樣的效果(同時存在,那種起作用?)
(禁用腳本和EL) 默認都是
false
...
<jsp-config>
<jsp-property-
group
>
<url-pattern>*.jsp</url-pattern>
<el-ignored>
true
</el-ignored>
//設置成所有jsp文件都禁用EL
<scripting-invalid>
true
</scripting-invalid>
//設置成禁用腳本
</jsp-property-
group
>
</jsp-config>
....
頁面的page指令設置isELIgnored屬性的優先順序比web.xml中<el-ignored>設置的高(當然是範圍小的生效)
***************************************************************************************
二、JSTL(JSP Standard Tag Library )
減少java代碼,簡化頁面編寫;功能封裝,提高可重用性
1.如何使用JSTL
1)對於Java EE之前(即J2EE規範1.4及之前版本)
a、複製jstl的jar包(jstl.jar,standard.jar)到/WEB-INF/lib
b、在使用jstl功能的jsp頁面中增加指令
<%@taglib prefix=
"c"
uri=
"http://java.sun.com/jsp/jstl/core"
%> //核心標籤庫
<%@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"
%> //資料庫標籤庫
<%@taglib prefix=
"fn"
uri=
"http://java.sun.com/jsp/jstl/functions"
%>
//prefix 表前綴(可改,但通常按這寫的用); uri 指向標籤庫的入口
2)Java EE規範把jstl作為規範的一部分
所以現在的jstl-1.2已經包含了原來的jstl.jar , standard.jar
2.core:核心標籤庫
一般用途
在JSTL中,一般用途的標籤主要是指具有輸出,設置變數,和錯誤處理等功能的標籤,他們在jsp中使用比較頻繁,它們有:
-----------
|a、<c:
set
>|
-----------
語法:<c:
set
value=
"value"
var
=
"varName"
[scope=
"{page|request|session|application}"
]/ >
<c:
set
value=
"value"
target=
"target"
property=
"propertyName"
/ >
這個標籤用於在某個範圍(page,request,session,application)裡面設置特定的值
(默認為page),或者設置某個已經存在的javabean的屬性。
例子:
<c:
set
var
=
"counter"
value=
"200"
/>
${counter}
//輸出
<c:
set
var
=
"tarena"
>Tarena It Traning Ltd.</c:
set
>
${tarena}
可以指定範圍,默認是page
<c:
set
value=
"20"
var
=
"maxIdelTime"
scope=
"session"
/>
${maxIdelTime}
設置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}"
]/ >
它的作用是刪除某個變數或者屬性。
例子:
<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解析器解釋(默認),
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=
"以下輸出前面設置的屬性<br>"
escapeXml=
"false"
/>
<td colspan=2>
<c:
out
value=
"${sessionZhang3}"
/><br>
<c:
out
value=
"${table}"
escapeXml=
"false"
/><br>
//輸出表格;escapeXml="true"時只顯示字元串
<c:
out
value=
"${requestZhang3}"
/><br>
<c:
out
value=
"${nodefined}"
default
=
"沒有nodefined這個變數"
/>
</td>
-------------
|d、<c:
catch
>|
-------------
它的作用是捕捉由嵌套在它裡面的標籤所拋出來的異常。類似於<%
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) { } %>
//等價
<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內容
</c:
if
>
// 註:沒有 else
例子:
<c:
set
var
=
"age"
value=
"16"
/>
<c:
if
test=
"${age<18}"
>
<h1 align=center>您尚未成年,不能進入遊戲中心!</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},再接再勵哦!
</c:when>
<c:otherwise>
您今年納稅超過了3000元,多謝您為國家的繁榮富強作出了貢獻!
</c:otherwise>
</c:choose>
---------------
|c、<c:forEach>| 循環
---------------
語法: <c:forEach [
var
=
"varName"
] items=
"collection"
[varStatus=
"varStatusName"
]
[begin=
"begin"
] [end=
"end"
] [step=
"step"
]>
Body 內容
</c:forEach>
items:需要迭代的集合;
var
:迭代時取集合里的值;
例子:
<% 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
循環)
<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> |
---------------
相當於<jsp:include>
<c:import url=
"footer.jsp"
charEncoding=
"GBK"
>
<c:param name=
"name"
value=
"Java"
/>
</c:import>
-----------
|b、<c:url>|
-----------
用於構造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>
等價於
<a href=
"<c:url value="next.jsp"/>"
>next</a>
//在 Html 里可嵌套 JSTL
----------------
|c、<c:redirect>|
----------------
//等價於 <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>
<!-- 設置數據源 -->
<%@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>
作用:設置sql語句中
"?"
表示的佔位符號的值。
<sql:update dataSource=
"${ds}"
sql=
"UPDATE users SET username=? WHERE userid=?"
var
=
"i"
>
<sql:param value=
"Rod Johnson"
/>
//設第一個問號
<sql:param value=
"100"
/>
//設第二個問號
</sql:update>
參數等價於
//pstmt.setString(1,"Rod Johnson");
//pstmt.setInt(2,100);
推薦閱讀:
※約瑟夫·卡什|經典人像
※【經典名言薈萃】734 【木子】評論彙編(四)301
※【經典圖文】婚姻如同八種碗
※佛陀沒有經典,經典都在人心
※就算又雙叒被翻拍,也無法超越那些經典版本的《倚天屠龍記》!