天天看點

Servlet&Http&Request

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包。但是真是有點費工夫。至少通過今天的學習,他主要是在後期扮演者我在前端點選一個按鈕或者啥的,能給我一個動态資源的。我需要回憶一下這個登陸案例。還有,我感覺要成。