JavaWeb
- Tomcat
-
- 1.1、官方链接https://tomcat.apache.org/download-80.cgi
- 1.2、启动:bin->startup
- 1.3、乱码解决
- 1.4、关闭
-
- 正常关闭
- 强制关闭
- 1.5、配置
- 1.6、项目部署
- 1.7、IDEA集成创建Web项目
- 1.8-IDEA与tomcat的相关配置
- Servlet
-
- 2.1、Servlet概述
- 2.2、Servlet入门
- 2.3、Servlet执行原理
- 2.4、Servlet生命周期
-
- 简述
- init()
- getServletConfig()
- service()
- getServletInfo()
- destroy()
- load-on-startup -- xml
- 2.5、Servlet注解配置
-
- 简述
- 使用
- @WebServlet
- 2.6、Servlet体系结构
- 2.7、快速创建Servlet类
- 2.8、Servlet路径配置
- HTTP
-
- 3.1、概念
- 3.2.请求信息和响应信息
- 请求信息的数据格式
- 3.2.1、请求行
- 3.2.2、请求头
- 3.2.3、请求空行
- 3.2.4.请求体(正文)
- Request -- 请求
-
- 4.1、继承体系
- 4.2、Request对象
-
- 获取请求行数据 -F
- 获取请求头数据 -F
-
- S-user-agent
- S-referer
- 获取请求体数据
-
- 获取请求参数的通用方法(s/get)-- F
-
- getParameter
- String[] getParameterValues(String name)
- Map<String,String[]> getParameterMap()
- 中文乱码获取请求参数的问题
- 请求转发 --F
- 共享数据
- 获取ServletContext对象
- 案例
-
- 需求
- **分析**
- 文件提取
- Response -- 响应
-
- 5.1、HTTP协议
-
- 数据格式
-
- 响应行
- 响应头
- 响应空行
- 响应体
- 5.2、Response对象
-
- 功能-设置响应信息
-
- 设置响应行
- 设置响应头
- 设置响应体
- 5.3、完成重定向
-
- 资源跳转的方式
- 重定向的特点:redirct
- 转发特点:forward
- 路径写法
-
- 唯一的资源不能通过相对路径确定
- 唯一的资源可以通过绝对路径确定
- 5.4.服务器将字符数据输出到浏览器
- 5.5.服务器输出字节数据到浏览器
- 5.6、验证码
- 5.7、ServletContext
-
- 获取MIME类型
- 域对象:共享数据
- 获取文件的真实(服务器)路径
- 文件下载
-
- 概念需求
- 代码
- 解决中文文件名
-
- DownLoadServlet类
- Cookie会话 -- 客户端会话技术
-
- 6.1、使用
-
- Cookie遍历
- 6.2、发送多个Cookie
- 6.3、Cookie存活的时间
-
- 持久化存储
- 6.4、Cookie存储中文
- 6.5、Cookieo共享
- 6.6、Cookie特点和功能
- 案例
-
- 需求:
- 分析:
- 代码
- JSP
-
- 7.1、概念
- 7.2、原理
- 7.3、JSP脚本
- 7.4、JSP内置对象
-
- 说明
- 关于jsp不能使用内置对象的方法
- JSP共有9个内置对象
-
- out和response.getWriter()的区别
- 改造Cookie案例
- Session会话 -- 服务器
-
- 8.1、概念
- 8.2、HttpSession对象
- 8.3、原理
-
- 客户端关闭,服务器不关闭,两次获取session是一样的吗?
- 客户端不关闭,服务器关闭后,获得两次吗?session是同个么?
- session什么时候被销毁
- 8.4、session的特点
-
- session与Cookie的区别
- 案例:验证码
-
- 案例需求:
- 分析
- 代码
-
- LoginServlet
- verifyServlet
- index.jsp
- seccexx.jsp
- JSP其余内容
-
- 9.1、指令
-
- page -- 配置JSP页面的
-
- isErrorPage
- include -- 页面包含的,导入页面的资源文件
- taglib -- 导入资源
-
- 导入依赖
- 9.2、注释
-
- html注释
- jsp注释
- 9.2、内置对象
- MVC开发模式
-
- jsp演变历史
- MVC
-
- 优点
- 缺点
- EL表达式
-
- 概念
- 使用
-
- 运算
- 获取值
-
- 获取对象、LIst集合、Map集合的值
-
- 对象
- 集合
- 空运算符
- 隐式对象
- JSTL标签
-
- 概念
- 使用
- 常用的JSTL标签
-
- if
- choose
- foreach
- 练习
- 三层架构
- 案例
-
- 需求
- 设计
- 任务视图
-
- 查询
- 添加
- 修改
- Filter过滤器
-
- 方法
- 阐述
- 使用
-
- web.xml配置
- 注解 @WebFilter("/*")
- 过滤器执行流程
- 过滤器生命周期
- 过滤器配置详解
-
- 拦截路径配置
- 拦截方式配置:资源被访问的方式
- WEB.XML配置
- 过滤器链(配置多个过滤器)
- 案例--登陆验证
-
- 需求
- 代码
- 案例--敏感词汇过滤
-
- 需求
- 分析
- 增强对象的功能
- 代码
- Listener监听器
-
- 事件监听机制
- 使用
- 依赖导入
Tomcat
1.1、官方链接https://tomcat.apache.org/download-80.cgi
1.2、启动:bin->startup
1.3、乱码解决
conf->logging.properties找到如下配置项:
java.util.logging.ConsoleHandler.encoding = UTF-8
将 UTF-8 修改为 GBK,修改后的效果为:
java.util.logging.ConsoleHandler.encoding = GBK
保存后,重启tomcat!
通过http://localhost:8080/访问服务器页面
访问页面时乱码:https://blog.csdn.net/weixin_39626745/article/details/110496357
1.4、关闭
正常关闭
强制关闭
1.5、配置
部署项目的方式
-
直接将项目放到webapps下即可
-
重新启动Tomcat服务器
-
分别为端口号->目录->网页名
-
简化部署:
-
war包方式
- 将项目打成一个war包,再将war包放置到webapps目录下。
- war包会自动解压缩
-
配置conf/server.xml文件
- docDase:项目存放的路径 path:虚拟目录
-
在conf\Catalina\localhost创建任意名称的xml文件
- 在文件中去编写以上图片中标签的内容(注,无path,虚拟目录为xml文件名)
-
1.6、项目部署
静态项目和动态项目
- 目录结构
- java动态项目的目录结构
- 项目的根目录
- WEB-INF目录:
- web.xml:web项目的核心配置文件
- classes目录:放置字节码文件的目录
- lib目录:放置依赖的jar包
- WEB-INF目录:
- 项目的根目录
- java动态项目的目录结构
1.7、IDEA集成创建Web项目
将Tomcat集成到IDEA中,并且创建JavaEE的项目,部署项目
- 选择IDEA的Run菜单->Edit Configurations…
1.8-IDEA与tomcat的相关配置
IDEA会为一个tomcat部署的项目单独建立一份配置文件
- 查看控制台的log:
- Using CATALINA_BASE: “C:\Users\Administrator\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat\bee10957-0d37-4952-ba05-24f7c7f17d88” – 项目配置文件路径
- 工作空间项目 和 tomcat部署的web项目
- tomcat真正访问的是
tomcat部署的web项目
,它对应着工作空间项目
的web目录下的所有资源 WEB-INF
目录下的资源不能被浏览器直接访问
- tomcat真正访问的是
- 断点调试
- 在代码行左侧打断点,点击小爬虫或shift+f9使用debug模式启动tomcat
Servlet
2.1、Servlet概述
概念:运行在服务器端的小程序
- Servlet就是一个接口,,定义了Java类被浏览器访问到(tomcat识别)的规则
- 将来我们自定义一个类,实现Servlet接口,复写方法
2.2、Servlet入门
- 创建JavaEE项目
- 定义一个类,实现Servlet接口
- 实现接口中的抽象方法
- 在service(提供服务的方法)写入内容
- 配置Servlet(在WEB-INF下的web.xml文件)
实现Servlet接口,创建类
package com.example.javaWeb_Servlet;
import javax.servlet.*;
import java.io.IOException;
/** * @author 玫瑰到了花期 * @data 2022/3/21 14:19 * @love 又偷偷看你了 * @V: CBWR-K */
public class Servlet01 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
编写web.xml配置文件
<!--配置Servlet-->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>com.example.javaWeb.ServletDemo01</servlet-class>
</servlet>>
<!--映射Servlet-->
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
通过url-pattern映射的路径来访问
2.3、Servlet执行原理
- 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
- 查找web.xml文件,是否有对应的标签体内容
- 如果有,则在找到对应的全类名
- tomcat会将字节码文件加载进内存,并且创建其对象
- 调用其方法
2.4、Servlet生命周期
简述
-
- Servlet什么时候被创建
- 默认情况下,第一次被访问时,Servlet被创建
- 可以配置执行Servlet的创建时机
- 在Servlet标签下配置
- 第一次被访问时,创建
- 的值为负数
- 在服务器启动时,创建
- 的值为0或正整数
- 第一次被访问时,创建
- 在Servlet标签下配置
- Servlet的init方法只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的
- 多个用户同时访问时,可能出现线程安全问题
- 解决:尽量不要在Servlet中定义成员变量,即使定义了成员变量,也不要修改值
- 多个用户同时访问时,可能出现线程安全问题
- Servlet什么时候被创建
-
- 每次访问Servlet方法,执行多次
-
- Servlet被销毁时执行,服务器关闭时,Servlet被销毁
- 只有服务器正常关闭时才会执行destroy方法
- destroy方法在Servlet被销毁之前执行,一般用于释放资源
init()
/** * 初始化方法 * 在Servlet被创建时执行,只会执行一次 * 执行在控制台 * */
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init....");
}
getServletConfig()
/** * 获取ServletConfig对象 * ServletConfig:Servlet的配置对象 * */
@Override
public ServletConfig getServletConfig() {
return null;
}
service()
/** * 提供服务方法 * 每一次Servlet被访问时,执行,执行多次 * 执行在控制台 * */
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet....");
}
getServletInfo()
/** * 获取Servlet的一些信息,版本,作者等等。 * */
@Override
public String getServletInfo() {
return null;
}
destroy()
/** * 销毁方法 * 在服务器正常关闭,执行,执行一次 * */
@Override
public void destroy() {
System.out.println("destroy....");
}
load-on-startup – xml
<load-on-startup>-5</load-on-startup>
<!--指定Servlet的创建时机 1.第一次被访问时,创建 <load-on-startup>的值为负数 2.在服务器启动时,创建 <load-on-startup>的值为0或正整数 -->
2.5、Servlet注解配置
简述
- 好处
- 支持注解配置。可以不需要web.xml了
- 步骤
- 创建javaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
- 定义一个类,实现Servlet接口
- 复写方法
- 在类上使用@WebServlet注解,进行配置
使用
@WebServlet
//uelpatterns="访问路径" -- 注解写在类前
@WebServlet(urlPatterns = "/demo")
//写法2
@WebServlet("/demo2")
//写法3,多条访问路径
@WebServlet({
"/demo3","/demo4"})
2.6、Servlet体系结构
Servlet – 接口
|
GenericServlet – 抽象类
|
HttpServlet – 抽象类
- GenericServlet: 默认将除了service方法外的所有方法都给实现了,只把service方法抽象化,这样servlet类在继承GenericService时只用重写service方法即可
- ⭐HttpServlet:对http协议的一种封装,简化手动写判断请求方式的操作
-
定义类继承HttpServlet
-
复写doGet/doPost方法
-
doGet->
-
doPost->
-
2.7、快速创建Servlet类
2.8、Servlet路径配置
-
/xxx
-
资源目录,访问此路径
-
-
/xxx/xxx
-
多层路径,目录结构,需要输全路径才能访问
-
-
*.do
-
==万能路径,表示==后面的路径可以随意输入
-
.do表示必须以do结尾
-
HTTP
3.1、概念
- Hyper Text Transfer Protocol 超文本传输协议
- 传输协议
- 定义了,客户端和服务端通信时,发送数据的格式
- 特点
- 基于TCP/IP的高级协议
- 默认端口号:8080
- 基于请求/响应模型的
- 一次请求对应一次响应
- 无状态的
- 每次请求之间相互独立的,不能交互数据
- 历史版本
- 1.0
- 每次使用,都会重新建立连接
- 1.1
- 复用连接
- 1.0
3.2、请求消息与响应消息
请求消息的数据格式
3.2.1、请求行
请求方式 | 请求url | 请求协议 | 版本 |
---|---|---|---|
GET | /login.html | HTTP | 1.1 |
- HTTP协议游7种请求方式,常用的有2种
- GET:
- 请求参数在请求行中,在url后
- 请求的url长度有限制
- 不安全
- Post:
- 请求参数在请求体中、
- 请求的url长度没有限制
- 相对安全
- GET:
3.2.2、请求头
客户端浏览器告诉服务器一些信息
请求头名称 | 使用 |
---|---|
Host:localhost | 端口 |
User-Agent: | 浏览器告诉服务器,访问你使用的浏览器版本信息 |
可以在服务端获取该头的信息,解决浏览器兼容问题 | |
Referer: | 告诉服务器,我(当前请求)从哪里来 |
作用: | 防盗链 |
统计 | |
Connection: | keep-alive 可以被复用 |
3.2.3、请求空行
空行,就是用于分割POST请求的请求头和请求体的
空行 |
---|
3.2.4、请求体(正文)
- 封装POST请求消息的请求参数
Request – 请求
4.1、继承体系
- request对象和response对象的原理
- request和response对象是由服务器创建的,我门来使用它
- request对象是来获取请求消息
- response对象是来设置响应消息
- request:获取请求消息
4.2、Request对象
获取请求行数据 -F
-
Get /day1/demo1?name=傻逼胡子洋 HTTP/1.1
-
方法:
功能 方法 获取请求方式:GET String getMethod() ==*==获取虚拟目录:/day1 String getContextPath() 获取Servlet路径:/demo1 String getServletPath() 获取get方式请求参数:name=… String getQueryString() ==*==获取请求的url:/day1/demo1 String getRetURL():/day1/demo1 StringBuffer getRequestURL():http://localhost/day1/demo1 获取协议及版本:HTTP1.1 String getProtocol() 获取客户机的IP地址 String getRemoteAddr() URL: 统一资源定位符 – 中华人民共和国 URI: 统一资源标识符 – 共和国 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1、获取请求方式 String method = request.getMethod(); System.out.println("请求方式为:"+method); //2、获取虚拟目录 String contextPath = request.getContextPath(); System.out.println("虚拟目录为:"+contextPath); //3、获取Servlet路径 String servletPath = request.getServletPath(); System.out.println("Servlet路径为:"+servletPath); //4、获取get方式请求参数 String queryString = request.getQueryString(); System.out.println("get方式请求参数为:"+queryString); //5、获取请求的url StringBuffer requestURL = request.getRequestURL(); System.out.println("URL为:"+requestURL); //6、获取协议及版本 String protocol = request.getProtocol(); System.out.println("协议版本为:"+protocol); //7、获取客户机的IP地址 String remoteAddr = request.getRemoteAddr(); System.out.println("客户机的IP地址为"+remoteAddr); }
获取请求头数据 -F
功能 | 方法 |
---|---|
String contains(“”) | request对象判断字符串 |
String getHeader(String name) | ==*==通过请求头的名称获取请求头的值 |
Enumeration getHeaderNames() | 获取所有请求头的值 |
hasMoreElements() | 测试此枚举是否包含更多的元素(迭代器) |
nextElement() | 如果此枚举对象至少还有一个可提供的元素,则返回此枚举的下一个元素 |
获取所有请求头以及值
S-user-agent
获取指定请求头的值
S-referer
获取请求体数据
-
请求体
- 只有POST请求方式才有请求体,在请求体中封装了POST请求的请求参数
-
步骤
-
获取流对象
-
从流对象中拿数据
-
方法 说明 BufferedReader getReader() 获取字符输入流,只能操作字符数据 ServletInputStream getInputStream() 获取字节输入流,可以操作所有类型数据 在文件上传后讲解 @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //获取请求消息体 -- 请求参数 //1.获取字符流 BufferedReader br = request.getReader(); //2.读取数据 String line = null; while ((line = br.readLine())!=null){ System.out.println(line); } } }
-
-
获取请求参数通用方式(s/get)-- F
方法 | 说明 |
---|---|
String getParameter(String name) | 根据参数名称获取参数值 |
password=123456 | 参数传递"password"返回123456 |
String[] getParameterValues(String name) | 根据参数名称获取参数值的数组(多个数值) |
name=“1”&name=“2” | 参数传递"name"返回所有name值 |
getParameterNames() | 获取所有请求的参数名称 |
Map<String,String[]> getParameterMap() | 获取所有参数的map集合 |
getParameter
//post 获取请求参数
//根据参数名称获取参数值
String user = request.getParameter("User");
String password = request.getParameter("password");
System.out.println(user+password);
String[] getParameterValues(String name)
//post 获取请求参数
//根据参数名称获取参数数组
String[] names = request.getParameterValues("hobby");
for (String name:names) {
System.out.println(name);
}
Map<String,String[]> getParameterMap()
//post 获取请求参数
//获取所有参数的map集合
Map<String, String[]> parameterMap = request.getParameterMap();
Set<String> keySet = parameterMap.keySet();
for (String name : keySet) {
//获取键获取值
String[] values = parameterMap.get(name);
System.out.println(name);
for(String value : values){
System.out.println(value);
}
System.out.println("-------------");
}
获取请求参数中文乱码的问题
-
get方式:tomcat 8 已经将get方式乱码问题解决了
-
post方式:会乱码
-
解决:在获取参数前,设置request的编码
-
request.setCharacterEncoding("utf-8");
-
请求转发 --F
一种在服务器内部的资源跳转方式
-
方法 request 说明 getRequestDispatcher(String path) 通过request对象获取请求转发器对象 forward(ServletRequest request,ServletResponse response) 使用request对象进行转发 /*Demo6*/ System.out.println("Demo6666被访问了"); //转发到Demo7资源 RequestDispatcher requestDemo7 = request.getRequestDispatcher("requestDemo7"); requestDemo7.forward(request,response); /*Demo7*/ System.out.println("Demo7777被访问了"); /*写法2*/ request.getRequestDispatcher("requestDemo7").forward(request,response);
- 特点:
- 浏览器地址栏路径不会变
- 只能转发到当前服务器内部资源中
- 转发是一次请求
- 特点:
共享数据
-
域对象:一个有作用范围的对象,可以在范围内共享数据
-
request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
-
方法:
-
方法 说明 void setAttribute(String name,Object obj) 存储数据 Object getAttitude(String name) 通过键获取值 void r
-