# JSF h:outputlink für zurück



## freez (10. Sep 2007)

Hallo,

wie kann ich recht einfach einen hutputLink generieren, der die vorhergehende Seite aufruft? Eine Möglichkeit sehe ich: ich merke mir, in einer Session Bean, wo ich war, aber das ist bei vielen Seiten recht aufwändig zu pflegen. 

Gibt es elegantere Lösungen?


----------



## ms (10. Sep 2007)

In einem Filter kannst du es dir merken.

ms


----------



## freez (10. Sep 2007)

Vielen Dank für den Tipp. Habe auch gleich was erstellt und hänge momentan am umleiten auf die vorhergehende Seite.

Also ich habe einen commandlink:

```
<h:commandLink> 
					<h:outputText value="zurück" />
					<f:param name="back" value="back"/>
			</h:commandLink>
```

Im Filter Frage ich auf den Parameter back ab, ob der Filter umleiten soll.

Ich merke mir also die letzten beiden aufrufenden Seiten (getRequestURI()) und wenn der parameter "back" auftaucht soll der Filter auf die vorletzte aufrufende Seite umleiten. Wie mache ich das im Filter?


```
public void doFilter(ServletRequest requ, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {

        HttpServletRequest httpRequ = (HttpServletRequest) requ; 
        HttpServletResponse httpResp = (HttpServletResponse) resp; 
        if(!SecondLastPage.equals(httpRequ.getRequestURI())){
            FirstLastPage = SecondLastPage;
            SecondLastPage = httpRequ.getRequestURI();
            String backParam = httpRequ.getParameter("back");
            if(backParam != null){
                  if(backParam.equals("back")){
                       //Hier will ich umleiten ... nur wie?
                   }
             }            
        }
        chain.doFilter(requ, resp);		
}
```


----------



## raptor (10. Sep 2007)

Wenn du die neue URL hast kannste sowas machen:


```
((HttpServletResponse)resp).sendRedirect(redirect);
```

edit: Ich habe so etwas ähnliches, nur, dass ich mir im Filter merken muss, welches die letzte Seite war. Dazu speicher ich mir am Ende von doFilter(..) die aktuelle Seite in die Session.


----------



## freez (10. Sep 2007)

So, das funktioniert soweit erst einmal. Hier meine Filtermethode:


```
public void doFilter(ServletRequest requ, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpRequ = (HttpServletRequest) requ; 
        HttpServletResponse httpResp = (HttpServletResponse) resp;
        String requURL = httpRequ.getRequestURL().toString();
        if(!SecondLastPage.equals(requURL)){
        	FirstLastPage = SecondLastPage;
            SecondLastPage = requURL;
        }
        
        String backParam = httpRequ.getParameter("back");
		if(backParam != null && backParam.equals("back"))
				httpResp.sendRedirect(FirstLastPage);
		else
			chain.doFilter(requ, resp);		
	}
```

Das ganze hat momentan nur einen Nachteil: Es funktioniert nur, wenn ich einmal zurückgehe. Gehe ich aber auf der nächsten Seite auch zurück, geht er wieder auf die nachfolgende Seite 

Naja, nun könnte ich noch die Liste mit Seiten erweitern (a la LIFO). Aber das hätte auch seine Grenzen, denn die Liste könnte theroretisch sehr groß werden.

Gibt es keine schönere Lösung mit den NavigationCases der faces-config.xml? Dort lege ich sowieso die Navigation fest. Es wäre natürlich ideal, wenn ich da meine Back Links unterbringen könnte.


----------



## freez (26. Sep 2007)

Hallo,

ich habe meinen Filter weiterentwickelt. Nun arbeitet er mit einer Liste von Links und führt auf die vorhergehende Seite zurück.


```
public void doFilter(ServletRequest requ, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest httpRequ = (HttpServletRequest) requ; 
        HttpServletResponse httpResp = (HttpServletResponse) resp;
        String requURL = httpRequ.getRequestURL().toString();
        HttpSession session = httpRequ.getSession();
        pages = (List<String>) session.getAttribute("pagesList");
        
        String backParam = httpRequ.getParameter("back");
        
        if(pages == null){
        	pages = new ArrayList<String>();
        	pages.add(requURL);
        	session.setAttribute("pagesList", pages);
        } else if(backParam != null && backParam.equals("back")){
            	if(pages.size() >= 2){
            		String LastURL = pages.get(pages.size()-2);
            		pages.remove(pages.size()-1);			
        			httpResp.sendRedirect(LastURL);
        			return;
            	}
		}else {
			String LastURL = pages.get(pages.size()-1);
			if(!LastURL.equals(requURL)){
        			pages.add(requURL);
            }
        }
		chain.doFilter(requ, resp);		
	}
```


----------

