知行合一
1 Web开发
- 静态web:html,css
- 动态web:Servlet/JSP、ASP、PHP
2 Web应用程序
web应用程序编写完毕后,若想提供给外界访问,需要一个服务器统一管理
2.1 组成部分
html、css、js
jsp、servlet
Java程序
jar包
配置文件(Properties)
Web服务器
静态Web
动态Web
数据库
2.2 Web服务器
服务器用来处理用户的请求和响应信息
Request : 请求
Response : 响应
IIS
微软的:ASP
- 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服务器
2.3 动态静态WEB
- ASP
微软,国内最早,在HTML嵌入VB脚本,维护成本高,页面乱,几千行代码,C#,IIS
- PHP
PHP开发速度快,跨平台,代码简单(70%,WP),无法承载访问量大的情况
- JSP/Servlet
B/S《sun公司主推》,C/S,基于java,可以承载三高问问题带来的影响:高并发,高可用,高性能,语法像ASP
动态Web缺点与优点
加入服务器的web出现错误,重新编写后台程序,重新发布
停机维护
可以与数据库交互
可以动态更新,所有用户看到的不是同一个页面
静态Web的缺点
轮播图,点击特效:伪动态
JavaScript
VBScript
无法与数据库进行交互,数据无法持久化,用户无法交互
3. Tomacat
3.1 基本操作
- Tomcat
- 下载与安装其他博主
- 启动:startup.bat
- 关闭:shutdown.bat
- 访问:http://localhost:8080/
- 可能遇到的问题:
- java环境变量未配置
- 闪退:配置兼容性
- 乱码问题:配置文件
3.2 文件夹作用
- bin:启动,关闭的脚本文件
- conf:配置,核心:server.xml
- lib:依赖的jar包
- logs:日志
- webapps:发存放网站
3.3 配置
- conf / server.xml 可以配置启动的名称和端口号
1 | <Connector port="8080" protocol="HTTP/1.1" |
- 默认的主机名为:127.0.0.1/localhost
- 默认的网站存储位置:webapps
1 | <Host name="localhost" appBase="webapps" |
- 可以配置一下环境变量
3.3.1 默认端口号
- Tomcat :8080
- mysql:3306
- http:80
- https:443
3.3.2 面试题
谈谈一个网站如何运行
客户端:输入一个域名或者ip,
检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名的映射或ip;
有返回对应的IP,这个地址中有我们需要访问的Web程序,可以直接访问,没有,去DNS服务器,找到返回,没有报404
1 | 127.0.0.1 localhost |
3.4 发布一个Web网站
将自己写的网站,放到服务器(Tomcat)中指定的Web应用的文件夹(Webapps)下,就可以访问了
网站应该有的结构
1 | -- webapps : Tomcat服务的Web目录 |
4. HTTP
超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在[TCP]之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以[ASCII]形式给出;而消息内容则具有一个类似[MIME]的格式。这个简单模型是早期Web成功的有功之臣,因为它使开发和部署非常地直截了当。
4.1 基础
- 默认端口:80
- Https:443 更安全
4.1.1 两个时代
- http1.0
- HTTP/1.0:客户端与Web服务器连接后,只能获取一个Web资源,断开连接
- http2.0
- HTTP/1.1:客户端可以与Web服务器连接后,可以获取多个Web资源。
4.1.2 HTTP请求
- 客户端 – 发请求 – 服务器
- 请求通用:
1 | Request URL: https://www.baidu.com/ //请求地址 |
(1)请求行
- 请求行中的请求方式 : GET
- 请求方式:Get,Post,HEAD,DELETE,PUT,TRACT…
- Get:请求携带的参数比较少,大小限制,会显示数据内容,不安全,高效
- Post:请求携带的参数没有限制,大小不限制,不会显示数据内容,安全,不高效
(2)消息头
1 | Accept: |
4.1.3 HTTP响应
服务器 – 响应 – 客户端
响应头:
1 | Bdpagetype: 1 |
(1)响应体
1 | Accept: |
(2)响应状态码
200: 请求响应成功
3**:请求重定向
4**:找不到资源 404
5**:服务器代码错误 500 502网关错误
5. Maven
目前是管理Jar包自动导入和配置,对java代码有约束,不要违反
5.1 Maven项目架构管理工具
- 核心思想:约定大于配置
5.2 下载安装配置
可以使用镜像下载,下载后解压,所有环境都放入一个文件夹里面
配置环境变量
MAVEN_HOME maven的目录
M2_HOME maven目录下的bin的目录
Path配置 %MAVEN_HOME%\bin
1 | # 检查 |
- maven 安装目录的 conf/settings.xml
- 修改配置,阿里云镜像
- 官网
1 | <mirror> |
- 自己学习
1 | <mirror> |
- 如果想使用其它代理仓库,可在
节点中加入对应的仓库使用地址。以使用 spring 代理仓为例:
1 | <repository> |
- 本地仓库 远程仓库
1 | <localRepository>D:\install\apache-maven-3.8.3-bin\apache-maven-3.8.3\maven-repo</localRepository> |
5.3 IDEA中使用Maven注意点
- create from archetype 使用模板;可以不使用
- 选择Maven-archetype-webapp
- GroupId 组Id 一般用公司域名倒称com.xxy
- ArtifactId 项目名
- maven地址配置 seting
- 配置项目地址
- 加载包,出现build success,表示成功
- IDEA项目构建完成,看Maven配置,MavenHome要注意地址,可能会被改为默认的
- Maven junit版本报错 将版本改为4.12
- 标记新建文件夹 java 为 sources root,test为 testsources Root,resources为Resources Root
- Maven生命周期(lifecycle)命令
clean
validate
compile
test
package
verify
install
site
deploy
- Maven Plugins
- Maven Dependencies
- pom文件
1 |
|
- mavne约定大于配置,会帮我导入这个包所依赖的jar包,资源导出可能会失败或无法生效
1 | <!--在build中配置resources,来防止我们资源导出失败的问题--> |
- 注意:maven 3.6.2及以上 和jdk8不兼容
- Maven父子项目
- 父项目会有
1 | <modules> |
- 子项目会有
1 | <parent> |
- 父项目的东西子项目可以直接使用
1 | son extends parent |
5.4 IDEA中配置Tomcat注意点
我们访问一个网站,必须需要配置一个文件夹名字,因为名字映射的是一个文件
当点击+没有发现出现 artifacts 选项的时候 可以 File—setting–build,Execution,deployment—maven —-importing—选择import maven projects automatically–>apply–ok
Tomcat乱码
本质原因就一个:字节流解码为字符串时,使用了错误的字符集\(和编码所用字符集不一致)
解决方案:将conf\logging.properties文件修改
1 | java.util.logging.ConsoleHandler.encoding = GBK |
Maven中Tomcat无法配置
原因:Web项目中Web.xml版本问题
解决方案:替换为Tomcat里面的Web.xml
5.5 Maven 仓库的使用
- pom.xml
1 |
|
- HelloServlet.java
1 | package cn.xxy; |
- web.xml
1 |
|
6. Servelt
Sun在API提供了一个接口叫Servelt,动态web的一门技术
6.1 建立Servlet步骤
- 新建maven父子工程
- 新建一个note.md保存最新的web.xml
1 |
|
- 编写一个servlet类,继承HttpServlet,HttpServlet继承GenericServlet,GenericServlet实现Servlet接口
- doGet和doPost只是是实现的方式不同,可以相互调用
- 编写Servlet映射,Java程序想要浏览器访问需要一个连接Web服务器和一个浏览器能够解析的地址,所以我们需要注册Servlet和映射
1 | <!--web.xml 是我们的核心配置--> |
- 配置Tomcat,启动测试
6.2 Servlet原理
- 浏览器发送请求
- Web容器首次访问Servlet
- Web将请求的信息(请求头等等)给Servlet接口
- 调用Servlet接口的方法
1 | public void service(ServletRequest req, ServletResponse res) |
- 返回Servlet的响应信息
- Web容器读取响应的信息
- 返回浏览器
6.3 Mapping问题
- 一个Servlet映射可以指定一个、多个、通用、自定义、默认映射路径
1 | <!-- 注册servlet--> |
- 指定了固有的映射路径优先级最高,如果找不到就会走默认的映射路径
7. Servlet Context
Web容器在启动的时候,为每个Web程序都创建一个对应的ServletContext对象,代表当前Web应用
7.1 共享数据
尽量少用,用ssession和cookie代替
- 栗子
- HelloServlet.java
1 | package cn.xxy.servlet; |
- GetC.java
1 | package cn.xxy.servlet; |
- Web.xml
1 |
|
7.2 获取初始化参数与请求转发
请求转发:转发的路径不变,它是什么路径就是什么路径,一次请求;重定向:路径会变,两次请求
- 栗子
- HelloServlet.java
1 | package cn.xxy.servlet; |
- ServletDemo01.java
1 | package cn.xxy.servlet; |
- web.xml
1 | <web-app xmlns="http://java.sun.com/xml/ns/javaee" |
- pom.xml
1 |
|
7.3 读取资源文件
- 可以放置的位置
在java你目录下
在resources目录下
都能打包到同一路径:classes
- db.properties
1 | # 编译后在classes里面 |
- PropertiesServlet.java
1 | package cn.xxy.servlet; |
- pom.xml
1 |
|
- web.xml
1 | <web-app xmlns="http://java.sun.com/xml/ns/javaee" |
8. HttpServletRequest
HttpServletRequest请求代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中所有信息都会封装到HttpServletRequest,通过这个方法,可以获取客户端的所有信息
8.1 获取前端传过来的参数和请求转发
- index.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
- RegistServlet.java
1 | package cn.xxy.servlet; |
9.HttpServletResponse
响应: Web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求HttpServletRequest对象,代表一个响应的HttpServletResponse
- 如果获取客户端请求过来的参数 : 找HttpServletRequest
- 如果要给客户端响应一些信息:找HttpServletResponse
9.1 简单分类
- 负责向浏览器发送数据的方法
1 | ServletOutputStream getOutputStream() throws IOException; |
- 负责向浏览器发送响应头的方法
1 | void setCharacterEncoding(String var1); |
- 响应的状态码
1 | int SC_CONTINUE = 100; |
9.2 向浏览器输出消息和下载文件
- 下载文件
- 要获取下载文件的路径
- 下载的文件名叫什么
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载为文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到buffer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端
1 | package cn.xxy.servlet; |
9.3 验证码
- 前端实现,js实现
- 后端实现,需要用到java图片类,生产一个图片
- 数字验证码
1 | package cn.xxy.servlet; |
- 成语验证码
- cyyzm.html
1 |
|
- CheckCodeServlet.java
1 | RegistServletpackage cn.xxy.servlet; |
- RegistServlet.java
1 | package cn.xxy.servlet; |
- web.xml
1 | <servlet-mapping> |
- word.txt
1 | 擎天柱 |
9.4 实现重定向
一个web资源收到客户端A请求,B会通知客户去访问C,这个过程叫重定向
类别 | 代码 | 发送请求 | 地址改变 | 共享参数 | 跨域 | 访问WEB-INF目录(不能被外部通过地址直接访问) | 数字 |
---|---|---|---|---|---|---|---|
请求转发 | req.getRequestDispatcher(“/WEB-INF/views/student.jsp”).forward(req,resp); | 一次 | 不会改变 | 可以共享 | 不能 | 能 | 307 |
重定向 | resp.sendRedirect(“/day02_01/WEB-INF/views/student.jsp”) | 两次 | 会改变 | 不可以 | 可以 | 不能 | 302 |
1 | public void sendRedirect(String location) throws IOException; |
- Redirect.java
1 | package cn.xxy.servlet; |
- web.xml
1 | <servlet> |
9.5 登录
- index.html
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
- RegistServlet.java
1 | package cn.xxy.servlet; |
9.5 上传
上传注意
- 上传文件要放在外界访问不到的目录下,比如WEB-INF下
- 为防止文件覆盖,需要重命名唯一的名字
时间戳、UUID、md5、位运算算法
- 限制文件上传的最大值
- 限制上传文件的类型
10. Cookie、Session
10.1 不同点
名称 | 存储位置 | 存储容量 | 存储方式 | 隐私策略 | 有效期 | 服务器压力 | 浏览器支持 | 跨域支持 |
---|---|---|---|---|---|---|---|---|
Cookie | 客户端浏览器 | <=4KB,最多保存20个Cookie,300个cookie浏览器上限 | 只能保管ASCII字符串 | 客户端可见,不安全 | 设置cookie的属性长期有效 | 不占用服务器资源,并发 | 禁用或不支持cookie,则会话跟踪会失效,能够设置子窗口 | cookie支持跨域名访问 |
Session | 服务器 | 设置session删除机制,没有上限 | 任何 | 透明对 | 只需关闭窗口该session就会失效 | 耗费大量的内存 | 需要使用URL地址重写的方式,本窗口以及子窗口 | session不支持跨域名访问 |
10.2 会话
- 会话
用户打开浏览器,点开很多超链接,关闭浏览器,过程叫会话
- 有状态会话
服务器保存用户信息,下次登录或者来时,知道曾经登录或者来过
- 服务器给客户端一个信件,客户端下次访问服务端带上信件就可以了 -Cookie
- 服务器登记过你了,下次来的时候我来匹配你 -Session
10.3 Cookie
- 从请求中拿到cookie信息
- 服务器响应给客户端cookie
1 | Cookie[] cookies = req.getCookies(); //获取cookie |
- cookie:一般保存在本地用户目录下 Appdata
- 删除Cookie
不设置有效期,关闭浏览器,设置有效期时间为0
- CookieDemo01.java
1 | package cn.xxy.servlet; |
- web.xml
1 | <servlet> |
10.4 Session
10.4.1 使用场景
- 保存登录用户的信息
- 购物车信息
- 在整个网站中经常会使用的数据
10.4.2 使用Session
- 新建session
- SessionDemo01.java
1 | package cn.xxy.servlet; |
- 共享数据
- SessionDemo02.java
1 | package cn.xxy.servlet; |
- 销毁session
- SessionDemo03.java
1 | package cn.xxy.servlet; |
Session自动过期和配置文件
web.xml
1 | <web-app xmlns="http://java.sun.com/xml/ns/javaee" |
- 共享还可以是用ApplicationContext,全局上下文
11. Jsp
此技术比较老旧,重点了解思路和方式
11.1 Jsp怎么运行的
- 代码
- 服务器内部工作
Tomcat有一个work工作夹,IDEA中使用Tomcat会在IDEA的Tomcat中生产一个work目录
1 | C:\Users\.IntelliJIdea2019.3\system\tomcat\Unnamed_Demo01\work\Catalina\localhost\_\org\apache\jsp |
发现页面变为了.java程序
浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet
Jsp本质上就是一个Servlet
Jsp最终会被转换成为一个Java类,编译为.class文件供用户访问,也就是Servlet
- index_jsp.java
1 | package org.apache.jsp; |
- 每次点击重启,删除work,然后重新生成
在Jsp中只要是java代码原本不动输出,如果是HTML代码就会转换为:
1 | out.write("<html>\n"); |
11.2 基本语法
- JSP声明:会被编译到JSP生成的Java类中,其他的则是会被生成到_jspService方法中
1 | <% %> |
11.3 九大内置对象
- pageContext 保存的数据只在一个页面中有效
- request 保存的数据只在一次请求或者请求转发中有效,产生的数据,用户看完就没用了,新闻
- response
- application[ServletContext] 保存的数据只在服务器中有效,一个用完其他可能接着用,聊天数
- session 保存的数据只在一次会话中有效,产生的数据,用户用完一会还有用,购物车
- config[ServletConfig]
- out
- page
- exception
查找保存的从底层到高层 page-request-session-application,类似于JVM双亲委派机制
11.4 Jsp标签、JSTL标签、EL表达式
11.4.1 EL表达式
${}
- 获取数据
- 执行运算
- 获取Web开发的常用对象
- 调用Java方法
11.4.2 加入的依赖
- pom.xml
1 | <!-- JSTL表达式的依赖--> |
11.4.3 JSP标签
- index.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" language="java" %> |
11.4.4 JSTL表达式
JSTL标签为了弥补HTML语言的不足,封装了JSP应用的通用核心功能
核心标签
SQL标签
XML标签
JSTL函数
index.jsp
1 | <%@ page import="java.util.ArrayList" %> |
12. JavaBean、MVC、过滤器、监听器
对象关系映射 ORM
- 表-类
- 字段-属性
- 行记录-对象
12.1 MVC(model-view-controller)
现在MVVM
- Controller(Servlet)
接收客户的请求(req,session),响应给客户端内容,重定向或转发
- view
展示数据,提供可以供我们操作的请求
- 数据库(JDBC)
- Model(JavaBen、Service、Dao)
控制业务操作,crud,导入导出,批量操作
JavaBen(pojo、entity【vo、dto】)
Service
Dao
登录
登录-接收用户的登录请求,处理用户的请求,获取用户登录的参数-交给业务层处理(判断用户名密码是否正确:事务)-Dao查询用户名密码是否正确-数据库
12.2 Filter过滤器
处理乱码,登录验证
- 导包
1 | <!-- JSTL表达式的依赖--> |
编写过滤器
CharacterEncodingFilter.java
1 | package cn.xxy.servlet; |
- ShowServlet.java
1 | package cn.xxy.servlet; |
- web.xml
1 | <servlet> |
12.3 监听器
- 编写监听器
1 | package cn.xxy.lister; |
- web.xml
1 | <listener> |
13. JDBC
- 导入数据库依赖
1 | <dependencies> |
JDBC通用步骤
TestJdbc.java
1 | import java.sql.*; |
- 事务ACID
@Test注解只能作用于方法上
14. SMBMS【超市订单管理系统】
14.1. 配置
- SQL
1 | CREATE DATABASE `smbms`; |
搭建一个Maven Web项目
web.xml
1 | <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" |
- 配置Tomcat
- 测试项目跑起来
- 导入项目中会遇到的jar包
- pom.xml
1 |
|
创建项目包结构
编写实体类
User.java
1 | package cn.xxy.pojo; |
- Bill.java
1 | package cn.xxy.pojo; |
- Role.java
1 | package cn.xxy.pojo; |
- Provider.java
1 | package cn.xxy.pojo; |
编写基础公共类
BaseDaoUtil
1 | package cn.xxy.util; |
编写字符编码过滤器
CharacterEncodingFilter.java
1 | package cn.xxy.filter; |
- 导入静态资源
14.2 编码
- 一般数据访问层Dao
- IUserDao
1 | package cn.xxy.dao.user; |
- UserDaoImpl
1 | package cn.xxy.dao.user; |
- Service层【业务逻辑层】
- IUserService
1 | package cn.xxy.service.user; |
- UserServiceImpl
1 | package cn.xxy.service.user; |
- Servlet层
- LoginServlet
1 | package cn.xxy.servlet.user; |
- LogoutServlet
1 | package cn.xxy.servlet.user; |
- UserServlet
1 | package cn.xxy.servlet.user; |
15. 总结
对于计算机网络和JSP的原理进行了了解