利用servlet规范,一种实现动态路径的方法

最近在分析的这个产品是闭源的,所以它的特性都不知道是怎么实现的,只能看到了效果以后反向推测,好辛苦

一、特性描述

今天看到其中的一个特性是这样的:

这个系统是动态DDL的,当用户做了某些操作以后,会实时在数据库中建表。并且,无需重启,马上可以用浏览器访问一个新的URL,访问刚创建的这张表

比如新建了一个User表,就可以在浏览器里输入类似下面的URL来访问到:

http://ip:port/application/servlet/manage/UserTable

新建了Car表,可以用下面的URL访问到:

http://ip:port/application/servlet/manage/CarTable

二、实现原理

看到它的URL里有servlet字样,基本可以断定用的是JAVA平台(除非用URL骗我。。)

想了一下,有一个很简单的办法,可以实现这个功能。只需要用到servlet规范里的几个基本的特性

写了一段代码验证成功了,代码很简单就不贴了,只记录一下原理。主要用到的是servlet映射中的路径匹配,以及路径获取API

上面例子中的UserTable和CarTable我想都是假的,真正应该有一个类似于GetTable这样的servlet

然后在web.xml里配置一个路径匹配规则
<url-pattern>/servlet/manage/*</url-pattern>

这样的话,无论是上面的UserTable还是CarTable,实际上都会跳转到GetTable这个实际的servlet里

然后在这个servlet里,用
request.getPathInfo();

这个方法,就可以拿到/UserTable,或者/CarTable,之后再 对字符串进行处理,就可以根据User和Car作为 查询条件,到刚才新创建的表里取出数据,最后生成相应的页面返回给浏览器了

对于用户来说,他是看不到浏览器地址有任何变化的,所以对用户来说,这就是一个动态的URL

三、关键点

这种实现方式,非常重要的是最后的PathInfo必须有一个命名模式:

1、URL虽然是动态的,但是模式一样,都是/XXXTable。有了统一模式,才能从PathInfo中截取关键字,作为查询条件

2、截取出的关键字,必须和数据库表名有某种关联。我这种实现是比较粗糙的,等于将数据库表名直接作为URL关键字了。其实用主键,或者某个特殊字段也是可行的。总之URL解析只是链条的一环,整个系统必须要有一致的策略才行

四、HttpServletRequest跟路径有关的API

以http://ip:port/application/servlet/manage/UserTable?name=abc为例

request.getContextPath(),返回的是/application
request.getServletPath(),返回的是/servlet/manage
request.getPathInfo(),返回的是/UserTable

也就是说,首部是ContextPath,尾部是PathInfo,剩余中间所有是ServletPath。都以"/"开头;查询参数被忽略

猜你喜欢

转载自kyfxbl.iteye.com/blog/1751474