文档章节

打造一款属于自己的web服务器——最后的一点完善

oO脾气不坏Oo
 oO脾气不坏Oo
发布于 2014/06/02 14:42
字数 1313
阅读 312
收藏 11
点赞 0
评论 0

    上一篇我们通过反射实现了动态加载多个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相关的,或者一些工作中遇到的问题,如果有比较有意思的项目,也会与大家分享的。
    完成项目:源码,示例项目:源码

© 著作权归作者所有

共有 人打赏支持
oO脾气不坏Oo
粉丝 72
博文 54
码字总数 67574
作品 0
深圳
程序员
打造一款属于自己的web服务器——开篇

JVM总结慢慢来吧,先插播一篇水文,来介绍下最近业余一直在写的一个小项目——easy-httpserver(github)。适合新手学习,大神们路过即可^^。 一、这是个什么玩意? easy-httpserver本来的目...

oO脾气不坏Oo ⋅ 2014/03/17 ⋅ 1

打造一款属于自己的web服务器——从简单开始

距离开篇已经过了很久,期间完善了一下之前的版本,目前已经能够完好运行,基本上该有的功能都有了,此外将原来的测试程序改为示例项目,新项目只需按照示例项目结构实现controller和view即可...

oO脾气不坏Oo ⋅ 2014/05/03 ⋅ 10

打造一款属于自己的web服务器——实现Session

上一次我们已经实现了一个简单的web服务器版本,能够实现一些基本功能,但是在最后也提到了这个版本由于不支持session并不能实现真正的动态交互,这一次我们就来完成这一功能。 一、Session...

oO脾气不坏Oo ⋅ 2014/05/11 ⋅ 3

【实习】2019届腾讯实习生面试感悟,产品岗

【实习】2019届腾讯实习生面试感悟 流程 (笔试——)群面——初试——复试——终面(HR面)——offer 背景介绍 楼主工科背景,觉得实在不喜欢编代码这种无聊的生活与工作,天秤座的好奇宝宝,...

牛客网 ⋅ 05/24 ⋅ 0

巨型机器人厂商众筹百万美金只为打架,这可能就是直男的情怀吧

说到机器人,我们的想到的第一款产品是什么?是呆萌的人形机器人pepper?还是传说中能缝合葡萄皮的手术机器人达芬奇?又或者是随处可见的扫地机器人、语音交互机器人、早教机器人…… 我们应...

脑极体 ⋅ 2017/11/20 ⋅ 0

关于review和继续前进的思考

关于review和继续前进的思考 简述:这是我以一个大三,学习编程,以编程作为能力得到过变现的学生,写的一个属于自己的一些编程经验和 对于review和继续前进的思考。 作为一个分享的人,有句...

Cc卿 ⋅ 05/27 ⋅ 0

深度游戏

简介 深度游戏(英文名:Deepin Games)是deepin团队为广大Linux用户量身打造的一款游戏分享平台,是中国唯一一款Linux平台下的游戏中心,也是全球为数不多的Linux游戏分享平台。 深度游戏中心...

Hallucination ⋅ 2014/01/15 ⋅ 1

用树莓派打造乐高机器人 可程序化控制

好消息,乐高迷们,你们可以利用树莓派电脑和一款新设备BrickPi制造出属于你自己的程序化乐高机器人了。 如果你们拥有一台树莓派电脑,那么BrickPi设备就可以使这种小电脑变成乐高机器人。大...

oschina ⋅ 2013/05/19 ⋅ 16

技术团队底蕴判定

目前而言,项目多如狗,创业公司多如鸡。 大部分只是一伙人,而不是一个Team。 首先,99%公司沿用的模式: 1,需求(可能综合看其他同行的功能实现自认优化下前端效果)效果图后,直接丢给程...

乐天无极 ⋅ 2015/12/18 ⋅ 0

美国白宫都使用的内容管理系统——Drupal!

说起wordpress,想必大家应该都不陌生,它是一款内容管理系统(CMS),用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站。但是小编今天要介绍的是另一款产品——Drupal,它和Wor...

好雨云市 ⋅ 2016/10/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从零开始搭建Risc-v Rocket环境---(1)

为了搭建Rocke环境,我买了一个2T的移动硬盘,安装的ubuntu-16.04 LTS版。没有java8,gcc是5.4.0 joe@joe-Inspiron-7460:~$ java -version程序 'java' 已包含在下列软件包中: * default-...

whoisliang ⋅ 16分钟前 ⋅ 0

大数据学习路线(自己制定的,从零开始学习大数据)

大数据已经火了很久了,一直想了解它学习它结果没时间,过年后终于有时间了,了解了一些资料,结合我自己的情况,初步整理了一个学习路线,有问题的希望大神指点。 学习路线 Linux(shell,高并...

董黎明 ⋅ 22分钟前 ⋅ 0

systemd编写服务

一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。 如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。 ...

勇敢的飞石 ⋅ 24分钟前 ⋅ 0

mysql 基本sql

CREATE TABLE `BBB_build_info` ( `community_id` varchar(50) NOT NULL COMMENT '小区ID', `layer` int(11) NOT NULL COMMENT '地址层数', `id` int(11) NOT NULL COMMENT '地址id', `full_......

zaolonglei ⋅ 32分钟前 ⋅ 0

安装chrome的vue插件

参看文档:https://www.cnblogs.com/yulingjia/p/7904138.html

xiaoge2016 ⋅ 35分钟前 ⋅ 0

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 57分钟前 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 今天 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 今天 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 今天 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部