javaWeb應(yīng)用生命周期
1.啟動(dòng)階段:把web.xml文件中的數(shù)據(jù)加載到內(nèi)存,為web應(yīng)用創(chuàng)建一個(gè)servletContext對(duì)象,對(duì)所有Filter初始化,對(duì)需要web啟動(dòng)時(shí)初始化的servlet初始化(web.xml配置了load-on-startup)。
2.運(yùn)行階段:所有servlet處于等待階段,用戶請(qǐng)求了,看Servlet是不是初始化了,不是就初始化,是就提供service服務(wù)。過(guò)濾器在servlet之前調(diào)用,但是要過(guò)濾去映射url和用戶請(qǐng)求url配對(duì)上才行。
3.終止階段:銷毀所有處于運(yùn)行時(shí)狀態(tài)的servlet。銷毀所有處于運(yùn)行時(shí)狀態(tài)的Filter,銷毀所有與web應(yīng)用相關(guān)的對(duì)象,比如servletContext對(duì)象。
Servlet生命周期
1.初始化:記載servlet類,把class文件加載到內(nèi)存。創(chuàng)建ServletConfig對(duì)象(包含了servlet初始化信息),創(chuàng)建servlet對(duì)象,調(diào)用init方法。
2.運(yùn)行時(shí):用戶請(qǐng)求,servlet容器創(chuàng)建ServletRequest對(duì)象和ServletResponse對(duì)象,調(diào)用對(duì)應(yīng)servlet的service方法。返回響應(yīng)結(jié)果。
3.銷毀:web應(yīng)用終止時(shí),會(huì)調(diào)用destroy方法銷毀對(duì)象。
servlet api主要接口與類的作用和生命周期


下載文件
@Override PRotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { OutputStream out; InputStream in; String filename = req.getParameter("filename"); in = getServletContext().getResourceAsStream("資源路徑"); int length = in.available(); resp.setContentType("application/force-download"); resp.setHeader("Content-Length", String.valueOf(length)); resp.setHeader("Content-Disposition", "attachment;filename=/""+filename+"/""); out = resp.getOutputStream(); int b =0; byte[] bytes = new byte[1024]; while((b=in.read(bytes))!=-1){ out.write(bytes, 0, b); } in.close(); out.close(); }上傳文件<form enctype="MULTipART/FORM-DATA"><input type="file" /></form>@Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { DiskFileItemFactory dff = new DiskFileItemFactory(); dff.setSizeThreshold(4*1024);//設(shè)置緩沖大小4k dff.setRepository(new File("臨時(shí)目錄")); ServletFileUpload sf = new ServletFileUpload(dff); sf.setFileSizeMax(4*1024*1024);//設(shè)置文件最大為4M List<FileItem> list = sf.parseRequest(req); for(FileItem f:list){ if(!f.isFormField()){ String filename = f.getName(); filename = filename.substring(filename.lastIndexOf("//")+1, filename.length());//獲得不包含路徑的文件名字 long size = f.getSize(); if(!"".equals(filename)&&size!=0){ f.write(new File(filename)); } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } }CookieCookie c = new Cookie("username", "jack"); c.setPath("/"); c.setMaxAge(60*60); resp.addCookie(c); Cookie[] cookies = req.getCookies(); for(Cookie cook:cookies){ cook.getName(); cook.getValue(); cook.getMaxAge(); }轉(zhuǎn)發(fā)和包含轉(zhuǎn)發(fā)(forward):當(dāng)前servlet解決不了,轉(zhuǎn)發(fā)到另一個(gè)servlet處理。
包含(include):當(dāng)前servlet解決不了,把另一個(gè)servlet中的處理包含到自己這個(gè)servlet中。
都依賴requestDispatcher接口,兩個(gè)servlet共用一個(gè)request和response對(duì)象。
servletContext調(diào)用getRequestDispatcher(string)絕對(duì)路徑。
servletRequest調(diào)用geRequestDispatcher(String)相對(duì)路徑。
轉(zhuǎn)發(fā)
req.setAttribute("message", "hello"); RequestDispatcher r = getServletContext().getRequestDispatcher("/xxx"); r.forward(req, resp); req.getRequestDispatcher("xxx").forward(req, resp);forward處理流程:1.清空用于存放響應(yīng)數(shù)據(jù)的緩沖區(qū)。
2.如果/xxx是servlet或jsp,那就調(diào)用service方法,把處理結(jié)果返回。如果是靜態(tài)html,就讀取文檔數(shù)據(jù)返回。
轉(zhuǎn)發(fā)的特點(diǎn):
1.因?yàn)闀?huì)清空緩沖,所以轉(zhuǎn)發(fā)后原來(lái)的servlet響應(yīng)結(jié)果不會(huì)返回給客戶端。只有轉(zhuǎn)發(fā)后的處理響應(yīng)結(jié)果才能返回。
2.如果在forward前,原servlet發(fā)送了響應(yīng)結(jié)果(response.close()等等)。那么forward會(huì)報(bào)IllegalStateException。
包含
getServletContext().getRequestDispatcher("/header.htm").include(request, response);; getServletContext().getRequestDispatcher("/doget").include(request, response);; getServletContext().getRequestDispatcher("/foot.htm").include(request, response);; //code處理流程:1.如果/xxx是servlet或jsp,那就調(diào)用service方法,把處理結(jié)果返回到原servlet響應(yīng)中。如果是靜態(tài)html,就讀取文檔數(shù)據(jù)返回到原servlet響應(yīng)中。2.處理結(jié)束后返回到原servlet中繼續(xù)執(zhí)行代碼。
包含特點(diǎn):1.前后處理結(jié)果都會(huì)添加到響應(yīng)結(jié)果中2.在后一個(gè)servlet對(duì)響應(yīng)狀態(tài)代碼或響應(yīng)頭做修改會(huì)被忽略。
重定向
重定向流程:
1.用戶輸入url。
2.服務(wù)器返回302表示請(qǐng)求另一個(gè)url。響應(yīng)結(jié)果會(huì)出現(xiàn)新的url。
3.請(qǐng)求響應(yīng)結(jié)果的url。
4.返回響應(yīng)結(jié)果。
sendRedirect是在httpServletResponse中定義的。servletResponse中沒(méi)有。
response.sendRedirect("/xxxx?name=123");特點(diǎn):1.原servlet響應(yīng)結(jié)果不會(huì)返回。sendRedirect("xxx")返回302狀態(tài),客戶端重定向。
2.在sendRedirect前提交了響應(yīng)結(jié)果,會(huì)報(bào)IllegalStateException。3.sendRedirect之后的代碼也會(huì)執(zhí)行。
4.前后servlet不共享request對(duì)象
5.sendRedirect("xxx")中xxx以“/”開頭表示當(dāng)前服務(wù)器地址,“http://”表示完整的地址。
6.重定向的servlet可以不再自己服務(wù)器上。
tomcat中<Content>中一個(gè)項(xiàng)目crossContent為false,其他項(xiàng)目不能訪問(wèn)這個(gè)項(xiàng)目。為true可以訪問(wèn)。
ServletContext a = getServletContext().getContext("/webapp");a.getRequestDispatcher("/xxx");
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注