文章目录
Servlet的三种实现方式
- 实现Servlet接口(是所有java Servlet类的基础接口)
- 继承GenericServlet类(这种方法很少用,它其实就是Servlet的实现类)
- 继承HttpServlet类(HttpServlet类是在GenericServlet类基础上拓展HTTP协议的servlet)
不论使用何种方式,都需要对Servlet进行配置才能使用,两种配置方式 web.xml 和 注解
实现Servlet接口
Servlet接口有5个方法需要重写,下面分别介绍这5个方法的作用
-
void init(ServletConfig var1)
- Servlet被创建会被自动调用,对Servlet进行初始化
- 比它先调用的是构造方法
- init()方法只会被调用一次,就是Servlet被创建的时候,后面除非服务器关闭,否则不会调用了
- Servlet的两种创建情况
- 1.第一次被用户请求
- 2.在配置文件中的标签中配置了且值>=0就会在服务器启动时自动创建
- ServletConfig参数的作用,这是一个保存了配置文件信息的变量,我们可以通过它来获取配置文件内容,例如初始化变量
-
ServletConfig getServletConfig()
- 获取ServletConfig对象
-
void service(ServletRequest var1, ServletResponse var2)
- 获取请求,并决定如何处理请求的方法
- 这个方法,每当有用户请求一次的时候就会被调用一次
- ServletRequest 这个对象表示的是用户的请求信息
- ServletResponse 这个对象表示的是要响应给用户的响应信息
-
String getServletInfo()
- 获取Servlet的相关信息
-
void destroy()
- Servlet对象的销毁方法,一般是在服务器被关闭时会调用
代码演示
//这里使用了注解的方式对servlet进行配置,下面会说
@WebServlet(
urlPatterns = {"/test"},
initParams = {@WebInitParam(name="name",value="张三")},
loadOnStartup = 0
)
public class Test implements Servlet {
private ServletConfig servletConfig;
@Override
public void init(ServletConfig servletConfig){
//init方法一般是不会被用到的,但是如果想要读取配置文件信息时,可以获取这个参数
this.servletConfig = servletConfig;
System.out.println("init()被调用");
}
@Override
public ServletConfig getServletConfig(){
return servletConfig;
}
@Override
public void service(ServletRequest request, ServletResponse response){
//这里也演示了servletConfig的一些功能
System.out.println(servletConfig.getServletName() + "的service被调用,它里面的初始化参数有" + servletConfig.getInitParameter("name"));
}
@Override
public String getServletInfo(){
return null;
}
@Override
public void destroy(){
System.out.println("destroy()被调用");
}
}
GenericServlet类
这个类的出现是为了简化Servlet的实例化步骤的,它里面帮我们实现了一些平时基本不需要实现的方法,然后帮我们封装了一些方法,直接看它
public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {
private static final long serialVersionUID = 1L;
//就像上面的Servlet实现类一样,它也获取了congfig对象
private transient ServletConfig config;
public GenericServlet() {}
//基础5大方法
//可以看出它对destroy以及getServletInfo也没又做什么特殊处理
public void init(ServletConfig config) throws ServletException {
this.config = config;
this.init();
}
public void init() throws ServletException {
}
public void destroy() {
}
public ServletConfig getServletConfig() {
return this.config;
}
public String getServletInfo() {
return "";
}
//这个方法是抽象方法,必须要实现,在这里写的就是我们该如何处理请求和响应
public abstract void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
//多出来的方法
//可以看到主要就是获取一些配置的信息,因为多数都是基于ServletConfig对象来的
public String getInitParameter(String name) {
return this.getServletConfig().getInitParameter(name);
}
public Enumeration<String> getInitParameterNames() {
return this.getServletConfig().getInitParameterNames();
}
public ServletContext getServletContext() {
return this.getServletConfig().getServletContext();
}
public String getServletName() {
return this.config.getServletName();
}
}
HttpServlet类
HttpServlet是基于Http协议上对Servlet进行扩展的,它继承于GenericServlet类,除了重写了service方法以外,就是自己实现的额外方法,其他基础方法都是用父类的。
HttpServlet的service方法做了什么
HttpServlet的service方法会对用户传来的HTTP请求的请求方式进行判断,然后根据不同的请求方式进行不同的处理,这些请求方式的处理逻辑要我们自己去实现(继承HttpServlet然后重写对应方法)
HTTP协议有哪些请求方式,它就有哪些方法,格式为doXXX,XXX为请求的方式,例如Post请求, doPost,get请求就是doGet,也并不是所有的请求方式我们都要实现,只需要实现自己想要的方式就好了
代码演示
public class MyServlet extends HttpServlet {
//这是一种实现方式,这种方式中可以重写doGet和doPost方法,对应使用两种请求提交的执行代码
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
/*
* 在容器接受到来自客户的HTTP请求后,会收集HTTP请求中的信息,并分别创建代表请求和响应JAVA对象
* request参数的表示的是客户端请求信息
* response参数的表示的是传递给客户端的响应信息
* */
//response代表响应对象, 最好是设置内容格式,不然有中文的话会乱码
response.setContentType("text/html;charset=UTF-8");
String name = request.getParameter("name"); //通过getParameter()方法获取到对应的参数
PrintWriter writer = response.getWriter(); //获取响应的输出对象
writer.write(name); //将提交的参数输出
}
public void doPost(HttpServletRequest request, HttpServletResponse response){
}
}
如何配置Servlet
web.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置Servlet-->
<servlet>
<!--设置Servlet名字,最好和类名一致,也可以不一致-->
<servlet-name>MyServlet</servlet-name>
<!--Servlet所在路径-->
<servlet-class>OneServlet.MyServlet</servlet-class>
<!--设置init方法在服务器启动时就调用,值可以>=0都有效-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--建立映射-->
<servlet-mapping>
<!--这里是上面定义的那个Servlet名-->
<servlet-name>MyServlet</servlet-name>
<!--访问Servlet时填的路径-->
<url-pattern>/MyServlet</url-pattern>
</servlet-mapping>
</web-app>
<!--访问/MyServlet这个路径时,它会根据servlet-name去寻找对应的servlet根据指定路径调用Servlet-->
WebServlet
除了web.xml其实还有更简便的配置方法,就是使用标注,直接在类上面写
@WebServlet("servlet-pattern") //直接在这里写定外部访问路径也可以访问到
它还可以通过key=value的方式设置更多信息
@WebServlet(
name = "Hello", //设置servlet的名称是hello
urlPatterns = {"/hello"}, //如果url请求/hello这个路径就调用这个servlet,这个可以同时设置多个路径,
//value的作用于等同于urlPatterns,二者只能选一个用
loadOnStartup = 1 //服务器打开自动初始化
initParams = {@WebInitParam(name="key",value="value")} //设置初始化参数
)