servlet 笔记
servlet 介绍:
- javaWeb的核心技术!(servlet,filter,listenner)+(PageContext,ServletContext,ServletRequest,HttpSession)
- 服务端运行的java类,service()方法:处理请求,完成响应。
- Servlet3.0之前的版本要使用Servlet,需要在web.xml中进行配置。在web.xml中配置Servlet时可以配置一些初始化参数,在servlet中可以通过ServletConfig接口提供的方法来获取 这些参数。
- 在Servlet3.0及3.0之后的版本,该版本新增了若干注解。
servlet生命周期:
实例化(构造函数) ----> 初始化init() ----> 服务service() ----> 销毁destroy()
- 创建,init阶段: 第一次访问该servlet类时,创建并初始化。默认注意并不是tomcat容器启动阶段!(但配置start on load参数>=0时,容器启动时加载 )
- service阶段:每访问一次,执行一次。
- destroy阶段:应用结束。
整个生命周期,init和destroy只执行一次,主要任务在service函数。实现servlet的类要重写service逻辑,如HttpServlet类。
自定义servlet类
开发过程,根据业务逻辑创建的自定义servlet,实现servlet接口。
常用的抽象类:javax.servlet.GenericServlet 和 javax.servlet.http.HttpServlet
- GenericServlet 抽象类,与协议无关,适配器模式:已实现servlet接口的全部方法。
继承此类的自定义servlet不必实现servlet接口的全部方法,用哪个重写哪个--适配器模式。 - HttpServlet (继承GenericServlet) 抽象类,http实现类,模板方法设计模式
service()方法为protected,所以它的实现类 只需重写doGet(),doPost()等方法。开发中常见
servlet配置
- web.xml中配置
name --> class --> urlpattern - 注解配置
@WebServlet("/hello")
servlet参数
private ServletConfig servletConfig; //getInitParameter() 获取某个K-V 参数 String name = servletConfig.getInitParameter("name"); String password = servletConfig.getInitParameter("password"); //getInitParameterNames() 获取全部参数 Enumeration<String> en = servletConfig.getInitParameterNames(); //上面获取的是具体某个servlet类的局部参数 //下面servletConfig.getServletContext().getInitParameter获取全局参数 //getServletContext()返回ServletContext对象!!!---comtext容器,全局唯一 String k = servletConfig.getServletContext().getInitParameter("k"); //注解方式,先setAttribute赋值参数,getAttribute取值。K-V ServletContext servletContext = this.getServletContext(); servletContext.setAttribute("user","Tom"); String user = (String)servletContext.getAttribute("user");
ServletContext对象
servletContext,应用的servlet上下文容器,单实例唯一。tomcat服务器启动应用时产生,tomcat关闭时销毁context.
servletContext对象是web应用中所有servlet的共享变量,用于servlet间的数据共享。
- 获取servletContext对象:ServletContext context = config.getServletContext();
servletContext对象功能:JavaWeb四大域对象之一
Enumeration getAttributeNames()等 | 获取所有域属性的名称。 | |
public String getInitParamenter(String name) 等 | 获取全局配置信息 | |
public String getRealPath(String path)等 | 获取资源文件路径 | |
public <T extends Servlet> createServlet(Class<T> clazz) | 创建servlet,filter, listenner等 | Dynamic |
addFilter(), addListenner(), addServlet() | 添加web组件 | Dynamic |
servlet重定向和转发
- 重定向:HttpServletResponse的sendRedirect()方法。
例如 response.sendRedirect(“demo.jsp"); //重定向到demo.jsp,此处注意路径,忘记加项目根目录
可重定向到任意地址,浏览器url地址变化,request参数不共享。 - 转发:RequestDispatcher.forward(request, response)方法。
例如 request.getRequestDispatcher (“demo.jsp"). forward(request,response);//转发到demo.jsp
只转发到同一web应用, 浏览器url地址不变,共享request参数。
注意:sendRedirect()方法不能转发到“/WEB-INF/”路径下的jsp页面资源,而getRequestDispatcher().forword()可以重定向到“/WEB-INF/”路径下的jsp页面资源。如 request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
web-inf 服务器的安全目录,浏览器无法直接访问。可通过servlet的forward,或者springMVC的视图解析,但都不是url直接访问的
区别: 转发是HttpServletRequest中的方法,基于请求。重定向是HttpServletResponse中的方法,基于响应。