Servlet & JSP – 11 – Response – 02

Merhaba Arkadaslar,
Onceki bolumde encoding konusuna deginmistik. Bu bolumde su metotlari inceleyecegiz ;

javax.servlet.http.HttpServletResponse arabiriminde yer alan ;

 public void setHeader(String name, String value);
 public void setIntHeader(String name, int value);
 public void setDateHeader(String name, long date);
 public void addHeader(String name, String value);
 public void addIntHeader(String name, int value);
 public void addDateHeader(String name, long date);
 public String getHeader(String name);
 public Collection getHeaders(String name);
 public Collection getHeaderNames();
 public boolean containsHeader(String name);
 public void addCookie(Cookie cookie);
 public void sendRedirect(String location) throws IOException;

javax.servlet.http.HttpServletRequest arabiriminde yer alan ;

 public Cookie[] getCookies();

javax.servlet.http.Cookie sinifinda yer alan ;

   public void setMaxAge(int expiry) {
        maxAge = expiry;
    }

Ornek Uygulama

Yeni bir sinif olusturalim ;
ResponseHeaderMethods

Deployment descriptor(web.xml) dosyamizda tanimlamalarimizi yapalim;

	<servlet-mapping>
		<servlet-name>ResponseHeaderMethods</servlet-name>
		<url-pattern>/responseheadermethods</url-pattern>
	</servlet-mapping>

	<servlet>
		<servlet-name>ResponseCookieMethods</servlet-name>
		<servlet-class>_06_Response.ResponseCookieMethods</servlet-class>
	</servlet>


ResponseHeaderMethods.java

package _06_Response;

import java.io.IOException;
import java.util.Collection;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseHeaderMethods extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		resp.setHeader("firstName", "myname");
		// setHeader metodu ile response header ekliyoruz.
		// setHeader metodu, eger ilgili isme sahip(firstName) header yoksa
		// olusturur varsa uzerine yazar override eder.

		resp.setHeader("firstName", "myname-Override!");
		// setHeader metodu onceki firstName ismine sahip header bilgisini
		// override edecektir.

		// containsHeader metodu parametre olarak aldigi degerde response header
		// olup olmadigini kontrol eder.
		// Eger ilgili response header varsa true yoksa false donecektir.
		boolean contains = resp.containsHeader("firstName");
		System.out.println("contains:" + contains);

		String firstName = resp.getHeader("firstName");
		// getHeader metodu ile fistName ismine sahip response header'a
		// ulasabiliriz.

		System.out.println("firstName:" + firstName);

		resp.addHeader("firstName", "your name");
		resp.addHeader("firstName", "his name");

		// addHeader metodu override yapmaz! Bunun yerine ekleme yapacaktir.

		// firstName ismine sahip response header'inin 3 tane degeri var.
		// Peki bu degerlere nasil ulasabiliriz ?
		System.out.println("### more value getHeader test###");
		firstName = resp.getHeader("firstName");
		System.out.println("firstName:" + firstName);

		// getHeader metodu yetersiz kalmaktadir.Eger ayni isme sahip header
		// varsa bu durumda ilk eklenen header'a ait degeri dondurmektedir.

		System.out.println("#### getHeaders test ####");
		Collection firstNamesHeader = resp.getHeaders("firstName");
		for (String firstNameHeader : firstNamesHeader) {
			System.out.println("firstName:" + firstNameHeader);
		}

		// setIntHeader ve addIntHeader da value parametresi int tipindedir.
		// Bu sayede int tipindeki bir degiskeni String'e convert etmeden direkt
		// kullanabiliriz.

		resp.setIntHeader("year", 571);
		resp.addIntHeader("year", 1071);

		// Benzer sekilde setDateHeader ve addDateHeader metodunun value kismi
		// long tipindedir.
		resp.setDateHeader("today", System.currentTimeMillis());
		resp.addDateHeader("today", 10000000L);

		System.out.println("#### getHeaderNames ####");

		// getHeaderNames metodu bize response header'larin ismini donecektir.
		Collection headerNames = resp.getHeaderNames();
		for (String headerName : headerNames) {
			System.out.println(headerName);
			
		}
	}
}

Kullandigimiz metotlari inceleyelim;
setHeader metodumuz ile name/value yapisinda response header olusturabiliriz.

    public void setHeader(String name, String value);

setHeader metodu, eger ilgili isme sahip header yoksa yeni olusturur varsa uzerine yazar yani override eder.

containsHeader
metodu parametre olarak aldigi degerde response header olup olmadigini kontrol eder.

public boolean containsHeader(String name);

getHeader metodu ile ekledigimiz response header’lara ulasabiliriz. Bunun icin ekledigimiz response header’in ismini arguman olarak metoda vermeliyiz.

    public String getHeader(String name);

addHeader metodu setHeader metodu gibi response header eklemek icin kullanilir. Aralarindaki fark setHeader metodu oncesinde ayni isme sahip response header varsa bunu override edecektir , addHeader metodu ise override etmez ekleme yapar.

    public void addHeader(String name, String value);

Ayni isimde response header oldugunda getHeader metodu yetersiz kalmaktadir , cunku sadece ilk olarak eklenen response header’in degerini dondurur. Bu durumda getHeaders metodunu kullanabiliriz.

public Collection<String> getHeaders(String name);

setIntHeader ve addIntHeader metotlarinda value parametresi int tipindedir.
Bu sayede int tipindeki bir degiskeni String’e convert etmeden direkt olarak response header icin value olarak kullanabiliriz.

 public void setIntHeader(String name, int value);
 public void addIntHeader(String name, int value);

Benzer sekilde setDateHeader ve addDateHeader metodunun value kismi long tipindedir.
Tarih formatinda response header icin kullanilabilir.

public void setDateHeader(String name, long date);
public void addDateHeader(String name, long date);

getHeaderNames() metodu ile ekledigimiz bu response header bilgilerine ulasabiliriz.

public Collection<String> getHeaderNames();

Servlet sinifimizi calistirip Chrome da F12 –> Networks.
not: sayfayi refresh edin ve bu sirada F12 aktif olsun.

response header test

Eclipse’te Console’da ciktimiz ;

contains:true
firstName:myname-Override!
### more value getHeader test###
firstName:myname-Override!
#### getHeaders test ####
firstName:myname-Override!
firstName:your name
firstName:his name
#### getHeaderNames ####
firstName
firstName
firstName
year
year
today
today

Ornek Uygulama – 2

Bu bolumde kucuk bir cookie ornegi yapacagiz. Cookielere HTTP Cookie, web cookie, browser cookie de denilir.
Cookiler kullanicinin browser/tarayicisinda saklanan kucuk bilgilerdir. Sayfa yuklendiginde tarayici cookieleri servera gonderir bu sayede server daha once bu kullanicinin aktivitelerini bilebilir.

Daha fazla bilgi icin surayi okuyabilirsiniz ;
HTTP Cookie

ResponseCookieMethods sinifini olusturup , web.xml dosyamiza ekleyelim.

	<servlet>
		<servlet-name>ResponseCookieMethods</servlet-name>
		<servlet-class>_06_Response.ResponseCookieMethods</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>ResponseCookieMethods</servlet-name>
		<url-pattern>/responsecookiemsethods</url-pattern>
	</servlet-mapping>

ResponseCookieMethods.java 

package _06_Response;

import java.io.IOException;

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

public class ResponseCookieMethods extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		Cookie userNameCookie = new Cookie("userName", "levent");
		Cookie passwordCookie = new Cookie("password", "123456");

		resp.addHeader("Set-Cookie","testName=testValue");

		resp.addCookie(userNameCookie);
		resp.addCookie(passwordCookie);

		Cookie[] cookies = req.getCookies();
		if (cookies != null) {
			for (Cookie c : cookies) {
				System.out.println(c.getName() + " " + c.getValue());
			}
		}
	}
}

Cookie ile yeni bir obje olusturduk.

public Cookie(String name, String value) {
...
}

addCookie() metodumuz ile olusturdugumuz Cookie objesini response’a ekliyoruz.
getCookies() metodumuz ile ekledigimiz bu Cookie objelerine erisebiliriz.

    public Cookie[] getCookies();

Cookie sinifinda yer alan getValue() ve getName() metotlari ile name/value bilgilerine erisebiliriz.

    public String getValue() {
        return value;
    }

    public String getName() {
        return name;
    }

addCokie() metoduna ek olarak ;
addHeader() metoduyla da Cookie olusturabiliriz. Bunun icin name degeri Set Cookie olmalidir.

resp.addHeader("Set-Cookie","testName=testValue");

ResponseCookieMethods sinifimizi calistiralim ;

cookies

Eclipse’te Console’da

testName testValue
userName levent
password 123456

Cookie sinifinda maxAge degiskeni vardir ve varsayilan olarak degeri -1 dir.  Cookiler auto-expire olacaktir. Farkli browserlar farkli sekilde davranis sergileyebilir. Ornegin bir browser icin tarayici kapandiginda cookie ler de silinirken digerinde silinmeyebilir.

private int maxAge = -1; //cookies auto-expire

Eklenen cookie icin maxAge belirtilebilir ;

    public void setMaxAge(int expiry) {
        maxAge = expiry;
    }

ResponseCookieMethods sinifimiza setMaxAge metodunu ekleyelim;

package _06_Response;

import java.io.IOException;

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

public class ResponseCookieMethods extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		Cookie userNameCookie = new Cookie("userName", "levent");
		userNameCookie.setMaxAge(5); // 5 saniye time out suresi
		// bu servlet bir kere cagirdiktan sonra ResponseCookieTimeoutCheck
		// servlet ini calistiralim.
		
		// Cookilere goz attigimizda 5 saniye sonra userName cookiesi silinecektir.

		Cookie passwordCookie = new Cookie("password", "123456");

		resp.addHeader("Set-Cookie", "testName=testValue");
		resp.addCookie(userNameCookie);
		resp.addCookie(passwordCookie);

		Cookie[] cookies = req.getCookies();
		if (cookies != null) {
			for (Cookie c : cookies) {
				System.out.println(c.getName() + " " + c.getValue());
			}
		}

	}
}

Test etmek icin yeni bir servlet oluturalim ;

package _06_Response;

import java.io.IOException;

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

public class ResponseCookieTimeoutCheck extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		Cookie[] cookies = req.getCookies();
		if (cookies != null) {
			for (Cookie c : cookies) {
				System.out.println(c.getName() + " " + c.getValue());
			}
		}
	}

}

ResponseCookieMethods  cagirdiktan sonra ResponseCookieTimeoutCheck servlet’ini calistiralim. Cookilere goz attigimizda 5 saniye sonra userName cookiesi silinecektir.

  <servlet>
      <servlet-name>ResponseCookieTimeoutCheck</servlet-name>
      <servlet-class>_06_Response.ResponseCookieTimeoutCheck</servlet-class>
 </servlet>

 <servlet-mapping>
      <servlet-name>ResponseCookieTimeoutCheck</servlet-name>
      <url-pattern>/responsecookietimeoutcheck</url-pattern>
 </servlet-mapping>

Ornek Uygulama – 3

Bu bolumde sendRedirect metodunu inceleyecegiz. sendRedirect metodu ile servlet’ime gelen istegi baska bir kaynaga/resource yonlendirebiliriz.

ResponseRedirect.java

package _06_Response;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseRedirect extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		int status = HttpServletResponse.SC_MOVED_TEMPORARILY; // 301

		if (status == HttpServletResponse.SC_OK) { // 200
			// /....
		} else {
			resp.sendRedirect("http://www.injavawetrust.com");
		}

	}
}

web.xml dosyamiz ;

 <servlet>
     <servlet-name>ResponseRedirect</servlet-name>
     <servlet-class>_06_Response.ResponseRedirect</servlet-class>
 </servlet>

 <servlet-mapping>
     <servlet-name>ResponseRedirect</servlet-name>
     <url-pattern>/responseredirect</url-pattern>
 </servlet-mapping>

ResponseRedirect ornegimizi calistirdigimizda http://www.injavawetrust.com/ sayfamiz acilacaktir.

sendRedirect metoduna arguman olarak verdigimiz adress ; relative path ya da absolute path olabilir.

Relative path kullandigimizda WebContent’i referans almaktadir. WebContent altina basit bir html dosyasi olusturalim ; redirectMe.html

<!DOCTYPE html>
<html>
      <body>
        <h1>It is redirected!</h1>
    </body>
</html>

Absolute path slash / ile baslar. Absolute path ; Container in root adresini referans alir. Bu durumda context path bilgisini de vermemiz gereklidir.

Yeni bir servlet sinifi olusturalim ;

ResponseRedirectMore.java

package _06_Response;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseRedirectMore extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		// resp.sendRedirect("redirectMe.html");
		// WebContent altinda redirectMe.html dosyasi olusturduk.
		// Relative adress kullandigimizda WebContent i referans alacaktir.

		resp.sendRedirect("/injavawetrust/redirectMe.html");
		//absolute path / ile baslar. Bu durumda context path'i de yazmamiz gereklidir.
	
		System.out.println("Bu kisim calismayacaktir!");
		
		
	}
}

Relative path ve absolute path icin yorum satirini ayarlarip test edebiliriz. sendRedirect sonrasindaki kodlar calismayacaktir! finally blogu icerisinde olursa ozaman calisacaktir.

response’a veri yazdigimizda ve bu veri commit edildikten sonra sendRedirect metodu cagrilirsa java.lang.IllegalStateException hatasi verecektir. sendRedirect metodu oncesine su kodu ekleyip test edebiliriz;

		PrintWriter pw = resp.getWriter();
		pw.println("java.lang.IllegalStateException");
		pw.print("Cannot call sendRedirect() after the response has been committed");
                pw.flush();
		pw.close();

ResponseRedirectMore sinifimizin son hali ;

package _06_Response;

import java.io.IOException;
import java.io.PrintWriter;

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

public class ResponseRedirectMore extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {

		// resp.sendRedirect("redirectMe.html");
		// WebContent altinda redirectMe.html dosyasi olusturduk.
		// Relative adress kullandigimizda WebContent i referans alacaktir.

		// PrintWriter pw = resp.getWriter();
		// pw.println("java.lang.IllegalStateException");
		// pw.print("Cannot call sendRedirect() after the response has been committed");	
		 //pw.flush();
		// pw.close();
		 
		// flush , close gibi metotlari cagirdigimizda response commit edilir bundan sonra
		
		// sendRedirect cagrilirsa java.lang.IllegalStateException hatasi
		// verecektir.

		resp.sendRedirect("/injavawetrust/redirectMe.html");
		// absolute path / ile baslar. Bu durumda context path'i de yazmamiz
		// gereklidir.

		System.out.println("Bu kisim calismayacaktir!");

	}
}

web.xml dosyamiza ekleyelim ;

 <servlet>
      <servlet-name>ResponseRedirectMore</servlet-name>
      <servlet-class>_06_Response.ResponseRedirectMore</servlet-class>
 </servlet>

 <servlet-mapping>
      <servlet-name>ResponseRedirectMore</servlet-name>
      <url-pattern>/responseredirectmore</url-pattern>
 </servlet-mapping>

Download Excel File

Servlet’ler ile excel, pdf gibi dosyalari kullanicilarin/client indirmesini saglayabiliriz. Projeye WebContent altinda download.xlsx dosyasi ekleyelim.

ResponseExcelDownload.java

package _06_Response;

import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ResponseExcelDownload extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		resp.setContentType("application/ms-excel");
		resp.setHeader("Content-Disposition", "attachment; filename=test.xlsx");

		InputStream is = getServletContext().getResourceAsStream("download.xlsx");
		// getResourceAsStream metodu ile projemizdeki static source/kaynaklara
		// ulasabiliriz.
		// WebContent dizinini relative adress olarak alir. download.xlsx
		// WebContent dizininde yer aldigi icin bu kaynaga sorunsuzca
		// ulasabiliriz.

		int read = 0;
		byte[] bytes = new byte[1024];
		ServletOutputStream sos = resp.getOutputStream();
		while ((read = is.read(bytes)) != -1) {
			sos.write(bytes, 0, read);
		}

		// resp.getWriter();
		// getOutputStream metodunu ve getWriter metodunu ayni anda
		// kullanamayiz.
		// java.lang.IllegalStateException: getOutputStream() has already been
		// called for this response

		sos.close();

	}
}

setContentType metodu ile icerik bilgisini veriyoruz. Sonrasinda asil gerekli olan Content-Disposition headerini eklememiz gereklidir.
Bu tarz header bilgisini ezberlemeye gerek yoktur. Googleda arayarak bulabilirsiniz.

web.xml dosyamizda servlet tanimini ekleyelim ;

 <servlet>
     <servlet-name>ResponseExcelDownload</servlet-name>
     <servlet-class>_06_Response.ResponseExcelDownload</servlet-class>
 </servlet>

 <servlet-mapping>
     <servlet-name>ResponseExcelDownload</servlet-name>
     <url-pattern>/responseexceldownload</url-pattern>
 </servlet-mapping>

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 *