Servlets forward

oscar33

Grünschnabel
Hallo,

ich beschäftige mich seit einiger Zeit mit Servlets und Portlets und bin im Laufe zu der Fragestellung gekommen, ob es möglich ist, nach einem forward im Response zu prüfen, ob das Servlet durch ein forward aufgerufen worden ist. Mir würde es reichen, wenn ich vorher ein boolean hinterlegen kann, auf welches ich nachher zugreife. Leider hat dies Momentan nicht zum gewünschten Erfolg geführt :confused: . Mir wird bei Änderung des flags im response gleich angezeigt, das ich committed habe, womit ein forward automatisch fehlschlägt.

Ich hoffe, es hatte schon jemand eine ähnliche Fragestellung. Ob der Aufruf von einem Portlet oder Servlet gekommen ist, spielt keine Rolle.

Viele Grüße :)
 
Hi,

also wenn ich dich richtig verstehe müsste es doch reichen auf der Seite die das "forward" ausführt einen Parameter im Request zu übergeben, welcher auf der forwarded Seite dann in den Response geschrieben wird und von dir gelesen werden kann. Eventuell hab ich das Problem aber auch nicht ganz verstanden ;)

MfG
 
Hallo, leider reicht mir das nicht. Ich habe eine Klasse die von HttpServletResponseWrapper abgeleitet ist und in der will ich über den response auswerten können, ob das servlet über ein forward aufgerufen worden ist.
 
Hallo,

also wenn du in deinem Servlet den Request über einen RequestDispatcher forwardest kannst du ein Attribut am Request setzen welches du dann später wieder ausliest...

Java:
package de.tutorials.web.servlets;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class for Servlet: FrontController
 *
 * @web.servlet
 *   name="FrontController"
 *   display-name="FrontController" 
 *
 * @web.servlet-mapping
 *   url-pattern="/FrontController"
 *  
 */
 public class FrontController extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
   static final long serialVersionUID = 1L;
   
    /* (non-Java-doc)
     * @see javax.servlet.http.HttpServlet#HttpServlet()
     */
    public FrontController() {
        super();
    }       
    
    /* (non-Java-doc)
     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //response.getWriter().println("hello");
        request.setAttribute("forwarder", getServletName());
        request.getRequestDispatcher("BubuServlet").forward(request, response);
    }                      
}

Anschließend kannst du dann via:
Java:
package de.tutorials.web.servlets;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class for Servlet: BubuServlet
 * 
 * @web.servlet name="BubuServlet" display-name="BubuServlet"
 * 
 * @web.servlet-mapping url-pattern="/BubuServlet"
 * 
 */
public class BubuServlet extends javax.servlet.http.HttpServlet implements
        javax.servlet.Servlet {
    static final long serialVersionUID = 1L;

    /*
     * (non-Java-doc)
     * 
     * @see javax.servlet.http.HttpServlet#HttpServlet()
     */
    public BubuServlet() {
        super();
    }

    /*
     * (non-Java-doc)
     * 
     * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request,
     *      HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        if (null != request.getAttribute("forwarder")) {
            response.getWriter().println(
                    request.getAttribute("forwarder")
                            + " forwarded to this servlet");
        } else {
            response.getWriter().println("servlet was called directly");
        }
    }

    /*
     * (non-Java-doc)
     * 
     * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request,
     *      HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }
}

darauf zugreifen, ganz einfach...

Gruß Tom
 
Hallo, ich meine etwas in der folgenden Art:

Code:
public class dispatcher {
	public void forward(Request request, Response response){
		if (((HttpServletResponse)response).isCommitted()){
			throw new IllegalStateException("Response has been committed, this isn't allowed before forward" +
											" method. Content must delete before service from servlet is called.");
		}
		InternalPortletRequest internalRequest = InternalImplConverter.getInternalRequest(request);
		InternalPortletResponse internalResponse = InternalImplConverter.getInternalResponse(response);
		boolean isForwarded = (internalRequest.isForwarded()||internalResponse.isForwarded());
        try {
        	internalRequest.setForwarded(true);
        	internalRequest.setForwardedQueryString(queryString);
        	if (!namedDispatcher){
        		setAttributesForward(internalRequest);
        	}
        	internalResponse.setForwarded(true);

            requestDispatcher.forward((HttpServletRequest) internalRequest,
            		(HttpServletResponse) internalResponse);
        } catch (IOException ex) {
            throw ex;
        } 
	}
}


class Request extends HttpServletRequestWrapper{
	.....
}

class Response extends HttpServletResponseWrapper{
	...
	
	
	boolean forwarded =false;
	public void setForwarded(boolean forwarded){
		this.forwarded = forwarded; 
	}
	public boolean isCommitted(){
		if (forwarded)
			return false;
		else
			return super.isCommitted();
	}
}

damit kann ich vom response Objekt auf die Standardmethoden zugreifen, kann diese aber gegebenenfalls auch manipulieren. Ich will hoffen, ich habe mich mit dem Bsp ein bisschen deutlicher ausgedrückt. Setze ich den rot markierten Bereich nicht, gibt es beim forwarden kein Problem.
 

Neue Beiträge

Zurück