1.servlet是什麼:
servlet是一個位於服務器端的java應用程序
它可以像jsp一樣,直接輸出信息
servlet類必須繼承HttpServlet類,否則,不能稱為serlvet
servlet類是一個java類,但是有自己的規則
servlet必須在web.xml文件中注冊
服務器在啟動的時候,可以根據這些配置來加載servlet類.......
2.servlet作用:
C:控制層
serlvet主要用來做控制轉發,需要結合到MVC模式(套路)
3.servlet生命周期:
init
service
destroy
/** * Initialization of the servlet. <br> * * @throws ServletException if an error occure * 在servlet被第一次訪問時,本方法將會被自動調用 * 本方法被稱為初始化方法 * 只會被調用一次 */ public void init() throws ServletException { // Put your code here System.out.println("我是init方法"); }
/**
* 具體的業務方法
* 該方法將會被調用多次
* 每次訪問servlet時,該方法都會被調用
* service根據request.getMethod得到你的提交方式,然後由它來決定對doGet.doPost的調用
*/
public void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException{
super.service(request, response);
System.out.println("我是service.....................................");
}
/**
* Destruction of the servlet. <br>
* servlet被注銷的時候
* 本方法為銷毀方法
* 也只是被服務器自動調用一次
*
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
System.out.println("destroy方法被調用..............");
}
4.定義servlet的必需的步驟
A.定義一個類,繼承HttpServlet
B.重寫doGet和doPost方法
C.實現doGet和doPost的邏輯
D.在web.xml部署描述文件中定義servlet的映射方式
5.為web應用設置一個歡迎頁面
<welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list>
如果第一個頁面找不到,會依次向下找
6.request和其他類的關系
HttpSession session = request.getSession(); session.setAttribute("username", "scott"); ServletContext application = this.getServletContext(); application.setAttribute("userlist", null); RequestDispatcher rd = request.getRequestDispatcher("C.jsp"); rd.forward(request, response);
7,在servlet中使用session
HttpSession ss = request.getSession(); List list=new ArrayList(); list.add("SMITH"); list.add("ALLEN"); ss.setAttribute("userlist", list);
8.關於servlet的使用方式
servlet可以像jsp一樣被訪問
A.在地址欄內可以直接輸入地址來訪問
http://localhost:8088/myproject15/servlet/CServlet
B.超鏈接方式
<a href="servlet/CServlet?username=zhangshan&pwd=123456789">鏈接</a>
C.include或者forward標簽
<jsp:forward page="servlet/CServlet?username=wangwu&pwd=123456"></jsp:forward>
D.javascript轉向
<input type="button" value="點擊"
onclick="location.replace('servlet/CServlet?username=abcd&pwd=123');">
E.response轉向
9,在web服務器中配置errorpage
<error-page> <error-code>500</error-code> <location>/index.html</location> </error-page> <error-page> <exception-type>java.lang.NullPointerException</exception-type> <location>/index.html</location> </error-page>
10.關於session-config的配置
<session-config> <session-timeout>1</session-timeout> </session-config>
超時時間單位為分鐘
11.為servlet定義初始化參數
使用getInitParameter()方法來提取servlet的初始化參數
定義:
<servlet> <servlet-name>a</servlet-name> <servlet-class>com.sun.demo.MyServlet</servlet-class> <init-param> <param-name>type</param-name> <param-value>text/html;charset=GBK</param-value> </init-param> </servlet>
提取方式:
String str = this.getInitParameter("type");
12.過濾器:
在到達目標頁面之前,所處理的動作
作用:
權限的校驗
日志記錄
圖片的轉換
數據的加密
等等.
實現步驟:
1).實現Filter接口
2).實現doFilter方法
3).傳遞過濾鏈,放請求過去
4).在web.xml文件中注冊過濾器
13.監聽器
靠事件來觸發的,比如application執行了setAttribute();
步驟
兩步:
A.實現listener接口,說出你想要做什麼
B.在web.xml文件中注冊這個監聽器
14.字符集轉換的問題
分幾類情況
A.如果頁面中使用jsp:include或jsp:forward關系,中文字符集轉換:
request.setCharacterEncoding("GBK");
B.在servlet中顯示中文:
由於無法使用jsp頁面中的編碼指令
<%@ page language="java" import="java.util.*" contentType="text/html;charset=GBK"%>
那麼在servlet中設置輸出編碼就應該通過:
response.setContentType("text/html;charset=GBK");
C.普通的參數傳遞
普通的參數也需要考慮到中文的問題
除了頁面顯示設置 contentType="text/html;charset=GBK"之外,我們還需要對中文字符進行字符轉換硬編碼
超鏈接:
String str = request.getParameter("username");
str = new String(str.getBytes("iso8859-1"),"GBK");
form表單:
String str= request.getParameter("username");
str = new String(str.getBytes("iso8859-1"),"GBK");
javascript轉向:
String str = request.getParameter("username");
str = new String(str.getBytes("ISO8859-1"),"gbk");
response方式轉向:
String message = "我的中文測試";
response.sendRedirect("L.jsp?message="+URLEncoder.encode(message));
接收頁面:
String message = request.getParameter("message");
message = new String(message.getBytes("ISO8859-1"),"GBK");
request等作用域
request.setAttribute("username","我的測試名稱");
session.setAttribute("passwd","我的密碼");
不需要進行轉換
15.編寫線程安全的servlet
java線程共享數據的概念
多線程使用的數據是共享的
boolean shutdown = true; /** * 線程體 */ public void run() { // TODO Auto-generated method stub int i = 0; while (1 == 1) { i++; System.out.println(Thread.currentThread().getName()+"="+i); if (shutdown == false) { break; } } System.out.println("本線程結束!"); }
servlet本身建立在多線程的基礎上,所以對於全局變量也存在"共享數據"的問題.
在servlet中定義一個全局變量,該數據將會被多個線程"共享",
String username; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); username = request.getParameter("username");//張三 try { Thread.sleep(1000*6); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } out.println(username); out.close(); }
如果同時提交兩個請求:
http://localhost:8088/myproject19/servlet/AServlet?username=zhangshan
http://localhost:8088/myproject19/servlet/AServlet?username=smith
則:
兩個結果都將顯示為smith
這是因為第一個在訪問時,得到了zhangshan的值,後來,username的值被賦為smith
又因為username是被多個線程所共享的,所以,所有請求裡面的username都變成了smith
避免使用全局變量
方法中的臨時變量是在棧上分配空間,而且每個線程都有自己私有的棧空間,所以它們不會影響線程的安全
16.怎麼樣自動加載servlet
我們知道,servlet有一個生命周期方法,init,service,destroy,其中init在servlet第一次訪問的時候訪問,它只能被訪問一次.
如果你需要在服務器啟動時,讓servlet自動啟動,你可以通過load-on-startup來實現,這一點,我們可以通過init方法被調用來觀察出來
load-on-startup是web.xml文件中servlet的配置節點
描述我們的場景:
假如你有這樣一個需求:
為提高系統性能,在服務器啟動時,從數據庫中查詢所有的用戶名列表,以便在其他頁面中可以直接使用,而不需要從數據庫再進行查詢,如何實現?
A.ServletContextListener可以在服務器啟動時自動執行其方法
B.可以使用一個servlet,然後定義load-on-startup,讓它能夠在服務器啟動時自動執行其方法
使用<load-on-startup>1</load-on-startup>可以指定服務器加載順序
實例代碼:
/** * Initialization of the servlet. <br> * * @throws ServletException if an error occure * 本方法在servlet被加載時訪問 * 這裡,我們在服務器啟動,自動加載一段數據,起到數據緩存的效果 */ public void init() throws ServletException { // Put your code here List<String> list = new ArrayList<String>(); list.add("WARD"); list.add("JONES"); list.add("JAMES"); this.getServletContext().setAttribute("datalist",list); }
配置文件設置:
<servlet> <servlet-name>DataCacheServlet</servlet-name> <servlet-class>com.sun.demo.DataCacheServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
後記:每一天,每一動作,我們所嘗試過經歷過的,都是遼闊夜空裡微微閃爍的星光,即使微茫,
也有人站在某個角落用閃爍的眸光與你輝映!