JavaWeb学习

JavaWeb

一、基本概念

1.1 基本介绍

web开发:

  • web -- 网页
  • 静态web
    • html,css
    • 提供给所有人看,始终不会发生变化
  • 动态web
    • 淘宝
    • 根据不同的人展示不同的效果

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

软件架构:
  • C/S:客户端/服务器端

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

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

    ​ html,css,JavaScript

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

    ​ servlet,jsp,php,asp

网络通信三要素:
	IP:电子设备在网路中的唯一标识

​	端口:应用程序在计算机中的唯一标识符 0~65536

​	传输协议:规定了数据传输的规则(tcp:安全协议,三次握手,速度稍慢。udp:不安全协议,速度慢)

1.2 web应用程序

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://how2j.cn/k/tomcat/tomcat-tutorial/541.html#nowhere

3.1 网站访问(面试)

  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:服务器代码错误
    • 500
    • 502 网关错误

五、Maven

https://mvnrepository.com/

六、XML

6.1 概念:

Extensible Markup Language 可扩展标记语言

可扩展:标签自定义
功能:存储数据
xml和html的区别:
  1. xml标签都是自定义的,html标签是预定义。
  2. xml的语法严格,html语法松散
  3. xml是存储数据的,html是展示数据
语法:
基本语法:
  1. xml文档的后缀名 .xml
  2. xml第一行必须定义为文档声明
  3. xml文档中有且仅有一个根标签
  4. 属性值必须使用引号(单双都可)引起来
  5. 标签必须正确关闭
  6. xml标签名称区分大小写
组成成分:
  1. 文档声明
  2. 指令
  3. 标签
  4. 属性
  5. 文本
约束:
  1. 框架使用者
  2. 分类
  3. DTD
  4. Schema
解析:
  1. 操作xml文档
    1. 解析
    2. 写入
  2. 解析xml的方式
    1. DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
    2. SAX:逐行读取,基于事件驱动的
  3. xml常见的解析器
    1. JAXP
    2. DOM4J
    3. Jsoup
    4. PULL

七、Servlet

7.1 Servlet简介

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

JavaWeb三大组件

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

实现Servlet

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

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

7.2 Servlet执行原理

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

7.3 Servlet生命周期

  • Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:

    • Servlet 通过调用 init () 方法进行初始化。
    • Servlet 调用 service() 方法来处理客户端的请求。
    • Servlet 通过调用 destroy() 方法终止(结束)。
    • 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
  • 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.4 Servlet体系结构

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

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

    • 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
  • HttpServlet:对http协议的一种封装,简化操作

    1. 定义类继承HttpServlet
    2. 复写doGet/doPost方法

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

7.5 ServletConfig类

Servlet 程序的配置信息类

Servlet 程序和 ServletConfig 对象都是由 Tomcat 负责创建,我们负责使用。

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

作用

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

web.xml

<?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">

    <!-- servlet标签: 给Tomcat配置servlet配置-->
    <servlet>
        <!-- servlet-name标签: Servlet 程序起一个别名(一般是类名)-->
        <servlet-name>HelloServlet</servlet-name>
        <!-- 一般为servlet程序的全类名-->
        <servlet-class>cn.imut.controller.HelloServlet</servlet-class>
    </servlet>

    <!-- servlet-mapping: 给servlet程序配置访问地址-->
    <servlet-mapping>
        <!-- servlet-name: 告诉服务器,我当前配置的地址给哪个servlet程序使用-->
        <servlet-name>HelloServlet</servlet-name>
        <!--
            url-pattern 标签配置访问地址
                / 斜杠在服务器解析时,表示地址为:http://ip:port/工程路径        
        -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

7.6 ServletContext类

介绍
  • ServletContext 是一个接口,它表示 Servlet 上下文对象

  • 一个 web 工程,只有一个 ServletContext 对象实例。

  • ServletContext 对象是一个域对象。

  • ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁

域对象

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

作用
  • 获取 web.xml 中配置的上下文参数 context-param

  • 获取当前的工程路径,格式:/工程路径

  • 获取工程部署后在服务器硬盘上的绝对路径

  • 像 Map 一样存取数据

八、Request与Response

8.1 HttpServletRequest 类

作用

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

常用方法
请求转发

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

8.2 HttpServletResponse 类

作用

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

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

输出流

只能使用一个!

请求重定向

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

8.3 Web中的路径

  • 相对路径
  • 绝对路径

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

九、JSP(略)

9.1 概念:

Java Server Pages: java服务器端页面

可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码用于简化书写!!!

9.2 原理

JSP本质上就是一个Servlet

9.3 JSP的脚本

JSP定义Java代码的方式

<% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。

<%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。

<%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。

9.4 JSP的内置对象

在jsp页面中不需要获取和创建,可以直接使用的对象

jsp一共有9个内置对象。

学习3个:

request

response

out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似

response.getWriter()和out.write()的区别:

在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。

response.getWriter()数据输出永远在out.write()之前

十、EL表达式(略)

10.1 EL表达式介绍

EL 表达式的全称是:Expression Language。是表达式语言。

10.2 EL表达式作用

EL 表达式主要是代替 jsp 页面中的表达式脚本在 jsp 页面中进行数据的输出。

因为 EL 表达式在输出数据的时候,要比 jsp 的表达式脚本要简洁很多。

<body> 
    <%
		request.setAttribute("key","值");
	%> 
    表达式脚本输出 key 的值是: 		 			           		 		<%=request.getAttribute("key1")==null?"":                      request.getAttribute("key1")%><br/> 
	EL 表达式输出 key 的值是:${key1} 
</body>
  • EL 表达式的格式是:${表达式}

  • EL 表达式在输出 null 值的时候,输出的是空串。

  • jsp 表达式脚本输出 null 值的时候,输出的是 null 字符串

10.3 EL表达式搜索域数据的顺序

EL 表达式主要是在 jsp 页面中输出数据。

主要是输出域对象中的数据。
当四个域中都有相同的 key 的数据的时候,EL 表达式会按照四个域的从小到大的顺序去进行搜索,找到就输出。

十一、JSTL

11.1 介绍

JSTL 标签库 全称是指 JSPStandardTagLibrary JSP 标准标签库。是一个不断完善的开放源代码的 JSP 标 签库。

EL 表达式主要是为了替换 jsp 中的表达式脚本,而标签库则是为了替换代码脚本。这样使得整个 jsp 页面 变得更佳简洁

11.2 组成

....

注:前后端分离的时代,jsp了解即可,重在思想

十二、Cookie

12.1 介绍

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

12.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 创建成功");
}

12.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");
    }
}

12.4 Cookie值的修改

方案一、
  • 创建一个要修改的同名(指的就是 key)的 Cookie 对象
  • 在构造器,同时赋于新的 Cookie 值
  • 调用 response.addCookie(Cookie)
方案二、
  • 先查找到需要修改的 Cookie 对象
  • 调用 setValue()方法赋于新的 Cookie 值
  • 调用 response.addCookie()通知客户端保存修改

12.5 浏览器中查看Cookie

12.6 Cookie生命控制

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

setMaxAge()

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

十三、Session会话

13.1 介绍

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

13.2 创建Session和获取

request.getSession()

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

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

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

true 表示刚创建

false 表示获取之前创建

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

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

13.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);
}

13.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

十五、Listener监听器

事件监听机制

  • 事件 :一件事情

  • 事件源 :事件发生的地方

  • 监听器 :一个对象

  • 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码

十六、JSON

16.1 介绍

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。

JSON 采用完全独立于语言的文本格式,而且很多语言都提供了对 json 的支持(包括 C, C++, C#, Java, JavaScript, Perl, Python 等)。这样就使得 JSON 成为理想的数据交换格式。

json 是一种轻量级的数据交换格式。
轻量级指的是跟 xml 做比较。
数据交换指的是客户端和服务器之间业务数据的传递格式。

16.2 JSON在JavaScript中的使用

定义

json 是由键值对组成,并且由花括号(大括号)包围。每个键由引号引起来,键和值之间使用冒号进行分隔, 多组键值对之间进行逗号进行分隔。

var jsonObj = {
    "key1": 12,
    "key2": "abc",
    "key3": true,
    "key4": [11, "arr", false],
    "key5": {
        "key5_1": 551,
        "key5_2": "key5_2_value"
    },
    "key6": [
        {
            "key6_1_1": 6611,
            "key6_1_2": "key6_1_2_value"
        },
        {
            "key6_2_1": 6621,
            "key6_2_2": "key6_2_2_value"
        }
    ]
};
访问
  • json 本身是一个对象。
  • json 中的 key 我们可以理解为是对象中的一个属性。
  • json 中的 key 访问就跟访问对象的属性一样: json 对象.key
alert(typeof(jsonObj));         // object json就是一个对象
alert(jsonObj.key1);            //12
alert(jsonObj.key2);            // abc
alert(jsonObj.key3);            // true
alert(jsonObj.key4);            // 得 到 数 组 [11,"arr",false] //
//json 中 数 组 值 的 遍 历
for(var i = 0; i < jsonObj.key4.length; i++) {
    alert(jsonObj.key4[i]);
}
alert(jsonObj.key5.key5_1);     //551
alert(jsonObj.key5.key5_2);     //key5_2_value
alert( jsonObj.key6 );          // 得 到 json 数 组
//取 出 来 每 一 个 元 素 都 是json对 象
var jsonItem = jsonObj.key6[0]; 
alert( jsonItem.key6_1_1 );     //6611
alert( jsonItem.key6_1_2 );     //key6_1_2_value
常用方法
  • 对象形式存在:json对象
  • 字符串形式存在

一般我们要操作 json 中的数据的时候,需要 json 对象的格式。

一般我们要在客户端和服务器之间进行数据交换的时候,使用 json 字符串。

  • JSON.stringify(): 把 json 对象转换成为 json 字符串
  • JSON.parse() :把 json 字符串转换成为 json 对象

16.3 JSON在Java中的使用

javaBean和json的互转
public void test1() {
    Student student = new Student(1,"磊爷");
    Gson gson = new Gson();

    //toJson方法 :将java对象转换为json字符串
    String studentJsonString = gson.toJson(student);
    System.out.println(studentJsonString);

    //fromJson把json字符串转换回java对象(json字符串,Java对象类型)
    Student student1 = gson.fromJson(studentJsonString,Student.class);
    System.out.println(student1);
}
List与json的互转,map与json的互转同理

十七、AJAX请求

17.1 介绍

AJAX 即“Asynchronous Javascript And XML”(异步 JavaScript 和 XML),是指一种创建交互式网页应用的网页开发 技术。

ajax 是一种浏览器通过 js 异步发起请求,局部更新页面的技术。
Ajax 请求的局部更新,浏览器地址栏不会发生变化

局部更新不会舍弃原来页面的内容

17.2 原生AJAX请求

17.3 jQuery中AJAX请求

猜你喜欢

转载自www.cnblogs.com/yfyyy/p/12554262.html