Servlet 简单了解


Servlet(Server Applet)Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web内容。

狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

实现过程

最早支持 Servlet技术的是 JavaSoftJava Web Server。此后,一些其它的基于Java Web Server 开始支持标准的Servlet APIServlet的主要功能在于交互式地浏览和修改数据,生成动态 Web内容。这个过程为:

1.客户端发送请求至服务器端;

服务器将请求信息发送至 Servlet;Servlet生成响应内容并将其传给服务器。响应内容动态生成,通常取决于客户端的请求;

2.服务器将响应返回给客户端。

一个 Servlet就是 Java 编程语言中的一个类,它被用来扩展服务器的性能,服务器上驻留着可以通过"请求-响应"编程模型来访问的应用程序。虽然Servlet 可以对任何类型的请求产生响应,但通常只用来扩展Web 服务器的应用程序。

访问过程

eclipse开发web动态项目,客户通过浏览器只能访问静态资源(图片,html等),如果想要访问动态资源,需要servlet实现客户端与服务器的交互,jvm将编译好的servlet字节码文件处放入WEB-INF下的class文件夹中,web-inf文件夹无法直接访问,需要通过配置web.xml文件进行间接访问。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 <!-- 项目名 -->
  <display-name>web_test</display-name>
   <!-- 欢迎页面 -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 配置路径 -->
  <servlet>
  <servlet-name>ServletDemo</servlet-name>
  <servlet-class>web_test.ServletDemo</servlet-class>
  <!-- 配置优先级-->
  <load-on-startup>1</load-on-startup>
  </servlet>
   <!-- 配置外部访问路径 -->
  <servlet-mapping>
  <servlet-name>ServletDemo</servlet-name>
  <url-pattern>/ServletDemo</url-pattern>
  </servlet-mapping>
</web-app>

 生命周期

客户端请求该 Servlet;

加载 Servlet类到内存;

实例化并调用init()方法初始化该Servlet;

service()(根据请求方法不同调用doGet()doPost(),此外还doHead()doPut()doTrace()doDelete()doOptions()destroy())

加载和实例化 Servlet。这项操作一般是动态执行的。然而,Server通常会提供一个管理的选项,用于在 Server启动时强制装载和初始化特定的 Servlet

Server 创建一个 Servlet的实例

第一个客户端的请求到达 Server

Server 调用 Servlet init() 方法(可配置为Server 创建Servlet 实例时调用,在web.xml <servlet> 标签下配置<load-on-startup> 标签,配置的值为整型,值越小Servlet 的启动优先级越高)

一个客户端的请求到达 Server

Server 创建一个请求对象,处理客户端请求

Server 创建一个响应对象,响应客户端请求

Server 激活 Servlet service() 方法,传递请求和响应对象作为参数

service()方法获得关于请求对象的信息,处理请求,访问其他资源,获得需要的信息

service()方法使用响应对象的方法,将响应传回Server,最终到达客户端。service()方法可能激活其它方法以处理请求,如doGet() doPost() 或程序员自己开发的新的方法。

对于更多的客户端请求,Server创建新的请求和响应对象,仍然激活此 Servletservice()方法,将这两个对象作为参数传递给它。如此重复以上的循环,但无需再次调用 init() 方法。一般 Servlet只初始化一次(只有一个对象),当Server 不再需要Servlet (一般当Server 关闭时)Server调用 Servletdestroy()方法。

package web_test;

import java.io.IOException;

import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class ServletDemo implements Servlet {
	/**
	 * 1. 什么方法: 初始化servlet调用的方法
	 * 
	 * 2. 执行者:tomcat 创建对象,然后调用方法
	 * 
	 * 3. 执行次数:1
	 * 
	 * 4. 执行时机:
	 * 
	 * 默认情况:第一次访问的时候!!!
	 * 
	 * 如果在servlet里面配置了,开机就启动, <load-on-startup>1</load-on-startup>
	 */
	@Override
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init");
	}

	/**
	 * 1. 什么方法: 核心业务方法
	 * 
	 * 2. 执行者: tomcat
	 * 
	 * 3. 执行次数:每次
	 * 
	 * 4. 执行时机:每次请求
	 */
	@Override
	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("service");
	}

	/**
	 * 1. 什么方法: 销毁
	 * 
	 * 2. 执行者:tomcat
	 * 
	 * 3. 执行次数: 1
	 * 
	 * 4. 执行时机:tomcat 正常关闭,或者项目移除
	 */
	@Override
	public void destroy() {
		System.out.println("destroy");
	}

	@Override
	public ServletConfig getServletConfig() {
		// 获取servlet配置
		return null;
	}

	@Override
	public String getServletInfo() {
		// 获取servlet信息
		return null;
	}

}
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="/web_test/ServletDemo"> 测试</a>

</body>
</html>



编程接口

HTTPServlet 使用一个HTML 表单来发送和接收数据。要创建一个HTTPServlet,请扩展 HttpServlet 类, 该类是用专门的方法来处理 HTML 表单 GenericServlet 的一个子类。 HTML表单是由 <form></form>标记定义的。表单中典型地包含输入字段(如文本输入字段、复选框单选按钮和选择列表)和用于提交数据的按钮。当提交信息时,它们还指定服务器应执行哪一个Servlet(或其它的程序)HttpServlet 类包含init()destroy()service()等方法。其中 init()destroy()方法是继承的。

(1) init()方法

Servlet的生命期中,仅执行一次 init()方法。它是在服务器装入 Servlet时执行的。 可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 无论有多少客户机访问Servlet,都不会重复执行init()

缺省的 init()方法通常是符合要求的,但也可以用定制 init()方法来覆盖它,典型的是管理服务器端资源。例如,可能编写一个定制 init() 来只用于一次装入 GIF 图像,改进Servlet 返回GIF 图像和含有多个客户机请求的性能。另一个示例是初始化数据库连接。缺省的init() 方法设置了Servlet 的初始化参数,并用它的ServletConfig 对象参数来启动配置, 因此所有覆盖init() 方法的Servlet 应调用super.init() 以确保仍然执行这些任务。在调用service() 方法之前,应确保已完成了init() 方法。

(2) service()方法

service()方法是 Servlet 的核心。每当一个客户请求一个HttpServlet对象,该对象的service()方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。 在 HttpServlet 中已存在service() 方法。缺省的服务功能是调用与HTTP 请求的方法相应的do 功能。例如, 如果HTTP 请求方法为GET,则缺省情况下就调用doGet() Servlet应该为 Servlet支持的 HTTP方法覆盖 do功能。因为 HttpServlet.service()方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service()方法。只需覆盖相应的 do方法就可以了。

Servlet 的响应可以是下列几种类型:

一个输出流,浏览器根据它的内容类型(text/html)进行解释。

一个 HTTP错误响应,重定向到另一个 URLservletJSP

(3) doGet()方法

当一个客户通过 HTML 表单发出一个 HTTP GET 请求或直接请求一个 URL时,doGet()方法被调用。与 GET请求相关的参数添加到 URL的后面,并与这个请求一起发送。当不会修改服务器端的数据时,应该使用 doGet() 方法。

(4) doPost()方法

当一个客户通过 HTML表单发出一个 HTTP POST请求时,doPost()方法被调用。与 POST请求相关的参数作为一个单独的 HTTP请求从浏览器发送到服务器。当需要修改服务器端的数据时,应该使用 doPost()方法。

(5) destroy()方法

destroy()方法仅执行一次,即在服务器停止且卸装 Servlet时执行该方法。典型的,将 Servlet作为服务器进程的一部分来关闭。缺省的 destroy()方法通常是符合要求的,但也可以覆盖它,典型的是管理服务器端资源。例如,如果 Servlet 在运行时会累计统计数据,则可以编写一个destroy() 方法,该方法用于在未装入Servlet 时将统计数字保存在文件中。另一个示例是关闭数据库连接。

服务器卸装 Servlet 时,将在所有 service()方法调用完成后,或在指定的时间间隔过后调用 destroy()方法。一个 Servlet在运行 service()方法时可能会产生其它的线程,因此请确认在调用 destroy()方法时,这些线程已终止或完成。

(6) getServletConfig()方法

getServletConfig()方法返回一个 ServletConfig对象,该对象用来返回初始化参数和 ServletContextServletContext接口提供有关 servlet的环境信息。

(7) getServletInfo()方法

getServletInfo()方法是一个可选的方法,它提供有关 servlet的信息,如作者、版本、版权。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form method="post" action="/web_test/LoginServlet">
		姓名:<input type="text" size="10" name="username"> 
		密码:<input id="password" type="password" size="10" name="pwd"> 
		<input type="submit" value="提交" /> <input type="reset" />
	</form>

</body>
</html>
package web_test;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 设置编码
		request.setCharacterEncoding("utf-8");
		// 获取用户密码
		String username = request.getParameter("username");
		String password = request.getParameter("pwd");
		// 打印
		System.out.println(username + "  " + password);
		// 响应
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().println("欢迎" + username);

	}

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}




      响应


      控制台



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值