JavaWeb之Tomcat与数据库

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("")取得数组操作
* 分页
* 物理分页:来数据库查询的时候只查询一页就返回了
* 优点:内存中的数据量不会太大
* 缺点:对数据库的访问频繁了一点
* 逻辑分页:一口气把所有的数据全部查出来,然后放置在内存中
* 优点:访问速度快
* 缺点:数据库量过大,内存溢出

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,304评论 1 92
  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 926评论 0 0
  • 今日心情欠安。中午没休息加班赶均衡的材料。高估了自己的工作效率和身体状况,一日下来到傍晚五点左右人已经废了。所以心...
    罗西西阅读 180评论 0 0
  • 1.上传工具类的使用 2.实现单文件上传 3. 实现多文件上传 4.动态选择多文件上传 5.上传文件要注意以下几点...
    峰子1994阅读 254评论 0 1
  • 第一次来这个城市,可能是20年前,第一个一个人来这个城市,可能是五年前。昨天晚上又是独自一人,坐着熟悉的那趟车,来...
    崔小菲阅读 1,489评论 0 0