javaWeb应用生命周期
1.启动阶段:把web.xml文件中的数据加载到内存,为web应用创建一个servletContext对象,对所有Filter初始化,对需要web启动时初始化的servlet初始化(web.xml配置了load-on-startup)。
2.运行阶段:所有servlet处于等待阶段,用户请求了,看Servlet是不是初始化了,不是就初始化,是就提供service服务。过滤器在servlet之前调用,但是要过滤去映射url和用户请求url配对上才行。
3.终止阶段:销毁所有处于运行时状态的servlet。销毁所有处于运行时状态的Filter,销毁所有与web应用相关的对象,比如servletContext对象。
Servlet生命周期
1.初始化:记载servlet类,把class文件加载到内存。创建ServletConfig对象(包含了servlet初始化信息),创建servlet对象,调用init方法。
2.运行时:用户请求,servlet容器创建ServletRequest对象和ServletResponse对象,调用对应servlet的service方法。返回响应结果。
3.销毁:web应用终止时,会调用destroy方法销毁对象。
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);//设置缓冲大小4k dff.setRepository(new File("临时目录")); ServletFileUpload sf = new ServletFileUpload(dff); sf.setFileSizeMax(4*1024*1024);//设置文件最大为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(); }转发和包含转发(forward):当前servlet解决不了,转发到另一个servlet处理。
包含(include):当前servlet解决不了,把另一个servlet中的处理包含到自己这个servlet中。
都依赖requestDispatcher接口,两个servlet共用一个request和response对象。
servletContext调用getRequestDispatcher(string)绝对路径。
servletRequest调用geRequestDispatcher(String)相对路径。
转发
req.setAttribute("message", "hello"); RequestDispatcher r = getServletContext().getRequestDispatcher("/xxx"); r.forward(req, resp); req.getRequestDispatcher("xxx").forward(req, resp);forward处理流程:1.清空用于存放响应数据的缓冲区。
2.如果/xxx是servlet或jsp,那就调用service方法,把处理结果返回。如果是静态html,就读取文档数据返回。
转发的特点:
1.因为会清空缓冲,所以转发后原来的servlet响应结果不会返回给客户端。只有转发后的处理响应结果才能返回。
2.如果在forward前,原servlet发送了响应结果(response.close()等等)。那么forward会报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,那就调用service方法,把处理结果返回到原servlet响应中。如果是静态html,就读取文档数据返回到原servlet响应中。2.处理结束后返回到原servlet中继续执行代码。
包含特点:1.前后处理结果都会添加到响应结果中2.在后一个servlet对响应状态代码或响应头做修改会被忽略。
重定向
重定向流程:
1.用户输入url。
2.服务器返回302表示请求另一个url。响应结果会出现新的url。
3.请求响应结果的url。
4.返回响应结果。
sendRedirect是在httpServletResponse中定义的。servletResponse中没有。
response.sendRedirect("/xxxx?name=123");特点:1.原servlet响应结果不会返回。sendRedirect("xxx")返回302状态,客户端重定向。
2.在sendRedirect前提交了响应结果,会报IllegalStateException。3.sendRedirect之后的代码也会执行。
4.前后servlet不共享request对象
5.sendRedirect("xxx")中xxx以“/”开头表示当前服务器地址,“http://”表示完整的地址。
6.重定向的servlet可以不再自己服务器上。
tomcat中<Content>中一个项目crossContent为false,其他项目不能访问这个项目。为true可以访问。
ServletContext a = getServletContext().getContext("/webapp");a.getRequestDispatcher("/xxx");
新闻热点
疑难解答