JSP(Java Server Pages),其根本是一個(gè)簡化的 Servlet 設(shè)計(jì),實(shí)現(xiàn)了在 Java 當(dāng)中使用 HTML 標(biāo)簽。JSP 是一種動(dòng)態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn),也是Java EE的標(biāo)準(zhǔn)。JSP與Servlet一樣,是在服務(wù)器端執(zhí)行的。
常見動(dòng)態(tài)網(wǎng)站開發(fā)技術(shù)對(duì)比
- JSP:Java平臺(tái),安全性高,適合開發(fā)大型的,企業(yè)級(jí)的Web應(yīng)用程序。
- Asp.net:.Net平臺(tái),簡單易學(xué)。但是安全性以及跨平臺(tái)型差。
- Php:簡單,搞笑,成本低,開發(fā)周期短,特別適合中小型企業(yè)的Web應(yīng)用開發(fā)。(LAMP:linux+Apache+MySql+Php)
JSP 基本語法
Jsp頁面元素構(gòu)成
- 指令
- 表達(dá)式
- 小腳本
- 聲明
- 注釋
- 靜態(tài)內(nèi)容
指令
- page 指令。
- include 指令。將一個(gè)外部文件嵌入到當(dāng)前jsp文件中,同時(shí)解析這個(gè)頁面中的jsp語句。
- taglib 指令。使用標(biāo)簽庫定義新的自定義標(biāo)簽,在jsp頁面中啟用定制行為。
page
page 指令。通常位于jsp頁面的頂端,同一個(gè)頁面可以有多個(gè)page指令。
語法:
<%@ page 屬性1="屬性值" 屬性2="屬性值1,屬性值2" ... 屬性n="屬性值n" %>
屬性 | 描述 | 默認(rèn)值 |
---|---|---|
language | 指定jsp頁面使用的腳本語言 | java |
import | 通過該屬性來引用腳本語言中使用到的類文件 | 無 |
contentType | 用來指定jsp頁面所采用的編碼格式 | IntelliJ IDEA中:text/html;charset=UTF-8<br />Eclipse中:text/html; charset=ISO-8859-1 |
【Eclipse 新建jsp默認(rèn)代碼如下】
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
【IntelliJ IDEA 新建jsp默認(rèn)代碼如下】
<%--
Created by IntelliJ IDEA.
User: zdy
Date: 2016/12/28 0028
Time: 11:09
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
</body>
</html>
include
include 指令。將一個(gè)外部文件嵌入到當(dāng)前jsp文件中,同時(shí)解析這個(gè)頁面中的jsp語句。
語法:
<%@ include file="url" %>
【示例】
<%@include file="date.jsp" %>
date.jsp
<body>
<%
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日");
Date date=new Date();
String s=simpleDateFormat.format(date);
out.println(s);
%>
</body>
taglib
taglib 指令。使用標(biāo)簽庫定義新的自定義標(biāo)簽,在jsp頁面中啟用定制行為。
注釋
HTML注釋,客戶端源代碼可見
<!--html注釋-->
JSP 注釋,客戶端源代碼不可見
<%--JSP注釋--%>
JSP 腳本注釋,客戶端源代碼不可見。位于<% %>中的注釋。
//單行注釋
/**/多行注釋
腳本
在jsp中執(zhí)行的java代碼。
語法:
<% java 代碼 %>
【示例】
<body>
你好,JSP!
<!--我是html注釋-->
<%--我是jsp注釋--%>
//我是注釋嗎?我不是注釋
/*我是注釋嗎?我不是注釋*/
<%
//單行注釋
/*多行注釋*/
out.println("大家好,我能顯示在頁面上!");
System.out.println("大家好,我不能顯示在頁面上,我打印在控制臺(tái)上!");
%>
</body>
聲明
在jsp頁面中定義變量或者方法。
語法:
<%! java 代碼 %> //語句以分號(hào)結(jié)束
表達(dá)式
在jsp頁面中執(zhí)行的表達(dá)式。
語法:
<%= 表達(dá)式 %> //表達(dá)式不以分號(hào)結(jié)束
【示例】
<body>
<%!
String s="zdy";//聲明一個(gè)變量
//聲明一個(gè)函數(shù)
int add(int x,int y){
return x+y;
}
%>
你好,<%=s%>,10+5=<%=add(10,5)%>
</body>
【頁面顯示】
你好,zdy,10+5=15
【實(shí)例2】
<%!
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
String s=sdf.format(new Date());
%>
今天是:<%=s%>
【頁面顯示】
今天是:2016-12-28
JSP 頁面生命周期
JSP 內(nèi)置對(duì)象
JSP內(nèi)置對(duì)象是Web容器創(chuàng)建的一組對(duì)象,不適用new關(guān)鍵字就可以使用的內(nèi)置對(duì)象。
JSP 九大內(nèi)置對(duì)象
- 常用的:out,request,response,session,application
- 不常用的:page,pageContext,exception,config
Web 程序的請(qǐng)求響應(yīng)模式
- 用戶發(fā)送請(qǐng)求(request)
- 服務(wù)器給用戶響應(yīng)(response)
緩沖區(qū)buffer,內(nèi)存的一塊區(qū)域用來保存臨時(shí)數(shù)據(jù)。
out
JspWriter類的實(shí)例,是向客戶端輸出內(nèi)容常用的對(duì)象。
- void println() 向客戶端打印字符串
- void clear() 清除緩沖區(qū)的內(nèi)容,如果在flush之后調(diào)用會(huì)拋出異常
- void clearBuffer() 清除緩沖區(qū)的內(nèi)容,如果在flush之后調(diào)用不會(huì)拋出異常
- void flush() 將緩沖區(qū)內(nèi)容輸出到客戶端
- int getBufferSize() 返回緩沖區(qū)字節(jié)數(shù)的大小,如不設(shè)緩沖區(qū)則為0
- int getRemaining() 返回緩沖區(qū)還剩余多少可用
- boolean isAutoFlush() 返回緩沖區(qū)滿時(shí),是自動(dòng)清空還是拋出異常
- void close() 關(guān)閉輸出流
【示例】
緩沖區(qū)大小:<%=out.getBufferSize()%>Byte<br />
緩沖區(qū)剩余大?。?lt;%=out.getRemaining()%>Byte<br />
是否自動(dòng)清空緩沖區(qū):<%=out.isAutoFlush()%><br />
request
客戶端的請(qǐng)求信息被封裝在 request 對(duì)象中,通過他才能了解到客戶的需求,然后做出響應(yīng)。它是 HttpServletRequset 類的實(shí)例。request 對(duì)象具有請(qǐng)求域,即完成客戶端的請(qǐng)求之前,該對(duì)象一直有效。
常用方法
- String getParameter(String name) 返回name指定參數(shù)的參數(shù)值
- String[] getParameterValues(String name) 返回包含參數(shù)name的所有值的數(shù)組
- void setAttribute(String,Object) 存儲(chǔ)此請(qǐng)求中的屬性
- object getAttribute(String name) 返回指定屬性的屬性值
- String getContentType() 得到請(qǐng)求體的MIME類型
- String getProtocol() 返回請(qǐng)求用的協(xié)議類型及版本號(hào)
- String getServerName() 返回接收請(qǐng)求的服務(wù)器主機(jī)名
- int getServerPort() 返回服務(wù)器接受此請(qǐng)求所用的端口號(hào)
- String getCharacterEncoding() 返回字符編碼方式
- void setCharacterEncoding(String) 設(shè)置請(qǐng)求的字符編碼方式
- int getContentLength() 返回請(qǐng)求體的長度(字節(jié))
- String getRemoteAddr() 返回發(fā)送此請(qǐng)求的客戶端ip地址
- String getRealPath(String path) 返回一虛擬路徑的真實(shí)路徑【已經(jīng)被棄用deprecated】
- String request.getContextPath() 返回上下文路徑
解決表單中文亂碼問題:
<%
request.setCharacterEncoding("utf-8");
%>
解決URL中文亂碼問題:
<Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8" />
【示例】
index.jsp
<body>
<form action="dologin.jsp" name="loginForm" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>愛好:</td>
<td>
<input type="checkbox" name="f" value="read">讀書
<input type="checkbox" name="f" value="music">音樂
<input type="checkbox" name="f" value="movie">電影
<input type="checkbox" name="f" value="internet">上網(wǎng)
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="login"></td>
</tr>
</table>
</form>
<a href="dologin.jsp?username=張丹陽">link</a>
</body>
dologin.jsp
<body>
登錄成功!<br />
<%
request.setCharacterEncoding("utf-8");
request.setAttribute("attr","123456");
%>
用戶名:<%=request.getParameter("username")%><br />
密碼:<%=request.getParameter("password")%><br />
attr:<%=request.getAttribute("attr")%><br />
愛好:
<%
String[] f=request.getParameterValues("f");
if (f!=null){
for (String s:f) {
out.println(s);
}
}
%><br />
MIME類型:<%=request.getContentType()%><br />
協(xié)議類型及版本號(hào):<%=request.getProtocol()%><br />
服務(wù)器主機(jī)名:<%=request.getServerName()%><br />
服務(wù)器端口號(hào):<%=request.getServerPort()%><br />
請(qǐng)求文件的長度:<%=request.getContentLength()%><br />
請(qǐng)求客戶端的IP地址:<%=request.getRemoteAddr()%><br />
請(qǐng)求的上下文路徑:<%=request.getContextPath()%>
</body>
【頁面顯示 http://localhost:8888/MyWeb/dologin.jsp】
登錄成功!
用戶名:張丹陽
密碼:8888888888
attr:123456
愛好: read music
MIME類型:application/x-www-form-urlencoded
協(xié)議類型及版本號(hào):HTTP/1.1
服務(wù)器主機(jī)名:localhost
服務(wù)器端口號(hào):8888
請(qǐng)求文件的長度:71
請(qǐng)求客戶端的IP地址:0:0:0:0:0:0:0:1
請(qǐng)求的上下文路徑:/MyWeb
response
response對(duì)象包含了響應(yīng)客戶請(qǐng)求的有關(guān)信息,但在JSP中很少直接用到它。是 HttpServletResponse 類的實(shí)例。response 對(duì)象具有頁面作用域,即訪問一個(gè)頁面時(shí),該頁面內(nèi)的 response 對(duì)象只能對(duì)這次訪問有效,其它頁面的 response 對(duì)象對(duì)當(dāng)前頁面無效。
常用方法
- String getCharacterEncoding() 返回響應(yīng)用的是何種字符編碼
- void setContentType(String type) 設(shè)置相應(yīng)的MIME類型
- PrintWriter getWriter() 返回可以向客戶端輸出字符的一個(gè)對(duì)象(跟out對(duì)象對(duì)比,此對(duì)象輸出總是先于out對(duì)象輸出)
- sendRedirect(java.lang.String location) 重新定向客戶端的請(qǐng)求
【示例】
<body>
<%
response.setContentType("text/html;charset=UTF-8");
out.println("這是out輸出");
out.flush();
PrintWriter outer=response.getWriter();
outer.println("response.getWriter()實(shí)例輸出");
%>
</body>
<%
response.sendRedirect("index.jsp");//請(qǐng)求重定向
%>
請(qǐng)求轉(zhuǎn)發(fā)與請(qǐng)求重定向
- 請(qǐng)求重定向:客戶端行為,response.sendRedirect(),從本質(zhì)上講等同于兩次請(qǐng)求,前一次的請(qǐng)求對(duì)象不會(huì)保存,地址欄的URL地址會(huì)改變。
- 請(qǐng)求轉(zhuǎn)發(fā):服務(wù)器行為, request.getRequestDispatcher().forward(req,resp) 是一次請(qǐng)求,轉(zhuǎn)發(fā)后請(qǐng)求對(duì)象會(huì)保存,地址欄的URL地址不會(huì)改變。
請(qǐng)求轉(zhuǎn)發(fā)與請(qǐng)求重定向
【示例】
//請(qǐng)求重定向
response.sendRedirect("request.jsp");
//請(qǐng)求轉(zhuǎn)發(fā)
request.getRequestDispatcher("dologin.jsp").forward(request,response);
session
- session 表示客戶端與服務(wù)器的一次會(huì)話
- Web 中的 session 指的是用戶在瀏覽某個(gè)網(wǎng)站時(shí),從進(jìn)入網(wǎng)站到瀏覽器關(guān)閉所經(jīng)過的這段時(shí)間,也就是用戶瀏覽這個(gè)網(wǎng)站所花費(fèi)的時(shí)間
- session 實(shí)際是一個(gè)特定的時(shí)間概念
- 在服務(wù)器的內(nèi)存中保存著不同用戶的 session ,與用戶一一對(duì)應(yīng)
- session 對(duì)象是一個(gè)jsp內(nèi)置對(duì)象
- session 對(duì)象在第一個(gè)jsp頁面被裝載時(shí)自動(dòng)創(chuàng)建,完成會(huì)話期管理
- 從一個(gè)客戶打開瀏覽器并連接到服務(wù)器開始,到客戶關(guān)閉瀏覽器離開這個(gè)服務(wù)器結(jié)束,被稱為一個(gè)會(huì)話
- 當(dāng)一個(gè)客戶訪問一個(gè)服務(wù)器時(shí),可能會(huì)在服務(wù)器的幾個(gè)頁面之間切換,服務(wù)期應(yīng)當(dāng)通過某種方法知道這是一個(gè)客戶,就需要session對(duì)象
- session 對(duì)象是 HttpSession 類的實(shí)例
常用方法
- long getCreationTime() 返回session創(chuàng)建時(shí)間
- public String getId() 返回session創(chuàng)建時(shí)jsp引擎為他設(shè)置的唯一ID號(hào)
- public Object setAttribute(String name,Object value) 使用指定名稱將對(duì)象綁定到此會(huì)話
- public Object getAttribute(String) 返回與此會(huì)話中的指定名稱綁定在一起的對(duì)象,如果沒有對(duì)象綁定在該名稱下,則返回null
- Enumeration getAttributeNames() 返回一個(gè)包含此session中所有可用屬性的數(shù)組
- int getMaxInactiveInterval() 返回兩次請(qǐng)求間隔多長時(shí)間此session被取消掉(單位秒)
【示例】
session.jsp
<body>
<%
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=new Date(session.getCreationTime());
session.setAttribute("username","zdy");
session.setAttribute("password","pwd");
session.setAttribute("age",20);
session.setMaxInactiveInterval(10);//10s
%>
Session創(chuàng)建時(shí)間:<%=simpleDateFormat.format(date)%><br />
Session ID:<%=session.getId()%><br />
從Session中獲取用戶名:<%=session.getAttribute("username")%><br />
Session中保存的屬性有:
<%
Enumeration<String> m=session.getAttributeNames();
Enumeration enumeration=session.getAttributeNames();
while (enumeration.hasMoreElements()){
Object e=enumeration.nextElement();
out.println("屬性名:"+ e.toString());
out.println("屬性值:"+session.getAttribute(e.toString()));
}
%>
<a href="session2.jsp" target="_blank">跳轉(zhuǎn)</a>
</body>
session2.jsp
<body>
<%
SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date=new Date(session.getCreationTime());
%>
Session創(chuàng)建時(shí)間:<%=simpleDateFormat.format(date)%><br />
Session ID:<%=session.getId()%><br />
從Session中獲取用戶名:<%=session.getAttribute("username")%><br />
</body>
session 生命周期
- 創(chuàng)建:當(dāng)客戶端第一次訪問某個(gè)jsp或者Servlet時(shí),服務(wù)器會(huì)為當(dāng)前會(huì)話創(chuàng)建一個(gè)SessionId,每次客戶端向服務(wù)端發(fā)送請(qǐng)求時(shí),都會(huì)將此SessionId攜帶過去,服務(wù)端會(huì)對(duì)此SessionId進(jìn)行校驗(yàn)。
- 活動(dòng):
- 某次會(huì)話當(dāng)中通過超鏈接打開的新頁面屬于同義詞會(huì)話
- 只要當(dāng)前會(huì)話頁面沒有全部關(guān)閉,重新打開新的瀏覽器窗口訪問同一項(xiàng)目資源時(shí)屬于同一次會(huì)話
- 除非本次會(huì)話的所有頁面都關(guān)閉后再重新訪問某個(gè)jsp或者Servlet將會(huì)創(chuàng)建新的會(huì)話
- 注意:原有會(huì)話還在,只是這個(gè)舊的SessionId依然存在于服務(wù)端,只不過再也沒有客戶端會(huì)攜帶它然后交與服務(wù)端校驗(yàn)。
- 銷毀:
- 調(diào)用了session.invalidate()方法
- session過期(超時(shí))
- 服務(wù)器重新啟動(dòng)
設(shè)置session超時(shí)時(shí)間的方式
方法1:session.setMaxInactiveInterval(10);//單位秒
方法2:web.xml中配置(單位是分鐘):
<session-config>
<session-timeout>30</session-timeout>
</session-config>
application
- application對(duì)象實(shí)現(xiàn)了用戶間數(shù)據(jù)的共享,可存放全局變量
- application開始于服務(wù)器的啟動(dòng),終止于服務(wù)器的關(guān)閉
- 在用戶的前后連接或不同用戶之間的連接中,可以對(duì)application對(duì)象的同一屬性進(jìn)行操作
- 在任何地方對(duì)application對(duì)象屬性的操作,都將影響到其他用戶對(duì)此的訪問
- 服務(wù)器的啟動(dòng)和關(guān)閉決定了application對(duì)象的生命
- application對(duì)象是ServletContext類的實(shí)例
常用方法
- public void setAttribute(String name,Object value)使用指定名稱將對(duì)象綁定到此會(huì)話
- public Object getAttribute(String names) 返回與此會(huì)話中的指定名稱綁定在一起的對(duì)象,如果沒有對(duì)象綁定在該名稱下,則返回null
- Enumeration getAttributeNames() 返回所有可用屬性名的枚舉
- String getServerInfo() 返回 JSP (Servlet) 引擎名及版本號(hào)
【示例】
<body>
<%
application.setAttribute("city","北京");
application.setAttribute("postcode","100000");
application.setAttribute("extel","010");
%>
城市:<%=application.getAttribute("city")%><br />
application屬性有:
<%
Enumeration enumeration=application.getAttributeNames();
while (enumeration.hasMoreElements()){
out.println(enumeration.nextElement().toString()+" ");
}
%><br />
JSP(SERVLET)引擎名與版本號(hào):<%=application.getServerInfo()%><br />
</body>
page
page對(duì)象指向當(dāng)前jsp頁面本身(類似類中的this指針),是java.lang.Object類的實(shí)例。
常用方法
- class getClass() 返回此Object的類
- int hashCode() 返回此Object的hash碼
- boolean equals(Object obj) 判斷此 Object 是否與指定的 Object 對(duì)象相等
- void copy(Object obj) 把此Object拷貝到指定的Object對(duì)象中
- Object clone() 克隆此 Object 對(duì)象
- String toString() 把此 Object 對(duì)象轉(zhuǎn)換成 String 類的對(duì)象
- void notify() 喚醒一個(gè)等待線程
- void notifyAll() 喚醒所有等待線程
- void wait(int timeout) 使一個(gè)線程出于等待直到timeout結(jié)束或被喚醒
- void wait() 使一個(gè)線程出于等待直到被喚醒
pageContext
- pageContext 對(duì)象提供了對(duì)jsp頁面內(nèi)所有對(duì)象及名字空間的訪問
- pageContext 對(duì)象可以訪問到本業(yè)所在的session,也可以獲取本頁面所在的application的某一屬性值
- pageContext 對(duì)象相當(dāng)于頁面中所有功能的集大成者
- pageContext 對(duì)象的本類名也叫 pageContext
常用方法
- JspWriter getOut() 返回當(dāng)前客戶端響應(yīng)被使用的 JspWriter 流(out)
- HttpSession getSession() 返回當(dāng)前頁中的 HttpSession 對(duì)象(session)
- Object getPage() 返回當(dāng)前頁的 Object 對(duì)象(page)
- ServletRequest getRequest() 返回當(dāng)前頁的 ServletRequest 對(duì)象(request)
- ServletResponse getResponse() 返回當(dāng)前頁的 ServletResponse 對(duì)象(response)
- void setAttribute(String name,Object attribute) 設(shè)置屬性及屬性值
- Object getAttribute(String name,int scope) 在指定范圍內(nèi)獲取屬性的值
- int getAttributeScope(String name) 返回某屬性的作用范圍
- void forward(String relativeUrlPath) 使當(dāng)前頁面重導(dǎo)到另一頁面,url不變
- void include(String relativeUrlPath) 在當(dāng)前位置包含另一文件
【示例1】
用戶名是:<%=pageContext.getSession().getAttribute("username")%>
【示例2】
<%
pageContext.forward("index.jsp");
%>
【示例3】
<%
pageContext.include("index.jsp");
%>
Config
config 是在一個(gè) Servlet 初始化時(shí),jsp引擎向它傳遞信息用的,此信息包括 Servlet 初始化時(shí)所要用到的參數(shù)(通過屬性名和屬性值構(gòu)成)以及服務(wù)器的有關(guān)信息(通過傳遞一個(gè)ServletContext對(duì)象)
常用方法
- ServletContext getServletContext() 返回含有服務(wù)器相關(guān)信息的 ServletContext 對(duì)象
- String getInitParameter(String name) 返回初始化參數(shù)的值
- Enumeration getInitParameterNames() 返回 Servlet 初始化所需所有參數(shù)的枚舉
exception
exception 對(duì)象是一個(gè)異常對(duì)象,當(dāng)一個(gè)頁面中在運(yùn)行過程中發(fā)生了異常,就產(chǎn)生這個(gè)對(duì)象。如果一個(gè)JSP頁面要應(yīng)用此對(duì)象,就必須把 isErrorPage 設(shè)為true(在page指令中設(shè)置),否則無法編譯。他實(shí)際上是java.lang.Throwable 的對(duì)象。
常用方法
- String getMessage() 返回描述異常的消息
- String toString() 返回關(guān)于異常的簡短描述信息
- void printStackTrace() 顯示異常及其棧軌跡
- Throwable FillStackTrace() 重寫異常的執(zhí)行棧軌跡
【示例】
exception.jsp 在page指令中將錯(cuò)誤頁面定向到error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
<title>exception</title>
</head>
<body>
<%
System.out.println(100/0);
%>
</body>
</html>
error.jsp 在page指令中指定 isErrorPage 為true
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
異常消息是:<%=exception.getMessage()%><br />
異常的字符串描述:<%=exception.toString()%>
</body>
</html>
【運(yùn)行結(jié)果】頁面url未該變,是exception.jsp
異常消息是:/ by zero
異常的字符串描述:java.lang.ArithmeticException: / by zero
關(guān)于登錄的一個(gè)小視頻教程,來自慕課網(wǎng)
JavaBean
JavaBean 就是符合某種特定規(guī)范的java類。使用 JavaBeans 的好處是解決代碼重復(fù)編寫,減少代碼的冗余,功能區(qū)分明確,提高代碼的維護(hù)性。
設(shè)計(jì)原則
- 公有類
- 無參的公有構(gòu)造方法
- getter和setter方法
- 屬性私有
Jsp動(dòng)作
jsp動(dòng)作元素(action elements)為請(qǐng)求處理階段提供信息。動(dòng)作元素遵循xml元素的語法,有一個(gè)包含元素明德開始標(biāo)簽,可以有屬性、可選的內(nèi)容、與開始標(biāo)簽匹配的結(jié)束標(biāo)簽。
第一類:與存取JavaBean有關(guān)的
<jsp:useBean><jsp:setProperty><jsp:getProperty>
【講解&實(shí)例】見下面的javabean部分
第二類:基本的動(dòng)作元素,6個(gè) (JSP1.2+)
<jsp:include><jsp:forward><jsp:param><jsp:plugin><jsp:params><jsp:fallback>
<jsp:include>
語法:
<jsp:include page="url" flush="true|false" />
page 要包含的頁面
flush 被包含的頁面是否從緩沖區(qū)讀取
【示例】
<jsp:include page="date.jsp" flush="false"/>
include 指令 與 include 動(dòng)作比較
- | include指令 | include動(dòng)作 |
---|---|---|
語法格式 | <%@ include file="url" %> |
<jsp:include page="url"> |
發(fā)生作用的時(shí)間 | 頁面轉(zhuǎn)換期間 | 請(qǐng)求期間 |
包含的內(nèi)容 | 文件的實(shí)際內(nèi)容 | 頁面的輸出 |
轉(zhuǎn)化成的Servlet | 主頁面和包含頁面轉(zhuǎn)換成一個(gè)Servlet | 主頁面和包含頁面轉(zhuǎn)換為獨(dú)立的Servlet |
編譯時(shí)間 | 較慢,資源必須被解析 | 較快 |
執(zhí)行時(shí)間 | 較快 | 較慢,每次資源必須被解析 |
-
<jsp:include>
動(dòng)作在請(qǐng)求期間被執(zhí)行,而include指令在編譯期頁面間被執(zhí)行 - 頁面內(nèi)容經(jīng)常變化時(shí)更適合使用
<jsp:include>
動(dòng)作 - 頁面內(nèi)容不經(jīng)常變化時(shí)更適合使用include指令
-
<jsp:include>
動(dòng)作包含的是執(zhí)行結(jié)果,而include指令包含的是文件內(nèi)容
<jsp:forward>
語法:
<jsp:forward page="url" />
等同于轉(zhuǎn)發(fā):
request.getRequestDispatcher("/url").forward(request,response);
【示例】
<jsp:forward page="userinf.jsp" />
等價(jià)于
<%
request.getRequestDispatcher("userinf.jsp").forward(request,response);
%>
<jsp:param>
語法:
<jsp:param name="參數(shù)名" value="參數(shù)值">
常常與<jsp:forward>
一起使用,作為其子標(biāo)簽
【示例】
<jsp:forward page="userinf.jsp" >
<jsp:param name="email" value="email@gmail.com" />
</jsp:forward>
第三類:主要與JSP document有關(guān)的,6個(gè) (JSP2+)
<jsp:root><jsp:declaration><jsp:scriptlet><jsp:expression><jsp:text><jsp:output>
第四類:主要用來動(dòng)態(tài)生成XML元素標(biāo)簽的值,3個(gè)(JSP2+)
<jsp:attribute><jsp:body><jsp:element>
第五類:主要用在Tage File中,2個(gè)(JSP2+)
<jsp:invoke><jsp:dobody>
在jsp頁面中使用javabean
使用普通方式創(chuàng)建javabean實(shí)例
<%
User u=new User();
u.setName("zdy");
%>
用戶名:<%=u.getName()%>
使用jsp動(dòng)作標(biāo)簽使用javabean
在jsp頁面中實(shí)例化或者在指定范圍內(nèi)使用javabean。
useBean
在jsp中實(shí)例化或者在指定范圍內(nèi)使用javabean
<jsp:useBean id="標(biāo)識(shí)符" class="java類名" scope="作用域" />
setProperty
給已經(jīng)實(shí)例化的JavaBean對(duì)象的屬性賦值,一共有四種方式:
<jsp:setProperty name="JavaBean 實(shí)例名" property="*" />(跟表單關(guān)聯(lián))
<jsp:setProperty name="JavaBean 實(shí)例名" property="JavaBean屬性名" />(跟表單關(guān)聯(lián))
<jsp:setProperty name="JavaBean 實(shí)例名" property="JavaBean屬性名" value="BeanValue" />(手動(dòng)設(shè)置)
<jsp:setProperty name="JavaBean 實(shí)例名" property="JavaBean屬性名" param
="request對(duì)象中的參數(shù)名" />(跟request參數(shù)關(guān)聯(lián))
【示例】com.po下的User類
public class User {
private String username;
private String password;
public User(){
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
【頁面1:index.jsp】
<form action="javabean.jsp" name="loginForm" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="login"></td>
</tr>
</table>
</form>
【頁面2:javabean.jsp 實(shí)例1】根據(jù)表單自動(dòng)匹配所有的屬性
<jsp:useBean id="myUser" class="com.po.User" scope="page"/>
<jsp:setProperty name="myUser" property="*"/>
用戶名:<%=myUser.getUsername()%>
密碼:<%=myUser.getPassword()%>
亂碼處理,下同
<%
request.setCharacterEncoding("utf-8");
%>
【頁面顯示】
用戶名:張丹陽 密碼:123456
【頁面2:javabean.jsp 實(shí)例2】根據(jù)表單匹配部分屬性
<jsp:useBean id="myUser" class="com.po.User" scope="page"/>
<jsp:setProperty name="myUser" property="username"/>
用戶名:<%=myUser.getUsername()%>
密碼:<%=myUser.getPassword()%>
【頁面顯示】
用戶名:張丹陽 密碼:null
【頁面2:javabean.jsp 實(shí)例3】跟表單無關(guān),手動(dòng)賦值
<jsp:useBean id="myUser" class="com.po.User" scope="page"/>
<jsp:setProperty name="myUser" property="username" value="張Sir"/>
<jsp:setProperty name="myUser" property="password" value="888888"/>
用戶名:<%=myUser.getUsername()%>
密碼:<%=myUser.getPassword()%>
【頁面顯示】
用戶名:張Sir 密碼:888888
【頁面2:javabean.jsp 實(shí)例3】通過request賦值
<jsp:useBean id="myUser" class="com.po.User" scope="page"/>
<jsp:setProperty name="myUser" property="username" param="username"/>
<jsp:setProperty name="myUser" property="password" param="password"/>
用戶名:<%=myUser.getUsername()%>
密碼:<%=myUser.getPassword()%>
【頁面顯示】
用戶名:張丹陽 密碼:123456
getProperty
獲取指定JavaBean對(duì)象的屬性值
<jsp:getProperty name="JavaBean 實(shí)例名" property="屬性名" />
【示例】
<jsp:useBean id="myUser" class="com.po.User" scope="page"/>
<jsp:setProperty name="myUser" property="*" />
用戶名:<jsp:getProperty name="myUser" property="username"/>
密碼:<jsp:getProperty name="myUser" property="password"/>
四個(gè)作用域范圍
使用useBean的scope屬性指定javabean的作用范圍。
- page 僅在當(dāng)前頁面有效
- request 可以通過 HttpRequest.getAttribute() 取得javabean對(duì)象
- session 可以通過 HttpSession.getAttribute() 取得javabean對(duì)象
- application 可以通過 application.getAttribute() 取得javabean對(duì)象
【示例】
javabean.jsp
<jsp:useBean id="myUser" class="com.po.User" scope="application"/>
<jsp:setProperty name="myUser" property="*" />
testScope.jsp
<jsp:useBean id="myUser" class="com.po.User" scope="application"/>
用戶名:<%=((User)application.getAttribute("myUser")).getUsername()%>
密碼:<%=((User)application.getAttribute("myUser")).getPassword()%>
Model1
關(guān)于登錄的一個(gè)javabean小視頻教程,來自慕課網(wǎng)
JSP 狀態(tài)管理
http 協(xié)議無狀態(tài)性
保存用戶狀態(tài)的兩大機(jī)制
session、cookie
Cookie
Cookie是Web服務(wù)器保存在客戶端的一系列文本信息。
【應(yīng)用】
- 判斷注冊(cè)用戶是否已經(jīng)登錄網(wǎng)站
- 購物車
【作用】
- 對(duì)特定對(duì)象的追蹤
- 保存用戶網(wǎng)頁瀏覽記錄與習(xí)慣
- 簡化登錄
【安全風(fēng)險(xiǎn)】
容易泄漏用戶信息
創(chuàng)建與使用Cookie
創(chuàng)建Cookie對(duì)象
Cookie newCookie=new Cookie(String key,Object value);
寫入Cookie對(duì)象
response.addCookie(newCookie);
讀取Cookie對(duì)象
Cookie[] cookies=request.getCookies();
常用方法
- void setMaxAge(int expiry) 設(shè)置cookie有效期,以秒為單位
- void setValue(String value) 在cookie創(chuàng)建后,對(duì)cookie進(jìn)行賦值
- String getName() 獲取cookie的名稱
- String getValue() 獲取cookie的值
- int getMaxAge() 獲取cookie的有效時(shí)間,以秒為單位
【實(shí)例:十天內(nèi)記住登錄狀態(tài)】
index.jsp
<body>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password="";
Cookie[] cookies=request.getCookies();
if(cookies!=null&&cookies.length>0){
for (Cookie c:cookies){
if (c.getName().equals("username")){
//username=c.getValue();
username= URLDecoder.decode(c.getValue(),"utf-8");
}else if(c.getName().equals("password")){
password=c.getValue();
}
}
}
%>
<form action="login.jsp" name="loginForm" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name="username" value="<%=username%>"></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password" value="<%=password%>"></td>
</tr>
<tr>
<td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked"/>十天內(nèi)記住我的登錄狀態(tài)</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="login"></td>
</tr>
</table>
</form>
</body>
login.jsp
<body>
<%
request.setCharacterEncoding("utf-8");
//判斷用戶是否選擇記住登錄狀態(tài)
String[] isUseCookies=request.getParameterValues("isUseCookie");
if (isUseCookies!=null&&isUseCookies.length>0){
//把用戶名和密碼保存在Cookie對(duì)象里面
String username= URLEncoder.encode(request.getParameter("username"),"utf-8");
//String username=request.getParameter("username");
String password=request.getParameter("password");
Cookie usernameCookie=new Cookie("username",username);
Cookie passwordCookie=new Cookie("password",password);
usernameCookie.setMaxAge(864000);//設(shè)置最大生存期限為10天
passwordCookie.setMaxAge(864000);
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
}else{
Cookie[] cookies=request.getCookies();
if(cookies!=null&&cookies.length>0){
for (Cookie c:cookies){
if (c.getName().equals("username")||c.getName().equals("password")){
c.setMaxAge(0);//設(shè)置cookie失效
response.addCookie(c);//重新保存
}
}
}
}
%>
<a href="userinf.jsp">跳轉(zhuǎn)查看保存在cookie的信息</a>
</body>
userinf.jsp
<body>
<%
request.setCharacterEncoding("utf-8");
String username="";
String password="";
Cookie[] cookies=request.getCookies();
if(cookies!=null&&cookies.length>0){
for (Cookie c:cookies){
if (c.getName().equals("username")){
//username=c.getValue();
username= URLDecoder.decode(c.getValue(),"utf-8");
}else if(c.getName().equals("password")){
password=c.getValue();
}
}
}
%>
用戶名:<%=username%><br />
密碼:<%=password%><br />
</body>
session 與 cookie 對(duì)比
session | cookie |
---|---|
在服務(wù)器端保存用戶信息 | 在客戶端保存用戶信息 |
保存的是Object類型 | 保存的是String類型 |
隨會(huì)話的結(jié)束而將其存儲(chǔ)的數(shù)據(jù)銷毀 | 長期保存在客戶端 |
保存重要的信息 | 保存不重要的信息 |