HTTP(类似TCP/TUP协议)、Tomact(对整个web操作的集成软件)、Servlet(动态显示,需要Tomcat才能运行)

news2024/10/6 6:03:58

javaWeb:web为网站,javaWab就是用java来解决web互联网领域的技术栈

B/S架构:Brower/Server,浏览器/服务器 架构模式,他的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器,好处是易于维护和升级,客户端无需任何部署就可以用到新版本

浏览器会通过http协议(类似之前学的tcp、tup协议),跟服务端,请求或响应,服务器会通过Servlet和JSP加载数据库,然后发给前端html、css、js封装后响应给客户端

其中

静态资源:html、css、js、图片等,负责静态的展示页面(每个用户登录后基本展示页面都一样)

动态资源:Servler、JSP等,负责逻辑处理(每个用户登录后展现的数据不一样

数据库:复制存储数据

HTTP协议:定义通信规则

Web服务器:负责解析HTTP协议,解析请求数据,并发送响应数据

web服务器:由静态资源和动态资源组成,可以用Tomcat集成软件处理

HTTP:(后面统一用Tomcat)

HyperText Transfer Protocol ,超文本传输协议,规定了浏览器和服务器之间数据传输的规则

特点:

1.基于TCP协议:面向连接,安全

2.基于请求-响应模型:一次请求对应一次响应

3.http协议是无状态协议:对于事物处理没有记忆能力。每次请求-响应都是独立的

缺点:多次请求间不能共享数据(后面会用java中的会话技术(Cookie、Session)解决,例如在点击加入购物车,数据需要在服务器进行记录,不然当用户点击查看购物车,数据是不会响应到客户端)

优点:速度快

http-请求数据格式:(了解)

1.请求行: 请求数据第一行,其中GET表示请求方式,/表示请求资源路径,HTTP/1.1表示协议版本

2.请求头:第二行开始,格式为key:value形式

3.请求体:POST请求的最后一部分,存放请求参数(只有POST特有)

例如:

常见的HTTP请求头:

Host:表示请求 的主机名

User-Agent:浏览器版本

Accept:表示浏览器可以接收的资源类型

Accept-Language:表示浏览器偏好语言,服务器可以根据此返回不同语言的网页

Accept-Encoding:表示浏览器可以支持的压缩类型

http-响应数据格式:(了解)

1.响应行: 响应数据的第一行。其中HTTP/1.1表示协议版本,200表示响应状态码,OK表示状态码描述

2.响应头:第二行开始,格式为key:value形式

3.响应体:最后一部分,存放响应数据(就是HTML代码)

例: 

常见的HTTP响应头:

Content-Type:表示乡音内容的类型

Content-Length:表示该响应内容的长度(字节数)预知大小

Content-Encoding:表示该响应压缩算法(压缩格式)浏览器需要指定解压方式

Cache-Control:指示客户端应如何缓存,例如数据缓存到客户端,客户可以快速的访问

状态码大全:状态 | Status - HTTP 中文开发手册 - 开发者手册 - 腾讯云开发者社区-腾讯云https://cloud.tencent.com/developer/chapter/13553

常见的:

1.200代表OK

2.404代表请求资源不存在,一般url输入有误或网站资源被删除

3.500代表服务器发送不可预期错误,服务器出异常了,赶紧看日志(java代码)

查询方式:

打开网页、f12、任意点击网页内容请求一下服务器、控制台的网络(Network)会进行抓包,点击任意抓包内容、点击Headers、如果由view resource可以点击,即可查看http协议内容

Tomcat-Web服务器:(大部分部署是web项目)

是一个软件,对http协议的操作进行封装,主要功能是“提供网上信息浏览服务”

Tomcat也被称为Web容器(Web服务器)、Servlet容器,Servlet就是一个java类,但是没有主方法去运行,需要依赖于Tomcat才能运行

Apache Tomcat® - Welcome!官网https://tomcat.apache.org/index.html

常用的是Tomcat 8.5版本

点击左侧Tomcat8然后下载右侧64位版本和下载下面的源码

bin目录下

.bat文件是windows类型文件,可以直接打开

.sh文件是linux文件

conf是放一些配置文件

logs放的是一些日志文件

temp是临时目录,临时产生的一些文件会在此文件夹

webapps当web项目写完放到此目录就完成了项目部署

work也是临时目录,临时产生的一些文件会在此文件夹(jsp使用)

解压完成后,打开bin目录,打开startup.bat

然后打开网页输入localhost:8080看看会不会自动打开Tomcat官网,如果有就安装成功了(要一直打开startup.bat才能打开网址)

注意:安装的时候路径一定要全英文的

但是打开的控制台startup.bat里都是乱码,可以打开配置文件conf里的logging.properties

找到java.util.logging.ConsoleHandeler.encoding = UTF-8(由于win是GBK格式)

startup.bat关闭方式:

1.直接关闭:关掉运行窗口(不要用这个)

2.bin/shutdown.bat:正常关闭(流程多)

3.ctrl+:正常关闭(比较常用)

配置:

1.修改启动端口号:conf/server.xml

<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

注意:http协议默认端口号为80,如果将Tomcat端口号改为80,则将来范文Tomcat的时候,直接输入localhost即可,不用输入端口号

启动时可能出现的问题:

1.端口号冲突:找到对应程序,将其关闭

startup.bat窗口会报错

2.启动startup.bat窗口会一闪而过:检查JAVA_HOME环境变量是否配置正确(因为Tomcat是用java语言编写的,会借用jdk来运行)

Tomcat部署项目:

将项目放到webapps目录下,即完成部署

一般javaweb项目会被打包成war包,即.war格式,当放到javaweb目录下时,过一会就会自动生成项目的文件夹即自动解压war包

idea中创建Maven Web项目:

webapp是web项目特有的目录

—— html:html文件目录(可自定义)

—— WEB-INF是web项目核心目录(必须叫这个名字,打包会自动生成classes文件夹和lib文件夹,编译后的java文件和resources会放到classes文件夹下,pom.xml中依赖坐标对应的jar包会翻入lib文件夹下)

———— web.xml是web项目的配置文件

创建:

方式一:使用骨架创建(注意在webapp下会多一个index.jsp,而不使用骨架是没有的)

1.在创建Maven时需要勾选骨架(注意要选择maven-archetype-webapp)然后一直下一步

 将pom.xml文件中从<name>标签到<build>标签删除

然后在main目录下创建java文件夹和resources文件夹

方式二:不使用骨架创建

1.正常创建一个module(maven格式)之后,先将pom.xml文件的坐标定位下加一个<packaging>war</packaging>(如果不先加打包方式,idea不会判定成web项目,就无法在模块中找到)(另外这个打包方式默认是jar包)

2.project construtrue然后点击Facets找打你的Web文件,在Web Resource Directories 栏下会有红色字提示未创建Webapp目录,双击一下一直下一步就可以创建,然后点击上面的Deployment Dscriptors点击+添加一下web.xml(版本默认4.0即可)然后一直下一步即可,然后将WEB-INF目录直接拖到webapp目录下就完成

在idea中使用tomcat

1.将本地tomcat集成到idea中,然后进行项目部署即可就是在idea中直接将war包解压到webapp目录中

 点击添加配置文件,然后点击左上角的+号添加,选择Tomcat Local然后点击Configure...选择安装路径(注意不要添加到那种名字相同的包中包)

 注意如果此处标红,请手动添加一下jsp-api.jar和servlet-api.jar两个包

点击artifact添加需要打包的web项目,选择(项目名称:war)种格式的

然后在webapp(刚刚你选择要打包的web项目)下创建一个a.html文件,在body里写aaaa随便的字,然后点击右上角运行

运行成功后会自动打开一个网页,然后在网址后面写a.html就能成功跳出刚刚输入的aaaa内容

2.idea中使用Tomcat Maven插件(缺点只能用到Tomcat7版本)

在pom.xml文件夹中添加依赖坐标

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                <port>8081</port><!--访问端口号-->
                <path>/</path><!--项目访问路径(斜杠是访问任意地址)-->
                </configuration>
            </plugin>
        </plugins>
    </build>

使用Maven Helper 插件快速启动项目,选中项目,右键 --> Run Maven --> tomcat7:run

在java中看到规范就应该联想到接口interface

Servlet:

Servlet是java提供的一门动态web资源开发技术(例如:每个用户都有自己的用户名,登录后显示的用户名都不一样)

Servlet是javaEE规范之一,其实就i是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet

快速入门:

1.在pom.xml中引入依赖坐标,作用范围是编译和测试,不能是运行,因为tomcat本身已包含该坐标,会引起冲突

  <dependencies>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
 

2.创建java类,实现Servlet接口,在service这个方法中随便输出内容。并在开头用@WebServlet(“/demo1”)内容可以自定义,但是必须加/斜杠,这个注解是访问路径,即在最后运行时候(tomcat:run),会自动弹出浏览器,在网址后面加/demo就能搜出刚刚你输出的内容("asd123456789")  ;但是在此处网页是没有显示任何东西的,因为没有向网页输出任何东西,sout是输出到控制台的,即idea的控制台

package com;

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

@WebServlet("/demo1")
public class servletdemo implements Servlet {
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("asd123456789");
    }

    public void init(ServletConfig servletConfig) throws ServletException {

    }

    public ServletConfig getServletConfig() {
        return null;
    }

    public String getServletInfo() {
        return null;
    }

    public void destroy() {

    }
}

尽量不要用右键tomcat:run,直接点击右上角的run

执行流程:

 

http://localhost:8080/tomcat2_war/demo1

http://localhost:8080访问的是 Tomcat(web服务器)

/tomcat2_war访问的是在idea创建的web项目(tomcat2)war是因为会把整个打包成war压缩包,且在appweb目录中会自动生成文件夹

/demo1访问的就是对应的Servlet

tomcat会自动创建Servlet对象,因为实现接口必须重写方法,就必定有Service()方法,就会自动调用这个方法

生命周期:

对象的生命周期是指一个对象从被创建到被销毁的整个过程

Servlet运行在Servlet容器(web服务器)即Tomcat中,其生命周期由容器来管理,分为4个阶段:

1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象

2.初始化:在Servlet实例化之后,容器将调用Sevlet的init()方法初始化这个独享,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次(配置文件这些加载一次就行)

3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的service()方法对请求进行处理。

4.服务终止:当需要释放内存或容器关闭时,容器就会调用Servlet实例的destroy()方法完成资源的释放。在该方法调用之后,容器会释放这个Servlet实例,该实例随后会被java的立即回收器所回收

@WebServlet(urlPatterns = "/demo",loadOnStartup = 1)

负整数:第一次被访问时创建Servlet对象

0或正整数:服务器启动时创建Servlet对象,数字越小优先级越高

注意:当注解中只配置一个属性值,直接写即可,如果配置多个,得写全即value=“xx”,但此处value和urlPatterns所代表的含义是一样的,见明知意用第二个

在init方法中sout随便输出内容,service也也一样。
当运行了tomcat之后,会弹出浏览器,网址访问对应的Servlet,此时观察控制台,无论浏览器访问几次(可以使用刷新进行访问),init只会出现一次,而service的输出内容会出现多次即访问次数

注意:当直接在idea控制台中终止运行是不会执行destroy方法的,类似于直接中断了,属于非正常关闭。若需要正常关闭需要在terminal(在idea左下角)运行完之后用ctrl+c进行关闭(但是在输出的中文字出现乱码??但是集成tomcat就没问题,但集成的无法在terminal运行,没有tomcat8:run???)

总结一下:首先先创建webapp的maven文件夹(正常创建mvn文件是没有webapp的),建议不使用骨架创建web项目,暂时先使用插件形式的tomcat

另外两个方法比较少用,一个是info为作者信息,一个confige用来传递参数给init方法

体系结构:

由于Servlet接口重复性高,现在使用HttpServlert类来继承(Servlet接口→GenericServlet抽象实现类→HttpServlet对http协议封装的Servlet实现类),需要重写doGet和doPost方法

一样也需要配置访问路径即注解

运行之后直接在网址后面输入地址访问都是以doget方式访问

当在webapp下创建一个html页面,运行tomcat之后打开网址,在网址后面加上html的名称,访问之后提交信息,就是以dopost方式访问(action的访问路径是localhost:8080后面的所有路径)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/demo2" method="post">
  <input name="username"><input type="submit">

</form>

</body>
</html>

httpServlet为什么要用不同的方法?

因为浏览器的get和post位置不一样,get的请求参数在请求行里,post的请求参数在请求体里,所以处理逻辑不一样

http协议里有7种不同的请求方式(在httpServlet抽象类中可以查看)调用方式重写doXxx方法

上面的网页是通过html文件去访问java的WebServlet路径

Servlet urlPattern配置:

进入WebServlet注解的源码种可以看到urlPatterns是个数组

例如:@WebServlet(urlPatterns = {"/demo1","/demo2"},loadOnStartup = 1)

无论在网页里输入demo1还是demo2都可以访问到该WebServlet

urlPattern配置规则:

优先级:精确路径>目录路径>扩展名路径>/*>/

1.精确匹配:/xxx/xxx。。。

2.目录匹配:/xxx/*

前面的是同一个文件夹,*指的是任意文件名

3.扩展名匹配:*.do

注意这个是不能加/斜杠的

4.任意匹配:/或/*(不要使用这个任意匹配)

当配置了/,会覆盖在tomcat的conf/web.xml中的DefaultServlet(用来处理静态资源)

  <!-- The default servlet for all web applications, that serves static     -->
  <!-- resources.  It processes all requests that are not mapped to other   -->

    <servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

镜像路径为 /

    <servlet-mapping>
        <servlet-name>default</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

静态资源有包括html文件在内的文件。

先把所有的任意路径注解WebServlet注释掉,然后运行tomcat,打开a.html文件,然后再将注解打开,再运行一次tomcat,然后刷新一下html就刷新不出来了。(但我的一直实现不了这个问题??理解:html是客户端,后台是我们自己,如果我们这样操作了,客户就看不到我们的网址了)

xml配置方式编写Servlet:

从Servlet3.0版本之后就支持使用注解配置,之前只支持xml配置文件的配置方式

步骤:

1.编写Servlet类

2.在web.xml配置该Servlet

    <!--
        Servlet 全类名
    -->
    
    <servlet>
        <servlet-name>demo13</servlet-name>
        <servlet-class>com.itheima.web.ServletDemo13</servlet-class>
    </servlet>
    
    
    <!--
        Servlet 访问路径
    -->
    
    <servlet-mapping>
        <servlet-name>demo13</servlet-name>
        <url-pattern>/demo13</url-pattern>
    </servlet-mapping>
</web-app>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/165466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HBase RowKey设计和实现

HBase由于存储特性和读写性能&#xff0c;在OLAP即时分析中发挥重要作用&#xff0c;Rowkey的设计好坏关乎到HBase的使用情况。 我们知道HBase中定位一条数据需要四个维度的限制&#xff1a;RowKey&#xff0c;Column Family&#xff0c;Column Qualifier&#xff0c;Timestamp…

同源策略和跨域请求的实现

一、什么是同源策略 如果两个 URL 的 protocol、port (en-US) (如果有指定的话) 和 host 都相同的话&#xff0c;则这两个 URL 是同源。这个方案也被称为“协议/主机/端口元组”&#xff0c;或者直接是“元组”。&#xff08;“元组”是指一组项目构成的整体&#xff0c;双重/…

C语言 文件操作 深度解析 #重点知识:文件操作函数的使用#

文章目录前言1. 为什么使用文件2. 什么是文件程序文件数据文件3. 文件的打开和关闭4. 文件的顺序读写fgetcfputcfgetsfputsfprintffscanf流的介绍fwritefread5. 文本文件和二进制文件6. 文件读取结束的判定被错误使用的feof7. 文件缓冲区写在最后前言 相信大家对文件都不陌生&a…

4、数据类型

目录 1. 基本类型 &#xff08;1&#xff09;数值类型 &#xff08;2&#xff09;字符类型 &#xff08;3&#xff09;布尔类型 2. 构造类型 3. 空类型 本文主要介绍基本数据类型。 1. 基本类型 基本类型也就是C语言中的基础类型&#xff0c;其中包括整型、字符型、浮点…

我的 git 实战记录

我的 git 实战记录 1. 将本次提交追加到上一次提交 1.1. 情景描述 有些时候&#xff0c;我提交东西太勤快了&#xff0c;导致有部分内容没有提交上去。分为两种情况&#xff1a; 已经 push 远程仓库还没有 push 到远程仓库 1.2. 已经 push到远程仓库 先 git add 提交修改…

Windows免费MQTT服务器搭建及使用

1、EMQ X&#xff08;简称 EMQ) 简介 EMQ的源代码完全开源&#xff0c;支持百万级并发连接&#xff0c;支持完整的MQTT协议&#xff0c;可以简单方便地部署在Linux、Mac OS X或Windows等平台上&#xff0c;支持MySQL、Redis等扩展插件&#xff0c;总的来说&#xff0c;EMQ满足…

Java设计模式-访问者模式Visitor

介绍 访问者模式&#xff08;Visitor Pattern&#xff09;&#xff0c;封装一些作用于某种数据结构的各元素的操作&#xff0c;它可以在不改变数据结构的前 提下定义作用于这些元素的新的操作。主要将数据结构与数据操作分离&#xff0c;解决 数据结构和操作耦合性问题访问者模…

day15|513.找树左下角的值、112. 路径总和、113.路径总和ii、106.从中序与后序遍历序列构造二叉树、105.从前序与中序遍历序列构造二叉树

513.找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1 示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 问题分析&#xff1a; 递归法&#x…

【基础篇】3 # 数组:为什么很多编程语言中数组都从0开始编号?

说明 【数据结构与算法之美】专栏学习笔记 什么是数组&#xff1f; 数组&#xff08;Array&#xff09;是一种线性表数据结构。它用一组连续的内存空间&#xff0c;来存储一组具有相同类型的数据。 线性表和非线性表 线性表&#xff08;Linear List&#xff09;&#xff1…

第07章 面向对象编程(中级部分OOP)

文章目录IDE(集成开发环境)IDEA介绍idea运行包包的作用包基本语法包的本质分析(原理)包的命名命名规则命名规范常用的包如何引入包注意事项和使用细节访问修饰符【modifier】基本介绍使用的注意事项封装【encapsulation】介绍封装的好处和理解封装的实现步骤封装练习继承【exte…

【阶段四】Python深度学习02篇:深度学习基础知识:神经网络可调超参数:优化器

本篇的思维导图: 神经网络可调超参数:优化器 优化器相当于是用来调解神经网络模型的‘手柄’。 代码 # 编译神经网络,

【C语言】小王带您轻松实现动态内存管理(简单易懂)

在上文通讯录制作中&#xff0c;动态通讯录的使用中就用到了动态内存管理&#xff0c;如果有同学想看一看是如何运用的内存管理函数的&#xff0c;请参考这篇文章&#xff0c;接下来我们一起学习动态内存管理的相关知识。【C语言】使用C语言实现静态、动态的通讯录&#xff08;…

浅显易懂的三次握手与四次挥手

目录 一、三次握手 什么是三次握手&#xff1f; 三次握手图解&#xff1a; 过程解析&#xff1a; &#xff08;1&#xff09;第一次握手&#xff1a; &#xff08;2&#xff09;第二次握手&#xff1a; &#xff08;3&#xff09;第三次握手&#xff1a; 二、四次挥手 …

已解决Python读取20GB超大文件内存溢出报错MemoryError

已解决Python读取20GB超大文件内存溢出报错MemoryError 文章目录报错问题报错翻译报错原因解决方法1解决方法2&#xff08;推荐使用&#xff09;帮忙解决报错问题 日常数据分析工作中&#xff0c;难免碰到数据量特别大的情况&#xff0c;动不动就2、3千万行&#xff0c;如果…

操作系统进程调度算法

进程调度 高级调度&#xff08;作业调度&#xff09;&#xff1a;按一定的原则从外存的作业后备队列中挑选一个作业调入内存&#xff0c;并创建进程。每个作业只调入一次&#xff0c;调出一次。作业调入时会建立PCB&#xff0c;调出时会撤销PCB。 中级调度&#xff08;内存调度…

【历史上的今天】1 月 16 日:互联网工程任务组(IETF)成立;AMD 收购 NexGen;eBay 的第一位员工出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 1 月 16 日&#xff0c;在 26 年前的今天&#xff0c;国家电力公司组建成立。电力是运作着我们生活的基本&#xff0c;国家电力公司成立于 1997 年 1 月 16 日…

《深度学习入门基于python的理论与实现》chap2感知机 笔记

《深度学习入门:基于python的理论与实现》chap2 感知机 笔记 3个月前正式开始入坑AI的时候就是看的这本书&#xff0c;当时比较粗略地看到了第六章&#xff0c;没有记笔记&#xff0c;现在来重温一下 文章目录《深度学习入门:基于python的理论与实现》chap2 感知机 笔记2.1 什么…

【阶段四】Python深度学习05篇:深度学习项目实战:卷积神经网络的定义、卷积网络的结构与卷积层的原理

本篇的思维导图: 卷积神经网络的定义 卷积神经网络,简称为卷积网络,与普通神经网络的区别是它的卷积层内的神经元只覆盖输入特征局部范围的单元,具有稀疏连接(sparse connectivity)和权重共享(weight shared)的特点,而且其中的过滤器可以做到对图像关键特征的…

基于Power BI的品牌销售金额帕累托分析

一、原理 帕累托于1906年提出了著名的关于意大利社会财富分配的研究结论&#xff1a;20&#xff05;的人口掌握了80&#xff05;的社会财富。这个结论对大多数国家的社会财富分配情况都成立。因此&#xff0c;该法则又被称为80/20法则。 二、数据源 已知某终端表1《商品信息》…

GO 语言 Web 开发实战一

xdm&#xff0c;咱今天分享一个 golang web 实战的 demo go 的 http 包&#xff0c;以前都有或多或多的提到一些&#xff0c;也有一些笔记在我们的历史文章中&#xff0c;今天来一个简单的实战 HTTP 编程 Get 先来一个 小例子&#xff0c;简单的写一个 Get 请求 拿句柄 设置…