JSF – 08 – Page Forward & Page Redirect & Post/Redirect/Get

Merhaba Arkadaslar
Bu bolumde Page Forward , Page Redirect ve Post / Redirect / Get design pattern kavramlarini inceleyecegiz.

Page Forward

Onceki orneklerimizde form submit islemi icin h:commandButton kullandik.
JSF varsayilan olarak h:commandButton sayfa gecisinde(navigating) Page Forward yaklasimini kullanir.

  • Browser/Tarayici ilgili URL ‘e HTTP GET request gonderir.
    http://localhost:8080/Injavawetrust.jsf/01.hellojsf/login.xhtml
    Chrome da Network sekmesini inceleyecek olursak bu istek icin Request Method GET kullanildigini gorebiliriz.
  • JSF request/istegi alir ve geriye login.xhtml sayfasini doner.
  • Browser/Tarayici login.xhtml icerigini gosterir.
  • HTTP GET JSF
  • Kullanici h:commandButton’a tiklar , form submit edilir (HTTP POST)
  • JSF action’i alir ve Page Forward islemi welcome.xhtml e yapilir.
  • JSF welcome.xhtml icerigini doner.
  • HTTP POST JSF
  • Browser/Tarayici URL degismez/guncellenmez.
  • login url

Page Forward yaklasimi Servlet API de yer alan javax.servlet.RequestDispatcher#forward metoduna benzer etkiyi gosterir. Hatirlayacagimiz gibi forward metodu kullanilip request dispatch edildiginde URL de degisiklik olmaz.  Servlet & JSP – 12 – Attribute

RequestDispatcher.java

package javax.servlet;

import java.io.IOException;

public interface RequestDispatcher {

    ....
    public void forward(ServletRequest request, ServletResponse response)
            throws ServletException, IOException;
    ....
}

Page Redirect

  • Browser/Tarayici ilgili URL ‘e HTTP GET request gonderir.
    http://localhost:8080/Injavawetrust.jsf/09.page.redirect/loginPageRedirect.xhtml
    Chrome da Network sekmesini inceleyecek olursak bu istek icin Request Method GET kullanildigini gorebiliriz.
  • JSF request/istegi alir ve geriye loginPageRedirect.xhtml sayfasini doner.
  • Browser/Tarayici loginPageRedirect.xhtml icerigini gosterir.
  • HTTP GET JSF Redirect
  • Kullanici h:commandButton’a tiklar , form submit edilir (HTTP POST)
  • JSF action’i alir ve Page Redirect islemi welcome.xhtml e yapilir.
  • HTTP Response , Location header bilgisiyle birlikte doner. Location header bilgisi redirect islemi yapilacak yeni sayfanin URL bilgisini icerir.
  • Page Redirect isleminde 2 tane HTTP Request soz konusudur. Form Submit edildiginde Chrome da Network sekmesini inceleyebiliriz. Response Headers sekmesinde Location bilgisi Redirect yapilacak xhtml sayfasinin URL bilgisini icermektedir.
  • HTTP POST JSF Redirect Location
  • HTTP GET JSF Redirect Location
  • Page Redirect , Servlet API javax.servlet.HttpServletResponse#sendRedirect metodu gibi calisir. Ornegi inceleyebilirsiniz ; Servlet & JSP – 11 – Response – 02

Page Redirect’i kullanabilmek icin <h:commandButton> Component’i icin action ozelliginde faces-redirect=true parametre bilgisini ekliyoruz.

<h:commandButton value="Login" action="welcome?faces-redirect=true" />

loginPageRedirect.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html">
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Welcome</title>
</h:head>
<h:body>
	<h:form>
		<h3>Please enter your name and password.</h3>
		<table>
			<tr>
				<td>Name:</td>
				<td><h:inputText value="#{pageRedirectBean.name}" /></td>
			</tr>
			<tr>
				<td>Password:</td>
				<td><h:inputSecret value="#{pageRedirectBean.password}" /></td>
			</tr>
		</table>
		<p>
			<h:commandButton value="Login" action="welcome?faces-redirect=true" />
		</p>
	</h:form>
</h:body>
</html>

welcome.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:h="http://java.sun.com/jsf/html">
<h:head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<title>Welcome</title>
</h:head>
<h:body>
	<h3>Page Redirect Example </h3>
	<h3>Name : #{pageRedirectBean.name}</h3>
</h:body>
</html>

PageRedirectBean.java

package _09.page.redirect;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

@ManagedBean
@SessionScoped
public class PageRedirectBean {
    private String name;
    private String password;

    public String getName() {
	return name;
    }

    public void setName(String name) {
	this.name = name;
    }

    public String getPassword() {
	return password;
    }

    public void setPassword(String password) {
	this.password = password;
    }
}

Post–Redirect–Get

Post/Redirect/Get duplicate form submit probleminden kacinmak/korunmak icin kullanilan bir design pattern yaklasimidir.

Bir form HTTP POST  ile server’a submit edildiginde ,daha sonrasinda kullanici sayfayi refresh ettiginde HTTP POST request tekrar submit edilir. Bu durum istenmeyen sonuclara neden olabilir , ornegin duplicate satin alma islemi gibi.

Bu durumdan kacinmak icin Post/Redirect/Get pattern’i kullanilabilir.

Yaptigimiz orneklerde , yaptigimiz Page Redirect ornegi haric , form submit edildiginde Page Forward yaklasimina uygun olarak calismaktadir. Submit islemi sonrasinda URL degismemektedir. Submit islemi sonrasinda sayfayi refresh etmeye calisirsak pop-up cikmaktadir. Bu pop-up ‘a Continue dedigimizde onceki HTTP POST islemi tekrar etmektedir.
Burada basit bir ornek yapmistik , eger DB’ye kayit atma durumu ya da baska kritik bir islem yapildigini dusunursek form’un tekrar submit edilmesi probleme neden olabilir.

Confirm Form Resubmission

  • Siparis formunu doldurup submit edilir, HTTP POST request.
  • Siparise dair bilgiler DB’ye kaydedilir (insert)
  • Sayfa refresh edilirse ve submit edilirse tekrar HTTP POST request sonucu DB’ye kayit atilir.

PostRedirectGet_DoubleSubmitProblem

Post/Redirect/Get yaklasimina ornek olarak Page Redirect icin yaptigimiz ornegi verebiliriz.
loginPageRedirect.xhtml formunu submit ettigimizde Page Redirect sonrasinda URL degismektedir. Submit sonrasinda sayfayi refresh ettigimde onceki ornekte oldugu gibi form tekrar submit edilmez.

refresh redirect page jsf

  • Siparis(order) formu doldurulup submit edilir, HTTP Post request
  • Siparis bilgileri DB’ye kaydedilir. (insert).
  • Page Redirect sonrasi Location header bilgisinde yer alan URL’e HTTP GET request’te bulunulur.
  • Sayfa refresh edildiginde HTTP POST ile form submit islemi yapilmaz ! Bunun yerine mevcut sayfa HTTP GET request ile getirilir.

PostRedirectGet_DoubleSubmitSolution

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *