【JavaWeb - 网页编程】六 Tomcat 服务器 与 Servlet 技术

发布于:2023-02-09 ⋅ 阅读:(598) ⋅ 点赞:(0)


第六章 Tomcat 服务器 与 Servlet 技术

创作日期:2021-12-25


6.1 JavaWeb 的概念

6.1.1 什么是JavaWeb

        JavaWeb 是指所有通过 Java 语言编写可以通过浏览器访问的程序的总称,基于请求和响应来开发的


6.1.2 什么是请求与响应

        请求(Request)是指客户端给服务器发送数据,响应(Response)是指服务器给客户端回传数据


6.1.3 请求和响应的关系

请求和响应是成对出现的,有请求就有响应


6.2 Web 资源的分类与常用服务器

6.2.1 Web 资源的分类

  • web 资源按实现的技术和呈现的效果的不同,又分为静态资源和动态资源两种
    • 静态资源:html,css,js,txt,视频,图片
    • 动态资源:jsp 页面,Servlet 程序

6.2.2 常用的 Web 服务器

  • Tomcat:由 Apache 组织提供的一种 Web 服务器,提供对 jsp 和 Servlet 的支持。它是一种轻量级的 javaWeb 容器(服服务器),也是当前应用最广的 JavaWeb 服务器(免费)

  • Jboss:是一个遵从 JavaEE 规范的,开放源代码的,纯 Java 的 EJB 服务器,它支持所有的 JavaEE 规范(免费)

  • GlassFish:由 Oracle 公司开发的一款 JavaWeb 服务器,是一款强健的商业服务器,达到了产品级质量(应用很少)

  • Resin:是 CAUCHO 公司的产品,是一个非常流行的服务器,对 servlet 和 JSP 提供了良好的支持,性能也比较优良,resin 自身采用 JAVA 语言开发(收费,应用比较多)

  • WebLogic:是 Oracle 公司的产品,是目前应用最广泛的 Web 服务器,支持 JavaEE 规范,而且不断的完善以适应新的开发要求,适合大型项目(收费,用的不多,适合大公司)


6.2.3 Tomcat 服务器和 Servlet 版本的对应关系


6.3 Tomcat 的使用

6.3.1 安装与目录介绍

将需要用的 Tomcat 版本对应的 zip 压缩包解压到需要安装 的目录

  • bin 专门用来存放 Tomcat 服务器的可执行程序
  • conf 专门用来存放 Tomact 服务器的配置文件
  • lib 专门用来存放 Tomcat 服务器的 jar 包
  • logs 专门用来存放 Tomcat 服务器运行时输出的日志信息
  • temp 专门用来存放 Tomcat 运行时产生的临时数据
  • webapps 专门用来存放部署的 web 工程
  • work 是 Tomcat 工作时的目录,用来存放 Tomcat 运行时 jsp 翻译为 Servlet 的源码,和 Session 钝化的目录


6.3.2 启动 Tomcat 服务器       

        找到 Tomcat 目录下的 bin 目录下的 startup.bat 文件,双击就可启动 Tomact 服务器 

测试是否启动成功:

  • 打开网页,在地址栏中输入:http://localhost:8080 
  • 打开网页,在地址栏中输入:http:/127.0.0.1:8080 
  • 打开网页,在地址栏中输入: http:/真实ip:8080 

能够跳转到以下页面证明 Tomact 服务器 启动成功


6.3.3 关闭 Tomcat 服务

方式:

  • 点击 tomcat 服务器窗口的关闭按钮
  • 找到 Tomcat 目录下的 bin 目录下的 shutdown.bat 文件,双击关闭 Tomact 服务器 


6.3.4 部署 web 工程到 Tomcat 中       

  • 方法一:
    • 把 web 工程的目录拷贝到 Tomcat 的 webapps 目录下
    • 在网址 http://localhost:8080 后输入需要访问的 web 工程网页的路径即可打开
  • 如:http://localhost:8080/Book_store/index.html 

  • 方法二:
    • 当在浏览器的地址栏中输入的访问地址没有工程名时,默认访问的是 ROOT 工程下的 index 页面,如:http://127.0.0.1:8080

    • 当在浏览器的地址栏中输入的访问地址有工程名,没有资源名时,默认访问的是工程下的 index.html 页面,如:http://127.0.0.1:8080/Book_store/


6.3.5 IDEA 整合 Tomcat 服务器

在 IDEA 中点击 设置(Setting)进入此页面:

  • 找到 Bulid,Execution,Deployment 选项下的 Application Servers
  • 点击 + 号 找到 Tomcat Server 点击添加
  • 进入 Tomcat 服务器地址设置,进行选择电脑所安装的 Tomcat 地址目录 点击确定


6.3.6 IDEA 中动态 web 工程的操作

  • 新建一个模块,设置一下内容后,点击下一步

  • 输入项目模块名称,点击完成即可

目录介绍:

  • src 目录:存放 java 源代码文件
  • webapp 目录:存放 web 工程的资源文件,如 html 页面,css 文件,js 文件等等
  • WEB - INF 目录:受服务器保护的目录,浏览器无法直接访问
  • lib 目录:用来存放第三方的 jar 包
  • web.xml 文件:整个 web 动态工程的配置文件,描述文件,可以配置很多 web 工程的组件

6.4 Servlet 技术

6.4.1 Servlet 的概念

  • Servlet 是 JavaEE 规范之一(接口之一)
  • JavaWeb 三大组件之一,分别是:Servlet 程序,Filter 过滤器,Listener 监视器
  • 运行在服务器上的一个 java 程序,可以接收客户端发过来的请求,并响应数据给客户端

6.4.2 第一个Servlet 程序

  • 编写一个类去实现 Servlet 接口
  • 实现 service 方法,处理请求,并响应数据
  • 在 web.xml 中去配置 servlet 程序的访问地址
<%-- index.jsp --%>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
  <title>JSP - Hello World</title>
</head>
<body>
<h1><%= "Hello World!" %></h1>
</body>
</html>
/* HelloServlet.java */
package com.example.Tomcat_web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet implements Servlet {

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    /*
    * service 方法专门用来处理请求和响应
    * */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("HelloServlet 被访问了!");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}
<?xml version="1.0" encoding="UTF-8"?>
<!-- web.xml -->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- servlet 标签给 Tomcat 服务器配置 Servlet 程序 -->
    <servlet>
        <!-- servlet-name 标签给 Servlet 程序起一个别名(一般是类名)-->
        <servlet-name>HelloServlet</servlet-name>
        <!-- servlet-class 标签是 Servlet 程序的全类名 -->
        <servlet-class>com.example.Tomcat_web.HelloServlet</servlet-class>
    </servlet>

    <!-- servlet-mapping 标签给 Servlet 程序配置访问地址 -->
    <servlet-mapping>
        <!-- servlet-name 标签是告诉服务器当前配置的地址给哪个 Servlet 程序用 -->
        <servlet-name>HelloServlet</servlet-name>
        <!-- url-pattern 标签配置访问地址
         / 在服务器解析的时候,表示地址为:http://ip:port/工程路径
         /hello 表示地址为:http://ip:port/工程路径/hello -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>

</web-app>

6.4.3 Servlet 生命周期方法

  • 执行 Servlet 构造器方法:在创建 Servlet 程序时会调用
  • 执行 init 初始化方法:在创建 Servlet 程序时会调用
  • 执行 service 方法:每次访问都会调用
  • 执行 destroy 销毁方法:在工程项目停止时会调用
/* HelloServlet.java */
package com.example.Tomcat_web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet implements Servlet {

    public HelloServlet() {
        System.out.println("01-执行 Servlet 构造器方法");
    }

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("02-执行 init 初始化方法");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    /*
    * service 方法专门用来处理请求和响应
    * */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("HelloServlet 被访问了!");
    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {
        System.out.println("03-执行 destroy 销毁方法");
    }
}

6.4.4 Get 与 Post 请求的分发处理

模拟一个页面,嵌套两种请求方式

<!-- HelloServlet.html -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>HelloServlet</title>
</head>
<body>
<form action="http://localhost:8080/Tomcat_web_war_exploded/hello" method="get">
    <input type="submit" >
</form>
<form action="http://localhost:8080/Tomcat_web_war_exploded/hello" method="post">
    <input type="submit">
</form>
</body>
</html>
        在 service() 方法中使用 getMthod() 方法获取请求方式,然后进行不同请求方式进行分发处理 ,编写 doGet() 方法与 doPost() 方法来执行两种不同请求方式的响应结果

    /*
     * service 方法专门用来处理请求和响应
     * */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("HelloServlet 被访问了!");
        //类型转换 获取 getMethod() 方法
        HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
        //获取请求的方式
        String method = httpServletRequest.getMethod();

        //Get 与 Post 请求的分发处理
        if ("GET".equals(method)) {
            doGet();
        } else if ("POST".equals(method)) {
            doPost();
        }
    }

    /*
     *  做 get 请求的操作
     * */
    public void doGet() {
        System.out.println("HelloServlet-get 被访问了!");
    }

    /*
     *  做 post 请求的操作
     * */
    public void doPost() {
        System.out.println("HelloServlet-post 被访问了!");
    }

}

6.4.5 通过继承 HttpServlet 实现 Servlet 程序

一般在实际开发项目中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序

  • 编写一个类去继承 HttpServlet  类
  • 根据业务需要重写 doGet() 或 doPost() 方法
  • 在 web.xml 中配置 Servlet 程序的访问地址
/* HelloServlet.java */
package com.example.Tomcat_web;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {

    //doGet() 方法在 get 请求时调用
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HttpServlet 的 doGet() 方法");
    }

    //doPost() 方法在 post 请求时调用
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HttpServlet 的 doPost() 方法");
    }
}

6.4.6 IDEA 快捷创建 Servlet 程序

java 包 ——> 新建(new)——> Servlet 程序

​​​​​​设置名称与所在类


6.5 ServletConfig 类

Servlet 程序的配置信息类

6.5.1 ServletConfig 类的三大作用

  • Servlet 程序 和 ServletConfig 对象都是由 Tomcat 负责创建,每次创建 Servlet 程序时,会创建一个对应的 ServletConfig 对象
  • 可以获取 Servlet 程序的别名 servlet-name 的值
  • 获取初始化参数 init-param
  • 获取 ServletContext 对象
<?xml version="1.0" encoding="UTF-8"?>
<!-- web.xml -->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- servlet 标签给 Tomcat 服务器配置 Servlet 程序 -->
    <servlet>
        <!-- servlet-name 标签给 Servlet 程序起一个别名(一般是类名)-->
        <servlet-name>HelloServlet</servlet-name>
        <!-- servlet-class 标签是 Servlet 程序的全类名 -->
        <servlet-class>com.example.Tomcat_web.HelloServlet</servlet-class>
        <!-- init-param 是初始化参数 -->
        <init-param>
            <!-- 参数名 -->
            <param-name>username</param-name>
            <!-- 参数值 -->
            <param-value>xfdq</param-value>
        </init-param>
    </servlet>

    <!-- servlet-mapping 标签给 Servlet 程序配置访问地址 -->
    <servlet-mapping>
        <!-- servlet-name 标签是告诉服务器当前配置的地址给哪个 Servlet 程序用 -->
        <servlet-name>HelloServlet</servlet-name>
        <!-- url-pattern 标签配置访问地址
         / 在服务器解析的时候,表示地址为:http://ip:port/工程路径
         /hello 表示地址为:http://ip:port/工程路径/hello -->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
</web-app>
package com.example.Tomcat_web;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;

@WebServlet(name = "HelloServlet", value = "/HelloServlet")
public class HelloServlet extends HttpServlet {

    // init 初始化方法
    @Override
    public void init(ServletConfig config) throws ServletException {
        // 1.可以获取 Servlet 程序的别名 servlet-name 的值
        System.out.println("HelloServlet程序的别名是:"+config.getServletName());
        // 2.获取初始化参数 init-param
        System.out.println("程序使用者是:"+config.getInitParameter("username"));
        // 3.获取 ServletContext 对象
        ServletContext servletContext = config.getServletContext();
        System.out.println(servletContext);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("get 请求");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post 请求");
    }
}

6.5.2 ServletContext 类

  • ServletContext 是一个接口,它表示 Servlet 上下文对象
  • 一个 web 工程,只有一个 ServletContext 对象实例
  • ServletContext 对象是一个域对象 


6.5.3 ServletContext 的作用

  • 获取  web.xml 中配置的上下文参数 context-param
  • 获取当前的工程路径,格式:/工程路径
  • 获取工程部署后在服务器硬盘上的绝对路径
  • 像 Map 一样读取数据
<?xml version="1.0" encoding="UTF-8"?>
<!-- web.xml -->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">

    <!-- context-param 是上下文参数(它属于整个 web 工程) -->
    <context-param>
        <param-name>username</param-name>
        <param-value>xfdq</param-value>
    </context-param>

    <!-- servlet 标签给 Tomcat 服务器配置 Servlet 程序 -->
    <servlet>
        <!-- servlet-name 标签给 Servlet 程序起一个别名(一般是类名)-->
        <servlet-name>HelloServlet</servlet-name>
        <!-- servlet-class 标签是 Servlet 程序的全类名 -->
        <servlet-class>com.example.Tomcat_web.HelloServlet</servlet-class>
        <!-- init-param 是初始化参数 -->
        <init-param>
            <!-- 参数名 -->
            <param-name>username</param-name>
            <!-- 参数值 -->
            <param-value>xfdq</param-value>
        </init-param>
    </servlet>

    <!-- servlet-mapping 标签给 Servlet 程序配置访问地址 -->
    <servlet-mapping>
        <!-- servlet-name 标签是告诉服务器当前配置的地址给哪个 Servlet 程序用 -->
        <servlet-name>HelloServlet</servlet-name>
        <!-- url-pattern 标签配置访问地址
         / 在服务器解析的时候,表示地址为:http://ip:port/工程路径
         /hello 表示地址为:http://ip:port/工程路径/hello -->
        <url-pattern>/helloServlet</url-pattern>
    </servlet-mapping>
</web-app>
package com.example.Tomcat_web;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "HelloServlet", value = "/HelloServlet")
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取 web.xml 中配置的上下文参数 context-param
        ServletContext servletContext = getServletConfig().getServletContext();
        String username = servletContext.getInitParameter("username");
        System.out.println("username的值为:"+username);
        //2.获取当前的工程路径,格式:/工程路径
        String contextPath = servletContext.getContextPath();
        System.out.println("当前工程路径为:"+contextPath);
        //3.获取工程部署后在服务器硬盘上的绝对路径
        System.out.println("工程部署绝对路径为:"+servletContext.getRealPath("/"));
        //4.像 map 一样存取数据
        servletContext.setAttribute("xfdqjsb1","ggw");
        servletContext.setAttribute("xfdqjsb2","syf");
        servletContext.setAttribute("xfdqjsb3","yxy");
        servletContext.setAttribute("xfdqjsb4","xjw");
        System.out.println("获取域数据 xfdqjsb1 的值是:"+servletContext.getAttribute("xfdqjsb1"));
        System.out.println("获取域数据 xfdqjsb2 的值是:"+servletContext.getAttribute("xfdqjsb2"));
        System.out.println("获取域数据 xfdqjsb3 的值是:"+servletContext.getAttribute("xfdqjsb3"));
        System.out.println("获取域数据 xfdqjsb4 的值是:"+servletContext.getAttribute("xfdqjsb4"));
        System.out.println("get 请求");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("post 请求");
    }
}

上一节:

下一节: 

本文含有隐藏内容,请 开通VIP 后查看