My FAQ,最新最全的IT技术FAQ
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 未整理篇 | 技术讨论
  当前位置: > 程序开发 > 编程语言 > Java > Struts/Hibernate
怎样降低Struts中不需进行业务处理的性能损耗!
作者:未知 时间:2005-07-24 21:22 出处:JR 责编:My FAQ
              摘要:怎样降低Struts中不需进行业务处理的性能损耗!
/////////////问题描述://///////////
在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中所有无用的东西屏蔽掉(即:将用于为业务处理准备数据的那部
//分的无效处理去除,性能损失将降到最低.
  1. public void process(HttpServletRequest request, HttpServletResponse response)
  2.       throws IOException, ServletException {
  3.     java/lang/String.java.html" target="_blank">String path=request.getServletPath();
  4.     RequestDispatcher  dispatcher=null;
  5.     if(path.toLowerCase().endsWith(".jspdo")) {
  6.       path=path.substring(0,path.indexOf("."))+".jsp";
  7.     }else  if(path.toLowerCase().endsWith(".htmdo")) {
  8.       path=path.substring(0,path.indexOf("."))+".htm";
  9.     }else  if(path.toLowerCase().endsWith(".htmldo")) {
  10.       path=path.substring(0,path.indexOf("."))+".html";
  11.     }
  12.     //进行权限监控
  13.     if(! authenticate(request)){
  14.       path="/error/ErrorMessage.htm";
  15.     }
  16.    try {
  17.       dispatcher=this.getServletContext().getRequestDispatcher(path);
  18.     }
  19.     catch (java/lang/Exception.java.html" target="_blank">Exception ex) {
  20.       
  21.     }
  22.     dispatcher.forward(request,response);
  23.   }
  24.  /**
  25.    * 权限监控处理
  26.    */
  27.   private boolean authenticate(HttpServletRequest request){
  28.     //do something 
  29.     return true;
  30.   }


//////////////////////////////web.xml/////////////////////////////////////
  1.     <servlet id="servlet_1">
  2.       <servlet-name>NoAuthentivateActionServlet</servlet-name>
  3.       <servlet-class>com.ketty.web.AuthentivateActionServlet</servlet-class>
  4.       <load-on-startup>1</load-on-startup>
  5.     </servlet>    
  6.          <servlet-mapping>
  7.         <servlet-name>NoAuthentivateActionServlet</servlet-name>
  8.         <url-pattern>*.jspdo</url-pattern>
  9.     </servlet-mapping>
  10.     <servlet-mapping>
  11.         <servlet-name>NoAuthentivateActionServlet</servlet-name>
  12.         <url-pattern>*.htmdo</url-pattern>
  13.     </servlet-mapping>
  14.     <servlet-mapping>
  15.         <servlet-name>NoAuthentivateActionServlet</servlet-name>
  16.         <url-pattern>*.htmldo</url-pattern>
  17.     </servlet-mapping>
  18.     <servlet-mapping>
  19.         <servlet-name>NoAuthentivateActionServlet</servlet-name>
  20.         <url-pattern>*.jsdo</url-pattern>
  21.     </servlet-mapping>
  22.     <servlet-mapping>
  23.         <servlet-name>NoAuthentivateActionServlet</servlet-name>
  24.         <url-pattern>*.cssdo</url-pattern>
  25.     </servlet-mapping>

//////////////////////////////////////////////////////////////////////////////
以上的代码可以作用于其它的任何资源上:如jsp/html/js/css你可以自行进行扩展 :-)
以上是本人的一点浅见,如有不对之处,希望高手指点(若你认为是垃圾就当没有看见吧,反正我们项目中是这样进行实施的,我只说出我想说的,让别人去说吧)!!
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有
PT>