1. 程式人生 > >JavaEE之動態頁面技術(JSP/EL/JSTL)

JavaEE之動態頁面技術(JSP/EL/JSTL)

add 引入 gis 參數 運行原理 param bin light 其他

動態頁面技術(JSP/EL/JSTL)

JSP技術

jsp腳本和註釋

jsp腳本:

1)<%java代碼%> ----- 內部的java代碼翻譯到service方法的內部

2)<%=java變量或表達式> ----- 會被翻譯成service方法內部out.print()

3)<%!java代碼%> ---- 會被翻譯成servlet的成員的內容

jsp註釋: 不同的註釋可見範圍是不同

1)Html註釋:<!--註釋內容--> ---可見範圍 jsp源碼、翻譯後的servlet、頁面顯示html源碼

2)java註釋://單行註釋 /*多行註釋*/ --可見範圍 jsp源碼 翻譯後的servlet

3)jsp註釋:<%--註釋內容--%> ----- 可見範圍 jsp源碼可見

jsp運行原理-----jsp本質就是servlet(面試)

jsp在第一次被訪問時會被Web容器翻譯成servlet,在執行

過程:

第一次訪問---->helloServlet.jsp---->helloServlet_jsp.java---->編譯運行

PS:被翻譯後的servlet在Tomcat的work目錄中可以找到

jsp指令(3個)

jsp的指令是指導jsp翻譯和運行的命令,jsp包括三大指令:

1)page指令 --- 屬性最多的指令(實際開發中page指令默認)

屬性最多的一個指令,根據不同的屬性,指導整個頁面特性

格式:<%@ page 屬性名1= "屬性值1" 屬性名2= "屬性值2" ...%>

常用屬性如下:

language:jsp腳本中可以嵌入的語言種類

pageEncoding:當前jsp文件的本身編碼---內部可以包含contentType

contentType:response.setContentType(text/html;charset=UTF-8)

session:是否jsp在翻譯時自動創建session

import:導入java的包

errorPage:當當前頁面出錯後跳轉到哪個頁面

isErrorPage:當前頁面是一個處理錯誤的頁面

2)include指令

頁面包含(靜態包含)指令,可以將一個jsp頁面包含到另一個jsp頁面中

格式:<%@ include file="被包含的文件地址"%>

3)taglib指令

在jsp頁面中引入標簽庫(jstl標簽庫、struts2標簽庫)

格式:<%@ taglib uri="標簽庫地址" prefix="前綴"%>

jsp內置/隱式對象(9個)----- 筆試

jsp被翻譯成servlet之後,service方法中有9個對象定義並初始化完畢,我們在jsp 腳本中可以直接使用這9個對象

名稱

類型

描述

out

javax.servlet.jsp.JspWriter

用於頁面輸出

request

javax.servlet.http.HttpServletRequest

得到用戶請求信息,

response

javax.servlet.http.HttpServletResponse

服務器向客戶端的回應信息

config

javax.servlet.ServletConfig

服務器配置,可以取得初始化參數

session

javax.servlet.http.HttpSession

用來保存用戶的信息

application

javax.servlet.ServletContext

所有用戶的共享信息

page

java.lang.Object

指當前頁面轉換後的Servlet類的實例(在普通類中的this)

pageContext

javax.servlet.jsp.PageContext

JSP的頁面容器

exception

java.lang.Throwable

表示JSP頁面所發生的異常,在錯誤頁中才起作用

out對象

out的類型:JspWriter

out作用就是向客戶端輸出內容----out.write()

out緩沖區默認8kb 可以設置成0 代表關閉out緩沖區 內容直接寫到respons緩沖 器

pageContext對象

jsp頁面的上下文對象,作用如下:

page對象與pageContext對象不是一回事

1)pageContext是一個域對象

setAttribute(String name,Object obj)

getAttribute(String name)

removeAttrbute(String name)

pageContext可以向指定的其他域中存取數據

setAttribute(String name,Object obj,int scope)(scope範圍)

getAttribute(String name,int scope)

removeAttrbute(String name,int scope)

findAttribute(String name)

---依次從pageContext域,request域,session域,application域中獲 取屬性,在某個域中獲取後將不在向後尋找

jsp四大作用域的總結:

pageContext域:當前jsp頁面範圍

request域:一次請求

session域:一次會話

application域:整個web應用

2)可以獲得其他8大隱式對象

例如: pageContext.getRequest()

pageContext.getSession()

jsp標簽(動作)

1)頁面包含(動態包含):<jsp:include page="被包含的頁面"/>

2)請求轉發:<jsp:forward page="要轉發的資源" />

靜態包含與動態包含的區別?

EL技術

EL 表達式概述

EL(Express Lanuage)表達式可以嵌入在jsp頁面內部,減少jsp腳本的編寫,EL 出現的目的是要替代jsp頁面中腳本的編寫。

EL從域中取出數據(EL最重要的作用)

jsp腳本:<%=request.getAttribute(name)%>

EL表達式替代上面的腳本:${requestScope.name}

EL最主要的作用是獲得四大域中的數據,格式${EL表達式}

EL獲得pageContext域中的值:${pageScope.key};

EL獲得request域中的值:${requestScope.key};

EL獲得session域中的值:${sessionScope.key};

EL獲得application域中的值:${applicationScope.key};

EL從四個域中獲得某個值${key};

---同樣是依次從pageContext域,request域,session域,application域中 獲取屬性,在某個域中獲取後將不在向後尋找

1)獲得普通字符串

2)獲得User對象的值

3)獲得List<User>的值

<!-- 模擬域中的數據 -->
<%
	pageContext.setAttribute("name", "pageContxt");
	//存儲字符串
	request.setAttribute("name", "request");
	//存儲一個對象
	Users user=new Users();
	user.setId(1);
	user.setUsername("lisi");
	user.setPwd("123");
	session.setAttribute("user", user);
	//存儲一個集合
	List<Users> list=new ArrayList<Users>();
	Users user1=new Users();
	user1.setId(1);
	user1.setUsername("wangwu");
	user1.setPwd("123");
	list.add(user1);
	Users user2=new Users();
	user2.setId(1);
	user2.setUsername("zhaoliu");
	user2.setPwd("123");
	list.add(user2);
	application.setAttribute("List", list);
%>
<hr>
<!-- 使用腳本取出域中的值 -->
<%=request.getAttribute("name") %>
<%Users u=(Users)session.getAttribute("user");
	out.write(u.getUsername());
%>
<hr>
<!-- 使用EL表達式取出域中的值 -->
${requestScope.name}
${sessionScope.user.username}
${applicationScope.List[0].pwd}
<hr>
<!-- 使用el表達式 全域查找(會從最小的找,底層就是findAttribute()) -->
${name }
${user.username}
${List[0].pwd}

EL的內置對象11個

pageScope,requestScope,sessionScope,applicationScope

---- 獲取JSP中域中的數據

param,paramValues - 接收參數.

相當於request.getParameter() request.getParameterValues()

header,headerValues - 獲取請求頭信息

相當於request.getHeader(name)

initParam - 獲取全局初始化參數

相當於this.getServletContext().getInitParameter(name)

cookie - WEB開發中cookie

相當於request.getCookies()---cookie.getName()---cookie.getValue()

Form.html

<form action="/WEB02/form.jsp" method="get">
	<input type="text" name="username">
	<input type="text" name="password">
	<input type="submit" value="提交">
</form>

Form.jsp

<!-- 獲得表單的參數 -->
<% 
	request.getParameter("username");
	//.....
%>
<!-- 使用EL獲得參數 -->
	${param.username }
	${header["User-Agent"] }
	${cookie.abc.value }
<!-- 通過el表達式獲得request對象 -->
	<%--${requestScope } --%>
	${pageContext.request }
	

Cookie.jsp

<%
		Cookie cookie=new Cookie("abc","zhangsan");
		response.addCookie(cookie);
	%>

Index.jsp

<form action="${pageContext.request.contextPath }/form.jsp" method="get">
	<input type="text" name="username">
	<input type="text" name="password">
	<input type="submit" value="提交">
</form>

pageContext - WEB開發中的pageContext.

pageContext獲得其他八大對象

${pageContext.request.contextPath}

EL執行表達式

例如:

${1+1}

${empty user}

${user==null?true:false}

JSTL技術

JSTL概述

JSTL(JSP Standard Tag Library),JSP標準標簽庫,可以嵌入在jsp頁面中使用標簽的形式完成業務邏輯等功能。jstl出現的目的同el一樣也是要代替jsp頁面中的腳本代碼。JSTL標準標準標簽庫有5個子庫,但隨著發展,目前常使用的是他的核心庫

標簽庫

標簽庫的URI

前綴

Core

http://java.sun.com/jsp/jstl/core

c

I18N

http://java.sun.com/jsp/jstl/fmt

fmt

SQL

http://java.sun.com/jsp/jstl/sql

sql

XML

http://java.sun.com/jsp/jstl/xml

x

Functions

http://java.sun.com/jsp/jstl/functions

fn

JSTL下載與導入

JSTL下載:

從Apache的網站下載JSTL的JAR包。進入 “http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/”網址下載 JSTL的安裝包。jakarta-taglibs-standard-1.1.2.zip,然後將下載好的JSTL安裝包 進行解壓,此時,在lib目錄下可以看到兩個JAR文件,分別為jstl.jar和standard.jar。 其中,jstl.jar文件包含JSTL規範中定義的接口和相關類,standard.jar文件包含用於 實現JSTL的.class文件以及JSTL中5個標簽庫描述符文件(TLD)

技術分享圖片

將兩個jar包導入我們工程的lib中

使用jsp的taglib指令導入核心標簽庫

技術分享圖片

JSTL核心庫的常用標簽

1)<c:if test=””>標簽

其中test是返回boolean的條件

<%request.setAttribute("count", 10); %>
<!--jstl標簽經常會和el配合使用  -->
<!-- test代表的返回boolean的表達式 -->
<c:if test="${count==10 }">
	xxxx
</c:if>

Index.jsp

<!-- 用戶沒有登陸 -->
<c:if test="${empty user }">
	<a href="login.jsp">登陸</a>
	<a href="register.jsp">註冊</a>
</c:if>
<!-- 用戶已經登陸 -->
<c:if test="${!empty user }">
	<span>${user.name }</span>
	<a href="#">退出</a>
</c:if>

Ceshi.jsp

<%
	//模擬用戶已經登錄成功
	User user=new User();
	user.setId(100);
	user.setName("張三");
	user.setPwd("123");
	session.setAttribute("user", user);
%>

1)<c:forEach>標簽

使用方式有兩種組合形式:

技術分享圖片

<!-- 模擬增強for  productList---List<Product>
	for(Product product:productList){
		System.out.print(product.getName());
	}
-->
<!-- items:一個集合或數組(從域中選)   var:代表集合中的某一個元素 -->
<c:forEach items="${productList }" var="pro">
	${pro.name }
</c:forEach>

 

示例:

1)遍歷List<String>的值

2)遍歷List<User>的值

3)遍歷Map<String,String>的值

4)遍歷Map<String,User>的值

5)遍歷Map<User,Map<String,User>>的值

entry.key-----User

entry.value------List<String,User>

javaEE的開發模式

什麽是模式

模式在開發過程中總結出的“套路”,總結出的一套約定俗成的設計模式

javaEE經歷的模式

model1模式:

技術組成:jsp+javaBean

model1的弊端:隨著業務復雜性 導致jsp頁面比較混亂

model2模式

技術組成:jsp+servlet+javaBean

model2的優點:開發中 使用各個技術擅長的方面

servlet:擅長處理java業務代碼

jsp:擅長頁面的實現

MVC:---- web開發的設計模式

M:Model---模型 javaBean:封裝數據

V:View-----視圖 jsp:單純進行頁面的顯示

C:Controller----控制器 Servelt:獲取數據--對數據進行封裝--傳遞數據--指派顯示的jsp頁面

javaEE的三層架構

服務器開發時 分為三層

web層:與客戶端交互

service層:復雜業務處理

dao層:與數據庫進行交互

開發實踐時 三層架構通過包結構體現

MVC與JavaEE三層架構有什麽關系?

總結:

EL表達式

從域中取出數據 ${域中存儲的數據的name}

${pageContext.request.contextPath}

JSTL標簽(核心庫)

<%@ taglib uri=”” prefix=”c”%>

<c:if test=””>

<c:forEach items=”數組或集合” var=”數組或集合中的每一個元素”>

javaEE三層架構+MVC

web層:收集頁面數據,封裝數據,傳遞數據,指定響應jsp頁面

service層:邏輯業務代碼的編寫

dao層:數據庫的訪問代碼的編寫

 

  

  

  

  

  

  

  

  

JavaEE之動態頁面技術(JSP/EL/JSTL)