JavaWeb之Tomcat与数据库

XML与Tomcat

XML:可扩展的标记语言

  • xml有什么用

    1. 可以用来保存数据
    2. 可以用来做配置文件
    3. 数据传输载体
  • 定义xml

    • 其实就是一个后缀位.xml的文件
    • 文档声明
    • 当xml中标签过多,内容中包含类似标签的文字不想被解析,可以使用CDATA符号
  • XML解析:其实就是获取元素里边的字符数据或者属性数据

    • xml解析方式:

      • DOM:整个xml读取到内存当中,形成树状结构。整个文档称之为document对象,属性对应Attribute对象,所有的元素节点对应Element对象,文本也可以称之为Text对象,以上所有对象都可以称之为Node节点,如果xml特别大,会造成内存溢出。可以对文档进行增删
      • SAX:Simple API for Xml 基于事件驱动。读取一行,解析一行。不会造成内存溢出。不可以增删,只能查询
    • xml解析的解决方案:jaxp、jdom、dom4j,dom4j是现在常用的

  • xml通过DTD或scheme来约束

Tomcat

  • 常用的服务器软件:Tomcat、Weblogic、Websphere

Http&Servlet

  • 抓包工具httpWatch

  • Http协议:针对网络上的客户端 与 服务器端在执行Http请求的时候,遵守的一种规范。其实就是规定了客户端在访问服务器的时候要带上什么东西,服务器返回数据的时候也要带上什么东西。

  • HTTP请求数据

    • 请求的数据包含三个部分:

      • 请求行(请求方式、请求路径、协议版本):post/examples/servlets/servlet/RequestParamExample HTTP/1.1

      • 请求头

        • Accept:客户端向服务器表示我能支持什么类型的数据
        • Referer:真正请求的地址路径,全路径
        • Accpt-Language:支持语言
        • User-Agent:用户代理 向服务器表明,当前来访的客户端信息
        • Content-type:提交的数据类型。经过URLEncoding编码的form表单数据
        • Accept-Encoding:gzip,deflate:压缩算法
        • Host:主机地址
        • Content-Length:数据长度
        • Connection:Keep-Alive 保持连接
        • Cache-Control:对缓存的操作
      • 请求体:浏览器发送给服务器的数据,就是请求参数

    • 服务器响应的数据

      • 响应行(协议版本、状态码):HTTP/1.1 200 ok

      • 响应头:

        • Server:服务器是哪一种类型。Apache tomcat
        • Content-type:服务器返回给客户端的内容类型
        • Content-length:返回的数据长度
        • Date:通讯的日期,响应的时间
      • 响应体

    • GET请求和POST请求的区别

      • 请求路径不同,get在请求地址后面跟上参数,post不跟,post使用流的形式写数据
      • get请求有安全隐患
      • get能够携带的数据有限,1kb左右,post是以流的形式写数据,所以数据大小没有限制

Web资源

  • 在HTTP协议中,规定了请求和响应双方,客户端和服务器端。与web相关的资源就是web资源
  • 静态资源:html、js、css
  • 动态资源:sevlet/jsp

Servlet

  • 其实就是一个java程序,运行在web服务器上,用于接收和响应客户端的请求。更多的是配合动态资源

  • 当然静态资源也需要servlet,只不过tomcat中已经定义好一个默认的DefaultServlet

  • Hello servlet

    • 新建web项目,新建类继承Servlet(servlet子类httpServlet)
    • 在web.xml配置Servlet,servlet-name和servlet-mapping
  • Servlet的生命周期

    • init:初始化方法,初次访问创建实例时调用,一个实例只会初始化一次

    • service:只要客户端来一个请求就执行

    • destroy:servlet销毁的时候,执行该方法,项目从服务器移除的时候,正常关闭服务器也执行

    • doGet和doPost不是生命周期方法

    • 让servlet实例创建的时机提前

                        ```  
      
      
      
      
      
      
      
      
      
    • ServletConfig获取servlet配置参数

    • servlet配置方式:

      • 路径匹配
      • 扩展名匹配
  • ServletContext

    • servlet上下文,每个web应用只有一个ServletContext

    • 作用

      • 获取全局配置参数(context-param)
      • 可以获取web中的应用资源
      • 存储数据,在servlet中共享数据
      • 作用范围在本项目整个项目中
    • ServletContext何时创建何时销毁

      • 服务器启动的时候,会为托管的每一个web应用创建一个ServletContext对象
      • 从服务器移出托管或者关闭服务器销毁
  • HttpServletRequest

    • 可以获取请求头信息

    • 获取协议,获取远程访问来的ip:

    • 获取客户端提交上来的数据:request.getParameter("name")

    • 请求中的乱码问题

      • 解决方案

        get请求过来的数据,在url地址栏已经编码了,tomcat收到数据默认使用ISO-8859-1来解码,指定为utf-8

        ​ username=new String(username.getBytes("ISO-8859-1"),UTF-8);

        POST请求在取数居前指定编码:request.setCharacterEncoding("utf-8");//设置请求体文字编码

  • HttpServletResponse

    • 负责返回数据给客户端

    • 以字节或字符流写数据到客户端

    • 响应数据乱码问题

      • 1.指定输出的时候使用utf-8编码:response.setcharacterEncoding("utf-8");
      • 2.直接规定浏览器查看数据使用的编码:response.setHeader("text/html;charset=UTF-8");
      • String 类的getBytes()默认使用的是UTF-8,tomcat默认是ISO-8859-1
      • response.setContentType("text/html;charset=UTF-8");//设置使用html文本类型,并使用UTF-8编码;不管是字节还是字符流使用这一行代码可以解决编码问题

Cookie和Session

  • 请求转发和重定向

    • response.sendRedirect("login_success.html");//返回码是302,是重定向,两次,可以跳转任意路径不是自己的也行
    • request.getRequestDispatcher("login_success.html").forward(request,responese);//返回码200,请求转发,一次,只能跳砖自己项目的资源;效率比重定向高一点
Cookie
  • 定义:是一份小数据,是服务器给客户端,并且存储在客户端上的一份小数据。

  • 应用场景:自动登录、浏览记录、购物车

  • 为什么有Cookie

    • 客户端与服务器在通讯的时候,是无状态的,其实就是客户端在第二次来访的时候,服务器根本就不知道这个客户端来访过没有。为了更好的用户体验,更好的交互(自动登录),也为了更好的收集用户习惯(大数据)
  • Cookie简单用法

    • Cookie cookie=new Cookie("aa","bb"); response.addCookie(cookie);//发送cookie给客户端
    • Cookie[] cookies=request.getCookies();//获取客户端带过来的Cookie
    • 可以给客户端多个Cookie
  • Cookie在没有设置有效期的情况下关闭浏览器它就没有了

    • cookie.setMaxAge(60607*24);//有效时间,以秒为单位,正数
  • 删除cookie:cookie.setMaxAge(0);

  • 由于cookie会保存在客户端上,所以有安全隐患,cookie的大小与个数有限制,为了解决这个问题,所以有Session

Session
  • 定义:是基于Cookie的一种会话技术,数据存放在服务器端
  • 调用request.getSession创建,服务器关闭后销毁,Session会话过期30分钟也会销毁
  • 会在cookie里面添加一个字段JSESSIONID,是Tomcat服务器生成
  • setAttribute,存数据,在浏览器关闭后还有
  • getAttribute:取数据
  • removeAttribute:移除数据
  • getSessionId:获取会话id
  • invalidate:强制让会话失效

JSP&EL&JSTL

<%@ page %>
  • language 表示页面支持java语言
  • content-type:表示是html文本,用utf-8编码
  • pageEncoding:jsp内容编码
  • extends:用于指定jsp翻译成java后继承的父类
  • import:导包使用
  • Session:值为true或false,用于指定是否可以在本页面直接使用Session对象
  • errorPage:页面错误跳转,错误页面用isErrorPage
JSP包含和请求转发
  • 包含:

        
    
            
    
         
  • 请求转发

           
    
      
    
      
    
      
    
      
    
      
    
      
    
      
JSP内置对象
  • 所谓内置对象就是我们可以直接在jsp使用这些对象,不用创建,四个作用域对象

  • "pageContext":此对象可以拿到其它八个对象

  • "request"

  • "session"

  • "application"

    以上四个是作用域对象,表示这些对象可以存值,它们的取值范围有限定。共同的方法:setAttribute和getAttribute

    pageContext在当前页面有效,request请求转发有效,重定向无效;作用域仅限于一次请求,只要服务器对该请求做出了响应,这个域中存的值就没有了;session仅限于一次会话当中;application整个工程都可以访问,服务器关闭就没有了

  • response:out和response一同使用,先输出response内容

  • out:out是放在response缓存区,先输出response本身的内容,然后输出out内容

  • config:ServletConfig

  • page:Object类型,是这个jsp翻译成java类实例的对象

  • exception:异常,是错误jsp页面有的对象

EL表达式
  • EL表达式是为了简化jsp代码,具体简化jsp里面的java代码

  • 使用EL表达式取出作用域中的值

    • ${pageScope.name}

    • ${requestScope.name}

    • ${sessionScope.name}

    • ${applicationScope.name}

    • 取出作用域中的数组(或集合):{array[1]},${array[2]}

    • 取出作用域中的map值:{map.age}

    • 在session中存储对象,使用EL表达式取出

            
            
            
            
            
            
        

        

        

        

        
  • EL表达式的11个内置对象

    • pageContext(JSP)
    • pageScope(作用域)
    • requestScope(作用域)
    • sessionScope(作用域)
    • applicationScope(作用域)
    • header(请求头)
    • headerValues(请求头)
    • param(请求参数)
    • paramValues(请求参数)
    • cookie
    • initParam(初始化参数)
JSTL
  • JSTL(Java Standard Tag Library),是一个不断完善的开放源代码的jsp标签库,是由apache的jakarta小组来维护的.

  • 它是用来简化jsp代码的,替换<% %>写法,一般与EL表达式配合

  • 需要用到jstl.jar和standard.jar两个库,使用时要在jsp引入taglib,需要引入1.1版本才支持EL表达式

    • <% taglib prefix="c" url="http://java.sun.com/jsp/jstl/core" %>
  • 常用标签

    • <\c:set>
    • 年龄大于16岁<\c:if>
    • ${i}<\c:forEach>
  • 代码演示:

                                                  
    
    
    
    
    
    
    
    
    
    
  • 事物的特性

    • 原子性:事物中包含的逻辑不可分割。
    • 一致性:事物执行的前后,数据的完整性保持一致。
    • 隔离性:事物执行期间不应该受到其它事物的影响。
    • 持久性:事物执行成功,数据应该持久保持到磁盘上。
  • 事物的安全隐患

    • 不考虑隔离级别会出现以下问题

      • 读:脏读、不可重读、幻读

        • 脏读:一个事物读到另外一个事物还未提交的数据。
        • 不可重读:一个事物读到了另外一个事物提交的数据,造成了前后两次查询的结果不一致。
        • 幻读:一个事物读到了另一个事物已提交的插入数据,导致多次查询结果不一致。
      • 写:

        • 丢失更新

          • B事物如果提交,导致A事物的修改没有了。
          • B事物回滚,也会造成A事物更新没有了。
        • 解决方法:

          • 悲观锁:select * from account for update;
          • 乐观锁:修改数据的时候同时修改数据库版本。其它事物修改的时候先比对数据库版本。
    • 隔离级别:
      select @@tx_isolation;//查看数据库隔离级别 set session transaction isolation level read committed;//修改隔离级别位读已提交

      • Read Uncommitted(读未提交):指一个事物读取到另外一个事物还未提交的数据。这就会引发脏读,读取到的数据是数据库内存中的数据,并非磁盘上的真正数据。引发脏读。
      • Read Committed(读已提交):只能读取到其它事物已经提交的数据,这会造成不可重复读;当有另外的事物操作数据并提交后,多次读取数据就会出现前后结果不一致。解决脏读,引发不可重复读。
      • Repeatable Read(重复读):Mysql默认的隔离级别就是这个,该隔离级别可以让事物在自己的会话中重复读取数据,并且不会出现结果不一样的状况,即使其它事物已经提交了,也依然显示以前的数据。解决脏读、不可重复读,引发幻读。
      • Serializable(可串行化):该事物级别是最高的事物级别了。比前面几种强大一点,可以解决以上问题,但是有缺点。谁先开启事物,谁就有先执行的权利,一个事物提交或回滚后另一个事物继续。会造成性能问题,效率比较低,用的少。

      mysql默认的隔离级别是可重复读,oracle默认的隔离级别是读已提交。

数据库连接池
  • 定义:数据库连接对象的创建比较销耗性能。一开始先在内存中开辟一块空间(集合),先往池子里放置多个连接对象,需要连接的话直接从池子里拿,不要自己去创建连接。使用完毕,要记得归还连接,确保连接对象能够循环利用。

  • 连接池使用步骤

    1. 创建10个连接
    2. 来的程序通过getConnection(list.remove(0))获取连接
    3. 用完之后归还连接(addBack()),使用装饰者模式和动态代理完善这一步
    4. 扩容
  • 使用c3p0实现数据库连接的配置

元数据
  • Meata data:描述数据的数据,String sql,描述这份sql字符串的数据叫做元数据

    • 数据库元数据:DataBaseMetaData
    • 参数元数据:ParameterMetaData
    • 结果集元数据:ResultSetMetaData

MVC设计模式

  • javaBean+jsp ;在jsp中写过多的java代码,维护起来会比较困难

  • Servlet+javaBean+jsp(MVC):分层,逻辑比较清楚,便于维护,扩展方便。小型项目用起来麻烦,会有过多代码。

    • M:model(模型层):封装数据JavaBean,数据的处理
    • V:View(视图层),JSP只专注于显示
    • C:Controller(控制层),Servlet接收页面的请求,找模型层处理,然后响应数据出去。
  • 三层架构

    • 客户端:前台应用程序
    • web层:Servlet/JSP,包含控制层和视图层
    • 业务逻辑层:Ejb会话层,JavaBean,归属于Model层
    • 数据访问层:Dao,归属于Model层
  • 简易型学生管理系统

    • 数据库创建

                                         create database stus;
      

use stus;
CREATE TABLE stu (
sid int(11) NOT NULL AUTO_INCREMENT,
sname varchar(20) DEFAULT NULL,
gender varchar(5) DEFAULT NULL,
phone varchar(20) DEFAULT NULL,
birthday date DEFAULT NULL,
hobby varchar(50) DEFAULT NULL,
info varchar(200) DEFAULT NULL,
PRIMARY KEY (sid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
* 创建web动态工程
* 导入需要的包
* c3p0-0.9.1.2.jar
* commons-dbutils-1.4.jar
* jstl.jar
* mysql-connector-java-5.1.7-bin.jar
* standard.jar
* 创建首页
* 创建入口servlet
* 根据数据库创建javaBean
* 创建c3p0.xml文件,建立数据库连接
* 创建数据库连接工具类
* 创建dao层从数据库查询数据
* 创建Service层
* Dao只针对单一的逻辑,数据操作层
* Service是业务层面
* 在Servlet层查询出所有学生;把查到的数据存储到作用域中,并跳转页面,在页面展示作用域中的数据
* 使用EL和JSTL表达式配合在jsp页面显示数据,在使用表达式时注意多空格会产生Property [sid] not found on type [java.lang.String]错误
* 页面添加数据的时候,爱好有多个值,可以使用request.getParamterValues("")取得数组操作
* 分页
* 物理分页:来数据库查询的时候只查询一页就返回了
* 优点:内存中的数据量不会太大
* 缺点:对数据库的访问频繁了一点
* 逻辑分页:一口气把所有的数据全部查出来,然后放置在内存中
* 优点:访问速度快
* 缺点:数据库量过大,内存溢出

你可能感兴趣的:(JavaWeb之Tomcat与数据库)