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技術
-
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的值
-
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