Java笔记 - Tomcat & Servlet & HTTP

WEB 相关概念回顾

软件架构

  1. C/S 客户端/服务器端
  2. B/S 浏览器/服务器端

资源分类

  1. 静态资源 所有用户访问到的内容是一样的

    1. html
    2. css
    3. js

    可以被浏览器直接解析

  2. 动态资源 每个用户访问到相同的资源,可能有不同的结果

    1. servlet
    2. jsp
    3. php
    4. asp

    动态资源先要转化成静态资源才能被解析访问

网络通信三要素

  1. IP 计算机在网络中的唯一标识
  2. 端口 应用程序在计算机中的唯一标识 0~65536 其中0~1024是被特定应用程序占用的
  3. 传输协议
    1. tcp 安全协议
    2. udp 不安全的协议

服务器

服务器是安装了服务器软件的计算机

常见的java相关的web服务器软件

  1. webLogic
  2. webSphere
  3. JBoss
  4. Tomcat 来自Apache基金组织(慈善机构),中小型的JavaEE服务器,支持少量的JavaEE规范 ,开源免费

JAVA EE 中有13种规范,我们学 ServletJSP

Tomcat

在这里插入图片描述

  1. bin 可执行文件,存放工具/命令(开启、关闭服务器)
  2. conf 配置文件
    1. web.xml - 服务器中应用相关
    2. server.xml - 服务器本身相关
  3. lib 依赖jar包
  4. logs 日志文件
  5. temp 临时文件
  6. webapps 存放web项目 (字节码文件)
  7. work

开启Tomcat

  1. cd /Users/mac/Library/Tomcat/bin

  2. sudo chmod 755 *.sh 赋予权限

  3. sudo sh ./startup.sh

  4. 访问 localhost:8080

    HTTP协议的默认端口号是 80 Tomcat的默认端口是8080

  5. 使用 shutdown 关闭

macOS 下使用 IDEA 配置 Tomcat

  1. 访问项目路径,在Tomcat/webapp下 http://localhost:8080/examples/index.html

    examples目录 称作虚拟目录,index.html 称作资源

    也可以将项目打包成 .war 格式,把它放到webapps/ 下 ,这个war包会自动解压缩

  2. 通过更改配置文件,配置一个虚拟路径

    配置 conf/server.xml文件 docBase是项目存放的路径 path是虚拟目录

    <Context docBase=“项目存放目录” path=“虚拟目录”>

    访问的时候使用path路径!

  3. 使用Catalina/localhost目录 (推荐此方法)

    创建任意名字的xml文件,在文件中编写

    <Context docBase=“项目存放目录” />

    虚拟目录是xml文件的名称

在这里插入图片描述
在这里插入图片描述

动态项目

  • 项目名称
    • WEB-INF
      • web.xml 该项目的核心配置文件 (在创建项目时可勾选)
      • classes 放置字节码文件
      • lib 放置项目依赖的jar包

常见错误

在这里插入图片描述
解决方法 :在终端中执行命令 sudo sh ./shutdown.sh

在IDEA启动时会自动开启Tomcat,所以手动开启Tomcat可能会冲突,先把Tomcat手动关闭即可。

Servlet (最重要)

是server applet的缩写,意为在服务器运行的小程序

Servlet 是一个接口,定义了Java类被访问器访问到的规则

快速入门

  1. 创建JAVA EE项目 基于Tomcat
  2. 定义一个类,实现Servlet接口
  3. 实现接口中的抽象方法
  4. 配置Servlet

配置Servlet

在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>
        <servlet-name>demo1</servlet-name>
        <servlet-class>web.servlet.ServletDemo01</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>
</web-app>
执行原理
  1. 服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet资源路径

  2. 查找web.xml文件,遍历至 <url-pattern>/demo1</url-pattern>

  3. 找到 <servlet-class>web.servlet.ServletDemo01</servlet-class>

  4. tomcat会将字节码加载进内存,并创建其对象

  5. 调用其方法

生命周期

在这里插入图片描述

这里有五个方法,逐一解析

  1. init 被创建的时候 (只会被创建一次)

    说明init是单例的,多个用户同时访问会存在安全问题

  2. getServletConfig

  3. service 提供服务时,可执行多次

  4. getServletInfo

  5. destory 被销毁时

    服务器被关闭的时候被销毁,交代临终遗言,在Servlet被销毁之前执行

web.xml 中的配置
<servlet>
    <servlet-name>demo2</servlet-name>
    <servlet-class>web.servlet.ServletDemo02</servlet-class>
    <load-on-startup>5</load-on-startup>   可选在启动时执行/在访问时执行
</servlet>

Servlet 注解

在Servlet 3.0 以上的版本中,支持注解配置(从JAVA EE6 开始支持Servlet3.0)

步骤

  1. 创建一个JAVA EE 项目 ,不勾选创建 web.xml

  2. 定义一个类,实现Servlet接口

  3. 复写方法

  4. 在类上使用@WebServlet 注解进行配置

    @WebServlet(“资源路径”) 特别注意,虚拟路径是在run-config里边修改的,最好改成module名

推荐使用该方法,比在web.xml中修改要更加方便

IDEA 和 Tomcat相关的配置

  1. IDEA会为每一个Tomcat部署的项目单独建立一份配置文件 (可用IDEA可视化配置界面)
  2. WEB-INF目录下的资源不能被访问
  3. 断点调试使用小虫子按钮

体系结构

Servlet (接口) 接口需要实现 public class ServletDemo02 implements Servlet

GenericServlet (抽象类) 抽象类可以继承 public class ServletDemo02 extends GenericServlet

HTTPServlet (抽象类)

复习一下接口和抽象类的区别。

接口是对行为的抽象,继承是对根源的抽象

抽象类接口
1.抽象类中可以定义构造器1.接口中不能定义构造器
2.可以有抽象方法和具体方法,抽象类中可以没有抽象方法,有抽象方法的一定是抽象类2.方法全部都是抽象方法
3.接口中的成员全都是 public 的3.抽象类中的成员可以是 private、默认、protected、public
4.抽象类中可以定义成员变量4.接口中定义的成员变量实际上都是常量
5.有抽象方法的类必须被声明为抽象类,而抽象类未必要有抽象方法5.接口中不能有静态方法
6.抽象类中可以包含静态方法6.一个类可以实现多个接口

GenericServlet

@WebServlet("/demo3")
public class ServletDemo03 extends GenericServlet {

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("this is demo3");
    }
}

将Servlet中的其他方法做了默认空实现,只将Service()方法作为抽象

但是这个在实际中并不常用,常用的是HTTPServlet

HTTPServlet

这个是对HTTP协议的一个封装,HTTP有七种请求方式,针对各种情况,这边都已经封装好。

最常用的是 GET/POST

@WebServlet("/demo3")
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("do get!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("do post!");
    }
}

对应的POST请求,写一个login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/demo3" method="post">   请求方式为post
    <input name="username">
    <input type="submit" value="提交">
</form>
</body>
</html>

Servlet 相关配置

  1. URLpattern 访问路径 以注解的方式 @WebServlet({"/demo3","/demo","thisDemo"})

    可以有多个访问路径 {“路径1”,“路径2”,“路径…”}

  2. 路径定义规则

    1. /xxx
    2. /xxx/xxx 目录结构
    3. *.do

HTTP协议

Hyper Text Transfer Protocol 超文本传输协议 ,定义了客户端服务器端通行时发送数据的方式

HTTP是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)

概念

  1. 基于 TCP/IP 协议

  2. 默认端口 80

    http://www.qq.com http://www.qq.com:80 这两个是一样的

  3. 基于请求/相应模型,一次请求对应一次相应

  4. 无状态:每次请求之间相互独立,不能交互数据

请求消息

客户端发送给服务器端的数据

1.0版本 每一次请求相应都会建立一个连接

1.1版本 复用连接

在这里插入图片描述

HTTP请求报文由3部分组成(请求行+请求头+请求体)

请求消息数据格式

在Chrome中查看请求的方式 - 右键 - 检查

在这里插入图片描述

  1. 请求行

    1. GET 请求参数在请求行中,在url后
      1. 请求的长度有限制
      2. 不太安全
    2. POST 请求参数在请求体
      1. 请求的长度无限制
      2. 比较安全
  2. 请求头

    1. Host

    2. User-Agent 重要,告诉服务器我用的是什么浏览器,解决浏览器的兼容性问题

          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //获取请求头数据中的 user-agent
              String agent = request.getHeader("user-agent");
              System.out.println(agent);
              //可以判断浏览器版本
              if(agent.contains("Chrome")){
                  System.out.println("chrome is coming");
              }else if(agent.contains("Firefox")){
                  System.out.println("ff is coming");
              }
      
    3. Accept 响应格式

    4. Referer 告诉服务器,我从哪里来

      1. 防盗链
      2. 统计工作
  3. 请求空行

    1. 用于分割POST请求的请求头请求体
  4. 请求体

    1. 封装POST请求消息的请求参数

响应消息

服务器端发送给客户端的数据

数据格式
请求消息响应消息
请求行响应行
请求头响应头
请求空行响应空行
请求体响应体

![屏幕快照 2019-06-25 下午12.35.19](/Users/mac/Desktop/屏幕快照 2019-06-25 下午12.35.19.png)

响应体就是对应的HTML页面代码

  1. 响应行

    1. 组成: 协议/版本 响应状态吗 状态码描述

    2. 响应状态码:服务器告诉浏览器本次请求和响应的一个状态

      状态码情况
      1xx服务器接收客户端消息,但未完成,等待一段时间后发送1xx
      2xx成功
      3xx302重定向 (甩锅) 304 缓存 (访问本地缓存)
      4xx客户端错误 404 请求路径没有对应的资源 405 请求方式没有对应的doXXX方法
      5xx服务器错误 500 服务器内部异常
    3. 响应头

      1. Content - Type 告知浏览器本次响应的数据格式和编码格式
      2. Content - disposition 告知浏览器以什么格式打开响应体数据
        • in-line 在页面中直接打开
        • attachment; filename = xxx 以附件形式打开,其实就是下载
    4. 响应体 就是发送传输的数据

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值