我有一个包含多个 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