天天看點

JSP&EL&JSTL筆記JSPjsp标簽(動作)JavaWeb-四大域對象複習EL技術JSTLJavaEE的開發模式

JSP

Java Server Pages,java伺服器頁面,其根本是一個簡化的Servlet設計。JSP技術是一種動态頁面技術,它的主要目的是将表示邏輯從Servlet中分離出來。

servlet技術:在java代碼中嵌入html

開發動态web工程時, Servlet技術,但是 生成html頁面很繁瑣

php asp(.net)—在html中嵌入相應語言

jsp技術:html輸出是比較便捷,就在html中嵌入java代碼

servlet技術:擅長編寫java代碼

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時,該JSP如果是第一次被通路,去Webcontent容器下的web.xml找有沒有與其對應的java檔案,有則直接用此java檔案響應,沒有則把JSP翻譯成對應的Servlet.java檔案,再在此java檔案上進行響應

JSP指令

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類的執行個體
pageContext javax.servlet.jsp.PageContext JSP的頁面容器
exception java.lang.Throwable 表示JSP頁面所發生的異常,在錯誤頁中才起作用

(1)out對象

out的類型:JspWriter

out作用就是想用戶端輸出内容----out.write() 内容寫入out緩沖區再寫入response緩沖區

out緩沖區預設8kb 可以設定成0 代表關閉out緩沖區 内容直接寫到respons緩沖器

(2)config對象

config對象是ServletConfig類的一個對象

ServletConfig:代表目前Servlet在web.xml中的配置資訊(用的不多)

String getServletName() – 擷取目前Servlet在web.xml中配置的名字

String getInitParameter(String name) – 擷取目前Servlet指定名稱的初始化參數的值

Enumeration getInitParameterNames() – 擷取目前Servlet所有初始化參數的名字組成的枚舉

ServletContext getServletContext() – 擷取代表目前web應用的ServletContext對象

(8)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)

getAttribute(String name,int scope)

removeAttrbute(String name,int scope)

findAttribute(String name) ---依次從pageContext域,request域,session域,application域中擷取屬性,在某個域中擷取後将不在向後尋找

四大作用域的總結:

page域:目前jsp頁面範圍

request域:一次請求

session域:一次會話

application域:整個web應用

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

例如: pageContext.getRequest()

pageContext.getSession()

jsp标簽(動作)

1)頁面包含(動态包含):<jsp:include page=“被包含的頁面”/>

靜态包含<%@include file=""%>

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

靜态包含與動态包含的差別?

JavaWeb-四大域對象複習

四個域的作用域範圍大小:

PageContext (page域) < request < session <servletContext(application域)

一、ServletContext

1、生命周期:當Web應用被加載進容器時建立代表整個web應用的ServletContext對象,當伺服器關閉或Web應用被移除時,ServletContext對象跟着銷毀。

建立:該web應用被加載(伺服器啟動或釋出web應用(前提,伺服器啟動狀态))

銷毀:web應用被解除安裝(伺服器關閉,移除該web應用)

2、作用範圍:整個Web應用。(所有的web資源都可以随意向 servletcontext域中存取資料,資料可以共享)

3、常用功能:

a)在不同Servlet 之間轉發

b)讀取資源檔案。

 

c)獲得web應用中任何資源的絕對路徑

String path = context.getRealPath(相對于該web應用的相對位址);

二、Request 域

1、生命周期:在service 方法調用前由伺服器建立,傳入service方法。整個請求結束,request生命結束。

建立:通路時建立request

銷毀:響應結束request銷毀

2、作用範圍:整個請求鍊(請求轉發也存在)。一次請求中

3、常用功能: 在整個請求鍊中共享資料。例如在Servlet 中處理好的資料交給Jsp顯示,此時參數就可以放置在Request域中帶過去。

三、Session 域

1、生命周期:在第一次調用 request.getSession() 方法時,伺服器會檢查是否已經有對應的session,如果沒有就在記憶體 中建立一個session并傳回。當一段時間内session沒有被使用(預設為30分鐘),則伺服器會銷毀該session。如果伺服器非正常關閉(強行關閉),沒有到期的session也會跟着銷毀。如果調用session提供的invalidate(),可以立即銷毀session。

用戶端通路服務端,伺服器端在執行到request.getSession()時判斷有沒有屬于該用戶端的session區域,有則不建立,無則建立新的session對象

銷毀:

1)伺服器(非正常)關閉時

2)session過期/失效(預設30分鐘)

3)手動銷毀session

session.invalidate();

注意:伺服器正常關閉,再啟動,Session對象會進行鈍化和活化操作。同時如果伺服器鈍化的時間在session 預設銷毀時間之内,則活化後session還是存在的。否則Session不存在。如果JavaBean 資料在session鈍化時,沒有實作Serializable 則當Session活化時,會消失。

2、作用範圍:預設在一次會話中,也就是說在,一次會話中任何資源公用一個session對象

3、常用功能:為浏覽器建立獨一無二的記憶體空間,在其中儲存會話相關的資訊。

四、PageContext 域

1、生命周期:當對JSP的請求時開始,當響應結束時銷毀。

2、作用範圍:整個JSP頁面,是四大作用域中最小的一個,即超過這個頁面就不能夠使用了。(是以使用pageContext對象向其它頁面傳遞參數是不可能的.)

3、常用功能:

(1)擷取其它八大隐式對象,可以認為是一個入口對象。

(2)擷取其所有域中的資料

(3)跳轉到其他資源,其身上提供了forward和include方法,簡化重定向和轉發的操作。

EL技術

  1. EL 表達式概述

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

  2. 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的值

  1. EL的内置對象11個

    pageScope,requestScope,sessionScope,applicationScope

    ---- 擷取JSP中域中的資料

    param,paramValues - 接收參數.

    ---------相當于request.getParameter() rrquest.getParameterValues()

    header,headerValues - 擷取請求頭資訊

    ---------相當于request.getHeader(name) eg:${header[“User-Agent”]}

    initParam - 擷取全局初始化參數(配置參數)

    ---------相當于this.getServletContext().getInitParameter(name)

    cookie - WEB開發中cookie

    ---------相當于request.getCookies()—cookie.getName()—cookie.getValue()

    pageContext - WEB開發中的pageContext.

    pageContext獲得其他八大對象

${pageContext.request.contextPath}取出部署的應用程式名或者是目前的項目名稱

相當于

<%=pageContext.getRequest().getContextPath%> 這句代碼不能實作getRequest不是HttpServletRequest不能獲得WEB應用的名稱

4.EL執行表達式

例如:

${1+1}

${empty user}判斷user是否為空,傳回true false

${user==null?true:false}

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

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

<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c”%>

JSTL核心庫的常用标簽

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

其中test是傳回boolean的條件

<!-- jstl标簽經常會和el配合使用 -->
	<!-- test代表的傳回boolean的表達式 -->
	<c:if test="${count==9 }">
		xxxx
	</c:if>
           

2)<c:forEach>标簽

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

<!-- forEach模拟
		for(int i=0;i<=5;i++){
			syso(i)
		}
	 -->
	 <c:forEach begin="0" end="5" var="i">
	 	${i }<br/>
	 </c:forEach>
	
	<!-- 模拟增強for    productList---List<Product>
		for(Product product : productList){
			syso(product.getPname());
		}
	 -->
	 <!-- items:一個集合或數組   var:代表集合中的某一個元素-->
	 <c:forEach items="${productList }" var="pro">
	 	${pro.pname }
	 </c:forEach>
           

示例:

<%
		//模拟List<String> strList
		List<String> strList = new ArrayList<String>();
		strList.add("itcast");
		strList.add("itheima");
		strList.add("boxuegu");
		strList.add("shandingyu");
		request.setAttribute("strList", strList);
		
		//周遊List<User>的值
		List<User> userList = new ArrayList<User>();
		User user1 = new User();
		user1.setId(2);
		user1.setName("lisi");
		user1.setPassword("123");
		userList.add(user1);
		User user2 = new User();
		user2.setId(3);
		user2.setName("wangwu");
		user2.setPassword("123");
		userList.add(user2);
		application.setAttribute("userList", userList);
		
		//周遊Map<String,String>的值
		Map<String,String> strMap = new HashMap<String,String>();
		strMap.put("name", "lucy");
		strMap.put("age", "18");
		strMap.put("addr", "西三旗");
		strMap.put("email", "[email protected]");
		session.setAttribute("strMap", strMap);
		
		//周遊Map<String,User>的值
		Map<String,User> userMap = new HashMap<String,User>();
		userMap.put("user1", user1);
		userMap.put("user2", user2);
		request.setAttribute("userMap", userMap);
	%>
           

1)周遊

List<String>

的值

<h1>取出strList的資料</h1>
	<c:forEach items="${strList }" var="str">
		${str }<br/>
	</c:forEach>
           

2)周遊

List<User>

的值

<h1>取出userList的資料</h1>
	<c:forEach items="${userList}" var="user">
		user的name:${user.name }------user的password:${user.password }<br/>
	</c:forEach>
           

3)周遊

Map<String,String>

的值

<h1>取出strMap的資料</h1>
	<c:forEach items="${strMap }" var="entry">
		${entry.key }====${entry.value }<br/>
	</c:forEach>
           

4)周遊

Map<String,User>

的值

<h1>取出userMap的資料</h1>
	<c:forEach items="${userMap }" var="entry">
		${entry.key }:${entry.value.name }--${entry.value.password }<br/>
	</c:forEach>
           

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:擅長頁面的實作,頁面輸出

JavaBean

JavaBeans是Java中一種特殊的類(一個可複用的類),可以将多個對象封裝到一個對象(bean)中。特點是可序列化,提供無參構造器,提供getter方法和setter方法通路對象的屬性。名稱中的“Bean”是用于Java的可重用軟體元件的慣用叫法。

會提供擷取屬性和設定屬性的get/set方法JavaBean是一種JAVA語言寫成的可重用元件。為寫成JavaBean,類必須是具體的和公共的,并且具有無參數的構造器。

其他Java類可以通過自省機制(反射機制)發現和操作這些JavaBean的屬性

特性

1、所有屬性為private

2、提供預設構造方法

3、提供getter和setter

4、實作serializable接口

  JavaBean可分為兩種:一種是有使用者界面(UI,UserInterface)的JavaBean;還有一種是沒有使用者界面,主要負責處理事務(如資料運算,操縱資料庫)的JavaBean。JSP通常通路的是後一種JavaBean。

MVC: web開發的設計模式

M:Model—模型 javaBean:封裝資料,稱為資料層,就是用來設定資料的屬性和一些行為

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

C:Controller----控制器 Servelt:擷取資料–對資料進行封裝–傳遞資料-- 指派顯示的jsp頁面

javaEE的三層架構

伺服器開發時 分為三層

web層:與用戶端互動---------(控制層) 收集頁面資料,封裝資料,傳遞資料,指定響應jsp頁面

service層:複雜業務處理-----(業務層) 邏輯業務代碼的編寫

dao層:與資料庫進行互動—(資料層) 資料庫的通路代碼的編寫

(Data Access Objec面向資料)

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

MVC與三層架構的關系?

沒有關系,MVC是WEB開發中的設計模式,而三層架構是JavaEE中的設計模式,WEB層開發中使用JavaBean封裝資料,jsp進行頁面輸出,servlet擷取封裝并傳遞資料到指定頁面,三個技術組合在一起就是MVC模式,所有MVC也可以說是WEB層技術。

Web層技術 ---------Service技術------------Dao層技術

struts2----------------Spring-------------------hibernate

SpringMVC-------------------------------------mybatis