Solved

RequestDispatcher.forward() and POST

Posted on 2000-02-14
7
589 Views
Last Modified: 2008-02-01

I need to POST various parameters from one servlet to the next.

I've been using sendRedirect (which works, but is very irritating under anything but IE). But forward() seems to be the correct way. However, it only seems to support GET.

So, how can I POST to the next servlet, without annoying "this page has moved" messages appearing.

We need to explicitly dictate whether or not parameters are passed using POST or GET - as our servlets may perform two distinct tasks.
0
Comment
Question by:dogma
  • 4
  • 3
7 Comments
 
LVL 16

Expert Comment

by:heyhey_
ID: 2519116
>> as our servlets may perform two distinct tasks.

why don't you use seperate servlets for each task ?

and, please post some example code.
0
 

Author Comment

by:dogma
ID: 2519244

We already have over 100 servlets. Basically, it's one servlet to one page.

Each servlet can have two tasks:
1) Render the page with content
2) Process changes to the content on that page

When a doGet() is received, we render by loading values and kicking off a JSP. When a doPost() is received, we examine the FORM variables for changes, perform any update, and then doFoward() to another page depending on what was changed, context etc.. We have a very large class topology, so it's meaningless to provide too many code extracts.

This is our doForward() function which is a member of the TonicServlet class (which has been derived from HttpServlet).
 
public void doForward(String url) throws TonicForwardException{
 try{
  String encoded_url = getResponse().encodeURL(url);
  getResponse().sendRedirect(encoded_url);
  throw new TonicForwardException();
 }
 catch(IOException exception){
  exception.printStackTrace();
 }
}

As you can see: it's actually a temporary redirect (which some browsers report annoying messages about). But it works for GET.

We pass the URL (e.g. http://server/MyServlet) which then applies any encoding (to add the SessionID etc.). The TonicForwardException serves to allow the current servlet to close without doing anything else (as control of output is handled by the forward servlet).

This function always sends the various paramters by GET - ie. the next servlet will render. However, there are circumstances where we want to be able to send parameters directly to another servlet for processing (performing the POST function).

So, we need a function to be of the form:

doForward(String url,boolean usePost);

So how is it done?

0
 
LVL 16

Expert Comment

by:heyhey_
ID: 2519370
in fact you are returning 'Resource moved' response to the client browser, which send another request to the new resource location. you can't 'redirect' POST request this way (because 'resource moved' returns only new URL as parameter) .

I don't see why you need this additional traffic (response + another request) - when you can implement all your logic in one pass. fo example you can use

getServletContext().getRequestDispatcher(servletURL).forward(request, response);
(Servlet API 2.1)

0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:dogma
ID: 2522108
Exactly.

forward() (as stated earlier) always sends by GET. How do I send by POST?
0
 
LVL 16

Expert Comment

by:heyhey_
ID: 2522268
1.
.....
public void doForward(String url) throws TonicForwardException{
 try{
  String encoded_url = getResponse().encodeURL(url);
  getResponse().sendRedirect(encoded_url);

....

I can see only sendRedirect in your code (no RequestDispatcher at all).

2.
>> forward() (as stated earlier) always sends by GET.

what's your environment ? (web server / servlet runner etc.)

3. you'd better put all your 'application logic code' outside of servlets. use servlets to parse the extract parameters from the HttpRequset, and handle this request in some other Object (this way you won't need servlet forwarding at all)
0
 

Author Comment

by:dogma
ID: 2522513
OK, let's boil it down... I have used forward(), but couldn't get it to work as I needed, so I reverted to the sendRedirect() which did - but Netscape whinges.

So, now I want to know how to get the forward() method to work as required.

My further investigations have shown that:

1) If a doGet() is received by a servlet, and a forward() is made to another... the doGet() of the second servlet is called.

2) If a doPost() is received by a servlet, and a forward() is made to another... the doPost() of the second servlet is called.

Therefore, the question now becomes...

How can I do the following:

3) If a doGet() is received by a servlet, and a forward() is made to another... the doPost() of the second servlet is called.

and

4) If a doPost() is received by a servlet, and a forward() is made to another... the doGet() of the second servlet is called.

I'm sorry if my question was unclear. You'll have to forgive me as I've only been doing Java for three weeks! Let alone Servlets!

tia.
0
 
LVL 16

Accepted Solution

by:
heyhey_ earned 100 total points
ID: 2522674
it seems to me that you can't use forward() in this situation.
(you can try to find second servlet by name and call it's doPost method directly)

I would recomend you to change your design - put all your logic in seprate objects.
your servlets will parse the http parameters and call the appropriate method of the business object
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

For customizing the look of your lightweight component and making it look opaque like it was made of plastic.  This tip assumes your component to be of rectangular shape and completely opaque.   (CODE)
Introduction This article is the second of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers the basic installation and configuration of the test automation tools used by…
Viewers will learn about basic arrays, how to declare them, and how to use them. Introduction and definition: Declare an array and cover the syntax of declaring them: Initialize every index in the created array: Example/Features of a basic arr…
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.

947 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now