Java Servlet

前言

  • Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

  • 使用 Servlet,可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

  • Java Servlet 通常情况下与使用 CGI(Common Gateway Interface,公共网关接口)实现的程序可以达到异曲同工的效果。

  • Servlet 为创建基于 web 的应用程序提供了基于组件、独立于平台的方法,可以不受 CGI 程序的性能限制。Servlet 有权限访问所有的 Java API,包括访问企业级数据库的 JDBC API。

  • Servlet 教程

1、基础

1.1 Servlet

  • Servlet 小服务程序,是运行在带有支持 Java Servlet 规范的解释器的 web 服务器上的 Java 类,是个接口。

  • Servlet 的主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。

  • 在浏览器上访问的每一个网页都是一个 Servlet,每个 Servlet 都需要配置一个网址,在 web.xml 文件中配置。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app>
    <servlet>
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>HelloServlet</servlet-class>
    </servlet>

    <servlet-mapping>
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    </web-app>
  • Servlet 本身不能独立运行,需要在一个 web 应用中运行的。

  • Servlet 执行以下主要任务:

    • 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
    • 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
    • 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
    • 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
    • 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
  • 开发一个 Servlet 需要如下几个步骤:

    • 创建 Web 应用项目。
    • 编写 Servlet 代码。
    • 部署到 Tomcat 中。
  • Tomcat 和 Servlet 关系图

1.1.1 在 Tomcat 中部署 Servlet 应用

  • 将 Servlet 项目文件放到指定的路径中,如 e:\download\j2ee。
  • 打开 Tomcat conf 目录下的 server.xml 文件。在 <Host name="localhost" 。。。 下面加一句。path="/" 就表示直接通过 http://localhost:8080/hello 就可以访问网页了。

    1
    <Context path="/" docBase="e:\\project\\j2ee\\web" debug="0" reloadable="false" />
  • 如果设置为如下,那么表示需要通过 http://localhost:8080/servlet/hello 才能访问呢。

    1
    <Context path="/servlet" docBase="e:\\project\\j2ee\\web" debug="0" reloadable="false" />
  • 重启 Tomcat,就可以访问了。注意在 Windows 系统中文件路径是双斜杠哦,不是单斜杠。

  • 本地测试

  • 参考设置

1.2 获取参数

  • Servlet 获取从浏览器提交的参数。

  • Get 请求

    1
    2
    3
    public void doGet(HttpServletRequest request, HttpServletResponse response) {

    }
  • Post 请求

    1
    2
    3
    4
    5
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String name = request.getParameter("name");
    String password = request.getParameter("password");
    }
  • 本地测试

1.3 返回响应

  • 返回响应

  • 通过 response.getWriter().println() 发送到浏览器。

1.4 调用流程

1.5 service()

  • 在执行 doGet() 或者 doPost() 之前,都会先执行 service(),由 service() 方法进行判断,到底该调用 doGet() 还是 doPost()。

  • 所以,有时候也会直接重写 service() 方法,在其中提供相应的服务,就不用区分到底是 get 还是 post 了。

  • doGet() 方法

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

    }
  • doPost() 方法

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

    }
  • service() 方法

    1
    2
    3
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

1.6 中文问题

  • 中文问题

  • 获取中文的参数

    1
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    1
    request.setCharacterEncoding("UTF-8");
  • 返回中文的响应

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

1.7 生命周期

  • 一个 Servlet 的生命周期由 实例化,初始化,提供服务,销毁,被回收 几个步骤组成。

  • 无论访问了多少次 Servlet,Servlet 构造方法 只会执行一次,所以 Servlet 是单实例的

  • 无论访问了多少次 Serlvet,init 初始化 只会执行一次。

  • 提供服务:service()

  • 销毁:destroy()

1.8 跳转

  • 页面跳转是开发一个 web 应用经常会发生的事情。比如登录成功或是失败后,分别会跳转到不同的页面。

  • 跳转的方式有两种,服务端跳转 和 客户端跳转。

  • 服务端跳转:浏览器地址不会发生变化。

    1
    request.getRequestDispatcher("success.html").forward(request, response);
  • 客户端跳转:浏览器地址会发生变化。

    1
    response.sendRedirect("fail.html");

1.9 自启动

  • 自启动:即,伴随着 Tomcat 的启动,自动启动初始化,在初始化方法 init() 中,进行一些业务代码的工作。

  • 在 web.xml 中,配置 Servlet 的地方,增加下面一句,取值范围是 1-99,表示启动顺序,数字越小,启动的优先级越高,即表明该 Servlet 会随着 Tomcat 的启动而初始化。

    1
    2
    3
    <servlet>
    <load-on-startup>10</load-on-startup>
    </servlet>
  • 同时,为 Servlet 提供一个 init(ServletConfig) 方法,进行一些业务代码的工作。

    1
    2
    3
    public void init(ServletConfig config){
    System.out.println("init of Hello Servlet");
    }

1.10 request

  • request 对象的类是 HttpServletRequest,提供了很多有实用价值的方法。

  • 常见方法

方法 介绍
request.getRequestURL() 浏览器发出请求时的完整 URL,包括协议 主机名 端口 (如果有)
request.getRequestURI() 浏览器发出请求的资源名部分,去掉了协议和主机名
request.getQueryString() 请求行中的参数部分,只能显示以 GET 方式发出的参数,POST 方式的看不到
request.getRemoteAddr() 浏览器所处于的客户机的 IP 地址
request.getRemoteHost() 浏览器所处于的客户机的主机名
request.getRemotePort() 浏览器所处于的客户机使用的网络端口
request.getLocalAddr() 服务器的 IP 地址
request.getLocalName() 服务器的主机名
request.getMethod() 客户机请求方式,一般是 GET 或者 POST
  • 获取参数
方法 介绍
request.getParameter() 是常见的方法,用于获取单值的参数
request.getParameterValues() 用于获取具有多值的参数,比如注册时候提交的 “hobits”,可以是多选的
request.getParameterMap() 用于遍历所有的参数,并返回 Map 类型
  • 获取头信息
方法 介绍
request.getHeader() 获取浏览器传递过来的头信息。比如 getHeader(“user-agent”) 可以获取浏览器的基本资料
request.getHeaderNames() 获取浏览器所有的头信息名称,根据头信息名称就能遍历出所有的头信息
头信息 介绍
host 主机地址
user-agent 浏览器基本资料
accept 表示浏览器接受的数据类型
accept-language 表示浏览器接受的语言
accept-encoding 表示浏览器接受的压缩方式,是压缩方式,并非编码
connection 是否保持连接
cache-control 缓存时限
  • 服务端传参
方法 介绍
setAttribute 和 getAttribute 可以用来在进行服务端跳转的时候,在不同的 Servlet 之间进行数据共享

1.11 response

  • response 是 HttpServletResponse 的实例,用于提供给浏览器的响应信息。

  • 设置响应内容

    1
    2
    3
    4
    5
    6
    PrintWriter pw = response.getWriter();

    pw.println();
    pw.append();
    pw.write();
    pw.format();
  • 设置响应格式

    1
    response.setContentType("text/html");
  • 设置响应编码

    1
    2
    response.setContentType("text/html; charset=UTF-8");
    response.setCharacterEncoding("UTF-8");
  • 客户端有两种跳转

    • 301 表示永久性跳转

      1
      response.sendRedirect("fail.html");
    • 302 表示临时跳转

      1
      2
      response.setStatus(301);
      response.setHeader("Location", "fail.html");
  • 设置不使用缓存

    1
    2
    3
    response.setDateHeader("Expires", 0);
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("pragma", "no-cache");

1.12 上传文件

2、动态 Web 项目

3、CRUD

  • CRUD 是常见的页面功能,即我们常说的增删改查。

    • C - Creation 增加
    • R - Retrieve 查询
    • U - Update 修改
    • D - DELETE 删除
  • 本地测试

  • 查询:与 JDBC 结合,通过 servlet 查询数据库,根据查询结果,得到一个 html 页面,显示数据库中的内容。

  • 增加

  • 删除

  • 编辑

  • 更新

  • 使用 Servlet 进行 CRUD 开发的弊端,其中一个比较明显的弊端就是在 Servlet 编写 HTML 代码很痛苦,效率不高,可读性差,难以维护。

  • 最好可以在 HTML 文件里面写 HTML 代码,同时又能在里面调用 Java 的变量,那么这样就需要学习 JSP 了。

4、JSON

文章目录
  1. 1. 前言
  2. 2. 1、基础
    1. 2.1. 1.1 Servlet
      1. 2.1.1. 1.1.1 在 Tomcat 中部署 Servlet 应用
    2. 2.2. 1.2 获取参数
    3. 2.3. 1.3 返回响应
    4. 2.4. 1.4 调用流程
    5. 2.5. 1.5 service()
    6. 2.6. 1.6 中文问题
    7. 2.7. 1.7 生命周期
    8. 2.8. 1.8 跳转
    9. 2.9. 1.9 自启动
    10. 2.10. 1.10 request
    11. 2.11. 1.11 response
    12. 2.12. 1.12 上传文件
  3. 3. 2、动态 Web 项目
  4. 4. 3、CRUD
  5. 5. 4、JSON
隐藏目录