实现Servlet的三种方式:
1、Servlet
无状态的Servlet,需要重写init,getServletConfig, service, getServletInfo, destroy方法
2、GenericServlet
无状态的Servlet,只需要重写service方法
3、HttpServlet
针对http协议的Servlet,在其service方法中,根据getMethod方法获得实际请求的方法类型,执行了不同的方法,也就是doGet,doPost,doPut,doDelete方法
Servlet在启动服务器时加载init()方法的方式:
Servlet2.5
在web.xml文件中的<servlet>中配置<load-on-startup>1</load-on-startup>,这里的1代表第一个加载firstServlet这个Servlet。
web.xml
<servlet>
<servlet-name>firstServlet</servlet-name>
<servlet-class>cn.nenu.controller.firstServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>firstServlet</servlet-name>
<url-pattern>/firstServlet</url-pattern>
</servlet-mapping>
Servlet3.0
在Servlet中的注解中添加 loadOnStartup = 1即可,这里的1和上面的一样。
@WebServlet(value = "/HelloServlet", loadOnStartup = 1)
public class HelloServlet extends HttpServlet {
public void init() throws ServletException {
System.out.print("init()...");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
配置Servlet的方式:
servlet2.5
在web.xml中配置<context-param>来设置web容器初始参数,在<servlet>中配置<init-param>为该servlet设置初始参数。
web.xml
<context-param>
<param-name>webParam</param-name>
<param-value>webParam</param-value>
</context-param>
<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>cn.nenu.controller.HelloServlet</servlet-class>
<init-param>
<param-name>servletParam</param-name>
<param-value>servletParam</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/helloServlet</url-pattern>
</servlet-mapping>
servlet3.0
在Servlet中的注解中添加 initParams = {@WebInitParam(name = "servletParam",value = "servletParam")}设置servlet初始参数,但是web容器的初始参数不可通过注解方式配置,只能通过2.5的原方式来配置(web.xml中配置)。
@WebServlet(value = "/HelloServlet", initParams = {@WebInitParam(name = "servletParam",value = "servletParam")})
public class HelloServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Servlet的初始化方法中获取初始化参数的方式:
(以获取以上设置的初始参数为例)
public void init() throws ServletException {
//获取当前Servlet的初始化参数
String servletParamValue = super.getInitParameter("servletParam");
//获取web容器的初始化参数
ServletContext servletContext = super.getServletContext();
String webParamValue = servletContext.getInitParameter("webParam");
}
解决Servlet线程安全问题:
- synchronized,效率低不建议使用
- 实现SingleThreadModel接口,每个线程都会创建一个servlet实例,但是servlet响应客户端请求的效率太低,所以已经淘汰。
- 尽可能使用局部变量
ServletContext
ServletContext概述
- 全局对象,也有作用域,对应一个Tomcat中的web应用
- 当web服务器启动时,会为每个web应用创建一块共享的存储区域(ServletContext)、
- 在服务器启动时创建,关闭时销毁。
获取ServletContext对象的三种方式:
- 通过GenericServlet提供的getServletContext()方法。this.getServletContext();
- 通过HttpServletRequest提供的getServletContext()方法。
- 通过HttpSession提供的getServletContext()方法。
ServletContext的作用:
- 获取项目的真实路径(全路径):getRealPath("/");
- 获取当前项目的上下文路径(也就是项目名称):getContextPath()【这里也可以通过request.getContextPath()来获取】
- 也可以作为全局容器使用,也是键值对的形式,应用场景比如统计项目被访问的次数