配置Servlet通过url-pattern映射到一个JSP页面
作者:互联网
JSP页面,通过url-pattern映射,直接当成Servlet来用。
前言
前些日子,需要从业务数据库里面提取一些数据,以Json的格式返回给第三方系统。开始想用Tomcat+JSP这样简单的组合就行了,但转念一想,现在还用JSP可能有点Low,对外开放不太好看。
虽然,我认为,编程能力的强弱是对算法理解和优化,以及对业务细分后的精确规划和合理布局。只是,现在很多青轻人认为编程能力的强弱取决于你所用的技术是否牛比,是否最新,是否高级。有这种想法也正常,除了对技术的渴望外,也有当下市场就业方面的因素利导所致。
见识太多项目因用了Spring ORM 框架 后续陷入开发低效和迭代业务修改困难,以及一些新人代码造成的内存泄漏。小项目一般就不用这个玩意。
怎样处理好呢?回想下PHP里有很多URL重写和文件后缀切换的框架,但这里要访问的是oracle,而php对oracle驱动访问接口支持的不太稳定 也不好用。用JAVA比较好。这里的关键是:只要能把jsp后缀去掉就可以了。
一番搜索后,找到 urlrewritefilter 这个库。用了这个库,当客户浏览器访问 xxx.do?xxx 时,就被重定向为 xxx.jsp?xxx 。
接着,所有的业务都写在JSP,然后在服务器上update一下代码,重启也省掉,开发效率高,修改容易,启动飞快,CPU和内存的资源占用极低。
一、新建一个Tomcat工程。打开 web.xml 加入如下配置
<filter>
<filter-name>UrlRewriteFilter</filter-name>
<filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>UrlRewriteFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>
<error-page>
<error-code>404</error-code>
<location>/error.html</location>
</error-page>
二、到官网 http://tuckey.org/ 下载 urlrewritefilter,或者 Maven
<dependency>
<groupId>org.tuckey</groupId>
<artifactId>urlrewritefilter</artifactId>
<version>4.0.3</version>
</dependency>
三、新建urlrewrite.xml放在WEB-INF下,内容如下
<urlrewrite>
<rule>
<from>/(\w*).do(\w*)</from>
<to type="forward">/$1.jsp$2</to>
<!-- 其实就是 htaccess 的语法,后面有提到 -->
</rule>
</urlrewrite>
四、新建一个 test.jsp 内容如下
<%@ page trimDirectiveWhitespaces="true" %>
<%@ page language="java" import="java.util.*" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
out.print("hello:" + request.getParameter("p"));
%>
五、启动服务器,打开网页 http://localhost:8080/test.do?p=good ,就能看到效果。
访问 http://localhost:8080/rewrite-status (或 http://localhost:8080/应用/rewrite-status) 还能看到相关rewrite信息
六、好奇之下,查一下 urlrewritefilter.jar 的源码,看看写的是什么。
发现
* UrlRewriteFilter 发现两个 final 变量
public static final String DEFAULT_WEB_CONF_PATH = "/WEB-INF/urlrewrite.xml";
public static final String DEFAULT_MOD_REWRITE_STYLE_CONF_PATH = "/WEB-INF/.htaccess";
说明此库可以支持 .htaccess 文件
* reloadConf 函数 间歇性的 判断 config 文件是否更新。
再往里,就是 File.lastModified
* org.tuckey.web.filters.urlrewrite.dtds 包下有多个文件,可以直接引用,以防被墙。
* UrlRewriteWrappedResponse.urlRerwiter.processEncodeURL 把用户请求的URL,按规则转换为 outputUrl
包里面的 核心逻辑 和相当一部分 代码就是 花费 在这个函数及其后续解释上,如果不用 htaccess (全部)语法可能会少很多代码。
这个包提供了一个 Java 解释 htaccess 的源码参考。
* 使用 getNewChain 函数 负责生成 新的chain,最后执行 chain.doFilter 交由 Tomcat 后续操作。
标签:WEB,urlrewrite,url,pattern,htaccess,JSP,tuckey,urlrewritefilter 来源: https://blog.csdn.net/RoadToTheExpert/article/details/115306081