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);
|
和你一起追求代碼的提供給我們的快樂