Servlet

通过前面一系列的博客的梳理,学习了一下Java基础的编程知识,从我自己的感觉上来说,Java与c++的差距并不是很大,Java将c++做了更进一步的抽象,同时丢弃了c++中一些容易出错和难懂的部分。Java的基础语法比起c++来说要简单很多。但是Java与c++一样,不能光学基础语法,还得从应用角度来学习它,使用它来做一些真真的项目。
从现在开始博客内容从Java的基础过渡到了Java2E的学习

Servlet 简介

Servlet 英文全称是Server Applet,也叫做Java Servlet;是用Java编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态Web内容。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。

Servlet运行于支持Java的应用服务器中。从实现上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

———— 来自维基百科

Servlet 容器

从上面的定义来看 Servlet 就是一套Java的接口标准,在编写Java Web程序的时候需要遵循这套标准的接口,实现自己的Servlet 接口,并且由服务器端程序来调用,并向其他用户提供服务。目前市面上常见的支持Servlet 标准的Web容器有:

  1. Tomcat: 由Apache 基金会的一个项目,由 Apache、Sun和其他公司及个人合作开发而成。Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
  2. WebLogic: WebLogic是美国Oracle公司出品的一个application server;WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器,量级比Tomcat 要大上许多,同时也能承载更多用户的使用
  3. JBoss:是一个基于J2EE的开放源代码的应用服务器。 JBoss代码遵循LGPL许可,可以在任何商业应用中免费使用;但JBoss核心服务不包括支持servlet/JSP的WEB容器,一般与Tomcat或Jetty绑定使用。
  4. WebSphere: 是由IBM遵照开放标准,例如Java EE、XML及Web Services,开发并发行的一种应用服务器

Servlet架构

一般一个web项目中,主要分为WEB-INFO目录和一些jsp/html页面,其中WEB-INFO中主要包含 classes 目录(java 字节码文件)、web.xml(项目配置文件)、lib目录(项目依赖文件)
在web.xml 中会指定哪些url由哪些Servlet 接口的实现类来处理,当url到达web服务器后,由服务器处理并调用对应的Servlet 类;Web容器要实现这个功能,必然会用到反射机制

当用户在浏览器中输入对应的url并点击回车后:

  1. 浏览器会向对应的地址发送 HTTP请求包
  2. 对应的服务器收到这个请求包,并获取到请求的路径
  3. 根据请求路径找到对应的项目
  4. 在项目中查找对应的web.xml 文件,找到这个路径对应的Servlet 类
  5. 调用Servlet 类并拿到返回值
  6. 将返回封装到Http 的响应中,响应到浏览器上

Servlet使用

Servlet

普通Servlet 接口定义如下:

1
2
3
4
5
6
7
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public ServletConfig getServletConfig();
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
public String getServletInfo();
public void destroy();
}

要回答这些接口函数都是干什么的,首先需要知道 一个Servlet对象的生命周期。

当项目所在的Web容器启动之后,容器中的所有项目也随之启动,这个时候项目中所有的Servlet 被创建,当容器正常关闭之前,会停止所有项目并析构回收所有Servlet 资源。

  1. init方法:每当Servlet 创建的时候调用一次,并且仅调用这一次。,所有我们可以将一些在项目启动之时需要提前做的操作放到这个方法中
  2. service方法:用于提供服务,每当用户通过浏览器或者其他方式访问该servlet时,服务器会产生一个新的线程并调用该方法一次,该方法用户为用户提供服务并返回处理结果。
  3. destroy方法:当servlet正常被Web容器关闭的时候会首先调用该方法,用于清理某些资源并做最后的收尾工作。

实例

为了方便进行Web 开发,JavaEE中提供了一个HttpServlet 类,它封装了基本的Servlet 接口,并提供了一些列的doXXX方法来处理HTTP 协议中几种不同的请求方法,例如doGet和doPost等等,下面的例子就使用这个类来进行编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

// 扩展 HttpServlet 类
public class HelloWorldServlet extends HttpServlet {

private String message;

public void init() throws ServletException
{
// 执行必需的初始化
System.out.println("init........");
message = "Hello World";
}

public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 设置响应内容类型
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
}

public void destroy()
{
// 什么也不做
}
}

代码写完后,可以配置对应的web.xml 文件,其中重要的部分如下:

1
2
3
4
5
6
7
8
9
10
11
<web-app><!--web项目置于次标签内-->
<servlet>
<servlet-name>HelloWorld</servlet-name> <!--目录名称-->
<servlet-class>HelloWorldServlet</servlet-class> <!--对应类名称-->
</servlet>

<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
</web-app>

最终访问 http://localhost:8080/HelloWorld 时会调用HelloWorldServlet 类,并返回helloworld字符串到浏览器中