JavaWeb
java Web
前端–>Mysql
IDEA版本2020.1.2
1.基本概念
1.1前言
web开发:
- web:网页的意思
- 静态web
- html、css
- 提供给所有人看的数据始终不会发生变化!
- 动态web
- 提供给所有人看的数据会发生变化!(每个人在不同的时间、不同的地点,看到的信息各不相同!)
- 淘宝,几乎所有的网站;
- 技术栈:Servlet/JSP、ASP、PHP
- 静态web
在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
-
*.htm、.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
<h1>
<h1><h1>
<h1>
<h1>
<%
Java代码
%>
<h1>
<h1>
<h1><h1>
<h1>
PHP:
- PHP开发速度很快,功能很强大,跨平台,代码简单(70%,WP)
- 无法承载大访问量的情况(有局限);
JSP/Servlet:
B/S:浏览器和服务器
C/S:客户端和服务器
- sun主推的B/S架构
- 基于java语言的(所有的大公司,或者一些开源的组件,都是用java写的)
- 可以承载三高问题(高并发、高可用、高性能)
- 语法想ASP,ASP–>JSP,加强市场强度
…
2.2、Web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些相应信息;
IIS:
微软的;ASP…,Windows自带的
Tomcat:
面向百度编程
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为比较流行的Web 应用服务器。
**Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。**对于一个初学者来说,他是最佳选择。
(可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。)
Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。
…
工作3-5年后,可以尝试手写Tomcat服务器;
下载tomcat:
- 安装 or 解压
- 了解配置文件及目录结构
- 这个东西的作用
3、Tomcat
3.1、安装Tomcat
Tomcat官方链接:https://tomcat.apache.org/
下载:
Tomcat安装包
Tomcat压缩包
3.2、Tomcat启动和配置
- 各文件夹的功能与作用:
- 启动,关闭Tomcat
-
打开下载解压的apache-tomcat-9.0.46
-
进入bin目录
-
找到startup.bat开启服务器,找到shutdown.bat关闭服务器
- 网站访问 http://localhost:8080/
可能遇到的问题:
- Java环境变量没有配置
- 闪退问题:需要配置兼容性
- 乱码问题:配置文件中设置
3.3、配置
server.xml文件:服务器的核心配置文件
-
可以配置启动的端口号:
- tomcat默认端口号:8080
- mysql默认端口号:3306
- http默认端口号:80
- https默认端口号:443
-
可以配置主机的名称:
- 默认的主机名为:localhost–>127.0.0.1
- 默认网站应用存放的位置为:webapps
高难度面试题:
请你谈谈网站是如何进行访问的!
- 输入一个域名+enter
- 检查本机的:C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名的映射
-
有:直接返回对应的ip的地址,这个地址中,有我们需要访问的web程序,可以直接访问
-
没有:去DNS服务器上找(全世界的域名都在这里管理),找到的话就返回,找不到就返回找不到
-
- 可以配置一下环境变量(可选性)
3.4、发布一个web网站
不会就先模仿
- 将自己写的网站,放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了
网站应该有的结构:
--webapps:Tomcat服务器的web目录
--Root
--yangqi:网站的目录名
--WEB-INF
--classes:java程序
--lib:web应用所依赖而jar包
--web.xml:网站配置文件
--index.html 默认的首页
--static
--css
--style.css
--js
--img
-...
4、HTTP
4.1、什么是Http
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
- 文本:html,字符串,…
- 超文本:图片、音乐、视频、定位、地图…
- http默认端口号:80
Https:s代表安全的
- 默认端口号:443
4.2、两个时代
- http1.0
- HTTP/1.0:客户端可以与web服务器连接,之后只能获得一个web资源,断开连接
- http2.0
- HTTP/1.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: 36.152.44.95:443
Accept: text/htmlapplication/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9 语言
Cache-Control: max-age=0
Connection: keep-alive
1、请求行
- 请求行中的请求方式:GET
- 请求方式: GET,POST,HEAD,DELEFE,PUT,TRACT…
- get:一次请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但是高效
- post:一次请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但是不高效
2、消息头
Accept: 告诉浏览器,它所支持的数据类型
Accept-Encoding: 支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language: 告诉浏览器,它的语言环境
Cache-Control: 缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持连接
HOST:主机......
4.4、Http响应
- 服务器 —响应(Response)—> 客户端
百度:
Cache-Control: private 缓存控制
Connection: keep-alive 连接
Content-Encoding: gzip 编码
Content-Type: text/html;charset=utf-8 类型
1、响应体
Accept: 告诉浏览器,它所支持的数据类型
Accept-Encoding: 支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language: 告诉浏览器,它的语言环境
Cache-Control: 缓存控制
Connection: 告诉浏览器,请求完成是断开还是保持连接
HOST:主机......
Refresh:告诉客户端,多久刷新一次
Location:让网页重新定位;
2、响应状态码(重点)
200: 请求响应成功
3×:请求重定向
- 重定向:你重新到我给你的新位置去;
4××: 找不到资源
- 资源不存在
5××: 服务器代码错误 500 502:网关错误
面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,都经历了什么?
5、Maven
启动Tomcat,进入网站链接:http://localhost:8080/examples/servlets/,代码案例
为什么要学习这个技术?
- 在javaweb开发中,需要使用大量的jar包,我们需要手动去导入。
- 如何能够让一个东西自动帮我们导入和配置这个jar包。
由此,Maven诞生了!
5.1、Maven项目架构管理工具
我们目前用来就是方便导入jar包的!
Maven的核心思想:约定大于配置
- 有约束,不要去违反。
Maven会规定你如何去编写我们的Java代码,必须要按照这个规范来。
5.2、下载安装Maven
官网:https://maven.apache.org/
下载完成后解压即可
5.3、配置环境变量
在我们的系统环境变量中
配置如下配置:
- M2_HOME maven目录下的bin目录:D:\Maven\apache-maven-3.6.1\bin
- MAVEN_HOME maven目录:D:\Maven\apache-maven-3.6.1
- path目录中新建配置:%MAVEN_HOME%\bin
- 打开命令窗口输入mvn -version测试配置是否完成。
5.4、阿里云镜像
修改镜像:在maven的conf文件夹下的settings.xml中进行配置
- 镜像: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>
5.5、修改本地仓库
本地的仓库,远程仓库
修改仓库:在maven的conf文件夹下的settings.xml中进行配置
**建立本地仓库:**localRepository
<localRepository>D:\Maven\apache-maven-3.6.1\maven-repo</localRepository>
5.6、在Idea中使用Maven
-
打开IDEA
-
创建一个Maven项目
-
等待项目初始化完毕
出现BUILD SUCCESS 下载成功
-
观察maven仓库中多了什么
-
IDEA中的Maven设置
IDEA项目创建成功后,看一眼Maven的配置(防止IDEA默认将本地仓库等换成Idea自己的)
- 到这里,Maven在IDEA中的配置和使用就OK了!
5.7、创建一个普通的Maven项目
-
新建项目
-
以下步骤和上次一样。
最终得到的项目结构:
之前的项目结构:
5.8、标记文件夹功能
方法一:
方法二:
5.9、在IDEA中配置Tomcat
第一步:
第二步:
第三步:
解决警告问题:
为什么会有这个问题:我们访问一个网站,需要指定一个文件夹的名字;
必须要有的配置:
-
不写:默认访问路径为localhost:8080
-
写了一个/yang:默认访问路径为localhost:8080/yang
这个过程叫做:虚拟路径映射
最后:启动Tomcat
关于Tomcat启动乱码问题:
-
在tomcat Server中设置 VM options , 值为 -Dfile.encoding=UTF-8 ,(显然没生效)
-
在setting中的 File encodings 中设置编码格式,发现这是设置页面编码格式的,(显然也没生效)
-
在java Complier中设置Additional command line parameters的值,-encoding=UTF-8,(显然还没生效)
-
在bin中设置idea.exe.vmoptions和idea64.exe.vmoptions中的参数,同时增加-Dfile.encoding=UTF-8,据说有些人保存后重启就可以了,(显然我这边还是没生效)
-
在tomcat \bin目录下的catalina.bat文件中加入 -Dfile.encoding=UTF-8,(显然还不生效)
-
在 tomcat / conf 目录下,设置 logging.properties ,增加参数 java.util.logging.ConsoleHandler.encoding = GBK,重启后终于可以了
5.10、pom文件
pom.xml文件是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>com.yang</groupId>
<artifactId>javaweb-01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--package:项目的打包方式
jar:java应用
war:Javaweb应用
-->
<packaging>war</packaging>
<!--配置-->
<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>
<!--具体的jar包配置文件-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
<!--项目构建用的东西-->
<build>
<finalName>javaweb-01-maven</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>
创建一个空项目的Maven,自己配置Maven的pom.xml文件
Maven由于约定大于配置,我们之后可能遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:
build中配置resources,来防止我们资源导出失败的问题
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
</build>
5.11、Idea操作
5.12、解决遇到的问题
-
Maven:无法导入
- 解决方法:降级maven
-
Tomcat闪退
- jdk版本/系统环境配置
-
IDEA每次都要重复配置Maven
- 在IDEA中的全局默认配置中去配置
-
Maven项目中Tomcat无法配置
-
maven默认web项目中的web.xml版本问题
-
替换为webapp4.0版本,和Tomcat的webapps/ROOT/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>
-
5.13、Maven仓库的使用
Maven仓库网站链接:https://mvnrepository.com/
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<!--作用域 ,删掉在所有情况下都可以使用-->
<scope>provided</scope>
</dependency>
6、Servlet
6.1、Servlet简介
- Servlet就是Sun公司用于开发动态Web的一门技术
- Sun公司在这些API中提供了一个接口叫做:Servlet。如果你想开发一个Servlet程序,只需要完成两个小步骤
- 编写一个类实现Servlet接口
- 把开发好的Java类部署到web服务器中。
把实现了Servlet接口的Java程序叫做:Servlet程序
6.2、HelloServlet
Servlet接口在Sun有两个默认的实现类:HttpServlet,GenericServlet
-
构建一个空的Maven项目,删掉src目录,以后我们的学习就在这项目里面建立moudle,这个空的工程就是Maven的主工程
-
在主工程中导入依赖,其他的子工程就会有相应的依赖
-
关于Maven父子工程的理解:
父项目中会有Moudle
<modules> <module>servlet-01</module> </modules>
子项目中会有Parent
<parent> <artifactId>javaweb-02-Servlet</artifactId> <groupId>com.yang</groupId> <version>1.0-SNAPSHOT</version> </parent>
父项目中的jar包子项目可以直接使用
son extends father
-
Maven环境优化
- 修改web.xml为最新的
- 将Maven结构搭建完整
-
编写一个Servlet程序
- 编写一个普通类HelloServlet
- 实现Servlet接口,这里我们直接继承HttpServlet实现类
public class HelloServlet extends HttpServlet { //由于get或post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样。 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //ServletOutputStream outputStream = resp.getOutputStream(); PrintWriter writer = resp.getWriter();//响应流 writer.print("Hello Servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
编写Servlet的映射
为什么需要映射:我们写的是Java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径。
在web.xml中进行web应用的核心编写
<!--注册Servlet--> <servlet> <servlet-name>Hello Servlet</servlet-name> <servlet-class>com.yang.Servlet.HelloServlet</servlet-class> </servlet> <!--Servlet的请求路径--> <servlet-mapping> <servlet-name>Hello Servlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
配置Tomcat
注意:配置项目发布的路径。
-
启动测试
6.3、Servlet原理
Servlet是由web服务器调用,web服务器在收到浏览器请求之后,会:
6.4、Mapping问题
HelloServlet类处理请求,发送响应,代码的编写
public class HelloServlet extends HttpServlet {
//由于get或post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();//响应流
writer.print("Hello Servlet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
-
一个Servlet请求可以指定一个映射路径
<!--注册Servlet--> <servlet> <servlet-name>Hello Servlet</servlet-name> <servlet-class>com.yang.Servlet.HelloServlet</servlet-class> </servlet> <!--Servlet的请求路径--> <!--一个Servlet请求指定一个映射路径--> <servlet-mapping> <servlet-name>Hello Servlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
一个Servlet请求可以指定多个映射路径
<servlet-mapping> <servlet-name>Hello Servlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Hello Servlet</servlet-name> <url-pattern>/hello2</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Hello Servlet</servlet-name> <url-pattern>/hello3</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Hello Servlet</servlet-name> <url-pattern>/hello4</url-pattern>