系列文章
文章目录
1、基本概念
1.1、前言
-
web是网页的意思,例如www.baidu.com
-
静态web:提供给所有人看的数据始终不会变化!包括HTML、CSS
-
动态web:提供给所有人看的数据会发生变化,每个人在不同时间、地点看到的信息不同。例如淘宝,京东。技术栈:Servlet/JSP、ASP、PHP。
在Java中,动态web资源开发的技术统称为JavaWeb
1.2、静态Web
例如我们访问百度首页,我们的客户端(浏览器)会向服务器发送请求,请求会发送到Web Service,而Web Service会去找服务器中的index.html之类的文件,如果找到了就会把结果通过Web Service响应给客户端。

静态Web的缺点:
- Web页面无法动态更新,所有用户看到的都是同一个页面
- 通过轮播图、点击特效设置的伪动态,一般通过JavaScript。
- 它无法和数据库交互
1.3、动态Web
优点:
- Web页面可以动态更新,所有用户看到的都不是同一个页面。
- 它可以和数据库交互,实现数据持久化。
缺点:假如服务器的动他Web资源出现了错误,我们需要重新编写后台程序,从而停机维护。

2、Web服务器
2.1、几种技术
ASP:
- 由微软使用,是国内最早流行的。
- 在HTML中嵌入了VB的脚本,使用的是ASP+COM
- 在ASP开发中,基本一个页面都有几千行的业务代码,维护成本高!
PHP:
- PHP开发速度很快,功能很强,跨平台,代码也很简单!(70%用WP)
- 但无法承载大访问量的情况(局限性)
JSP/Servelet:
-
是sun公司主推的B/S架构(浏览器和服务器,C/S是客户端和服务器)
-
基于Java语言(所有的大公司或者一些开源组件都是用Java)
-
可以承载三高问题(高并发、高可用、高性能)带来的影响!
-
语法像ASP,因此ASP转JSP比较容易。
2.2、Tomcat服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息。
Tomcat是Apache 软件基金会的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个JavaWeb初学者来说,它是最佳选择!
下载并解压Tomcat:
-
我用的是版本: 64-bit Windows zip
-
官网链接:https://tomcat.apache.org/download-90.cgi

然后启动Tomcat:点击bin下面的startup.bat

启动后的日志是乱码,因为Windows上默认是用GBK,Tomcat是UTF-8。因此需修改conf—logging.properties中代码。将其中 ConsoleHandler.encoding = UTF-8 的UTF-8改为GBK即可
然后在浏览器输入localhost:8080,看见下面页面则表明成功启动。

**tomcat配置文件:**均在conf文件下的server.xml中修改
-
配置启动时的端口号:tomcat默认8080(MySQL:3306、http:80、https:443)
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
-
配置主机名称以及放网站的文件
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
注意不要修改错了,这里是Host标签,而Engine标签是服务器引擎的。
<Engine name="Catalina" defaultHost="localhost">
高难度面试题:网站是如何进行访问的?
- 浏览器输入域名(例如www.baidu.com),回车。
- 客户端(浏览器)检查本地的C:\Windows\System32\drivers\etc\hosts文件配置,查看里面是否有域名映射。
- 有:直接返回对应的IP地址,在这个地址中有我们需要访问的Web应用程序就能直接访问。
- 没有:去DNS服务器(这个是要先联网)找,找到就返回,找不到就显示网页丢失!

例如,下面我通过www.123456.com:8081来访问刚刚的tomcat页面:
-
修改tomcat配置文件:
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <Host name="www.123456.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
-
修改C:\Windows\System32\drivers\etc\hosts文件:

-
启动tomcat,浏览器输入www.123456.com:8081,可以发现,即便没买域名一样访问。
-
记得恢复刚刚的操作。
2.4、发布Web网站
网站的结构(放tomcat中的项目):
-- webapps:Tomcat服务器的web目录
- ROOT
- projectName:自己项目名
- WEB-INF
- classes:放Java程序
- lib:web应用所依赖的jar包
- web.xml:网站配置文件
- index.html:默认的首页
- static 放静态资源
- css
- style.css
- js
- img
- ...
下面将一个简单的网站放到服务器(Tomcat)中的web应用文件夹(默认webapps)进行发布。
1、webapps/myProject/WEB-INF/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">
</web-app>
2、webapps/myProject/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>myProject</title>
</head>
<body>
<h1>
我发布的第一个网站
</h1>
</body>
</html>
3、启动tomcat,在浏览器输入localhost:8080/myProject(网站默认访问index.html)

3、HTTP
3.1、HTTP基本常识
超文本传输协议( Hypertext Transfer Protocol,HTTP ),它是一个简单的请求—响应协议,通常运行在TCP之上。这里的超文本包括图片、音乐、视频、地图…
而HTTPS则是在HTTP基础上通过传输加密和身份认证来保证了传输过程的安全性。(增加了SSL)
HTTP/1.0:客户端和服务器连接后,只能获取一个Web资源,然后就断开连接。(早期)
HTTP/1.1:客户端和服务器连接后,可以获得多个Web资源。
3.2、HTTP的请求和响应
拿百度举例,当我们访问百度首页时,通过开发者模式的Network查看请求和响应。这里挑出其中比较重要的。

General 通用信息:
Request URL:https://www.baidu.com 请求地址
Requset Method:GET 请求方式get/post
Status Code:200 OK 状态码
Remote(远程) Address:14.215.177.38:443 真实IP地址
1、请求行
- 请求行中的请求方式:GET
- 请求方式包括Get,Post,HEAD,Delete,Put…
- get:携带的参数少且大小有限制,还会在浏览器显示数据内容,但高效。
- post:携带的参数没有限制,不会在浏览器显示内容,安全但不高效。
2、消息头
Accept:text/html 告诉浏览器支持的数据类型
Accept-Encoding: gzip, deflate, br 支持哪种编码格式
Accept-Language: zh-CN,zh;q=0.9 告诉浏览器语言环境
Cache-Control:max-age=0 缓存控制
Connection: keep-alive 告诉浏览器请求完成后保持连接
Response 响应
Bdpagetype: 1
Bdqid: 0xdd7d3325000166e8
Cache-Control: private
Connection: keep-alive
Content-Type: text/html;charset=utf-8
1、响应体
Accept:text/html 告诉浏览器支持的数据类型
Accept-Encoding: gzip, deflate, br 支持哪种编码格式
Accept-Language: zh-CN,zh;q=0.9 告诉浏览器语言环境
Cache-Control:max-age=0 缓存控制
Connection: keep-alive 告诉浏览器请求完成后保持连接
HOST:主机
Refresh:告诉客户端多久刷新一次
Location:让网页重新定位
2、状态码
200:响应成功(200)
3xx:请求重定向
4xx:找不到资源(404)
5xx:服务器代码错误(500)
常见面试题:在浏览器输入地址并回车直到页面展示,经历了些什么?
4、Maven
Maven 公共仓库提供了对 maven central、jcenter、google、spring 等常用的 Maven 仓库的镜像功能。用户可以通过页面浏览仓库内容、检索和下载制品。在构建时使用 Maven 个公共仓库地址下载制品速度更快,更稳定。Maven仓库,通俗的理解就是管理我们在开发项目的时候使用的架包仓库。
4.1、安装和环境变量
下载链接:https://archive.apache.org/dist/maven/maven-3/
我这里maven 3.3.9+idea 2019.2,之前尝试过maven 3.6.3+idea 2021.3,然鹅失败了。选择降低版本,下面是亲测可用的!如果有什么问题欢迎讨论,被maven折磨了3天终于成功了QAQ
配置系统环境变量:
-
MAVEN_HOME:指向maven下的bin目录
-
在系统的path中配置MAVEN_HOME:增加%MAVEN_HOME%

- 在CMD中用 mvn -v测试
4.2、Maven配置以及在IDEA中使用
1、修改maven目录下conf中的setting.xml,改变本地仓库(默认在C盘),并添加阿里云镜像。

<!-- 这里指定自己仓库 -->
<localRepository>F:\Environment\repository</localRepository>

<!-- 注意这个内容是在<mirrors>标签内的 -->
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
2、IDEA创建JavaWeb项目
新建项目,选择创建简单的javaweb模板




如果创建项目时出现下面8个error,基本是镜像那出现了的问题,例如最新的要求使用https而不是http。
Cannot resolve plugin org.apache.maven.plugins:maven-clean-plugin:2.5
Cannot resolve plugin org.apache.maven.plugins:maven-resources-plugin:2.6
Cannot resolve plugin org.apache.maven.plugins:maven-jar-plugin:2.4
Cannot resolve plugin org.apache.maven.plugins:maven-compiler-plugin:3.1
Cannot resolve plugin org.apache.maven.plugins:maven-surefire-plugin:2.12.4
Cannot resolve plugin org.apache.maven.plugins:maven-install-plugin:2.4
Cannot resolve plugin org.apache.maven.plugins:maven-deploy-plugin:2.7
Cannot resolve plugin org.apache.maven.plugins:maven-site-plugin:3.3
首先保证用的自己的maven

其次,我用的解决方案是跳过安全检查,在setting-maven-import中添加下面语句。【只在maven 3.3.9+idea 2019.2 成立了,最新的maven 3.6.3+idea 2021.3依然报错】

-Dmaven.wagon.http.ssl.insecure=true -Dmaven.wagon.http.ssl.allowall=true
然后重新导入项目,检查是否还有报红。
接着,建议通过cmd 输入mvn help:system再检查一次,看是否还缺少东西。
如果缺少,它会自动下载,最后会显示成功,如果下载直接失败,可能原因还是镜像问题,可以换一个试试。
如果还有问题,这里有一个Maven问题汇总博客:https://blog.csdn.net/jwcxs_m/article/details/80076909
3、如果创建好的项目结构中不完整,没有webapp、WEB-INF、src等文件,参考这个:IDEA新建maven项目并解决没有webapp文件夹的问题。完整的结构如下:

4.3、IDEA中配置Tomcat
1、创建Tomcat服务器:点击右上角 Add Configuration,然后点击加号。
2、如果报错:检查下面是否正确。
4.4、pom文件
下面通过添加dependency标签,就可以自动导入某个jar包,而maven的高级之处在于,它能自动帮我们导入某个jar包所依赖的其他jar包。
<?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>
<!-- 这里是刚刚创建项目的G A V(首字母) -->
<groupId>com.zcy</groupId>
<artifactId>javaweb-02-servlet</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<!-- 项目的默认构建编码,如果没有这个后面模块的target文件会不完整 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!-- 这个标签表明当前pom是父模块的pom,它的子模块是servlet_01
<modules>
<module>servlet_01</module>
</modules>
-->
<!-- dependencies包含所有依赖-->
<dependencies>
<!--下面三个dependency是后面Servlet需要的依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<build>
<!-- 这里是关于maven项目构建要用的东西,可以没有-->
</build>
</project>
maven由于它的约定大于配置,我们之后可能会遇到我们写的配置文件,无法被导出或者生效的问题,可以通过添加resource标签解决。(这个目前用不到,留下记录,大概在MyRedis会用到)
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>