Java Web之Servlet技术

1、Servlet基础

  针对Servlet技术开发,Sun公司提供了一些列接口和类,其中最重要的是javax.servlet.Servlet接口,两个重要的包是javax.servlet和javax.servlet.http,Servlet就是一种实现了Servlet接口的类,它由Web容器(Tomcat/Jetty等)负责调用并创建,用于接收和响应用户请求。Servlet接口中定义了5个抽象方法:

方法 功能
void init(ServletConfig config)
负责Servlet初始化工作,容器在创建好Servlet对象后就调用此方法。该方法接受一个

ServletConfig 类参数,Servlet容器通过这个参数向Servlet传递配置信息

ServletConfig getServletConfig() 返回容器调用init(ServletConfig config)时传递的ServletConfig 对象
void service(ServletRequest req, ServletResponse res)
负责响应用户的请求,当接收到客户端访问Servlet对象的请求时就会调用此方法。

容器会构造一个ServletRequest和ServletResponse对象作为参数传递到该方法中,

在该方法中通过ServletRequest对象获取请求信息,对请求处理完成后,通过

ServletResponse对象设置响应消息

String getServletInfo()
返回一个字符串,包含Servlet信息。注意,该方法自己需要重定义,在GenericServlet

类中该方法返回空字符串

void destroy() 负责释放Servlet对象占用的资源,当Servlet对象被销毁时,容器会调用该函数

Servlet顶层类结构如下所示:

2、第一个Servlet程序

  新建一个Java Web工程,然后新建Hello类,Hello.java源码如下:

package zzz;

import java.io.IOException;
import java.io.PrintWriter;

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

public class Hello extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 设置响应消息编码
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("Hello World");
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        this.doGet(request, response);
    }
}

  配置文件web.xml如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    <display-name>zzz</display-name>

  <servlet> <!-- 注册Servlet -->
      <servlet-name>Hello</servlet-name> <!-- 指定Servlet名称 -->
      <servlet-class>zzz.Hello</servlet-class> <!-- 指定Servlet完整类名 -->
  </servlet>
  <servlet-mapping> <!-- 映射Servlet对外访问路径 -->
      <servlet-name>Hello</servlet-name> <!-- 指定Servlet名称 -->
      <url-pattern>/hello</url-pattern> <!-- 指定访问Servlet的虚拟路径 -->
  </servlet-mapping>
</web-app>

  启动运行浏览器显示如下:

3、Servlet生命周期

  Servlet生命周期大致分为3个阶段,初始化阶段、运行阶段和销毁阶段。以下是各个阶段详细说明:

  • 初始化阶段:客户端向Servlet容器发出请求访问Servlet时,容器首先解析请求,查看内存中是否有该Servlet对象,如果有直接使用;否则创建该Servlet对象,然后调用init()方法,注意,Servlet整个声明周期中,init()只会调用一次
  • 运行阶段:这个是Servlet最重要的阶段,此阶段容器会构造一个ServletRequest和ServletResponse对象作为参数传递到Servlet的service()方法中。对于Servlet的每一次访问,Servlet容器都会调用一次service()方法,service()方法在Servlet整个生命周期中会被调用多次
  • 销毁阶段:当服务器关闭或者Web应用被移除出容器时,会进入到此阶段,此时会调用destroy()方法,整个生命周期中destroy()方法只会被调用一次

  在客户端首次访问Servlet时,容器会创建该Servlet对象,但是有时希望Servlet对象在Tomcat启动时跟随启动,这怎么处理呢?此时,只需要在web.xml中使用<load-on-startup>元素即可,示例配置如下:

<servlet>
      <servlet-name>Hello</servlet-name>
      <servlet-class>zzz.Hello</servlet-class>
    <!-- 自动加载servlet程序 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>Hello</servlet-name>
      <url-pattern>/hello</url-pattern>
  </servlet-mapping>

4、ServletConfig和ServletContext

ServletConfig接口

  Servlet运行期间,如果需要一些辅助信息,例如文件编码、使用Servlet的公司等,这些信息可以在web.xml中使用<init-param>元素进行配置,当Tomcat初始化一个Servlet时,会将该Servlet配置信息封装成一个ServletConfig对象通过init(ServletConfig config)传递到Servlet。ServletConfig定义了一系列获取配置信息的方法:

方法 功能
String getServletName() 返回Servlet名字,即web.xml中<servlet-name>中的值
ServletContext getServletContext() 返回代表当前Web应用的ServletContext对象
String getInitParameter(String name) 根据参数名返回对应的参数值,如果未找到返回null
Enumeration<String> getInitParameterNames() 返回一个Enumeration对象,其中包含所有的初始化参数

  接下来以getInitParameter()为例,讲解该方法使用示例:

web.xml配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://xmlns.jcp.org/xml/ns/javaee"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
    <display-name>zzz</display-name>

  <servlet>
      <servlet-name>Hello</servlet-name>
      <servlet-class>zzz.Hello</servlet-class>
      <init-param>
          <param-name>company</param-name>
          <param-value>dahua</param-value>
      </init-param>
  </servlet>
  <servlet-mapping>
      <servlet-name>Hello</servlet-name>
      <url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

Hello.java文件如下:

package zzz;

import java.io.IOException;
import java.io.PrintWriter;

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

public class Hello extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 设置响应消息编码
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        ServletConfig config = this.getServletConfig();
        String param = config.getInitParameter("company");
        out.println("company: " + param);
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        this.doGet(request, response);
    }
}

ServletContext接口

  当Servlet容器启动时,会为每一个Web应用创建一个唯一的ServletContext对象代表当前Web应用,该对象不仅封装了该Web应用的所有信息,而且实现了多个Servlet对象间的数据共享。在web.xml中不仅可以配置Servlet的初始化信息,还可以配置整个Web应用的初始化信息,配置方式如下所示:

<context-param>
    <param-name>name</param-name>
    <param-value>luoxn28</param-value>
</context-param>
<context-param>
    <param-name>company</param-name>
    <param-value>dahua</param-value>
</context-param>

  注意:一个<context-param>元素里只能有一个<param-name>和<param-value>,上面的配置在web.xml中<web-app>下配置。Hello.java文件如下:

package zzz;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

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

public class Hello extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
        // 设置响应消息编码
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();

        ServletContext context = this.getServletContext();
        Enumeration<String> paramNames = context.getInitParameterNames();
        while (paramNames.hasMoreElements()) {
            String name = paramNames.nextElement();
            String value = context.getInitParameter(name);
            out.println(name + ": " + value + "<br/>");
        }
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
        this.doGet(request, response);
    }
}

  由于一个Web应用中所有Servlet共享一个ServletContext对象,所以ServletContext对象的域属性可以被Web应用中所有的Servlet访问。在ServletContext接口中定义了分别增加、删除、设置ServletContext域属性的4个方法:

方法 功能
Object getAttribute(String name) 根据指定参数获取一个匹配的域属性值
Enumeration<String> getAttributeNames() 返回一个Enumeration对象,包含所有存放在ServletContext中所有域属性名
void setAttribute(String name, Object object) 设置ServletContext域属性值,name-域属性名,object-域属性值
void removeAttribute(String name) 根据指定的域属性名从ServletContext中移除域属性

  通过以上方法就可以实现多个Servlet间共享数据,这个具体实例就不贴代码了,网上可参考的资料很多,比如可以点击javaweb学习总结(六)——Servlet开发(二)

5、参考资料

  1、《Java Web程序开发入门》Servlet技术章节

  2、javaweb学习总结(六)——Servlet开发(二)

时间: 2024-10-16 10:36:31

Java Web之Servlet技术的相关文章

Java web(Servlet技术基础)

1.Servlet技术 1.1 Servlet概述: 什么是Servlet:它是运行在web服务器端的一个Java小程序,简单来说,它就是一个Java类. 在使用Servlet时,需要导入javax.servlet下的jar包.比如:Tomcat服务器 提供了Servlet的servlet-api.jar包,所以在开发时用Tomcat服务器就不需要 再导入Servlet的jar包. Servlet它是一个资源,是用来被用户访问的资源,同时是一个动态资源,它是由sun公司指定的Servlet规范.

Java Web之会话技术

客户端与服务器通信过程中,会产生一些数据.比如,A和B分别登陆了某宝购物网站,A买了一个Android手机,B买了一个iPhone手机,当结账时,web服务器需要分别对用户A和B的信息分别保存.根据Java Web之Servlet技术中所说,HttpServletRequest对象和ServletContext对象都可以保存数据,但是这二者在该情形下是不适合使用的. 客户端的每次请求,服务器都会产生一个HttpServletRequest对象,该对象只保存本次请求所传递的数据.由于购买和结账是两

Java Web基础 --- Servlet 综述(实践篇)

摘要: 伴随 J2EE 6一起发布的Servlet 3.0规范是Servlet规范历史上最重要的变革之一,它的许多新的特性都极大的简化了 Java Web 应用的开发.本文从一个简单的 Servlet 例子开始,说明了如何开发.配置一个 Servlet.此外,还重点叙述了Servlet的一些新特性,包括Servlet 异步处理.Servlet 非阻塞IO 以及 Servlet 文件上传等内容,以便我们对Servlet有一个更全面的了解. 本篇主要介绍 Servlet 实践方面的知识,更多关注于S

第一章 Java Web应用开发技术

1.Java Web应用开发技术 Java Web应用开发是基于JavaEE(JavaEnterprise Edition)框架的,而JavaEE是建立在Java平台上的企业级应用解决方案.JavaEES框架提供的Web开发技术主要支持两类软件的开发和应用,一类是做高级信息系统框架的Web应用服务器(Web Application Server),另一类是在Web服务器上运行的Web应用(Web Application).我们以后所说的Java Web应用开发就是这里的第二类.即在Web服务器上

Java EE之Servlet技术

Java EE之Servlet技术 java Servlet介绍 Java Servlet是java EE标准规范之一.Servlet是Java Web 技术的核心基础, 因此掌握好Servlet是很有必要的.掌握Servlet的工作原理是成为一名合格的 Java Web技术开发人员的基本要求. Servlets are very important topic of Java EE and all of the web applications framework such as Spring

java web中servlet、jsp、html 互相访问的路径问题。

在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可以分两种情况,当然啦两者使用相对路径是一致,本文只说绝对路径. 情况一.指向外部的web组件和本身关系不大的,这一类的有:html中使用路径的标签,比如<a>标签中的href;servlet和jsp中的重定向sendRedirect(path); 情况二.指向内部的web组件和本身有关系的,这一类我暂时看到的有:servlet或者jsp的转发 假设在myapp项目下有

Java Web应用开发技术简介

java web应用一般定义为:一个有HTML/XML文档,java Servlet,JSP(java Server Pages),JSTL(Java Server Pages Standard Tag Library),类以及其他任何种类文件可以捆绑起来,并在来自多个厂商的多个Web容器上运行的Web资源构成的集合. 一:Java Web应用开发是基于JavaEE框架的,而JavaEE是建立在java平台上的企业级应用的解决方案,所以java web需要javaEE的容器和组件. 1.容器:指

Java Web之JSP技术

JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP这门技术的最大的特点在于,写jsp就像在写html,但它相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据. 1.JSP运行原理 当用户第一次访问JSP页面时,该页面会被JSPServlet翻译成一个Servlet源文件,然后将源文件翻译成.class文件.Servlet源文件和.class文件一般放在当

攻城师之路--复习java web之servlet

需要掌握的知识点:1.Servlet程序编写 ----- 生命周期2.ServletAPI Request Response 3.Cookie 和 Session Servlet 用来 动态web资源 开发静态web资源 : 固定数据文件动态web资源 : 通过程序动态生成数据文件 Servlet技术基于Request-Response编程模型 ---- HTTP协议也是基于请求响应 模型 * Servlet技术 用来 开发基于HTTP web 应用程序 接触 JavaEE API ------