Web中Servlet
生活随笔
收集整理的這篇文章主要介紹了
Web中Servlet
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一:
web.xml中的代碼如下
<web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>AddServlet</servlet-name><servlet-class>servlets.AddServlet</servlet-class></servlet><servlet-mapping><servlet-name>AddServlet</servlet-name><url-pattern>/add</url-pattern></servlet-mapping><!--用戶發請求 action=add當前項目中 web.xml中找到url-pattern=/add找12行的名字 servlet-name =Addsevlet找到和servlet-mapping中servlet-name一致的servlet,即第8行找到第八行servlet-class用戶發送的post請求 ,因此會執行AddServlet中的doPost方法--> </web-app>通過url-pattern找到對應的servlet-name(目前簡單這樣子理解,之后學習的過程中會注意)
在根據servlet-name找到我們創建的類所需要初始化的服務。
? public class AddServlet extends HttpServlet {//響應頁面中的post請求@Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//post方式下設置編碼防止中文亂碼 get方式目前不需要(基于tomcat8)//設置編碼這一句必須在參數獲取之前設置req.setCharacterEncoding("UTF-8");String fname = req.getParameter("fname");String pricestr = req.getParameter("price");int price = Integer.parseInt(pricestr);String fcountstr = req.getParameter("fcount");int fcount = Integer.parseInt(fcountstr);String remark = req.getParameter("remark");FruitDAO fruitDAO = new FruitDAOImpl();boolean flag = fruitDAO.addFruit(new Fruit(0, fname, price, fcount, remark));System.out.println(flag?"添加成功!":"添加失敗");} }?二:細節
2.servlet的繼承關系(1、繼承關系:javax.servlet.Servlet接口javax.servlet.GenericServlet抽象類javax.servlet.HttpServlet 抽象子類(2、相關方法:Servlet:void init(config)-初始化方法void service(request,response) -服務方法void destroy()-銷毀方法javax.servlet.GenericServlet:void service(request,response) 仍然是抽象的javax.servlet.HttpServlet:void service(request,response)(1.String method = req.getMethod(); 獲取請求的方式各種if判斷,根據請求方式不同決定去調用不用的do方法在httpservlet抽象類中,do方法都差不多(3.小結:繼承關系 HttpServlet->GenericServlet->ServletServlet中的核心方法服務方法:當有請求過來時service方法會自動響應(Tomcat容器調用)三:servlet的生命周期
1)生命周期:從出生到死亡的過程就是生命周期。對應Servlet中的3個方法init,service,destroy2)默認情況下,第一次接受請求會Servlet會使用反射進行實例化(調用構造方法())、初始化(init())然后服務(service())第二次請求開始每一次都會服務,當容器關閉時所有的servlet實例會被銷毀3)通過案例發現:Servlet實例Tomcat只會創建一個,所有請求都依賴這個實例去響應第一次請求時會初始實例化好處:提供系統的啟動速度壞處:第一次請求時耗時較長因此,如果要提高響應速度則需要設置Servlet的響應時機4)Servlet初始化時機:默認是第一次請求時 初始化可以通過web.xml中的 <load-on-startup>設置啟動時機,數字越小啟動越靠前5)Servlet在容器中是單例、線程不安全的因此盡量不要再Servlet中定義成員變量。如果不得不加成員變量:不要修改成員變量的值不要根據成員變量的值做一些判斷四:HTTP協議
HTTP:Hyper Text Transfer Protocol 超文本傳輸協議 1)HTTP是無狀態的 2)HTTP請求響應包含兩個部分:請求和響應-請求:請求包含3個部分;1.請求行;2、請求消息頭 3、請求主體請求行包含三個信息:1.請求的方式 2.請求的URL 3.請求的協議版本。請求消息頭中包含許多客戶端需要告訴服務器的信息,比如瀏覽器的星號、版本、客戶端接受的類型、發送內容的類型等等請求體:三種情況get方式,沒有請求體,但有queryString(緊跟url之后)post方式:有請求體,form datajson格式:有請求體request payload-響應:響應也包含三個部分:1.響應行 2.響應頭 3.響應體響應行包含三個信息:1.協議 2.響應狀態碼 3.響應狀態響應頭:包含了服務器的信息、服務器發送給瀏覽器的信息(內容的媒體類型、編碼、長度)響應體:響應的實際內容()五:會話
1)-HTTP是無狀態的:服務器無法判斷兩次請求是不是一個客戶端發過來的-現實問題:第一次請求是添加商品到購物車 第二次請求是結賬;如果無法區分是不是一個客戶端發過來的就會發生混亂(我結賬結的別人的購物車)-通過會話跟蹤技術解決無狀態的問題 2)會話跟蹤技術-客戶端第一次發送請求給服務器,服務器獲取session,獲取不到則創建新的,然后響應給客戶端-下次客戶端給服務器發送請求時,會把sessionId帶給服務器,服務器會判斷這次請求和上次請求是同一個客戶端,從而能夠區分-常用的API:request.getSession() ->獲取當前的會話,沒有則創建新的會話request.getSession(true) ->效果和不帶參數的一樣request.getSession(false) ->獲取當前會話,沒有則返回Null,不會創建新的sessionsession.getId() ->獲取sessionIDsession.isNew() ->判斷當前session是否是新的session.getMaxInactiveInterval() ->session的非激活間隔時長默認為1800s,(即不操作的情況下session的存在時長)session.setMaxInactiveInterval() ->設置非激活間隔時長session.invalidate() ->強制性讓會話立即失效3)Session保存作用域session的保存作用域和某個具體的session是對應的常用的API:void session.setAttribute(k,v)Object session.getAttribute(k)void removeAttribute(k)六:
1)服務器內部轉發:request.getRequestDispatcher("...").forward(request,response)一次請求響應的過程,對于客戶端而言內部的變化不知道地址欄沒有變化 2)客戶端重定向:request.sendRedirect("...")兩次請求的響應,客戶端知道URL的變化地址欄有變化?
七:Thymeleaf -視圖模板技術 //servlet3.0開始支持注解的方式注冊 @WebServlet("/index") public class IndexServlet extends com.atguigu.myssm.myspringmvc.ViewBaseServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {FruitDAO fruitDAO = new FruitDAOImpl();List<Fruit> fruitList = fruitDAO.getFruitList();//保存到session中HttpSession session = req.getSession();session.setAttribute("fruitList",fruitList);//處理模板//Thymeleaf會將index這個邏輯視圖的名稱對應到物理視圖名稱上去//邏輯視圖名稱:index//物理視圖名稱:view-prefix + 邏輯視圖名稱 +view-suffix//所以真是的視圖名稱為 / index .htmlsuper.processTemplate("index",req,resp);} }? 1).添加Thymeleaf.jar包 2)新建一個servlet類叫viewbaseServlet(從Thymeleaf中拷入) 3)在web.xml文件中添加配置配置prefix和suffix 4)使servlet類繼承與viewbaseServlet 5)根據邏輯視圖名稱得到物理視圖名稱//處理模板//Thymeleaf會將index這個邏輯視圖的名稱對應到物理視圖名稱上去//邏輯視圖名稱:index//物理視圖名稱:view-prefix + 邏輯視圖名稱 +view-suffix//所以真是的視圖名稱為 / index .htmlb八、保存作用域
(1)page(不用了) (2)request一次響應的請求范圍通過請求2無法獲得lili這個數據(3)session一次會話的范圍 (4)application一次應用程序的范圍(直到Tomcat停止)?
其他:
//200:正常響應 //404:找不到資源 //405:請求方式不支持 //500:服務器內部錯誤總結
以上是生活随笔為你收集整理的Web中Servlet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于SWAT模型的一些原理(二)
- 下一篇: Unity 中文不显示问题