gpt4 book ai didi

java - 跨 war 共享JSP文件,在java servlet中使用forward

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:53:18 25 4
gpt4 key购买 nike

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

对于 Css 和 Js,我有一个根 war ,我只是绝对解决所有 <link><script>标签。对于页眉和页脚(jsp 片段),我使用 <c:import>并再次从根源 war 中夺取。我遇到的最后一个问题是共享 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;

}
}
}

这是我在父类(super class) ExtendedHttpServlet 中定义的上面调用的转发方法:

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

但是有了这个,我必须在我所有的 war 中都有一个 TransactionResult.jsp 的副本,这使得维护有点麻烦。

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

感谢任何建议/见解/帮助....

编辑 由于你们中的一些人问哪个服务器,我目前使用的是 Websphere v 7.0

最佳答案

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

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

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

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

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

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

关于java - 跨 war 共享JSP文件,在java servlet中使用forward,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11266315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com