- 浏览: 29396 次
- 来自: ...
最新评论
文章列表
最近项目中使用了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实现
- 博客分类:
- Java
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个线程相互等待,其实从某种角度来讲,意义是差不多的,总归都是到达某个触发点之后,执行所有线程。所以从我个人的角度出发,我觉得第一点更多时候只是意义上的差 ...
Hibernate的级联操作问题
- 博客分类:
- Hibernate
今天讲的是其实是一个老生常谈的问题,但这前一直没有完全搞清楚,今天正好项目里遇到相关问题,仔细弄了一会儿,终于算是搞明白了。
不知道大家有没有遇到过这个问题,举例先:
@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收发json信息,并进行对象转换
- 博客分类:
- CXF
今天试验cxf的客户端收发信息测试,之前一直是让服务端直接返回string,然后客户端拿到字符串后进行解析。
这样的代码,网上任意都能找到。可是如果服务端返回的是json类型,客户端该如何解析呢?
网上的代码基本上都是在强调服务端,说应该配置<jaxrs:providers>,却都不提到客户端该如何配置,都是直接调用类似以下代码:
WebClient client = WebClient.create('some url');
client.type('....').accept('....');
Response r = client.get();
Object o ...