JavaWeb
1. 基本概念
1.1 前言:
- 静态web
- 动态web
在java中,动态web资源开发的技术统称为JavaWeb
1.2 应用程序web
可以提供浏览器访问的程序
- a.html , b.html…多个web资源,这些资源可以被外界访问,对外界提供服务;
- URL
- 这个同意的web资源会被放在同一个文件夹下,web应用程序 --> tomcat服务器
- 一个web应用由多个部分组成
- html ,css,js
- jsp,servlet
- java程序
- jar包
- 配置文件
web应用程序编写完毕后,若想提供给外界访问,需要一个服务器来同意管理(tomcat)
1.3 静态web
- 静态web存在的缺点
- Web页面无法动态更新,所有用户看到的都是同一个页面
- 它无法和数据库交互(数据无法持久化,用户无法交互)
1.4 动态web
页面会动态变化
缺点:
- 加入服务器的动态web资源出现了错误,需要重新编写后台程序,重新发布
- 停机维护
优点:
- Web页面可以动态刷新,
- 可以与数据库交互(数据持久化:注册,商品信息,用户信息…)
2. web服务器
2.1 技术讲解
ASP:
- 微软:国内最早最流行的就是ASP
- 在html中嵌入了VB的脚本,ASP+COM
- 在ASP开发中,基本一个页面都是有几千行的业务代码,页面极其混乱
- 维护成本高
- 主要用C# 语言
- iis服务器
php:
- PHP开发速度很快,功能很强大,跨平台,代码简单
- 无法承载大访问量的情况(局限性)
JSP/Servlet:
- sun公司主推的b/s架构
- 基于java语言包的
- 可以承载三高问题带来的影响
- 语法向ASP
2.2 .web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息
3 .Tomcat
3.1 安装tomcat
下载
3.2 Tomcat启动和配置
可能遇到的问题:
- java环境没有配置
- 闪退问题:需要配置兼容性
- 乱码问题: 配置文件中设置
3.3 配置
tomcat>>conf>>server.xml文件
可以配置启动 的端口号:
可以配置注解的名称
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
可以配置主机的名称
-
默认的主机名称为:localhost->127.0.0.1
-
默认网站应用存放的位置为: webapps
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true">
高难度面试题:
网站是如何进行访问的?
- 输入一个域名; 回车
- 检查本机的hosts 配置文件下有没有这个域名映射
- 有: 直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
- 没有: 去dns服务器找,找到的话就返回,找不到就返回找不到
3.4 发布一个web网站
-
将写好的网站,放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下,就可以访问了
-- webapps : Tomcat 服务器的web目录 -ROOT -xiangmuming: 网站的目录名 - WEB_INF -classes : java程序 -lib : web应用所依赖的jar包 -web.xml : 网站配置文件 - index.html : 默认的首页 - static -css -style.css -js -img -......
4 . Http
4.1 什么是HTTP
HTTP(超文本传输协议) 是一个简单的请求-响应协议,它通常运行在TCP之上.
- 文本: html , 字符串 ,
- 超文本: 图片 , 音乐 ,视频, 定位 , 地图 …
- 默认端口80
Https : 安全的 默认端口 443
4.2 两个时代
-
http1.0
- HTTP/1.0: 客户端可以与web服务器连接后,只能获得一个web资源,断开连接
-
http2.0
- HTTP/1.1 : 客户端可以与web服务器连接后,可以获得多个web资源
4.3 HTTP请求
客户端 —发请求 --服务器
Request URL: https://www.baidu.com/ (请求地址)
Request Method: GET (get方法)
Status Code: 200 OK 状态码
Remote Address: 39.156.66.14:443 (远程地址)
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh,en-US;q=0.9,en;q=0.8,zh-CN;q=0.7
Cache-Control: max-age=0
Connection: keep-alive
1. 请求行
- 请求行中的请求方式 : get
- 请求方式: get post , HEAD , DELETE, PUT , …
- get : 请求能够携带的参数较少,大小有限制, 会在浏览器的url地址栏显示数据内容,高效
- post : 携带的参数没有限制 , 不会再浏览器的url地址栏中显示数据,安全, 高效
2. 消息头
Accept: 告诉浏览器 ,它所支持的数据类型
Accept-Encoding: 支持哪种编码格式
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 类型
1. 响应体
Accept: 告诉浏览器 ,它所支持的数据类型
Accept-Encoding: 支持哪种编码格式
Accept-Language: 告诉浏览器,它的语言环境
Cache-Control: 缓存控制
Connection: 告诉浏览器,请求完成时断开还是保持连接
HOST : 主机...
Refresh : 告诉客户端,多久刷新一次
Location : 让网页重新定位
2. 响应状态码
200 : 请求响应成功
3xx : 请求重定向
4xx: 找不到资源
5xx: 服务器代码错误 502:网关错误
5 .Maven
5.1 Maven项目架构管理工具
核心思想: 约定大于配置
Maven会规定好如何编写java代码(项目结构),必须按照这个规范来;
5.2 下载安装Maven
5.3 配置环境变量
5.4 配置阿里云镜像
5.5 配置本地仓库
5.6 在idea中使用maven
5.7 创建一个普通的maven项目(不用模板)
5.8 标记文件夹功能
5.9 在idea中配置tomcat
解决警告问题:
为什么会有这个问题: 访问一个网站,需要指定一个文件夹名字;
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AREUliTr-1616153399641)(/image-20210314004903852.png)](https://img-blog.csdnimg.cn/20210319193608891.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMDg0MzI1,size_16,color_FFFFFF,t_70)
5.10 pom文件
maven由于他的约定大于配置,之后可能遇到写的配置配置文件无法被导出或者生效的问题,解决法案:
5.11 解决遇到的问题
- Maven 3.6.2
降低版本即可;
-
Tomcat闪退
-
idea中每次都要重复配置maven
-
Maven项目中tomcat无法配置
-
maven默认web项目中的web.xml版本问题
解决: 拷贝tomcat中ROOT的web.xml,这样可以使webapp的版本和tomcat保持一致
<?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>
6. Servlet
6.1 Servlet简介
- Servlet就是sun公司开发动态web的一门技术
- sun公司在这些api中提供了一个接口叫做servlet. 开发一个servelt程序只需两步:
- 编写一个类, 实现servlet接口
- 把开发好的java类部署到web服务器中
把实现了Servlet接口 的java程序,叫做servlet
6.2 HelloServlet
-
构建一个普通的Maven项目(父工程),删掉里面的src目录,以后就在这个项目里面建立Moudel;这个空的工程就是maven的主工程
-
关于maven父子工程的理解:
父项目中会有
<modules> <module>servlet-01</module> </modules>
子项目会有
<parent> <artifactId>javaweb-02-servlet</artifactId> <groupId>com.xx</groupId> <version>1.0-SNAPSHOT</version> </parent>
-
maven环境优化
- 修改web.xml为最新的
- 将maven的介机构搭建完整(javacode,resources等根路径)
-
编写一个Servlet程序
- 编写一个普通类
- 实现Servlet接口,(直接继承HttpServlet)
-
编写Servlet的映射
为什么需要映射: 我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以需要再web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径;
<!--注册Servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.xx.servler.HelloServlet</servlet-class> </servlet> <!--Servlet的请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
配置tomcat
注意: 配置项目发布的路径就可以了
-
启动测试
6.3 Servlet原理
6.4 Mapping问题
-
一个Servlet可以指定一个映射路径
<servelt-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servelt-mapping>
-
一个Servlet可以指定多个映射路径
-
一个Servlet可以指定通用映射路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
-
默认请求路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
-
指定一些后缀或者前缀等等…
注: *前面不能加项目映射的路径
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
-
优先级问题
指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;
6.5 ServletContext
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;
1. 共享数据
在一个Servlet中保存的数据,可以在另外一个servlet中拿到;
2. 获取初始化参数
在web.xml中配置初始化参数,通过ServletContext.getInitParameter("")方法获得;
3. 请求转发
4. 读取资源文件
Properties
- 在java目录下新建properties
- 在resources目录下新建properties
发现: 都被打包在同一个路径下:classes,我们俗称这个路径为classpath;
思路: 需要一个文件流
6.6 HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServletResponse;
- 如果要获取客户端请求过来的参数: 找HttpServletRequest
- 如果要给客户端响应一些信息: 找HttpServletResponse
1. 简单分类
负责向浏览器发送数据的方法
ServletOutputStream getOutputStream();
PrintWriter getWriter();
负责向浏览器发送响应头的方法
2.下载文件
-
向浏览器输出消息
-
下载文件
- 要获取下载文件的路径
- 下载的文件名
- 设置想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到buffer缓冲区
- 使用OutputStream将缓冲区中的数据输出到客户端
3. 验证码功能
4. 实现重定向
B一个web资源受到客户端A请求后,B会通知A客户端去访问另外一个web资源C,这个过程叫重定向;
面试题: 转发与重定向 的区别?
相同点:
- 页面都会实现跳转
不同点:
- 请求转发的时候url不会产生变化
- 重定向的时候,url地址栏会发生变化;
6.7 HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器,HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息;
1. 获取前端传递的参数
2. 请求转发
7. Cookie 、Session
7.1 会话
**会话:**用户打开一个浏览器,… 这个过程称为会话.
有状态会话:
7.2 保存会话的两种技术
cookie
- 客户端技术(响应,请求)
session
- 服务器技术,利用这个技术,可以保存用户的会话信息,可以把信息或者数据放在session中.
7.3 Cookie
-
从请求中拿到cookie信息
-
服务器响应给客户端cookie
Cookie[] cookies=req.getCookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
cookie.getValue(); // 获得cookie中的value
new Cookie(“key” , value); // 新建一个cookie
cookie.setMaxAge(); //设置cookie的有效期
resp.addCookie(cookie); // 响应给客户端一个cookie
```
cookie一般会保存在本地的用户目录下的appdata中;
- 一个Cookie只能保存一个信息;
- 一个web站点可以给浏览器发送多个cookid,最多存放20个cookie;
- cookie大小有限制4kb;
- 300个cookie浏览器上线
删除cookie
- 不设置有效期,关闭浏览器,自动失效;
- 设置有效期时间为0;
编码解码:
URLEncoder.encode("哈哈","utf-8");
URLDecoder.decode(cookie,getValue(),"utf-8")
7.4 Session(重点)
什么是Session:
- 服务器会给每一个用户(浏览器)创建一个Session对象;
- 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
Session和cookie的区别:
- Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
- Session把用户的数据写到用户独占Session中,服务器保存(保存重要的信息,较少服务器资源的浪费)
- Session对象由服务器创建;
会话自动过期:web.xml配置:
<!--设置Session默认的失效时间-->
<session-config>
<!--15分钟后session自动失效,以分钟为单位-->
<session-timeout>15</session-timeout>
</session-config>
8. JSP
8.1 什么是JSP
Java Server Pages : Java服务器端页面, 也和Servlet一样,用于动态web技术;
最大特点:
- 写jsp就像在写html
- 区别:
- html只给用户提供静态的数据
- jsp页面中可以嵌入java代码,为用户提供动态数据;
8.2 JSP原理
8.3 JSP基础语法
任何语言都有自己的语法,java中有,jsp作为java技术的一种应用,它拥有一些自己扩充的 语法,java所有语法都支持;
Jsp表达式:
作用: 用来将程序的输出,输出到客户端
<%=new java.util.Date()%>
Jsp脚本片段
<%
int sum=0;
.....
out.println("<h1>sum="+sum+"</h1>");
%>
JSP 声明
<%!
%>
jsp声明:会被编译到jsp生成的java类中;
其他的,就会被生成到_jspService方法中;
8.4 jsp指令
8.5 JSP内置九大对象
- PageContext 存东西 //保存的数据只在一个页面中有效
- Request //保存的数据只在一次请求中有效,请求转发会携带这个数据
- Response
- Session //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
- Application [ServletContext] 保存的数据只在服务器中有效,从打开服务器到关闭服务器
- config [ServletConfig]
- out
- page
- exception
8.6 JSP标签 、JSTL标签、EL表达式
<!--jstl表达式-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!--standard标签库-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
EL表达式: ${}
- 获取数据
- 执行运算
- 获取web开发的常用对象
JSTL表达式
JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样;
- 核心标签
- 格式化标签
- SQL标签
- XML标签
JSTL标签库的使用步骤:
- 引入对应的taglib
- 使用其中的方法
- 在tomcat中也需要引入jstl的包,否则回报错: jstl解析错误
9. JavaBean
实体类
JavaBean有特定的写法:
- 必须有一个无参构造
- 属性必须私有化
- 必须有对应的get/set方法;
一般用来和数据库的字段做映射 ORM
10. MVC三层架构
什么是MVC
Model
- 业务处理: 业务逻辑(service)
- 数据持久层: crud (dao)
View
- 展示数据
- 提供链接发起Servlet请求
Controller (Servlet)
- 接收用户的请求: (request, session)
- 交给业务层处理对应的代码
- 控制视图的跳转
11. Filter
-
导包
-
编写过滤器:
实现FIlter接口,重写对应的方法即可
init(): 初始化方法: web服务器启动,就已经初始化了
doFilter():
- chain.doFilter()方法不写,程序就会被拦截停止;
- 过滤中的所有代码,在过滤特定请求的时候都会执行
destroy() : web服务器关闭的时候,过滤器销毁
-
在web.xml中配置Filter
12. 监听器
- 实现监听器的接口,重写方法
- web.xml中注册监听器
13. JDBC
导入数据库依赖
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
JDBC固定步骤:
-
加载驱动
-
连接数据库,代表数据库
-
向数据库发送sql的对象Statement : crud
-
编写sql(根据业务,不同的sql)
-
执行sql
-
关闭连接
public static void main(String[] args) throws ClassNotFoundException, SQLException { String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8&useSSL=false"; String username="root"; String password="123456"; //1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2.连接数据库, Connection connection = DriverManager.getConnection(url, username, password); System.out.println(connection); //3.向数据库发送sql对象 Statement,PreparedStatement : crud Statement statement = connection.createStatement(); //4.编写sql String sql = ""; //5. 执行查询,返回一个resultSet; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()){ System.out.println("id="+resultSet.getObject("id")); System.out.println("name="+resultSet.getObject("name")); System.out.println("age="+resultSet.getObject("age")); } //关闭连接(先开后关) resultSet.close(); statement.close(); connection.close(); }
事务:
要么都成功,要么都失败;
ACID原则,保证数据安全
- 开启事务
- 事务提交 commit()
- 事务回滚 rollback()
- 关闭事务