最近在分析的这个产品是闭源的,所以它的特性都不知道是怎么实现的,只能看到了效果以后反向推测,好辛苦
一、特性描述
今天看到其中的一个特性是这样的:
这个系统是动态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。都以"/"开头;查询参数被忽略
分享到:
相关推荐
Servlet引擎利用Java类载入工具载入一个Servlet,Servlet引擎可以从一个本地的文件系统、一个远程的文件系统以及网络载入Servlet。 Servlet的初始化 Servlet引擎载入Servlet后,Servlet引擎必须对Servlet进行初始化...
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而...
2.J2EE是一种技术还是一种平台,他提供了那些技术。 3.什么是Application Server,它有什么功能和优点。 4.简单介绍连接池的优点和原理。 5.Web.xml的作用 四、其他 1.Web安全性的考虑(表单验证、浏览器Basic...
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,它功能强大,性能良好,秒杀当前流行的模板引擎。而且还易学易用。 Java的COM桥 JCom JCom (Java-COM Bridge) 可以...
util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印一般格式是gif,png,这种图片可以设置透明度、水印旋转等,可以参考代码...
面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。 AOP ...