JSP
jsp(javascript page)服務端腳本語言,用於寫動態網頁。就是可以在html中寫java代碼。
一個JSP頁面是由傳統的HTML頁面標記加上JSP標記和嵌入的Java代碼組成
由以下4種元素組成:HTML標記、JSP標記、JSP腳本和註釋。
執行過程:
第一次訪問:jsp -> java(servlet文件) -> .class
第二次訪問:直接訪問.class文件
tips: 所以第一次訪問網頁都比較慢,後面後好點了,如果服務端代碼修改時,服務器會重新編譯。
架構
CS:Client Server
BS:Browser Server
內容較多,可查看:cs和bs架構的區別
tomcat服務器
目錄結構:
bin
:可執行文件都放在這(startup.bat開啓服務器 shutdown.bat關閉服務器)
只有開啓了服務器才能夠訪問部署在tomcat的網頁
conf
:(configure)配置文件都放在這
lib
:tomcat依賴的jar文件
log
:日誌文件
temp
:臨時文件
webapps
:可執行的項目(一般我們的項目都放在這裏面)
work
:存放由jsp翻譯成java以及編譯後的class文件
常見狀態碼
200:一切正常
404:資源不存在
403:權限不足
3開頭:重定向
5開頭:服務器內部出錯(一般是代碼寫錯)
虛擬路徑
先來看看conf/server.xml文件中常用的一些配置吧
很多人不知道去哪裏看自己設置的端口號或者想要自己重新設置端口號,這裏就可以解決你的問題!
那我們再來看看一張圖:
所以我們在輸入url的時候需要localhost:端口號/文件夾/文件名
<welcome-file-list>
服務器一開始是怎麼知道哪些文件是默認文件的呢?
原來在WEB-INF/web.xml中設置了 默認的 初始頁面
<welcome-file-list>
<!--你也可以添加一些默認的初始頁面-->
<welcome-file>index.jsp</welcome-file>
<welcome-file-list>
當你輸入localhost:端口號時,服務器會先在這裏找文件,如果沒有找到就404
JSP中寫java代碼
<%@ %>、<% %>,<%= %>,<%! %>跟<%-- --%>標籤
<%@ 指令%>
:指令標籤,將有關頁面的特殊處理信息傳送到JSP容器,告訴容器如何處理JSP網頁。
指令主要包括:page 指令
、include 指令
和taglib指令
page指令:用來定義和操作許多重要的依賴於頁面的屬性,這些屬性影響整個JSP文件
語法:<%@ page 一些配置屬性 %>
其屬性:
- language: 指定jsp頁面使用的腳本語言
- import: 導入類或包,導入多個時用
,
分割。如果不寫該屬性,JSP頁面自動引入以下4個包:java.servlet.*; java.lang.*; java.servlet.http.*; java.servlet.jsp.*; - pageEncoding: 指定jsp文件本身的編碼
- contentType: 指定瀏覽器解析jsp的編碼
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
include指令:引入靜態資源文件。
語法:<%@ include file="relativeURL" %>
注意事項:
- 可以讓頁面內容分成幾個組成部分分別管理。
- 被包含文件的URL路徑一定是和發出指令的JSP頁面相對的路徑,即這些文件應該和當前JSP頁面在同一個Web應用中。
- 該指令採取的是靜態插入方式,所謂靜態插入,是指當前的JSP頁面和被嵌入的文件合併成一個新的JSP頁面,然後JSP引擎再將這個新頁面轉換成Servlet。
taglib指令:自定義指令
語法:<%@ taglib uri ="tagLibraryURI" prefix = "tagPrefix" %>
其中uri是用戶自定義標記所在的標記庫描述文件的url地址,prefix是標記庫描述文件的前綴
有關自定義指令更詳細的內容可自行百度。
<% %>
:可編寫java代碼塊以及定義局部變量
- 一個JSP頁面可以有多個代碼段,它們被JSP引擎按順序執行,並且這些代碼段之間可以插入一些標記元素。
- 在代碼段中也可以聲明變量,但這些變量是_jspService()中的局部變量,它們在JSP頁面內所有代碼段部分和表達式部分有效。
- 當客戶請求一個JSP頁面時,JSP引擎爲每個客戶產生一個線程,每個線程分別執行各自的_jspService()方法,因此一個客戶對局部變量的操作不會影響其它客戶。
<% // 這裏定義局部變量,常規java代碼
init(9);
for(int i = 0; i < 3; i++){
// 換行用<br/>
out.print(i*i + "<br/>");
%>
<%= %>
稱爲輸出表達式 功能與out.print()等價
<%=
// 可以在這裏寫一些簡單的表達式
"你好啊" + name
%>
<%! %>
一般在此定義/聲明全局變量,方法
<%!
public String name;
public void init(int n){
name = "codekiang" + n;
}
%>
注意:out.print()以及輸出表達式可以解析html標籤
<%-- --%>
註釋標籤,網頁中不可見。
<%--
<%@ page %> => page 指令
--%>
到了這裏,一些代碼你就可以得心應手的寫出來啦。那麼如果遇到需要在java代碼中寫html標籤那該怎麼辦呢?
我們可以這樣做:
<% // 這裏定義局部變量,常規java代碼
for(int i = 0; i < 3; i++){
out.print("哈哈哈")
%>
<h2>CodeKiang好帥</h2>
<% }%>
這是我們可以把java代碼用<% %>
分開來,中間寫html標籤。
注意項:以上出現的標籤%跟其他符號之間都不能存在空格,如<%= %>以及<%! %>中的%跟!,=之間不要有空格!!
九大內置對象
jsp的九大內置對象(不用new就可以直接使用的對象)
out、request、response、session、application、page、pagecontent、config、exception
out
:輸出對象,向客戶端輸出內容
request
:請求對象,存儲“客戶端向服務端發送的請求信息”,數據只在同一次請求有效
常見方法:
String getParameter(String name):根據請求字段名返回字段值
String[] getParameterValues(String name):根據字段名返回多個值
void setcharacterEncoding(“編碼格式”):設置請求服務器時所用編碼,如UTF-8
void getRequestDispacher(“路徑”).forward(request,response):請求轉發,即跳轉到其他頁面
Cookie[] get Cookies():獲取多個cookie
response
:響應對象
常見方法:
void addCookie(Cookie cookie):服務端向客戶端增加cookie對象
void sendRedirect(“路徑”):重定向
void setContentType(“編碼格式”):設置服務端響應的編碼,如text/html;charset=UTF-8
tips:重定向與請求轉發的區別
重定向:數據丟失 地址跳轉
請求轉發:保留數據 並且仍然保留轉發時的頁面
session
:會話對象,同一會話共享數據 (注意:cookie不是內置對象)
用戶第一次訪問服務端時會自動產生一個session對象(擁有唯一sessionID)和cookie,
此時cookie的name=JSESSIONID,value=sessionID的值
客戶端的cookie跟服務端的session一一對應就是靠JSESSIONID跟sessionID進行匹配
若匹配失敗則創建session對象。
cookie和session的區別:
session cookie
保存的位置 服務端 客戶端
安全性 較安全 較不安全
保存的內容 Object String
常用方法:
String getID():獲取sessionID
boolean isNew():判斷是否第一次訪問
void invalidate():註銷session
setMaxInactiveInterval(秒):設置最大非活動時間
int getMaxInactiveInterval(秒):獲取最大非活動時間
void setAttribute(key,value) :設置屬性
Object getAttribute(key) :獲取屬性
application
:全局對象
常見方法:
Object getAttribute(String name):根據屬性名獲取屬性值
void setAtrribute(String name,Object obj):新增屬性
void removeAttribute(String name) :根據屬性名刪除屬性
config
:配置對象(如服務器位置信息)
page
:當前JSP頁面對象(相當於java的this)
pageContent
:JSP頁面的上下文,常用於調用其他內置對象
ServletResponse getResponse(): 獲取response對象
ServletRequest getRequest(): 獲取request對象
HttpSession getsession():獲取session對象
exception
:異常對象
四大範圍對象(小->大):
- pageContent 當前頁面有效
- request 同一請求有效
- session 同一會話有效
- application 全局有效
共有方法:
Object getAttribute(String name) 根據屬性名獲取屬性值
void setAtrribute(String name,Object obj) 新增或創建
void removeAttribute(String name) 根據屬性名刪除屬性
cookie
:由服務端生成再發送給客戶端保存,除了自定義的cookie之外,還有自帶JSESSION的cookie
創建cookie對象:new Cookie(key,value)
獲取key:getName()
獲取值:getValue()
設置最大有效期:setMaxAge(int time)
JavaBean
與數據庫操作時,通常會把需要操作的數據封裝成一個javaBean。以提高代碼的複用性和減輕jsp複雜度
javaBean定義(必須同時滿足以下兩點):
- public修飾的類,public修飾的無參構造
- 所有屬性(如果有)都是private修飾,並且都提供了set跟get方法。(boolean:get替換成is)
javaBean分爲兩大類:
- 封裝業務邏輯的javaBean(Dao層)
- 封裝數據的javaBean(實體類) 對應數據庫的一張表
tips:
-
xxxDao.java的一般是跟數據庫操作有關的
-
如果jsp出現錯誤:The import xxx cannot be resolved
嘗試解決方案:
1. 可能沒有給類創建一個包,爲其加入個包然後用的時候帶上包名,即可解決問題。
2. 可能是jdk、tomcat版本問題,右鍵項目->build path,將其中報錯的libary刪除後重新導入。
3. 緩存問題,清空各種緩存即可。右鍵服務器->clean tomcat
MVC設計模式
目的:爲了解耦合、提高代碼複用
M (model):封裝了對數據的操作,是與數據庫交互的地方。一般是 JavaBean
V (view):負責界面的顯示。一般是 JSP
C (controller):控制器負責視圖和模型之間的轉接,即將視圖的處理請求分配給哪一個模型來處理。一般是 Servlet
Servelet
定義:(滿足以下條件的Java類)
-
必須繼承
javax.servelet.http.HttpServelet
-
重寫其中的doGet()或doPost()方法
doGet():接受並處理所有的get方式的請求
doPost():接受並處理所有的post方式的請求
要想使用servelet必須進行以下配置:
Servelet2.5:配置web.xml文件
<servelet>
<servelet-name>與servelet-mapping的servelet-name對應</servelet-name>
<servelet-class>處理請求的文件</servelet-class>
</servelet>
<servelet-mapping>
<servelet-name>與servelet的servelet-name對應</servelet-name>
<servelet-pattern>/請求提交的路徑(注意不要忘了'/')</servelet-pattern>
</servelet-mapping>
Servelet3.0:@WebServelet('/請求提交的路徑')
tips:
- web.xml的
/
代表 項目 根目錄 - jsp的
/
代表 服務器 根目錄
JSP動作
JSP動作標記是JSP頁面中使用的一種特殊的標記,它利用XML語法格式的標記來控制JSP引擎完成某種功能。
<jsp:include>
:在頁面被請求的時候引入一個文件
如:<jsp:include page="relativeURL|<%=expression%>" flush="true"|false" />
其中,page屬性表示要包含的文件的相對地址,它可以是一個字符串,也可以是一個JSP表達式。flush屬性默認爲false,若爲true則表示當緩衝區滿時,緩衝區將被清空。
include指令和include 動作區別 (1)嵌入的內容。include指令嵌入的是靜態的文本或頁面,而include動作包含的可以是靜態或動態內容。 (2)嵌入被包含頁面的時間。include動作在處理請求時纔將被包含頁面嵌入進來,而include指令是在JSP文件被轉換成Servlet的時候引入文件。 (3)共享局部變量。用include動作時,在頁面中聲明的變量不可用於另一文件;而在用include指令時,當前頁面和被包含頁面可以共享變量。 (4)修改的生效時間。用include指令時,修改的生效需刷新頁面或去掉已經編譯成的Servlet;而用include動作時,被包含頁面的修改會隨時生效。 (5)變量名衝突。用include指令時注意新生成的JSP頁面要符合JSP語法要求,應該避免變量名的衝突。而用include動作不存在變量名衝突問題
<jsp:param>
:提供了“名稱——值”信息,用於將附加在request中的參數發送至轉發的頁面。
語法:<jsp:param name="parameterName" value="{parameterValue | <%= expression %> }" />
name屬性指定參數的名稱,value屬性指定參數的值。
還可與 <jsp:include> 、<jsp:forward> 和 <jsp:plugin> 標記一起使用。
<jsp:include page="relativeURL|<%=expression%>" flush="true"|false" >
<jsp:param name="paramName" value="paramValue|<%=expression%>" />
</jsp:include>
<jsp:forward>
:把請求轉到一個新的頁
語法:<jsp:forward page={"relativeURL" | "<%= expression %>"} />
使用<jsp:forward>標記時,JSP頁面必須使用緩衝機制,不能將page指令中的buffer屬性設爲none。否則它將清空緩存裏的內容,瀏覽器裏將得不到任何輸出。
tips:一旦JSP頁面中加入<jsp:forward>,則它之後的程序將無法執行 ,<jsp:forward>標記將停止當前頁面的處理而轉向目標頁面。
<jsp:plugin>
:根據瀏覽器類型爲Java插件生成OBJECT或EMBED標記
<jsp:useBean>
:尋找或者實例化一個JavaBean
<jsp:setProperty>
:設置JavaBean的屬性
<jsp:getProperty>
:輸出某個JavaBean的屬性
EL和JSTL
EL:Expression Language
操作符:
點操作符 . --使用方便
中括號 [] --功能強大;屬性名可以包含特殊字符(.、-)
語法:${ 域對象.屬性/key } 或 ${ 域對象["屬性/key"] }可以是單引號 等價於<%= %>
關係運算符: >(gt) >=(ge) ==(eq) <(lt) <=(le) !=(ne)
例:${ 2>1 } 或${ 2 gt 1 } 結果爲true
邏輯運算符:||(or) &&(and) !(not)
Empty運算符:判斷值是否爲null,若是則爲true
例:${Empty a.b }
隱含對象:
作用域對象:pageScope、requestScope、sessionScope、applicationScope
tips:如果不指定作用域對象,則默認從小範圍到大範圍找
參數對象:獲取表單數據/超鏈接的參數
${ param.屬性名 } 獲取單個參數
${ paramValues.屬性名 } 獲取多個參數
JSP隱式對象:可以通過pageContent獲得JSP的其他隱式對象
例:${ pageContent.session } 得到Seesion對象 與JSP的pageContent.getSession()等價
${ pageContent.response } 得到response對象 與JSP的pageContent.getResponse()等價
JSTL:需要引入兩個jar包(JSTL.jar standard.jar)
然後引入tablib:<%@ taglib prefix="前綴名" uri="http://java.sun.com/jsp/jstl/core"%>
核心標籤庫:通用標籤庫、條件標籤庫、迭代標籤庫
通用標籤庫:
set標籤:賦值操作
在某個作用域中給變量賦值
<前綴:set var="變量名" value="變量值" scope="作用域對象" /> 等價於 setAttribute("","")
在某個作用域中給對象賦值
<前綴:set target="對象" proprety="屬性名" value="值" />
例:<c:set target="${request.student}" proprety="屬性名" value="值" />
tips:set標籤可以給不存在的變量賦值。
out標籤:輸出操作
<前綴:out value="要輸出的值" default="" escapeXml="true" />
default:當value爲不存在的數據時,輸出default
escapeXml:默認true。 爲false時value可以顯示html代碼
remove標籤:刪除變量
<前綴:remove var="" scope="">
條件標籤庫:
if標籤:
<前綴:if test="${表達式}" var="結果值">
爲真時顯示我
</前綴:if>
choose標籤:
<前綴:choose>
<前綴:when test=""></前綴:when>
<前綴:when test=""></前綴:when>
<前綴:otherwise></前綴:otherwise>
</前綴:choose>
tips:test裏面的${}的後面不要有空格
迭代標籤庫:
forEach標籤:同java的for
<前綴:forEach begin="" end="" step=""></前綴:forEach>
例:
//for(int i=0;i<5;i++){ System.out.print(111) }
<c:forEach begin="0" end="5" step="1">
111
</c:forEach>
//for(int name : names){ System.out.print(name) }
<c:forEach var="name" items="names">
${ name }
</c:forEach>
過濾器
如果要想給一個普通的class變成一個具有特定功能的類(過濾器、攔截器等),要麼繼承父類,要麼實現接口,要麼添加註解。
-
過濾器需要實現
Filter
接口 -
需要實現的方法:
init:初始化時執行
doFilter(ServeletRequest request,ServletResponse response,chain):處理攔截操作
過濾器放行chain.doFilter(request,response)
與Servlet中方法的參數:HttpServeletRequest
destroy:銷燬時執行
-
配置web.xml(類似於servlet)
<filter> <filter-name></filter-name> <filter-class></filter-class> </filter> <filter-mapping> <filter-name></filter-name> <url-pattern>/需攔截的路徑,爲*時全攔截</url-pattern> <dispatcher>通配符請求:只攔截通配符設置的請求</dispatcher> </filter-mapping> 常用通配符: REQUEST:攔截http請求(get、post) FORWORD:只攔截請求轉發的請求
特點:
- 請求跟響應時都會被過濾器攔截。
- 需要過濾器放行
過濾器鏈
當有多個過濾器時,需配置多個 <filter-mapping>
,而過濾器的先後順序由<filter-mapping>
的位置決定
監聽器
監聽的對象:request、session、application
監聽步驟:
-
編寫類,實現接口
-
配置web.xml
<listener> <listener-class>類名的限定名</listener-class> </listener>
監聽對象的創建和銷燬:
request:ServeletRequestListener
session:HttpSessionListener
application: ServletContextListener
每個監聽器各自提供了兩個方法:監聽開始和監聽結束。
監聽對象中屬性的變更:
request:ServletRequestAttributeListener
session:HttpSessionAttributeListener
application:ServletContextAttributeListener
每個監聽器各自提供了三個方法:監聽屬性增加、屬性更改、屬性刪除。
xx.setAttribute("object",ob)觸發對應的attributeAdded事件
xx.removeAttribute("object")觸發對應的attriubteRemoved事件
xx.replaceAttribute("object",obs)觸發對應的attributeRepalced事件
session的四種狀態
-
鈍化:把session對象從內存放進硬盤。
-
活化:把session對象從硬盤放進內存。
操作: 1.實現HttpSessionActionListener和Serializable 2.配置tomcat目錄/conf/context.xml <Manager className="指定的Manager類名"> <Store className="指定的FileStore類名" directory="session存放位置"> </Store> </Manager> 提供了鈍化之前、活化之後的監聽方法。 實質:序列化、反序列化。需要繼承Serializable 鈍化和活化不需要配置web.xml
-
綁定:session.setAttribute(“user”,user),觸發valueBound事件
-
解綁:session.removeAttribute(“user”),觸發valueUnbound事件;session失效或 超時。
操作: 1.實現HttpBindingListener 2.不需要配置web.xml 提供了session對象的綁定對象、解綁對象時的監聽方法。 this跟event區別: this:綁定的對象 event:綁定了對象的session
tips:
- 只有實現了HttpSessionBindingListener的類,在和session綁定、解除綁定時觸發其相關事件。
- 實現了HttpSessionAttributeListener後,任何對象(不論其是否實現了AttributeListener)在變化時均觸發對應的事件
Ajax
使用jquery方式使用ajax
$.ajax({
url:"服務器地址",
type:post|get,
data:"請求數據",
success:function(result,testStatus){
result爲返回的結果,testStatus爲狀態碼
},
})
$.get({
url:"服務器地址",
data:"請求數據",
function(result){},
dataType:"test"|"json"|"xml"
})
$.post({
url:"服務器地址",
data:"請求數據",
function(result){},
dataType:"test"|"json"|"xml"
})
$("顯示結果信息的元素").load({
"服務器地址",
"請求數據",
})
$.getJson({
"服務器地址",
json格式的請求數據
})