`

利用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。都以"/"开头;查询参数被忽略
分享到:
评论

相关推荐

    java-servlet-api.doc

    Servlet引擎利用Java类载入工具载入一个Servlet,Servlet引擎可以从一个本地的文件系统、一个远程的文件系统以及网络载入Servlet。 Servlet的初始化 Servlet引擎载入Servlet后,Servlet引擎必须对Servlet进行初始化...

    java 面试题 总结

    继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而...

    JAVA面试题最全集

    2.J2EE是一种技术还是一种平台,他提供了那些技术。 3.什么是Application Server,它有什么功能和优点。 4.简单介绍连接池的优点和原理。 5.Web.xml的作用 四、其他 1.Web安全性的考虑(表单验证、浏览器Basic...

    超级有影响力霸气的Java面试题大全文档

     继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而...

    java开源包3

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    java开源包4

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    java开源包1

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    java开源包11

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    java开源包2

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    java开源包6

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    java开源包5

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    java开源包10

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    java开源包8

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    java开源包7

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    java开源包9

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    java开源包101

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    Java资源包01

    Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...

    JAVA上百实例源码以及开源项目

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    JAVA上百实例源码以及开源项目源代码

     util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...

    Spring面试题

    面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。 AOP ...

Global site tag (gtag.js) - Google Analytics