jsp概述
- jsp全稱是 Java Server Page,它和servlet技術(shù)一樣幻碱,都是SUN公司定義的一種用于開發(fā)動(dòng)態(tài)web資源的技術(shù)。jsp實(shí)際上就是servlet
- jsp = html+java
- jsp 主要用于顯示數(shù)據(jù)
jsp 的原理
翻譯-> 編譯 -> 執(zhí)行
demo.jsp 翻譯成 _demo_jsp.java
_demo_jsp.java 編譯 _demo_jsp.class
jsp作用
- Servlet:控制器细溅。重點(diǎn)編寫java代碼邏輯(獲取表單數(shù)據(jù)褥傍,處理業(yè)務(wù)邏輯,分發(fā)轉(zhuǎn)向)喇聊。
- jsp: 代碼顯示模板恍风,重點(diǎn)在于顯示數(shù)據(jù)。
jsp的基本語(yǔ)法
jsp模板元素
- jsp 頁(yè)面中的HTML內(nèi)容稱之為jsp模板元素誓篱。
- jsp 模板元素定義了網(wǎng)頁(yè)的骨架朋贬,即定義了頁(yè)面的結(jié)構(gòu)和外觀。
jsp腳本
1窜骄,jsp 腳本片段
語(yǔ)法
<%
//多行java代碼
%>
<%
out.write("hello");
out.write("142");
%>
注意
- jsp 腳本片段只能初心java代碼锦募,不能出現(xiàn)其他模板元素,jsp引進(jìn)在翻譯jsp頁(yè)面中邻遏,會(huì)將jsp腳步片段中的jva代碼原封不動(dòng)的放倒servlet中的_jspService方法中
- jsp 腳本片段的java代碼必須嚴(yán)格遵循java語(yǔ)法 每行語(yǔ)句結(jié)束要有(;).
- 多個(gè)腳本之間的變量可以相互訪問(wèn)
2 jsp表達(dá)式
jsp用于將程序的數(shù)據(jù)輸出到客戶端
語(yǔ)法
<%=變量表達(dá)式%>
<%=2+8 %>
注意
jsp表達(dá)式中的變量和表達(dá)式后面**不能有(;)**
3糠亩,定義全局成員和靜態(tài)塊
語(yǔ)法
<%! %>
<%!
int i=0;
%>
<%
int j=0;
%>
<%
out.write(" i= "+(i++)+" j= "+(j++));
%>
注意
i 是全局變量每次都會(huì)加1
j 每次請(qǐng)求都會(huì)初始化
jsp 注釋
- jsp注釋<%-- 被注釋的內(nèi)容 --%> 特點(diǎn):安全,省流量
- 網(wǎng)頁(yè)注釋: 特點(diǎn):不安全准验,費(fèi)流量
- 在查看源碼時(shí)網(wǎng)頁(yè)注釋會(huì)顯示出來(lái) jsp注釋不會(huì)顯示
jsp 三個(gè)指令
jsp指令是為jsp引擎二設(shè)計(jì)的赎线,他們并不直接產(chǎn)生任何輸出,而只是告訴瀏覽器如何處理jsp頁(yè)面的其余部分糊饱。在jsp2.0規(guī)范中定義了三個(gè)指令
- page 指令
- include指令
- taglib 指令
語(yǔ)法
<%@ 指令 屬性名1=“值1” 屬性名2=“值2” 屬性名3=“值3”>
或者
<%@ 指令 屬性名1=“值1”%>
<%@ 指令 屬性名2=“值2”%>
<%@ 指令 屬性名3=“值3”%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
1垂寥,page
作用
用于定義jsp頁(yè)面的各種屬性,page指令最好是放在整個(gè)jsp頁(yè)面的起始位置。
屬性
- 屬性含義
屬性 | 定義 |
---|---|
language="java" | 指定JSPContainer用什么語(yǔ)言來(lái)編譯滞项,目前只支持Java語(yǔ)言狭归。默認(rèn)為JAVA |
extends=”className” | 定義此JSP網(wǎng)頁(yè)產(chǎn)生的Servlet是繼承哪個(gè) |
import=”importList” | 定義此JSP網(wǎng)頁(yè)要使用哪些Java API |
session = "true false" | 決定此頁(yè)面是否使用session對(duì)象,默認(rèn)為ture |
buffer=”none size in kb” | 決定輸出流(Input stream)是否又緩沖區(qū)蓖扑。默認(rèn)為8kb |
isThreadSafe=”true false” | 是否支持線程唉铜。默認(rèn)為true |
errorPage=”url” | 如果此頁(yè)發(fā)生異常,網(wǎng)頁(yè)會(huì)重新指向一個(gè)url |
isErrorPage=”true false” | 表示此頁(yè)面是否為錯(cuò)誤處理頁(yè)面律杠。默認(rèn)為false |
contentType=”text/html;charset=gb2312” | 表示MIME類型和JSP的編碼方式 |
pageEncoding=”ISO-8859-1” | 編碼方式 |
isELLgnored=”true false” | 表示是否在此JSP頁(yè)面中EL表達(dá)式潭流。true則忽略,反之false則支持柜去。默認(rèn)為false |
例
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="error.jsp" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int i= 10/0;
%>
</body>
</html>
error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>錯(cuò)誤頁(yè)面</title>
</head>
<body>
errorMesg:
<% out.write(exception.getMessage());%>
</body>
</html>
web.xml配置error 頁(yè)面
<error-page>
<error-code>500</error-code>
<location>/error.jsp</location>
</error-page>
2灰嫉,include
靜態(tài)包含:把其他資源包含到當(dāng)前頁(yè)面
<% include file="/header.jsp"%>
<% include file="/footer.jsp"%>動(dòng)態(tài)包含
<jsp:include page="/foorer"></jsp:include>-
兩者的區(qū)別:翻譯的時(shí)間段不同
- 靜態(tài)在翻譯時(shí)就把兩個(gè)文件合并
- 動(dòng)態(tài)不會(huì)合并文件,當(dāng)代碼執(zhí)行到include時(shí)嗓奢,才包含另外一個(gè)文件內(nèi)容
- 能用靜態(tài)就不用動(dòng)態(tài)
例
header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
我是是頭部
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="/header.jsp" %>
我是內(nèi)容
<%@ include file="/footer.jsp" %>
footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
我是底部
</body>
</html>
3讼撒,taglib
- 作用:在jsp頁(yè)面中導(dǎo)入jstl標(biāo)簽庫(kù)。替換jsp中的java代碼片段
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
jsp 六個(gè)動(dòng)作
- 1,<jsp:include > 動(dòng)態(tài)包含
- 2,<jsp:forward> 請(qǐng)求轉(zhuǎn)發(fā)
- 3,<jsp:param> 設(shè)置請(qǐng)求參數(shù)
- 4,<jsp:useBean> 創(chuàng)建一個(gè)對(duì)象
- 5,<jsp:setProperty> 給指定的對(duì)象屬性賦值
- 6,<jsp:getProperty> 取出指定對(duì)象的屬性值
例
<jsp:useBean id="stu1" class="com.itheima.entity.Student"></jsp:useBean>
<jsp:setProperty property="name" name="stu1" value="jerry"/>
<jsp:getProperty property="name" name="stu1"/>
<!-- http://localhost:8080/test.jsp?name=123 -->
<jsp:forward page="/7.jsp">
<jsp:param value="123" name="name"/>
<jsp:param value="333" name="pwd"/>
</jsp:forward>`
jsp 9個(gè)內(nèi)置對(duì)象
- 指在jsp的<%= %> 和<% %> 中可以直接使用的對(duì)象
對(duì)象名 | 類型 | 說(shuō)明 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | |
response | javax.servlet.http.HttpServletResponse | |
session | javax.servlet.http.HttpSession | 由session="true" 開關(guān) |
application | javax.servlet.ServeletContext | |
exception | java.lang.Throwable | 由 isErrorPage="false"開關(guān) |
out | javax.servlet.jsp.JspWriter | 字符串輸出流股耽,相當(dāng)于PrintWriter對(duì)象 |
page | java.lang.Object 當(dāng)前對(duì)象this | 當(dāng)前servlet實(shí)例 |
pageContext | javax.servlet.jsp.PageContext | |
config | javax.servlet.ServletConfig |
pageContext
1根盒, 本身也是一個(gè)域?qū)ο螅梢圆僮髌渌齻€(gè)域?qū)ο螅╮equest session application)的數(shù)據(jù)
- void setAttribute(String name,Object o);
- Object getAttribute(String name);
- void removeAttribute(String name);
- 操作其它域?qū)ο蟮姆椒?/li>
- void setAttribute(String name,Object o物蝙,int Scope);
- Object getAttribute(String name,int Scope);
- void removeAttribute(String name,int Scope);
- scpoe的值:
- PageContext.PAGE_SCOPE
- PageContext.REQUEST_SCOPE
- PageContext.SESSION_SCOPE
- PageContext.APPLICATION_SCOPE
- findAttribute(String name)炎滞;自動(dòng)從page request session application一次查找,找到了就取值诬乞,介乎查找
####### 例
pageContext.setAttribute("test", "page",PageContext.PAGE_SCOPE);
request.setAttribute("test", "request");
session.setAttribute("test","session");
application.setAttribute("test", "application");
2册赛,它可以創(chuàng)建其他的8個(gè)隱士對(duì)象
<%
pageContext.getSession();
pageContext.getRequest()
pageContext.getOut()
//...
%>
3,提供了簡(jiǎn)易方法
- pageContext.forward("2.jsp");
- pageContext.include("2.jsp");
四大域?qū)ο笳鸺担_發(fā)中使用場(chǎng)景
- PageContext:pageContext 數(shù)據(jù)存放在當(dāng)前頁(yè)面有效森瘪。開發(fā)時(shí)使用較小
- ServletRequest: request 數(shù)據(jù)存放在一次請(qǐng)求(轉(zhuǎn)發(fā))內(nèi)有效,使用非常多票堵。
- HttpSession: session 存放的數(shù)據(jù)在一次會(huì)話中有效扼睬,使用比較多。
- ServletContext: application 存放的數(shù)據(jù)在整個(gè)應(yīng)用范圍內(nèi)都有效悴势。因?yàn)榉秶蟠坝睿M量少用
EL的具體功能
- 獲取數(shù)據(jù)
- 運(yùn)算
- 隱式對(duì)象:11個(gè)
獲取數(shù)據(jù)
EL表達(dá)式只能獲取存在4個(gè)作用域的數(shù)據(jù)
${u} 原理:pageContext.findAttribute("u");
url>name=lihao
${param.name}
獲取對(duì)于 null這樣的數(shù)據(jù),在頁(yè)面中表現(xiàn)為空字符串
點(diǎn)(.) 運(yùn)算符相當(dāng)于調(diào)用了getter方法瞳浦,點(diǎn)后面跟的是屬性名
<%
Book book = new Book("1", "android 開發(fā)大全", 29, "王子陽(yáng)");
request.setAttribute("book",book);
%>
${book.name }
[]運(yùn)算符:點(diǎn)能做的担映,它也能做废士;他不能做的叫潦,點(diǎn)不一定能做
${book.name } === ${book['name'] } === ${book["name"] }
運(yùn)算
empty
判斷null,空字符串和沒有元素的集合(即使集合對(duì)象本身不為null)都返回true
<%
String str = null;
pageContext.setAttribute("str", str);
String str1= "";
pageContext.setAttribute("str1",str1);
String str2="abc";
pageContext.setAttribute("str2",str2);
List<String> list1 = new ArrayList<String>();
pageContext.setAttribute("list1", list1);
List<String> list2 = new ArrayList<String>();
list2.add("aa");
pageContext.setAttribute("list2",list2);
%>
${ empty str } -----true <br/>
${ empty str1 } -----true <br/>
${ empty str2 } -----false <br/>
${ empty list1 } -----true <br/>
${ empty list2 } -----false <br/>
${ empty str ? "str為空":"有值" }
賦值 ${test = index+4 }
取值 ${test}
隱式對(duì)象
EL 隱式對(duì)象引用名稱 | 類型 | jsp內(nèi)置對(duì)象名稱 | 說(shuō)明 |
---|---|---|---|
pageContext | javax.servlet.jsp.PageCOntext | pageContent | 一樣的 |
pageSope | java.util.Map<String,Object> | 沒有對(duì)應(yīng)的 | pageContext返回中存放的數(shù)據(jù),頁(yè)面范圍 |
requestScope | java.util.Map<String,Object> | 沒有對(duì)應(yīng)的 | 請(qǐng)求范圍數(shù)據(jù) |
sessionScope | java.util.Map<String,Object> | 沒有對(duì)應(yīng)的 | 會(huì)話范圍數(shù)據(jù) |
applicationScope | java.util.Map<String,Object> | 沒有對(duì)應(yīng)的 | 應(yīng)用范圍數(shù)據(jù) |
param | java.util.Map<String,Object> | 沒有對(duì)應(yīng)的 | 一個(gè)請(qǐng)求參數(shù) |
paramValues | java.util.Map<String,Object> | 沒有對(duì)應(yīng)的 | 重名請(qǐng)求參數(shù) |
header | java.util.Map<String,Object> | 沒有對(duì)應(yīng)的 | 一個(gè)請(qǐng)求消息頭 |
initParam | java.util.Map<String,Object> | 沒有對(duì)應(yīng)的 | web.xml中全局參數(shù) |
cookie | java.util.Map<String,Object> | 沒有對(duì)應(yīng)的 | key:cookie對(duì)象的name值 |
jstl
- jstl 是什么
- jstl 解決什么問(wèn)題
- jstl 如何使用
jstl 是什么
jstl(JSP Standard Tag Library官硝,JSP標(biāo)準(zhǔn)**標(biāo)簽庫(kù)**)是一個(gè)不斷完善的開放源代碼的jsp標(biāo)簽庫(kù)矗蕊,是由apache的jakarta小組來(lái)維護(hù)的短蜕。
jstl 解決什么問(wèn)題
處理jsp 頁(yè)面的邏輯處理。比如判斷傻咖,循環(huán)等朋魔。
jstl 如何使用
在jsp頁(yè)面添加taglib指令才能使用jstl標(biāo)簽
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="core"%>
使用 jstl標(biāo)簽
語(yǔ)法 <prefix:命令 test=""></prefix:命令>
<core:if test="${num>3}"></core:if>
常用標(biāo)簽
通用標(biāo)簽 set out remove
設(shè)置變量:<core:set var="num" value="${10+5 }" scope="page"></core:set>
輸出數(shù)據(jù):<core:out value="${num }"></core:out>
移除變量:<core:remove var="num"/><br/>
移除后輸出設(shè)置默認(rèn)值: <core:out value="${num }" default="默認(rèn)值"></core:out>
條件標(biāo)簽 if choose(switch)
<%
pageContext.setAttribute("num", 5);
pageContext.setAttribute("index", 5);
%>
- if
<core:if test="${num>3}"> ${num} </core:if>
- choose
例
<core:choose>
<core:when test="${num==1 }">
num = 1
</core:when>
<core:when test="${num==2 }">
num=2
</core:when>
<core:when test="${num==3 }">
num=3
</core:when>
<core:when test="${num==5 }">
num =5
</core:when>
<core:otherwise>
默認(rèn)值
</core:otherwise>
</core:choose>
迭代器 foreach
-
普通循環(huán)
var 聲明變量
begin 初始化
end 結(jié)束條件
-
step 步長(zhǎng)
<core:forEach var="i" begin="1" end="10" step="2">
${i }</core:forEach>
-
循環(huán)數(shù)據(jù)
- items 獲取到集合
- varStatus 元素的信息
- var 單個(gè)數(shù)據(jù)
例1
<%
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("cccc");
pageContext.setAttribute("list", list);
Map<String, String> map = new HashMap<String, String>();
map.put("a", "A");
map.put("b", "B");
map.put("c", "C");
map.put("d", "D");
map.put("e", "E");
pageContext.setAttribute("map", map);
%>
<core:forEach items="${list }" var="l">
${l }
</core:forEach>
例2
<table border="1px">
<tr>
<th>key</th>
<th>內(nèi)容</th>
<th>索引</th>
<th>計(jì)數(shù)</th>
<th>是否第一個(gè)</th>
<th>是否最后一個(gè)</th>
</tr>
<core:forEach items="${map }" var="m" varStatus="vs">
<tr>
<td>${m['key'] }</td>
<td>${m['value'] }</td>
<td>${vs.index }</td>
<td>${vs.count }</td>
<td>${vs.first }</td>
<td>${vs.last }</td>
</tr>
</core:forEach>
</table>