Servlet学习之(四)创建Servlet程序
Servlet是一个用Java语言编写的、实现Servlet接口的类,它在Servlet容器中运行,由Servlet容器管理Servlet的整个生命周期,所以,也常常称Servlet是Servlet容器上运行的服务器小程序。
从Servlet实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下,Servlet只用来扩展基于HTTP协议的WEB应用功能。
在WEB应用程序中,Servlet有两个主要用途:
(1)实现动态网页
(2)作为前端页面与后台数据库或者后台服务器程序之间的中间件。
一、WEB应用程序
WEB应用程序是一种通过WEB(World 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程序中,可以根据客户的请求方式(例如:GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS),重写为客户请求提供服务的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程序创建的区别
Servlet是Java 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应用程序的开发和部署。
1、Servlet2.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类,响应用户请求。
2、Servlet3.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","
|