JSP概念、EL表達式與JSTL標籤

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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章