资讯详情

JavaWeb简讲

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、配置

部署项目的方式

  1. 直接将项目放到webapps下即可

  2. 重新启动Tomcat服务器

  3. 分别为端口号->目录->网页名

  4. 简化部署:

    • 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包

1.7、IDEA集成创建Web项目

将Tomcat集成到IDEA中,并且创建JavaEE的项目,部署项目

  1. 选择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目录下的资源不能被浏览器直接访问
  • 断点调试
    • 在代码行左侧打断点,点击小爬虫或shift+f9使用debug模式启动tomcat

Servlet

2.1、Servlet概述

概念:运行在服务器端的小程序

2.2、Servlet入门

  1. 创建JavaEE项目
  2. 定义一个类,实现Servlet接口
  3. 实现接口中的抽象方法
  4. 在service(提供服务的方法)写入内容
  5. 配置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执行原理

  1. ​ 当服务器接收到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
  2. 查找web.xml文件,是否有对应的标签体内容
  3. 如果有,则在找到对应的全类名
  4. tomcat会将字节码文件加载进内存,并且创建其对象
  5. 调用其方法

2.4、Servlet生命周期

简述

    • Servlet什么时候被创建
      • 默认情况下,第一次被访问时,Servlet被创建
      • 可以配置执行Servlet的创建时机
        • 在Servlet标签下配置
          1. 第一次被访问时,创建
            • 的值为负数
          2. 在服务器启动时,创建
            • 的值为0或正整数
      • Servlet的init方法只执行一次,说明一个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了
  • 步骤
    1. 创建javaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
    2. 定义一个类,实现Servlet接口
    3. 复写方法
    4. 在类上使用@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
      • 复用连接

3.2、请求消息与响应消息

请求消息的数据格式

3.2.1、请求行

请求方式 请求url 请求协议 版本
GET /login.html HTTP 1.1
  • HTTP协议游7种请求方式,常用的有2种
    • GET:
      • 请求参数在请求行中,在url后
      • 请求的url长度有限制
      • 不安全
    • Post:
      • 请求参数在请求体中、
      • 请求的url长度没有限制
      • 相对安全

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请求的请求参数
  • 步骤

    1. 获取流对象

    2. 从流对象中拿数据

      • 方法 说明
        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);
    

    • 特点:
      1. 浏览器地址栏路径不会变
      2. 只能转发到当前服务器内部资源中
      3. 转发是一次请求

共享数据