`
文章列表
最近项目中使用了play framework做为编译环境,默认情况下play没有提供类似于maven里那样查看整个项目依赖树的命令,通过各种搜索,终于搞定了依赖树的查看 。 1. 在项目或者./sbt/version/plugins/plugins.sbt里添加以下内容 addSbtPlugin("net.virtual-void" % "sbt-dependency-graph" % "0.7.5")   2. 在项目的build.sbt里添加以下依赖 "net.virtual-void" % &qu ...
从 Servlet 容器说起 要介绍 Servlet 必须要先把 Servlet 容器说清楚,Servlet 与 Servlet 容器的关系有点像枪和子弹的关系,枪是为子弹而生,而子弹又让枪有了杀伤力。虽然它们是彼此依存的,但是又相互独立发展,这一切都是为了适应工业化生产的 结果。从技术角度来说是为了解耦,通过标准化接口来相互协作。既然接口是连接 Servlet 与 Servlet 容器的关键,那我们就从它们的接口说起。 前面说了 Servlet 容器作为一个独立发展的标准化产品,目前它的种类很多,但是它们都有自己的市场定位,很难说谁优谁劣,各有特点。例如现在比较流行的 Jetty,在定制 ...
本文以 Tomcat 5 为基础,也兼顾最新的 Tomcat 6 和 Tomcat 4。Tomcat 的基本设计思路和架构是具有一定连续性的。 Tomcat 总体结构 Tomcat 的结构很复杂,但是 Tomcat 也非常的模块化,找到了 Tomcat 最核心的模块,您就抓住了 Tomcat 的“七寸”。下面是 Tomcat 的总体结构图: 图 1.Tomcat 的总体结构 从 上图中可以看出 Tomcat 的心脏是两个组件:Connector 和 Container,关于这两个组件将在后面详细介绍。Connector 组件是可以被替换,这样可以提供给服务器设计者更多的选择,因为这 ...
Jetty 的基本架构 Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler。 Jetty 的基本架构 下 图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和 Connector 两个组件构成,整个 Server 组件是基于 Handler 容器工作的,它类似与 Tomcat 的 Container 容器,Jetty ...
前提说明: 1. 基于tomcat 8.0.26版本的源码 2. JDK1.7   操作说明: 1. 从Apache网站下载tomcat源码 2. 默认情况下,tomcat使用ant进行编译、打包,以下讲一下如何使用maven来编译、打包 3. 在Eclipse里新建一个maven标准Java项目 4. 将tomcat源码包下的Java里的文件拷贝到src/main/java下 5. 将conf和webapps拷贝到项目根路径下(请参考下图) 6. 使用以下maven配置 <project xmlns="http://maven.apache.org/P ...
一、 Spring的Profile功能 这个功能的使用方法其实和Maven的profile是一样的,可以通过不同的参数来激活某些配置,这样便于我们在开发、调试以及生产模式下进行切换。 对于类的配置,如果需要启用Profile功能,有以下几种方式:     1. 对于在配置类上使用注解方式的配置   @Configuration @Profile(value="productprofile") public class ProductConfig { ... }       2. 对于使用注解方式定义类   @Bean @Profile(" ...
主要是收集整理一下关于Java热部署相关的功能,供以后需要时使用: 1. Spring-loaded     Spring-Loaded 使用Ⅰ-Getting Started     Spring-Loaded 使用Ⅱ-Reload Jar   2. JRebel     JRebel 使用Ⅰ-Getting Started   3. Java HotSwap     Java HotSwap Ⅰ-Getting Started     Java HotSwap Ⅱ-ClassLoader   4. Others     HotDeploy/HotReplace/O ...
Java的系统启动后,通过Locale.getDefault()能够得到一个当前应用默认的Locale信息,但如果希望我们的应用不管部署在任意机器上,可以保持同一个默认Locale怎么办呢?也就是如何修改Java启动的默认Locale。 1. 可以在启动的入口代码处增加以下语句 Locale.setDefault(newLocale("en","US")); 2. 在Java启动时增加以下参数: -Duser.language=en -Duser.country=US 3. 修改操作系统的语言设置。 Windows: 控制面板 --> ...
Log4j是什么不多说了,平时我们在项目中使用log4j时,日志输出级别,一般都是预定义在定义文件里的,但问题在于,如果系统发生了错误,我们希望可以看到更多的信息,以确定错误发生的原因。大部分情况下,我们的做法了,停掉系统,修改log4j的输出级别,例如从info改到debug,然后再试着去重现错误。然后悲剧发生了,发现错误就是不出来,总不能系统一直在debug状态下运行吧,除非你真的完全不在乎性能问题。   遇到以上情况,其实只要我们在系统里多实现一个小的辅助功能,当系统发生错误时,可以动态修改log4j的日志输出级别就可以了。 public class Log4jTest { ...
Java提供的Service Provider机制其实就是一种DI,在实现时只考虑接口(也就是规范),由其他第三方去实现具体的功能。这个跟Spring的依赖注入概念上差不多,Spring是框架级别的依赖注入,SPI则是语言自身提供的,不依赖于任何框架。   具体使用方法非常简单,假设系统中实现一个接口,例如com.test.DemoInterface,由第三方提供具体实现,有以下步骤: 1. 第三方提供DemoInterface的实现类,例如com.test.thirdparty.DemoInterfaceImpl 2. 在生成的jar包里,在META-INF/services目录下 ...
从网上搜到的文章,在讲到这两者的区别时,大多都引用了以下两句话: (01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。(02) CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。   但看完这两句话,从代码角度出发,这两者的区别我一直没有理解。1个线程等待其他线程,和N个线程相互等待,其实从某种角度来讲,意义是差不多的,总归都是到达某个触发点之后,执行所有线程。所以从我个人的角度出发,我觉得第一点更多时候只是意义上的差 ...
今天讲的是其实是一个老生常谈的问题,但这前一直没有完全搞清楚,今天正好项目里遇到相关问题,仔细弄了一会儿,终于算是搞明白了。 不知道大家有没有遇到过这个问题,举例先: @Entity public class Teacher { private String name; private Set<Student> students; @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name = "tea ...
在应用程序内使用Spring启动内嵌的Jetty服务总共有2种方式: 1. 一种是启动一个独立运行的Jetty服务,使用独立的Spring配置,跟应用之间完全独立 2. 一种是启动一个与应用共享ApplicationContext的服务,可以访问应用的全部内容   对于第一种独立的Jetty服务:   Server server = new Server(); SelectChannelConnector connector = new SelectChannelConnector(); connector.setPort(1 ...
虽然 2.0 版本发布以来,Spring 陆续提供了十多个注解,但是提供的这些注解只是为了在某些情况下简化 XML 的配置,并非要取代 XML 配置方式。这一点可以从 Spring IoC 容器的初始化类可以看出:ApplicationContext 接口的最常用的实现类是 ClassPathXmlApplicationContext 和 FileSystemXmlApplicationContext,以及面向 Portlet 的 XmlPortletApplicationContext 和面向 web 的 XmlWebApplicationContext,它们都是面向 XML 的。Sprin ...
今天试验cxf的客户端收发信息测试,之前一直是让服务端直接返回string,然后客户端拿到字符串后进行解析。 这样的代码,网上任意都能找到。可是如果服务端返回的是json类型,客户端该如何解析呢? 网上的代码基本上都是在强调服务端,说应该配置<jaxrs:providers>,却都不提到客户端该如何配置,都是直接调用类似以下代码: WebClient client = WebClient.create('some url'); client.type('....').accept('....'); Response r = client.get(); Object o ...
Global site tag (gtag.js) - Google Analytics