2012-06-29 118 views
3

我有一个带有多个WAR的Web应用程序。这些WARS都执行不同的功能,但有许多共同之处:Css,Js,页眉和页脚以及某些jsps来输出错误消息和事务确认。为了保持良好的可维护性,我不想在多个位置使用这些共享文件中的任何一个,而只需要一个位置。如果我编辑了一个文件,它就会显示出来。只是基本的代码管理的东西,我不认为我真的需要在这里向任何人解释这一点。在战争中共享JSP文件,在java中使用forward Servlet

对于Css和Js,我有一个根本的战争,我只是绝对解决所有的<link><script>标签。对于页眉和页脚(jsp片段),我正在使用<c:import>,并且正在从根本战争中再次抓住。我拥有的最后一个问题是共享jsps。

我经常在用户尝试执行导致数据库更改的操作以确认事务已完成或其他需要格式化消息给用户的情况下转发给这些jsps。一个servlet可能是这样的......

public class sampleServlet extends ExtendedHttpServlet{ //ExtendedHttpServlet used to add common function to all of our HttpServlets including the foward function I use below. 
    public void doPost(HttpServletRequest request, HttpServletResponse response){ 

     //Do some preperation stuff here, then... 

     try{ 

      ModelJob.insertNewControlMJob(user, submit); //ModelJob is my inteface to our 'Job' Table Model... 
      submit.setSeqId(ModelJob.getSeqId(user, submit)); 
      EmailFactory.SUBMIT_NEW_EMAIL.sendCMAdminEmail(user, submit, null); 
      EmailFactory.SUBMIT_NEW_EMAIL.sendUserEmail(user, submit, null); 

      req.setAttribute("color","Green"); 
      req.setAttribute("message"," Job Successfully Submited. Sequece id : " + submit.getSeqId()); 
      forward("/WEB-INF/TransactionResult.jsp", req, resp); 
      return; 

     }catch(Exception e){ 

      req.setAttribute("color","Red"); 
      req.setAttribute("message","Teradata failure : " + e.getMessage()); 
      forward("/WEB-INF/TransactionResult.jsp", req, resp); 
      e.printStackTrace(); 
      return; 

     } 
    } 
} 

有了这个作为前锋我称之为上述超ExtendedHttpServlet定义:

protected void forward(String destination, HttpServletRequest request, HttpServletResponse response) 
throws ServletException, IOException 
{ 
    RequestDispatcher dispatcher = request.getRequestDispatcher(destination.toString()); 
    dispatcher.forward(request, response); 
} 

但是这个我必须有TransactionResult副本.jsp在我所有的战争中,这使得维护有点痛苦。

我的问题是 - 有什么办法可以让我的转发功能找到其他WAR中的jsps转发到。或者,也许我可以在我的EAR中包含jsp,并让它在那里找到jsp文件。这是我的理解,jsps只是文件,并在运行时由特殊的servlet编译,所以我不明白为什么这不可能?

感谢任何建议/洞察力/帮助....

编辑由于一些你问哪个服务器,我目前在WebSphere v 7.0

回答

2

您可以通过ServletContext#getContext()并获得其他servlet上下文然后使用ServletContext#getRequestDispatcher()提供的请求调度程序。首先,您需要配置服务器以启用“交叉上下文”选项。这在大多数服务器上默认处于禁用状态。目前还不清楚您使用的是哪个服务器,所以这里只是一些提示:对于Tomcat,请检查crossContext属性context.xml和Glassfish,检查glassfish-web.xmlcrossContextAllowed属性。

一旦这样做,那么你就可以通过它的上下文路径在servlet来获得其他ServletContext如下:

ServletContext otherServletContext = getServletContext().getContext("/otherContextPath"); 

然后,你需要从中获得RequestDispatcher的道路上期望的资源并调用其上的forward(),由此传递当前HTTP servlet请求和响应。

otherServletContext.getRequestDispatcher("/WEB-INF/TransactionResult.jsp").forward(request, response); 

一个完全不同的另一种方法是其特征在于,你把共享的JSP在Java源文件夹的/META-INF/resources文件夹中创建一个完全独立的Java项目(被称为“网络片段工程”在Eclipse)。最后,将此Java项目的所有WAR部署在/WEB-INF/lib文件夹中(在Eclipse中,将独立Java项目添加为所有Web项目的“部署程序集”应该足够)的JAR文件。您可以像访问当前WAR一样访问/META-INF/resources文件夹中的JSP。

2

如果你使用Servlet 3.0兼容的服务器,我建议所有的包装在jar文件的META-INF/resources目录中共享网络资源(JSP,CSS文件等)。将这个jar放入每个webapp的WEB-INF/lib,这些共享资源将成为webapp的一部分,就像它们直接位于webapp的根目录一样。

相关问题