JavaWeb
java + web
Tomcat服务器及Maven部分
1、基本概念
1.1、前言
web开发:
- web:网页
- 静态web
- html、css
- 提供给所有人看的数据始终不会发生变化
- 动态web
- 淘宝,几乎所有的网站
- 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息不一样
- 技术栈:Servlet/JSP ,ASP, PHP
在java中,动态web资源开发的技术统称为JavaWeb
1.2、web应用程序
web应用程序:可以提供浏览器访问的程序
- a.html、b.html…多个web资源,这些web资源可以被外界访问,对外界提供服务
- 只要是能够访问到的任何一个页面或者资源,都存在于这个世界的某个角落的计算机上。
- URl
- 这个统一的web资源会被放在同一个文件夹下,web应用程序–>Tomcat:服务器
- 一个web应用由多个部分组成(静态web、动态web)
- html、css、js
- jsp、servlet
- Java程序
- jar包
- 配置文件(Properties)
web应用程序编写完毕后,若想要提供给外界访问,需要一个服务器来进行统一的管理
1.3、静态web
- *.html,*.html都表示网页的后缀,如果服务器上一直存在这些东西,我们就可以直接进行读取。
- 静态web存在的缺点:
- web页面无法动态跟新,所有用户看到的都是同一个界面
- 轮播图,点击特效:伪动态
- JavaScript[实际开发中使用较多]
- VBScript
- 它无法和数据库交互(数据无法持久化)
- web页面无法动态跟新,所有用户看到的都是同一个界面
1.4、动态web
页面会动态站视:web页面的展示效果因人而异
缺点:
- 加入服务器的动态web资源出现了错误,我们就需要重新编写我们的后台程序,重新发布
- 停机维护
优点:
- web页面可以动态跟新,所有用户看到都不是同一个页面
- 它可以与数据库交互(数据持久化:注册、商品信息、用户信息)
2、web服务器
2.1、技术讲解
ASP:
- 微软:国内最在流行的ASP
- 在html中嵌入VB的脚本,ASP+COM
- 在ASP开发中,基本一个页面包含几千行业务代码
- 维护成本高
- 使用的语言是C#
- 基于IIS服务器(windows内置服务器)
PHP:
- PHP开发速度快,功能强大,跨平台,代码简单(70%公司,WP模板引擎)
- 无法承载大访问量的情况(局限性)
JSP/Servlet:
B/S:浏览器和服务器
C/S:客户端和服务器
- sun公司主推的B/S架构
- 基于java语言(所有的大公司,或者一些开源的组件都是用java编写的)
- 可以承载三高(高并发、高可用、高性能)带来的影响
- 语法像ASP,转移学习成本不高
…
2.2、web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些相应信息
IIS:
微软,windows自带的
Tomcat:
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个java初学web的人来说,他是最佳的选择。
Tomcat 实际上运行JSP 页面和Servlet,目前Tomcat最新版本为9.0.30。
下载tomcat:
- 安装or解压
- 了解配置文件以及文件的目录结构
- 这个东西的作用
3、Tomcat
3.1、安装tomcat
- 官网下载对应的版本
- 解压到本地磁盘
3.2、Tomcat启动和配置
文件夹的作用:
启动tomacat:
关闭Tomcat:
- 直接关闭窗口
- 使用脚本文件
可能遇到的问题:
- Java环境如果没有配置,会出现闪退
- 乱码问题出现后,可以在配置文件中进行相应的修改
3.3、配置
1. 配置要点
核心配置文件
可以修改启动的端口号:
<Connector connectionTimeout="20000" port="8082" protocol="HTTP/1.1" redirectPort="8443"/>
- tomcat默认端口:8080
- mysql默认端口:3306
- http默认端口:80
- https默认端口:443
可以修改主机的名称:
- 默认的主机名为:localhost --> 127.0.0.1
- 默认网站应用存放的位置:webapps
//此处为引擎,不能修改
<Engine defaultHost="localhost" name="Catalina">
//应该修改此处代码
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
2. 面试题:
请你谈谈网站是如何进行访问的。
-
输入一个访问的域名
-
检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有域名映射
-
有:直接返回对应的ip地址中,有我们需要访问的web程序,可以直接访问
-
没有:就去DNS服务器上寻找,找到了就返回,找不到就返回找不到资源
具体的操作:
使用www.mobian.com:8082(我自己修改过端口号)访问tomcat服务器的测试首页
-
修改servlet.xml核心配置文件(E:\tomcat\apache-tomcat-8.5.45\conf)
-
修改本机的hosts配置文件(C:\Windows\System32\drivers\etc)
3、浏览器访问
3.4、发布一个web网站
将自己写的网站,放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了
网站应有的结构
--webapps:tomcat服务器的web目录
--ROOT
--mobian:网站的目录名
--WEB-INF
--classes:java程序
--lib:web应用所依赖的ar包
--web.xml:网站配置文件
--index.html:默认的首页
--static
--css
--style.css
--js
--img
--......
HTTP协议:面试
Maven:构建工具
- Maven安装包
Servlet入门
- HelloWorld!
- Servlet配置
- 原理
4、HTTP
4.1、什么是http
Http(超文本传输协议)是一个简单的请求-响应协议,它通常运行在tcp之上
- 文本:html、字符串…
- 超文本:图片、音乐、视频、定位、地图…
- 端口:80
Https:安全
- 端口:443
4.2、两个时代
- http1.0
- HTTP1.0:客户端可以与web服务器连接后,只能获得一个web资源,断开流量
- http2.0
- HTTP1.1:客户端可以与web服务器连接后,可以获得多个web资源
4.3、Http请求
客户端–发请求(Request)–服务器
百度:
Request URL: https://www.baidu.com/ //请求地址
Request Method: GET //get方法/post方法
Status Code: 200 OK //状态码:200,表示正常
Remote Address: [2409:8c54:870:28:0:ff:b049:5cef]:443 //远程的地址加端口
Accept:text/html //连接的方式
Accept-Encoding: gzip, deflate, br //连接编码
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 //连接语言
Cache-Control: max-age=0 //缓存控制
Connection: keep-alive //连接,保持连接
Host: www.baidu.com //主机名
1.请求行
- 请求行中的请求方式:GET
- 请求方式:GET、POST、HEAD、DELETE、PUT、TRACT…
- get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
- post:请求能够携带的参数无限制,大小无限制,会在浏览器的URL地址栏不显示数据内容,安全,但不高效
2.请求头
请求的这些都可以用java在后台完成,但是十分的不方便
Accept:text/html //告诉浏览器,它所支持的数据类型
Accept-Encoding: gzip, deflate, br //支持那种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 //告诉浏览器,它的语言环境
Cache-Control: max-age=0 //缓存控制
Connection: keep-alive //告诉浏览器,请求完成时是断开还是保持连接
HOST: //主机的名字
4.4、Http响应
服务器–响应(Response)–客户端
百度:
Cache-Control: no-cache //缓存控制
Connection: keep-alive //连接,保持连接
Content-Encoding: gzip //内容编码格式
Content-Type: text/html;charset=utf-8 //内容风格
1.响应体
Accept:text/html //告诉浏览器,它所支持的数据类型
Accept-Encoding: gzip, deflate, br //支持那种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 //告诉浏览器,它的语言环境
Cache-Control: max-age=0 //缓存控制
Connection: keep-alive //告诉浏览器,请求完成时是断开还是保持连接
HOST: //主机的名字
Refresh://告诉客户端,多久刷新一次
Location://告诉网页重新定位
2.响应状态码
2XX:请求成功
- 200:请求响应成功
3XX:请求重定向
4XX:
- 404:找不到资源
5XX:
- 500:服务器代码错误
- 502:网关错误
3.面试题
当你的浏览器中地址栏输入地址并且回车的一瞬间到页面能够展示回来,经历了什么?
5、Maven
由于我们在javaweb开发过程中需要手动导入很多的jar包,多以Maven诞生了。
5.1、Maven项目架构管理工具
目前使用是为了为了方便导入jar包
Maven核心思想:约定大于配置
- 有约束,不要去违反
Maven会规定号你该如何去编写我们的java代码,必须按照这个规范来
5.2、下载安装
官网下载:Download结构下
5.3、配置环境变量
配置环境变量:
- MAVEN_HOME:Maven的安装路径
- M2_HOME :Maven下bin目录的路径(后期springboot、springcloud会使用到)
- Path:Maven下bin目录的路径
测试配置:
5.4、阿里云镜像
- 镜像:mirrors
- 作用:加速我们的下载
- 国内建议使用阿里云的镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
实际操作:maven目录下–>conf–>settings.xml打开
5.5、本地仓库
仓库分为:本地的仓库,远程仓库
建立一个本地仓库:localRepository
//在自己的maven目录下,新建一个仓库文件夹
E:\Maven\apache-maven-3.6.3\maven-repo
修改配置文件settings.xml
5.6、在IDEA中新建一个模板的Maven项目
1、使用模板创建一个Maven项目
步骤如下:
1.新建一个工程
2.在maven工程下,进行相对应的选择
3.设置相应的组id和项目名
4.选择自己本地的maven项目,maven配置文件以及maven仓库的位置(如果不选择,IDEA则默认使用自带的maven项目,不推荐使用自带的)
5.设置新建的项目名称,以及源代码存放的位置
6.完成创建以后,选择自动导入maven需要的文件(存放在了你设置的仓库的位置)
7.看到提示则为创建成功
8.查看仓库的目录结构,检验导入是否成功
9.在Settings中查看maven相对应的文件的配置情况(可以在导入相应文件之前查看,否则容易出现,仓库的文件下错了位置)
10.选择相应的java版本,以及勾选每次导入时需要导入源码
11.查看仓库的目录是否与自己设置的仓库位置一致
12.点击OK完成
5.7、在IDEA中新建一个普通的Maven项目
1.不要选择任何的模板进行创建
2.设置相应的项目名和组id
3.设置相应的工程名及存储位置
4.选择自动导入相应的文件,效果如图,此时一个干净的maven项目完成
5.8、标记文件夹的功能
方法一:直接右键设置功能
方法二:在Project Structure中进行一个整体的设置
5.9、在IDEA中配置Tomcat
1.点击添加服务器
2.点击添加选项,选择添加一个本地的服务器
3、可以对tomcat服务器进行相应的设置
补充:其中,出现警告的原因是,当配置tomcat服务器的时候,需要有与之相对应的已经存在web项目
4.将相对应的web项目部署到自己新建的服务器上(即解决上面提到的警告)
5.根据相应的提示,打包成war包,下面的那个选项是以war包的形式导出项目
6.启动服务器即可
5.10、pom文件
maven的核心配置文件
1.maven配置详情
<?xml version="1.0" encoding="UTF-8"?>
<!--maven版本和头文件-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--这里是我们刚才配置的GAV-->
<groupId>per.mobian</groupId>
<artifactId>16_maven_01</artifactId>
<version>1.0-SNAPSHOT</version>
<!--项目于的打包方式
jar:java应用
war:javaWeb应用
-->
<packaging>war</packaging>
<!--可以删除-->
<name>16_maven_01 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!--配置-->
<properties>
<!--项目的默认构建编码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编译版本-->
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!--项目依赖-->
<dependencies>
<!--项目具体的依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--项目构建用的东西-->
<build>
<finalName>16_maven_01</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
2.一个干净的pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>per.mobian</groupId>
<artifactId>16_maven_02</artifactId>
<version>1.0-SNAPSHOT</version>
</project>
在一个干净的pom文件中添加依赖以后,右侧的dependencies会出现相应的jar文件
3.maven中部分资源无法导出解决(maven中约定,java目录下只能存在java项目,以至于下面的,xml等配置文件无法导出)
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
5.11、maven操作
可以生成jar包的目录树,类似于软件工程里面的类图
5.12、解决遇到的问题
1.maven查看错误信息
解决方法:当maven导入相对应的依赖的时候,会出现导入依赖出错。在相对应的文件内容中,查看打印的错误日志
注意:有时可能会出现版本问题,建议尝试回退版本
2.tomcat服务器闪退
解决方法:由于startup.bat需要调用catalina.bat文件,但是catalina.bat却没有去进行相应的定位,即在startup.bat文件内容的开头处对JAVA_HOME和JRE_HOME进行绑定即可。但是绑定后,IDEA则会出错,所以可以忽略(本人亲测,tomcat启动闪退,但是IDEA启动正常)
查看startup.bat信息
3.IDEA每次都需要重新配置maven环境
解决方法:这里需要区分两个概念,全局配置和项目配置,如果是进行全局配置,那么一定不会进入具体的项目就可以进行配置
4.maven新建的webapp项目中的web.xml文件的版本问题
解决方法:由于生成的web.xml文件中的版本太老,可以尝试跟换版本。找到自己对应版本的tomcat,找到自带的默认界面下的web.xml,该文件中的内容即为标准的格式
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"
metadata-complete="true">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
</web-app>
5.13、Maven仓库的管理
网址:https://mvnrepository.com/
需要对应的jar包时,可以在maven仓库中,导入相对应的依赖
以servlet-api为例,选择时应该注意选择下载人数较多的
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
具体结果如下图: