JSP
Java server page 服務器端用來開發(fā)動態(tài)網(wǎng)頁
原因: 替換servlet中顯示邏輯的servlet
(獲得作用域中的數(shù)據(jù) + 想瀏覽器顯示網(wǎng)頁)
java+HTML (java代碼嵌套html標簽)
第一個JSP程序
//顯示當前系統(tǒng)時間
1.代碼命名: *.JSP
HTML代碼+java代碼(html標簽嵌套java代碼)
2.部署tomcat中
部署地位相當于html文件。
3.訪問JSP
和HTML訪問一樣。
注意:
① jsp開發(fā)無須在web.xml中注冊
② jsp代碼無須程序員編譯
JSP程序執(zhí)行:
HTML表簽直接輸出瀏覽器
java代碼,執(zhí)行。如果有執(zhí)行結(jié)果,顯示給瀏覽器.
JSP對比servlet
servlet
java嵌套HTML
開發(fā)后需要程序員編譯
在web.xml配置
修改代碼需要重新啟動tomcat
JSP
HTML嵌套java
直接部署,無須程序員手動編譯
無需要在web.xml配置
修改代碼無須重新啟動tomcat
JSP中java腳本元素
表達式腳本: 將結(jié)果輸出給瀏覽器
表達式? 1+1 a/b a++ a==b
<%= java表達式 %>
* 末尾不能有分號 ;
* 表達式有執(zhí)行結(jié)果;
普通腳本
流程控制代碼.
<% 普通java代碼 %>
聲明腳本
<%! 聲明變量,定義函數(shù)的代碼%>
注意:
1. java腳本不能嵌套HTML標簽
2. java腳本不能相互嵌套.
JSP原理
本質(zhì)上是Servlet程序.
JSP執(zhí)行原理:
1. 瀏覽器請求jsp程序,tomcat將jsp翻譯servlet程序(*.java)
2. 將servlet程序編譯成class文件
3. 調(diào)用servlet程序service方法提供響應服務。
* 一次訪問jsp
tomcat將jsp翻譯servlet程序(*.java)
* 一旦修改jsp
tomcat將jsp重新發(fā)翻譯servlet程序(*.java)
JSP的翻譯規(guī)則
1.HTML標簽部分,翻譯成響應輸出流方法中內(nèi)容
JSP:
<body>
<h1></h1>
</body>
翻譯Servlet:
pw.println("<body>");
pw.println("<h1></h1>");
pw.println("</body>");
2. 表達式腳本
將表達式翻譯輸出語句中的代碼。
JSP:
<%=new java.util.Date() %>
翻譯servlet:
pw.println(new java.util.Date());
3. 普通腳本
翻譯成service方法內(nèi)部的代碼
4. 聲明腳本
翻譯成Servlet的成員變量(成員方法)

jsp翻譯規(guī)則.png
JSP指令元素
頁面指令
<%@page 屬性=’值‘%>
導包:
servlet: import java.util.*;
jsp: <%@page import="java.util.*" %>
設(shè)置響應的編碼格式:
servlet:
resp.setCharacterEncoding("GBK");
resp.setContentType("text/html");
JSP:
contentType='text/html;charset=GBK'
設(shè)置jsp文件流編碼
JSP:
pageEncoding='GBK'
獲得session:
servlet: getSession();
JSP: session='true' 當前jsp中可以使用session
* session='false' 當前jsp中無法使用session
翻譯后的servlet中沒有g(shù)etSession();
默認 值 true;
錯誤頁面
isErrorPage=’false|true‘
表明當前jsp是否是一個錯誤頁面
包含隱含exception對象。
errorPage='url-pattern'
指明如果當前頁面有異常,自動跳轉(zhuǎn)errorPage指向的頁面
isELIgnored="false" 表明當前頁面是否忽略EL表達式 [了解]
標簽庫指令
<%@taglib uri='' prefix=''%>
uri: 引入外部標簽庫的地址
prefix: 標簽前綴
例如:
<%@taglib uri='/struts-tags' prefix=’s‘%>
<s:if>
包含指令
<%@include file=’被包含的jsp的url-pattern路徑‘%>
注意:
靜態(tài)包含,源代碼包含,注意java變量重復聲明的問題。

包含指令.png
動作指令
包含動作
<jsp:include page="被包含的頁面的路徑 url-pattern"></jsp:include>
* 輸出包含,動態(tài)包含。不會存在java變量沖突的 問題.

動態(tài)包含.png
JSP 9大內(nèi)置(隱含)對象
什么叫內(nèi)置對象:
可以直接在java腳本中使用。不能在聲明腳本中使用
是service方法局部變量.
exception
request HttpServletRequest
session HttpSession
application ServletContext
response HttpServletResponse
page this Object
out JspWriter 面向瀏覽器的輸出流
config ServletConfig
web.xml ------ ServletContext
filter標簽------FilterConfig
servlet標簽------ServletConfig
pageContext【重點】
1. 作用域:存儲命名屬性
pageContext.setAttribute("name",值);
pageContext.getAttribute("name");
生命周期: 僅限當前jsp頁面。
2. 管理其他所有的作用域:
pageContext
request
session
servletContext(application)
獲得作用域中的值:
pageContext.getAttribute(arg0, arg1)
參數(shù)1: 獲得的命名屬性的名字
參數(shù)2: 指定的作用域 是一個int類型的數(shù)字 作用域?qū)某A? pageContext 1 PageContext.PAGE_SCOPE
request 2 PageContext.REQUEST_SCOPE
session 3 PageContext.SESSION_SCOPE
servletContext 4 PageContext.APPLICATION_SCOPE
向作用域中存儲值
pageContext.setAttribute(name, Value,作用域?qū)某A?
3. 管理其他所有jsp內(nèi)置對象。
獲得request對象
pageContext.getRequest();
獲得session對象
pageContext.getSession();
獲得application對象(ServletContext)
pageContext.getServletContext();
案例:
動態(tài)獲得 "/項目名"
HttpServletRequest
使用request:
request.getContextPath();
使用pageContext:
((HttpServletRequest)pageContext.getRequest()).getContextPath()
栗子

jsp翻譯規(guī)則.png
導入PersonSystemServlet項目,改名字;
左邊---右鍵---import--general--Existing projects in workspace
---brows---項目目錄---勾選 copy projects into workspace
該項目名:
項目名--右鍵--refacter---rename
項目名--右鍵--properties--搜 web--修改 web context root(改為項目名一致)
1.將通訊錄展示所有聯(lián)系人的頁面
該JSP實現(xiàn)。
舊: showAllPersonAction --------->showAllPersonView
調(diào)用service獲得list 獲得request作用域list
list存入request作用域 顯示成一個table
forward
新: showAllPersonAction --------->showAllPersonView.jsp
調(diào)用service獲得list 獲得request作用域list
<%request.getAttribute%>
list存入request作用域 顯示成一個table
forward html嵌套java腳本.
2.完成顯示所有商品功能
showAllProductAction showAllProductView.jsp
調(diào)用service獲得list 獲得request作用域list
list存入request作用域 顯示成一個table
forward
ProductService:
public List<Product> getAllProducts();
ProductDAO
public List<Product> selectAllProducts();
實體Product:
添加JDBCUtil 配置文件 jar包
建表
創(chuàng)建web項目
批量刪除

批量刪除.png
EL
expression language 表達式語言
特點: 結(jié)果輸出給瀏覽器
語法:
java表達式腳本: <%= java表達式,調(diào)用方法%>
EL: ${java表達式}
訪問語法: [] .
語法介紹
1. 數(shù)學運算符 + - * / %
注意: ${10/3} 3.33333333
2. 邏輯運算符 > < >= <= != ==
&& || !
3. 三目運算符 booleab表達式?值1:值2
4. 訪問作用域中的值
訪問pageContext作用域
${pageScope.命名屬性的name}
獲得request作用域中的命名屬性
${requestScope.命名屬性的name} 不是 <%=request%>
獲得session作用域中的值
${sessionScope.命名屬性的name}
獲得servletContext作用域中的值
${applicationScope.命名屬性的name}
5. 訪問對象的屬性
${對象.屬性名}
* 原理 調(diào)用對象.get屬性();
例如:
${person.username}
person.getUsername()
獲得 /項目名
java: <%=request.getContextPath()%>
<%=((HttpServletRequest)pageContext.getRequest()).getContextPath()%>
EL: ${pageContext.request.contextPath} 【重要】
6. 訪問請求參數(shù)
${param.請求參數(shù)的name}
7. 訪問cookie
${cookie.cookie的name}
${cookie.cookie的name.value} //獲得cookie得到value
8. 訪問數(shù)組和List集合
${集合[下標]}
9. 訪問Map
${map.key} //通過map的key獲得value
總結(jié)EL中可以使用的內(nèi)置對象
pageScope requestScope sessionScope applicationScope
pageContext param cookie
*重點記住:
1. 不要再JSP寫java代碼
2.
獲得request作用域中的命名屬性
${requestScope.命名屬性的name}
獲得session作用域中的值
${sessionScope.命名屬性的name}
JSTL part I
jsp標簽庫。
作用: 條件判斷,流程控制,循環(huán)。 url生成。
使用:
1. 導入jstl的jar包
2. 導入jstl
<%@taglib uri='http://java.sun.com/jsp/jstl/core' prefix=‘c’%>
if: 單條件判斷
使用:
<c:if test='boolean表達式結(jié)果'>
條件成立執(zhí)行。
</c:if>
choose: 多條件分支
when
otherwise
使用:
<c:choose>
<c:when test='條件1'>
條件1成立
</c:when>
<c:when test='條件2'>
條件1不成立,條件2成立
</c:when>
<c:when test='條件3'>
條件1,2都不成立,條件3成立
</c:when>
<c:otherwise>
else,條件都不成立
</c:otherwise>
</c:choose>
forEach 遍歷集合
<c:forEach items='list' var='p'>
${p}
</c:forEach>
var:每次循環(huán)得到的當前元素對象。
items:被遍歷的集合。
begin:遍歷集合的起始下標
end:遍歷集合的結(jié)束下標
step:下標漸變值。步長.
varStatus:
varStatus='aa'
aa.index 下標
aa.count 被遍歷出來的元素個數(shù)(序號)
JSTL問題
1. jstl標簽屬性中,使用EL表達式,el表達式外不能寫空格.
總結(jié):
JSP開發(fā)
顯示邏輯代碼
EL+JSTL(不要出現(xiàn)java代碼)
EL: ${requestScope}
${sessionScope}
${對象.屬性名}
JSTL:
choose
forEach
JSTL part II
formatDate:
使用:
① 導入 <%@taglib uri="http://java.sun.com/jsp/jstl/fmt"
prefix="fmt" %>
② <fmt:formatDate value="" pattern=""/>
value: 要格式化的日期
pattern: 日期格式
年 yyyy
月 MM
日 dd
remove
使用:
<c:remove var='' scope='' />
刪除作用域中的值
var:要刪除的命名屬性的name
scope:刪除的作用域哪個
page pageContext作用域
request request作用域
session session作用域
application ServletContext作用域
url
使用:
<c:url value='url-pattern'></c:url>
1.將url-pattern轉(zhuǎn)換成uri
2.在cookie被禁用的時候,自動將JESSSIONID追加在url后面
禁用cookie的解決辦法:
1. 將jsp中所有的超鏈接,表單的action
<c:url value='url-pattern'></c:url>
2. 處理servlet中重定向的路徑
response.encodURL(uri);
在uri后自動追加 jsessionid的值