0. 引言
- 學習Jsp的目的是為了解技術從前后端強耦合到前后端分離的過程,增加自己的技術積淀。了解并且體會這個過程胃榕,非常有利于后臺知識的學習和后臺相關技術的開發(fā)。
1. 安裝Tomacat
官網下載Tomcat 7.0僚楞,下載到本地勤晚,然后解壓即可。
-
配置環(huán)境變量:
我的電腦-屬性-高級-環(huán)境變量-高級環(huán)境變量-新建-變量名:CATALINA_HOME-變量值:Tomcat路徑(bin的上一個目錄級)
驗證:輸入ip+端口號泉褐,出現Tomcat的頁面,表示配置成功
2. Tomcat閃退
- 配置JAVA環(huán)境變量即可
3. Tomcat目錄結構
4. 編寫第一個java web程序
- Tomcat-webapps下創(chuàng)建index.jsp文件
<HTML>
<head>
<title>我的第一個jsp頁面</title>
</head>
<body>
<h1>歡迎大家訪問我的個人主頁</h1>
</body>
</HTML>
- Tomcat-webapps下創(chuàng)建WEB-INF文件夾
- WEB-INF文件夾下面創(chuàng)建名為classes和lib的文件夾和web.xml文件鸟蜡,web.xml內容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
</web-app>
- 訪問http://172.25.164.79:8080/myhome/index.jsp即可
- 如果遇到亂碼:修改瀏覽器的編碼為utf-8(Google安裝Charset插件便于修改編碼方式)
- 總結步驟如下:
1. 在webapps下創(chuàng)建項目目錄
2. 編寫index.jsp
3. 創(chuàng)建WEB-INF目錄
4. 測試運行
5. WEB-INF目錄結構詳解
- WEB-INF是Java的Web應用的安全目錄膜赃。所謂安全就是客戶端無法訪問,只有服務端才可以訪問揉忘。
1. 在WEB-INF里面創(chuàng)建test.html文件
2. 訪問http://172.25.164.79:8080/myhome/WEB-INF/test.html
HTTP Status 404 -
type Status report
message
description The requested resource is not available.
Apache Tomcat/7.0.85
- web.xml :項目部署文件跳座,項目的配置信息
1. 訪問:http://172.25.164.79:8080/myhome/ 會默認訪問項目myhome文件夾下面的index.jsp
2. 修改index.jsp名字為abc.jsp 訪問:http://172.25.164.79:8080/myhome/
HTTP Status 404 - /myhome/
type Status report
message /myhome/
description The requested resource is not available.
Apache Tomcat/7.0.85
3. 在web.xml中配置歡迎頁面后,即可訪問abc.jsp:
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<welcome-file-list>
<welcome-file>/abc.jsp</welcome-file>
</welcome-file-list>
</web-app>
- class文件夾泣矛,用以放置.class文件
- lib文件夾疲眷,用以存放需要的jar包
6. IDEA 配置服務器并關聯(lián)項目(創(chuàng)建了第一個jsp項目)
7. JSP簡介
- JSP全名是Java Server Pages
- 其根本是一個簡化的Servlet設計
- 實現了在Java當中使用HTML標簽
- Jsp是一種動態(tài)網頁技術標準,也是JAVAEE的標準
- JSP與Servlet一樣您朽,是在服務器端執(zhí)行的狂丝。
8. JSP特點
- Java平臺,安全性高哗总,適合開發(fā)大型的几颜,企業(yè)級的Web應用程序。
9. JSP頁面元素構成
- 靜態(tài)內容
- 指令
- 表達式
- 小腳本
- 聲明
- 注釋
10. 指令分類
-
page指令:
通常位于jsp頁面的頂端讯屈,同一個頁面可以有多個page指令蛋哭。
-
include指令:
將一個外部文件嵌入到當前JSP文件中,同時解析這個頁面中的JSP語句涮母。
-
taglib指令:
使用標簽庫定義新的自定義標簽谆趾,在JSP頁面中啟用定制行為。
11. page指令:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
1. language:制定JSP頁面使用的腳本語言叛本。默認值:java
2. import:通過該屬性來引用腳本語言中使用到的類文件沪蓬。默認值:無
3. contentType:用來指定JSP頁面所采用的編碼方式。默認值:text/html炮赦,ISO-8859-1
12. JSP注釋
- JSP注釋:
<%--這是title標簽--%> //客戶端不可見的
- HTML注釋:
<!--html注釋--> //客戶端可見
- JSP腳本注釋:
//單行注釋
/*
多行注釋
*/
13. JSP腳本
在JSP頁面中執(zhí)行的java代碼
<%
out.println("我只不過想做一個好人");
%>
這句代碼在idea里面不會自動提示生成怜跑,而eclispe會。
14. JSP聲明
在JSP頁面中定義變量和方法
<%!
String s = "張三豐"; //聲明了一個字符串變量
int add(int x, int y) { //聲明了一個返回整形的函數,實現兩個整數的求和
return x + y;
}
%>
15. JSP表達式
在JSP表達式中可以用到聲明中聲明的變量和函數
你好<%=s %>
<br>
5+6 = <%=add(5, 6)%>
16. JSP的生命周期
17. 用腳本打印九九乘法表
- 表達式
<%! String printForm99() {
String s = "";
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
s += i + "*" + j + "=" + i * j + " ";
}
s += "<br>";
}
return s;
}
%>
<%=printForm99() %>
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
18. JSP的內置對象簡介
- JSP內置對象是Web容器創(chuàng)建的一組對象性芬,不適用new關鍵字就可以使用的內置對象
19.JSP九大內置對象
- out對象
比如out對象:
<%
int[] value = {1, 2, 3};
for (int i : value) {
out.print(i);
}
%>
- request對象
- response對象
- session對象
- application對象
- Page峡眶、pageContext、exception植锉、application對象
20. Web程序的請求響應模式
- 用戶發(fā)送請求(request)
- 服務器給用戶響應(response)
登錄:
輸入賬號和密碼辫樱,登錄:相當于請求
服務器接收賬號和密碼后判斷是否合法,跳轉到響應頁面:相當于reponse
21. 什么是緩沖區(qū)
- 緩沖區(qū):Butter俊庇,所謂緩沖區(qū)就是內存的一塊區(qū)域狮暑,用來保存臨時數據。
一鍋米飯一粒一粒吃——米飯一碗一碗吃——這個碗就是緩沖區(qū)
22. out對象
- out對象是JspWriter類的實例辉饱,是向客戶端輸出內容常用的對象搬男。
1. void println 向客戶端打印字符串
2. void clear 清除換成從去的內容,如果在flust之后調用會拋出異常
3. void clearBuffer();清除緩沖區(qū)的內容彭沼,如果在flush之后調用不會拋出異常
4. void flush() 將緩沖區(qū)內容輸出到客戶端
5. int getBufferSize() 返回緩沖區(qū)以字節(jié)數的大小缔逛,如不設緩沖區(qū)則為0
6. int getRemaining()返回緩沖區(qū)還剩余多少可用
7. boolean isAutoFulsh() 返回緩沖區(qū)滿時,時自動清空還是拋出異常
8. void close() 關閉輸出流
<%
int[] value = {1, 2, 3};
for (int i : value) {
out.print(i);
}
%>
緩沖區(qū)大小:<%=out.getBufferSize()%>byte<br>
緩沖區(qū)剩余大小:<%=out.getRemaining()%>byte<br>
是否自動清空緩沖區(qū):<%=out.isAutoFlush()%><br>
緩沖區(qū)大小:8192byte
緩沖區(qū)剩余大小:8101byte
是否自動清空緩沖區(qū):true
<%
out.println("<h2>靜夜思</h2>");
out.println("窗前明月光<br>");
out.println("疑是地上霜<br>");
out.println("舉頭望明月<br>");
out.println("低頭思故鄉(xiāng)<br>");
%>
緩沖區(qū)大小:<%=out.getBufferSize()%>byte<br>
緩沖區(qū)剩余大小:<%=out.getRemaining()%>byte<br>
是否自動清空緩沖區(qū):<%=out.isAutoFlush()%><br>
靜夜思
窗前明月光
疑是地上霜
舉頭望明月
低頭思故鄉(xiāng)
緩沖區(qū)大小:8192byte
緩沖區(qū)剩余大小:8046byte
是否自動清空緩沖區(qū):true
<%
out.println("<h2>靜夜思</h2>");
out.println("窗前明月光<br>");
out.println("疑是地上霜<br>");
out.flush();
out.println("舉頭望明月<br>");
out.println("低頭思故鄉(xiāng)<br>");
%>
緩沖區(qū)大小:<%=out.getBufferSize()%>byte<br>
緩沖區(qū)剩余大小:<%=out.getRemaining()%>byte<br>
是否自動清空緩沖區(qū):<%=out.isAutoFlush()%><br>
靜夜思
窗前明月光
疑是地上霜
舉頭望明月
低頭思故鄉(xiāng)
緩沖區(qū)大小:8192byte
緩沖區(qū)剩余大小:8142byte
是否自動清空緩沖區(qū):true
說明:因為執(zhí)行了flush姓惑,所以緩沖區(qū)變大了
<%
out.println("<h2>靜夜思</h2>");
out.println("窗前明月光<br>");
out.println("疑是地上霜<br>");
out.flush();
out.clear();
out.println("舉頭望明月<br>");
out.println("低頭思故鄉(xiāng)<br>");
%>
緩沖區(qū)大小:<%=out.getBufferSize()%>byte<br>
緩沖區(qū)剩余大小:<%=out.getRemaining()%>byte<br>
是否自動清空緩沖區(qū):<%=out.isAutoFlush()%><br>
靜夜思
窗前明月光
疑是地上霜
說明:out.clear()不能在out.flush()之后調用否則會拋出異常褐奴,后面的代碼不會執(zhí)行,但是out.clearBuffer()不會拋出異常于毙。
23. 表單提交方式get和post的區(qū)別
24. request對象(上)
- 客戶端的請求信息被封裝在request對象中敦冬,通過它我們可以獲取用戶輸入的信息。
- request對象是HttpServletRequest類的實例唯沮。
- request對象具有請求域脖旱,即完成客戶端的請求之前,該對象一直有效烂翰。
1. String getParameter(String name):返回name指定參數的參數值(返回單個值)
2. String[] getParameterValues(String name):返回包含參數name的所有值的數組(返回集合)
3. void setAttribute(String夯缺,Object):存儲此請求中的屬性。
4. object getAttribute(String name):返回指定屬性的屬性值甘耿。
5. String getContentType():得到請求體的MIME類型
6. String getProtocol():返回請求用的協(xié)議類型和版本號
7. String getSeverName():返回接受請求的服務器主機名
- 示例:通過表單傳遞參數:
index.jsp文件:
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: fukq
Date: 2018/3/7
Time: 14:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<HTML>
<head>
<title>我的個人主頁</title>
</head>
<body>
<h1>用戶注冊</h1>
<form name="reqForm" action="request.jsp" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td>愛好:</td>
<td>
<input type="checkbox" name="favorite" value="read">讀書
<input type="checkbox" name="favorite" value="music">音樂
<input type="checkbox" name="favorite" value="movie">電影
<input type="checkbox" name="favorite" value="internet">上網
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</body>
</HTML>
request.jsp文件:
<%@ page import="java.util.List" %><%--
Created by IntelliJ IDEA.
User: fukq
Date: 2018/3/7
Time: 14:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<HTML>
<head>
<title>我的個人主頁</title>
</head>
<body>
<h1>request內置對象</h1>
用戶名:
<%=request.getParameter("username")%><br>
愛好:
<%
String[] favorites = request.getParameterValues("favorite");
if (favorites != null) {
for (int i = 0; i < favorites.length; i++) {
out.println(favorites[i] + " ");
}
}
%>
</body>
</HTML>
request內置對象
用戶名: ?????ˉ??o
愛好: read music movie internet
獲取表單數據出現中文亂碼的解決辦法是在體交表單的時候:
<%
request.setCharacterEncoding("utf-8");
%>
request內置對象
用戶名: 付凱強
愛好: read music
- 通過URL傳遞參數:
<a href="request.jsp?username= lisi">測試URL傳遞參數</a>
用戶名: lisi
<a href="request.jsp?username= 中文">測試URL傳遞參數</a>
用戶名: ??-???
但是通過request設置參數無法解決URL傳遞中文出現的亂碼問題
但是通過配置Tomcat服務器里面conf-server.xml文件可以解決
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
25. request對象(下)
- setAttribute和getAttribute
<%
request.setCharacterEncoding("utf-8");
request.setAttribute("password","123456");
%>
密碼:<%=request.getAttribute("password")%>
密碼:<%=request.getAttribute("password")%> <br>
請求的MIME類型:<%=request.getContentType()%><br>
協(xié)議類型及版本號:<%=request.getProtocol()%><br>
服務器主機名:<%=request.getServerName()%><br>
服務器端口號:<%=request.getServerPort()%><br>
請求文件的長度:<%=request.getContentLength()%><br>
請求文件的ip地址:<%=request.getRemoteAddr()%><br>
請求的真實路徑:<%=request.getRealPath("request.jsp")%><br>
請求的上下文路徑:<%=request.getContextPath()%><br>
request內置對象
用戶名: 您好好
愛好: music movie internet 密碼:123456
請求的MIME類型:application/x-www-form-urlencoded
協(xié)議類型及版本號:HTTP/1.1
服務器主機名:localhost
服務器端口號:8888
請求文件的長度:84
請求文件的ip地址:127.0.0.1
請求的真實路徑:G:\javaSpace\webDemo\out\artifacts\firstweb_war_exploded\request.jsp
請求的上下文路徑:/fkq
26. response對象簡介
- response對象包含了響應客戶請求的有關信息踊兜,但是JSP中很少直接用到它。
- 它是HttpServletResponse類的實例佳恬。
- response對象具有頁面作用域捏境,即訪問一個頁面時,該頁面內的response對象只能對這次訪問有效毁葱,其他頁面的response對象對當前頁面無效垫言。
27. response對象常用方法如下:
- String getCharacterEncoding()返回響應用的是何種字符編碼
- void setContentType(String Type)設置響應的MIME類型
- PrintWriter getWriter() 返回可以向客戶端輸出字符的一個對象(也稱為輸出流對象)(注意比較:PrintWriter與內置out對象的區(qū)別)
- sendRedirect(java.lang.String.location)重新定向客戶端的請求
<%@ page import="java.util.List" %>
<%@ page import="java.io.PrintWriter" %><%--
Created by IntelliJ IDEA.
User: fukq
Date: 2018/3/7
Time: 14:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
response.setContentType("text/html;charset=UTF-8"); //設置響應的MIMI類型
out.println("<h1>reponse對象</h1>");
out.println("<hr>");
PrintWriter outer = response.getWriter();
outer.println("大家好,我是response對象生成的輸出流outer對象");
%>
PrintWriter對象總是提前于內置的out對象打印
<%@ page import="java.util.List" %>
<%@ page import="java.io.PrintWriter" %><%--
Created by IntelliJ IDEA.
User: fukq
Date: 2018/3/7
Time: 14:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
response.setContentType("text/html;charset=UTF-8"); //設置響應的MIMI類型
out.println("<h1>reponse對象</h1>");
out.println("<hr>");
out.flush();
PrintWriter outer = response.getWriter();
outer.println("大家好倾剿,我是response對象生成的輸出流outer對象");
%>
out.flush();刷新緩沖區(qū)筷频,刷新的時候會把數據刷新到瀏覽器上蚌成。
<%
response.setContentType("text/html;charset=UTF-8"); //設置響應的MIMI類型
out.println("<h1>reponse對象</h1>");
out.println("<hr>");
PrintWriter outer = response.getWriter(); //獲得輸出流對象
outer.println("大家好,我是response對象生成的輸出流outer對象");
response.sendRedirect("index.jsp"); //請求重定向
%>
28. 請求重定向與請求轉發(fā)
- 請求重定向:客戶端行為凛捏,response.sendRedirect(),從本質上講等同于兩次請求担忧,前一次的請求對象不會保存,地址欄的URL地址會改變坯癣。
- 請求轉發(fā):服務器行為瓶盛,request.getRequestDispatcher().forward(req,resp);是一次請求,轉發(fā)后請求對象會保存示罗,地址藍的URL地址不會改變惩猫。
29. session簡介
- session表示客戶端與服務器的一次會話
- Web中的session指的是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉這個網頁所經過的這段時間蚜点,也就是用戶瀏覽這個網站所花費的時間
- 從上述定義中可以看到轧房,session實際上時一個特定的時間概念
- session的中文意思就是一段時間
- 在服務器的內存中保存著不同用戶的session。
30. session詳細介紹
- session對象是一個JSP內置對象绍绘。
- session對象在第一個JSP頁面被裝載時自動創(chuàng)建锯厢,完成會話期管理。
- 從一個客戶打開瀏覽器并連接到服務器開始脯倒,到客戶關閉瀏覽器離開這個服務器結束,被稱為一個會話捺氢。
- 當一個客戶打開瀏覽器并連接到服務器開始藻丢,到客戶關閉瀏覽器離開這個服務器結束被成為一個會話。
- 當一個客戶訪問一個服務器時摄乒,可能會在服務器的幾個頁面之間切換悠反,服務器應當通過某種辦法知道這是一個客戶,就需要session對象馍佑。
- session對象是HttpSession類的實例斋否。
31. session常用方法
- long getCreationTime():返回session創(chuàng)建時間
Session創(chuàng)建時間:<%=session.getCreationTime()%><br>
Session創(chuàng)建時間:1520565423914
<%!
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
%>
Session創(chuàng)建時間:<%=simpleDateFormat.format(new Date(session.getCreationTime()))%><br>
Session創(chuàng)建時間:2018年03月09日 11:17:03
- public String getId():返回session創(chuàng)建時JSP引擎為它設的唯一ID號
- public Object setAttribute(String name,Object value):使用指定名稱將對象綁定到此會話
session.setAttribute("username","admin");
- public Object getAttribute(String name):返回此會話中的指定名稱綁定在一起的對象拭荤,如果沒有對象綁定在該名稱下茵臭,則返回null
從Session中獲取用戶名:<%=session.getAttribute("username")%>
從Session中獲取用戶名:admin
session_page1:
<%!
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
%>
<%
session.setAttribute("username", "admin");
%>
Session創(chuàng)建時間:<%=simpleDateFormat.format(new Date(session.getCreationTime()))%><br>
Session的ID編號:<%=session.getId()%><br>
從Session中獲取用戶名:<%=session.getAttribute("username")%>
<a href="session_page2.jsp" target="_blank">跳轉到Session_page2.jsp</a>
session_page2:
<body>
<h1>session內置對象</h1>
<hr>
Session的ID編號:<%=session.getId()%><br>
從Session中獲取用戶名:<%=session.getAttribute("username")%>
</body>
session_page1:
Session的ID編號:866631F646E26184FB1F4FCC3AAB4AE6
session_page2:
Session的ID編號:866631F646E26184FB1F4FCC3AAB4AE6
從Session中獲取用戶名:admin
page1跳轉到page2,id編號一致舅世;只有關閉相關的兩個頁面旦委,才表示會話結束。
- String[] getValueNames():返回一個包含此SESSION中所有可用屬性的數組
<%
session.setAttribute("username", "admin");
session.setAttribute("password","123456");
session.setAttribute("age","5");
%>
Session中保存的屬性有:
<%
String[] names = session.getValueNames();
for (int i = 0; i < names.length; i++) {
out.println(names[i] + " ");
}
%>
Session的ID編號:9E503181AE514CD3C56EDD9289DCE286
從Session中獲取用戶名:admin Session中保存的屬性有: password age username
- int setMaxInactiveInterval():設置兩次請求間隔多長時間此SESSION被取消(單位秒)
session.setMaxInactiveInterval(10);
32. session的生命周期
訪問階段: 當客戶但第一次訪問某個jsp或者Servlet的時候雏亚,服務器會為當前會話創(chuàng)建一個SessionId缨硝,每次客戶端向服務端發(fā)送請求時,都會將此SessionId攜帶過去罢低,服務器端會對此SessionId及進行校驗查辩。
-
會話階段:
-
以下情況屬于同一個會話:
- 某次會話當中通過超鏈接打開的新頁面屬于同一次會話。
- 只要當前會話頁面沒有全部關閉,重新打開新的瀏覽器窗口訪問同一項目資源時屬于同一次會話宜岛。
- 除非本次會話的所有頁面都關閉后再重新訪問某個Jsp或者Servlet將會創(chuàng)建新的會話长踊。
注意事項: 注意原有會話還存在,只是這個舊的SessionId仍然存在與服務端谬返,只不過再也沒有客戶端會攜帶它然后交予服務端校驗之斯。
-
銷毀階段:
Session的銷毀只有三種方式:
1. 調用了session.invalidate()方法
2. Session過期(超時)
3. 服務器重新啟動
33. Session對象的超時
- Tomcat默認session超時時間為30分鐘。
- 設置session超時有兩種方式:
- session.setMaxInactiveInterval(時間)://單位是秒
- 在web.xml配置
<session-config>
<session-timeout>
10
</session-timeout>
</session-config> //單位是分
34. application對象
- application對象實現了用戶間數據的共享遣铝,可存放全局變量佑刷。
- application開始于服務器的啟動,終止與服務器的關閉酿炸。
- 在用戶的前后連接或不同用戶之間的連接中瘫絮,可以對application對象的同一屬性進行操作。
- 在任何地方對application對象屬性的操作填硕,都將影響到其他用戶對此的訪問麦萤。
- 服務器的啟動和關閉決定了application對象的生命。
- application對象是ServletContext類的實例扁眯。
35. application對象的常用方法
- public void setAttribute(String name壮莹,Object value):使用指定名稱將對象綁定到此對話。
- public Object getAttribute(String name)返回與此會話中的指定名稱綁定在一起的對象姻檀,如果沒有對象綁定在該名稱下命满,則返回null。
- Enumeration getAttributeNames() 返回所有可用屬性名的枚舉
- String getServerInfo() 返回JSP(SERVLET)引擎名及版本號
<%
application.setAttribute("username", "fukq");
application.setAttribute("age", "123");
application.setAttribute("sex", "男");
%>
名字是:<%=application.getAttribute("username")%>
application中的屬性有:
<%
Enumeration enumeration = application.getAttributeNames();
while (enumeration.hasMoreElements()) {
out.println(enumeration.nextElement() + "  ");
}
%><br>
JSP(SERVLET)引擎名及版本號: <%=application.getServerInfo()%><br>
名字是:fukq
application中的屬性有: javax.servlet.context.tempdir org.apache.catalina.resources org.apache.tomcat.util.scan.MergedWebXml org.apache.tomcat.InstanceManager sex org.apache.catalina.jsp_classpath org.apache.jasper.compiler.ELInterpreter org.apache.jasper.compiler.TldLocationsCache org.apache.tomcat.JarScanner javax.websocket.server.ServerContainer age org.apache.jasper.runtime.JspApplicationContextImpl username
JSP(SERVLET)引擎名及版本號Apache Tomcat/7.0.85
36. page對象
page對象的常用方法與object對象的常用方法是基本一致的:
- 舉例:
當前page頁面對象的字符串描述: <%=page.toString()%>
當前page頁面對象的字符串描述: org.apache.jsp.page_jsp@7c5d9ae
toString 打印的實際是對象的hashcode值
37. pageContext對象
- pageContext對象提供了對JSP頁面內所有得對象及名字空間得訪問绣版。
- pageContext對象可以訪問到本頁所在得session胶台,也可以取本頁面所在的application的某一個屬性值。
- pageContext對象相當于頁面中所有功能的集大成者杂抽。
- pageContext對象的本類名也叫pageContext诈唬。
38. pageContext對象常用方法
- JspWriter getOut():返回當前客戶端響應被使用的JspWriter流(out)
- HttpSession getSession():返回當前頁中的HttpSession對象(session)
- Object getPage()返回當前頁的Object對象(page)
- ServletRequest getRequest()返回當前頁的ServletRequest對象(request)
- ServletResponse getResponse()返回當前頁的ServletResponse對象(response)
- void setAttribute(String name,Object attribute)設置屬性及屬性值
- Object getAttribute(String name缩麸,int scope)在指定范圍內取屬性的值
- int getAttributeScope(String name)返回某屬性的作用范圍
- void forward(String relativeUrlPath)使當前頁面重導到另一頁面
- void include(String relativeUrlPath)在當前位置包含另一文件
session.setAttribute("username", "admin");
session.setAttribute("password", "123456");
session.setAttribute("age", "5");
用戶名是:<%=pageContext.getSession().getAttribute("username")%><br>
用戶名是:admin
//包含這個頁面
pageContext.include("index.jsp");
//跳轉到其他頁面
// pageContext.forward("index.jsp");
39. Config對象
- 簡介:config對象是在一個Servlet初始化時铸磅,Jsp引擎向它傳遞信息用的,此信息包括Servlet初始化時所要用到的參數(通過屬性名和屬性值構成)以及服務器的有關信息(通過傳遞一個ServetConext對象)匙睹。
- 常用方法:
- ServletContext getServletContext 返回含有服務器相關信息的ServletContext對象
- String getInitParameter(String name)返回初始化參數的值
- Enumeration getInitParameterNames()返回Servlet初始化所需所有參數的枚舉
40. exception對象
- exception對象時一個異常對象愚屁,當一個頁面在運行過程中發(fā)生了異常,就產生這個對象痕檬。如果一個JSP頁面要應用此對象霎槐,就必須把isErrorPage設為true,否則無法編譯梦谜。它實際上時java.lang.Throwable的對象丘跌。
41. exception常用方法
- String getMessage()返回描述異常的消息
- String toString()返回關于異常的簡短描述信息
- void printStackTrace()顯示異常及其棧軌跡
- Throwable FillInStackTrace 重寫異常的執(zhí)行棧軌跡
errorPage="exception.jsp"
<% System.out.print(1 / 0);%>
isErrorPage="true"
異常的消息是: <%=exception.getMessage()%> <br>
異常的字符串描述是:<%=exception.toString()%><br>
42. 用戶登錄小栗子
- 用戶名admin袭景,密碼admin,登錄成功使用服務器內部轉發(fā)到login_success.jsp頁面闭树,并且提示登錄成功的用戶名耸棒。如果登錄失敗則請求重定向到login_failure.jsp頁面。
login.jsp頁面:
<h1>登錄小案例</h1>
<form action="dologin.jsp" method="post">
<p class="main">
<label>用戶名: </label>
<input name="username" value=""/>
<label>密碼: </label>
<input type="password" name="password" value="">
</p>
<p class="space">
<input type="submit" value="登錄"/>
</p>
</form>
dologin.jsp頁面
<%
String username = "";
String password = "";
request.setCharacterEncoding("utf-8"); //防止中文亂碼
username = request.getParameter("username");
password = request.getParameter("password");
//如果用戶和密碼都等于admin,則登錄成功
if ("admin".equals(username) && "admin".equals(password)) {
session.setAttribute("loginUser", username);
request.getRequestDispatcher("login_success.jsp").forward(request, response);
} else {
response.sendRedirect("login_failure.jsp");
}
%>
login_success頁面
<%
String loginUser = "";
if (session.getAttribute("loginUser") != null) {
loginUser = session.getAttribute("loginUser").toString();
}
%>
login_failure頁面
歡迎<%=loginUser%>登錄成功!
<div>登錄失敗,請檢查用戶名或密碼<br>
<a href="login.jsp">返回登錄</a>
</div>
43. Javabean簡介
- javabean就是符合某種特定規(guī)范的java類.
- 使用javabean可以減少代碼冗余,功能區(qū)分明確,提高了代碼的維護性.
44. Javabean設計原則
- 公有類
- 無參的公有構造方法
- 屬性私有
- 提供geter和setter方法
45. Jsp動作元素
- 動作元素為請求處理階段提供信息.
- 遵循XML元素的語法:有一個包含元素名的開始標簽,可以有屬性\可選的內容\與開始標簽匹配的結束標簽.
46. Jsp動作分類
- 第一類:與存取JavaBean有關的:
<jsp:useBean><jsp:setProperty><jsp:getProperty>
- 第二類:JSP1.2就開始有的基本元素,包括6個動作元素
<jsp:include><jsp:forward><jsp:param><jsp:plugin><jsp:params><jsp:fallback>
- 第三類:JSP2.0新增加的元素,主要與JSP Document有關,包括6個元素
<jsp:root><jsp:declaration><jsp:scriptlet><jsp:expression><jsp:text><jsp:output>
- 第四類:JSP2.0新增的動作元素,主要是用來動態(tài)生成XML元素標簽的值,包括3個動作
<jsp:attribute><jsp:body><jsp:element>
- 第五類:JSP2.0新增的動作元素,主要是用在Tag FIle中,有2個元素
<jsp:invoke><jsp:dobody>
47. 普通方式創(chuàng)建JavaBean
<%@ page import="com.test.User" %>
<%
User user = new User();
user.setmUserName("admin"); //設置用戶名
user.setmPassword("123456");//設置密碼
%>
賬戶名是: <%=user.getmUserName()%>
密碼是:<%=user.getmPassword()%>
48. Jsp頁面中使用jsp動作標簽使用javabean
- jsp:useBeans : 在jsp頁面中實例化或者在指定范圍內使用javabean
<jsp:userBean id="標識符" class = "java類名" scope = "作用范圍"/>
<jsp:useBean id="myUser" class="com.test.User" scope="page"></jsp:useBean>
<h1>使用javabean動作創(chuàng)建javabean實例</h1>
賬戶名是: <%=myUser.getmUserName()%>
密碼是:<%=myUser.getmPassword()%>
賬戶名是: null 密碼是:null
- jsp:setProperty:給已經實例化的javabean對象的屬性賦值,一共有四種形式
<jsp:setProperty name ="javaBean實例名" property = "*"/>(跟表單關聯(lián))
<jsp:setProperty name = "javabean實例名" property = "javabean屬性名"/>(跟表單關聯(lián))
<jsp:setProperty name = "javabean實例名" property = "javabean屬性名" value = "beanvalue"/>(手工設置)
<jsp:setProperty name = "javabean實例名" property = "propertyName" param = "request對象中的參數名"/>(跟request參數關聯(lián))
第一種:備注:根據表單自動匹配所有的屬性
<html>
<head>
<title></title>
</head>
<body>
<h1>系統(tǒng)登錄</h1>
<hr>
<form name="loginForm" action="dologin.jsp" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name="username" value=""/></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password" value=""></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登錄"></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
<html>
<head>
<title>我的個人主頁</title>
</head>
<body>
<jsp:useBean id="myUsers" class="com.test.User" scope="page"/>
<h1>setProperty動作元素</h1>
<hr>
<jsp:setProperty name="myUsers" property="*"></jsp:setProperty>
用戶名:<%=myUsers.getUsername()%><br>
密碼:<%=myUsers.getPassword()%>
</body>
</html>
用戶名:fukaiqiang
密碼:123456
第二種:備注:根據表單匹配部分的屬性
<jsp:setProperty name="myUsers" property="username"></jsp:setProperty>
用戶名:fukaiqiang
密碼:null
第三種:備注:和表單無關,通過手工賦值給屬性
<jsp:setProperty name="myUsers" property="username" value="Lisi"></jsp:setProperty>
<jsp:setProperty name="myUsers" property="password" value="654321"></jsp:setProperty>
用戶名:Lisi
密碼:654321
第四種:通過Url傳參數給屬性賦值
<jsp:setProperty name="myUsers" property="username"></jsp:setProperty>
<jsp:setProperty name="myUsers" property="password" param="myPass"></jsp:setProperty>
用戶名:<%=myUsers.getUsername()%><br>
密碼:<%=myUsers.getPassword()%>
<form name="loginForm" action="dologin.jsp?myPass=789456123 " method="post">
用戶名:fukaiqiang
密碼:789456123
- jsp:getProperty
<!--使用傳統(tǒng)的表達式方式來獲取用戶名和密碼-->
用戶名:<%=myUsers.getUsername()%><br>
密碼:<%=myUsers.getPassword()%>
<!--使用getProperty方式來獲取用戶名和密碼-->
用戶名:<jsp:getProperty name="myUsers" property="username"></jsp:getProperty>
用戶名:<jsp:getProperty name="myUsers" property="password"></jsp:getProperty>
49. Javabean四個作用域范圍
- 使用usebeans的scope屬性可以用來指定javabean的作用范圍.
1. page:盡在當前頁面有效.
2. request:可以用過HttpRequest.getAttribute()方法取得javabean對象.
3. session:可以通過HttpSession.getAttribute()方法取得javabean對象.
4.application:可以通過applicaion.getAttribute()方法取得javabean對象.
- application:
<h1>javabean的四個作用域范圍</h1>
<hr>
<jsp:useBean id="myUsers" class="com.test.User" scope="application"/>
用戶名:
<jsp:getProperty name="myUsers" property="username"/>
<br>
密碼:
<jsp:getProperty name="myUsers" property="password"/>
<br>
<!--使用內置對象獲取用戶名和密碼-->
<hr>
用戶名:<%=((User) application.getAttribute("myUsers")).getUsername()%><br>
密碼:<%=((User) application.getAttribute("myUsers")).getPassword()%>
- session:
用戶名:<%=((User) session.getAttribute("myUsers")).getUsername()%><br>
密碼:<%=((User) session.getAttribute("myUsers")).getPassword()%>
- request:
<jsp:useBean id="myUsers" class="com.test.User" scope="request"/>
<%
request.getRequestDispatcher("testscope.jsp").forward(request,response);
%>
用戶名:<%=((User) request.getAttribute("myUsers")).getUsername()%><br>
密碼:<%=((User) request.getAttribute("myUsers")).getPassword()%>
- page:
<jsp:useBean id="myUsers" class="com.test.User" scope="page"/>
<%
String username = "";
String password = "";
if (pageContext.getAttribute("myUsers") != null) {
username = ((User) pageContext.getAttribute("myUsers")).getUsername();
password = ((User) pageContext.getAttribute("myUsers")).getPassword();
}
%>
用戶名:<%=username%>
密碼:<%=password%>
50. Model1簡介
- Model1模型出現前,整個Web應用的情況:幾乎全部由Jsp頁面組成,Jsp頁面接受處理客戶端的請求,對請求處理后直接做出響應.
- 弊端:在界面層充斥著大量的業(yè)務邏輯的代碼和數據訪問層的代碼,Web程序的可擴展性和可維護性非常差.
- Javabean的出現可以使jsp頁面中使用javabean封裝的數據或者調用javabean的業(yè)務邏輯代碼,這樣大大提升了程序的可維護性.
-
Model1模型:Jsp:頁面;JavaBean:邏輯;javabean:數據:
51. jsp+javabean完成用戶登錄功能
login:
<form name="loginForm" action="dologin.jsp" method="post">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name="username" value=""/></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password" value=""></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登錄"></td>
<td></td>
</tr>
</table>
</form>
dologin:
<jsp:useBean id="loginUser" class="com.test.User" scope="page"/>
<jsp:useBean id="userdao" class="com.test.UserDao" scope="page"/>
<jsp:setProperty name="loginUser" property="*"/>
<%
//如果用戶和密碼都等于admin,則登錄成功
if (UserDao.userLogin(loginUser)) {
session.setAttribute("loginUser", loginUser.getUsername());
request.getRequestDispatcher("login_success.jsp").forward(request, response);
} else {
response.sendRedirect("login_failure.jsp");
}
%>
<html>
<head>
<title>Title</title>
</head>
<body>
我是登錄失敗頁面
</body>
</html>
<html>
<head>
<title>Title</title>
</head>
<body>
我是成功登錄頁面
</body>
</html>
52. http協(xié)議的無狀態(tài)性
- 無狀態(tài)是指:當瀏覽器發(fā)送請求給服務器的時候,服務器響應客戶端請求.但是當同一個瀏覽器再次發(fā)送請求給服務器的時候,服務器并不知道它是剛才那個瀏覽器.簡單地說:就是服務器不會去記得你,所以就是無狀態(tài)協(xié)議.
53. Cookie概述
- 保存用戶的狀態(tài)的兩大機制
- Session
- Cookie
- Cookie是web服務器保存在客戶端的一些列文本信息.
- 典型應用一:判定注冊用戶是否已經登錄網站.
- 典型應用二:"購物車"的處理.
54. Cookie的作用
- 對特定對象的追蹤.
- 保存用戶網頁瀏覽記錄與習慣
- 簡化登錄
55. Jsp頁面中創(chuàng)建與使用Cookie
- 創(chuàng)建Cookie對象
Cookie newCookie = new Cookie(String key,Object value);
- 寫入Cookie對象
response.addCookie(new Cookie);
- 讀取Cookie對象
Cookie[] cookies = request.getCookies();
- 與Cookie有關的常用方法
1. void setMaxAge(int expiry):設置cookie的有效期,以秒為單位.
2. void setValue(String value):在cookie創(chuàng)建后,對cookie進行賦值.
3. String getName():獲取cookie的名稱.
4. String getValue():獲取cookie的值.
5. int getMaxAge():獲取cookie的有效時間,以秒為單位.
56. Cookie在登錄中的應用
- 實現記憶用戶名和密碼功能
login.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 = URLDecoder.decode(c.getValue(), "utf-8");
}
if (c.getName().equals("password")) {
password = URLDecoder.decode(c.getValue(), "utf-8");
}
}
}
%>
<form name="loginForm" action="dologin.jsp" 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"/>十天內記住我的登錄狀態(tài)</td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登錄"/><input type="reset" value="取消"/></td>
</tr>
</table>
</form>
dologin.jsp
<body>
<%
request.setCharacterEncoding("utf-8");
//首先判斷用戶是否選擇了記住登錄狀態(tài)
String[] isUseCookies = request.getParameterValues("isUseCookie");
if (isUseCookies != null && isUseCookies.length > 0) {
//把用戶名和密碼保存在Cookie對象里面
String username = URLEncoder.encode(request.getParameter("username"), "utf-8");
//使用URLEncoder解決無法在Cookie當中保存中文字符串問題
String password = URLEncoder.encode(request.getParameter("password"), "utf-8");
Cookie usernameCookie = new Cookie("username", username);
Cookie passwordCookie = new Cookie("password", password);
usernameCookie.setMaxAge(864000);
passwordCookie.setMaxAge(864000);//設置最大生存期限為10天
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); //設置Cookie失效
response.addCookie(c); //重新保存报辱。
}
}
}
}
%>
<a href="user.jsp" target="_blank">查看用戶信息</a>
</body>
user.jsp
<body>
<h1>用戶信息</h1>
<%
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 = URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("password")) {
password = URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
%>
<br>
用戶名:<%=username %><br>
密碼:<%=password %><br>
</body>
解決Cookie中文亂碼的問題:
1. request.setCharacterEncoding("utf-8");
2. URLEncoder 編碼
3. URLDecoder 解碼
57. Session與Cookie的對比
- session
- 在服務器端保存用戶信息
- session中保存的是Object類
- 隨會話的結束而將其存儲的數據銷毀
- 保存重要的信息
- 保存對象的大小沒有限制
- cookie
- 在客戶端保存用戶信息
- cookie保存的是String類型
- cookie可以長期保存在客戶端
- 保存不重要的用戶信息
- 保存對象的大小有限制
58. include指令
<%@ include file = "URL"%>
<%@ include file = "date.jsp"%>
59. include動作
<jsp:include page = "URL" flush = "true|false"/>
page:要包含的頁面
flush:被包含的頁面是否從緩沖區(qū)讀取
60. include指令與include動作的區(qū)別
61. forward動作
<jsp:forward page="user.jsp"></jsp:forward>
相當于轉發(fā):
request.getRequestDispatcher("user.jsp").forward(request,response);
62. param動作
jsp:param :用于增加一個參數
<jsp:forward page="user.jsp">
<jsp:param name="email" value="123@163.com"></jsp:param>
</jsp:forward>
jsp:param :用于修改一個參數的參數值
<jsp:forward page="user.jsp">
<jsp:param name="password" value="88888"></jsp:param>
</jsp:forward>
63. 支持
希望閱讀本篇能夠讓你對Jsp有更全面的理解,還請多多支持,多多關注,多多點贊,多多收藏.