Java Web 学习

Java Web

1.基本概念

1.1 介绍

web开发:

  • web 网页的意思
  • 静态web
    • HTML,css
    • 提供给所有人看的数据始终不会发生变化
  • 动态web
    • 每个人看到的页面不同
    • 技术栈:Servlet/JSP,ASP,PHP

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

1.2 web应用程序

web应用程序:可以提供浏览器访问的程序

  • a.html,b.html…多个web资源,这些web资源可以被外界访问,对外界提供服务
  • URL
  • 统一的web资源会被放在同一个文件夹下
  • 一个web应用由多个部分组成
    • html,css,js
    • jsp,servlet
    • java程序
    • jar包
    • 配置文件(peoperties)

web应用程序编写完毕后,若想提供给外界访问:需要服务器来管理

2.web服务器

2.1 技术讲解

ASP:

  • 微软:国内最早流行的就是ASP
  • 在HTML中嵌套VB的脚本,ASP+COM
  • 在ASP开发中,基本一个页面就有几千行的业务代码
  • 维护成本高

PHP:

  • PHP开发速度很快,功能强大,跨平台,代码简单
  • 无法承受大访问量的情况

JSP/Servlet:

B/S:浏览器和服务器

C/S:客户端和服务器

  • sun公司主推的B/S架构
  • 基于JAVA
  • 可承受三高问题带来的影响(高并发,高可用,高性能)

2.2 web服务器

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

IIS

微软的 ASP…Windows自带的

Tomcat

​ Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。由于有了Sun 的参与和支持,最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

3.Tomcat

3.1 安装Tomcat

文件夹:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vztH53xR-1599700208887)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601153944270.png)]

3.2 启动Tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CB4YikB2-1599700208889)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601154120284.png)]

访问测试:http://localhost:8080/

面试题:

谈谈网站是如何进行访问的

  1. 输入一个域名,回车
  2. 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名的映射
    1. 有:直接返回对应的ip地址,这个地址中有我们需要访问的web程序,可以直接访问
    2. 没有:去DNS服务器找

4. Http

4.1 什么是HTTP

HTTP是一个简单的请求-响应协议,它通常运行在TCP之上。 80端口

HTTPS安全的 443端口

4.2 HTTP请求

  • 客户端-----发请求 (request)------ 服务器
// 通用
Request URL: https://cn.bing.com/  // 请求地址
Request Method: GET			// 请求方法
Status Code: 200    //状态码
Remote(远程) Address: 202.89.233.100:443 // 远程地址
accept-encoding: gzip, deflate, br   // 编码格式
accept-language: zh-CN,zh;q=0.9    // 语言
cache-control: max-age=0      // 缓存控制
  1. 请求行
  • 请求方式:GET,POST
    • GET:请求能够携带的参数比较少,大小有限制,会在URL栏显示参数数据内容,不安全,但高效
    • POST:请求能够携带的参数无限制,大小无限制,不会在URL栏显示参数数据内容,安全,不高效
  1. 消息头
Accept:告诉浏览器所支持的数据类型
Accept-Encoding 支持哪种编码格式
Accept-Langeage 语言环境
Cache-control 缓存控制
Connection 告诉浏览器,请求完成时断开还是连接

4.3 HTTP响应

  • 服务器----响应----客户端
Cache(缓存)-Control(控制): private
Connection: keep-alive    连接
Content-Encoding: gzip    //编码
Content-Type: text/html;charset=utf-8 // 类型

4.3.1 状态码

200:请求响应成功 200

3**:请求重定向

  • 重定向:你重新到我给你的新位置去

4**:找不到资源 404

  • 资源不存在

5**:服务器代码错误 500 502 :网关错误

常见面试题:

当你的浏览器中地址栏输入地址回车的一瞬间到页面能展示回来,经历了什么?

5. Maven

在javaweb开发中,需要使用大量的Jar包,需要手动导入

由此,Maven诞生了

5.1 Maven项目架构管理工具

目前用来方便导入jar包

Maven的核心思想:约定大于配置

Maven会规定好你该如何去编写我们的Java代码

5.2 下载Maven

官网:http://maven.apache.org/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p2mqxW28-1599700208891)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601164659535.png)]

5.3 配置环境变量

配置如下配置:

  • M2_HOME maven目录下的bin目录
  • MAVEN_HOME maven目录
  • 在系统path中配置 %MAVEN_HOME%\bin

在控制台测试

mvn -version

5.4 阿里云镜像

  • 镜像:mirrors
    • 作用:加速我们的下载
  • 国内建议使用阿里云的镜像
<mirror>
    <id>alimaven</id>
    <name>aliyun maven</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
    <mirrorOf>central</mirrorOf>        
</mirror>

5.5 本地仓库

在本地的仓库,远程仓库

建立一个本地仓库:

在C:\Program Files (x86)\Maven\apache-maven-3.6.3\conf\settings.xml文件中添加

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WjqeXVye-1599700208892)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601180714190.png)]

5.6 在IDEA中使用Maven

  1. 创建一个Maven web项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5GFJJZpH-1599700208894)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601181104589.png)]

  1. 创建组ID,和项目名称

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9Ga3PmU-1599700208896)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601181222963.png)]

  1. 选择Maven目录,settings配置文件路径,本地仓库路径

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jJ9wjRXj-1599700208897)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601181256423.png)]

  1. 等待Maven自动下载Jar包

5.7 创建一个普通的Maven项目

  1. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BLIuMIxX-1599700208898)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182019270.png)]

  2. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FlkQynlR-1599700208899)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182053704.png)]

  3. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ei7phXG7-1599700208901)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182210016.png)]

5.8 在IDEA中配置Tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ucg4VsO7-1599700208903)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182500061.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7KogMBeA-1599700208904)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182707752.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OdAkuuee-1599700208906)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601182731628.png)]

5.9 pom文件

pom.xml是Maven的核心配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tYimryaN-1599700208907)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200601183103839.png)]

5.10 Maven的问题

Maven由于他的约定大于配置,我们之可能碰到我们写的配置文件,无法被导出后生效的问题

解决方案:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

6 Servlet

6.1 Servlet简介

  • Servlet是sun公式开发的动态web的一门技术
  • sun在这些API中提供了一个接口叫做:Servlet
  • 开发一个Servlet程序
    • 编写一个类,实现Servlet接口
    • 把开发好的Java类部署到web服务器上

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

6.2 HelloServlet

Servlet接口sun公司有两个默认的实现类:HTTPServlet,GenericServlet

  1. 创建一个普通的Maven项目,删除src目录
  2. 导入所依赖的jar包
# Servlet依赖包
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
</dependency>
# JSP依赖包
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>jsp-api</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>
  1. 创建一个Model(模板)

    父子工程:

父工程中会有

<modules>
    <module>Servlet-01</module>
    <module>Servlet-01</module>
</modules>

子工程中有

<parent>
    <artifactId>Maven-02-Servlet</artifactId>
    <groupId>org.xu</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

父项目中的jar包子项目都可以使用

  1. 替换最新的web.xml
  2. 创建Java,resources目录
  3. 编写一个Servlet程序
    1. 编写一个普通类
    2. 实现Servlet接口,这里我们直接继承
package com.xu.servlet;

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

public class HelloServlet extends HttpServlet {
    // 由于get或者post只是请求实现的不同的方式,可以相互调用
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();
        writer.print("Hello Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}
  1. 编写Servlet的映射

    为什么需要映射:我们写的是Java程序,但需要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务器中注册我们写的Servlet,还需要给它一个浏览器能够访问的路径

    <!-- 注册Servlet-->
      <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.xu.servlet.HelloServlet</servlet-class>
      </servlet>
    <!--Servlet请求路径-->
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
    
  2. 配置Tomcat

  3. 启动测试

6.3 Servlet原理

Servlet是由Web服务器调用,web服务器在收到浏览器的请求后,会:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LhhbNyEt-1599700208940)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200603181901706.png)]

6.4 Mapping

  1. 一个Servlet可以指定一个映射路径
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>
  1. 一个Servlet可以指定多个映射路径
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello1</url-pattern>
</servlet-mapping><servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello2</url-pattern>
</servlet-mapping><servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello3</url-pattern>
</servlet-mapping><servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello4</url-pattern>
</servlet-mapping>
  1. 一个Servlet可以指定通用映射路径
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello/*</url-pattern>
</servlet-mapping>
  1. 指定一些后缀或者前缀
# *前面不能加项目映射的路径
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>*.xu</url-pattern>
  </servlet-mapping>
  1. 默认路径
<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
  1. 优先级问题

    指定了固有的映射路径优先级最高,如果找不到就好走默认的处理请求

6.5 ServletContext

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

6.5.1 共享数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wIzMkouU-1599700208942)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200604112026138.png)]

public class Context01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String name = "徐安康";    //数据
        context.setAttribute("name",name);  //添加一个键值对  将一个数据保存在servlet context
    }
}

public class Context02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String  name = (String) context.getAttribute("name");

        resp.setContentType("text/html");   //设置类型
        resp.setCharacterEncoding("utf-8"); //设置编码格式
        resp.getWriter().print(name);       //输出
    }
}
<servlet>
  <servlet-name>get</servlet-name>
  <servlet-class>com.xu.ServletContext.Context01</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>get</servlet-name>
  <url-pattern>/get</url-pattern>
</servlet-mapping>
  <servlet>
    <servlet-name>set</servlet-name>
    <servlet-class>com.xu.ServletContext.Context02</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>set</servlet-name>
    <url-pattern>/set</url-pattern>
  </servlet-mapping>

测试结果

6.5.2 获取初始化参数

public class Context03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");

        resp.setContentType("text");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print(url);
    }
}
<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql//localhost:3306/数据库?参数&amp;参数</param-value>
</context-param>

<servlet>
    <servlet-name>get2</servlet-name>
    <servlet-class>com.xu.ServletContext.Context03</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>get2</servlet-name>
    <url-pattern>/get2</url-pattern>
</servlet-mapping>

测试结果

6.5.3 转发请求

public class Context04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        // 转发到get2路径
        context.getRequestDispatcher("/get2").forward(req,resp);
    }
}
<servlet>
    <servlet-name>get3</servlet-name>
    <servlet-class>com.xu.ServletContext.Context04</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>get3</servlet-name>
    <url-pattern>/get3</url-pattern>
</servlet-mapping>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r237qkCb-1599700208944)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200604120316926.png)]

6.5.4 获取资源文件

Properites

  • 在Java目录下新建Properties
  • 在resources目录下新建Properties

发现:都被打包到了同一路径下:Classes

思路:需要一个文件流

public class Context05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream input = this.getServletContext().getResourceAsStream("/WEB-INF/classes/properties");
        Properties prop = new Properties();
        prop.load(input);
        String username = prop.getProperty("username");
        String pwd = prop.getProperty("password");

        resp.getWriter().print(username);
        resp.getWriter().print(pwd);
    }
<servlet>
    <servlet-name>get4</servlet-name>
    <servlet-class>com.xu.ServletContext.Context05</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>get4</servlet-name>
    <url-pattern>/get4</url-pattern>
</servlet-mapping>

6.6 HTTPServletRequest

HTTPServletRequest代表客户端的请求,用户通过HTTP协议访问服务器,HTTP请求中的所有信息会被封装到HTTPServletRequest,通过这个HTTPServletRequest的方法,获得客户端信息

获取前端数据

  • getParameter
  • getParmeterValues

6.7 HTTPServletResponse

web服务器接收到客户端的Http请求,针对这个请求,分别创建一个代表请求的HTTPServletRequest对象,代表响应的一个HTTPServletResponse;

  • 如果要获取客户端的请求过来的参数:找HTTPServletRequest
  • 如果要给客户端响应一些信息:找HTTPServletResponse

6.7.1 简单分类

负责向浏览器发送数据的方法

ServletOutputStream getOutputStream() throws IOException;

PrintWriter getWriter() throws IOException;

负责向浏览器发送响应头的方法

void setCharacterEncoding(String var1);

void setContentLength(int var1);

void setContentLengthLong(long var1);

void setContentType(String var1);

void addDateHeader(String var1, long var2);

void setHeader(String var1, String var2);

void addHeader(String var1, String var2);

void setIntHeader(String var1, int var2);

void addIntHeader(String var1, int var2);

常见应用

  1. 向浏览器输出东西 (之前使用的)
  2. 下载文件
public class Response extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取文件路径

        String realPath = "D:\\Idea Project\\Javaweb-02-Servlet\\Response\\src\\main\\resources\\1.png";
        System.out.println(realPath);
        // 获取文件名称 通过截取路径名获取文件名称
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
        // 设置浏览器支持的下载 设置下载文件名的编码
        resp.setHeader("Content-Disposition","attachment; filename="+URLEncoder.encode(realPath,"UTF-8"));
        // 获取输入流
        FileInputStream input = new FileInputStream(realPath);
        // 创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
        // 获取输出流
        ServletOutputStream outputStream = resp.getOutputStream();
        // 使用input写入缓冲区 使用outputStream输出给客户端
        while ((len = input.read(buffer)) > 0){
            outputStream.write(buffer,0,len);
        }
        // 关闭流
        outputStream.close();
        input.close();
    }
}
  1. 验证码实现
public class Image extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 使浏览器5秒刷新一次
        resp.setHeader("refresh","5");
        // 创建一个图片
        BufferedImage image = new BufferedImage(100,40,BufferedImage.TYPE_INT_RGB);
        // 得到图片
        Graphics2D g = (Graphics2D) image.getGraphics();
        // 设置图片的背景颜色
        g.setColor(Color.WHITE);
        g.fillRect(0,0,100,40);
        // 给图片写入参数
        g.setColor(Color.BLACK);
        g.setFont(new Font(null,Font.BOLD,30));
        g.drawString(makeNum(),20,20);

        resp.setContentType("image/png");
        ImageIO.write(image,"png",resp.getOutputStream());
    }

    /**
     * 获取随机数
     * @return 随机数字符
     */
    private String makeNum(){
        Random random = new Random();
        String  num = String.valueOf(random.nextInt(9999));
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < 4 - num.length();i++){
            sb.append("0");
        }
        num = sb.toString() + num;
        return num;
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  1. 实现重定向
public class Redirect extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // resp.setHeader("Location","/xu/down");
        // resp.setStatus(302);
        // 等价 原理
        resp.sendRedirect("/xu/down");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

重定向与转发的区别

相同点

  • 页面都会实现跳转

不同点

  • 转发,URL不会变化
  • 重定向,URL会发生变化

7. Cookie,Session

7.1 会话

会话:用户打开一个浏览器,点击多个超链接,访问多个web资源,关闭浏览器,这个过程可以称为会话

有状态的会话:你之前来过,下次再来,服务器会知道你,曾经来过,称为有状态会话

一个网站,怎么证明你来过?

客户端 服务端

  1. 服务端给客户端一个cookie,客户端下次访问服务器带上cookie就可以了
  2. 服务器登记你来过,下次你来的时候我来匹配你 seesion

7.2 保存会话的两种技术

7.2.1 cookie

  • 客户端技术(响应,请求)
  1. 从请求中拿到Cookie信息
  2. 从服务器响应客户端Cookie
req.getCookie()//获得cookie
cookie.getName()//获得cookie的key
cookie.getvalue()// 获得cookie的value
new Cookie("LastLoginTime",System.currentTimeMillis()+"")//新建一个Cookie
cookie.setMaxAge(24*60*60)//设置cookie的有效期
resp.addCookie()// 响应给客户端一个cookie

一个网站cookie是否存在上限

  • 一个cookie只能保存一个信息
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie
  • cookie大小有限制4KB
  • 300个cookie浏览器上限

删除cookie:

  • 设置有效期为0
  • 不设置有效期,关闭浏览器,自动失效

编码解码:

URLEncoder.encode("编码内容","UTF-8");
URLDecoder.decode("解码内容","UTF-8");

7.2.1 session

  • 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在session中

什么是Session:

  • 服务器会给每个用户(浏览器)创建一个Session对象
  • 一个session独占一个浏览器,只要浏览器没有关闭,这个session就存在
  • 用户登录之后,整个网站它都可以访问—> 保存用户的信息

常用方法:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0POzK27c-1599700208945)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200608155701030.png)]

Session与Cookie的区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
  • Session把用户的数据写到用户独占的Session中,服务端保存
  • Session对象由服务器创建

使用场景:

  • 保存一个登陆用户的信息
  • 保存购物车信息
  • 在整个网站中经常会用到的数据,保存在Session中
// 获得session
HttpSession session = req.getSession();
// 设置属性
session.setAttribute("name","徐安康");
// 获取sessionId
session.getId();
// 注销Session
session.invalidate();
// 移除一个属性
session.removeAttribute("name");

自动删除Session:配置web.xml

<session-config>
    <!--使Session30分钟后注销-->
    <session-timeout>30</session-timeout>
</session-config>

Cookie图解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f49FhCdT-1599700208947)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200608163249629.png)]

Session图解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dpvdlysn-1599700208948)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200608163410991.png)]

8. JSP

8.1 什么是JSP

Java Server Pages :Java服务器端页面,也和Servlet一样,用于动态Web技术

最大的特点:

  • 写JSP就像在写HTML
  • 区别
    • HTML只给用户提供静态的数据
    • JSP页面中可以嵌入JAVA代码,为用户提供动态数据

8.2 JSP原理

思路:JSP到底怎么执行的

  • 代码层面

  • 服务器内部工作

    • Tomcat中有一个work目录
    • 在IDEA中也会生成一个tomcat的work目录
    C:\Users\who\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\未命名_Javaweb-02-Servlet_2\work\Catalina\localhost\xu\org\apache\jsp
    

    发现页面转变为Java程序

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g0g7YcgM-1599700208948)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200611141000316.png)]

    浏览器想服务器发送请求,不管访问什么资源,其实都是在访问Servlet

JSP最终也会转换成Java类

JSP本质就是一个Servlet

// 初始化 
public void _jspInit() {
}
// 销毁
public void _jspDestroy() {
}
// JSPService
public void _jspService(final HttpServletRequest request, final HttpServletResponse response)
  1. 判断请求
  2. 内在对象
final javax.servlet.jsp.PageContext pageContext;	// 页面上下文
javax.servlet.http.HttpSession session = null;		// session
final javax.servlet.ServletContext application;		// appLicationContext
final javax.servlet.ServletConfig config;			// config
javax.servlet.jsp.JspWriter out = null;				// out
final java.lang.Object page = this;					// page:当前
  1. 输出对象前的操作
response.setContentType("text/html;charset=UTF-8");		// 设置响应的页面类型
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
  1. 以上的对象在JSP界面中可以直接使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kZVehu9u-1599700208950)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200608165628027.png)]

在JSP中只要是Java代码,会原封不动的输出

如果是HTML代码会使用out输出

8.3 JSP基础语法

JSP作为Java技术的一种应用,它拥有一些扩展的语法,Java所有语法都支持

8.3.1 JSP表达式

<%--JSP表达式
    作用:用来将程序的输出,输出到客户端
    <%= 变量或者表达式%>
--%>
<%= new Date()%>

8.3.2 JSP脚本片段

<%
    int sum = 0;
    for (int i = 1; i < 100; i++) {
        sum+=i;
    }
    out.print("<h1>sum = "+ sum + "</h1>");
%>

8.3.3 JSP声明

<%!
        static {
        System.out.println("JSP声明");
    }
    public void xu(){
        System.out.println("该方法在类下面");
    }
%>

JSP声明:会被编译到JSP生产的Java的类中,其他的会被生产到jspService方法中

8.4 JSP指令

<%@ page args....%>
<%@ include file = "" %>

8.5 9大内置对象

  • PageContext 存东西 保存的数据只在一个页面中有效
  • Request 存东西 保存的数据只在一次请求中有效,请求转发会携带这个数据
  • Response
  • Session 存东西 保存的数据只在一次会话中有效,从打开浏览器到关闭
  • Application (ServletContext) 存东西 保存的数据到服务器
  • Config (ServletConfig)
  • out
  • page 不用,只是在当前界面
  • exception

8.6 JSP标签、JSTL标签、EL表达式

需要导包


EL表达式:${}

  • 获取数据
  • 执行运算
  • 获取Web开发的常用对象

JSP标签:

<JSP:forward page = "转发页面">
    <%--转发所携带的属性--%>
	<JSP:param name = "name" value = "xu an kang"></JSP:param>
    <JSP:param name = "age" value = "12"></JSP:param>
</JSP:forward>

<JSP:include page = "要拼接的页面"></JSP:include>

JSTL表达式:

JSTL标签库的使用就是为了弥补HTML标签的不足,它自定义了许多的标签,可以供我们使用,标签的功能和Java一样

核心标签

需要导入标签库

<%--导入标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sg6nVJZO-1599700208951)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200614113922421.png)]

9. JavaBean

实体类

JavaBean有特定的写法:

  • 必须要一个无参构造
  • 属性必须私有化
  • 必须有对应的get/set方法

一般涌来和数据库的字段做映射 ORM

ORM:对象关系映射

  • 表---->类
  • 字段—>属性
  • 行记录---->对象

10. MVC三层架构

10.1 什么是MVC

Model View Controller 模型 视图 控制器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rRtvDv4c-1599700208952)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200615160418544.png)]

Model

  • 业务处理:业务逻辑(Service)

  • 数据持久层:CRUD(Dao)

View

  • 展示数据
  • 提供链接发起Servlet请求(a,form,img…)

Controller (Servlet):

  • 接收用户请求:(请求参数,Session信息)
  • 交给业务层处理对应的代码
  • 控制视图的跳转

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4pXZhghJ-1599700208953)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200615161027706.png)]

11. Filter

Filter:过滤器,用来过滤网站的数据

  • 处理中文乱码
  • 登录验证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IWySqs1I-1599700208954)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200615173110054.png)]

Filter开发步骤:

  • 导包

  • 编写过滤器

    • 导包为Servlet中的Filter

    • 编写Filter类

    • package com.xu.Filter;
      
      import javax.servlet.*;
      import java.io.IOException;
      // 导入的为Servlet.Filter类
      public class CharacterEncodingFilter implements Filter {
          //初始化:在web服务器开始的时候调用
          public void init(FilterConfig filterConfig) throws ServletException {
              System.out.println("初始化");
          }
      
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              servletRequest.setCharacterEncoding("utf-8");
              servletResponse.setCharacterEncoding("utf-8");
              servletResponse.setContentType("text/html;charset=UTF-8");
      
              // 必须要执行的代码 让请求可以往下走 如果不写,则请求不会传递给下一个
              filterChain.doFilter(servletRequest,servletResponse);
          }
          // 销毁:在web服务器关闭的时候调用
          public void destroy() {
              System.out.println("销毁");
          }
      }
      
  • 在web.xml中配置Filter

  • <filter>
            <filter-name>charset</filter-name>
            <filter-class>com.xu.Filter.CharacterEncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>charset</filter-name>
            <!--使Servlet下面的请求调用filter这个过滤器-->
            <url-pattern>/servlet/*</url-pattern>
        </filter-mapping>
    

12. 监听器

实现监听器的接口:有很多种接口

  1. 实现监听器接口
  2. web.xml中注册监听器

13. 过滤器常用应用

用户权限过滤:

  1. 用户登录,想session存放用户的数据
  2. 进入主页的时候需要判断用户是否已经登录,在过滤器中实现

14. SMBMS项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pWnGXIpi-1599700208955)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200617160837901.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8Ke0BHkF-1599700208956)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200618140217395.png)]

14.1 项目搭建

  1. 创建maven项目
  2. 配置Tomcat
  3. 导入JAR包
  4. 创建项目结构
  5. 编写实体类
  6. 编写基础公共类
    1. 数据库配置文件
    2. 编写数据库的公共类
    3. 编写字符编码过滤器
  7. 导入静态资源

14.2 登录功能的实现

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1gI5BGrb-1599700208957)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200620102832681.png)]

  1. 编写前端页面

  2. 在web.xml设置欢迎页(首页)

  3. 编写Dao层登录用户登录的接口

  4. 编写Dao接口的实现类

  5. 业务层接口

  6. 业务层实现类

  7. 编写Servlet

  8. 测试登录页面

登录功能优化(权限,登出)

登出:

删除Session,跳转到登录界面

权限:

设置过滤器,判断session中的值是否为空。过滤JSP下的所有请求

修改密码实现

  1. UserDao接口方法
  2. UserDao实现类
    1. 实现数据库密码修改方法
  3. Service接口
  4. Service实现类
    1. 处理修改密码业务
  5. 编写Servlet类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FOP7Iwa1-1599700208959)(%E7%AC%94%E8%AE%B0%E5%9B%BE%E7%89%87%E5%AD%98%E6%94%BE/image-20200702165037315.png)]

用户列表展示实现

  1. Dao层通过StringBuffer创建SQL
  2. 判断用户是否添加约束条件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值