JSP介紹
全稱: Java Server Pages,java服務器頁面。和Servlet一樣,是sun公司定義的一種動態網頁開發技術。
特點: 基於html模版,可以在html模版嵌入java代碼和jsp中的標籤。
tomcat可以包含的資源:
靜態資源:
html
:靜態頁面。
CSS
:修飾美化html頁面。
JavaScript
:動態修改html頁面和css樣式。
動態資源
Servlet
:運行在服務器上的java小程序。適合編寫java代碼,寫網頁困難,適合業務處理
Servlet三個用途:
1、接受瀏覽器發送的數據
2、轉發重定向
3、 負責調用業務層
JSP
:適合編寫動態內容,不適合寫java代碼,主要用於顯示頁面。
JSP優勢
1、與純 Servlet 相比: JSP可以很方便的編寫或者修改HTML網頁而不用去面對大量的println語句
2 、與JavaScript相比: 雖然JavaScript可以在客戶端動態生成HTML,但是很難與服務器交互,因此不能提供複雜的服務,比如訪問數據庫和圖像處理等等。
3 、與靜態HTML相比: 靜態HTML不包含動態信息
JSP語法
JSP頁面中可以包含指令,Java語句、變量、方法或表達式、靜態內容(html、css、javascript)
語法格式:
指令:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
腳本:
<% java代碼 %>
<% int i=10;%>
腳本表達式:
輸出變量: <%=2+3%>等價於輸出語句 (注意:不能使用分號來結束表達式)
聲明:
<%!
定義方法
%>
靜態資源:HTML、CSS、JS
JSP註釋
格式: <%-- 網頁註釋 --%>:安全,省流量
網頁註釋:<!-- 網頁註釋 --> ,特點,不安全,耗流量
JSP指令
告訴JSP引擎如何解析jsp文件中的內容
語法: <%@ 指令名稱 屬性名稱1=“屬性值1” 屬性名稱2=“屬性值2” …%>
示例:
<%@ page language=*"java"* contentType="text/html; charset=UTF-8" pageEncoding=*"UTF-8"*%>
page指令
作用:用於定義JSP頁面的各種屬性
import和java代碼的含義一樣
<%@ page import="java.util.Date,java.util.List"%>
或者:
<%@ page import="java.util.Date"%>
<%@ page import="java.util.List"%>
session
:是否會自動創建session對象,默認值爲true;
buffer:
JSP中有java.servlet.jsp.JspWriter輸出字符流。設置輸出數據的緩存大小。默認8kb.
errorPage
:如果頁面中有錯誤,跳轉到指定的資源 errorPage="/uri" 如果寫“/”則代表當前應用的目錄 下,絕對路徑。 如果不寫“/”則代表相對路徑
isErrorPage
:是否創建throwable對象。默認是false
contentType
:等同於response.setContentType(“text/html;charset=utf-8”);服務器發送客戶端的內容編碼
pageEncoding
: Jsp文件本身的編碼
isELIgnored
: 是否忽略EL表達式。 默認是false,支持表達式;是true表示不支持表達式,${1+1};false輸出結果2 true按照原樣輸出
include指令
靜態包含: 把其它資源包含到當前頁面中 <%@ include file="header.jsp" %>
動態包含: <jsp:include page=“header.jsp"></jsp:include>
兩者的區別: 翻譯的時間段不同(可在tomcat工作目錄下查看)
靜態包含: 在翻譯時就把兩個文件進行合併,運行時效率高。屬於同一個頁面。
動態包含: 不會合並文件,當代碼執行到include時,才包含另一個文件的內容。不屬於同一個頁面
taglib指令
作用: 在JSP頁面中導入JSTL標籤庫。JSTL替換jsp中的java代碼片段。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c" %>
JSP的6個動作標籤
jsp:include
動態包含
jsp:forward
請求轉發
jsp:param
請求設置參數
注意:主頁面中設置編碼類型utf-8 jsp:param的value屬性纔可以使用中文,不然會亂碼
jsp:useBean
創建一個對象
jsp:setProperty
給指定的對象屬性賦值
jsp:getProperty
取出指定的對象屬值
內置對象
Servlet中內置對象:request 、response、session、application、out(PrintWriter)
Jsp本質是Servlet,包含九個內置對象
對象名 | 類型 | 說明 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | |
response | javax.servlet.http.HttpServletResponse | |
session | javax.servlet.http.HttpSession | 由session=“true”開關 |
application | javax.servlet.ServletContext | |
config | javax.servlet.ServletConfig | |
exception | java.lang.Throwable | 由isErrorPage=“false”開關 |
out | javax.servlet.jsp.JspWriter | javax.servlet.jsp.JspWriter |
pageContext | javax.servlet.jsp.PageContext | |
page | java.lang.Object當前對象this | 當前servlet實例 |
r r s a c e o p p
代碼演示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!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=UTF-8">
<title>JSP內置對象</title>
</head>
<body>
<%
//頁面上下文對象
pageContext.setAttribute("msg", "我是PageContext對象");
System.out.println(pageContext.getAttribute("msg"));
//請求對象
System.out.println("請求對象:"+request);
//響應對象
response.getWriter().print("OK");
//當前頁面對象
System.out.println(page.getClass());//輸出到控制檯
//輸出對象
out.print(48);//輸出到瀏覽器:48
out.write(48);//輸出到瀏覽器:0
int no=101;
//會話對象
System.out.println(session);
//全局對象
System.out.println(application.getRealPath("/"));
//配置對象--初始化參數
System.out.println(config.getServletName());
//異常對象
System.out.println(exception);
System.out.println(application);
application.setAttribute("author", "1711");
%>
<h1>jsp腳本:<%=no %></h1>
<h1>jsp腳本:<% out.print(no); %></h1>
</body>
</html>
jsp的out和getWriter()方法的區別
1、out是JspWriter類型,getWriter()是PrintWriter類型
2、out輸出到緩衝區中,沒有寫到response中,getWriter()直接寫到response中。
3、out一般用在jsp中,getWriter()用在Servlet中
pageContext對象
pageContext作用:
1、代表頁面上下文,獲取其他八個內置對象
2、作用容器使用
域對象
jsp中共包含四個域對象分別是request、session、application、pageContext
request域的使用場景: 本次請求之後,數據就不再使用了,根據學號查詢學生,根據新聞id查詢新聞。
session域的使用場景: 同一個會話中共享的數據,使用session,用戶登錄信息
application域的使用場景: 所有用戶共享的數據。整個程序的配置信息
pageContext域的使用場景: 當前頁面。
其中pageContext可以操作其他三個域對象(request,session,application)的數據
void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);
操作其它域對象的方法
void setAttribute(String name,Objecto,int Scope);
Object getAttribute(String name,intScope);
void removeAttribute(String name,intScope);
Scope
作用域,值如下:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
findAttribute(Stringname)
自動從pageContext,request ,session ,application依次查找,找到了就取值,結束查找 (作用域的範圍由小到大)
pageContext操作四個域對象示例:
<%--設置數據--%>
<%
pageContext.setAttribute("pagedata","thisdata");
pageContext.setAttribute("requestdata","setrequest",pageContext.REQUEST_SCOPE);
pageContext.setAttribute("sessiondata","setsession",pageContext.SESSION_SCOPE);
pageContext.setAttribute("applicationdata","setapplication",pageContext.APPLICATION_SCOPE);
%>
<%--取數據--%>
<%
String pagedata = (String)pageContext.getAttribute("pagedata");
String requestdata = (String)pageContext.getAttribute("requestdata", pageContext.REQUEST_SCOPE);
String sessiondata = (String)pageContext.getAttribute("sessiondata", pageContext.SESSION_SCOPE);
String applicationdata = (String)pageContext.getAttribute("applicationdata", pageContext.APPLICATION_SCOPE);
//從四個域中查找
String pagedata1 = (String)pageContext.findAttribute("pagedata");
String requestdata1 = (String)pageContext.findAttribute("requestdata");
//從四個域中移除
pageContext.removeAttribute("pagedata");
%>
<%--輸出數據--%>
<%=pagedata%>
<%=requestdata%>
<%=sessiondata%>
<%=applicationdata%>
<%=pagedata1%>
<%=requestdata1%>
它可以訪問其它的8個內置對象
在普通類中可以通過PageContext獲取其它JSP隱式對象,具體如下:
getException
方法返回exception
隱式對象
getPage
方法返回page
隱式對象
getRequest
方法返回request
隱式對象
getResponse
方法返回response
隱式對象
getServletConfig
方法返回config
隱式對象
getServletContext
方法返回application
隱式對象
getSession
方法返回session
隱式對象
getOut
方法返回out
隱式對象
提供了簡易方法
pageContext.forward(“2.jsp”);//轉發 request.getRequestDispatcher().forward();
pageContext.include(“2.jsp”);//動態包含
EL表達式
EL概述和基本語法
EL表達式:Expression Language表達式語言
目的:簡化jsp中java代碼開發,代替腳本表達式<%=username%>
它不是一種開發語言,是jsp中獲取數據的一種規範
格式如: ${EL表達式}
等價於<%=pageContext.findAttribute(name)%>
EL的具體功能:
案例一: 簡單獲取數據
<%
//不同方式向域中存數據
pageContext.setAttribute("username","張三");
request.setAttribute("age","18");
session.setAttribute("phone","188888888");
application.setAttribute("address","深圳");
%>
<%--案例一:簡單獲取數據--%>
<%=pageContext.getAttribute("username")%>
<%=request.getAttribute("age")%>
<%=session.getAttribute("phone")%>
<%=application.getAttribute("address")%>
<%--EL表達式獲取數據--%>
${username}
${age}
${phone}
${address}
案例二: 獲取對象數據
<%
User user = new User("張三",18,"1888888888");
pageContext.setAttribute("user",user);
%>
${user.name}
${user.age}
${user.phone}
案例三: 使用list和map集合
注意:數字需要括號引號包起來
<%
ArrayList<String> list = new ArrayList<>();
list.add("張三");
list.add("李四");
list.add("趙五");
list.add("王麻子");
pageContext.setAttribute("list",list);
%>
${list[0]}
${list[1]}
${list[2]}
${list[3]}
<%
Map<String,String> map = new HashMap<>();
map.put("NO001","張三");
map.put("NO002","李四");
map.put("NO003","趙五");
map.put("004","王麻子");
pageContext.setAttribute("map",map);
%>
${map.NO001}
${map.NO002}
${map.NO003}
//數字需要括號引號
${map["004"]}
表達式:
<%--三目運算--%>
${score>80?"優秀":"加油!"}
<%--隱式對象--%>
上下文路徑:${pageContext.request.contextPath}
隱式對象(11個)
JSP 表達式語言定義了一組隱式對象,其中許多對象在 JSP servlet和表達式中可用:
pageContext: 頁面上下文,可以獲取jsp中其他八個內置對象
pageScope、requestScope、sessionScope、applicationScope表示四個域對象中集合
param
表示request.getParameter(“username”); ${param.username}
paramvalues
表示request.getPrameterValues(“hobby”); ${paramValues.hobby}
header
表示 request.getHeader(“accept”); ${header.accept};
headerValues
表示 request.getHeaderValues(“accept-encoding”); ${headerValues[“accept-encoding”][0]}
cookie
表示 request.getCookies(); ${cookie.JSESSIONID}
initParam
表示 ServletContext(application)初始化參數
JSTL
JSTL:全稱Java Server Pages Standard Tag Library,JSP標準標籤庫,代替jsp頁面的腳本,實現邏輯控制。
JSTL的作用
實現JSP頁面中邏輯處理。如判斷, 循環等;
下載JSTL庫:https://archive.apache.org/dist/tomcat/taglibs/
把jstl.jar、standard.jar放入WEB-INF/lib目錄下
使用JSTL
必須在JSP頁面添加tablib指令庫
<% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c">
常用標籤介紹
通用標籤set,out,remove
<!-- 基礎標籤:聲明變量,輸出變量,移除變量,變量默認值 -->
<h3>基礎標籤:聲明變量,輸出變量,移除變量,變量默認值</h3>
<!--1.聲明變量k var:是變量名 value:變量的值(必須是EL表達式)-->
<c:set var="k" value="${1+1}"></c:set>
<!--2.輸出變量k value:使用EL表示表示變量-->
移除前輸出的內容:<c:out value="${k}"></c:out><br>
<!--3.移除指定變量 -->
<c:remove var="k"/>
移除後輸出的內容:<c:out value="${k}"></c:out><br>
<!--4.給指定變量賦默認值 -->
默認值:<c:out value="${m}" default="123456"></c:out>
<%--向域中設置數據--%>
<c:set var="username" value="張三" ></c:set>
<c:set var="address" value="深圳" ></c:set>
<%--標籤內容會被輸出,不安全--%>
<%--<c:set var="content" value="<script type='text/javascript'> alert('歡迎使用JSTL')</script>" ></c:set>--%>
${username}
${address}
${content}
<c:out value="<script type='text/javascript'> alert('歡迎使用JSTL')</script>" ></c:out>
<c:remove var="content" ></c:remove>
條件標籤if,choose
<c:if test="${empty user}">沒有登錄</c:if>
<c:choose>
<h3>條件標籤:choose(等價於java中switch)</h3>
<%-- 測試成績等級 >90 優秀 >80 良好 >70 中等 >60及格--%>
<c:set var="score" value="80"></c:set>
<c:choose>
<c:when test="${score>=90 }">優秀</c:when>
<c:when test="${score>=80 }">良好</c:when>
<c:when test="${score>=70 }">中等</c:when>
<c:when test="${score>=60 }">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
迭代標籤foreach
for基礎遍歷
<!-- 遍歷for:輸出1到10 的值 -->
<!--var: 變量,把遍歷的每一個值都存儲在變量中進行輸出
begin:開始 如果是變量使用EL表達式表示
end:結束 如果是變量使用EL表達式表示
step:間隔的長度
for( int i=0;i<10;i++){
System.out.println(i);
}
-->
示例代碼:
<c:forEach var="i" begin="1" end="10" step="2">
${i}<br>
</c:forEach>
foreach遍歷
<h3>測試list集合遍歷獲取學生列表</h3>
<table border="1" width="80%" bordercolor="red" cellspacing="0"
align="center">
<tr>
<th>學號</th>
<th>姓名</th>
<th>成績</th>
<th>班級</th>
<th>是否是第一個</th>
<th>是否是最後一個</th>
<th>計數count</th>
<th>索引index</th>
</tr>
<!-- varStatus:變量狀態:遍歷出的每一項內容的狀態:
isFirst() first
isLast() last
getCount() count 計數 重要的
getIndex() index
-->
<!-- var :遍歷出的每一項使用變量先存儲
items:集合(使用El表達式)
-->
<c:forEach var="stu" items="${students}" varStatus="vs">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.score}</td>
<td>${stu.classes}</td>
<td>${vs.first}</td>
<td>${vs.last}</td>
<td>${vs.count}</td>
<td>${vs.index}</td>
</tr>
</c:forEach>
</table>
url標籤
<c:url var="" value="">
舉例:
<c:url var="loc" value="/stu.jsp">
<c:param name="username" value="張三"></c:param>
</c:url>
<a href="${loc}">學生列表</a>