JavaWeb学习笔记(一)

JavaWeb

事务

事务的基本操作

START TRANSACTION ----开始事物

COMMIT --手动提交

ROLLBACK --返回

保存临时数据,方式报错导致数据错误

如果不开启事物的话,Mysql回自动提交

查看事务的提交方式

SELECT @@autocommit //1->自动 0->手动 MySQL是自动提交 orcal是手动

修改事务的默认提交方式

set @@autocommit

事务的四大特征

1、原子性:要么同时成功,要么同时失败

2、持久性:当事物提交或回滚之后,数据库会持久保存数据

3、隔离性:多个事物之间,相互独立

4、一致性:事务操作前后,事务总量不变

事务的隔离级别

概念:多个数据相互独立,但是多个事务同时处理的话,会引发问题

存在问题:
  1. 脏读:一个事务,读取到另一个事务中没有提交的数据
  2. 虚读:同一个事务中,两次读取到的数据不一样
  3. 幻读:一个事务操作表中所有记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改
隔离界别:
  1. read uncommitted:读未提交
    • 产生的问题:脏读、虚读、幻读
  2. read committe:读已提交
    • 产生的问题:虚读、幻读
  3. repeatable read:可重复度(默认)
    • 产生:幻读
  4. serializable:串行化
    • 可以解决所有问题

查询隔离界别

  • select @@tx_isolation

设置隔离级别

  • set global transaction isolation level

SQL分类

  1. DDL:操作数据库和表
  2. DML:增删表中数据
  3. DQL:查询表中数据
  4. DCL:管理用户、授权

DCL操作

管理用户、授权

  1. 管理用户

    1. 增加用户

      CREATE USER ‘用户名’@‘主机名’ IDENTFIED BY ‘密码’

    2. 删除用户

      DROP USER ‘用户名’@‘主机名’

    3. 修改用户密码

      UPDAE USER SET PASSWORD = PASSWORD(‘新密码’) WHERE USER =‘用户名’

    4. 查询用户:

      –1.切换到mysql数据库

      USE myql

      –2.查询user表

      SELECT * FROM USER

      *通配符:%表示可以在任意主机使用用户登录数据库

  2. 权限管理:

    1. 查询权限

      SHOW GRANTS FOR ‘用户名’@‘主机名’

    2. 0授予权限

      grant 权限列表(逗号隔开) on 数据库名.表名 TO ‘用户名’@‘主机名’

    3. 撤销权限

JDBC

Java database connecttivity —>Java数据库连接

定义了操作所有关系型数据库的规则,及接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口(JDBC)编程,真正的代码时驱动jar包中的实现类

入门

  1. 导入驱动jar包

    1. jar包到bin下
    2. 右键—>add mid
  2. 注册驱动

    Class.forName(“com.sql.jdbc.Driver”)

  3. 获取数据库连接对象 Connection

    Connection conn = DriverManager.getConnection(url""…)

  4. 定义sql

    String sql = “updata account set balance = 500 where id =1”

  5. 获取执行sql语句的对象 Statement

    Statement stmt = conn.createStatement()

  6. 执行sql,接受返回结果

    int count = stmt.executeUpdata(sql);

  7. 处理结果

  8. 释放自愿

    stmt.close()

    conn.close()

详解各个对象

  1. DriverManager:驱动管理

    1. 注册驱动 -->告诉程序需要使用哪一个接口注册jar包
    2. 获取数据库对象
      • url 连接的路径(jdbc:mysql://ip:端口/数据库名称)
      • user 用户名
      • password 密码
  2. Connection:数据库连接

    获取执行sql的对象

    管理事务

    ​ 开启事务 setAutoCommit

    ​ 提交事务commit

    ​ 回滚事务rollback

  3. Statement:执行sql的对象

    1. boolean execute(String sql):可以执行任意的sql
    2. int executeUpdata(String sql):执行DML
    3. ResultSet executeQuery(String sql):执行DQL
  4. ResultSet:结果集对象,封装查询结果

    • boolean next() -->游标移动到下一行 (如果是最后一行返回false)

    • getXxx(参数):获取数据

      参数:

      • int : 编号 从1开始
      • String : 列名
    • 使用步骤

      1. 游标向下移动一行
      2. 判断是否有数据
      3. 获取数据
  5. PreoaredStatement:执行sql的对象

    1. SQL注入问题:在拼接sql时,有一些sql的特殊关键字参与字符串的对接。会造成安全性问题
    2. 解决sql注入问题:实用PreparedStatement对象来解决
    3. 预编译的SQL:参数实用?作为占位符

抽取JDBC工具类:JDBCUtils

  • 目的:简化书写
  • 分析
    1. 注册驱动也抽取
    2. 抽取一个方法获取连接对象
    3. 抽取一个方法释放资源

JDBC控制事务:

  1. 事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这多个步骤要么同时成功,要么同时失败
  2. 操作
    1. 开启事务
    2. 提交事务
    3. 回滚 事务
  3. 实用Connection对象来管理事务
    • 开启事务 setAutoCommit
    • 提交事务commit
    • 回滚事务rollback

数据库连接池

概念

其实就是一个容器(集合),存放数据库连接的容器

好处

  1. 节约资源
  2. 用户访问高效

实现

  1. 标准接口:DataSource javax.sqwl包下

    1. 方法:

      获取连接:getConnection()

      归还连接:如果连接对象Connection是从连接池获取的,那么调用Connection.close()方法,则不会关闭连接,而是归还连接

  2. 一般我们不去实现,由数据库厂商实现

    1. C3P0:数据库连接池技术
    2. Druid:数据库连接池实现技术,由阿里巴巴提供

C3P0:数据库连接池技术

步骤:

  1. 导入jar包
  2. 定义配置文件:
    • 名称:c3p0.properties 或者 c3p0-config.xml
    • 路径:直接将文件放在src目录下即可
  3. 创建核心对象 数据库连接池对象 ComboPooledDataSource
  4. 获取连接:getConnection

Druid:数据库连接池实现技术

步骤:

  1. 导入jar包

  2. 定义配置文件:

    • 是properties形式的
    • 可以叫任意名称,可以放在任意目录下
  3. 加载配置文件 properties

   Properties pro = new Properties()

   InputStream is == DruidDemo.class.getClassLoader().getResourceAsStream(name:"druid properties)

   pro.load(is)
  1. 获取连接池对象 DruidDataSourceFactory

  2. 获取连接 getConnection

Druid:工具类

Spring JDBC

Spring框架对JDBC的简单封装。提供了一个JDBCTemplate对象简化JDBC的开发

步骤:

  1. 导入jar包

  2. 创建JdbcTemplate对象。依赖于数据源DataSource

    JdbcTemplate template = new JdbcTemplate(ds);

  3. 调用JdbcTemplate的方法来完成CRUD的操作

    • updata():执行DML语句,增删改语句
    • queryFormap():查询结果 封装为map集合
    • queryForList():查询结果将结果封装为list集合
    • query():查询结果,封装为JavaBean对象
    • queryForObject:查询结果,将结果封装为对象

软件架构

JavaWeb:

  • 实用java语言开发基于互联网的项目

软件架构:

  • B/S架构:Browser/Server 浏览器/服务器端
    • 只需要一个浏览器,用户需要通过不同的网址(URL),客户访问不同的服务器端程序
    • 优点
      1. 开发、安装、部署、维护 简单
    • 缺点
      1. 如果应用过大,用户的体验可能会收到影响
  • C/S架构:Client/Server 客户端/服务端
    • 在用户本地有一个客户端程序,在远程有一个服务器程序
    • 如:QQ、迅雷…
    • 优点:
      1. 用户体验好
    • 缺点
      1. 开发、安装、部署、维护麻烦

B/S架构

  • 资源分类

    1. 静态资源

      实用静态网页开发技术法补的资源

      特点:

      • 所有用户访问,得到的结果是一样的
      • 如:文本,图片,音频,视频,HTML,CSS,JavaScript
      • 如果用户请求的是静态资源,那么服务器会直接将静态资源发送到浏览器,浏览器中内置了静态资源的解析引擎,可以展示静态资源
    2. 动态资源

      • 使用动态网页及时发布的资源
      • 特点:
        • 所有用户访问,得到的结果可能不一样
        • 如:jsp/servlet,php,asp…
        • 如果用户请求的是动态资源,那么服务器会执行动态资源,转换为静态资源,再发送给浏览器(浏览器只能解析静态资源)
  • 静态资源:

    • HTML:用于搭建网页,展示界面内容
    • CSS:用于美化界面,布局界面
    • JavaScript:用于实现动态效果
  • 网络通信三要素

    1. IP:电子设备在网络中的唯一标识
    2. 端口:应用程序在计算机中的唯一标识
    3. 传输协议:规定了数据传输的规则
      1. 基础协议:
        1. tcp:安全协议,三次握手,速度较慢
        2. udp:不安全协议,速度快

Bootstrap

  1. 概念:一个前端开发的框架

    • 框架:一个半成品的软件,开发人员可以在框架基础上,再进行开发,简化代码
    • 好处:
      1. 定义了很多css样式和js插件。开发人员可以直接使用这些样式和插件得到丰富的页面效果
      2. 响应式布局
        • 同一套界面可以兼容不同分辨率的设备
  2. 栅格系统

    步骤:

    • 定义容器。相当于table
      1. container:两边有留白
      2. container-fluid:100%宽度
    • 定义行。相当于之前的tr 样式:row
    • 定义元素。指定该元素再不同设备上,所占的格子数目。样式:col-设备代号-格子数目
      • 设备代号:
        1. xs:超小屏幕 手机
        2. sm:小屏幕 平板
        3. md:中等屏幕 桌面显示器
        4. lg:大屏幕 大桌面显示器
      • 注意:一行如果格子数目大于12个,超出部分会自动换行
      • 栅格类属性可以向上兼容,栅格类适用于屏幕宽度大于或等于分界点大小的设备
      • 如果真实设备宽度小于设置栅格类样式的设备代码的最小值,会占满一整行

事件

概念:某些组件被执行了某些操作之后,出发某些代码的执行

  • 事件:某些操作 如:单击,双击,键盘按下了,鼠标移动了
  • 事件源:组件。如:按钮 文本输入框
  • 监听器:代码
  • 注册监听:将事件,事件源,监听器结合在一起。当事件源上发生了某个事件,则触发执行某个监听器代码

常见的事件:

  1. 点击事件:

    1. onclick:单击事件
    2. ondblclick:双击事件
  2. 焦点事件

    onblur:失去焦点

    onfocus:获得焦点

  3. 加载事件

    onload:一张页面或一副图像完成加载

  4. 鼠标事件:

    1. onmousedown 鼠标按键被按下
    2. onmouseup 鼠标按键被松开
    3. onmousemove 鼠标被移动
    4. onmouseover 鼠标移到某元素上
    5. onmouseout 鼠标从某元素移开
  5. 键盘事件

    1. onkeydown 某个按键被按下
    2. onkeyup 某个按键被松开
    3. onkeypress 某个按键被按下后松开
  6. 选择和改变

    1. onchange 域的内容被改变
    2. onselect 文本被选中
  7. 表单事件

    1. onsubmit 确认按钮被点击
    2. onreset 重置按钮被点击

XML

概念

Extensible Markup Language 可扩展标记语言

  • 可扩展:标签都是自定义的
  • 功能
    1. 存储数据
      1. 配置文件
      2. 在网络中传输
  • xml与html的区别
    1. xml标签都是自定义的,html标签是预定义的
    2. xml语法严格,html语法松散
    3. xml存储数据,html展示数据

语法

  1. 文件名后缀.xml
  2. xml第一行必须定义为文档声明
  3. xml文档中有且仅有一个根标签
  4. 属性值必须使用引号(单双都可)引起来
  5. 标签必须正确关闭
  6. xml标签名称区别大小写

组成部分

  1. 文档声明

    1. 格式

    2. 属性列表:

      • version:版本号 1.1

      • encoding:编号方式。告知解析引擎当前文档使用的字符集,默认值:ISO-8859-1

      • standalone:是否独立

        取值:

        • yes:不依赖其他文件
        • no:依赖其他文件
  2. 指令(了解)

  3. 标签

    规则:

    • 名称可以包含字母、数字以及其他字符
    • 名称不能以数字或者标点符号开始
    • 名称不能以字母 xml (XML Xml等)开始
    • 名称不能含空格
  4. 属性

    id属性值唯一

  5. 文本

    CDATA区:在该区域中的数据会被原样展示

约束:规定xml文档的书写规则

  • 最为框架的使用者:
    1. 能够在xml中引入约束文档
    2. 能够简单的读懂约束文档
  • 分类:
    1. DTD:一种简单的约束技术
      • 内部:引入dtd文档到xml文档中
      • 外部:将约束的规则定义在外部的dtd文件中
        • 本地:
        • 网络:
    2. Schema:一种复杂的约束技术
      • 后缀名xsd
      • 可以约束具体格式

解析

操作xml文档,将文档中的数据读取到内存中

操作xml文档

  1. 解析(读取):将文档中的数据读取到内存中
  2. 写入:将内存中的数据保存到xml文档中。持久化的存储

解析xml的方法:

  • DOM:将标记语言加载进内存,在内存中形成一颗DOM树

    • 优点:操作方便,可以对文档进行CRUD的所有操作
    • 缺点:占内存
  • SAX:逐行读取,基于事件驱动

    • 优点:不占内存
    • 缺点:只能读取,不能增删改
  • xml常见的解析器:

    1. JAXP:sun公司提供的解析器,比较烂
    2. DOM4J:一款优秀的解析器
    3. Jsoup
    4. PULL:Android系统内置的解析器,sax方式
  • Jsoup的使用方式:

    • 导入jar包

    • 获取Document对象

      对象的使用:

      1. Jsoup:工具类,可以解析html或xml文档,返回Document

        parse:可以解析html或xml文档,返回Document

      2. Document:文档对象。代表内存中的dom树

        获取Element对象

        • getElementByid
        • getElementByTag
        • getElementByAttribute
        • getElementByAttributeValue
      3. Elements:元素Element对象的集合,可以当作Array

      4. Element:元素对象

        1. 获取子元素对象

          • getElementByid
          • getElementByTag
          • getElementByAttribute
          • getElementByAttributeValue
        2. 获取属性值

          attr(key) 根据属性名称获取属性值

        3. 获取文本内容

          text() 获取文本内容

          html() 所有内容

      5. Node:节点对象

    • 快捷查询方式:

      1. selector:选择器

        使用的方法:Elements select(String cssQuery)

        • 语法:参考selector类中定义的语法
      2. Xpath:XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言

        • 使用Jsoup的Xpath需要额外导入jar包

Web服务器软件

  • 服务器:安装了服务器软件的计算机,一般这种电脑配置高
  • 服务器软件:接受用户的请求,处理请求,做出响应
  • Web服务器软件
    • 在Web服务器软件中,可以部署Web项目,让用户通过浏览器来访问这些项目
    • web容器
  • java相关的常见的web服务器软件
    • webLogic:oracle公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费
    • webSphere:IBM公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费
    • JBOSS:JBOSS公司,大型的JavaEE服务器,支持所有的JavaEE规范,收费
    • Tomcat:Apache基金组织,中小型的JavaEE服务器,仅支持少量的JavaEE规范servlet/jsp,免费
  • JavaEE:Java语言在企业级开发中使用的技术规范的综合,一共规定了13项大的规范

Tomcat:web服务器软件

  • 注意安装目录不要有中文和空格

  • 文件目录

    • bin:可执行文件

    • conf:配置文件

    • lib:jar包

    • logs:日志文件

    • temp:临时文件

    • webapps:存放web项目

    • work:存放运行时梳理

  • 启动

    bin/startup.bat 双击运行

    访问:http://localhost:8080

    • 可能遇到的问题:
      1. 黑窗口一闪而过
        • 原因:没有正确配置Java_HOME
      2. 启动报错
        • 暴力:找到占用8080端口号,找到对应的进程,杀死
        • 温柔:修改自身的端口号
  • 关闭

    1. 正常关闭

      bin/shutdown.bat

      ctrl+c

    2. 强制关闭:点击窗口的关闭

  • 配置

    1. 部署项目的方式:

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

        • 访问路径----->虚拟目录
        • 简化部署:将项目打成war包,将war包放置到apps目录下,会自动解压缩
      2. 配置conf/server.xml文件(不安全)

        在标签体中配置

      3. 在conf/Catalina/localhost创建任意名称xml,虚拟路径就是文件的名称

  • 静态项目和动态项目:

    • 动态目录结构
      • java动态项目的目录结构
        • 项目的根目录
          • WEB-INF目录
            • web.xml:web项目的核心配置文件
            • classes目录:放置字节码文件的目录
            • lib目录:放置依赖的jar包

Servlet

概念

server applet 运行在服务器端的小程序

  • Servlet就是一个接口,定义了Java类被浏览器访问到(Tomcat识别)的规则
  • 将来自定义一个接口,实现Servlet接口,复写方法

快速入门(最基础的原理,后续不用这么麻烦)

  1. 创建Java EE项目

  2. 定义一个类,实现Servlet接口

    • public class ServletDemo1 implements Servlet
  3. 实现接口中的抽象方法

  4. 配置Servlet

    在web.xml配置

    ​ demo1

    ​ cn.itcast.web.servlet.ServletDemo1

    ​ demo1

    ​ /demo1

执行原理

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

Servlet生命周期方法

  1. 被创建:执行init方法,只执行一次

    • Servlet什么时候被创建

      • 默认情况下,第一次被访问时,Servlet被创建
      • 可以配置执行Servlet的创建实际
        • 在标签下配置
          1. 第一次被访问时,创建
            • 为负数
          2. 在服务器启动时,创建
            • 的值为0或正整数
    • Servlet的init方法只执行一次,说明一个Servlet在内存中只存在一个对象,Servlet是单例的

      • 多个用户同时访问时,可能存在线程安全问题
      • 因此尽量不要定义成员变量,即使定义了变量,也不要修改变量的值
  2. 提供服务:执行service方法,执行多次

    每次访问Servlet时,都会被调用一次

  3. 被销毁,执行destory方法,只执行一次

    • Servlet被销毁时候执行。服务器关闭的时候,Servlet被销毁
    • 如果异常关闭不会执行
    • 在Servlet销毁之前执行,用于释放资源

Servlet3.0(基础入门优化版)

  • 优势:

    支持注解配置,可以不需要web.xml

  • 步骤

    1. 创建JavaEE项目
    2. 定义一个类,实现Servlet接口
    3. 复写方法
    4. 在类上使用@WebServlet注解,进行配置
      • @WebServlet(“资源路径”)

IDEA和tomcat部署配置

  1. IDEA会为每一个tomcat部署的项目独立建立一份配置文件
  2. 工作空间项目和tomcat部署的web项目
    • tomcat真正访问的是“tomcat部署的web项目”,“tomcat部署的web项目”对应着“工作空间项目”的web目录下的所有资源
    • web-inf目录下的项目不能被浏览器直接访问
  3. 断点调试:受用debug启动

Servlet的体系结构

Servlet – 接口

​ |

GenericServlet – 抽象类

​ |

HttpServlet – 抽象类

  • GenericServlet:将Servlet接口中其他的方法默认空实现,将service()方法作为抽象
    • 定义Servlet类时,可以继承GennericServlet,实现service()方法即可
  • HttpSerlvet:对http协议的一种封装,简化操作(Servlet继承这个最简单)
    1. 定义类继承HttpServlet
    2. 复写doGet/doPost

相关配置

  1. urlpartten:Servlet访问路径
  2. 路径定义规则:
    1. /XXX
    2. /XXX/XXX
    3. *.XXX

HTTP

概念:Hyper Text Transfer Protocol超文本传输协议

  • 传输协议:定义了客户端和服务器端通信发送数据的格式
  • 特点:
    1. 基于TCP/IP的高级协议
    2. 默认端口号:80
    3. 基于请求响应模型,一次请求对应一次响应
    4. 无状态的:每次请求之间互相独立,不能交互数据
  • 1.0:每次请求响应都会建立新的连接
  • 1.1:复用连接

请求消息的数据格式

  1. 请求行

    请求方式 请求url 请求协议/版本

    Get /login.html HTTP/1.1

  2. 请求头

    请求头名称:请求头值

    Host:localhost

    • 常见的请求头:
      1. User-Agent:浏览器告诉服务器,使用的浏览器版本信息
      2. Referer:告诉服务器请求从什么地方来
        • 防盗链
        • 统计工作
      3. Connnection
  3. 请求空行

    空行,用于分割请求头和请求体

  4. 请求体

    封装POST请求参数。一个字符串,放请求的数据

请求方式

  • GET
    请求参数在请求行中,url后
    url长度有限制
    不安全

  • POST
    ​ 请求参数在请求体中

    ​ 请求的url长度没有限制

    ​ 相对安全

  • HEAD

    和Get请求相一致,只不过不会返回响应体,这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。(用于获取报头)

  • OPTIONS

    返回服务器对特定资源所支持的http的请求,可以用来向Web服务器发送请求来测试服务器的功能性

  • PUT

    向指定资源位置上传最新的内容

  • DELETE

    请求服务器删除

  • Request-URI

    所标识的资源

  • TRACE

    回显服务器收到的请求,主要用于测试或诊断

  • CONNECT

    HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

响应消息

服务端发送给客户端的数据

  • 相应行
    1. 组成:协议/版本 响应状态码 状态码描述
    2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的状态。
      1. 状态码都是3位数字
      2. 分类:
        1. 1xx:服务器接收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
        2. 2xx:成功
        3. 3xx:重定向,类似于转发。302重定向,304访问缓存
        4. 4xx:客户端错误。404请求路径没有对应的资源。405请求方式没有对应的doXXX方法
        5. 5xx:服务器端错误。500服务器内部出现异常
  • 响应头
    1. 格式:头名称:值
    2. 常见的响应头:
      1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
      2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
        1. 默认值:inline在当前页面打开
        2. attachment以附件形式打开响应体。文件下载
  • 响应空行
  • 响应体:传输的数据

后端回应请求流程

  1. tomcat服务器根据请求url中的资源路径,创建对应的Servlet的对象
  2. tomcat服务器,会创建request和response对象,request对象中封装请求消息数据
  3. tomcat将request和response两个对象传递给service方法,并且调用service方法
  4. 通过request对象获取请求消息数据,通过response对象设置响应消息数据
  5. 服务器给浏览器做出响应之前,会从response对象中拿程序员设置的响应消息数据

Request

  1. request对象和response对象的原理

    1. request和response对象是由服务器创建的。我们只是使用
    2. request对象是来获取请求消息,response对象是设置响应消息
  2. request

    1. 获取请求消息数据

      1. 获取请求行数据

        • GET url HTTP/1.1

        • 方法:

          1. 获取请求方式:GET String getMethod()
          2. 获取虚拟目录:String getContextPath()
          3. 获取servlet路径 String getServletPath()
          4. 获取get方式的请求参数 String getQueryString()
          5. 获取请求URI(虚拟目录+路径)
            • String getRequestURI()
            • String getRequestURL() 带上http
          6. 获取协议和版本号:String getProtocol()
          7. 获取IP地址:String getRemoteAddr()
      2. 获取请求头数据

        • String getHeader(String name):通过请求头的名称获取请求头的名
        • Enumeration getHeaderNames():获取所有的请求头名称
      3. 获取请求体数据

        只有POST请求方式才有请求体,在请求体中封装了POST请求的请求参数

        1. 获取流对象
          • BufferedReader getReader():获取字符输入流,只能操作字符数据
          • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
        2. 再从流对象中得到数据
    2. 其他功能:

      1. 获取请求参数通用方法

        1. String getParameter(String name)根据参数名获取参数值
        2. String[] getParameterValues(String name)根据参数名获取参数值的数组
        3. Enumeration gerParameterName():获取所有请求的参数名称
        4. Map getparameterMap():获取所有参数的map集合
        • 中文乱码问题:
          • get方式:tomcat 8以上不会乱码
          • post方式:会乱码
            • 在获取参数前设置获取参数的编码request.setCharacterEncoding(“utf-8”)
      2. 请求转发(forward):在服务器内部的资源跳转方式

        1. 步骤
          1. 通过request对象获取请求转发器对象:
          2. 使用RequestDispatcher对象进行转发
        2. 特点
          1. 浏览器地址栏路径不变
          2. 只能转发到当前服务器内部资源中
          3. 转发是一次请求(多个资源使用同一次请求)
      3. 共享数据

        • 域对象:一个可以在作用范围内共享数据的对象
        • request域对象:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
        • 方法:
          1. setAttribute(String name,Object obj):存储数据
          2. Object getAtritude(String name):通过键获取值
          3. void removeAttribute(String name):通过键移除键值对
      4. 获取ServletContext

        • ServletContext getServletContext()

BeanUtils

  1. 获取所有请求参数
    Map mao = req.getParameterMap()
  2. 创建User对象
    User loginUser = new User()
  3. 使用BeanUtils封装
    try{
    ​ BeanUtils.populate(loginUser,map);
    } catch (IllegalAccessException e){
    ​ e.printStackTrace()
    } catch{
    ​ e.printStackTrace()
    }
  • 用于封装JavaBean
    JavaBean:标准的Java类

    1. 要求
      1. 类必须被public修饰
      2. 必须提供空参的构造器
      3. 成员函数必须使用private修饰
      4. 提供公共setter和gatter方法
    2. 功能:封装数据
      概念:
    • 成员变量:
    • 属性:setter和getter方法截取后的产物
      方法:
    1. setProperty()
    2. getProperty()
    3. polutate():封装数据

Response

  • 功能:设置响应消息

    1. 设置相应行
      1. 格式:HTTP/1,1 200 ok
      2. 设置状态码:setStatus
    2. 设置响应头:setHeader(String name,String value)
    3. 设置响应体:
      使用步骤:
      1. 获取输出流
        • 获取字符输出流:PrintWriter getWriter()
        • 字节输出流:ServletOutputStream getOutputStream()
      2. 使用输出流,将数据传输到客户端浏览器
  • 重定向(redirect):资源跳转的方式

    代码实现:

    1. 设置状态码为302

      response.setStatus(302)

    2. 设置响应头location

      response.setHeader(“location”,“地址”)

    • 特点
      1. 地址栏发生变化
      2. 重定向可以访问其他站点(服务器)的资源
      3. 重定向是两次请求
  • 路径规则:判断定义的路径是给谁用的?判断请求将来从哪里发出

    • 从客户端浏览器使用:需要加虚拟目录(项目的访问路径)
      1. 虚拟目录动态获取:request.getContextPath()
      2. ,重定向…
    • 给服务器使用:不需要加虚拟目录
      1. 转发路径
  • 服务器输出字符数据到浏览器

    • response.setContentType(text/html;charset=utf-8")
    • PrintWriter pw = response.getWriter(); //获取流对象
    • pw.write(内容) //输出数据
  • 服务器输出字节数据到浏览器

    • response.setContentType(text/html;charset=utf-8")

    • ServletOutputStream so = response.getOutputStream(); //获取流对象

    • so.write("".getBytes(“uft-8”)) //输出数据

  • 验证码

    1. 本质:图片

    2. 目的:防止恶意表单注册

    3. 生成方式:

      1. 创建一对象,在内存中图片(验证码图片对象)

        BufferedImage image = new BufferedImage(width,height,BufferedImage.Type_INT_RGB)

      2. 美化图片

        1. 填充背景色Graphics g =image.getGraphsics();
        2. 设置画笔颜色setColor(color)
        3. 画背景色 g.filReact(x,y,width,height)
        4. 画边框 g.setcolor(color) g.drawRect(x,y,width-1,heigth-1)
        5. 画干扰线
        6. 画干扰点
        7. 写验证码 g.drawString(“ABC”,x,y)
      3. 将图片输出到页面展示

        ImageIO.write.(image,"jpg”,response.getOutputStream())

ServletContext

  1. 概念:代表整个web应用,可以和程序的容器来通信

  2. 获取:

    1. 通过request对象获取

      request.getServletContext();

    2. 通过HttpServlet获取

      this.getServletContext();

  3. 功能:

    1. 获取MIME类型

      • 在互联网通信过程中定义的一种文件数据类型
        • 格式:大类型/小类型 text/html image/jpeg
      • 获取:String getMimeType(String file)
    2. 域对象:共享数据

      1. SetAttribute(String name,Object value)
      2. getAttribute(String name)
      3. removeAttribute(String name)
      • ServletContext对象范围:所有用户所有请求的数据
    3. 获取文件的真实(服务器)路径

      1. 方法:String getRealPath(String path)

图片下载案例

  1. 获取请求参数,文件名称

    String filename = request.getParameter("filename")
    
  2. 使用字节输入流加载文件进内存

    1. 找到文件服务器路径

      ServletContext servletContext = this.getServletContext()
      Sring realPath = servletContext.getRealPath("/img/"+filename)
      
    2. 用字节流关联

      FileInputStream fis = new FileInputSream(realPath);
      
  3. 设置response响应头

    1. 设置响应头类型 content-type

      String mimeType = servletContext.getMimeType(filename);
      response.setHeader("content-type",mimeType)
      
    2. 设置响应头打开方式 Content-disposition

      response.setHeader("content-disposition","attachment;filename=" + filename)
      
  4. 将输入流的数据写到输出流

    ServletOutputStream sos = response.getOuputStream();
    byte[] buff = new byte[1024*8]
    int len = 0;
    while((len = fis.read(buff)) != -1){
    	sos.write(buff,0,len);
    }
    

你可能感兴趣的