[JavaWeb-07]Tomcat和Servlet

1、Web服务器软件简介

  硬件上的服务器指的是装了服务器软件的计算机,服务器软件的作用就是接受用户的请求、处理请求并做出响应。Web服务器软件就是服务器软件的一种,在Web服务器中部署Web项目,让用户通过浏览器来访问这些项目。
在这里插入图片描述
  常见的Java相关的web服务器软件有:
    webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
    webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
    JBOSS:JBOSS公司的,大型的JavaEE服务器,支持所有的JavaEE规范,收费的。
    Tomcat:Apache基金组织,中小型的JavaEE服务器,仅仅支持少量的JavaEE规范servlet/jsp。开源的,免费的。
  JavaEE指的是Java语言在企业级开发中使用的技术规范的总和,一共规定了13项大的规范。

2、Tomcat

2.1 下载和安装

  下载:http://tomcat.apache.org/
  安装:解压压缩包到一个不带中文和空格的目录上即可。
  启动:双击 bin/startup.bat 文件。
  关闭:双击 bin/shutdown.bat 文件。
  启动后即可通过浏览器输入http://localhost:8080 来访问。
  注意,Tomcat是基于Java的web服务器软件,必须正确配置JAVA_HOME环境变量,启动了Tomcat后,8080端口即被占用,要启动多个就得修改端口。
在这里插入图片描述

2.2 配置和部署

  Tomcat启动后,用户通过浏览器访问 http://localhost:8080 后,Tomcat服务器软件就会接收到请求,处理请求并做出响应。
  部署项目的方式:
  1. 直接将项目放到webapps目录下即可。直接放置项目文件夹或者将项目打成一个war包,再将war包放置到webapps目录下。
  2. 项目放任意地方,比如C:\hehe01,里面只有一个hehe01.html文件 ,然后配置conf/server.xml文件,在<host>标签体中配置<Context docBase="C:\hehe01" path="/hehe" />,其中docBase表示项目在计算机中的绝对路径,path表示在地址栏显示的路径,即虚拟路径。浏览器访问:http://localhost:8080/hehe/hehe01.html
  3.项目放任意地方,比如C:\hehe02,然后在 conf\Catalina\localhost 中创建任意名称的xml文件,在文件中编写<Context docBase="C:\hello02" />,docBase和方式2一样,是项目在计算机中的绝对路径,这是的虚拟路径为xml文件的名称,比如这个xml文件是hehe02.xml,则浏览器的地址栏输入:http://localhost:8080/hehe02/hehe02.html
  对于conf/server.xml文件,是尽量不要去改,只要稍微有点问题就会导致Tomcat启动不了,所以建议使用方式3。

2.3 静态项目和动态项目

  静态项目就是只有一些不变的文件,比如html、css、js文件等。而动态项目则不仅能保存静态文件,还能保存一些动态的比如javaclass等。动态项目目录结构如下所示:

-- 根目录
      |-- WEB-INF目录
   			  |-- web.xml:web项目的核心配置文件
   			  |-- classes目录:放置字节码文件的目录
   			  |-- lib目录:放置依赖的jar包

3、Servlet基础

  Servlet全称是server applet,表示运行在服务器端的小程序。在Java中就是一个接口,定义了Java类被浏览器访问到的规则。使用方法就是写一个类来实现Servlet接口,Tomcat就可以调用该类的方法。

3.1 Tomcat集成到IDEA中

  首先理解,Tomcat是一个web服务器软件,IDEA是一个集成开发环境,我们通过IDEA编写项目文件,Tomcat来调用我们写的项目文件。集成步骤如下:
  1.在Run菜单中选择Edit Configurations…
在这里插入图片描述
  2.选择 Templates -> Tomcat Sercer -> Local
在这里插入图片描述
  3.点击Configure选择Tomcat的解压目录,点击OK即可
在这里插入图片描述

3.2 IDEA与Tomcat的相关配置

  IDEA会为每一个Tomcat部署的项目单独建立一份配置文件,也就是Tomcat目录里的conf,通过查看控制台的log:Using CATALINA_BASE就可以看到,里面主要就是conf、logs、work文件夹和一些配置文件。
在这里插入图片描述
  IDEA是来写web工程项目的,Tomcat是来访问我们写好并部署的web工程项目的,这个wen工程项目对应着“工作空间项目”的wen目录下的所有资源。WEB-INF目录下的资源不能被浏览器直接访问。
在这里插入图片描述

3.3 Servlet简单使用

  创建一个JavaEE项目,定义一个类实现Servlet接口。

package cn.klb;

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

public class ServletDemo implements Servlet {

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

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("Servlet 配置成功!");
    }

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

    @Override
    public void destroy() {

    }
}

  然后在 web -> WEB-INF -> web.xml文件中添加:

<?xml version="1.0" encoding="UTF-8"?>
<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_3_1.xsd"
         version="3.1">
    <servlet>
        <servlet-name>test</servlet-name>
        <servlet-class>cn.klb.ServletDemo</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>test</servlet-name>
        <url-pattern>/hehe</url-pattern>
    </servlet-mapping>
</web-app>

  <servlet>标签表示定义了一个servlet,<servlet-name>是这个servlet的名字,然后启动Taomcat后,从浏览器要输入一个地址,对应Tomcat里的虚拟路径,所以<servlet-mapping>就是映射servlet和虚拟路径,其中<url-pattern>就是配置虚拟路径的。最后可以通过浏览器访问:http://localhost:8080/hehe,即可在IDEA控制台看到以下输出:
在这里插入图片描述
  当Tomcat服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径(虚拟路径),然后查找web.xml文件,是否有对应的<url-pattern>标签体内容,如果有,则在找到对应的<servlet-class>全类名,Tomcat会将字节码文件加载进内存,并且创建其对象并调用其方法。
  实现了Servlet的类要重写方法:init(ServletConfig servletConfig)ServletConfig getServletConfig()service(ServletRequest servletRequest, ServletResponse servletResponse)getServletInfo()destroy()
在这里插入图片描述
  其中,init()方法在被创建的时候执行且只执行一次,一个Servlet在内存中只存在一个对象,Servlet是单例的。service()方法是提供服务的方法,每次访问Servlet时,Service方法都会被调用一次。destroy()方法是在Servlet被销毁时执行,一般用于释放资源。

3.4 使用注解配置Servlet

  每定义一个Servlet,就得配置一次web.xml,在大型工程中比较繁琐。随着技术的升级,Servlet 3.0可以直接用注解的形式来配置Servlet。我们在定义一个Servlet实现类时,只需要在类的前面写上@WebServlet注解即可。

package cn.klb;

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

@WebServlet("/zhujie")
public class ServletDemo02 implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {

    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("注解Servlet配置成功!");
    }

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

    @Override
    public void destroy() {

    }
}

  然后浏览器访问 http://localhost:8080/zhujie 即可在IDEA控制台看到以下输出:
在这里插入图片描述
  注解的源码如下:

package javax.servlet.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface WebServlet {
    String name() default "";

    String[] value() default {};

    String[] urlPatterns() default {};

    int loadOnStartup() default -1;

    WebInitParam[] initParams() default {};

    boolean asyncSupported() default false;

    String smallIcon() default "";

    String largeIcon() default "";

    String description() default "";

    String displayName() default "";
}

  回忆注解的笔记,所有注解都是有一个注解解析程序的,但是我们不用管,只要会用注解即可。

4、Servlet体系

  如果每次编写Servlet的实现类都像上面那样也太麻烦了,为此,又提供了一些更高级的实现了Servlet接口部分方法的抽象类:

|- Servlet 接口
	  |- GenericServlet 抽象类
	  			|- HttpServlet 抽象类

  GenericServlet实现Servlet接口,对其他的方法做了默认空实现,只将service()方法作为抽象,将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可。
  HttpServlet继承GenericServlet,是对http协议的一种封装,简化操作,使用时只需要定义一个类继承HttpServlet,然后重写doGet()doPost()方法即可。
  一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})
  路径定义规则:
    /xxx:路径匹配
    /xxx/xxx:多层路径,目录结构
    *.do:扩展名匹配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值