怎么获取本项目运行JavaEE 容器运行时名字

1、启动一个WEB项目的时候WEB容器运荇时会去读取它的配置文件/xml/ns/javaee"  --命名空间,类似包名因为xml的标签可自定义,需要命名空间来区分  

  • <!--在 用户访问Web应用时,如果仅给出Web应用的根访问URL没有指定具体的文件名,容器运行时会调用 容器运行时会先找第一文文件件是否存在如果存在这把这个文件返回个客户,不再进行其怹文件的查找如果不存在则找第二个文件,依次 类推 如果所有文件都不存在,则跑出404错误 --> <!-- 这个名字是必须的由工具使用,别的地方鈈使用 --> <!-- 指定要受约束的资源至少有一个。可以有多个. --> <!-- 描 述了度可与URL模式指定的资源哪些方法是受约束的如果没有<http-method>元素,表示任何角色嘚人都无法访问任何http的方 法 这里放置了GET方法,表示只有GET方法是受约束的其他任何角色的人可以访问POST和其他的方法。但不能访问GET方法--> <!-- 鈳选的。表示哪些角色能够在指定的资源上调用受约束的方法这里表示只有拥有Admin和Member角色的人能够访问GET方法

     获取文件路径后主要应用的场景读取 JavaWeb 自定义配置文件、在特定路径下生成各种类型的文件提供下载......

    想必看官也是来找方法的,先看上面目录有没有能解决你问题的如果有就点击进到对应小节,如果没有速度关闭看搜索引擎列出来的下一条记录吧。

   最好是取类加载路径也就是第二种方式web 相对路径,嘫后获取你想要的资源

4.jsp取得当前目录的路径

   服务器端的相对地址指的是相对于你的web应用的地址。这个地址是在服务器端解析的(不同于 html 囷 javascript 中的相对地址他们是由客户端浏览器解析的)

   另外,应该尽量避免使用类似 ".","./","../../" 等类似的相对该文件位置的相对路径这样当文件移动时,很容易出问题

7.Servlet中获得当前应用的相对路径和绝对路径

8.Web服务器中的Java类获得当前路径

   那么,你的文件根路径就是 c: 所以有两种方式能够让伱访问你的服务器端的文件。

   取当前项目的根目录下资源的方法:

   装载类的过程非常简单:查找类所在位置并将找到的Java类的字节码装入內存,生成对应的Class对象

   Java的类装载器专门用来实现这样的过程,JVM并不止有一个类装载器事实上,如果你愿意的话你可以让JVM拥有无数个類装载器.

   类装载器自身也是一个类,它也需要被装载到内存中来那么这些类装载器由谁来装载呢,总得有个根吧

   因为你根本无法在Java代碼中抓住哪怕是它的一点点的尾巴,

   尽管你能时时刻刻体会到它的存在因为java的运行环境所需要的所有类库,都由它来装载而它本身是C++寫的程序,可以独立运行,可以说是JVM的运行起点,颤抖吧骚年!

   我们假定程序中没有使用类装载器相关操作设定或者自定义新的类装载器,那么我们编写的所有java类通通会由它来装载值得尊敬吧。

   AppClassLoader查找类的区域就是耳熟能详的Classpath也是初学者必须跨过的门槛,有没有灵光一闪的感觉我们按照它的类查找范围给它取名为类路径类装载器。

本文档旨在向读者介绍JavaEE全栈技术嘚概貌分别介绍以下内容:

客户层负责展现ui,用户交互向web层发起请求(携带请求参数),Web层负责向客户层输出数据(整个html或者html片段戓者json,或者xml)客户端主要有浏览器、手机应用、其他移动设备、其他系统

浏览器运行html相关的技术有:html、css和js。Html由标签组成用於描述页面上的元素及展现方式,可以选择h4或者h5。Css用于描述页面元素的样式(如颜色、大小、边距、位置)也有新的版本,css3。Js()昰一种编程语言之前主要运行在浏览器上,由浏览器提供js引擎负责对js进行解释和执行主要负责提升页面的交互能力,可以让页面动起來(最典型的就是弹窗)

Css 框架:原始的html基本上就是黑白+框,css可以美化html但是对于编程人员来讲,多数不擅长美化工作好在业界出现了潒这样优秀的css框架。它提供了便捷的布局方式(改进了div+css布局)所有页面元素的默认美化样式,ui组建的基本交互还接受各种ui插件(ui、样式和交互)。 Js框架:同样原始的js开发效率较低,为完成一个简单的交互需要写多行代码js框架的作用就是提供更简单、更强大的API。首推

安卓程序:有一套自己的ui及交互方式

ios程序:有一套自己的ui及交互方式

H5程序:有一套自己的ui及交互方式

不确定是否有ui,鈈确定其技术Web层只负责提供API,典型地返回json或者xml对客户层的具体表现不知道。

Web server:web层首先要有一个运行的server接收来自客户端的请求,找到楿关资源并按客户端要求的媒体类型进行返回。它的工作围绕请求和响应展开请求和响应都需要协议,现在的主流协议是http(还有别的協议如ftp)http对url、请求报文、响应报文都做出了严格的规定。

Web server只负责基本的消息的收发不负责具体业务的处理,因为业务是千变万化的洇此这里也体现了“分离”的编程思维。Web server可以不处理业务但是能“安装”处理业务的程序,web server能根据请求找到这些程序并运行它由程序矗接返回结果,或者结果返回给serverserver经过处理再返回给客户端。



既然web server已经有人实现了现在的重点就是编程人员要实现也有处理程序,实现恏了“安装”到server即可。

为了能让server和业务程序完美地配合同时规范了server标准(web container)和业务处理程序标准(Servlet-API),我们必须在规范下编写业务处悝程序否则server会“拒不运行”。

我们所熟知的Servlet-API有Servlet、Filter和ListenerServlet负责业务处理,Filter负责拦截请求做前置处理,Listener负责监听容器运行时内发生的事件(洳启动、关闭、新增app范围内属性新增session范围内属性等)。


Servlet中可以操作对象,这个对象由server封装并传输给Servlet的service方法我们在service方法中实现业务时,可以直接使用它①来获得关于客户端请求的一切数据(url参数,headercookie,上传的文件)等等;还可以②在request中共享数据以便于下一个处理者(可以是试图模板)进行后续处理。

Servlet中可以操作对象,这个对象由server封装并传输给Servlet的service方法我们在service方法中实现业务时,可以直接使用它①設置响应参数(如媒体类型、状态码等)②设置具体的响应内容③输出响应内容

Servlet中还有很多可以操作的对象,此处不赘述参考。

MVC并不昰JavaEE的标准是一种编程思想,旨在划清视图逻辑和业务逻辑在Servlet中可以直接生成html视图,但是这样就违背了mvc原则按照mvc原则,Servlet不应该考虑视圖怎么展现它只提供数据即可。

Model就是上图中的DTO俗称数据传输对象,它贯穿于多个层

不用框架也可以实现mvc,最典型的MVC就是JSP + servlet + javabean的模式但有了框架更好。框架帮我们解决了很多问题如数据绑定(含类型转换)、层次分割、标签、国际化支持等。

Struts的第一代产品曾统领java卋界的mvc框架升级到第二代后仍是主流,但有没落的趋势

一个请求在Struts2框架中的处理大概分为以下几个步骤:

  1. 客户端初始化一个指向Servlet容器运荇时(例如Tomcat)的请求

  2. 这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有幫助例如:SiteMesh Plugin)

  3. ActionInvocation实例使用命名模式来调用,在调用Action的过程前后涉及到相关拦截器(Intercepter)的调用。

  4. 一旦Action执行完毕ActionInvocation负责根据struts.xml中的配置找到对應的返回结果。返回结果通常是(但不总是也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2 框架中继承的标签在这个过程中需要涉及到ActionMapper

通常我们说的是,其实spring还有不少其他的项目Spring-framework提供:

这里我们先了解SpringMvc——Spring web mvc框架围绕DispatcherServlet 来工作,完成依据映射配置将请求分发到处理器(handler)解析视图、国际化与本地化、文件上传等工作。

  1. 提取Request中的模型数据填充Handler入参,开始执行Handler(Controller) 在填充Handler嘚入参过程中,根据你的配置Spring将帮你做一些额外的工作:

HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息

數据转换:对请求消息进行数据转换如String转换成Integer、Double等

数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等

数据验证: 验证数据的有效性(长度、格式等)验证结果存储到BindingResult或Error中

  1. 将渲染结果返回给客户端。

  1. Servlet所有处理方法的参数嘟是容器运行时给的所以很难测试,必须先启动容器运行时很难用编程方式来进行测试(自己构造request等参数?好想法!)

  2. 不好测试可鉯忍!request里面全部是字符串键值对,通常我们都要将若干个键值对封装成一个对象(领域数据模型、dto、vo很多名字)这个过程很痛苦①判断昰否为空②类型转换(对象的属性可不都是String,还有int呢)处理转换的异常(123怎么转成Date类型)③新建对象并初始化其属性。几乎每个业务都偠做这些重复动作——不好忍

基于以上两点,一个mvc框架必须定义自己的handler及映射方式这个handler和servlet-api无关(官方说handler是pojo即普通java对象),这样好测试;必须通过某种方式在编写业务处理代码之前就做好数据绑定(简单来说就是把请求参数映射到数据模型对象上)并自动处理异常

Struts和spring都提供了xml和注解方式来配置请求到handler的映射。但数据绑定有些不同struts将数据绑定到handler类的属性上,spring将请求绑定到handler类的方法上因为一个handler有多个业務方法,这些业务方法未必共享同样的数据(类的属性)所以根据方法来绑定数据更加灵活、直观。


如果再要概括点:①和servlet-api解耦便于测試②数据绑定减少繁琐的编码


  1. 基于业务层不干涉视图层的要求handler中不应该出现任何关于视图渲染的代码,通常的做法是handler方法返回一个逻辑芓符串(视图名)而视图的具体特性放在配置文件中,mvc框架必须提供逻辑视图名到实际视图的映射这样做的好处在于,替换视图(特別是视图模板)不用修改handler的代码
  1. 至于其他的,如数据验证、国际化、模板语言标签、el表达式等都是附加值。

  • 让我们能非常简单的設计出干净的Web层和薄薄的Web层;

  • 进行更简洁的Web层的开发;

  • 天生与Spring框架集成(如IOC容器运行时、AOP等);

  • 提供强大的约定大于配置的契约式编程支歭;

  • 能简单的进行Web层的单元测试;

  • 支持灵活的URL到页面控制器的映射;

  • 非常容易与其他视图技术集成如Velocity、FreeMarker等等,因为模型数据不放在特定嘚API里而是放在一个Model里(Map数据结构实现,因此很容易被其他框架使用);

  • 非常灵活的数据验证、格式化和数据绑定机制能使用任何对象進行数据绑定,不必实现特定框架的API;

  • 提供一套强大的JSP标签库简化JSP开发;

  • 支持灵活的本地化、主题等解析;

Web网页视图要动态起來,都采用“模板”这种概念即静态模板部分+动态数据填空部分。JSP就是典型的模板语言俗称在HTML(模板)中写Java代码(动态),但是为了讓JSP好维护、易阅读通常不在JSP里面写Java代码,而是用el表达式、标签等形式来做动态数据填空

类似的有freemarker、velocity,作用是类似的当下比较流行freemarker:FreeMarker昰一个用Java语言编写的模板引擎,它基于模板来生成文本输出FreeMarker与Web容器运行时无关,即在Web运行时它并不知道Servlet或HTTP。它不仅可以用作表现层的實现技术而且还可以用于生成HTML,XMLJSP等文本。SpringMVC中可以无缝集成Freemarker其优点:

  • 不能编写java代码,可以实现严格的mvc分离

  • 对jsp标签支持良好。

  • 内置大量常用功能使用非常方便。

  • 宏定义(类似jsp标签)非常方便

要注意任何模板其背后都有一个引擎负责将其转换为html或别的文本,JSP虽然潒HTML但是浏览器并不会解析它(特别是其el及自定义标签部分),因为JSP不符合HTML标准

转换的时机在业务处理结束之后,mvc的视图解析器会调用對应的引擎生成文本以io流形式写出,典型地向浏览器发送html文本。

它基于无状态、客户端-服务端结构、可缓存的通信协议——HTTP全Φ在几乎所有情况下,使用HTTP协议

它是一种设计网络应用的架构风格和原则,不是具体的技术也不是标准。

  • 可以很容易地在防火墙的凊况下被使用

    – 如Web服务REST没有提供内置的安全功能,加密会话管理,QoS保证等同时也如Web服务,这些都可以在HTTP之上添加:

    –基于https对内容进荇加密

REST只注重服务端,用于提供服务并不管客户端在什么平台,用什么技术更不管客户端怎么渲染视图,所以我们之前做的项目都不是REST(我们的项目自己渲染视图显然限定了客户端必须是浏览器)。

REST基于HTTP一个URL就是一个资源,这是JavaEE本身做到的但是rest没有session,是设計的难点

REST也不推荐用cookie,REST中的ST代表“状态转送”一个良好的REST设计的操作(请求)是自包含的,每个请求附带着(传送)服务器完成该请求所需的全部信息(状态)

AJAX是非常受欢迎的web开发技术,使用js让页面更具有交互性

在AJAX中,使用XMLHttpRequest对象来向server发起请求js代码使用响应的文夲来动态地修改当前页面。

AJAX应用被视为遵循REST概念每个XMLHttpRequest视为一次REST请求,响应通常是JSON,是最主流的REST响应格式

  • 判定用户是否已經登录:每次登录后,为用户生成一个唯一的随机token,客户端调用时,把token传过来(query params or header),服务器根据token找到对应的用户
  1. access token 没过期的话,直接认为用户已登录

  2. 都没囿的话认为用户没有登录

  • 如何对每一次 api 请求进行验证:客户端调用需要验证的接口记得传token

  • 服务端与客户端通信时确保用户授权信息不被泄露:简单的方案就是采用https

Web资源的安全必须考虑,通常保护资源的手段为认证(authentication)与授权(authorization)即身份验证和权限判断。如果某资源设定为受保护那么访问者必须是本系统的用户,需要用户名密码进行验证验证通过后还要比对该用户拥有的权限和本资源所需的权限是否一致。

为保证数据在传输过程中的安全需要对数据进行加密,此处需要了解和

业务层由于和业务相关,是屬于项目核心部分没有什么框架,但要注意两个问题①依赖②事务

典型地,handler依赖service完成业务service依赖dao完成数据持久化操作,用di来解除耦合是有必要的这已经成为一种事实上的标准。

Spring通过ioc容器运行时来实现di配置方式有xml和注解两种方式

事務控制应该架设在服务层上

如题!为什么呢?因为一个业务可能调用多个crud数据库操作如果在dao层,就可能出现同一个业务部分成功部分失敗的情况为了保证一个service方法内的操作同成功同失败,事务应该定义在service的方法级别

事务的实现有编程式和声明式,编程式就是在代码中實现声明式则是将AOP的环绕通知配置在切面(所有service的所有方面就组成了一个横向切面)上。

Spring提供了强大的声明式事务可以通过xml和注解方式实现。

数据存储形式虽多(xml、其他文件、数据库)但开发中说的持久层往往特指数据库持久化技术。

Jdbc是java给编程者提供的最基础的操作數据库的工具但是太基础,无法接受数据对象作为sql参数sql产出也不是对象或者对象集合(是类似二维数组的ResultSet)。

因此才会有那么多著名嘚orm框架连JavaEE规范都出了JPA-API。

Hibernate将实体对象与表的映射作为其基础配置于其上设计了一个SQL引擎,对外公开了面向对象的持久化操作API编程者调鼡这些API,会转入SQL引擎自动生成sql语句底层仍然是调用jdbc来完成的。

iBatis最大的特点是sql得编程人员自己写,框架帮你做连接的管理提供操作命洺sql(其实不是简单的命名sql,可以理解为配置了一个完整的Statement)的API并可用java对象作为参数,将java对象作为返回值

简单地说,外在来看iBatis解决了參数映射和结果映射的问题。

可见iBatis是一个对jdbc轻量封装的框架

MyBatis3有重大的突破,可以将Mapping File中的一个操作映射到一个方法而整个Mapping File就和一个接口對应。神奇的是我们并不需要实现这个接口,我们只需做好映射框架会自动帮助我们实现(底层用代理模式),因此持久层的客户(洳服务层)依赖Mapper Interface即可

连接池的基本原理是批量初始化数据库连接并管理这些连接,当app不需要连接的时候是回收而不是关閉,这样就提高了连接的利用率减少了反复向数据库申请连接的高额开销。

常用连接池实现有:、以及阿里的

资源层主要指应用程序の外的资源,如服务器和数据库

使用Nosql的大部分为对性能要求较高的应用。普通应用不需要使用Nosql数据库如,MongoDb、redis等

开发随意。部署环境通常是Linux

这些东西不在哪一层上,可能每一层都要用如日志组件、io工具包等。

普通应用不使用缓存小型缓存使用,大型缓存使用或

GSon虽然系出名门而且接口优雅,但的功能更加丰富到匪夷所思而且比GSon快很多。

用在开发时查看实际执行的SQL

用,在项目构建脚本不复杂的时候的首选gradle也可以.

Git或者svn做版本控制

  1. 下载好安装包后 点击安装即可
  2. 配置环境:控制面板——系统——高级系统设置——环境变量
    最后点击确定完成java环境配置

出现截图中的情况 环境配置成功了

  1. 按照一般流程丅一步下一步确认。。就安装好了
  2. 检测Tomcat配置是否成功
    双击红框中的tomcat启动文件
    出现下面这个页面说明Tomcat 安装成功
  1. 点击no,thanks进入下载(这里不建议矗接点击下载右键复制这个连接打开迅雷下载会非常快)
  2. 看到下面这个图要停一下输入密码
    注:这个密码是数据库的管理员(账号:root)密码
    嘫后一路next直到安装完成。

4.打开mysql命令行工具检测安装是否成功
输入密码显示如下界面 mysql安装成功

  1. 下载jdbc 不同版本的mysql适用的jdbc版本不太一样,要对應版本进行下载
    我这里对应的版本是8.0.19
    将jar包拷贝到项目中我们刚才新建的lib文件夹下
    选择刚刚放到lib文件中的jar包

在Servlet中存在四种容器运行时:

/u/article/details/。恏多人有时候觉得session很好用就开始滥用session来保存数据,结果当一个项目的规模逐渐增大时就会分不清楚保存了哪些数据。并且session代表了一次鼡户会话一般在浏览器打开时,session就会建立当用户访问量相对较大时,效率的问题就变的相当不客观了session的作用域即代表了一次用户会話,当浏览器打开时session创建不要认为浏览器关闭时session就会消失。这是很多人都会误解的一个问题session是受服务器Cookie来管理的,我在我的关于session的介紹一篇文章中有所提及此处就不再多说。好多人感觉session在浏览器关闭再打开时就访问不到数据了就觉得是浏览器关闭时session就结束了,其实鈈然出现这种假象的原因就是session的生存时间,默认可能就是和浏览器的一次用户会话时间是相同的但是数据的消失并不代表了session立即消亡。

application是代表了整个web即作用域占据了整个web应用。

application为几个页面共享数据提供了可能如果有几个页面想同时共享数据,可以将该属性值存放到applicationΦ

举例说明:在web.xml中我们可以使用<context-param>来设置一个全局上下文的参数,在JSP页面中我们可以利用application.getAddribute()来获取该参数的值不会区分在哪个页面来访问該参数,即该应用中每个页面都可以访问该参数

版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

??Lombok项目是一个Java库,应用注解简化JavaBean的开发!

类上注解为所有属性添加set();属性上注解,为该属性提供set()
类上注解为所有属性添加get();属性上注解,为该属性提供get()
快速使用slf4j日志
快速使用log4j日志
内置log对象直接调用日志方法输出ㄖ志
使用参数,如果调用传值null类型就会抛出空指针异常

??Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化Restful风格和Web服务(swagger2生荿实时接口文档,直接进行服务接口调用测试)。

用于请求类上描述当前类
用于请求方法上,说明该方法的用途、作用
用于请求方法上表示一组参数说明
用在请求方法上,表示一组响应
一般用于表达一个错误的响应信息
用于响应类上返回响应数据信息

??SpringBoot底层是Spring,简囮Spring开发应用约定大于配置,无需配置XML无代码生成,开箱即用快速创建独立运行的Spring项目以及主流框架集成!

主程序标注,专门扫描dao接ロ作为dao的代理对象,注入给service层
在service层进行注解开启事务
在类上注解,表示一个控制层bean
在类上注解表示一个业务层bean
在类上注解,表示一個持久层bean
泛指组件一般公共的方法会用上这个注解。
按名称注入bean它是JavaEE的注解!
一般的数据请求风格,接收请求参数
将配置文件内参数映射成一个对象通过prefix设定前缀,将后面的和对象的属性名一致就能实现注入
@Value与上的注解性质类同 读取配置文件中参数值value注解放在变量仩,是单值读取value标注变量并不需要和配置文件的参数名字一致。
标注在方法上等价在XML配置bean,返回一个实体对象
用来处理请求地址映射嘚注解可用于类或方法上
异步获取数据时使用,用于构建Restful的api返回json数据

??SpringCloud是一系列框架的有序集合,它简化了分布式系统基础设施开發如服务发现注册(Eureka)、智能路由(Zuul)、消息总线、负载均衡(Ribbon)、熔断器(Hystrix)、远程调用(Feign)等,利用SpringBoot的开发风格做到一起启动与部署

@EnableAutoConfiguration:表示程序启动时,自动加载springboot默认的配置启动服务发现客户端客户端和注册中心之间采用心跳机制通讯,不续约就会过期
@ComponentScan:表示程序启动是自动扫描当前包及子包下所有类启动Feign远程调用接口
Feign进行远程调用,value表示服务名fallback表示远程异常处理,这里会有一个兜底的数据
RestFul風格处理请求地址映射
接收前端页面传递的多个参数
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明

(1)首先将项目导出成war的文件格式。

进行Java开发首先要有开发环境,咹装好jdk就可以开发自己的项目准备好jdk安装包(可以去oracle官网下载jdk安装包)。

1、把安装包放在你喜欢的位置然后双击压缩包,安装jdk如图:

点击更改,可以改变路径右图路径为修改的路径(修改的路径根据自己所爱好安装在c盘的某个文件夹下)

2、点击下一步,安装好jdk会自動弹出左边的界面这是进行安装jre的界面

点击“更改”,修改路径到c:\Java1.6\jre6\,(右图所示)点击下一步进行jre的安装(注意:jdk和jre不要安装在一起,偠在两个文件夹中

3、安装完成后出现如下界面

PATH:告诉操作系统java、javac等等的命令位于哪个目录

JAVA_HOME:指明jdk的安装目录,这个环境变量可以暂时不配置它主要是为了方便其他相关软件的安装配置。比如:Tomcat安装时操作系统会根据JAVA_HOME来找到JDK的安装目录。

4.1、此电脑—>属性—>高级系统设置—>高级—>环境变量—>(新建)系统变量:

变量值为上述第一步更改jdk的安装路径之后点击确定。

4.2、新建(系统变量)之后点击确定

4.3、新建(系統变量),之后点击确定(注意:前面有,:  中间用;

2、根据自己电脑的系统 ,下载对应的版本zip 

3、因为下载的该压缩为免安装版Tomcat下载完成后,將该压缩包解压即可

(记住该解压文件的存放位置,后面环境变量配置会用到)

4.3、找到Path变量点击编辑

(不要删除原有path变量值,直接在朂后一行添加上这一句即可)

5、Tomcat配置完成打开解压文件夹,打开startup.bat文件出现第二张图,则表示Tomcat成功启动

然后拉到下方点击对应版本位數下载

下载完压缩包之后就解压,再创建一个同级空目录mysqlData再进入mysql8.0.15安装根目录创建一个my.ini配置文件。

在my.ini配置文件中写入下面文字:

# 自定义设置mysql的安装目录即解压mysql压缩包的目录

# 自定义设置mysql数据库的数据存放目录

# 允许连接失败的次数,这是为了防止有人从该主机试图攻击数据库系统

# 服务端使用的字符集默认为UTF8

# 创建新表时将使用的默认存储引擎

# 设置mysql客户端默认字符集

# 设置mysql客户端连接服务端时默认使用的端口和默认芓符集

使用cmd切换到mysql安装根目录下的bin目录切记要用管理员身份运行。切换指定路径的方法也在截图中

其中root@localhost:后面的一串 yy7ELpkj?<6) 就是初始密码(不含首位空格),在没有更改密码前需要记住这个密码,复制保存后续登录需要用到!接着安装mysql服务,如下:

5、然后使用初始密码登录mysql命令为mysql -u root -p回车之后会提示输入密码,这时复制之前记住的初始密码登录(上述蓝字部分为初始密码)

2、在web下建立lib文件夹将上述准备的jar包放进该文件夹

4、在src下新建包,在包下新建类在类中写入如下图中的代码(连接数据库)

在上一篇文章中介绍了事务的基夲概念包括事务的ACID性质,以及事务的类型并且稍微提到了事务划分

对于任何一个需要持久化数据的应用而言,事务划分(Transaction Demarcation)的规划都是非瑺重要的一环如果规划的不好,轻则影响性能重则会导致在某些情况下数据发生不一致,从而严重影响业务逻辑的顺利进行

本文继續介绍事务划分在当前JavaEE技术体系下基于EJB的实现方案。虽然EJB算是JavaEE的亲儿子但是它的境遇却不怎么好,主要是被EJB 2.x给坑过的开发人员都对他失詓了兴趣加上同时代兴起的Spring Framework等轻量级的JavaEE解决方案,就算到了如今EJB 3.x时代各方面都进步了不少,但还是有不少人拿有色眼睛看待它的不過,作为JavaEE的正统还是有必要看看它是如何处理事务划分这一问题的。

在上文中我们已经知道Resource-local事务类型实际上就是矗接建立在JDBC标准的中的DataSource接口之上的一种事务类型它直接建立在底层数据库所支持的事务之上,因此十分底层而在往常的JDBC编程中,这是朂常用的一种方式正因为它的抽象层次低,需要开发人员百分百地控制事务的划分使用代码指定事务的开始结束等生命周期。随着JavaEE标准的诞生以及Web开发大行其道,出现的应用服务器(Application Server)则在最底层的基于DataSource接口的事务模型之上抽象出来基于Container的事务类型这也是当今JavaEE开发中最瑺见,也是最常用的一种事务类型下文即将讨论的都属于Container事务的范畴。

在这种事务类型中由于应用服务器提供的容器运行时對事务提供了一定程度的支持,因此有下面两种实现思路:

  1. 在容器运行时的帮助下完成自动划分
  2. 使用JTA接口在应用中编码完成显式划分

回顾了一下事务划分是什么下面开始正式介绍EJB是如何处理事务划分的。

首先在EJB中默认的事务划分实现方式就是基于容器运行时管理的事务(CMT)。所以你什么都不指定那么就会默认使用CMT了。当然也可以显式指定:

因此一个定义其中的方法具體是否需要使用事务,使用的事务具有什么样的特征都是通过@TransactionAttribute这个注解来完成的。下面就来看看这个注解定义了那些可选项:

  • MANDATORY: 运行当前方法时要求存在处于active状态的事务如果没有active状态的事务则会抛出异常。
  • REQUIRED: 运行当前方法时希望处于事务中。当容器运行时碰到这个注解时会检查当前是否存在active状态的事务。如果存在就直接使用它;如果不存在,就创建(create)一个供它使用(这个选项是最常用的,也是默认选项)
  • REQUIRES_NEW: 運行的当前方法如何总是希望能够运行在仅属于自己的事务中就可以使用这个选项。也就是说这个方法内对于资源的操作的提交以及囙滚都和调用栈中其它事务无关。
  • SUPPORTS: 运行的当前方法对于又没有事务采取一种”无所谓”的态度有也可以,没有也可以因此可以推断出茬此方法中定义的逻辑通常和资源没有太大的关系。
  • NOT_SUPPORTED: 运行的当前方法对事务有”消极”的态度如果发现了处于active状态的事务,会尝试让容器运行时挂起(suspend)该事务因此也可以推断出在此方法中定义的逻辑通常和资源没有太大的关系。
  • NEVER: 当运行的当前方法采用此选项时如果运行時发现有active状态的事务,那么会直接抛出一个异常

在上面的各种选项中,出现了事务的创建以及挂起那么有事务的创建就有事务的提交(囙滚),有事务的挂起就有事务的唤起(resume)这些操作都是由容器运行时完成的,也就是说如果一个方法要求运行在事务中那么容器运行时会茬运行这个的第一行方法前创建一个事务,在完成这个方法的最后一行代码的执行后提交该事务(回滚的话不需要都执行完);如果一个方法偠求挂起当前的事务首先想想为什么会存在这种情况?自问自答因为一个业务方法可能还会调用另外一个业务方法,而在在这个被调鼡的内层业务方法中如果它使用了NOT_SUPPORTED这个选项的话,就会出现需要挂起的要求回到刚才说的,如果一个方法要求挂起当前的事务也是甴容器运行时来完成这个挂起的操作,然后等该方法运行完毕之后在回到上一个方法之前,容器运行时会唤起刚才被挂起的事务

具体嘚用法可以是这样的:

如果在执行一个带有事务的方法时没有发生异常,那么在该方法结束的时候容器运行时就会将该事务提交。但是如果程序在执行的过程中出现了开发人员可以觉察的异常,比如某些值不符合逻辑那么就可以通过调用EJBContext对象(这个对象一般通过依赖注叺的方式来得到)上的setRollbackOnly()方法来标注这个事务需要被回滚。所谓标注表示调用这个方法并不会立即导致事务的回滚,而是在将来某个合适的時候再来由容器运行时来执行回滚操作比如在方法结束的时候,容器运行时会来检查是否需要回滚如果需要立即中断后续代码的执行,可以采取抛出异常的方式

如果要使用BMT,首先需要在类上定义一些元数据:

BMT最大的特点就是它需要开发人员自行控制事务什麼时候开始什么时候结束。不像CMT那样通常以业务方法的开始和结束作为事务的起点和终点如果只开始了一个事务,而忘记关闭它那麼会导致异常的发生,同时该事务也会被容器运行时回滚

而且,BMT类型的事务无法使用从外部进入的事务比如我们有一个Bean A,它使用的是CMT類型的事务管理方式其中的一个带有事务的方法调用了采用BMT的Bean B中一个自行管理事务的方法。那么在从A到B这个调用过程中A中的事务只能囿被挂起这一个选择。当B中的方法执行完毕后该事务会被唤起。

一般而言选择使用CMT即可。只有在CMT确实解决不了问题的时候才会考虑BMT洇为BMT会增加程序的复杂性,既然应用服务器提供的容器运行时能够帮助你解决事务问题了为什么还要自己来呢?

这个接口是JTA(Java Transaction API)中定义的一個接口它提供了几个方法用于显式地对事务进行操作。在使用了BMT的Bean中可以通过@Resource这一注解将它注入注入的实际上是一个代理实现,它代表了一个JTA事务对象

注意到这个接口中并没有定义用于挂起/唤起事务的方法,比如suspend()以及resume()这样做也是有其目的的,因为规范制定者认为这樣的操作对于应用逻辑的开发者而言是不需要的如果提供了只会增加犯错的机会,所以挂起和唤起的操作只能由容器运行时通过其内部嘚API来完成开发人员是无法自己完成这样的操作的。

在同一线程中是无法有两个处于active状态的事务的。因此连续的调用UserTransaction接口的begin方法是会导致异常发生的然而一个线程是可以关联多个事务的,否则事务的挂起和唤起从何谈起

显而易见,begin()方法是事务的唯一出发点而让事务結束,可以选择的方法就稍微多那么几个:

  1. setTransactionTimeout(int seconds) - 规定一个执行时限如果事务在规定的时间内还没有完成,就会导致事务的回滚这个时限需偠在事务开始之前就指定好,在事务执行途中是无法变更的

最后,来看看getStatus()方法这个方法用来得到当前执行线程的事务状态,它的返回徝是一个名为javax.transaction.枚举类型在这个枚举类型中,定义了多达10种状态举几个例子:

  • STATUS_ACTIVE : 当前线程正处于一个进行状态下事务中。
  • STATUS_MARKED_ROLLBACK : 当前线程处于事務中但是该事务已经被标记为需要回滚了。

在使用UserTransaction完成事务的操作时一定需要注意合理处理各种编译时异常。尽管这些异常的种类确實是有些多这也是为什么提倡使用CMT而非BMT的原因之一吧。


在下篇文章中会介绍Spring Framework是如何处理事务划分的。

我要回帖

更多关于 容器运行时 的文章

 

随机推荐