完全从零Java自学系列【入门篇】(第八课:HTTP协议&JavaWEB开发之Servlet&Tomcat容器)


前言

  在上一课中,我们使用了java socket来基于TCP/IP与流进行网络编程。这节课的重点内容HTTP协议它与TCP/IP协议同样是应用层协议。但不同的是HTTP是基于TCP/IP协议之上的应用层协议,相关其它的常见应用层协议还有:FTP(文件传输),SMTP(邮件传输)。HTTP基于TCP/IP这是第一个重点。
  第二个重点是,HTTP协议所完成的是B(Browser浏览器)/S(Server)架构,也就是说咱们经常通过浏览器访问网站的结构。而TCP/IP则是C(Client)/S(Server)架构。咱们上节课所开发的聊天工具就是CS结构。是最底层的应用层协议,针对的是各种二进制数据的直接处理。而HTTP协议针对的是超文本,又称之为富文本。简而言之就是比我们的聊天工具传输的数据要更加复杂,而且是针对网页的用户界面范式。
【网页源码图片】

  第三个重点是,HTTP也支持C/S架构,原因是它支持WEB socket,异步请求等等。


使用JAVA SERVLET进行WEB开发

TOMCAT容器

  在使用JAVA进行WEB开发之前,我们需要了解我们到目前为止的第二个容器,第一个容器是Spring,它帮助我们管理我们的java类。第二个容器是TOMCAT,它帮助我们高效的处理解析与响应WEB请求。

  1. 线程池)它帮助我们管理服务器连接池,使得我们服务器高效的相应客户端请求。
  2. 连接器)它帮助我们封装高效的IO模型响应客户端请求。
  3. 容器)包装解析请求&响应内容。通过支持压缩算法来加快我们的网络传输效率。。。等等等。
    所以虽然都叫做容器,但是他们的作用领域大大不同,要学会区分。如果没有TOMCAT的话,我们当然也可以自己实现的,通过TCP/IP协议。只不过上面的这些问题你要怎么处理而已。
    在这里插入图片描述

下载

打开tomcat官网下载页,如果是mac linux等需要下载源码包安装,windows下载zip。下载完成后解压出来即可。
在这里插入图片描述

目录解释

在这里插入图片描述

bin
  1. bin目录下主要是脚本,.bat结尾是windows,.sh是linux下的。catalina是核心脚本。startup,shutdown主要用于启动和关闭,正常情况下你现在就直接可以执行它们了。需要注意的是windows最好用命令行工具启动它。方便查看日志。
  2. 首先进入cmd,或者直接右击目录空白处选择在终端打开。 在这里插入图片描述
  3. 当我们执行这个./startup脚本在这里插入图片描述
  4. 需要注意的是,在日志内容的最后会告诉我们每一个项目有没有加载完成,以及最后的容器启动成功与否
    在这里插入图片描述
conf
  1. conf下最主要的是server.xml,比如如果是默认配置,它监听的是8080端口。在这里插入图片描述
  2. 然后执行start脚本等它启动完成后,你可以打开任意浏览器输入localhost:8080 or 127.0.0.1:8080,来访问tomcat的主页。
    在这里插入图片描述
  3. web.xml是tomcat的核心中的核心,未来我们的web项目中也要使用到这个web.xml文件。他所有的基础处理都从org.apache.catalina.servlets.DefaultServlet开始,就是在文件中配置的。关于什么是Servlet后面会提到。
webapps
  1. 上面访问的内容则是webapps\ROOT\目录下的index.jsp。所以不难理解webapp下面就是我们应该存放的我们一个一个的不同的项目。多个项目多个文件夹区分。而ROOT是默认访问的项目。如果要访问manager有两种方式。
  2. 点击刚才页面中的Manager App在这里插入图片描述
  3. 或者直接输入htpp://localhost:8080/manager,所以对于tomcat而言,IP:端口/后接的第一个名字,就是webapp下的应用名字。至于为什么自动访问了index页面,是在web.xml中通过welcome-file配置了欢迎页面,所以只需要输入项目名(在web开发中又称之为上下文)
  4. 当然了manager属于管理员界面,需要设定用户名密码。在conf/tomcat-users文件最下面。设定账户密码之前先了解一下角色在这里插入图片描述
  5. manager-gui 允许访问HTML GUI和状态页,manager-script允许访问HTTP API和状态页—manager-jmx允许访问JMX代理和状态页manager-status—只允许访问状态页

拉到最下面它设置用户的原始内容是:

<!--
 <role rolename="tomcat"/>
 <role rolename="role1"/>
 <user username="tomcat" password="<must-be-changed>" roles="tomcat"/>
 <user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
 <user username="role1" password="<must-be-changed>" roles="role1"/>
-->

取消注释后修改为(rolename就是tomcat的角色),user 标签中除了设置用户名密码,还有所拥有的权限集合。

<role rolename=“manager-jmx”/>
<role rolename=“manager-status”/>
<role rolename=“admin-gui”/>
<role rolename=“admin-script”/>
<role rolename=“manager-gui”/>
<user username=“admin” password=“admin” roles=“manager-gui,manager-script,manager-jmx,manager->status,admin-gui,admin-script”/> 
  1. 最终在这个url下的页面中我们可以看到所有的项目,以及操作它们在这里插入图片描述
lib

  这个目录下的jar包要尽可能的熟悉,除catalina,tomcat开头的其它jar包,都将有可能会与你项目中的jar包产生冲突。请记住,当你使用tomcat容器加载你的应用时,如果启动时发现:

  1. java.lang.ClassNotFoundException 找不到类,重复了不知道用哪个。
  2. java.lang.NoSuchMethodError 找不到具体方法、你的B类中有这个方法,但是它加载的同名A没有。举例:你们都依赖了不同的第三方包但是版本不同。
  3. java.lang.NoSuchFieldError 没有这样的字段,同上。
  4. java.lang.LinkageError A依赖于B时,有多个不同的B,同上。

这些个错误类型时,意味着可能jar包冲突了。第一时间你应该寻找报错的类全限定名在哪个第三方依赖里。第二查看双方的版本,具体应该使用哪一个。

logs

  日志目录下常用的三个日志文件,其它一般不怎么用。

  1. catalina,启动日志
  2. Catalina.out,第一记录你在程序中自行打印的日志,第二是报错日志,堆栈等等。
  3. localhost_access_log,所有请求过来的URL地址信息。一般防攻击的时候会经常使用到。可以查看对方频繁的在请求什么内容。
temp

这个简单,就是存放一些临时文件。比如缓存。

work

这个目录是用于你访问.jsp文件时,它将jsp编译为编译后的.class文件,但是jsp现在基本不用了,它类似于php可以在html网页里面写java代码,方便前端的开发。但是我们现在已经没有必要学了,主要是现在都是前后端分离的架构。其次我们这个系列的主讲内容就是java后端高并发架构。不参与任何
前端的开发。

HTTP协议

基础特性

  1. 它由网站或域名加上端口组成URL:http://www.xxx.com:8080/index.jsp,http://为协议前缀,www.xxx.com部分可以是ip、比如你在命令行ping www.baidu.com,你会发现它最终是在联通一个ip。端口8080部分一般默认是80,也就是说你的web应用如果是80端口来监听则不需要输入端口号。
  2. 不需要像TCP/IP那样一直保持连接状态。(无连接)
  3. 协议本身不存储任何数据,如果你第二次请求和第一次请求相关联,则需要重新传递消息。

请求

  HTTP请求主要包含三个主要内容,请求行、请求头部、数据体。

  1. 请求行用于标识请求类型,最常用的有GET、POST。以及URL(就是上面说的)、协议版本(一般不需要自己指定)
  2. 请求头部涵盖的信息比较多,在入门时不需要过深的了解。
  3. 请求数据:GET请求的请求参数跟随在URL之后,比如http://www.xxx.com:8080/index.jsp?id=1&name=zhouxingchi&age=50,请求参数由?符号开始,后续的由&拼接。
  4. 请求数据:POST携带请求参数,以及数据体。
  5. 请求数据:首先GET请求和POST请求都是基于IP协议,本质上没有任何区别,第二是get请求能传输的数据量远远小于POST,第三POST请求不会显示的将参数显示在浏览器URL中,相对安全。第四GET请求能被浏览器缓存,POST请求是不可以的。
  6. 请求数据:POST请求通常用于提交数据,GET请求用于查询数据,因为get请求不允许携带请求体。
    在这里插入图片描述

响应

  和响应相对应,HTTP响应报文主要包含状态行、响应头部、数据体。

  1. 响应状态:
    在这里插入图片描述
  2. 响应头:在这里插入图片描述
  3. 响应内容(可以是任何内容的,关键在于数据被前端怎么处理):在这里插入图片描述在这里插入图片描述在这里插入图片描述

因为响应的内容可以是一切内容,所以在响应头中,最最重要的头部字段就是Content-Type了:

  1. 如果是text/html,则等同于前后两端约定按html处理,后端返回也是html的内容。 在这里插入图片描述在这里插入图片描述
  2. 如果是application/json则 在这里插入图片描述在这里插入图片描述

Servlet

  JAVA Servlet是SUN公司开发用于在JAVA中进行WEB开发的规范。是一种基础框架,它的全称是Server Applet服务器小程序。所有其它WEB开发框架都是基于Servlet来进行开发的。
  TOMCAT原理根本上,就是专门用来装载Servlet的容器的。而且它本身也是使用java和Servlet来开发的,还记得上面看到的web.xml和org.apache.catalina.servlets.DefaultServlet吗,它通过它本身对Servlet的实现,转发到我们的Servlet上。不光是tomcat,任何用于java 的 web框架都是基于servlet。

Servlet tomcat 请求关系

  需要注意的是,一旦你的应用以tomcat容器为基础运行,你的应用将不在拥有单独进程。拥有单独进程是的tomcat,而你所有的java类,最终都被tomcat解析和加载。这也就是为什么lib会有可能造成冲突。
  Tomcat在接收请求和返回响应之间,调用了你的Servlet逻辑。而你在你自己的内部,仍然是需要web.xml+servlet作为基础进行开发。
在这里插入图片描述
  到了Servlet这一层,我们只需要关注我们的业务,所有的请求报文都已经解析完成,所有的返回包装也都已经完成。我们只需要关注我们怎么处理请求和返回什么数据。
  简单重新梳理一下,TOMCAT是用来监听端口,然后将解析过后的数据交给Servlet处理。最后返回数据。

编写第一个Servlet

  我们先来一段简单的体验一下Servlet,请注意get和post请求的不同之处。如其名,它们分别用于接收get 和 post请求。
  还记得网络编程中的流吗,请注意处理post请求时的调用方法,最重要的是不是就是获得输入流与输出流?也就是说到了这里我们完全可以理解为什么说http实际上就是基于TCP。只不过HTTP协议TOMCAT容器SERVLET框架的组合,帮助你完成了很多事情。让你只需要关注你的核心代码。
  说白了就是Servlet必须通过继承HttpServlet标准的形式,而已,它本身不能完成任何web功能。他只是一个标准。但是通过你和tomcat容器遵循同一个标准,那么它就能够解析到你。仅此而已。

package lesson8;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet{
    public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException{
    	//用于get请求时,获取URL中的参数
   		String username = req.getParameter("username");
        //设置响应类型
        resp.setContentType("text/plain");
        PrintWriter pw = response.getWriter();
        pw.println("你好");
        pw.flush();
        pw.close();
    }
     @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	//用于post请求时,获取请求体中的全部报文流
   		ServletInputStream inputSteam = request.getInputStream();
        //设置响应类型
        resp.setContentType("text/plain");
        PrintWriter pw = resp.getWriter();
        pw.println("你好");
        pw.flush();
        pw.close();

    }

web.xml的配置

  web.xml文件是JAVA web应用程序的专有配置文件,核心就是配置Servlet。而tomcat(java web容器)通过加载我们的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_4_0.xsd"
     version="4.0">
         <!-- 声明我们的Servlet名称以及类全限定名 -->
         <servlet>
            <servlet-name>HelloWorld</servlet-name>
            <servlet-class>lesson8.HelloWorld</servlet-class>
         </servlet>
         <!-- 给我们的servlet指定一个url访问路径 -->
         <servlet-mapping>
            <servlet-name>HelloWorld</servlet-name>
            <url-pattern>/helloworld.do</url-pattern>
         </servlet-mapping>
</web-app>

演示

  由于篇幅可能过长,我们下节课教大家部署测试,以及测试工具的使用。

  • 19
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值