servlet學習筆記(一)

jsp實質上也是一種servlet,所以就在這兒一塊兒寫。

1.若想使某個標籤居中,可用<center></center>修飾。如想使按鈕居中,則

<center><input type="submit" value="提交"></center>
2.一個重要問題

jsp頁面部分代碼爲:

<form action="CheckServlet" method="post">
	用戶名:<input name="username" value="" /><br>
	密碼:<input name="password" type="password" /><br>
	兩週內自動登錄<input type="checkbox" name="autologin" value="1" /><br>
	<input value="登錄" type="submit" />
</form>
而CheckServlet的部分代碼爲:

String name = request.getParameter("username");
String pwd = request.getParameter("password");
String autologin = request.getParameter("autologin");

if(name.equals("admin")&& pwd.equals("123")){
	if(autologin.equals("1")){
		//方法內容
	}
}
但這樣寫會出問題,在填寫表單時,name和pwd都會寫,但“兩週內自動登錄”卻不一定勾選。這就可能會出問題,當未勾選該選項時,autologin的值爲null,而null沒有equals方法,即不能跟其他值作比較,會出錯java.lang.NullPointerException。

正確的寫法應該是調換順序,前邊name和pwd的也是如此。以後碰到類似情況時,也應該是是“值”在前,變量名在後。該改變自己一直以來錯誤的寫法了。正確的如下:

if("admin".equals(name) && "123".equals(pwd)){
	if("1".equals(autologin)){
		//方法內容
	}
}
這種寫法更嚴謹。

3.cookie簡單用法

//聲明cookie
String name = request.getParameter("username");
Cookie ck_set = new Cookie("name","admin");//意爲cookie中name的值存爲admin。這是獲取cookie。如果要獲取多個就得new多個cookie
ck.setMaxAge(3600);//設置cookie有效時間爲一小時
response.addCookie(ck_set);//給瀏覽器添加cookie


Cookie[] ck_get = request.getCookies();//獲取cookie,getCookies()方法得到的是數組
然後用循環取得cookie的值

HttpSession對象。取得session

HttpSession session = request.getSession();

session.getId();//返回相關的session的id
對於session,無需用戶創建,直接拿來用即可。當用戶打開瀏覽器時服務器就會給它生成一個sessionId,瀏覽器要麼把這個sssionId放到cookie中,要麼每次請求都帶在url後邊。如:

HttpSession session = event.getSession();
ServletContext application = session.getServlrtContext();
等類似的即可。
只有執行了getSession()纔會生成session而cookie可以新建。
獲取登陸的用戶名可以用:

String uname = (String)session.getAttribute("userName");
4.類的修飾符回顧

private   //同一個類
default   //同一個類 同一個包 
protected //同一個類 同一個包 子類
public    //同一個類 同一個包 子類 所有類
5.注意在用static修飾的方法中不能用this

6.MVC模式,M指model,如entity類中的user,role等。V指view,視圖指jsp頁面,c指controller,servlet一類

7.

response.getWriter.write();//getWriter是得到輸出流,再用write方法把數據寫到輸出流.
與下邊的寫法等價

PrintWriter out = response.getWriter();
out.print(某個值);
但分開寫的這種方法還有一個好處就是容易擴展,

out.flush();
out.close();
8.上傳文件要注意,form內method="post",並且enctype="multipart/form-data"

9.jsp有9個內置對象。這裏介紹幾個
①request,封裝的是來自客戶端的數據。若想接收這些數據,則用getParameter()[獲取單個值],getParameterNames()[獲取數組]
②response是服務器對客戶端的響應。
③session是需要在不同的jsp頁面保留客戶信息時使用,如在線購物等。保存在服務器端。

10.四大作用域對象本質上都是map
①pageScope即pageContext,只在本頁面共享數據。

②sessionID放置在cookie內,瀏覽器關閉session銷燬了沒?銷燬了。更準確的說法就是瀏覽器關閉後,session還存在於服務器端,只不過當打開新的瀏覽器時又會創建新的session,並且這兩個session是不一樣的。服務器端纔有session,客戶端只是通過sessionId來匹配session。客戶端存的是cookie
ssessionID沒有有效期時間,放在瀏覽器內存,所以瀏覽器關閉,session就銷燬。

11.servlet是一種特殊的單例模式,利用享元模式來共享一些數據來節約資源。
servlet的基本流程:若找到servlet實例,就直接使用。若沒找到,就根據反射構造servlet對象,根據反射調用service的doGet/doPost方法。

12.服務器端跟客戶端發送數據
①請求轉發:地址欄不會變

response.getRequestDispatcher(某個頁面).forward(request,response);
意爲將客戶端的請求轉向(forward)到getRequestDispatcher()方法中參數定義的頁面或者鏈接。換句話說就是當一個客戶端的請求到這個頁面後,不做處理或者不處理完,將請求轉給另一個頁面處理,然後再響應給客戶端。利用這個方法參數可以被正確傳遞。
②重定向:地址欄會變
response.sendRedrict(某個頁面);
比如response.sendRedirect("../success.jsp"),利用這個方法如果跳轉前有request.setAttribute("a","b")的話,那麼參數是傳不到success.jsp的。因爲它在客戶端重定向到success.jsp,本質上跳了兩次,所以參數失效。
13.可以使用getAttribute(String name)獲得變量值,

setAttribute(String name,Object value);//將變量值保存到對應的作用域中
若把變量放到pageContext內,說明它的作用域是page,有效範圍只在當前jsp頁面。從把變量放到pageContext開始,到jsp頁面結束,都可以使用這個變量。

銷燬session,可以用session.invalidate();

14.el表達式會從4個作用域按從小到大順序依次取值。如果變量不存在,會輸出空字符串"",而不是null,省去了手工判斷的工作。

el爲Expression Language,可以在jsp頁面中禁用,禁用後回以原形式輸出。如${username},本來想輸出"張三",但輸出也爲${username}。

禁用el表達式,可以用

<%@ page isELIgnored="true" %>
說到el表達式,又需要說作用域。如果有${username}這一個正則表達式,則它會依次調用pageContext.getAttribute("username")-->request.getAttribute("username")--

>session.getAttribute("username")-->application.getAttribute("username"),最先找到哪個不爲空的,就調用出來。但若多個作用域有相同變量,就需要添加作用域。如:

${pageScope.username},${requestScope.username}.

${cookie.name}是獲取對應cookie的對象。比如將一段cookie發送給客戶端:
Cookie ck = new Cookie("username","username in cookie");
response.addCookie(ck);//把cookie發送到客戶端
意爲創建一個名稱爲username,值爲"username in cookie"的Cookie對象,然後發送給客戶端。
然後${ck.username.name}是獲取cookie名稱,${ck.username.value}獲取cookie值。
15.Class.forName()是慣用寫法,可以強制加載指定的類。在連接數據庫驅動時經常用到。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章