扩展webx资源装载器之HttpResourceLoader(一):简单实现

webx是一个开源的web框架,主页地址:http://www.openwebx.org/。这里我们主要说下使用http协议对网络中任意资源进行装载,来增强webx资源装载的功能。

用webx官网的mvn命令,生成tutorial1项目,里面webx的pom如下:


1

2

3

4

5

6

7

8


...

<webx-version>3.2.4</webx-version>

...

<dependency>

<groupId>com.alibaba.citrus</groupId>

<artifactId>citrus-webx-all</artifactId>

</dependency>

...

这个版本里,webx的resourceLoader有2种扩展:

[res-loaders:webapp-loader /]:通过servletContext.getResource(resourceName)来获取资源。
[res-loaders:classpath-loader /]:通过classLoader.getResource(resourceName)来获取资源。
[res-loaders:super-loader/]:通过resource.xml里配置的资源别名,结合配置的资源加载器,来进行资源加载。这种是在前面2种的基础之上。

基于springExt,这里扩展点是res-loaders,捐献是webapp-loader,classpath-loader和super-loader。

新增一个http-loader,即[res-loaders:http-loader/],具体的捐献实现和配置在后面会再进行介绍,。

HttpResourceLoader简单类实现:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133


import java.io.ByteArrayInputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Set;

import javax.servlet.ServletContext;

import org.apache.commons.lang.StringUtils;

import org.apache.velocity.runtime.RuntimeConstants;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.context.ApplicationContext;

import org.springframework.context.ApplicationListener;

import org.springframework.context.event.ContextRefreshedEvent;

import org.springframework.web.context.ServletContextAware;

import org.springframework.web.context.WebApplicationContext;

import com.alibaba.citrus.service.resource.Resource;

import com.alibaba.citrus.service.resource.ResourceLoader;

import com.alibaba.citrus.service.resource.ResourceLoaderContext;

import com.alibaba.citrus.service.resource.ResourceLoadingOption;

import com.alibaba.citrus.service.resource.ResourceLoadingService;

import com.alibaba.citrus.service.resource.support.InputStreamResource;

import com.alibaba.citrus.service.template.TemplateService;

import com.alibaba.citrus.service.velocity.impl.VelocityEngineImpl;

import com.alibaba.citrus.service.velocity.impl.VelocityRuntimeInstance;

import static org.springframework.web.context.WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE;

/**

*

* @author yankai913@gmail.com

* @date 2016年4月11日

*/

public class HttpResourceLoader implements ResourceLoader, ServletContextAware,

ApplicationListener<ContextRefreshedEvent> {

private static final Logger logger = LoggerFactory.getLogger(HttpResourceLoader.class);

String resourceRemoteHost = "http://localhost:6666";

String vmEncoding = "UTF-8";

String[] additionalPathArr = new String[] { "", "/common" };

ApplicationContext applicationContext;

ServletContext servletContext;

@Override

public void init(ResourceLoadingService resourceLoadingService) {

}

@Override

public Resource getResource(ResourceLoaderContext context, Set<ResourceLoadingOption> options) {

String resourceName = context.getResourceName();

try {

for (String additionalPath : additionalPathArr) {

String remoteFileURL = this.resourceRemoteHost + additionalPath + resourceName;

HttpUtils.HttpResult httpRequest =

HttpUtils.httpGet(remoteFileURL, null, null, vmEncoding, 3000);

if (httpRequest.code == HttpURLConnection.HTTP_OK) {

String htmlText = httpRequest.content;

wrapHtmlContent(resourceName, htmlText);

ByteArrayInputStream bais = new ByteArrayInputStream(htmlText.getBytes(vmEncoding));

InputStreamResource resource = new PrototypeInputStreamResource(bais);

return resource;

} else {

continue;

}

}

throw new IOException("http get template failed! resourceName=" + resourceName);

} catch (Exception e) {

logger.error("http get template failed! resourceName=" + resourceName + e.getMessage(), e);

}

return null;

}

void wrapHtmlContent(String resourceName, String htmlText) {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String timestamp = sdf.format(new Date());

String content = "<!-- http get " + resourceName + "\t" + timestamp + " start -->\n";

content = content + htmlText;

content = "\n<!-- http get " + resourceName + "\t" + timestamp + " end -->\n";

}

@Override

public void setServletContext(ServletContext servletContext) {

this.servletContext = servletContext;

}

@Override

public void onApplicationEvent(ContextRefreshedEvent event) {

if (event.getApplicationContext().getParent() == null) {

WebApplicationContext wac =

(WebApplicationContext) servletContext

.getAttribute(ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

TemplateService ts = (TemplateService) wac.getBean("templateService");

VelocityEngineImpl ve = (VelocityEngineImpl) ts.getTemplateEngine("vm");

VelocityRuntimeInstance vri = (VelocityRuntimeInstance) ve.getRuntimeServices();

vmEncoding = StringUtils.trimToNull((String) vri.getProperty(RuntimeConstants.INPUT_ENCODING));

}

}

// 保证实时数据,不缓存。

static class PrototypeInputStreamResource extends InputStreamResource {

public PrototypeInputStreamResource(InputStream stream) {

super(stream);

}

public long lastModified() {

return System.currentTimeMillis();

}

}

}

remoteResourceHost:资源所在的地方,例如,vm目录放在本地,nginx指向vm目录,nginx作为文件服务器提供文件资源服务。
httpUtils是一个http工具类。

这样一个扩展好处就是,服务器部署某个应用后,配置vm目录指向本地,如果需要修改vm看效果,不用重启应用,不用登录服务器修改vm文件,不用本地文件改了再传到服务器,只用在本地修改即可。用于开发阶段。

时间: 2024-10-01 15:18:59

扩展webx资源装载器之HttpResourceLoader(一):简单实现的相关文章

eSWT移动扩展简介,第1部分: 使用简单小部件快速构建移动应用程序

简介 随着移动平台变得越来越复杂,移动计算需求将会不断增长.嵌入式 Standard Widget Toolkit (eSWT) Mobile Extension 是一种 Eclipse 技术,可以用于为各种移动电话开发具有本地外观的 Java 应用程序. eSWT 是嵌入式 Rich Client Platform (eRCP) 项目的一部分,为构建移动应用程序提供标准的嵌入式小部件.eSWT 主要关注如何满足移动设备的功能和用户体验需求.eSWT 提供了对设备上的用户界面功能的高效.可移植的

c 语言 51 字节 扩展-C语言有没有一种简单的运算进行字节扩展?

问题描述 C语言有没有一种简单的运算进行字节扩展? 在C语言中有没有一种简单的办法扩展字节? 比如 8位的10101010 扩展为16位1100110011001100应该如何实现? 解决方案 char *itoa(int value, char *string, int radix); 我记得这个函数可以 解决方案二: 这是要定义一个"函数",输入是清楚的:一个字节,即unsigned char类型: 输出是什么?一个双字节整数(unsigned short)? 映射规则是什么? -

《扩展 jQuery》——2.2 一个简单的插件

2.2 一个简单的插件 jQuery插件简直可以做任何事情,大量的第三方插件就可以证明这一点.从影响单个元素的简单插件,到改变多个元素的外观和行为的复杂插件,比如验证插件,应有尽有. 最为常用的一类jQuery插件是集合插件,它被用来为使用选择器或者遍历DOM得到的一组元素添加功能.开发者可以创建一个水印插件作为这种类型的插件的一个简单示例,它在必要时为字段内部提供一个标签.这会让开发者对如何构建一个插件有一定的感知. 2.2.1 占位文字 为了节省表单所占用的空间,有时开发者会省略字段的标签,

怎么去收集整理外链资源 让外链变简单

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 今天分享一下怎么有效的收集外链,整理外链资源.个人网站的成功都离不开外链,但是恰好外链又是网站建设的一麻烦事,我们应该要怎么去利用所有的外链资源,把所有的外链资源都整理出来,让我们解决每天要做外链带来的烦恼.外链建设有很多途径,网络上五花八门,不可能没一种都涉及到,但我们只要选择3-5个适合自己站的就行,只要把你选择的途径做好一样能做出不错的

PHP7 使用资源包裹第三方扩展的实现及其源码解读

在阅读下面的内容之前,我们假定你已经对 PHP 7 基本的数据结构 都有大致的了解了,这是下面内容阅读的前提. 我们分为两大块: 首先实现一个自定义的文件打开.读取.写入.关闭的文件操作扩展: 然后分析各个操作背后的实现原理,其中某些部分的实现我会和 PHP 5.3 使用资源包裹第三方扩展源码解读 对比分析. 通过原型生成扩展骨架 首先进入到源码目录的ext目录中,添加一个文件操作的原型文件 [root@localhost php-src-php-7.0.3]# cd ext/ [root@lo

php扩展与嵌入--资源数据类型2

在资源变量中存储的复杂的数据类型通常在初始化时需要一些内存分配,CPU时间或网络通信.但是在请求之间保留类似于数据库连接这种资源,必须要做到持久.资源是否持久是一个必须要考虑到的因素. 首先看内存分配的问题: 在使用php的时候,偏向使用emalloc因为它是malloc的带回收的版本.但是持久化的资源必须在请求间都存在.对于一个文件句柄类的资源来说,如果要加入一个存储文件名的需求,那么必须在头文件中加入如下的代码: typedef struct _php_sample_descriptor_d

Android中引用其他程序的文本资源超简单方法

在Android中引用其他程序的文本资源并不是很常见,但是有时候还是很是有需要的,通常引用的多半是系统的程序的文本资源. 下面以一个超简单的例子,来展示以下如何实现. 复制代码 代码如下: public void testUseAndroidString() { Context context = getContext();     Resources res = null;     try {         //I want to use the clear_activities strin

WebX实践指南_页面模板(二)

正如前面所讲的,WebX中View使用Velocity模板引擎来实现的. Velocity Velocity是一个基于Java的模板引擎,它可以让视图的设计者在web页面中引用java代码中定义的数据对象和命令,从而实现真正意义上的MVC模式,保证了系统长期可维护性.下面简单地介绍下,Velocity的使用,关于Velocity的更详细介绍参考:http://velocity.apache.org/engine/devel Velocity中语句都是#开头的,变量的定义都是$开头的 注释代码:#

Delphi使用资源文件全攻略

本文为原创,如需转载,请注明作者和出处,谢谢!     在通常情况下使用delphi设计程序,都是将字符串.图像等资源直接使用delphi提供的vcl控件加到*.dfm中,这样做会合修改这些资源时带来 不便,如果资源被多次引用,这些资源在程序启动时都被加载到内存中,非常耗费系统资源.因此,这就需要一种新的引用资源的文件:资源文件.资源文件就是将 一些资源,如字符串.图像等信息进行编译,然后在程序中引用编译后的资源文件,最后和源程序一起编译生成可执行文件.由于在资源文件中的资源是在需要时加 载,因