JavaWeb
Java Web
1.基本概念
1.1、前言
web开发:
- web,网页的意思,https://www,baidu.com
- 静态web
a.html,css
b.提供给所有人看的数据始终不会发生变化!
https://www,baidu.com - 动态web
a.淘宝,几乎所有的网站;
b.提供给所有人看的数据始终会发生变化,每个人在不同的时期,不同的地点看到的信息各不相同!
c.技术栈:Servlet/JSP,ASP,PHP - 在Java中,动态web资源开发的技术统称为JavaWeb;
1.2、web应用程序
web应用程序:可以提供浏览器访问的程序;
- a.html、b.html…多个web资源,这些web资源可以被外界访问
- 你们能访问到的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上。
- URL
- 这个统一的web资源会被放在同一个文件夹下,web应用程序---->Tomcat:服务器
- 一个web应由多部分组成(静态web,动态web)
a.html,css,js
b.jsp,servlet
c.Java程序
d.jar包
e.配置文件(properties)
web应用程序编写完毕后,若想提供给外界访问:需要一个服务器来统一管理;
1.3、静态web
- .htm,.html;这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以直接进行读取。
- 静态web存在的缺点
a.web页面无法动态更新,所有用户看到的都是同一个页面(轮播图,点击特效:伪动态、JavaScript[实际开发中,他用的最多]、VBScript)
b.他无法和数据库交互(数据无法持久化,用户无法交互)
1.4、动态web
页面会动态展示,“Web的页面展示的效果因人而异”;
缺点:
- 加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布;(停机维护)
优点:
- Web页面可以动态更新,所有用户看到都不是同一个页面
- 它可以与数据库交互(数据持久化:注册,商品信息,用户信息)
2、web服务器
2.1、技术讲解
ASP:
- 微软:国内最早流行的是ASP;
- 在HTML中嵌入了VB的脚本,ASP+COM;
- 在ASP开发中,基本一个页面几千行的业务逻辑代码,页面极其混乱
- 维护成本高
- C#
- IIS
php
- PHP开发速度很快,功能很强大,跨平台,代码简单
- 无法承载大访问量的情况(局限性)
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 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。
- Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。
- 诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为9.0.41。
- 下载tomcat:
1.安装or解压
2.了解配置文件以及目录结构
3.这个东西的作用
3、Tomcat
3.1、安装Tomcat
tomcat官网:http://tomcat.apache.org/
3.2、Tomcat启动和配置
文件夹的作用:
启动、关闭Tomcat:
双击bin目录下的startup.bat
双击bin目录下的shutdown.bat
访问:http://localhost:8080/
可能遇到的问题:
1.Java环境变量的问题
2.闪退问题:需要配置兼容性
3.乱码问题:配置文件中设置
3.3.、配置
可以配置主机的端口号
- tomcat的默认端口号:8080
- mysql的默认端口号:3306
- http:80
- https:443
可以配置主机的名称
- 默认的主机名为:localhost->127.0.0.1
- 默认网站应用存放的位置为:webapps
高难度面试题
请你谈谈网站时如何访问的:
- 输入一个域名
- 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射;有的话直接返回对应的IP地址,在这个地址中,由我们需要访问的web程序,可以直接访问;没有的话去DNS服务器找,找到的话就返回,找不到就返回找不到。
- 可以配置一下环境变量(可选性)
3.4、发布一个web网站
网站应该有的结构
--webapps :Tomcat服务器的web目录
-ROOT
-zhangstudy :网站的目录名
- WEB-INF
-classes:java程序
-lib:web应用所依赖的jar包
-web.xml:网站配置文件
- index.html 默认的首页
- static
-css
-style.css
-js
-img
-... ...
不会就先模仿:
(1)进入webapps目录下,复制ROOT文件夹改为自己的项目名
(2)进入自己建的文件夹(这里是zhangstudy),里面除了WEB-INF文件夹全部删掉。然后打开WEB-INF下的web.xml进行修改,如图:
(3)在WEB-INF同级创建index.html(内容自己写)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
欢迎欢迎!!!!!!
</body>
</html>
(4)然后启动tomcat,浏览器通过http://localhost:8080/zhangstudy/访问刚刚的项目
4.HTTP
4.1、什么是HTTP
- 超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。
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 状态码
Remote(远程) Address: 110.242.68.3: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
- 请求行:请求行中的请求方式:GET、POST、HEAD、DELETE、TRACT…
**get:**请求能够携带的参数比较小,大小有限制,会在浏览器的URL栏显示数据内容,不安全,但高效。
**post:**请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL栏显示数据内容,安全,但不高效。 - 消息头
Accept: 告诉浏览器它所支持的数据类型
Accept-Encoding: 支持那种编码格式 GBK、UTF-8、GB2313、ISO8859
Accept-Language: 告诉浏览器,他的语言环境
Cache-Control: 缓存控制
Connection: 告诉浏览器,是断开还是保持连接
HOST: 主机......
4.4、Http响应
- 服务器------响应------客户端
百度:
Cache-Control: private 缓存控制
Connection: keep-alive 连接
Content-Encoding: gzip 编码
Content-Type: text/html;charset=utf-8 类型
- 响应体
Accept: 告诉浏览器它所支持的数据类型
Accept-Encoding: 支持那种编码格式 GBK、UTF-8、GB2313、ISO8859
Accept-Language: 告诉浏览器,他的语言环境
Cache-Control: 缓存控制
Connection: 告诉浏览器,是断开还是保持连接
HOST: 主机......
Refrush: 告诉客户端,多久刷新一次
Location: 让网页重新定位
- 响应状态码
200:请求成功 200
3**:请求重定向(你重新得到我给你的新位置去)
4**:找不到资源 404
5XX:服务器代码错误 500 502:网关错误
常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
5、Maven
我为什么学习这个技术?
- 在javaweb开发中,需要使用大量的jar包,我们手动去导入
- 如何能够让一个东西自动帮我们导入和配置这个jar包
由此,Maven诞生了!
5.1、Maven项目架构管理工具
我们目前用来就是方便导入jar包的!
Maven的核心思想:约定大于配置
- 有约束,不要去违反。Maven回规定好你该如何去编写我们的Java代码,必须按照这个规范来;
5.2、下载安装Maven
官网:http://maven.apache.org/
下载完成后,解压即可;
文件夹内容与tomcat类似
5.3、配置环境变量
在我们的系统环境变量中配置如下配置:
- M2_HOME maven目录下的bin目录
- MAVEN_HOME maven目录
- 在系统的path中配置MAVEN——HOME%\bin
5.4、阿里云镜像
- 镜像:mirrors(作用:加速我们的下载)
- 国内建议使用阿里云的镜像(将以下代码放入settings.xml中的mirrors中)
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
</mirror>
5.5、本地仓库
在本地的仓库,远程仓库;
建立一个仓库localRepository
在解压的bin目录同级创建maven-repo(新建是空的后面用的时候要下)文件夹然后在配置文件内的localRepository中加入以下内容,将原内容注释,并将原路径中的repo内容复制到该文件夹下。
<localRepository>D:\Maven\apache-maven-3.6.3</localRepository>
5.6、在IDEA中使用Maven
- 启动IDEA
- 创建一个Maven Web项目
- 然后点finish
- 等待项目初始化结束,上面创建的本地仓库的maven-repo中会下载jar包
- 观察maven仓库中多了什么东西?
- IDEA中的Maven设置
到这里,Maven在IDEA中的配置和使用就OK了!
在main目录下新建java和resources文件夹
5.7、创建一个普通的Maven项目
后面的步骤填完一直点就可以。
5.8、标记文件夹功能
将java目录表记为源码目录
将resources标记为资源目录
5.9在IDEA中配置Tomcat
将项目加入到Tomcat中:
然后点击OK该项目处的tomcat就亮起来了。
启动成功!
5.10、pom文件
pom.xml文件是Maven的核心配置文件。
pom详解:
<?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>org.zhang</groupId>
<artifactId>javaweb-01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--Package: 项目的打包方式
jar: java应用
war: JavaWeb应用
-->
<packaging>war</packaging>
<name>javaweb-01-maven 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>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的高级之处在于他可以帮你导入这个jar包所依赖的其他jar包;Maven由于他约定大于配置,我们之后可能遇到我们写的配置文件,无法被导出或者生效的问题
解决方案:
<!--在build中配置resources,来防止我们资源导出失败的问题-->
<!--用这个配置-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
<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>
5.13、解决遇到的问题
1.maven 3.6.2
报错:Unable to import maven project: See logs for details
解决方案:换一个低版本的Maven
2.Tomcat闪退
3.IDEA中每次都要重复配置Maven
在IDEA中的全局默认配置中去配置
4.Maven项目中Tomcat无法配置
6.Maven仓库的使用
地址:https://mvnrepository.com/
以Servlet-api为例:
7.创建简单Servlet+jsp项目
1.引入依赖:
<!-- 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>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
2.创建HelloServlet:(在java目录下创建com.zhang.servlet包)
package com.zhang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//响应的类型:html
resp.setContentType("text/html");
//获取响应的输出流
PrintWriter out=resp.getWriter();
out.println("hello,world!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
3.webapp/WEB-INF/web.xml文件:
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<!--web.xml中是配置web的核心应用-->
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!--注册Servlet-->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.zhang.servlet.HelloServlet</servlet-class>
</servlet>
<!--一个servlet对应一个映射-->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<!--请求路径-->
<url-pattern>/zhang</url-pattern>
</servlet-mapping>
</web-app>
4.修改/启动tomcat:
如果想输出中文出现乱码:HelloServlet.class改为:
package com.zhang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//响应的类型:html
resp.setContentType("text/html");
//设置编码
resp.setCharacterEncoding("utf-8");
//获取响应的输出流
PrintWriter out=resp.getWriter();
out.println("你好!");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}