1.今日内容
今天的這個内容稍微有點多,而且事情有點多,是以一下花了兩天左右,大概就說一下本篇部落格的内容:1.Servlet的體系結構,主要就是可以使用繼承Servlet的實作類HttpServlet;2.Http的請求體格式;3.Request的相關知識,特别多。
2.具體内容
2.1Servlet的體系結構
由于每次如果實作Servlet接口的話,都需要重寫5個方法,但是我主要隻是關心service方法。是以很費事。是以産生了Servlet的實作類GenericServlet。在這個實作類的使用中,由于每次還都需要判斷<form>裡面的action是get還是post,也有點麻煩,是以我們現在使用的HttpServlet就出現了。我們隻需要重寫它裡面的方法就好了。包括doGet和doPost。
在此處,補充一個關于配置注解WebServlet的方式,一共有三種方式:
[email protected]({"/demo1","/demo2"}),這種就是一個資源有很多路徑通路;
[email protected](“/demo/demo1”),多層目錄
[email protected](“*.do”):這種就是隻要字尾名是.do就能通路到,但是一定不能加/;
2.2Http初步解析
http:hyper text transform protocol,中文名稱是超文本傳輸協定。身為傳輸協定,他就是用來定義用戶端請求資料的格式和伺服器發送資料的格式。
特點:
1.預設端口号是80;
2.基于請求/響應模型:一次請求對應一次響應;
3.無狀态的:多次請求的資料不能通信
版本資訊:
1.0:每次請求都要申請連結然後釋放連接配接,速度比較慢
1.1:每次傳輸在一定時間内是可以複用的;
組成部分:
1.請求行
GET /login.html HTTP/1.1
傳輸方式一共七種,主要就是使用POST和GET,再說一下POST和GET的差別:
1.POST:請求url是沒有長度限制的;請求參數包含在請求體裡;
2.GET:請求的url長度是有限制的;請求參數包含在請求行中;
2.請求頭:裡面包含用戶端告訴伺服器的資訊;
請求頭名稱:請求值
User-Agent:告訴伺服器我是什麼浏覽器
Referer:告訴伺服器我從哪裡來
3.請求空行:就是一行空行,主要用于分隔請求頭域請求體
4.請求體
這個屬于是POST的請求方式特有的東西,裡面的東西就是POST的請求參數
2.3request相關内容
request是用戶端向伺服器請求資料。首先我們先來想一下request和response的原理。當我們在Web中部署一個項目,然後啟動Tomcat後,Tomcat會通過反射機制建立一個Servlet對象,然後這個對象會建立一個request和response對象,将這兩個參數傳入doGet或者doPost中。request是負責擷取請求消息的,response是負責将響應資料封裝的。在本篇中,隻看request對象。
request中包含幾個作用:
1.擷取請求參數: GET /day14/servlet?username=zhangsan HTTP/1.1
這裡面我們隻重點看擷取部分消息。
擷取/day14:String getContextPath()
擷取URL與URI:
String getRequestURL():http://localhost/day14/servlet
String getRequestURI():/day14/servlet
2.擷取其他資訊
在這裡面定義的方法是可以用于GET和POST的;
1.擷取參數
1. String getParameter(String name):根據參數名稱擷取參數值 username=zs&password=123
2. String[] getParameterValues(String name):根據參數名稱擷取參數值的數組 hobby=xx&hobby=game
3. Enumeration<String> getParameterNames():擷取所有請求的參數名稱
4. Map<String,String[]> getParameterMap():擷取所有參數的map集合
在這裡可能會出現中文亂碼的問題,隻需要加一句:req.setCharacterEncoding("utf-8");
2. 請求轉發
1.擷取跳轉的對象,隻能是伺服器内的資源路徑:RequestDispatcher getRequestDispatcher(String path)
2.調用.forward方法實作跳轉:void forward(ServletRequest request, ServletResponse response)
特點:1.隻有一次請求;2.隻能跳轉到伺服器内的資源;3.url位址欄中顯示的是第一個通路的路徑。
一般請求轉發都使用鍊式程式設計:req.getRequestDispatcher("轉發資源路徑").forward(req.resp);
3.共享資料
域對象:在一次請求的過程中,資料是可以共享的。由于上面的資料轉發就是一次請求,那麼就是主要用在資料轉發過程中。
void setAttribute(String name, Object o):設定共享資料
Object getAttribute(String name) :擷取共享資料
void removeAttribute(String name) :删除共享資料
4.獲得ServletContext對象
getServletContext():獲得ServletContext對象
2.4BeanUtils
這個東西的使用的作用是在Servlet中,将擷取到的req的資料封裝為JavaBean對象的,在這裡,需要将擷取到的資料存入Map集合。
Map<String, String[]> map = req.getParameterMap();
User user = new User();
try {
BeanUtils.populate(user,map);
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
2.5登入案例回想
1.首先導入很多的資源,包括.html;.properties;和很多jar包;
2.在資料庫中建立資料,注意需要和druid.properties中的資料庫對應;
3.建立一個domain包,裡面定義一個user類,包含表中的資料的JavaBean;
4.建立一個UserDao類,裡面提供一個Login方法,在裡面寫sq語句·,完成JDBCTemplate的操作;
template.queryForObject(sql,new BeanF...<User>(User.class),login.getUsername,login.getPassword);
5.在Servlet中建立對象,擷取從html得到的資料并且封裝為對象,然後使用login方法檢驗。檢驗成功就是共享資料加轉發,檢測失敗就直接轉發就行了。
3.總結
有一個比較大的登陸案例沒往上面粘貼,反正我又不會上傳jar包。但是真是有點費工夫。至少通過今天的學習,他主要是在後期扮演者我在前端點選一個按鈕或者啥的,能給我一個動态資源的。我需要回憶一下這個登陸案例。還有,我感覺要成。