Http协议Tomcat使用

news2025/7/18 10:06:12

Web基本知识

课程目标

  1. 服务器的安装和配置(了解)
  2. 服务器和MyEclipse结合(了解)
  3. 服务器部署项目(掌握)
  4. Http协议格式(掌握)

概念

  • 网页,javaweb:使用java语言编写网页

一.网页分类

  • 静态web资源:页面的数据不会发生改变。html,css
  • 动态web资源:页面的数据会发生改变。Jsp/Servlet

常见的web资源架构

  • B/S:brower/server-浏览器/服务器
    • 淘宝,京东

优点:减少客户端的维护成本,无需客户端安装通过浏览器直接请求使用

缺点:加大了服务器端的压力

  • C/S:client/server-客户端/服务器
    • 微信,12306

优点:核心运行在客户端对服务器端压力较小

缺点:核心代码在客户端需要维护并解决安全性

服务器概念

  • 概念

    • 就是一台电脑,必须安装一些指定的软件(tomcat软件)。
  • 或者是用于服务器系统的电脑

  • 访问

    • http://ip地址:端口号

TCP进行数据发送接收基础代码

//客户端socket
public class ClientSocket {
	public static void main(String[] args) throws Exception {
		//创建客户端服务指定连接ip与端口
		Socket s = new Socket("192.168.0.101", 8888);
		//获取输出流对象
		OutputStream os = s.getOutputStream();
		//使用输出流对象将数据发送至服务器端
		os.write("abcdefg".getBytes());
		os.flush();
		//关闭客户端服务
		s.close();
	}
}
//服务器端Socket
public class ServiceSocket {
	public static void main(String[] args) throws Exception {
		 ServerSocket ss=new ServerSocket(8888);
		 //通过阻塞方法获取连接的客户端对象
		 Socket s = ss.accept();
		 //获取输入流
		 InputStream is = s.getInputStream();
		 byte [] b=new byte[1024];
		 int len =0;
		 //读取客户端发送信息并打印
		 while((len=is.read(b))!=-1){
			 System.out.println(new String(b,0,len));
		 }
		 s.close();
		 ss.close();  
	}
}

二.HTTP协议

概述

概念

​ 超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

​ http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使得开发和部署是那么的直截了当。

http是应用层基于请求与响应无状态传输协议

作用

​ HTTP是一个客户端终端(用户)和服务器端(网站)请求和应答的标准(TCP)。通过使用网页浏览器、网络爬虫或者其它的工具,客户端发起一个HTTP请求到服务器上指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理程序和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。

​ 尽管TCP/IP协议是互联网上最流行的应用,HTTP协议中,并没有规定必须使用它或它支持的层。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因此也就是其在TCP/IP协议族使用TCP作为其传输层。

​ 通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。

http协议可以理解为底层使用tcp协议,当浏览器发起请求时会建立连接,当服务器响应后就会断开本次连接(每次输入网址发送请求都会建立一起连接,服务器会根据本次请求进行响应后结束连接)

协议目的

HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:

(1)客户与服务器建立连接;

(2)客户向服务器提出请求;

(3)服务器接受请求,并根据请求返回相应的文件作为应答;

(4)客户与服务器关闭连接。

客户与服务器之间的HTTP连接是一种一次性连接,它限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考虑到WWW服务器面向的是Internet中成干上万个用户,且只能提供有限个连接,故服务器不会让一个连接处于等待状态,及时地释放连接可以大大提高服务器的执行效率。

HTTP请求格式(请求协议)

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OOT2tThP-1678210162291)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kXaLlltB-1678210162293)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

  • 请求行

    • 提交方式

      • get:将提交的参数拼接显示在地址栏,不安全,传递的参数大小有限制
      • post:提交的参数封装在请求体内,比较安全,支持大数据传输(文件,图片)
    • 提交的路径

    • 协议版本

      • 1.0:发送一次请求,产生一次响应,链接断开
      • 1.1:发送一次请求,产生一次响应,链接并不会马上断开,如果一段时间没有请求,链接自动断开。
  • 请求头

    • 每个请求头都有固定的作用
      • user-agent:获取浏览器的版本信息
      • referer:获取网页的来源
  • 空行

  • 请求体

使用tcp模拟http发送请求并接受请求服务器返回的结果

import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;

public class TcpSendHttp {
	public static void main(String[] args) throws   Exception {
		//书写tcp客户端 连接指定服务器端
		Socket s=new Socket("220.181.38.149", 80);
		OutputStream os = s.getOutputStream();
		//通过输出流输出请求格式对应的字符串
		os.write("GET / HTTP/1.1\n".getBytes());
		//设置User-Agent 告诉指定服务器 我是个浏览器
		os.write("User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.75 Safari/537.36".getBytes());
		os.write("\n\n".getBytes());
		//获取服务器返回的数据
		InputStream is = s.getInputStream();
		//尽量不要写循环 可能无法结束
		byte b[]=new byte[2048];
		int len = is.read(b);
		System.out.println(new String(b,0,len));
		s.close();	
	}
}

HTTP响应格式(响应协议)

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rLkPtr7Q-1678210162295)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-19551BAO-1678210162298)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

  • 响应行
    • 协议版本
    • 状态码
      • 200 一切正常
      • 302 重定向
      • 304 浏览器缓存
      • 404 客户端发生错误(地址有问题)
      • 500 服务器内部发生错误
  • 响应头
    • refresh:页面定时刷新
    • location:重定向页面(与302状态码结合使用)
  • 空行
  • 响应体
    • 响应的内容

使用tcp协议处理浏览器http发送的请求并响应数据

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class TcpGetHttp {
	public static void main(String[] args) throws Exception {
		//创建tcp服务器端 监听端口
		ServerSocket ss=new ServerSocket(10086);
		//获取客户端连接
		while(true){
			Socket s = ss.accept();
			InputStream is = s.getInputStream();
			//获取客户端浏览器请求的数据
			//转换为字符流
			InputStreamReader isr=new InputStreamReader(is);
			//转换字符高效流就是为了按行读取
			BufferedReader br=new BufferedReader(isr);
			//如果使用while会使页面一直等待
			//所以我们只获取请求第一行
			String line= br.readLine();
			System.out.println("浏览器请求:"+line);
			
			//http协议基于请求与响应 
			//所以服务器需要返回响应数据
			
			//浏览器页面第一次请求时会额外请求favicon.ico
			//作为当前服务器的图标 如果没有可能报错
			
			//返回响应数据
			OutputStream os = s.getOutputStream();
			os.write("HTTP/1.1 200 OK\nContent-Type: text/html; charset=utf-8 \r\n\r\n请求成功".getBytes());
			//防止乱码 添加返回为html 编码为utf-8
			s.close();
		}
	}
}

使用Socket请求百度获取百度响应信息

//客户端socket
public class ClientSocket {
	public static void main(String[] args) throws Exception {
		// 创建客户端服务指定连接ip与端口
		Socket s = new Socket("www.baidu.com", 80);
		// 获取输出流对象
		OutputStream os = s.getOutputStream();
		InputStream is = s.getInputStream();

		// 使用输出流对象将数据发送至服务器端
		os.write("GET / HTTP/1.1\n".getBytes());
		os.write("\r\n".getBytes());
		os.flush();
		
		
		byte[] b=new byte[1024];
		int len=0;
		while((len=is.read(b))!=-1){
			System.out.println(new String(b,0,len));
		}
		// 关闭客户端服务
		s.close();
	}
}

百度响应信息

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 14615
Content-Type: text/html
Date: Mon, 09 Aug 2021 02:53:28 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Pragma: no-cache
Server: BWS/1.1
Set-Cookie: BAIDUID=2891F7401E9F30AC9014BC5F4CF3FE8E:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=2891F7401E9F30AC9014BC5F4CF3FE8E; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1628477608; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BAIDUID=2891F7401E9F30ACD654ACBAE3F7E218:FG=1; max-age=31536000; expires=Tue, 09-Aug-22 02:53:28 GMT; domain=.baidu.com; path=/; version=1; comment=bd
Traceid: 162847760828380290667205192330022957930
Vary: Accept-Encoding
X-Frame-Options: sameorigin
X-Ua-Compatible: IE=Edge,chrome=1

<!DOCTYPE html><!--STATUS OK-->
<html>
.....
</html>

HTTP状态码

img[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7Ga6TwHJ-1678210162301)(data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)]

使用tcp模拟处理http请求与响应

//使用tcp处理http请求并响应数据
public class TcpResponse {
	// 使用tcp socket介绍浏览器发生的http请求 并解析请求中的数据
	// 根据http响应的语法 将数据发送至浏览器显示
	// 客户端在浏览器输入网址 输入请求数据
	// localhost:8888/login?username=zhangsan&password=123456
	// 根据输入的数据判断账号密码 返回 登录成功 或 登录失败
	public static void main(String[] args) throws Exception {
		// 创建sokect服务器监听指定端口
		ServerSocket ss = new ServerSocket(8888);
		while (true) {
			// 获取客户端连接对象
			Socket s = ss.accept();
			// 获取输入流 读取客户端发送的请求信息
			// 使用转换流与高效流读取
			InputStream is = s.getInputStream();
			// 使用转换流将字节流换行为字符流
			InputStreamReader isr = new InputStreamReader(is);
			// 创建字符高效流
			BufferedReader br = new BufferedReader(isr);
			// 如果使用while可能导致一直读取
			// 在获取请求信息时 实际基本只有第一行数据有用 所以获取第一行数据即可
			String readLine = br.readLine();
			// 解析请求数据获取请求信息
			// 使用空格获取中间数据
			String[] split = readLine.split(" ");
			System.out.println(split[1]);
			String data = split[1];
			// 判断是否包含? 判断请求格式是否符合标准
			String msg = "";
			if (data.contains("?")) {
				// 继续截取
				String[] dataArr = data.split("\\?");
				System.out.println("请求的服务地址为:" + dataArr[0]);
				HashMap<String, String> parseSring = parseSring(dataArr[1]);
				System.out.println("请求的数据为:" + parseSring);
				if(dataArr[0].equals("/login")){
					if(parseSring.get("username").equals("zhangsan")&&parseSring.get("password").equals("123456")){
						msg="登录成功";
					}else{
						msg="登录失败";
					}
				}else{
					msg="无法处理该请求";
				}
			} else {
				msg = "请输入正确的请求格式";
			}
			// 获取输出流
			OutputStream os = s.getOutputStream();
			// 根据http响应格式 响应客户端的请求
			os.write("HTTP/1.1 200 OK\n".getBytes());
			// 设置页面解析数据的编码格式
			os.write("Content-Type: text/html ;charset=utf-8\n".getBytes());
			os.write("\r\n".getBytes());
			os.write(msg.getBytes());
			os.flush();
			os.close();
			// 关闭流
			br.close();
			s.close();
		}
		// ss.close();
	}
	
	//将参数字符串转换为map集合
	public static HashMap<String, String> parseSring(String str){
		HashMap<String, String> values=new HashMap<>();
		String[] split = str.split("&");
		for (String string : split) {
			String[] split2 = string.split("=");
			values.put(split2[0],split2[1]);
		}
		return values;
	}
}

注意:

1.使用tcp协议处理http请求时 本质还是通过io流进行数据的发送与返回

2.因为http协议在1.1之后一次连接可以多次请求(长连接),所以不能使用while读取 否则会一直进行读取操作(等待客户端发送信息),不会继续进行,所以一般只读取首行即可

3.书写服务器接收数据后必须书写响应数据(按照http协议响应的格式),否则浏览器会一直等待,直至超时,显示请求失败(因为没有接收到服务器的响应信息,默认理解为服务器找不到)

4.如果返回的数据存在中文,那么可能出现乱码,可以在相应的字符串中添加对应的编码集

​ os.write(“Content-Type: text/html ;charset=utf-8\n”.getBytes());

5.建议使用无痕浏览器打开,否则可能出现修改后页面不更改

使用tcp处理请求并返回响应的页面

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;

//使用tcp处理http请求并响应数据
public class TcpResponseHtml {
	// 使用tcp socket介绍浏览器发生的http请求 并解析请求中的数据
	// 根据http响应的语法 将数据发送至浏览器显示
	// 客户端在浏览器输入网址 输入请求数据
	// localhost:8888/login?username=zhangsan&password=123456
	// 根据输入的数据判断账号密码 返回 登录成功 或 登录失败
	public static void main(String[] args) throws Exception {
		// 创建sokect服务器监听指定端口
		ServerSocket ss = new ServerSocket(8888);
		while (true) {
			// 获取客户端连接对象
			Socket s = ss.accept();
			// 获取输入流 读取客户端发送的请求信息
			// 使用转换流与高效流读取
			InputStream is = s.getInputStream();
			// 使用转换流将字节流换行为字符流
			InputStreamReader isr = new InputStreamReader(is);
			// 创建字符高效流
			BufferedReader br = new BufferedReader(isr);
			// 如果使用while可能导致一直读取
			// 在获取请求信息时 实际基本只有第一行数据有用 所以获取第一行数据即可
			String readLine = br.readLine();
			String[] split = readLine.split(" ");
			String data = split[1];

			// 获取输出流
			OutputStream os = s.getOutputStream();
			// 根据http响应格式 响应客户端的请求
			os.write("HTTP/1.1 200 OK\n".getBytes());
			// 设置页面解析数据的编码格式
			os.write("Content-Type: text/html ;charset=utf-8\n".getBytes());
			os.write("\r\n".getBytes());

			// 创建返回页面的文件对象
			File path = new File("D:/eclipse/work/Day0809/src/com/yunhe/tcpTOhttp");
			File f = new File(path, data);
			// 读取文件将文件写入响应中
			try {
				FileInputStream fis = new FileInputStream(f);
				byte b[] = new byte[1024];
				int len = 0;
				while ((len = fis.read(b)) != -1) {
					os.write(b, 0, len);
				}
				fis.close();
			} catch (FileNotFoundException e) {
				System.out.println(data+"文件不存在");
			}

			os.flush();
			os.close();
			// 关闭流
			br.close();
			s.close();
		}
	}
}

HTTP协议与TCP协议的区别

1.使用位置不同

http是应用层协议,tcp是传输层协议(tcp更底层)

http针对于万维网数据请求与响应,tcp就是直连数据传输

2.连接方式不同

http基于请求与响应进行连接,tcp经过三次握手建立连接

3.同一个连接中数据交互次数不同

http请求一次建立一次连接(1.0),在1.1之后可以多次 但是一定时间没有请求则断开,tcp可以在连接期间无限制的进行数据的交互,直至主动断开

4.数据交互方式不同

http在连接时会将数据书写在请求中,服务器通过解析请求获取数据

tcp在建立连接后直接进行数据的交互

三.服务器

3.1Tomcat的安装

  • 直接解压
  • 运行:双击startup.bat(在安装目录下的bin目录)
  • 访问测试:在浏览器输入http://localhost:8080

安装过程中常见问题

  • 黑窗口一闪而过

    • 原因:java环境变量设置有问题
  • 端口占用的问题

    • 解决方案

      • 杀死现有的程序

        • 查看占用8080端口号的PID
        • netstat -ano
        • 杀死该进程
          • taskkill -pid 进程号
      • 修改tomcat的端口号

        • conf/server.xml

        <Connector port=“9999” protocol="HTTP/1.1"connectionTimeout=“20000” redirectPort=“8443” />

        
        
        
        

安装目录介绍

Tomcat的目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WLzCnkWD-1678210162303)(asseits/image-20200318155053556.png)]

bin:该目录下存放的是二进制可执行文件,如果是安装版,那么这个目录下会有两个exe文件:tomcat8.exe、tomcat8w.exe,前者是在控制台下启动Tomcat,后者是弹出UGI窗口启动Tomcat;如果是解压版,那么会有startup.bat和shutdown.bat文件,startup.bat用来启动Tomcat,但需要先配置JAVA_HOME环境变量才能启动,shutdawn.bat用来停止Tomcat;

conf:这是一个非常非常重要的目录,这个目录下有四个最为重要的文件:

  1. server.xml:配置整个服务器信息。例如修改端口号,添加虚拟主机等;下面会详细介绍这个文件;

  2. tomcatusers.xml:存储tomcat用户的文件,这里保存的是tomcat的用户名及密码,以及用户的角色信息。可以按着该文件中的注释信息添加tomcat用户,然后就可以在Tomcat主页中进入Tomcat Manager页面了;

  3. web.xml:部署描述符文件,这个文件中注册了很多MIME类型,即文档类型。这些MIME类型是客户端与服务器之间说明文档类型的,如用户请求一个html网页,那么服务器还会告诉客户端浏览器响应的文档是text/html类型的,这就是一个MIME类型。客户端浏览器通过这个MIME类型就知道如何处理它了。当然是在浏览器中显示这个html文件了。但如果服务器响应的是一个exe文件,那么浏览器就不可能显示它,而是应该弹出下载窗口才对。MIME就是用来说明文档的内容是什么类型的!

  4. context.xml:对所有应用的统一配置,通常我们不会去配置它。

lib:Tomcat的类库,里面是一大堆jar文件。如果需要添加Tomcat依赖的jar文件,可以把它放到这个目录中,当然也可以把应用依赖的jar文件放到这个目录中,这个目录中的jar所有项目都可以共享之,但这样你的应用放到其他Tomcat下时就不能再共享这个目录下的Jar包了,所以建议只把Tomcat需要的Jar包放到这个目录下;

logs:这个目录中都是日志文件,记录了Tomcat启动和关闭的信息,如果启动Tomcat时有错误,那么异常也会记录在日志文件中。

temp:存放Tomcat的临时文件,这个目录下的东西可以在停止Tomcat后删除!

webapps:存放web项目的目录,其中每个文件夹都是一个项目;如果这个目录下已经存在了目录,那么都是tomcat自带的。项目。其中ROOT是一个特殊的项目,在地址栏中没有给出项目目录时,对应的就是ROOT项目。http://localhost:8080/examples,进入示例项目。其中examples就是项目名,即文件夹的名字。

work:运行时生成的文件,最终运行的文件都在这里。通过webapps中的项目生成的!可以把这个目录下的内容删除,再次运行时会生再次生成work目录。当客户端用户访问一个JSP文件时,Tomcat会通过JSP生成Java文件,然后再编译Java文件生成class文件,生成的java和class文件都会存放到这个目录下。

LICENSE:许可证。

NOTICE:说明文件。

3.2 Tomcat的配置

测试:

主机IP地址/localhost:端口号

3.2.1 端口号的配置

端口号修改之后,需要重启服务器

​ tomcat默认的端口号是8080,我们的操作系统默认的端口是80,可以省略:80

    <Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443"  URIEncoding="UTF-8" />

2.2.2运行javaweb程序

3.2.2.1

将我们之前写的程序,放webapps下了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bOdSf8r0-1678210162306)(asseits/image-20200318161506952.png)]

访问的时候

localhost:端口号/网站程序名

注意事项:

目前一般人不会碰到

假如你碰到了,

cmd-》netstat -ano去查看8080端口被哪个程序占用了。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zPaTV3RQ-1678210162309)(asseits/image-20200318162331092.png)]

Ctrl+Shift+Esc

假设不是java程序占用了,可以结束掉

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IW2o76GJ-1678210162311)(asseits/image-20200318162412514.png)]

4.5 Tomcat的运行&关闭

在启动Tomcat之前,我们必须要配置环境变量

JAVA_HOME:必须先配置JAVA_HOME,因为Tomcat启动需要使用JDK;

startup.bat会调用catalina.bat,而catalina.bat会调用setclasspath.bat,setclasspath.bat会使用JAVA_HOME环境变量,所以我们必须在启动Tomcat之前把JAVA_HOME配置正确。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ysPv86Dw-1678210162312)(asseits/image-20200318155358921.png)]

Tomcat的安装路径;

CLASSPATH:也可以先不配置,重点是JAVA_HOME这个变量的配置。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kRzNmzm4-1678210162313)(asseits/image-20200318155618533.png)]

启动Tomcat

1.在tomcat的安装路径下,有startup.bat文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WQLgTqK6-1678210162314)(asseits/image-20200318155916935.png)]

访问测试:http://localhost:8080/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oIKFwwL6-1678210162315)(asseits/image-20200318155852810.png)]

2.启动方式2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-22qeyqDk-1678210162316)(asseits/image-20200318160204089.png)]

3.启动方式3

​ cmd->

​ cd 你的tomcat目录\bin 这个路径

​ 输入catalina run

会显示环境变量的依赖:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6JT98Aee-1678210162317)(asseits/image-20200318160550082.png)]

关闭:

因为已经关闭了,所以报错。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sZoabHJc-1678210162318)(asseits/image-20200318160110297.png)]

3.3 部署项目

a)第一种方式:直接在webapps下放我们的网站目录;

打一个war包的方式放到webapps下,这个war包会自动解压;

b)第二种方式:配置Server.xml文件

<!-- 配置 -->
		<Context docBase="d:/aaa/mi" path="/mi2"/>
		docBase:表示网站的实际路径
		path:表示外部的url访问的路径

c)第三种方式:在conf下的Catalina下的localhost增加一个url.xml的文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gvYuiiLU-1678210162319)(asseits/image-20200319145402134.png)]

参考配置:

<Context docBase="d:/aaa/mi"/>

并且第4种方式,如果url发生变更,不需要重启服务器,只用修改文件名即可,也就是说文件名和url一致的。

3.2.IDEA配置

配置Tomcat安装目录

第一个Web项目:HelloWeb创建

  • 动态web项目目录介绍

    • 项目名
      • 静态资源(HTML,CSS,JAVASCRIPT)
      • WEB-INF(必须有)
        • classes:java文件编译生成的字节码文件
        • lib:项目运行需要的jar文件
        • web.xml:核心配置文件
  • 静态WEB项目结构

    • 项目名(文件夹)
      • 静态资源

3.3 问题:

解决idea启动tomcat控制台中文乱码

2318)]

3.3 部署项目

a)第一种方式:直接在webapps下放我们的网站目录;

打一个war包的方式放到webapps下,这个war包会自动解压;

b)第二种方式:配置Server.xml文件

<!-- 配置 -->
		<Context docBase="d:/aaa/mi" path="/mi2"/>
		docBase:表示网站的实际路径
		path:表示外部的url访问的路径

c)第三种方式:在conf下的Catalina下的localhost增加一个url.xml的文件

[外链图片转存中…(img-gvYuiiLU-1678210162319)]

参考配置:

<Context docBase="d:/aaa/mi"/>

并且第4种方式,如果url发生变更,不需要重启服务器,只用修改文件名即可,也就是说文件名和url一致的。

3.2.IDEA配置

配置Tomcat安装目录

第一个Web项目:HelloWeb创建

  • 动态web项目目录介绍

    • 项目名
      • 静态资源(HTML,CSS,JAVASCRIPT)
      • WEB-INF(必须有)
        • classes:java文件编译生成的字节码文件
        • lib:项目运行需要的jar文件
        • web.xml:核心配置文件
  • 静态WEB项目结构

    • 项目名(文件夹)
      • 静态资源

3.3 问题:

解决idea启动tomcat控制台中文乱码

修改idea显示编码,windows默认用gbk所以idea显示默认为GBK编码,在Help→Edit custom vm options 添加 -Dfile.encoding=UTF-8

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

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

相关文章

传统手工数据采集耗时耗力?Smartbi数据填报实现数据收集分析自动化

企业在日常经营管理过程中&#xff0c;往往需要收集很多内外部的信息&#xff0c;清洗整理后再进行存储、分析、呈现、决策支持等各种作业&#xff0c;如何高效收集结构化数据是企业管理者经常要面对的问题。传统手工的数据采集方式不仅耗费了大量人力时间成本&#xff0c;还容…

0102Bean配置和解析-Bean生命周期-spring

文章目录1 前言2 第一阶段-Bean信息配置阶段2.1 配置方式2.2 配置信息2.3 配置示例2.3.1 注解方式配置2.3.2 xml文件配置2.3.3 API方式3 第二阶段-Bean元信息解析阶段3.1 注解方式解析3.1.1 AnnotatedBeanDefinitionReader解析过程3.1.2 ClassPathBeanDefinitionScanner解析过程…

MapTask工作机制

目录 &#xff08;1&#xff09;Read阶段 &#xff08;2&#xff09;Map阶段 &#xff08;3&#xff09;Collect收集阶段 &#xff08;4&#xff09;Spill阶段 &#xff08;5&#xff09;Merge阶段 &#xff08;1&#xff09;Read阶段 MapTask通过InputFormat获得的Recor…

单协议 2.4GHz CC2651R31T0RGZR/CC2651R31T0RKPR无线MCU 802.15.4,蓝牙5.2

CC2651R31T0RGZR描述&#xff1a;具有 352KB 闪存的 SimpleLink 32 位 Arm Cortex-M4 单协议 2.4GHz 无线 MCU 48-VQFN -40C ~ 105C48QFN&#xff08;明佳达电子&#xff09;【介绍】CC2651R3器件是一款单协议 2.4 GHz 无线微控制器 (MCU)&#xff0c;支持以下协议&#xff1a;…

35- tensorboard的使用 (PyTorch系列) (深度学习)

知识要点 FashionMNIST数据集: 十种产品的分类. # T-shirt/top, Trouser, Pullover, Dress, Coat,Sandal, Shirt, Sneaker, Bag, Ankle Boot.writer SummaryWriter(run/fashion_mnist_experiment_1) # 网站显示一 tensorboard的使用 在网站显示pytorch的架构:1.1 …

常规非常规的卷及操作

最近看论文看到深度卷积的内容&#xff0c;然后就想着学习一下&#xff0c;发现论文中说的深度卷积并不是真正的深度卷积&#xff0c;感觉是分组卷积的一种&#xff0c;但是对于论文中得使用方式又有点不理解&#xff0c;就留下了一个问题放在了博客的最后&#xff0c;这里记录…

【蓝桥杯刷题】坑爹的负进制转换

【蓝桥杯刷题】——坑爹的负进制转换&#x1f60e;&#x1f60e;&#x1f60e; 目录 &#x1f4a1;前言&#x1f31e;&#xff1a; &#x1f49b;坑爹的负进制转换题目&#x1f49b; &#x1f4aa; 解题思路的分享&#x1f4aa; &#x1f60a;题目源码的分享&#x1f6…

Windows环境下Elasticsearch的下载与安装

一、elasticsearch下载地址1、官网&#xff1a;https://www.elastic.co/cn/即刻体验Elasticsearch2、直接解压3、进入bin目录双击.bat文件直接启动4、报错&#xff1a;error downloading geoip database [GeoLite2-City.mmdb]&#xff0c;elasticsearch.yml中增加&#xff1a;i…

FTP建议使用教程——以Xftp7为例

文件传输协议&#xff08;File Transfer Protocol&#xff0c;FTP&#xff09;是用于在网络上进行文件传输的一套标准协议&#xff0c;它工作在 OSI 模型的第七层&#xff0c; TCP 模型的第四层&#xff0c; 即应用层&#xff0c; 使用 TCP 传输而不是 UDP&#xff0c; 客户在和…

Jmeter+Ant+Jenkins接口自动化测试平台搭建

平台简介一个完整的接口自动化测试平台需要支持接口的自动执行&#xff0c;自动生成测试报告&#xff0c;以及持续集成。Jmeter支持接口的测试&#xff0c;Ant支持自动构建&#xff0c;而Jenkins支持持续集成&#xff0c;所以三者组合在一起可以构成一个功能完善的接口自动化测…

九.虚拟内存VM

1.寻址2.虚拟页VM将虚拟内存分割为称为虚拟页的大小固定的块1247是缓存的、36是未缓存的、05是未分配的下图为缺页及处理后页表将虚拟页映射到物理页页表是一个页表条目(PTE)的数组多个虚拟页面可以映射到同一个物理共享页面内存映射&#xff1a;将一组连续的虚拟页映射到一个文…

蓝牙耳机哪个品牌好一点?佩戴最舒服的蓝牙耳机排行

近年来&#xff0c;蓝牙耳机市场呈爆发式增长&#xff0c;越来越优秀的产品出现在大众视野。那么蓝牙耳机哪个品牌好一点&#xff1f;下面&#xff0c;我来给大家推荐几款佩戴最舒服的蓝牙耳机&#xff0c;一起来看看吧。 一、南卡小音舱蓝牙耳机 参考价&#xff1a;246 蓝牙…

一文带你彻底探究webgis坐标系知识(地理坐标系投影坐标系)

首先讲讲经纬度坐标系的起源与发展。其实目的很简单就是为了用数字化的方式来表示我们的地球和世界。 真正意义上与webgis相关的坐标系我们还得先来说说wgs84坐标系。这是老美1984年提出的一套坐标系。故命名为84坐标系。84坐标系是目前应用范围比较广的坐标系,但他并不是最早…

Elasticsearch:理解 Master,Elections,Quorum 及 脑裂

集群中的每个节点都可以分配多个角色&#xff1a;master、data、ingest、ml&#xff08;机器学习&#xff09;等。 我们在当前讨论中感兴趣的角色之一是 master 角色。 在 Elasticsearch 的配置中&#xff0c;我们可以配置一个节点为 master 节点。master 角色的分配表明该节点…

人机协同“全能秘书”丨 AI+金融“降本增效”全靠它!

近年来&#xff0c;我国金融科技蓬勃发展&#xff0c;以人工智能为主要代表的创新技术&#xff0c;为各大金融企业提供了更智能化的金融服务模式&#xff0c;科技与金融业务的深度融合&#xff0c;为金融行业注入新的发展动力。相比较传统人工客服&#xff0c;智能客服以算法为…

函数模板(template关键字的应用)

注释&#xff1a;本文主要介绍了函数模板的由来以及用法&#xff0c;还有关键字template。 我们感到时间的延续像一条我们无法逆行的小溪。 ——柏格森 文章目录一、语言的定式二、函数模板2.1 函数模板格式2.2 模板函数的实例化2.2.1隐式实例化/显式实例化2.3 模板参数的匹配…

SQL注入——floor报错注入

目录 一&#xff0c;涉及到的函数 rand&#xff08;&#xff09; floor&#xff08;&#xff09; concat_ws() as别名&#xff0c;group by分组 count() 报错原理 一&#xff0c;涉及到的函数 rand()函数&#xff1a;随机返回0~1间的小数 floor()函数&#xff1a;小数向…

C/C++开发,无可避免的多线程(篇六).线程池封装类

一、线程池概念 线程池是一种多线程处理方式&#xff0c;它包含一个线程工作队列和一个任务队列。当有任务需要处理时&#xff0c;线程池会从线程工作队列中取出一个空闲线程来处理任务&#xff0c;如果线程工作队列中没有空闲线程&#xff0c;则任务会被放入任务队列中等待处理…

M1、M2芯片Mac安装虚拟机

目录前言一、安装二、网络设置三、连接SSH客户端前言 一直想着给M1 Mac上安装虚拟机&#xff0c;奈何PD收费&#xff0c;找的破解也不稳定&#xff0c;安装上镜像就起不来。 注&#xff1a;挂长久的分享莫名其妙被封&#xff0c;需要安装包请私信我。 一、安装 虚拟机选择&a…

一次惨痛教训让我写了个Windows定期备份文件脚本

目录前言正文前言 说实话在写这篇文章的时候&#xff0c;咸鱼不禁又想起了那件男默女泪的往事 我喜欢做笔记&#xff0c;我觉得好记性不如烂笔头&#xff0c;所以在我的学习生涯以及职业生涯阶段&#xff0c;我用过四款笔记应用——Onenote、语雀、印象笔记、Typora 其中我个…