/问题描述:/
在Struts中Action是进行业务处理的中心,它最好不要理会其它的事情,大家知道在Struts框架中,ActionServlet接收用户的请求,它会根据request.getServletPath()值去Struts-config.xml中那找对应的一个Action类,然后进行繁索并且无用的二次封装过程(你不信的话,看看它的源码吧,看得我头发晕),因为这部分的处理是我们不需要,因为我们不需要进行业务处理,但它按照它自已的思想先给你提供了业务处理的前期准备.
我们就来说说如何减少这部分的性能损失(也就是如何除去ActionServlet中不必要的为业务处理进行的前期准备工作).
/方案:/
下面写的其实也是我们的项目中正在使用的方案:-)
其实很简单,我想大家都能做得到,就是继承ActionServlet并重写它的process方法(doGet/doPost都调用了该方法),就是回避了原来的无效处理,采取直接的分发方式(因为这部分资源请求,无需进行业务处理).或许你会说,不如提供一个href="xxx/xx.htm"罢了,非也,因为我们的项目中要求对所有的可存取资源要进行存取权限的验证,所以直接的href达不到项目的需求要求.(或许你正在实施的项目也存在这样的问题,你或许已照搬了Struts的架构中的处理过程,若你感觉sturts中那个已固定的处理过程你已厌倦了,请你向下看)
下面对于项目中需要进行业务处理的请求,我们需要按照Struts那一套进行处理的内容,在此不进行讨论,只对那些不需要进行业务处理的请求进行分析.
/具体实施:/
我们的项目中要求对所有的可存取资源要进行存取权限的验证,但项目的实施中我们又要尽可以提高系统的性能,开发时要求以Struts来实现,结合以上的要求,我对系统中的请求分为两类,一类是需要进行业务处理的请求(这部分在此不讨论),另一类是不需要进行业务处理的请求(如一些通知,帮助页面等),请你要注意我不能直接通过href实现,我也想啊,但达不到要求啊??!!
我还是以一个请求来进行示例吧,如应用中有一个请求,查看公司内部当天的通知信息,资源页面在/info/todayinfo.htm我对此类的请求定义了一个链接规则,就是不需要进行业务处理的那部分请求在改变它的请求路径:在一个完整的请求后再上do,如上面的那个请求我用/info/todayinfo.htmdo代替,用户只能进行*.htmdo式的请求(这意味都你必须经过我的权限逻辑验证这一关),当你以*.htm的形式进行请求,我会拦截所有这类请求,返回一个null给你,视它为一个不安全的访问.
附上我的部分代码:
AuthenticateActionServlet.java----进行权限验证的类,它捕获所有*.htmdo请求,验证后将请求分发到destination
/NoAuthentivateActionServlet.java/
//在这里我们将ActionSerlvet中所有无用的东西屏蔽掉(即:将用于为业务处理准备数据的那部
//分的无效处理去除,性能损失将降到最低.
publicvoidprocess(HttpServletRequestrequest,HttpServletResponseresponse)
throwsIOException,ServletException{
Stringpath=request.getServletPath();
RequestDispatcherdispatcher=null;
if(path.toLowerCase().endsWith(".jspdo")){
path=path.substring(0,path.indexOf("."))+".jsp";
}elseif(path.toLowerCase().endsWith(".htmdo")){
path=path.substring(0,path.indexOf("."))+".htm";
}elseif(path.toLowerCase().endsWith(".htmldo")){
path=path.substring(0,path.indexOf("."))+".html";
}
//进行权限监控
if(!authenticate(request)){
path="/error/ErrorMessage.htm";
}
try{
dispatcher=this.getServletContext().getRequestDispatcher(path);
}
}
dispatcher.forward(request,response);
}
/**
*权限监控处理
*/
privatebooleanauthenticate(HttpServletRequestrequest){
//dosomething
returntrue;
}
//web.xml/
NoAuthentivateActionServlet
com.ketty.web.AuthentivateActionServlet
1
NoAuthentivateActionServlet
*.jspdo
NoAuthentivateActionServlet
*.htmdo
NoAuthentivateActionServlet
*.htmldo
NoAuthentivateActionServlet
*.jsdo
NoAuthentivateActionServlet
*.cssdo
//
以上的代码可以作用于其它的任何资源上:如jsp/html/js/css你可以自行进行扩展:-)
以上是本人的一点浅见,如有不对之处,希望高手指点(若你认为是垃圾就当没有看见吧,反正我们项目中是这样进行实施的,我只说出我想说的,让
<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>