3

我有一个包含多个 WARS 的 Web 应用程序。这些 WARS 都执行不同的功能,但有许多共同点:Css、Js、页眉和页脚,以及某些用于输出错误消息和交易确认的 jsps。为了良好的可维护性,我不想将这些共享文件中的任何一个放在多个位置,而是在一个位置,所以如果我对一个位置进行编辑,它就会全部显示出来。只是基本的代码管理东西,我认为我真的不需要向这里的任何人解释这一点。

对于 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

4

3 回答 3

2

您可以通过 获取其他 servlet 上下文ServletContext#getContext(),然后使用它的请求调度程序作为可用的ServletContext#getRequestDispatcher()。首先,您需要配置服务器以启用“跨上下文”选项。在大多数服务器上默认禁用此功能。不清楚您使用的是哪个服务器,所以这里只是一些提示:对于 Tomcat,检查 的crossContext属性,对于context.xmlGlassfish,检查.crossContextAllowedglassfish-web.xml

完成后,您将能够ServletContext通过 servlet 中的上下文路径获取另一个,如下所示:

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

然后,您需要RequestDispatcher从它获取所需资源的路径上的 a 并调用forward()它,从而传递当前的 HTTP servlet 请求和响应。

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

一个完全不同的替代方案是创建一个完全独立的 Java 项目(在 Eclipse 中称为“Web 片段项目”),其中您将共享的 JSP 放在/META-INF/resourcesJava 源文件夹的文件夹中。最后用这个 Java 项目以文件夹中的 JAR 文件的形式部署所有 WAR /WEB-INF/lib(在 Eclipse 中,将独立的 Java 项目添加为所有 Web 项目的“部署程序集”就足够了)。您可以访问/META-INF/resources文件夹中的 JSP,就好像它们在当前 WAR 中一样。

于 2012-06-29T17:42:30.917 回答
2

如果您使用的是符合 servlet 3.0 的服务器,我建议将所有共享的 Web 资源(JSP、CSS 文件等)META-INF/resources打包到 jar 目录中。把这个jar放到WEB-INF/lib每个webapp的里面,这些共享资源就会成为webapp的一部分,就好像它们直接在webapp的根目录下一样。

于 2012-06-29T17:46:33.157 回答
1

使用ServletContext.getContext()来访问其他应用程序的上下文(在同一虚拟主机内)。获得之后,您可以使用该请求调度程序进行转发。

为了使上述工作正常,您可能需要启用某些供应商特定设置来覆盖默认安全性,请参见此处:crossContext 属性在 Tomcat 中的作用是什么?它是否启用会话共享?

于 2012-06-29T17:43:55.077 回答