基本概念
前言
web开发:
- 静态web
- html、css
- 提供给所有人看的数据始终不会发生变化。
- 动态web
- 淘宝、几乎是所有的网站
- 提供给所有人看的数据始终会发生变化,每个人在不同的时间、地点,看到的信息各不相同。
- 技术栈:Servlet/JSP、ASP、PHP
在java中,动态web资源开发的技术统称为javaweb。
web应用程序
web应用程序:可以提供浏览器访问的程序;
- a.html、…多个web资源,这些web资源可以被外界访问,对外界提供服务。
- 能访问到的任何一个页面或者资源,都存在于这个世界的某个角落的计算机上。(通过URL找到)
- 这个统一的web资源会被放在同一个文件夹下:web应用程序–>Tomcat:服务器
- 一个web应用由多个部分组成(静态、动态web)
- html、css、js
- jsp、servlet
- java程序
- jar包
- 配置文件(Properties)
web应用程序编写完毕后,若想提供给外界访问,需要一个服务器来统一管理;
静态web
-
.htm、.html这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以通过网络直接进行读取。
-
静态web存在的缺点:
- web页面无法动态更新,所有用户看到的都是同一个页面
- 比如:轮播图、点击特效:都属于伪动态(JavaScript、VBScript)
- 它无法和数据库交互(数据无法持久化,用户无法交互)
- web页面无法动态更新,所有用户看到的都是同一个页面
动态web
- 页面会动态展示:“web的页面展示效果因人而异”
- 缺点:
- 加入服务器德尔动态web资源出现了错误,我们需要重新编写我们的后台程序,并重新发布;(停机维护)
- 优点:
- web页面可以动态更新,所有用户看到都不是同一个页面
- 它可以与数据库交互(数据持久化:注册,商品信息,用户信息…)
Web服务器
技术讲解
ASP
- 微软:国内最早流行的就是ASP
- 在HTML中嵌入了VB的脚本,ASP+COM
- 在ASP开发中,基本一个页面就有几千行业务代码,页面及其混乱,因此维护成本高
- 使用C#开发
- IIS服务器
PHP
- PHP开发速度很快,功能很强大,跨平台,代码很简单(市面70%网站使用)
- 无法承载大访问量的情况(局限性)
JSP/Servlet
B/S:浏览器和服务器
C/S:客户端和服务器
- sun公司主推的B/S架构
- 基于java语言的(所有的大公司,或者一些开源的组件,都是用java写的)
- 可以承载三高(高并发、高可用、高性能)问题带来的影响;
- 语法像ASP
web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息;
IIS
微软的;ASP…,Windows中自带的
Tomcat
下载Tomcat:
- 安装or解压
- 了解配置文件及目录结构
- 这个东西的作用
Tomcat
Tomcat安装
官网:点此进入
Tomcat启动和配置
文件夹作用:
启动、关闭Tomcat:
启动完成:
关闭:
- 直接关闭黑窗口
可能遇到的问题:
- java环境变量没有配置
- 闪退问题:需要配置兼容性
- 乱码问题:配置文件中设置
- Tomcat 10可能存在闪退问题,Tomcat 9可以使用
配置
可以在这里对端口号、网站信息进行更改
参考网站:
- 用户用浏览器访问一个网站的时候背后的过程与步骤是怎样的? :点此进入
发布一个web网站
- 将自己写的网站,放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了。
网站应该有的结构:
HTTP
什么是HTTP
HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。
- 文本:html,字符串,~
- 超文本:图片,音乐,视频,定位,地图~
- 端口号:80
HTTPS:
- 端口号:443
两个时代
- http1.0
- http/1.0:客户端可以与web服务器连接后,只能获得一个web资源,获得资源后会断开连接
- http2.0
- http/1.1:客户端可以与web服务器连接后,可以获得多个web资源。
HTTP请求
- 客户端–发请求–服务器
请求行
- 请求行中的请求方式:GET
- 请求方式:Get、Post、HEAD,DELETE,PUT,TRACT
- get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
- post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效
消息头
HTTP响应
- 服务器–响应–客户端
常见面试题
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
Maven
Maven项目架构管理工具
下载安装Maven
下载后解压:
配置环境变量
安装成功:
阿里云镜像
本地仓库
在idea中使用Maven
- 创建maven模块
- 等待项目初始化完毕
- idea中的maven设置
idea项目创建成功后,注意maven的配置
创建一个普通的maven项目
不使用idea中的maven模板:
标记文件夹功能
方法一:
方法二:
在idea中配置Tomcat
使用本地的Tomcat
解决警告问题:
必须要的配置:为什么会有这个问题:我们访问一个网站,需要指定一个文件夹名字
虚拟路径映射
自己的idea:
“kuang”这个名字默认指向的是webapp,由于他是一个项目没有webapp里面那么多项目,所以我们要配置一个虚拟路径映射,使通过…/kuang可以调用到webapp里面的东西。
为什么要设置虚拟路径映射
在个人的项目中,遇到一个需求,需要实现文件在线查看,也就是需要给前端返回文件的相对路径。但是由于文件很多而且很大,将文件存储在项目的某个文件夹下并不是很好的方案。思来想去,还是觉得配置一个虚拟路径比较好。
接下来,我们看一下Idea如何配置虚拟路径映射。其实非常简单,在idea中,点击我们的服务器,然后选择 Edit Configurations,然后点击deployment,选择“+”号,来添加一个虚拟路径映射,然后选择我们要映射的目录,我们这里选择“c:\test”,在右侧的Application context中输入我们自定义的路径即可。
参考网站:
- Idea配置tomcat映射虚拟路径(文件上传路径):点此进入
pom文件
pom.xml是Maven的核心配置文件
导入配置文件
maven公共仓库地址:点此进入
Maven的高级之处在于,他会帮你导入这个jar包所依赖的其他jar包
maven由于它的约定大于配置,我们之后可以能遇到我们写的配置文件,无法导出或者无法生效的问题。
解决方案:
idea操作
目录树的结果:
解决遇到的问题
- Maven 发现导入不了东西。出现兼容性问题,是因为jdk版本的原因(建议换成jdk8),或者降低Maven版本
- Tomcat闪退
- idea中每次都要重复配置maven
- maven项目中Tomcat无法配置
- maven默认web项目中的web.xml版本问题
默认的web.xml版本太老,考虑到兼容性问题,建议和Tomcat中的web.xml版本相同(替换为webapp4.0版本和Tomcat一致)。
Maven仓库使用
在maven中都没有找到有效的依赖,由于Tomcat也可以启动Servlet,所以Tomcat中肯定有支持的jar包
所以可以尝试在maven仓库中查找这两项
参考网站:
- IDEA Maven 报 Unable to import maven project解决方案:点此进入
这个是新建的Servlet类看到所需的包:
如果导入不了,通过输入全名,导入依赖:
视频位置:
javaweb01:28:18分钟
package com.kuang.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends javax.servlet.http.HttpServlet{
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
//响应的类型:html
response.setContentType("text/html");
//设置编码类型
response.setCharacterEncoding("UTF-8");
//获取响应的输出流
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>Hello World!</title>");
out.println("</head>");
out.println("<body>");
// out.println("<h1>Hello World!</h1>");
out.println("<h1>你好!</h1>");//设置过编码类型之后可以输出“你好”,如果不设置,输出“??”
out.println("</body>");
out.println("</html>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
参考网站:
关于getWriter()和getOutputStream的理解
HttpServletResponse的实例对象在获取输出流时有两种方式,即getWriter()和getOutputStream(),但是这两种方式有什么联系和区别呢。
①PrintWriter out=response.getWriter()
out对象用于处理字符流数据。
②ServletOutputStream os=response.getOutputStream();
os用于输出字符流数据或者二进制的字节流数据都可以。
Servlet
Servlet简介
HelloServlet
Servlet接口Sun公司有两个默认的实现类:HttpServlet、
- 构建一个普通的Maven项目,以后我们的学习就在这个项目里面建立Module。
-
Maven环境优化
- 修改web.xml为最新版本并点击右边栏Maven,刷新子项目的pom.xml
- 将maven的结构搭建完整(补充java、resources包并设置目录结构)
-
编写一个Servlet
-
编写Servlet的映射
-
配置Tomcat
- 启动测试
Servlet原理
Servlet是由Web服务器调用,web服务器在收到浏览器请求之后。会:
Mapping问题
加路径错误演示:
首先进入默认的Index页面:
输入 任何.qinjiang进入:
- 运行后:http://localhost:8080/s1,由于通配符/*原因会显示自己写的404。
- 进入http://localhost:8080/s1/hello,将会进入HelloServlet类,显示Hello,Servlet。因为指定的路径优先级最高。
- 进入http://localhost:8080/s1/hello999,将会显示404。因为通配符,并且没有这个页面的原因。
步骤:
ServletContext
web容器在启动的时候,它会为每一个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用。
共享数据
在这个Servlet中保存的数据,可以在另一个Servlet中拿到:
放置数据:
读取数据:
配置xml:
测试访问结果:
错误演示:
补充:
获取初始化参数
请求转发
转发gp里面的内容到sd4:
补充:
读取资源文件
注意:java目录的properties文件可能出现无法读取的问题:
项目中文件位置:
读取资源文件里面信息(target文件里面的也可以读取到):
访问测试结果:
HttpServletResponse
类中方法简单分类
常用getwriter()输出中文,但是会导致字符串的损坏与丢失
常用getoutputstream()输出流
部分:
常见应用
注意:启动Tomcat时,留意当前加载的模块是否是当前模块。
不是中文文件名:
中文文件名:
验证码功能
实现重定向
输入red,跳转到img页面:
案例-用户登录:
前端页面:
前端页面测试(可以正常跳转页面):
运行截图:
HttpServletRequest
获取前端传递的参数,请求转发
注意设置中文格式:
如果写了 / 会出现404错误,显示找不到/hello/hello/success.jsp(但是需要跳转的页面是/hello/success.jsp,/ 会被再识别一遍Tomcat中配置的路径)。
注意:
多项目时需要注意Tomcat配置的那个项目以及路径:
后台接收中文乱码问题:
Cookie、Session
Cookie 会话
参考网站:
保存会话的两种技术
配置Tomcat(发布):
浏览器关闭之后会话结束。
String类型转化成Date类型:
- 获取cookie中的值类型为字符串,我们想让他输出为一个date。通过Long.parseLong,变成长整型(时间戳),然后new一个date,将时间戳变成date对象,然后输出的就是date对象
- System.currentTimeMillis() 返回的是一个毫秒数转成了字符 value中,然后解析构建date对象
- 个人理解:由于System.currentTimeMillis()返回值类型为long,并且返回当前时间,所以需要输出对象为Date对象。因为Long 类是基本类型 long 的包装类,所以使用Java.long.Long.parseLong()方法(简单来说:是将一个字符串转换成数字的方法)
Cookie
第一次走c1,正常显示上次登录时间(在c1的Cookie有效期内)。
第二次走c2,结果如下图所示:已被清理。
第三次走c1,不显示上次登录时间
第二次:
第三次:
然后再刷新c1,同样会刷新上次登录时间。之后走c2同样会删除原来的登录记录。
Session(重点)
Session存储用户信息:
注销Session:
手动注销:
不同浏览器有不同的SessionId,同一个浏览器的SessionId相同。
然后走s3,注销Session。
之后走s2,显示空指针异常
再走s1,SessionId将刷新。
会话自动过期-自动注销(web.xml配置):
JSP
什么是JSP
JSP原理
在Maven中,手动导入jar包:
2. 对爆红的没有导入的类名,Alt+insert:
3.
JSP基础语法
JSP的注释,不会在客户端显示,HTML就会!
补充:构建新版xml:
不勾选,直接next
之后点击右下角自动导入后:
JSP指令
页面信息:
xml配置:
两种方式的区别:
下面的方法:
补充:
- 由于<%@include%>本质上是将header.jsp和footer.jsp合二为一,所以如果先在这两个页面中给i赋过值,再到jsp3页面赋值将会报栈错误(重名了)。
- 但是如果使用< jsp:include page>(jsp标签)就不会出现这个错误,因为它的本质上还是三个页面,所以在header中定义过i之后,在其他页面同样可以定义。
补充:
web-inf:客户端无法访问
9大内置对象
page:不用了解
JVM中的双亲委派机制
从底层到高层(作用域):page–>request–>session–>application
作用域测试:
指定作用域:
JSP标签、JSTL标签、EL表达式
JSP标签
JSTL标签
c:if
运行截图:
错误解决:
idea只使用Tomcat的work工件,所以要将idea中的包手动导入Tomcat中:
c:choose c:when
c:forEach
JavaBean
MVC三层架构
什么是MVC:Model、View、Controller(模型、视图、控制器)
早些年
MVC三层架构
Filter 过滤器(重点)
过滤器和Servlet一模一样,只不过实现的是过滤器接口。
Filter开发步骤:
- 导包
- 编写过滤器
-
导包不要错
-
实现Filter接口,重写对应的方法即可
-
在web.xml中配置Filter
运行截图:
-
监听器
实现一个监听器的接口;(有N种)
- 编写一个监听器
-
实现监听器的接口
-
web.xml中注册监听器
-
看情况是否使用
-
运行结果:
Tomcat的问题:第一次运行可能有多个session(Tomcat在启动时,会进行连接,但是可能失败-比如:本例子,前两次失败了,但是Session没有被销毁所有会有3人在线。)重新发布一下项目
重新发布一下就可以了:
同一个电脑,两个不同浏览器(客户端)进行访问:(可以通过开放电脑ip,让其他电脑进行访问。)
过滤器、监听器常见应用
监听器:GUI编程中经常使用;
通过适配器模式,重写它的子类:
补充:
System.exit();
System.exit(status):
status 为 0:表示正常退出程序,也就是结束当前正在运行中的java虚拟机。
status 为 1 或 -1 或 任何其他非零值 :表示非正常退出当前程序。
注意:此方法不会返回任何值。
用户登录之后才能进入主页,用户注销后就不能进入主页了
使用创建常量类来存储需要用到的常量,在需要对用到的大量常量进行修改的时候方便修改。
运行结果:
-
输入错误用户名,跳转到错误页面
-
点击返回登录页面,输入正确用户名,进入主页
-
点击注销,返回登录页面,输入主页网址,不能进入,跳转到错误页面(过滤器实现)
JDBC
什么是JDBC:Java连接数据库
idea中连接数据库:
idea右侧没有的话:
选择数据库:
Statement是普通的(不安全的),PreparedStatement是预编译的对象(安全的)。
预编译SQL:
事务
JUnit单元测试
依赖:
加过@Test注释后,不用在走main方法就可以对方法进行测试。
@Test注解只有在方法上有效,只要加了这个注解的方法,就可以做直接运行。
如果有错误(int i=1/0),将停止并不更新数据库内容。没有错误将更新数据库内容。
补充:
装箱与拆箱
JDBC | 第四章:事务提交与回滚