Servlet简介
- Servlet 是Java Server Applet的简称,称为小服务器程序,用Java编写的服务器端程序,主要功能交互式地浏览和修改数据,生成动态Web内容。
- Java Servlet 是运行在支持Java的Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
- 使用 Servlet,您可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
- Servlet编程需要使用到
javax.servlet
和javax.servlet.http
两个包下面的类和接口,在所有的类和接口中,javax.servlet.Servlet
接口最为重要。所有的servlet程序都必须实现该接口或者继承实现了该接口的类。
- javax.servlet.ServletConfig;
- javax.servlet.ServletException;
- javax.servlet.http.HttpServlet;
- javax.servlet.http.HttpServletRequest;
- javax.servlet.http.HttpServletResponse;
- javax.servlet.http.HttpSession;
- javax.servlet.http.Cookie;
Servlet接口和类
GenericServlet
抽象类
- GenericServlet 使编写 servlet 变得更容易。它提供生命周期方法 init 和 destroy 的简单实现,要编写一般的 servlet,只需重写抽象 service 方法即可。
HttpServlet
类
- 是继承GenericServlet的基础上进一步的扩展。
- 提供将要被子类化以创建适用于 Web 站点的 HTTP servlet 的抽象类。
- HttpServlet 的子类
至少必须重写一个方法
,该方法通常是以下这些方法之一:
- doGet,如果 servlet 支持 HTTP GET 请求
- doPost,用于 HTTP POST 请求
- doPut,用于 HTTP PUT 请求
- doDelete,用于 HTTP DELETE 请求
- init 和 destroy,用于管理 servlet 的生命周期内保存的资源
- getServletInfo,servlet 使用它提供有关其自身的信息
Servlet
接口类
- 在ServletAPI中最重要的是Servlet接口,所有Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类。
- 该接口包括以下五个方法:
- init(ServletConfig config)
- ServletConfig getServletConfig()
- service(ServletRequest req,ServletResponse res)
- String getServletInfo()
- destroy()
- 处理方式:
- (1)第一次访问Servlet时,服务器会创建Servlet对象,并调用init方法,再调用service方法
- (2)第二次再访问时,Servlet对象已经存在,不再创建,执行service方法
- (3)当服务器停止,会释放Servlet,调用destroy方法。
Servlet线程安全问题
安全问题
- 因为每次请求都会创建一个线程,如果多人同时请求,那么就会存在多个线程操作同一个Servlet对象,那么如果在对应的方法中操作了成员变量,就有可能产生线程安全的问题。
如何保证线程安全
- synchronized
- 将存在线程安全问题的代码放到同步代码块中
- 实现SingleThreadModel接口
- servlet实现SingleThreadModel接口后,每个线程都会创建servlet实例,这样每个客户端请求就不存在共享资源的问题
- 但是servlet响应客户端请求的效率太低,所以已经淘汰。
- 尽可能只使用
局部变量
Servlet基本使用
创建package
- 项目中为Servlet类创建独立的servlet包
两种创建方式
- 第一种:继承
HttpServlet
- 代码示例:
@WebServlet("/helloServlet") public class HelloServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request,response); }
- 第二种:实现
Servlet接口
- 代码示例:
@WebServlet("/servletDemo") public class ServletDemo implements Servlet { @Override public void init(ServletConfig servletConfig) throws ServletException { System.out.println("init初始化"); } @Override public ServletConfig getServletConfig() { System.out.println("getServletConfig"); return null; } @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("service"); } @Override public String getServletInfo() { System.out.println("getServletInfo"); return null; } @Override public void destroy() { System.out.println("销毁了destroy"); } }
两种配置方式
- 第一种:使用注解的方式,上面示例已使用
- 注解的其他参数:
- name:serlvet名字(可选)
- value:配置url路径
- urlPatterns:配置url路径,和value作用一样,不能同时使用
- loadOnStartup:配置Servlet的创建的时机,如果是0或者正数 启动程序时创建,如果是负数,则访问时创建。数子越小优先级越高。
- initParams:配置Servlet的初始化参数
- 代码示例:
@WebServlet(name = "ServletDemo",loadOnStartup = 0,urlPatterns = "/servletDemo",initParams = {@WebInitParam(name="sdh",value = "sdh")}) //在doPost方法里面,使用下面方法获取注解中创建的初始参数 String config = getInitParameter("sdh")
- 第二种:在web.xml文件中配置
- 代码示例:
<!-- 使用xml形式访问servlet --> <servlet> <!--名称--> <servlet-name>ServletDemo</servlet-name> <!--Servlet的全称类名--> <servlet-class>com.sdh.servlet.ServletDemo</servlet-class> <!--配置参数,也是通过getInitParameter()获取--> <init-param> <param-name>email</param-name> <param-value>xxx@qq.com</param-value> </init-param> <init-param> <param-name>address</param-name> <param-value>北京</param-value> </init-param> <!--配置启动时机--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <!--访问地址--> <url-pattern>/servletDemo</url-pattern> </servlet-mapping>
- 容器在进行url-pattern配置的时候是遵循一定的匹配原则
- url-pattern定义匹配规则,取值说明:
- 精确匹配
/xxx(具体的名称)
只有url路径是具体的名称的时候才会触发Servlet- 后缀匹配
*.xxx
只要是以xxx结尾的就匹配触发Servlet- 通配符匹配
/*
匹配所有请求,包含服务器的所有资源- 通配符匹配
/
匹配所有请求,包含服务器的所有资源,不包括.jsp
- load-on-startup
- 元素标记容器是否应该在web应用程序启动的时候就加载这个servlet。
- 它的值必须是一个整数,表示servlet被加载的先后顺序。
- 如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。
- 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。