Java知識整理(十七)之Servlet

兩層CS架構:客戶端+DB 數據庫作爲Server移植性差,不適合大型引用
三層CS架構:客戶端+應用服務器+DB 移植性好,適合大型引用,但是客戶端需要單獨安裝
BS架構:Browser+WebServer+DB 數據庫只負責數據管理,web服務器負責業務邏輯處理,瀏覽器負責提供操作頁面
Servlet:server+let;服務器端的小程序,Sevlet是容器的一部分;sun公司制定的一種用來擴展Web服務器功能的組件規範
容器:符合一定規範,提供組件運行環境的一個程序
200表示請求成功202表示請求被接受但處理未完成400錯誤的請求
404錯誤:web服務器(容器)根據請求地址找不到對應資源
405錯誤:web服務器找不到servlet()方法處理請求(service方法名稱寫錯等)
500錯誤:程序在運行過程出錯
HTTP協議:w3c制定的一種應用層協議,一次請求一次連接
請求數據包:請求行,消息頭,實體內容;響應數據包:狀態行,消息頭,實體內容
HttpServletRequest(客戶端請求):讀取和寫入請求數據,取得和設置cookie,實現請求轉發
HttpServletResponse:設置cookie,實現重定向
Servlet獲取請求參數值(Name-Value(s))的方法:
String request.getParameter(String Name); String[] request.getParameterValues(String Name);(參數名相同多個參數值)
get請求:當需要向服務器請求指定的資源時使用的方法,不適用於提交請求(表單參數值在請求資源路徑後面)
post請求:向服務器提交需要處理的數據,設置表單屬性爲post,可提交大量數據,不會將請求參數顯示在瀏覽器地址欄(參數值在實體內容中);
解決post方式下亂碼:(頁面-->服務器)
1.表單所在頁面按照指定字符集打開:<meta http-equiv = "content-type" content = "text/html;charset=utf-8">
2.服務器端指定編碼解碼:request.setCharacterEncoding("utf-8");
解決get方式下亂碼:(服務器-->頁面)
1.表單所在頁面按照指定字符集打開:<meta http-equiv = "content-type" content = "text/html;charset=utf-8">
2.服務器端獲取參數:String username = request.getParameter(Name);username = new String(username.getBytes("iso-8859-1"),"utf-8");iso-8859-1-->utf-8
解決輸出內容(out.println();)亂碼:response.setContentType("text/html;charset=uft-8");
編寫Servlet的步驟:
1.創建web project
2.編寫一個類,繼承自HttpServlet
3.重寫service()方法,編寫輸出內容
4.配置web.xml文件
5.部署該工程到tomcat中
6.啓動tomcat
7.打開瀏覽器,輸入 http://localhost:8080/應用名/地址
打開web項目下的WebRoot下的html文件:http://localhost:8080/應用名/demo.html 請求資源路徑:應用名(appName)/demo.html
public class GetPost extends HttpServlet{
protected void service(HttpServletRequest req,HttpServletResponse resp)
throws ServletException,IOException{
//解決post亂碼:
req.setCharacterEncoding("utf-8");
//解決輸出內容亂碼:
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
String text = req.getParameter("text");
out.println("<h1>"+text+","+select+"</h1>");
out.close();
}
}
或者:New-->Servlet-->doGet-->next-->URL:*.do-->Finish-->doGet改爲service,刪除不需要部分
重定向:服務器向瀏覽器發送302狀態碼,Location消息頭(重定向地址);response.sendRedirect("list");list爲應用名之後的路徑
重定向的地址是任意的,重定向後瀏覽器地址欄的地址會發生改變
轉發:Servlet/JSP-->Servlet/JSP(一次請求一次響應,每次的request都不同,所以request.setAttribute只有一次效果)
轉發的實現:1.綁定數據到reques對象;2.獲得轉發器;3.轉發
1.實現綁定:request.setAttribute(String name,Object obj);name:綁定名;obj:綁定值;
2.獲得轉發器:RequestDispatchar rd = request.getRequestDispatchar(String path); 3.實現轉發:rd.forward(request,response);
讀取綁定:Object request.getAttribute(String name);
轉發後地址欄地址不發生改變,轉發過程在服務器內部,path必須是引用內部的某個地址,forward後的其他語句會執行
轉發共享數據,重定向不共享數據
編程時的異常處理:利用轉發跳轉到指定頁面;
通配符匹配:使用"*"匹配0個或多個字符(前面要加斜槓);前面不能使用斜槓,*.do匹配所有以.do結尾的請求
獲取請求資源路徑:String uri = request.getRequestURI();String action = uri.substring(uri.lastIndexOf("/")+1,uri.lastIndexOf("."));
action-->service/service.impl-->dao/dao.impl-->jdbc-->entity
Servlet線程安全:
ServletContext(Servlet上下文,一個Servlet程序只有一個):相當於Servlet中靜態變量,因爲Servlet創建後,服務器關閉才銷燬
ServletContext sct =session.getServletContext();sct.setAttribute("count",count);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章