首页 > 学院 > 开发设计 > 正文

servlet

2019-11-08 18:52:50
字体:
来源:转载
供稿:网友

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();		}			}

Cookie

Cookie 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");


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表