第一部分:jsp
1塞茅、jsp的簡介
1.1 sun公司用于動態(tài)網(wǎng)站的開發(fā)技術(shù)唠雕,servlet jsp
1.2 jsp:java server pages衷旅,運行在服務器端的頁面,jsp就是servlet,
最終jsp會被編譯成servlet
1.3 jsp在訪問時候編譯成servlet,會編譯到tomcat的work目錄里面
1.4 jsp組成:html+java代碼+jsp自身的一些東西
1.5 jsp嵌入java代碼有三種方式
(1)<%! %>:定義的變量是成員變量
(2)<%= %>:向頁面輸出內(nèi)容,代碼生成到servlet里面service方法里面
(3)<% %>:寫java代碼腺兴,代碼生成到servlet里面service方法里面
2、jsp的注釋
2.1 html的注釋
(1)寫法 <!-- -->
2.2 java的注釋
(1)有三種注釋
(2)單行注釋 //
多行注釋 /* *.
文檔注釋 /** */
(3)把java注釋寫到java代碼
2.3 jsp自身的注釋
(1)<%-- --%>
2.4 代碼
<!-- html的注釋 -->
<!-- java的注釋 -->
<%
// 單行注釋
/* 多行注釋 */
/**
文檔注釋
*/
%>
<!-- jsp自身的注釋 -->
<%-- jsp自身的注釋 --%>
2.5 jsp里面三種注釋的作用范圍
(1)jsp自身的注釋存在jsp源代碼階段
(2)jsp編譯成servlet之后廉侧,html的注釋和java的注釋存在
(3)通過瀏覽器看到的內(nèi)容页响,只有html的注釋
3、jsp的指令
3.1 有三個指令
(1)寫法: <%@ 指令名稱 屬性="屬性值"%>
3.2 page指令
(1)設(shè)置jsp頁面的一些信息
(2)寫法: <%@ page 屬性="屬性值"%>
(3)屬性
= language:jsp支持語言類型段誊,目前支持是java語言
= extends:jsp會編譯成servlet闰蚕,繼承的類,默認繼承的是HttpJspBase
= session:在jsp中是否可以直接使用session對象连舍,默認值true
== 代碼
<!-- session屬性:在jsp中是否可以直接使用session對象 -->
<%
//向session域設(shè)置值
//request.getSession().setAttribute("msg", "sessionValue");
session.setAttribute("msg", "sessiontest");
%>
${msg }
= import:在jsp中導入包
== 可以分開寫没陡,也可以寫在一起 <%@ page import="java.util.List,java.util.ArrayList"%>
= buffer:設(shè)置jsp對客戶端輸出的緩沖區(qū)的大小 8kb
= autoFlush:如果內(nèi)容超出緩沖區(qū)是否會正確輸出 默認值是true
= errorPage:如果jsp頁面出現(xiàn)異常,設(shè)置跳轉(zhuǎn)到錯誤頁面
= isErrorPage:在錯誤頁面中是否顯示錯誤信息
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
== 使用exception對象 <%=exception.getMessage() %>
= contentType:設(shè)置打開的瀏覽器的編碼
= pageEncoding:jsp編譯成servlet索赏,使用編碼方式的設(shè)置盼玄,優(yōu)先權(quán)大于contentType
= isELIgnored:是否忽略el表達式,默認不忽略false潜腻;如果設(shè)置成true之后埃儿,把el表達式作為普通文本
重點掌握的屬性:session、import融涣、errorPage童番、contentType、pageEncoding
3.3 include指令
(1)在一個頁面中包含其他頁面內(nèi)容
(2)寫法: <%@ include 屬性="屬性值"%>
(3)規(guī)范:
第一:在被包含的頁面中暴心,直接寫內(nèi)容
第二:被包含的頁面不能使用變量傳遞
第三:包含的頁面路徑后面不能加參數(shù)
(4)include包含也稱為靜態(tài)包含
多個jsp頁面妓盲,最終會編譯成幾個servlet杂拨?
多個jsp頁面专普,最終編譯成一個servlet
3.4 taglib指令
(1)經(jīng)常和jstl標簽庫一起使用,替代頁面中的<%%>
(2)寫法:<%@ taglib uri="jstl標簽庫的路徑" prefix="jstl標簽庫的別名"%>
jsp中有幾個指令弹沽?
三個指令分別是什么檀夹?
三個指令分別可以做什么?
4策橘、jsp的內(nèi)置對象
4.1 在jsp中有9個內(nèi)置對象炸渡,在jsp不需要創(chuàng)建,可以使用的對象
request:相當于servlet里面的HttpServletRequest丽已,獲取請求的信息蚌堵,是一個域?qū)ο罂梢源嬷岛腿≈?response:相當于servlet里面HttpServletResponse,向頁面輸出內(nèi)容,把cookie回寫到瀏覽器
session:相當于servlet里面HttpSession吼畏,是一個域?qū)ο蟠嬷岛腿≈?config:相當于servlet里面ServletConfig督赤,獲取servlet名稱,獲取初始化參數(shù)
application:相當于servlet里面ServletContext泻蚊,是一個域?qū)ο蟠嬷岛腿≈刀闵啵@取web項目中文件
exception:page指令屬性isErrorPage,把這個屬性值設(shè)置成true之后性雄,才可以使用這個對象
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
page:當前對象
out:輸出的對象
out和response.getWriter()使用的是不是一個對象
= out使用的是JspWriter
= response.getWriter()使用的是PrintWriter
= 現(xiàn)在分別使用out輸出和response.getWriter()輸出
= out的輸出機制:
== 會產(chǎn)生兩個緩沖區(qū)没卸,out緩沖區(qū)和response緩沖區(qū)
== out輸出會把內(nèi)容放到out緩沖區(qū),response輸出會把內(nèi)容放到response緩沖區(qū)
== out緩沖區(qū)不能直接向頁面輸出秒旋,把內(nèi)容先放到response緩沖區(qū)里面约计,通過response緩沖區(qū)才能向頁面輸出
pageContext:
(1)是一個域?qū)ο?= pageContext范圍是當前頁面,不能在servlet里面迁筛,只能使用在jsp中
= 向pageContext域里面設(shè)置值:setAttribute(java.lang.String name, java.lang.Object value)
= 從pageContext域里面獲取值:getAttribute(java.lang.String name)
= 代碼
<%
//設(shè)置值
pageContext.setAttribute("page", "pageValue");
%>
<!-- 從pageContext域里面獲取值 -->
<%=pageContext.getAttribute("page") %>
= application病蛉、session、request瑰煎、pageContext
(2)向其他的域?qū)ο罄锩嬖O(shè)置值
= 使用傳統(tǒng)方式向四個域?qū)ο笤O(shè)置值
<!-- 使用傳統(tǒng)方式向四個域?qū)ο罄锩嬖O(shè)置值 -->
<%
//向application里面設(shè)置值(servletContext)
application.setAttribute("app", "appvalue");
//向session里面設(shè)置值
session.setAttribute("session", "sessionvalue");
//向request里面設(shè)置值
request.setAttribute("request", "requestvalue");
//向pageContext里面設(shè)置值
pageContext.setAttribute("page", "pagevalue");
%>
<%=application.getAttribute("app") %>
<%=session.getAttribute("session") %>
<%=request.getAttribute("request") %>
<%=pageContext.getAttribute("page") %>
= 使用pageContext內(nèi)置對象向application铺然、session、request域里面設(shè)置
== 使用setAttribute(java.lang.String name, java.lang.Object value, int scope)
== 有三個參數(shù):第一個參數(shù)是名稱酒甸;第二個參數(shù)設(shè)置的值魄健;第三個參數(shù)哪個域(PageContext里面的常量表示不同的域)
== 代碼
<!-- 使用pageContext內(nèi)置對象向四個域?qū)ο罄锩嬖O(shè)置值 -->
<%
//向application
pageContext.setAttribute("app100", "app100value", PageContext.APPLICATION_SCOPE);
//向session
pageContext.setAttribute("session100", "session100value", PageContext.SESSION_SCOPE);
//向request
pageContext.setAttribute("request100", "request100value", PageContext.REQUEST_SCOPE);
//向pageContext
pageContext.setAttribute("page100", "page100value", PageContext.PAGE_SCOPE);
%>
(3)從其他的域?qū)ο罄锩娅@取值
= 獲取四個域?qū)ο罄锩娴闹担篻etAttribute(java.lang.String name, int scope)
== 兩個參數(shù):第一個參數(shù)域名稱;第二個參數(shù)是哪個域(PageContext里面的常量表示不同的域)
= 代碼
<!-- 使用pageContext內(nèi)置對象獲取四個域?qū)ο罄锩娴闹?-->
<!-- 獲取application里面的值 -->
<%=pageContext.getAttribute("app", PageContext.APPLICATION_SCOPE) %>
<!-- 獲取session里面的值 -->
<%=pageContext.getAttribute("session", PageContext.SESSION_SCOPE) %>
<!-- 獲取request里面的值 -->
<%=pageContext.getAttribute("request", PageContext.REQUEST_SCOPE) %>
<!-- 獲取pageContext域里面的值 -->
<%=pageContext.getAttribute("page",PageContext.PAGE_SCOPE) %>
(4)獲取到其他的八個內(nèi)置對象
= 代碼
<!-- 使用pageContext內(nèi)置對象獲取其他八個內(nèi)置對象 -->
<%
//獲取request內(nèi)置對象
pageContext.getRequest();
//獲取response內(nèi)置對象
pageContext.getResponse();
//獲取session內(nèi)置對象
pageContext.getSession();
.......
%>
(5)findAttribute(java.lang.String name)方法的使用
= 分別向四個域?qū)ο罄锩嬖O(shè)置值插勤,名稱相同
= 獲取到域范圍最小的里面的值
== <%=pageContext.findAttribute("test") %>
4.2 四個域?qū)ο?servletContext(application):范圍是整個web項目
session:范圍是一次會話
request:范圍是一次請求
pageContext:范圍是當前頁面
4.3 在jsp中有幾個內(nèi)置對象沽瘦?
jsp中九個內(nèi)置對象分別是什么?
jsp中九個內(nèi)置對象分別做什么农尖?
out內(nèi)置對象的輸出機制析恋?
pageContext內(nèi)置對象的四個用途?
5盛卡、jsp的動作標簽
5.1 什么是動作標簽助隧,在jsp使用動作標簽可以完成功能
5.2 寫法: 在jsp中使用 <jsp:動作標簽名稱 屬性="屬性值"></jsp:動作標簽名稱>
5.3 常用的動作標簽
(1)<jsp:forward> :轉(zhuǎn)發(fā)
= <jsp:forward page="/forward/hello.jsp"></jsp:forward>
(2)<jsp:include> :頁面包含(動態(tài)包含)
= <jsp:include page="head.jsp"></jsp:include>
= 有多個jsp文件,最終會編譯成幾個servlet滑沧?
== 多個jsp文件會編譯成多個servlet
(3)<jsp:param> :傳遞參數(shù)
= 在帶路徑的動作標簽里面使用
= 代碼
<jsp:forward page="/forward/hello.jsp">
<jsp:param value="aaa100" name="id11"></jsp:param>
</jsp:forward>
5.4 下面的三個動作標簽用于操作javabean
(4)<jsp:useBean>
(5)<jsp:setProperty>
(6)<jsp:getProperty>
第二部分:javabean
1并村、什么是javabean
1.1 javabean就是一個java類,遵循一定書寫規(guī)范
第一個規(guī)范:在javabean里面有一個公開的沒有參數(shù)的構(gòu)造方法
第二個規(guī)范:在javabean里面屬性是私有的
第三個規(guī)范:在javabean里面私有的屬性通過公開的方法暴露出來
(1)代碼
//私有的屬性
private String id;
private String username;
private String password;
//公開方法暴露私有的屬性
public String getId() {
return id;
}
......
1.2 javabean主要的用途是 封裝數(shù)據(jù)
(1)使用set方法設(shè)置值
(2)使用get方法獲取值
2滓技、封裝數(shù)據(jù)到javabean
2.0 創(chuàng)建jsp頁面哩牍,在頁面中寫表單,提交到servlet中令漂,在servlet進行數(shù)據(jù)封裝到javabean的操作
2.1 使用傳統(tǒng)方式進行封裝
(1)實現(xiàn)的步驟
* 1膝昆、得到表單提交的數(shù)據(jù)
* 2丸边、創(chuàng)建User的對象
* 3、使用user里面的set方法進行封裝
(2)代碼
//獲取表單提交的數(shù)據(jù)
//處理中文亂碼問題
request.setCharacterEncoding("utf-8");
String id = request.getParameter("id");
String username = request.getParameter("username");
String password = request.getParameter("password");
//創(chuàng)建user對象
User user = new User();
//使用user里面的set方法進行封裝
user.setId(id);
user.setUsername(username);
user.setPassword(password);
System.out.println(user.getId()+" :: "+user.getUsername()+" :: "+user.getPassword());
2.2 使用jsp的動作標簽進行封裝
(0)表單輸入項里面的 name屬性值 和 javabean里面的屬性值一樣
(1)使用到jsp中三個動作標簽
第一個:<jsp:useBean> :設(shè)置要封裝數(shù)據(jù)到的是哪一個javabean
第二個:<jsp:setProperty>:向哪個屬性里面設(shè)置值
第三個:<jsp:getProperty>:從哪個屬性里面或者值
(2)代碼
<!-- 使用動作標簽封裝數(shù)據(jù)到javabean -->
<!-- 創(chuàng)建封裝的javabean的對象 -->
<jsp:useBean id="user" class="com.mythmayor.bean.User"></jsp:useBean>
<!-- 設(shè)置值到javabean里面 -->
<%-- <jsp:setProperty property="id" name="user"></jsp:setProperty>
<jsp:setProperty property="username" name="user"></jsp:setProperty>
<jsp:setProperty property="password" name="user"></jsp:setProperty> --%>
<!-- 設(shè)置值到javabean的簡寫的方式 -->
<!-- 表單輸入項里面的 name屬性值 和 javabean里面的屬性值一樣 -->
<jsp:setProperty property="*" name="user"></jsp:setProperty>
<!-- 獲取javabean里面值荚孵,顯示到頁面上 -->
<jsp:getProperty property="id" name="user"></jsp:getProperty>
<jsp:getProperty property="username" name="user"></jsp:getProperty>
<jsp:getProperty property="password" name="user"></jsp:getProperty>
2.3 使用beanutils框架進行封裝
(1)beanutils框架是apache組織開發(fā)的原环,用于封裝數(shù)據(jù)到javabean的操作
(2)如果要想使用beanutils框架,首先導入jar包
(3)使用框架里面 BeanUtils類里面方法 populate(Object bean, Map properties)
= 要求:表單輸入項的name的屬性值处窥,必須和javabean里面的屬性值一樣
= populate(Object bean, Map properties) 方法里面有兩個參數(shù)
== 第一個參數(shù)是封裝的javabean對象嘱吗;
== 第二個參數(shù)是要封裝數(shù)據(jù)的map集合(map結(jié)構(gòu)是key-value,key是屬性的名稱滔驾,value是值)
=== 在request里面方法getParameterMap()谒麦,返回map集合,key是表單輸入項name屬性的值哆致,value是輸入值
(4)代碼
//創(chuàng)建user對象
User user = new User();
//進行封裝數(shù)據(jù)到javabean
try {
BeanUtils.populate(user, request.getParameterMap());
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(user.getId()+" :: "+user.getUsername()+" :: "+user.getPassword());
第三部分:el表達式
1绕德、使用el表達式獲取域?qū)ο罄锩娴闹?/h3>
(1)el表達式使用在jsp頁面中,不能在html中使用
(2)寫法: ${域?qū)ο竺Q}
(3)使用el表達式獲取四個域?qū)ο罄锩娴闹?= 代碼
<!-- 向四個域?qū)ο罄锩嬖O(shè)置值 -->
<%
//向application里面設(shè)置
application.setAttribute("test", "appvalue");
//向session域里面設(shè)置值
session.setAttribute("test", "sessionvalue");
//向request域里面設(shè)置值
request.setAttribute("test", "requestvalue");
//向pageContext域里面設(shè)置值
pageContext.setAttribute("test", "pagevalue");
%>
<!-- 使用el表達式獲取四個域?qū)ο罄锩娴闹?-->
<!-- 獲取application里面的值 -->
${applicationScope.test }
<!-- 獲取session里面的值 -->
${sessionScope.test }
<!-- 獲取request里面的值 -->
${requestScope.test }
<!-- 獲取pageContext里面的值 -->
${pageScope.test }
(4)如果使用el表達式獲取的名稱不存在摊阀,返回空字符串 ""耻蛇,不會出現(xiàn)空指針異常
如果使用傳統(tǒng)方式getAttribute獲取名稱不存在,返回null胞此,容易出現(xiàn)空指針異常
(5)使用el表達式獲取域?qū)ο竺Q相同的臣咖,獲取的是域范圍最小的里面的值
2、使用el表達式獲取域?qū)ο罄锩鏀?shù)組漱牵、集合(list夺蛇、map)、對象屬性的值
(1)使用el表達式獲取域?qū)ο罄锩娴臄?shù)組的值
= 使用數(shù)組的下標得到里面的值,數(shù)組下標從0開始
= ${域?qū)ο竺Q[數(shù)組的下標] }
= 代碼
<!-- 使用el表達式獲取域?qū)ο罄锩娴臄?shù)組的值 -->
<%
//創(chuàng)建數(shù)組
String[] arr = {"lucy","mary","jack"};
//把數(shù)組放到域?qū)ο罄锩? request.setAttribute("arr100", arr);
%>
<!-- el表達式獲取值 -->
<!-- 使用傳統(tǒng)方式:遍歷數(shù)組酣胀,根據(jù)數(shù)組的下標得到數(shù)組里面的值刁赦,數(shù)組下標從0開始 -->
${arr100[2] }
= 如果獲取的數(shù)組的下標不存在,返回是空字符串 ""
(2)使用el表達式獲取域?qū)ο罄锩鎙ist集合的值
= 使用list集合的下標獲取里面的值闻镶,list下標從0開始的
= ${域?qū)ο竺Q[list集合的下標]}
= 代碼
<!-- 使用el表達式獲取域?qū)ο罄锩娴膌ist集合的值 -->
<%
//創(chuàng)建list集合
List<String> list = new ArrayList<String>();
//向list集合里面放數(shù)據(jù)
list.add("AAAA");
list.add("BBBB");
list.add("CCCC");
//把list集合放到域?qū)ο罄锩? request.setAttribute("list100", list);
%>
<!-- el表達式獲取值 -->
<!-- 使用傳統(tǒng)方式遍歷list甚脉,有四種方式
普通for:根據(jù)下標得到,下標從0開始
迭代器
增強for
list迭代器
-->
${list100[2] }
= 如果獲取list集合的下標不存在铆农,返回是空字符串 ""
= 向域?qū)ο罄锩娣舠et集合牺氨,使用el表達式不可以獲取域?qū)ο罄锩鎠et集合的值
== list和set的區(qū)別:list是有序的,set是無序的
(3)使用el表達式獲取域?qū)ο罄锩鎚ap集合的值
= 根據(jù)map的key名稱得到對應的value值
= 寫法:${域名稱.key名稱}
= 另外寫法:${域名稱["key名稱"]}
= 代碼
<!-- 使用el表達式獲取域?qū)ο罄锩鎚ap集合的值 -->
<%
//創(chuàng)建map集合
Map<String,String> map = new HashMap<String,String>();
map.put("aa", "AA");
map.put("bb", "BB");
map.put("cc", "CC");
//把map集合放到域?qū)ο罄锩? request.setAttribute("map100", map);
%>
<!-- el表達式獲取值 -->
<!-- 使用傳統(tǒng)方式遍歷map顿涣,有兩種方式
第一種:得到所有的key波闹,根據(jù)key得到value
第二種:得到key-value關(guān)系
-->
${map100.aa }
= 如果key的名稱不存在酝豪,返回是空字符串 ""
= 如果map集合的key的類型是int類型涛碑,使用el表達式不能獲取里面的值,報錯
(4)使用el表達式獲取域?qū)ο罄锩娴膶ο蟮膶傩灾?= 使用名稱.對象里面的屬性的名稱得到值
= ${域?qū)ο竺Q.屬性的名稱}
= 代碼
<!-- 使用el表達式獲取域?qū)ο罄锩鎸ο蟮膶傩缘闹?-->
<%
//創(chuàng)建對象
User user = new User();
user.setUsername("東方不敗");
user.setPassword("999");
//把user對象放到域?qū)ο罄锩? request.setAttribute("user100", user);
%>
<!-- el表達式獲取值 -->
${user100.username }
<br/>
${user100.password }
= 如果獲取的域?qū)ο罄锩娴膶ο蟮膶傩悦Q不存在孵淘,報錯
3蒲障、el表達式的其他操作
3.1 運算的操作
(1)算術(shù)的運算 + - ......
(2)關(guān)系的運算 < > <= >=.....
(3)邏輯的運算 && ||....
3.2 empty運算符
(1)判斷對象是否為空
= ${user == null}
= ${empty user}
= ${user != null}
= ${not empty user}
3.3 三元表達式
(1)${user != null ? user.name : ""}
= 如果user對象不為空,獲取user的name值,否則返回空字符串
= ${ not empty user ? user.name : ""}
3.4 在el表達式中有11個隱含對象
(1)pageContext隱含對象:對應于jsp中pageContext內(nèi)置對象揉阎,獲取其他的八個內(nèi)置對象