LEIZHANG ' s GitHub

JavaWeb学习

JavaWeb

一、基本概念

1.1 基本介绍

web开发:

  • web -- 网页
  • 静态web
    • html,css
    • 提供给所有人看,始终不会发生变化
  • 动态web
    • 淘宝
    • 根据不同的人展示不同的效果
    • 技术栈:Servlet/JSP、APS、PHP(最好语言 = =、)

Java中,动态web资源开发的技术统称为JavaWeb

软件架构:

  • C/S:客户端/服务器端

  • B/S:浏览器/服务器端

资源分类:

  • 静态资源:用户访问后一样(静态资源可以直接被浏览器解析)

    html,css,JavaScript

  • 动态资源:用户访问不一样(动态资源被访问后,需要转换为静态资源,再返回给浏览器)

    servlet,jsp,php,asp

网络通信三要素:

  • IP:电子设备在网路中的唯一标识
  • 端口:应用程序在计算机中的唯一标识符 0~65536
  • 传输协议:规定了数据传输的规则(tcp:安全协议,三次握手,速度稍慢。udp:不安全协议,速度慢)

1.2 web应用程序

  • 可以提供浏览器访问的程序
  • 一个web应用由多部份组成
    • html,css,js
    • jsp,servlet
    • java程序
    • jar包
    • 配置文件(Properties)
  • web应用程序填写完毕后,若想提供给外界访问:需要一个服务器来统一管理

1.3 静态Web

  • *.html... 若服务器一直存在,则直接可以访问到
  • 静态web存在的缺点

    web页面无法动态更新,所有用户看到的都是同一个页面

    • 轮番图,点击特效:伪动态

    • JavaScript

    • VBScript

    • 无法和数据库交互(数据无法持久化)

1.4 动态Web

  • 页面可以动态展示:“Web的页面因人而异”
  • 缺点

    加入服务器的动态web资源出现了错误,我们需要重新编写后台程序,重新发布

    停机维护

  • 优点

    web页面无法动态更新,所有用户看到的都不是同一个页面

    可以和数据库交互(数据可以持久化)

二、Web服务器

2.1 之前的技术

ASP

  • 微软:国内最早运行
  • HTML中嵌入了VB的脚本,ASP+COM
  • 页面特别乱,维护困难

JSP/Servlet

  • sun公司主推的B/S架构
  • 基于Java语言
  • 可以承载三高问题(高并发,高性能,高承载量)
  • 语法像ASP,加强市场强度

PHP

  • 开发速度快,功能强大、跨平台,代码简单
  • 无法承担大访问量的情况(局限性)

2.2 Web服务器

服务器是一种被动的操作,用来处理用户的一些请求,和给用户一些响应信息

IIS

webLogic

webSphere

JBOSS

Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,因为Tomcat 技术先进、性能稳定,而且免费,是目前比较流行的Web 应用服务器。

三、Tomcat

https://tomcat.apache.org/

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

3.1 Tomcat文件夹

  • bin:启动、关闭脚本文件
  • conf:配置
  • lib:依赖的jar包
  • logs:日志
  • webapps:存放网站

3.2 网站访问(面试)

  1. 输入域名,回车
  2. 检查本机hosts配置文件下有无域名映射
    1. 有,直接返回对应的ip地址
    2. 没有,去DNS服务器找,并返回结果

四、HTTP介绍

4.1 什么是Http

HTTP(超文本传输协议)是一个简单的请求-响应协议,它通常运行在TCP之上。

  • 文本:html,字符串,~,....
  • 超文本:图片,音乐,视频定位,地图....
  • 80

HTTPS:安全的

  • 403

4.2 两个时代

  • http 1.0
    • HTTP/1.0:客户端可以与服务器连接后,只能获得一个web资源,断开连接。
  • http 2.0
    • HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。

4.3 HTTP请求

Request URL: https://www.baidu.com/				请求地址
Request Method: GET								get/post方法
Status Code: 200 OK								状态码
Remote Address: 127.0.0.1:7890					Remote:远程
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8		语言
Cache-Control: max-age=0
Connection: keep-alive

1.请求行

  • 请求行中的方式
    • get(高效),一次请求,携带参数少,有限制
    • post(安全)

2.消息头

Accept: 						告诉浏览器,支持的数据类型
Accept-Encoding: 				支持的编码格式
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8		语言环境
Cache-Control: max-age=0		缓存控制
Connection: keep-alive			告诉浏览器,请求完成是断开还是保持连接
HOST							主机

GET 请求

  • form 标签 method=get
  • a 标签
  • link 标签引入 css
  • Script 标签引入 js 文件
  • img 标签引入图片
  • iframe 引入 html 页面
  • 在浏览器地址栏中输入地址后敲回车

POST请求

  • form 标签 method=post

4.4 HTTP响应

1.响应体

Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8		
Cache-Control: max-age=0
Connection: keep-alive
    
Refrush:刷新告诉客户端多久刷新一次
Location:让网页重新定位

2.响应状态码

  • 200:请求成功
  • 3xx:请求重定向(重定向:重新找新位置)
  • 4xx:找不到资源 404(资源不存在)
  • 5xx:服务器代码错误

五、Maven

https://mvnrepository.com/

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。

其核心思想是:约定大于配置

六、XML

可扩展标记语言标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言

可扩展:标签自定义,功能:存储数据

xml和html的区别:

  • xml标签都是自定义的,html标签是预定义。

  • xml的语法严格,html语法松散

  • xml是存储数据的,html是展示数据

七、Servlet

7.1 Servlet简介

  • Servlet是sun公司开发的一门动态web技术
  • Servlet是JavaEE规范之一。规范就是接口
  • Sun在这些API中提供了一个接口叫做:Servlet
  • Servlet是一个运行在服务器上的一个java小程序

JavaWeb三大组件

  • Servlet程序
  • Filter过滤器
  • Listener监听器

实现Servlet的方法

  • 编写一个类,实现Servlet接口,把开发好的java类部署到web服务器中

我们把实现了Servlet接口的Java程序叫做,Servlet

Servlet的方法

  • init() 方法

    init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。

    public void init() throws ServletException {
      // 初始化代码...
    }
    
  • service() 方法

    service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。

    每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

    public void service(ServletRequest request, ServletResponse response) 
          throws ServletException, IOException{
        
    }
    
  • doget() 方法

    GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。

    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        // Servlet 代码
    }
    
  • dopost() 方法

    POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。

    public void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        // Servlet 代码
    }
    
  • destroy() 方法

    destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。

    public void destroy() {
        // 终止化代码...
    }
    

7.2 Hello,Servlet

<dependencies>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2.1-b03</version>
    </dependency>
</dependencies>

Servlet接口 --- GenericServlet --- HttpServlet --- 我们自己的类只需要继承HttpServlet即可

package cn.imut.controller;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
    //get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("进入doGet方法");
        PrintWriter writer = response.getWriter();  //响应流
        writer.print("Hello,Servlet");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

<%--
  Created by IntelliJ IDEA.
  User: vipp
  Date: 2020/4/12
  Time: 18:20
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
    <h1>Hello,World</h1>
  </body>
</html>

7.3 Servlet执行原理

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

7.4 Servlet生命周期

  • Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程
  • Servlet 通过调用 init () 方法进行初始化。
    • Servlet 调用 service() 方法来处理客户端的请求。
    • Servlet 通过调用 destroy() 方法终止(结束)。
    • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

7.5 Servlet体系结构

Servlet -- 接口
|
GenericServlet -- 抽象类
|
HttpServlet -- 抽象类

  • GenericServlet:将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象

  • 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可

  • HttpServlet:对http协议的一种封装,简化操作

    • 定义类继承HttpServlet

    • 复写doGet/doPost方法

一般在实际项目开发中,都是使用继承 HttpServlet 类的方式去实现 Servlet 程序。

7.5 ServletConfig类

Servlet 程序的配置信息类,Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。

Servlet 程序默认是第一次访问的时候创建,ServletConfig 是每个 Servlet 程序创建时,就创建一个对应的 ServletConfig 对象

作用

  • 可以获取 Servlet 程序的别名 servlet-name 的值
  • 获取初始化参数 init-param
  • 获取 ServletContext 对象

八、ServletContext对象

Web容器在启动时,会为每一个web程序都创建一个对应的ServletContext对象,其代表的当前的web应用

ServletContext 是一个接口,它表示 Servlet 上下文对象 ,ServletContext 对象是一个域对象,在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁

域对象:是可以像 Map 一样存取数据的对象,叫域对象。这里的域指的是存取数据的操作范围,整个 web 工程。

8.1 共享数据

package cn.imut.controller;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/context")
public class ServletContextDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = "LEIZ";
        context.setAttribute("username", username); //将一个数据保存在了ServletContext中

        System.out.println("Hello");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

package cn.imut.controller;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/getServlet")
public class GetServletDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String username = (String) context.getAttribute("username");

        response.setContentType("text/html");
        response.setCharacterEncoding("utf-8");
        response.getWriter().println(username);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

8.2 获取初始化参数

<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
@WebServlet("/hello")
public class ServletContextDemo extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        response.getWriter().println(url);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

8.3 请求转发

8.4 读取资源文件

九、Request与Response

9.1 HttpServletRequest 类

作用

每次只要有请求进入 Tomcat 服务器,Tomcat 服务器就会把请求过来的 HTTP 协议信息解析好封装到 Request 对象中。 然后传递到 service 方法(doGet 和 doPost)中给我们使用。我们可以通过 HttpServletRequest 对象,获取到所有请求的 信息。

常用方法

请求转发

请求转发是指,服务器收到请求后,从一次资源跳转到另一个资源的操作叫请求转发。

9.2 HttpServletResponse 类

作用

HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传 递给 Servlet 程序去使用。

HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息, 我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置

输出流

只能使用一个!

请求重定向

请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说。我给你一些地址。你去新地址访问。叫请求 重定向(因为之前的地址可能已经被废弃)。

9.3 Web中的路径

  • 相对路径
  • 绝对路径

在实际开发中,路径都使用绝对路径,而不简单的使用相对路径。

十、Cookie

10.1 介绍

  • Cookie 翻译过来是饼干的意思
  • Cookie 是服务器通知客户端保存键值对的一种技术
  • 客户端有了 Cookie 后,每次请求都发送给服务器
  • 每个 Cookie 的大小不能超过 4kb

10.2 创建

public void createCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //1. 创建cookie对象
    Cookie cookie = new Cookie("key1", "value1");
    //2. 通知客户端保存cookie
    response.addCookie(cookie);
    response.getWriter().write("Cookie 创建成功");
}

10.3 服务器获取Cookie

Cookie工具类

package cn.imut.utils;

import javax.servlet.http.Cookie;

public class CookieUtils {
    public static Cookie findCookie(String name, Cookie[] cookies) {
        if(name == null || cookies == null || cookies.length == 0) {
            return null;
        }
        for (Cookie cookie: cookies) {
            if(name.equals(cookie.getName())){
                return cookie;
            }
        }
        return null;
    }
}
public void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

    Cookie[] cookies = req.getCookies();
    // getName方法 返回 Cookie的 key(名)
    // getValue方法 返回 Cookie的 value值
    for (Cookie cookie : cookies) {
        resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");
    }

    Cookie iWantCookie = CookieUtils.findCookie("key1", cookies);

    //如果不等于null,说明赋过值,也就是找到了需要的Cookie
    if (iWantCookie != null) {
        resp.getWriter().write("找到了需要的 Cookie");
    }
}

10.4 Cookie值的修改

方案一、

  • 创建一个要修改的同名(指的就是 key)的 Cookie 对象
  • 在构造器,同时赋于新的 Cookie 值
  • 调用 response.addCookie(Cookie)

方案二、

  • 先查找到需要修改的 Cookie 对象
  • 调用 setValue()方法赋于新的 Cookie 值
  • 调用 response.addCookie()通知客户端保存修改

10.5 浏览器中查看Cookie

10.6 Cookie生命控制

Cookie 的生命控制指的是如何管理 Cookie 什么时候被销毁(删除)

setMaxAge()

  • 正数,表示在指定的秒数后过期
  • 负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
  • 零,表示马上删除 Cookie

十一、Session会话

11.1 介绍

  • Session 就一个接口(HttpSession)
  • Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术
  • 每个客户端都有自己的一个 Session 会话。
  • Session 会话中,我们经常用来保存用户登录之后的信息。

11.2 创建Session和获取

**request.getSession() **

第一次调用是:创建 Session 会话

之后调用都是:获取前面创建好的 Session 会话对象。

**isNew()判断到底是不是刚创建出来的(新的) **

true 表示刚创建

false 表示获取之前创建

每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。

getId() 得到 Session 的会话 id 值。

11.3 Session域数据的存取

public void serAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getSession().setAttribute("key1", "value1");
    response.getWriter().write("向Session中保存了数据");
}

public void getAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Object attribute = request.getSession().getAttribute("key1");
    response.getWriter().write("从Session中获取出key1的数据是:", + attribute);
}

11.4 Session生命周期控制

publicvoidsetMaxInactiveInterval(intinterval)

设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。

  • 值为正数的时候,设定 Session 的超时时长。
  • 负数表示永不超时(极少使用)

publicintgetMaxInactiveInterval(): 获取 Session 的超时时间

publicvoidinvalidate() : 让当前 Session 会话马上超时无效。

Session 默认的超时时间长为 30 分钟。

因为在Tomcat服务器的配置文件web.xml中默认有以下的配置,它就表示配置了当前Tomcat服务器下所有的Session 超时配置默认时长为:30 分钟。

<session-config> 
    <session-timeout>30</session-timeout> 
</session-config
posted @ 2020-04-24 16:22  LEI_Z  阅读(300)  评论(0)    收藏  举报