目录
一、Servlet核心接口和类
1、Servlet接口
2、GenericServlet抽象类
3、HttpServlet类
二、创建Servlet的三种方式
1、实现Servlet接口
2、继承GenericServlet抽象类
3、继承HttpServlet类
三、web.xml中其他配置
1、启动优先级:
2、url-pattern定义匹配规则
四、 使用注解配置
在Servlet API中最重要的是Servlet接口,所有Servlet都会直接或间接的与该接口发生联系,或是直接实现该接口,或间接继承自实现了该接口的类。该接口中包括以下5个方法:
destroy()
ServletConfig getServletConfig()
String getServletInfo()
void init(ServletConfig arg0)
void service(ServletRequest arg0, ServletResponse arg1)
void init(ServletConfig arg0) | Servlet实例化后,Servlet容器调用该方法完成Servlet的初始化工作 |
ServletConfig getServletConfig() | 获取Servlet对象的配置信息 |
String getServletInfo() | 返回包含Servlet对象的配置信息 |
void service(ServletRequest arg0, ServletResponse arg1) | 负责响应用户的请求,当容器接收到客户端访问Servlet对象的请求时就会调用此方法。 容器会构造一个表示客户端请求信息的ServletRequest对象和一个用于响应客户端的ServletResponse对象作为参数传递给service()方法,在service()方法中可以通过ServletRequest对象得到客户端的相关信息和请求信息,在对请求进行处理后,调用ServletResponse |
void destroy() | 负责释放Servlet对象占用的资源,当服务器关闭或者Servlet对象被移除时会销毁Servlet对象,此时会调用此方法 |
GenericServlet抽象类使编写Servlet变得更容易。它提生命周期方法init和destroy的简单实现,要编写一般的Servlet,只需要重写service方法即可。
HttpServlet是在继承GenericServlet的基础上进一步的扩展。提供将要被子类化以创建适用于Web站点的HTTP servlet的抽象类
HTTPServlet的子类至少必须重写一个方法,该方法通常是:
doGet():用于HTTP GET请求
doPost():用于HTTP POST请求
doPut():用于HTTP PUT请求
doDelete():用于HTTP DELETE请求
myservlet
com.servlet.demo.MyServlet
myservlet
/MyServlet
package com.servlet.demo;
import javax.servlet.*;
import java.io.IOException;
public class MyServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("第一个Servlet案例:实现Servley接口创建Servlet类");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
实现一个类必须实现Servlet接口,但是真正使用到的只有一个service方法,其他的方法都没有使用到;GenericServlet抽象类只需要重写service方法即可。
myservlet
com.servlet.demo.MyGenericServlet
myservlet
/MyGenericServlet
package com.servlet.demo;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;
public class MyGenericServlet extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("第二个Servlet案例:继承GenericServlet抽象类创建Servlet");
}
}
创建一个类,继承HttpServlet类,重写doGet()和doPost()方法,在doGet()方法中编辑要处理的代码,在doPost()中调用doGet()方法
--->request是请求,浏览器中的请求,就通过request来获取(request操作后端);
--->response是响应,浏览器的响应可以通过response来实现(response操作前端)。
在浏览器中输入访问地址,访问地址相当于发送一个请求,到后台来,servlet类处理请求,在servlet来中默认找doGet方法
myservlet
com.servlet.demo.MyHttpServlet
myservlet
/MyHttpServlet
package com.servlet.demo;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyHttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("第三个servlet案例,继承HttpServlet类创建Servlet");
resp.getWriter().println("Hello!Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
通过response对象调用一个输出流(PrintWriter),在浏览器页面进行输出。
在
节点中可设置启动的Servlet启动的优先级
1 (1)元素标记容器是否应该在web应用程序启动的时候就加载这个servlet。
(2)它的值必须是一个整数,表示servlet被加载的先后顺序。
(3)如果该元素的值为负数或者没有设置,则容器会当servlet被请求时再加载。
(4)如果值为整数或0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。
精确匹配 / 具体的名称 只有url路径是具体的名称的时候才会触发Servlet
后缀匹配 *.xxx 只要是以xxx结尾的就匹配触发Servlet
通配符匹配 /* 匹配所有请求,包含服务器的所有资源
通配符匹配 / 匹配所有请求,包含服务器的所有资源,不包括.jsp
所有的注解都以“@”开头(如@Override(重写));Servlet注解格式:@WebServlet( )
package com.servlet.study;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("第四个servlet案例:注解的使用");
response.getWriter().println("@WebServlet");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
@WebServlet注解常用属性:
name:Servlet名字(可选);
value:配置url路径,可以配置多个;
urlPatterns:配置url路径,和value作用一样,不能同时使用;
loadOnStartup:配置Servlet的创建的时机,如果是0或者正数,启动程序时创建,如果是负数,则访问时创建。数字越小优先级越高。