【原创】Servlet学习之(四)创建Servlet程序

2020-05-29 16:13发布

Servlet学习之(四)创建Servlet程序

Servlet是一个用Java语言编写的、实现Servlet接口的类,它在Servlet容器中运行,由Servlet容器管理Servlet的整个生命周期,所以,也常常称ServletServlet容器上运行的服务器小程序。

Servlet实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下,Servlet只用来扩展基于HTTP协议的WEB应用功能。

WEB应用程序中,Servlet有两个主要用途:

(1)实现动态网页

(2)作为前端页面与后台数据库或者后台服务器程序之间的中间件。

一、WEB应用程序

WEB应用程序是一种通过WEBWorld Wide Web 全球广域网/万维网)访问的应用程序,程序的最大特点是:在客户端无需安装任何软件,用户只需通过客户机上的浏览器,输入要访问的WEB应用中资源的URL地址(Uniform Resource Location统一资源定位符,即:在万维网上,用以标识每一个资源的唯一的资源定位地址),即可访问WEB应用程序。

WEB应用程序举例:淘宝、天猫、百度、美团、京东、收获啦。

WEB应用程序开发,是目前软件开发领域的三大方向之一。

 

Servlet作为WEB应用中的一种动态资源开发技术,共有三种开发方式。

二、创建Servlet程序的三种方式

为了更快速、规范地开发Servlet程序,SUN公司提供了一套标准的Servlet API,在这套Servlet API中,提供了一个接口和两个抽象类,分别是:javax.servlet.Servlet接口:Servlet程序必须实现的接口

javax.servlet.GenericServlet抽象类:实现了Servlet接口的抽象类

javax.servlet.http.HttpServlet抽象类:GenericServlet的抽象子类

于是,可以分别通过以上接口和抽象类,用三种方式创建Servlet程序。

 

1、创建方式一

通过实现javax.servlet.Servlet接口,创建与访问协议无关的Servlet


 

 

Servlet程序中,需要实现Servlet接口中定义的所有方法。

 

代码示例如下:

@WebServlet(description = "通过实现Servlet接口创建的Servlet程序", urlPatterns = { "/shouhuola/Servlet01" })

public class Servlet01 implements Servlet {

 

@Override

public void destroy() {

// TODO Auto-generated method stub

 

}

 

@Override

public ServletConfig getServletConfig() {

// TODO Auto-generated method stub

return null;

}

 

@Override

public String getServletInfo() {

// TODO Auto-generated method stub

return null;

}

 

@Override

public void init(ServletConfig arg0) throws ServletException {

// TODO Auto-generated method stub

 

}

 

@Override

public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {

// TODO Auto-generated method stub

arg1.setContentType("text/html; charset=utf-8");

arg1.getWriter().println("这是通过实现Servlet接口创建的Servlet程序");

}

}

2、创建方式二

通过继承javax.servlet.GenericServlet抽象类,创建与访问协议无关的Servlet


 

Servlet程序中,只需要重写为客户请求提供服务的service方法,在GenericServlet抽象类中,这是一个抽象方法。

 

代码示例如下:

@WebServlet(description = "通过GenericServlet抽象类派生的Servlet程序", urlPatterns = { "/shouhuola/Servlet02" })

public class Servlet02 extends GenericServlet {

 

@Override

public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {

// TODO Auto-generated method stub

arg1.setContentType("text/html; charset=utf-8");

arg1.getWriter().println("这是通过GenericServlet抽象类派生的Servlet程序");

}

}

3、创建方式三

通过继承javax.servlet.http.HttpServlet抽象类,创建支持HTTP访问协议的Servlet


 

Servlet程序中,可以根据客户的请求方式(例如:GETPOSTHEADPUTDELETETRACEOPTIONS),重写为客户请求提供服务的doXxx方法;也可以重写其父类的service方法。

若重写了其父类的service方法,则由service方法为客户请求提供服务。

若在service方法中调用了父类的service方法,例如:

super.service(req, resp);

那么,service方法会根据HTTP协议的请求方式,调用对应请求方式的处理方法doXxx()

 

代码示例如下:

@WebServlet(description = "通过HttpServlet抽象类派生的Servlet程序", urlPatterns = { "/shouhuola/Servlet03" })

public class Servlet03 extends HttpServlet {

private static final long serialVersionUID = 1L;

 

    public Servlet03() {

        super();

        // TODO Auto-generated constructor stub

    }

 

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

response.setContentType("text/html; charset=utf-8");

response.getWriter().println("这是通过HttpServlet抽象类派生的Servlet程序");

}

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

doGet(request, response);

}

}

三、不同版本Servlet程序创建的区别

ServletJava EE规范体系的重要组成部分,可以使用的版本有Servlet2.x系列版本和Servlet3.0版本。

Servlet2.x系列版本的Servlet需要在web.xml中进行配置。

Servlet3.0作为 Java EE 6规范体系中一员,随着Java EE 6规范一起发布。该版本在前一版本(Servlet2.5)的基础上新增了注解,用于简化Servlet、过滤器(Filter)和监听器(Listener)的开发,无需在应用配置文件web.xml中配置Servlet,从而简化了WEB应用程序的开发和部署。

1Servlet2.x版本的Servlet程序配置

Servlet2.x系列版本的Servlet,需要在web.xml文件中,对Servlet进行配置,并发布到WEB服务器上,Servlet才能正确运行。

配置示例如下:

 <servlet>

<!-- servlet名称(可以自行定义) -->

<servlet-name>Servlet01</servlet-name>

<!-- servlet全路径名 -->

<servlet-class>com.offcn.study.Servlet01</servlet-class>

<!-- servlet初始化参数 -->

<init-param>

     <param-name>charset</param-name>

     <param-value>utf-8</param-value>

</init-param>

<!-- servlet启动参数 -->

    <load-on-startup>-1</load-on-startup>   

  </servlet>

<!-- servlet映射配置 -->

  <servlet-mapping>

<!-- servlet名称一定要与上面定义的Servlet名称保持一致 -->

<servlet-name>Servlet01</servlet-name>

<!-- servlet访问路径1 -->

    <url-pattern>/study/Servlet01</url-pattern>

  </servlet-mapping>

<!-- servlet映射配置(一个Servlet可以有多个映射路径)-->

<servlet-mapping>

<servlet-name>Servlet01</servlet-name>

<!-- servlet访问路径2 -->

    <url-pattern>/html/Servlet01.do</url-pattern>

  </servlet-mapping>

当用户在客户端浏览器URL地址栏中输入Servlet的访问路径,请求访问Servlet时,WEB服务器是如何找到要访问的Servlet的:

1、用户从客户端浏览器中发送Servlet访问请求,例如:

http://127.0.0.1/webApp/study/Servlet01

WEB服务器收到请求后,从web.xml文件的Servlet映射路径<servlet-mapping>中查找与当前Servlet访问路径匹配的<url-pattern>值。

2、根据匹配的<url-pattern>值,找到<servlet-name>标签中的servlet-name,再<servlet>标签中的servlet-name进行匹配。

3根据匹配的<servlet>标签中的servlet-name找到<servlet>子标签<servlet-class>标签中的Servlet类的全路径

4、调用并执行相应的Servlet,响应用户请求

2Servlet3.0版本的Servlet程序配置

Servlet3.0新增的Servlet注解,可以简化Servlet配置,加快Servlet开发速度。

Servlet3.0中,通过注解配置Servlet

配置示例如下:

@WebServlet(

description = "学习Servlet",

urlPatterns = { "/study/Servlet01" },

initParams = {

@WebInitParam(name = "charset", value = "utf-8", description = "字符集"),

@WebInitParam(name = "contentType", value = "text/html;charset=utf-8", description = "内容类型")},

loadOnStartup =  1)

 

(1)理解“注解”

注解又称为“标注”,是Java1.5中引入的新的注释机制。

Java 语言中的类、方法、变量、参数和包等都可以被标注。和Javadoc不同,Java 标注可以通过反射获取标注内容,在编译器生成类文件时,标注可以被嵌入到字节码中,Java虚拟机保留标注内容,并在运行时获取标注内容。

 

(2)@WebServlet注解

@WebServlet注解是标准servlet API中包javax.servlet.annotation中用于描述Servlet的标注,属于类级别的注解。该注解的作用等价于:在web.xml配置文件中的<servlet><servlet-mapping>的配置。

通过@WebServlet注解的属性,可以对Servlet的名称、初始化参数、访问路径等进行标注。

若使用@WebServlet注解,就无需在web.xml中对Servlet进行配置当客户访问Servlet时,Servlet容器就会自动读取注解中的信息。

@WebServlet注解的常用属性如下:

 

属性名称

类型

描述

name

String

指定Servlet的名称,等价于<servlet-name>。如果没有显式指定,则Servlet名称为类的全限定名

urlPatterns

String[]

指定Servlet的访问路径,等价于<url-pattern>标签。可以配置多个映射,例如:urlPatterns={"/ht/Servlet01","