打造一款属于自己的web服务器——最后的一点完善
上一篇我们通过反射实现了动态加载多个controller,就功能上来说整个项目已经基本上完成了,但是目前我们仍然还有一些问题,例如模板支持不好、很多配置信息硬编码不好修改。此外,我们预期的目标是实现一个可嵌入的jar,以实现web服务,而就目前而言明显是不行的。那么我们现在就来解决这些问题。
一、使用velocity拓展模板
想要实现一套完善的模板还是比较麻烦的,所以目前我们考虑使用java支持的模板来实现,目前比较常用的有Freemaker,Velocity等,因为比较熟悉velocity,所以就选择这一款了。相关资料。
首先,我们在src/main/resources(放配置文件)目录下添加velocity配置文件:
resource.loader=class
class.resource.loader.class=org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader
这里配置了模板加载方式和对应加载器,这里我们使用类加载,并通过路径。接下来我们在ViewHandler中添加处理代码,还是比较简单的:
/** * 处理Velocity模板 * @param resultInfo * @return * @throws IOException */ public String processVelocityView(ResultInfo resultInfo) throws IOException { if (StringUtil.isEmpty(resultInfo.getView())) { return ""; } // 获取路径 String path = analysisVelocityViewPath(resultInfo.getView()); String content = VelocityUtil.mergeTemplate(path, resultInfo.getResultMap()); if (StringUtil.isEmpty(content)) { return ""; } return content; }
这样一来,我们就能使用velocity渲染数据了。
二、完善配置文件
对于很多参数,我们往往需要经常变动,因此需要通过配置文件来配置。这里我们只是用简单的properties。完善后的配置文件如下:
#包前缀 PACKAGE_PREFIX=org.eh.web #模板页面根路径(相对classes文件夹,项目src/main/view下) VIEW_BASE_PATH=page #静态资源路劲(相对classes文件夹,项目src/main/view下) STATIC_RESOURCE_PATH=static #端口 httpserver.port=8888 #controller包路径,配置后可通过annocation直接配置 controller.package=com.gj.web.controller #url与controller类对应关系 #url/list=com.gj.web.controller.MyController #session超时时间(分钟) session_timeout = 10
这里还要注意的是,该配置文件只在本项目内生效,当引入其他项目时,需要重新配置。下边我们来实现配置文件加载:
/** * * @author guojing * @date 2014-3-3 */ public class Constants { private static final Log log = LogFactory.getLog(Constants.class); /* 配置信息 */ public static String PACKAGE_PREFIX = "org.eh.web."; // 包前缀 public static String VIEW_BASE_PATH = ""; // 路径 public static String STATIC_RESOURCE_PATH = ""; // 静态文件路径 public static String CLASS_PATH = "";//classes文件夹路径 public static Map<String, String> UrlClassMap = new HashMap<String, String>(); // url与class映射 public static Map<String, String> OTHER_CONFIG_INFO = new HashMap<String, String>(); // 其他配置信息 public static List<String> STATIC_SUFFIXS = new ArrayList<String>(Arrays.asList(".css", ".js", ".jpg", ".png", ".gif", ".html")); // 静态文件后缀 /* 常量值 */ public static String PROPERTIES_NAME = "web.properties"; // 配置文件名 public static String PROPERTIES_VELOCITY_NAME = "velocity.properties"; // 配置文件名 public static String PROPERTIES_CONTROLLER_PACKAGE = "controller.package"; // controller配置文件中属性名 public static String PROPERTIES_HPPTSERVER_PORT = "httpserver.port"; // 服务端口名 public static String SESSION_TIMEOUT = "session_timeout"; // 服务端口名 public static void loadFromProp(String path) { Map<String, String> map = new HashMap<String, String>(); try { map = PropertyUtil.analysisProperties(path); } catch (Exception e) { log.error("配置文件不存在!", e); } for (String key : map.keySet()) { if (key.equals("PACKAGE_PREFIX")) { PACKAGE_PREFIX = map.get(key).toString(); } else if (key.equals("VIEW_BASE_PATH")) { VIEW_BASE_PATH = map.get(key).toString(); } else if (key.startsWith("url")) { UrlClassMap.put(key.replace("url", ""), map.get(key).toString()); } else { OTHER_CONFIG_INFO.put(key, map.get(key).toString()); } } } }
这样一来,在项目启动的时候就能加载左右配置信息。
三、项目打包
如果想引入其他项目,我们首先需要把项目打成jar,然后引入。由于我们使用maven,那么就容易多了。我们只需要配置好pom文件即可,如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" 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"> <modelVersion>4.0.0</modelVersion> <groupId>org.eh.http</groupId> <artifactId>easy-httpserver</artifactId> <version>0.0.1</version> <packaging>jar</packaging> <name>easy-httpserver</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-tools</artifactId> <version>2.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> </dependency> </dependencies> <build> <finalName>easy-httpserver</finalName> <resources> <resource> <directory>${basedir}/src/main/resources</directory> </resource> </resources> </build> </project>
现在我们build项目之后,就可以在target生成jar了。
三、示例项目
事实上想要使用生成的jar也并不是很方便,需要配置不少东西,因此为了方便期间,我们来实现一个示例项目,我们想要实现自己的项目时只需要修改示例项目即可。示例项目实现以下功能:
- win/linux下的启动脚本
- 示例controller
- 示例模板
- 示例配置文件
这些功能其实都很好实现,这里就不再详述,还是自己还代码吧~_~。
四、结束语
这次这个小项目就到此为止了,之后可能主要还是接着写jvm相关的,或者一些工作中遇到的问题,如果有比较有意思的项目,也会与大家分享的。
完成项目:源码,示例项目:源码。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。