写在前面 :使用jetty已经很久了,它是一个很出色的web容器和工具,特在此和大家分享jetty6的知识。网络上有一些关于jetty的资料,但过去陈旧且不具有系统性,导致很多人误解jetty的功能,国外目前也没有关于jetty的书籍,所以那些搞翻译的人也没有翻译来源,故决定写一本关于jetty6的书,以推广jetty在国内的使用。记住jetty不仅仅是一个web容器!
作者 :陈汝烨
由于这一些系列文章正在编写过程中,写好一章就发一章,难免有很多错误的地方,欢迎哥们指正!
第4章 Jetty服务配置文件
- org.mortbay.xml.XmlConfiguration
- org.mortbay.xml.XmlParser
4.1 jetty.xml 示例剖析
4.2 Jetty xml Configuration语法
<Configure> 标签
属性
id:可选;如果XmlConfiguration上下文环境 中存在该ID的话就对已存在的对象进行配置,反之创建一个class属性指定的类对象,同时以id为key保存在上下文环境中。
(其实所谓的上下文环境 就是java.util.HashMap<String,Object> 对象)
class:必选;被配置的类。
可包含其他标签 :
New, Set, Put, Call 和 Ref
例子 :
<Configure id="Server" class="org.mortbay.jetty.Server" > <Set name="port" >8080</Set> </Configure> 指定ID属性后,通过命令java -jar start.jar etc/jetty.xml etc/jetty-ssl.xml 启动多个配置文件时,这些配置文件都会对同一Server对象进行配置。 这段xml对应的java代码是 org.mortbay.jetty.Server server = new org.mortbay.jetty.Server(); server.setPort(8080); |
<Set>标签
属性
name: 对象的属性名称
可包含对象
不同文本, Call, New and SystemProperty,Ref 标签
普通文本也可以和其他四个标签混合使用,所得的值是字符串相加的结果。
示例
<New class="foo.Bar" > <Set name="xxx" >jetty</Set> <Set name="cat" > <New class="foo.Cat"></New> <Call name="doSomething"></Call> </Set> </New> 等价于Java代码: foo.Bar bar = new foo.Bar(); bar.setXxxDepartment("jetty" ); foo.Cat temp = new foo.Cat(); temp.doSomething(); bar.setCat(temp); |
<Get>标签
Set, Put 和 Call
get所取得的对象将作为这3个标签的目标对象。
示例
<Configure class= "foo.Bar" > <Get id= "xid" name= "xxx" /> </Configure> 等价Java代码: // foo.Bar bar = new foo.Bar(); x = bar.getXxx(); env.put("xid",x);//env 为上下文环境 对象 <Configure id= "Server" class= "org.mortbay.jetty.Server" > <Call id= "s" name= "toString" /> <Call class= "org.mortbay.log.Log" name= "info" > <Arg> <Ref id= "s" /> </Arg> </Call> </Configure> 等价Java代码: Server server = new org.mortbay.jetty.Server(); String s = server.toString(); env.put("s",s);//env 为上下文环境 对象 org.mortbay.log.Log.info(env.get("s")); |
<Put>标签
<Put name="admin" > admin</Put> <Put name="obj" type="java.lang.Object" > <New class="java.lang.Object"></New> </Put> |
<Call>标签
<Configure class="org.mortbay.jetty.Server "> <Call name="doSomething"> <Arg>xx</Arg> <Set name="key">value<Set> </Call> </Configure> 等级Java代码: Server server = new Server(); Object x = server.doSomething("xx"); x.setKey("value") 如果使用class属性 <Configure class="org.mortbay.jetty.Server "> <Call name="doSomething" class="foo.bar.Utils"> <Arg>xx</Arg> <Set name="key">value<Set> </Call> </Configure> 等级Java代码: Object x = foo.bar.Utils.doSomething("xx"); x.setKey("value") |
在New和Call标签中使用,为它们确定参数列表。Arg标签还可以通过type属性来强制参数类型。
属性
type:可选;如果指定该值,那么会强制该参数对象的类型
可包含对象
普通文本 , Call , New , SystemProperty,Ref
普通文本也可以和其他四个标签混合使用,所得的值是字符串相加的结果。
示例
<Call class="foo.Bar" name="doSomething" > <Arg> <New class="foo.Bar2" > <Arg>11</Arg> </New> </Arg> <Arg> <New class="foo.Bar3" > <Arg>aa</Arg> </New> </Arg> </Call> 等价于Java代码: foo.Bar.doSomething(new foo.Bar2(11),new foo.Bar3("aa")); |
<New>标签
<New class= "foo.Bar" /> 等价于Java代码: foo.Bar bar = new foo.Bar() //调用默认构造方法 <New class= "foo.Bar" > <Arg>bar</Arg> </New> 等价于Java代码: foo.Bar bar = new foo.Bar( "bar" ) |
<Ref>标签
从上下文环境 中取得指定的对象。然后使用Set,Put,Call等标签来操作该对象。还有另外一个用法是,在标签<Arg>和<Set>中使用Ref标签来引用某个对象来作为Arg或者Set的值对象,如<Set name="xxx" > <Ref id="objkey" /> </Set>。
<Ref id="key">
<Set name="xxx">
<New class="foo.Bar">
</New>
</Set>
</Ref>
等价Java代码:
Object obj = env.get("key")//env表示上下文环境 对象
obj.SetXxx(new foo.Bar())
|
<Array>标签
创建一个List对象。当Set,Put或Arg标签需要使用List对象时,该标签就会派上用场。用Item来表示一个数组元素,并且Array只能包含Item标签。
属性
type:必选;用来指定数组元素的类型。
id:可选;如果存在id属性,那么被创建的List对象会以id值为key保存在 上下文环境中 。
可包含对象
Item标签
示例
<Array id= "plusConfig" type= "java.lang. String " > <Item>org.mortbay.jetty.webapp.WebInfConfiguration</Item> <Item>org.mortbay.jetty.plus.webapp.EnvConfiguration</Item> <Item>org.mortbay.jetty.plus.webapp.Configuration</Item> <Item>org.mortbay.jetty.webapp.JettyWebXmlConfiguration</Item> <Item>org.mortbay.jetty.webapp.TagLibConfiguration</Item> </Array> 等价Java代码: List plusConfig = new ArrayList(); plusConfig.add(" org.mortbay.jetty.webapp.WebInfConfiguration "); plusConfig.add(" org.mortbay.jetty.plus.webapp.EnvConfiguration "); plusConfig.add(" org.mortbay.jetty.plus.webapp.Configuration "); plusConfig.add(" org.mortbay.jetty.webapp.JettyWebXmlConfiguration "); plusConfig.add(" org.mortbay.jetty.webapp.TagLibConfiguration "); env.put("plusConfig ",plusConfig ); //env表示上下文环境 对象 |
<Map> <Entry> 标签
和Array类似,Map标签是用来创建一个HashMap对象。我们这样使用:
<Map>
<Entry>
<Item> keyName </Item>
<Item>value </Item>
</Entry>
</Map>
Entry标签包含了两个Item,第一个Item包含的内容为key,第二个为value。
对应的Java代码:
java.util.Map map = new java.util.Map();
map.put("keyName","value");
属性
id: 可选;如果存在id属性,那么被创建的List对象会以id值为key保存在 上下文环境中 。
可包含对象
两个Item标签
<Item>标签
Item被用作Array标签和Map的Entry标签中。
属性
type:可选;如果指定该值,那么会强制该参数对象的类型
可包含对象
普通文本, Call , New , SystemProperty
普通文本也可以和其他三个标签混合使用,所得的值是字符串相加的结果。
<SystemProperty>标签
取得JVM的系统属性。相当于调用Java的System .getProperty("Test" ,"value" )方法。
属性
name:系统属性名
default:可选;当指定系统属性不存在,则返回该默认值。
示例
<New class="org.mortbay.jetty.deployer.ContextDeployer">
<Set name="contexts"><Ref id="Contexts"/></Set>
<Set name="configurationDir"><SystemProperty name="jetty.home" default="."/>/contexts</Set>
<Set name="scanInterval">5</Set>
</New>
等价Java代码:
ContextDeployer deployer = new org.mortbay.jetty.deployer.ContextDeployer();
deployer.setContexts(env.get(" Contexts "));
deployer.setConfigurationDir( System.getProperty("jetty.home",".") + "/contexts" )
deployer.setScanInterval(5);
|
4.3 org.mortbay.xml.XmlConfiguration
要学习一个新事物最快且最有效的方式是——自己动手做实验。之前已经说过Jetty配置功能的实现代码只有两个类,那么我们可以使用它们写一些是实验程序,来帮组你更好地了解如何配置。
首先新建一个Java项目(这里我们使用Eclipse),导入 $jetty_home/lib下面的jetty-6.1.22.jar和jetty-util-6.1.22.jar两个jar包。
新建类TestObject.java
public class TestObject {
public static void printString(Object x){
System.out.println(x);
}
int port;
public void setPort(int port) {
this.port = port;
}
public int getPort() {
return port;
}
public static Map static_method() {
return new HashMap<Object, Object>();
}
public void doStringAdd(String a, String b) {
System.out.println("gogo(String a,String b)==>" + a + b);
}
public void doStringAdd() {
System.out.println("call gogo()");
}
}
|
新建类 ConfigTest.java
import java.net.URL;
import org.mortbay.xml.XmlConfiguration;
public class ConfigTest {
public static void main(String[] args) throws Exception {
URL url = ConfigTest.class.getClassLoader().getResource(
"configure.xml");
XmlConfiguration configuration = new XmlConfiguration(url);
TestObject testObject = (TestObject) configuration.configure();
System.out.println(configuration.getIdMap());
}
}
|
最后在src目录下新建文件configure.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure 1.2//EN" "http://jetty.mortbay.org/configure_1_2.dtd">
<Configure id="testObject" class="TestObject">
<Call name="doStringAdd">
</Call>
<Call name="doStringAdd">
<Arg> a-value </Arg>
<Arg> b-value </Arg>
</Call>
<Call id="hashmap" name="static_method" class="TestObject">
<Put name="k1">
111111111
</Put>
</Call>
<Set name="port">1</Set>
<Get id="p" name="port"></Get>
<Call name="printString" class="TestObject" >
<Arg>
<Ref id="hashmap"></Ref>
</Arg>
</Call>
</Configure>
|
现在我们来研究下Jetty是如何让多个服务配置文件组合在一起运行?如果在它们之前共享上下文环 境的HashMap对象的?来看一个XmlConfiguration的main方法里面的一段源码:
XmlConfiguration last=null;//最后一次处理的XmlConfiguration对象
Object[] obj = new Object[args.length];
for (int i = 0; i < args.length; i++)
{//循环多个配置文件
if (args[i].toLowerCase().endsWith(".properties"))
{
properties.load(Resource.newResource(args[i]).getInputStream());
}
else
{
XmlConfiguration configuration = new XmlConfiguration(Resource.newResource(args[i]).getURL());
if (last!=null)
configuration.getIdMap().putAll(last.getIdMap());
//瞧,秘密在这里,在解析下一个配置文件的时候,把最后一次的配置文件解析过程产生的HashMap对象直接设置为初始HashMap
if (properties.size()>0)
configuration.setProperties(properties);
obj[i] = configuration.configure();
last=configuration;
}
}
|
相关推荐
Jetty6 指南书是一本专注于介绍Jetty 6版本的详尽教程,旨在为读者提供关于这个轻量级、高效的Web服务器和Servlet容器的深入理解。Jetty不仅是一个标准的Web容器,它的灵活性和可嵌入性使得它在许多不同的应用场景中...
`org.mortbay.xml.XmlConfiguration`类提供了读取和解析Jetty配置文件的能力。用户可以通过这个类来加载配置文件,并将配置信息转换成Java对象模型,方便后续的配置管理和使用。 #### 五、在Jetty中部署Web应用程序...
知识点6: 修改配置文件 修改配置文件是服务器证书配置的最后一步。需要修改 Jetty 的配置文件,指定服务器证书的路径和密码等信息。 知识点7: 查看 keystore 证书 使用 keytool 查看 keystore 证书,可以确保...
这个WAR文件包含了Axis2运行所需的全部组件和配置,使得Jetty能够支持和处理基于Axis2的Web服务。 在描述中提到了"axis2-1.7.8-bin.zip",这是一个包含Axis2运行环境的zip文件,其中包含了"axis2.war"。当你下载并...
关于标签"jetty 4",这可能指的是Jetty的第4个主要版本。在Jetty的历史版本中,每个版本都带来了新的特性和改进。例如,Jetty 4可能引入了对Servlet 2.x规范的支持,优化了性能,提高了稳定性,并且可能添加了一些新...
协同移动平台数据库设置需要单独设置数据库连接信息,需要分别设置新版本和1.0版本的数据库连接配置文件。新版本的数据库连接配置文件位于emobile\webapps\ROOT\WEB-INF\classes\application.properties。 emobile...
**第四章:怎样快速配置网站** 快速配置网站涉及以下几个关键步骤: 1. **数据库配置**:在JEECMS的配置文件中,设定与数据库的连接参数,如数据库URL、用户名、密码等。 2. **站点设置**:在后台管理系统中,填写...
2. 权限控制:使用web.xml配置文件进行URL权限限制,实现角色级别的访问控制。 六、Tomcat性能优化 1. 连接器优化:调整最大线程数、超时时间、缓冲区大小等参数。 2. JVM调优:合理设置堆大小、垃圾回收策略,避免...
4. **部署Web应用**:介绍如何将WAR文件部署到Tomcat,以及如何管理多个版本的应用实例,包括热部署和更新策略。 5. **性能优化**:通过调整内存设置、线程池大小、连接超时等参数,提高Tomcat的运行效率。同时,还...
2. **配置文件解析**:学习如何编写和组织Nginx配置文件,包括服务器块、location指令、rewrite规则等,以实现灵活的路由策略和错误处理。 3. **反向代理与负载均衡**:了解如何设置Nginx作为反向代理服务器,将...
服务提供方的POM文件配置如下: ```xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> ...
1. 创建Spring核心配置:首先,我们需要创建一个Spring的配置文件,定义Bean的实例化和依赖关系。可以使用XML配置或者基于Java的配置(@Configuration注解)。 2. 实现Bean工厂:理解BeanFactory接口和...
《SpringBoot实战(自带目录)第四版》是针对Java开发者的一本深度技术指南,主要聚焦于Spring Boot框架的使用和实践。Spring Boot是由Pivotal团队提供的全新框架,旨在简化Spring应用的初始搭建以及开发过程。它...
配置文件用于定义服务的行为和属性,如认证方式、错误处理策略等。 ### 4. BOSWebService 部署 #### 4.1. 建立web工程 创建一个Java Web工程,作为承载WebServices的容器。 #### 4.2. 部署发布文件 将生成的服务...
SpringBoot3全栈指南教程是针对开发者们深入理解并熟练运用Spring Boot 3框架的一份综合教程,由知名教育机构尚硅谷在2023年发布。这份教程旨在帮助学习者掌握Spring Boot 3的核心概念、特性以及如何将其应用于实际...
#### 第一章 介绍 **目标读者** 本指南主要面向负责ZCS部署的系统管理员,要求具备以下背景知识和技能: 1. **熟悉相关技术与标准**:比如RHEL(Red Hat Enterprise Linux)、SUSE等操作系统以及开源的基本概念。...
2. **配置文件(application.properties 或 YAML)**:用于定义应用的环境变量和配置,支持 SpEL 表达式和占位符引用。 3. **组件扫描**:Spring Boot 会自动扫描指定包及其子包下的 `@Component`、`@Service`、`@...
4. **配置httpd.conf**:编辑Apache的主配置文件`httpd.conf`,通常位于`conf`目录下。在这里,你可以配置服务器监听的端口、服务器根目录、虚拟主机等信息。 5. **启动Apache**:在命令行中,使用`httpd.exe -k ...
- **第三方配置**:介绍如何集成第三方配置文件。 - **Relaxed绑定**:解释如何使用更为宽松的绑定规则。 - **属性转换**:介绍如何自定义属性转换逻辑。 - **`@ConfigurationProperties`校验**:说明如何验证`@...
例如,可以在Spring配置文件中定义服务Bean,并指定服务接口、实现、地址等信息。 **6. 安全与认证** CXF提供了丰富的安全特性,如WS-Security(WS-SecureConversation、WSS-Timestamp等),支持数字签名、加密、...