Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
803 views
in Technique[技术] by (71.8m points)

java - Does RequestDispatcher work over multiple webapps in one servlet container?

Does RequestDispatcher work over multiple webapps ?

I'm asking because I had a single webapp working fine that uses RequestDispatcher rather than redirects so state isnt lost when displaying error and feedback messages.

However I now need to split some functionality between two webapps, so initial call is made from a webpage hosted on webapp1, calls webapp2 which eventually returns user to a page hosted on webapp1.

Clearly if webapps and webapp2 were on different websites using RequestDispatcher would not be possible but is it if both webapps are deployed within the same instance of a servlet container (tomcat 7)

Update

Got the request dispatcher part to work as explained in answer but am unable to retrieve data put in my webapp2 which iss why Im using it

i.e

webapp2 called , does some processing and then dispatches to a jsp on webapp1

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException
{

    HttpSession userSession = request.getSession(true);
    String emailAddress = ......
    String nextPage     = /finish.jsp
    userSession.setAttribute("DATA", emailAddress);
    ServletContext otherContext = getServletContext().getContext("/webapp1");
    otherContext.getRequestDispatcher(nextPage).forward(request, response); 
}

webapp2 jsp file contains

...
<p>Email(<%=((String)session.getAttribute("DATA"))%>)</p>
...

but always displays null

Update 2 **

Im wondering if Im misunderstanding what crossContext="true" actually does . Does it make the same HttpSession availble in different webapps, or does it just make the ServletContext from one webap availble to another and hence allow one webapp to see the HttpSessions of another webapp ?

Im starting to think what Im doing is a bad idea as Ive always been keen to use vanilla servlet setups and never want to tie myself to a particular implementation. I think it might help if I explain why I flet the need to split the webapps in the first place.

I had a one webapp (webapp1), that was a website about a product I develop and code for purchasing that product using Google Checkout (now Google Wallet).

I then added created a new webapp for a new product (webapp2).

I then tried to add Google Checkout for new product into webapp2, but realised I couldnt do this easily because Google Checkout requires me to provide it with a url which it can call by application once it has processed payment so that I can then send user a license. The url was already set to a servlet in webapp1, but it wouldn't make sense for webapp1 to process payment s for product 2.

One option was to merge webpp1 and webapp2 into one webapp, but this goes against my general view of keeping things modular, it would also mean evey time I would want to make chnages for one product Id have to redeploy everything. It also meant big modifications to webapp1 which I really didnt want to modify as it was working and stable.

The alternative was to create webapp3 and then google url can point to this, and use this for processing purchases of product 1 and product 2 which is what Ive done. But the problem is when purchasing product 1 the starting page is in webapp1 , and once purchase has taken place I want to go back to a page in webapp1, but only webapp3 has the details of the user who has just made the purchase which I wanted to display on on the page in webapp1.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This is due to security reasons by default not possible. You need to configure Tomcat first to enable exposing the ServletContext of the current webapp to other webapps. This is to be done by setting the crossContext attribute of context.xml to true.

<Context ... crossContext="true">

Once done that, then you can use ServletContext#getContext() to obtain the other servlet context by its context path and finally use the RequestDispatcher as obtained by ServletContext#getRequestDispatcher() the usual way.

E.g.

ServletContext otherContext = getServletContext().getContext("/otherContext");
otherContext.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...