XML与Tomcat
XML:可扩展的标记语言
-
xml有什么用
- 可以用来保存数据
- 可以用来做配置文件
- 数据传输载体
-
定义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, "Liberation Mono", 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, "Liberation Mono", 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, "Liberation Mono", 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[1]},${array[2]}
取出作用域中的map值:{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, "Liberation Mono", 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表达式
- <% taglib prefix="c" url="http://java.sun.com/jsp/jstl/core" %>
-
常用标签
- <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=" {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, "Liberation Mono", 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, "Liberation Mono", 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默认的隔离级别是读已提交。
-
数据库连接池
定义:数据库连接对象的创建比较销耗性能。一开始先在内存中开辟一块空间(集合),先往池子里放置多个连接对象,需要连接的话直接从池子里拿,不要自己去创建连接。使用完毕,要记得归还连接,确保连接对象能够循环利用。
-
连接池使用步骤
- 创建10个连接
- 来的程序通过getConnection(list.remove(0))获取连接
- 用完之后归还连接(addBack()),使用装饰者模式和动态代理完善这一步
- 扩容
使用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("")取得数组操作
* 分页
* 物理分页:来数据库查询的时候只查询一页就返回了
* 优点:内存中的数据量不会太大
* 缺点:对数据库的访问频繁了一点
* 逻辑分页:一口气把所有的数据全部查出来,然后放置在内存中
* 优点:访问速度快
* 缺点:数据库量过大,内存溢出