打造一款屬於本身的web服務器——最後的一點完善

    上一篇咱們經過反射實現了動態加載多個controller,就功能上來講整個項目已經基本上完成了,可是目前咱們仍然還有一些問題,例如模板支持很差、不少配置信息硬編碼很差修改。此外,咱們預期的目標是實現一個可嵌入的jar,以實現web服務,而就目前而言明顯是不行的。那麼咱們如今就來解決這些問題。 css

1、使用velocity拓展模板
    想要實現一套完善的模板仍是比較麻煩的,因此目前咱們考慮使用java支持的模板來實現,目前比較經常使用的有Freemaker,Velocity等,由於比較熟悉velocity,因此就選擇這一款了。相關資料
    首先,咱們在src/main/resources(放配置文件)目錄下添加velocity配置文件:
html

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渲染數據了。

2、完善配置文件
    對於不少參數,咱們每每須要常常變更,所以須要經過配置文件來配置。這裏咱們只是用簡單的properties。完善後的配置文件以下: java

#包前綴
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());
			}
		}
	}
}
    這樣一來,在項目啓動的時候就能加載左右配置信息。

3、項目打包
    若是想引入其餘項目,咱們首先須要把項目打成jar,而後引入。因爲咱們使用maven,那麼就容易多了。咱們只須要配置好pom文件便可,以下: linux

<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了。

3、示例項目
    事實上想要使用生成的jar也並非很方便,須要配置很多東西,所以爲了方便期間,咱們來實現一個示例項目,咱們想要實現本身的項目時只須要修改示例項目便可。示例項目實現如下功能: git

  • win/linux下的啓動腳本
  • 示例controller
  • 示例模板
  • 示例配置文件
    這些功能其實都很好實現,這裏就再也不詳述,仍是本身還代碼吧~_~。

4、結束語
    此次這個小項目就到此爲止了,以後可能主要仍是接着寫jvm相關的,或者一些工做中遇到的問題,若是有比較有意思的項目,也會與你們分享的。
    完成項目:源碼,示例項目:源碼github

相關文章
相關標籤/搜索