Java Wbe开发快速入门
1.servlet知識點小結
?
1.1. Servlet基礎 ??
1) 什么是Servlet? ???
容器: 裝載Servlet所使用的服務器.
組件: 是用于處理用戶(瀏覽器)所發送的請求.
??????servlet就是組件.
2)?如何開發一個Servlet? ???
1.創建一個class
2.繼承HttpServlet類
3.覆蓋service()方法
??---選擇參數HttpServletRequest與HttpServletResponse的方法
4.配置web.xml文件.
3) 什么是Servlet容器? ?
???用于裝載servlet的服務器就是Servlet容器.我們這里指的是tomcat服務
???器.??
?
1.2. Servlet核心 ???
1.2.1. 核心的類與接口 ??
1) Servlet接口
2) GenericServlet抽象類 --- 實現init()方法以及destory()方法
3) HttpServlet抽象類
4) ServletRequest,ServletResponse接口
5) ServletConfig接口
a. ServletContext getServletContext();
b. String getInitParameter(String paraName);
6) HttpServletRequest接口---ServletRequest接口的子接口
a. String getParameter(String name);
b. String[] getParameterValues(String name);
c. setCharacterEncoding(String code);
d. RequestDispatcher getRequestDispatcher(String url);
e. setAttribute(String name,Object obj);
f. Object getAttribute(String name);
g. removeAttribute(String name);
h. String getContextPath();
i. String getRequestURI();
j. HttpSession getSession()/getSession(boolean flag);
k. Cookie[] getCookies();
7) HttpServletResponse接口?--- ServletResponse接口的子接口
a. setContentType(String str);
b. PrintWriter getWriter();
c. sendRedirect(String url);
d. encodeURL(String url); --- 作用于頁面的URL重載
e. encodeRedirectURL(String url); ?
????????????--- 作用于Servlet中的URL重載(只支持重定向)
f. addCookie(Cookie cookie);
8) ServletContext接口
a. String getRealPath(String str); ?--- 獲取該項目所在服務器的物理路徑
b. setAttribute(String name,Object obj);
c. Object getAttribute(String name);
d. removeAttribute(String name);
e. String getInitParameter(String name);
1.2.2. servlet的生命周期 ??
1)?什么是servlet生命周期?
Servlet對象在服務器中被創建,被執行,被銷毀的過程就是servlet的聲明
???周期.
2) servlet生命周期的四個階段?
???1. 當服務器啟動時,servlet的class被裝載.
???2. 當第一次請求到來的時候,servlet對象被創建(服務器調用其init())
???3. 在服務器銷毀該對象之前,該對象一直處于保存狀態.
???4. servlet對象被銷毀,服務器調用的它的destory()方法.
<load-on-startup>配置
3) 如何override init方法?
init()或者init(ServletConfig config)
在方法中調用super.init()即可.
4)?servlet的初始化參數如何配置?
<servlet>
<init-param>
<param-name>iphone</param-name>
<param-value>蘋果手機</param-value>
</init-param>
</servlet>
?
1.2.3. 表單處理 ???
1)?如何讀取表單中的參數
???request.getParameter(參數名);
???參數名與form表單中的控件的name屬性一致.
???在form表單中的控件必須存在name屬性,否則該控件的內容
???將無法提交到服務器中.
2)?如何處理中文
???1. request.setCharacterEncoding(編碼格式);
??????設置request編碼個是的方式只支持表單的post提交方式.
???2. URLEncoder與URLDecoder進行編碼重組.
??????首先使用URLEncoder將參數重新編碼.
??????在用URLDecoder重新編碼的數據進行解碼.
??????第二種方式無論是post提交還是get提交方式都支持.但是當
??????使用post方式進行提交的時候不能與request.setCharacterEncoding
??????方法一起使用,否則會出現重復編碼的問題,導致中文亂碼.
??????對于get方式沒有影響.
?
1.2.4. get請求與post請求 ???
1)?哪一些是get請求,哪一些是post請求?
???GET:
???<a> 超鏈接的提交
???<form method=”get”> 表單的提交方式可以設置為get
???location.href 跳轉的提交也是get方式
???POST:
???<form method=”post”> 表單提交方式為post時.
2) get請求不post請求的區別?
???1. get方式會將參數放在地址欄上不安全
??????post方式是將參數放到數據包的實體中.
???2. get方式傳遞參數有限制,限制取決于地址欄可填寫的內容大小
??????post方式在理論上沒有參數的個數限制.可以傳無數個參數.
???3. get方式需要手動設置中文參數的編碼方式.
??????post方式是由服務器繼續中文參數編碼,只需設置編碼格式即可.
?
1.2.5. 轉發與重定向 ???
1) 什么是重定向?
???當服務器處理完客戶端的請求后,會將一個地址以及302的狀態碼返回給瀏覽
???器,瀏覽器接到狀態碼和地址后會自動向該地址再次發送請求的過程.二次訪
???問服務器是由瀏覽器自己完成的,不需要用戶的操作.
2) 如何重定向?
???response.sendRedirect(請求地址)
3) 重定向的特點?
???1. 兩次請求
???2. 地址欄會更變
???3. 因為是兩次請求所以request對象和response對象不能通用.
4) 重定向編程需要注意的問題?
???1. 不能與PrintWriter對象一起使用.
??????out對象的close()方法(out.flush())會將response對象中的內容清空
??????一旦response對象的內容被清空,那么重定向會失效.
???2. 重定向可以跳轉到所在服務器中的任何一個項目下.不局限于本項目中的
??????請求或頁面.
5)?什么是轉發?
???當服務器對用戶的請求進行處理時,在處理需要其他serlvet或頁面支持的時
???候會將該請求與所需要的地址發送serlvet引擎中.在發送的過程中會攜帶一
???個301的狀態碼.serlvet引擎在檢測到301的狀態碼后,會將該請求轉個目標
???地址.兩個地址實際上處理的是同一個請求.
6)?如何轉發?
request.getRequestDispatcher(轉發地址).forword(requert, response);
7) 轉發的特點?
???1. 一次請求
???2. 地址欄不會更變
???3. 兩個處理請求的位置共用一個request對象和response對象.
8) 轉發編程需要注意的問題?
???1. 與PrintWriter對象不兼容.(與重定向類似)
???2. 轉發的位置只能與原位置處于同一個項目下.
9) 轉發與重定向的區別
???1. 請求次數不同
???2. 地址欄的變更狀態不同
???3. request對象與response對象的共用情況不同
???4. 訪問位置限制不同.
2.狀態管理(Cookie)
1) 什么是狀態管理
???將客戶端(一般是瀏覽器)與服務器之間的多次交互當作一個整體來看待,即
???將多次操作所涉及的數據記錄下來。
2) 怎樣進行狀態管理
ü 第一種方式,cookie(在客戶端管理用戶的狀態)
ü 第二種方式,session(在服務器端管理用戶的狀態)
3) cookie
瀏覽器會將這些數據保存起來。當瀏覽器再次訪問服務器時,會將這些數據以cookie消息頭的形式發送給服務器。通過這種方式,可以管理用戶的狀態。
2.1 創建cookie
Cookie cookie = new Cookie(String name,String value);
response.addCookie(cookie);
瀏覽器訪問服務器,激活服務器開始創建Cookie.
之后將創建好的Cookie綁定到Response對象中,然后再發送到
瀏覽器中.瀏覽器解析Response對象,將對象中的Cooike保存到
內存當中.
2.2 查找cookie
//如果沒有cookie,則返回null。
Cookie[] cookies = request.getCookies();
String name = cookie.getName();
String value = cookie.getValue();
2.3 保存和查詢Cookie流程
a. 瀏覽器向服務器發送addCookie請求
服務器中的AddCookieServlet創建了兩個Cookie:cookie和cookie2
b. 服務器端執行語句response.addCookie(cookie);生成消息頭“set-cookie”,
并將兩個Cookie以鍵值對的方式(“name=aaa”、“passwd=123”)存放在消息頭中發 送給瀏覽器
c. 瀏覽器將Cookie信息保存到本地內存中
d. 瀏覽器繼續向服務器發送請求(帶著消息頭cookie)
服務器端的FindCookieServlet找到Cookie信息,并顯示給瀏覽器
2.4 cookie保存時的編碼問題
cookie的值只能是Ascii碼字符,如果是中文,需要將中文轉換成Ascii碼字符形式。 可以使用URLEncoder.encode()方法和URLDecoder.decode()方法來進行這種轉換。
2.5 Cookie的保存時間
計時單位是秒數.
cookie.setMaxAge(int seconds);
seconds > 0
瀏覽器會將cookie以文件的方式保存在硬盤上。在超過指定的時間以后,會刪除該文件。
seconds < 0
默認值,瀏覽器會將cookie保存在內存里面。叧有當瀏覽器關閉之后,才會刪除。
2.6 刪除cookie
seconds = 0
立即刪除該Cookie?
2.7 cookie的路徑問題
瀏覽器在向服務器上的某個地址發送請求時, 會先比較cookie的路徑與向訪問的路徑(地址)是否匹配,當有匹配的cookie,才會發送。 cookie的路徑可以通過cookie.setPath(String path)方法來設置。 如果沒有設置, 則有一個缺省的路徑,缺省的路徑是生成該cookie的組件的路徑。 比如: /appname/addCookie保存了一個cookie, 則該cookie的路徑就是/appname/addCookie。
2.8 Cookie的限制
cookie可以禁止
cookie的大小有限制(4k左右)
cookie的數量也有限制(瀏覽器大約能保存300個)
cookie的值只能是字符串,要考慮編碼問題。
cookie不安全---用戶能夠隨意更改
3.狀態管理(session)?
瀏覽器訪問服務器時,服務器會創建一個session對象(該對象有一個唯一的id, 一般稱 為sessionId)。服務器在缺省情況下,會將sessionId以cookie機制發送給瀏覽器。當 瀏覽器再次訪問服務器時,會將sessionId發送給服務器。服務器依據sessionId就可以 找到對應的session對象。通過這種方式,就可以管理用戶的狀態。
3.1 如何獲得session對象
方式一:?
HttpSession session = request.getSession(boolean flag);
當flag = true: 服務器會先查看請求中是否包含sessionId, 如果沒有,則創建一個session對象。 如果有,則依據sessionId去查找對應的session對象,如果找到,則返回。 如果找不到,則創建一個新的session對象。
當flag = false: 服務器會先查看請求中是否包含sessionId, 如果沒有,返回null。 如果有,則依據sessionId去查找對應的session對象,如果找到,則返回。 如果找不到,返回null。
方式二
HttpSession session = request.getSession();
與request.getSession(true)等價。
3.2 HttpSession接口提供的一些方法
//獲得sessionId。
String session.getId();
//綁訂數據
session.setAttribute(String name,Object obj);
/* obj最好實現Serializable接口
?* (服務器在對session進行持久化操作時,
?* 比如鈍化、激活,會使用序列化協議)。
?*/
Object session.getAttribute(String name);
//如果name對應的值不存在,返回null。
session.removeAttribute(String name);
3.3 session超時
服務器會將超過指定時間的session對象刪除(在指定的時間內,該session對象沒有使用)。
方式一: session.setMaxInactiveInterval(int seconds);
方式二: 服務器有一個缺省的超時限制,可以通過相應的配置文件來重新設置。 比如可以修改tomcat的web.xml(tomcat_home/conf下面)。
<session-config>
<session-timeout>30</session-timeout>
</session-config>
另外,也可以修改某個應用的web.xml。
3.4 刪除session
session.invalidate();
?
4. jstl與el表達式
4.1.1. jstl是什么? ??
java standard taglib(java標準標簽庫)。
4.1.2. 標簽是什么? ??
sun公司制訂的一種技術規范,用來將jsp頁面中的java代碼使用類似于html當中的標記來替換 的一種技術。這樣做的目的,是為了使jsp頁面更好維護以及更好的測試。
4.1.3. el表達式是什么? ??
sun制訂的一種用于計算的一種規則,早期只能用于給標簽的屬性賦值,現在也可以直接輸出。
4.1.4. el表達式的基本語法 ???
${el表達式}
1) 第一種: 訪問bean的屬性
a. ${user.name}:
???<%=user.getName() %>
jsp引擎會依次從pageContext、request、session、application查找綁訂名為"user" 的對象,如果找到了,就不再向下查找,否則,繼續向下查找。 找到后,調用該對象的getName(),并輸出其值;找不到,則輸出""(空)。
b. 或者也可以使用${user["name"]},效果相同
"name" 表示字符串
c. 或者是${user[propname]},注意propname沒有引號,表示變量
d. 此外,[ ]里面還可以是0,1..這樣的下標,作用是輸出數組里的元素值。
e. 可以使用pageScope,requestScope,sessionScope,applicationScope四個關鍵字指定查找的范圍。
f. ${requestScope.user.name}只到request中去找,不再依次到4個范圍查找了
2) 第二種: 獲得請求參數值
a. ${param.username}
等價于 request.getParameter("username");
b. ${paramValues.interest}
等價于request.getParameterValues("interest");
?
3) 第三種: 計算一個表達式,將結果作為標簽的屬性值或者直接輸出
a. 算術運算
"+" , "-" , "*" , "/" , "%" , 但是要注意,"+"號不能連接字符串。
b. 關系運算
"==" , "!=" , ">" , "<" ,">=" , "<="
可以使用對應的"eq","nq","lt","gt","le","ge"代替。
c. 邏輯運算
"&&","||","!",可以使用"and","or","not"代替。
d. empty運算
判斷一個字符串是否為空,集合內容是否為空,以及綁訂的對象是否存在。
${empty list} 如果list == null 或者 list.size() == 0 返回都為true
4.1.5. 核心標簽的使用 ???
1) 使用步驟
需要將jstl標準標簽庫相關的jar文件copy到WEB-INF\lib。
D:\czh\MyEclipse 5.5.1 GA\eclipse
??\plugins\com.genuitec.eclipse.j2eedt.core_5.5.1\ data\libraryset\JSTL1.1\lib\
???jstl.jar
standard.jar
2) 在jsp文件當中,使用taglib指令導入標簽。
3) 使用標簽
a. <c:if test="" var="" scope="">
ü test屬性: 當值為true,執行標簽體的內容,為false,則不執行。
ü var屬性: 指定一個綁訂名。
ü scope屬性: 指定一個綁訂范圍。
???var屬性和scope屬性用于將test的結果綁訂到指定的對象
???(pageContext,request,session,application)上。
?
b. <c:choose>
用于分支,當某個條件滿足,執行某一個分支。每一個分支條件用when標簽來表示。 <c:when test=""> 可出現多次,只用于<c:choose>
ü test屬性: 當值為true,執行標簽體的內容
?
<c:otherwise> 只出現1次,只用于<c:choose> 當其它分支都不滿足條件,則執行該標簽體的內容。
c. <c:forEach var="" items="" varStatus="">
?
用于遍歷集合items屬性:指定要遍歷的集合。
ü var屬性: 指定一個綁訂名,jsp引擎會從集合當中取一個對象,綁訂到 pageContext對象上。
ü varStatus屬性: 指定一個綁訂名,對應的綁訂值是一個java對象,封裝了遍 歷時的一些信息,包括當前遍歷的對象的下標(index)以及 是第幾次(count)遍歷。
d. <c:url>
當用戶禁止cookie以后,會自動在地址后面添加sessionId。 當使用絕對路徑時,會自動在地址前添加應用名。
ü value屬性:指定地址。在表單提交、鏈接當中,可以使用該標簽。
e. <c:set var="" scope="" value="">
綁訂一個對象到指定的范圍。
value屬性: 綁訂值。
f. <c:remove var="" scope="">
解除綁訂
?
g. <c:catch var="">
處理異常,會將異常信息封裝成一個對象,綁訂到pageContext對象上。
?
h. <c:import url="">
url指定一個jsp文件的地址,jsp會在運行時調用這個jsp。
?
i. <c:redirect url="">
重定向到另外一個地址。url屬性指定重定向的地址。
?
j. <c:out value="" default="" escapeXml="">
用于輸出el表達式的值。
ü value屬性: 指定輸出的值
ü default屬性: 指定缺省值。
ü escapeXml屬性: 設置成true,會將value中的特殊字符替換成相應的實體。缺省值就是true。
?
5. 過濾器
1) 什么是過濾器
servlet規范當中定義的一種特殊的類,用于對servlet容器的調用過程進行攔截。
?
1) 瀏覽器發送請求給服務器
2) 服務器的Servlet引擎創建Request對象&&Response對象
3) Servlet引擎先調用過濾器的doFilter方法,該方法有兩個參數request和response,
(在過濾器中可以訪問到Request對象&&Response對象)
4) 過濾器對攔截的內容進行處理
5) 之后調用SomeServlet的service方法
6) service方法執行
7) service方法執行結束后,將結果返回到過濾器
8) 過濾器將service方法返回的結果再次進行過濾
9) 最后,Servlet引擎將結果返回給瀏覽器
2) 怎樣寫一個過濾器
step1
寫一個java類,實現一個Filter接口。
step2 在doFilter方法里,實現過濾的邏輯。
step3 配置(web.xml)。
3) 配置初始化參數
step1 web.xml中,使用<init-param>元素來配置初始化參數
step2 在Filter類中,使用FilterConfig.getInitParameter(String paraName);獲得初始化參數。
4) 過濾器的優先級
當有多個過濾器都滿足過濾的條件時,依據<filter-mapping>的先后順序依次執行。
5) 過濾器的優點
a. 可以將多個web組件相同的邏輯寫在一個過濾器當中,方便代碼的維護
b. 可實現代碼的“可插拔性"。
給一個軟件增加或者減少某個功能不會影響已經存在的功能。
?
6. 監聽器
1) 什么是監聽器?
servlet規范當中定義的一種特殊的類,作用是監聽容器當中產生的一些事件并進行相應的處理。 容器產生的事件指的是兩大類事件:
第一大類
生命周期相關的事件,指的是當容器創建或者銷毀
request,session,ServletContext對象時產生的事件。
第二大類
綁訂事件,指的是當調用request,session,ServletContext對象的
setAttribute,removeAttribute時產生的事件。
?
2) 如何寫監聽器
step1 寫一個java類,實現特定的監聽器接口類(依據要監聽的事件類型)。
step2 在接口聲明的方法中,實現監聽的邏輯。
step3 配置(web.xml)。
?
3) ServletContext接口
web服務器在啟動時,會為每一個已經部署的應用創建唯一的一個
ServletContext實例。 該實例會一直存在,除非服務器關閉或者應用被刪除。
注意:每個應用對應唯一的一個ServletContext實例
a. 如何獲得ServletContext實例。
GenericServlet提供了getServletContext()方法。
HttpSession提供了getServletContext()方法。
ServletConfig提供了getServletContext()方法。
b. 常用方法
ü 綁訂數據
setAttribute(String name,Object obj);
getAttribute(String name);
removeAttribute(String name);
ü 配置全局的初始化參數
step1 在web.xml中,使用<context-param>配置的參數,可以被所有的
???servlet共享。
step2 使用String ServletContext.getInitParameter(String paraName);
ü 依據邏輯路徑獲得實際部署時的物理路徑。
String ServletContext.getRealPath(String url);
?
?
總結
以上是生活随笔為你收集整理的Java Wbe开发快速入门的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: STM32CubeMx官网下载HAL库文
- 下一篇: java 动态转换器,Java 编程的动