美文网首页
JavaWeb之Tomcat与数据库

JavaWeb之Tomcat与数据库

作者: 进击的大东 | 来源:发表于2018-11-08 13:23 被阅读12次

    XML与Tomcat

    XML:可扩展的标记语言

    • xml有什么用

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

      • 其实就是一个后缀位.xml的文件
      • 文档声明<? version='1.0' encoding='UTF-8' ?>
      • 当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实例创建的时机提前

                          ```  <pre spellcheck="false" class="md-fences md-end-block contain-cm modeLoaded" lang="" style="box-sizing: border-box; white-space: normal; font-family: Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 0.9em; display: block; break-inside: avoid; text-align: left; overflow: visible; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(223, 226, 229); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">
        
        <textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="box-sizing: border-box; color: inherit; font: inherit; position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea>
        
        
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;"> <load-on-startup>2</load-on-startup><!--值越小初始化越早,一般从2开始不写负数,tomcat默认的servlet使用1--></pre>
        
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;"></servlet></pre>
        
        </pre> 
        
        
      • 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包含和请求转发
    • 包含:

          <pre spellcheck="false" class="md-fences md-end-block contain-          
         cm modeLoaded" lang="" style="box-sizing: border-box; white-  
         space: normal; font-family: Consolas, &quot;Liberation 
         Mono&quot;, Courier, monospace; font-size: 0.9em; display: block; 
        break-inside: avoid; text-align: left; overflow: visible; background- 
       image: inherit; background-position: inherit; background-size: 
       inherit; background-repeat: inherit; background-attachment: inherit; 
       background-origin: inherit; background-clip: inherit; background- 
      color: rgb(248, 248, 248); position: relative !important; border: 1px 
      solid rgb(223, 226, 229); border-radius: 3px; padding: 8px 1em 6px; 
      margin-bottom: 15px; margin-top: 15px; width: inherit;">
      
              <textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="box-sizing: border-box; color: inherit; font: inherit; position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea>
      
          <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;"><jsp:include page="other.jsp"><jsp:include></pre> </pre> 
      
    • 请求转发

             <pre spellcheck="false" class="md-fences md-end-block contain-cm modeLoaded" lang="" style="box-sizing: border-box; white-space: normal; font-family: Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 0.9em; display: block; break-inside: avoid; text-align: left; overflow: visible; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(223, 226, 229); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 15px; width: inherit;">
      
        <textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="box-sizing: border-box; color: inherit; font: inherit; position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea>
      
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;"><jsp:forward page="oter.jsp"></pre>
      
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;"> <!--页面转发携带参数--></pre>
      
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;"> <jsp:param value="北京" name="address" /></pre>
      
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;"></jsp:forward></pre>
      
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">request.getRequestDispatcher("other.jsp").forward(request,response);</pre>
      
        </pre>
      
    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[0]},{array[1]},${array[2]}

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

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

    <pre spellcheck="false" class="md-fences md-end-block contain-cm modeLoaded" lang="" style="box-sizing: border-box; white-space: normal; font-family: Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 0.9em; display: block; break-inside: avoid; text-align: left; overflow: visible; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(223, 226, 229); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 0px; width: inherit;">
    
                <textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="box-sizing: border-box; color: inherit; font: inherit; position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea>
    
                <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">//存储对象到session</pre>
    
                <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;"><%</pre>
    
                <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;"> User user=new User("zhangsan",14);</pre>
    
                <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;"> session.setAttribute("u",user);</pre>
    
                <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">%></pre>
    
            <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">//EL判断空</pre>
    
            <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">¥{empty u}</pre>
    
            <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">//使用EL取出</pre>
    
            <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">${u.name} ,${u.age}</pre>
    
            </pre></code>
    
    • 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表达式

    • 常用标签

      • <c:set><\c:set>
      • <c:if\ test="${age>16}">年龄大于16岁<\c:if>
      • <c:forEach begin="1" end="10" var="i" step="2" >${i}<\c:forEach>
      • <c:forEach var="user" items=" {list} " >{user.name}<\c:forEach>

    事物&数据库连接池&DBUtils

    事物(Transaction):事物就是指一组操作,里边包含许多个单一的逻辑
    • 为了确保一个完整的逻辑执行成功,所以有了事物。例如银行转账需要两条数据都执行成功才算成功,否则就失败

    • 命令行演示事物

      • 数据库默认是自动提交的,先关闭自动提交

                                            <pre spellcheck="false" class="md-fences md-end-block contain-cm modeLoaded" lang="" style="box-sizing: border-box; white-space: normal; font-family: Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 0.9em; display: block; break-inside: avoid; text-align: left; overflow: visible; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(223, 226, 229); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 0px; width: inherit;">
        
        <textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="box-sizing: border-box; color: inherit; font: inherit; position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea>
        
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">show variables like '%commit%';//查看自动提交的状态</pre>
        
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">set autocommit = off;//关闭自动提交</pre>
        
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">start transaction;//开启事物</pre>
        
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">rollback;//事物回滚,事物结束,数据回到最初状态</pre>
        
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">commit;//事物提交,事物结束,数据写到磁盘</pre>
        
        <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">​</pre>
        
        </pre></code>
        
    • 代码演示:

                                                    <pre spellcheck="false" class="md-fences md-end-block contain-cm modeLoaded" lang="" style="box-sizing: border-box; white-space: normal; font-family: Consolas, &quot;Liberation Mono&quot;, Courier, monospace; font-size: 0.9em; display: block; break-inside: avoid; text-align: left; overflow: visible; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(223, 226, 229); border-radius: 3px; padding: 8px 1em 6px; margin-bottom: 15px; margin-top: 0px; width: inherit;">
      
      <textarea autocorrect="off" autocapitalize="off" spellcheck="false" tabindex="0" style="box-sizing: border-box; color: inherit; font: inherit; position: absolute; bottom: -1em; padding: 0px; width: 1000px; height: 1em; outline: none;"></textarea>
      
      <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">//默认的连接事物是自动提交的</pre>
      
      <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">conn.setAutoCommit(false);//关闭自动提交</pre>
      
      <pre class=" CodeMirror-line " role="presentation" style="box-sizing: border-box; white-space: pre-wrap; font-family: inherit; break-inside: avoid; padding: 0px 4px; border-radius: 0px; border-top-width: 0px; border-right: none; border-bottom-width: 0px; border-left-width: 0px; background: 0px 0px; font-size: inherit; margin: 0px; overflow-wrap: break-word; color: inherit; z-index: 2; position: relative; overflow: visible; word-break: normal; width: inherit;">//事物正常执行提交,异常就回滚.</pre>
      
      </pre>
      
    • 事物的特性

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

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

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

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

          • 丢失更新

            • 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与数据库

          本文链接:https://www.haomeiwen.com/subject/qjfwxqtx.html