Servlet & JSP – 10 – Response – 01

Merhaba Arkadaslar,
Onceki 2 yazida ServletRequest ve HttpServletRequest arabirimlerinin metotlarindan bahsettik. Bu yazida da ServletResponse ve HttpServletResponse arabirimlerine ait metotlari inceleyecegiz. Bunlarin bir kismini zaten suana kadar kullandik, bir kismini da burada kullanacagiz.

ServletResponse ve HttpServletResponse arabirimine ait onemli metotlari inceleyecek olursak;

ServletResponse

public String getContentType();
public ServletOutputStream getOutputStream() throws IOException;
public PrintWriter getWriter() throws IOException;
public void setContentType(String type);
public String getCharacterEncoding();
public void setCharacterEncoding(String charset);

HttpServletResponse

public void addCookie(Cookie cookie);
public String encodeURL(String url);
public String encodeRedirectURL(String url);
public void sendRedirect(String location) throws IOException;
public void setHeader(String name, String value);
public void addHeader(String name, String value);
public void addIntHeader(String name, int value);
public int getStatus();
public String getHeader(String name);
public Collection<String> getHeaderNames();
public Collection<String> getHeaderNames();

Ornek Uygulama

Bu metotlarin burada bir kismini inceleyecegiz, ilerleyen bolumlerde yeri geldikce kullanmadigimiz metotlari da gorecegiz. Simdi ornek bir uygulama yapalim. Yeni bir paket ve sinif olusturalim ;

_06_Response
ResponseEncodingType

Sinifimiz icin deployment descriptor(web.xml) dosyamizda tanimlamalari yapalim.

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

 <servlet-mapping>
    <servlet-name>ResponseEncodingType</servlet-name>
    <url-pattern>/responseencodingtype</url-pattern>
 </servlet-mapping>

doGet metodumuzun ilk hali ;

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		PrintWriter pw = resp.getWriter();
		pw.println("ışçğüö");
	}

getWriter() metodumuzu ilk ornegimizden beri kullanmaktayiz, peki Turkce karakterleri tarayicimiza yazdirdigimizda nasil bir sonucla karsilasacagiz ?

encoding

Turkce karakterlerimizi yazdirirken sorunla karsilastik peki bu neden kaynaklanmaktadir ve nasil cozebiliriz ?

Bunun nedeni varsayilan request ve response encoding’i  ; ISO-8859-1 dir. Encoding problemi sadece Servlet e ozgu degildir bu tarz problemle hemen her yazilimci karsilacaktir.

getCharacterEncoding metodu bize encoding bilgisini donecektir , asagidaki kodu doGet metodumuza ekleyip ornegimizi tekrar calistirdigimizda encoding degerinin ISO-8859-1 oldugunu gorebiliriz.

		String responseEncoding = resp.getCharacterEncoding();
		// If no character encoding has been specified, ISO-8859-1
		// is returned.
		// Eger belirtilen bir encoding yoksa bu durumda varsayilan encoding
		// ISO-8859-1 olacaktir.
		System.out.println("responseEncoding:" + responseEncoding);

Peki bu sorunu cozmek icin ne yapabiliriz ? setCharacterEncoding() metodunu kullanabiliriz. setCharacterEncoding metodu println metodundan once cagrilmalidir aksi durumda ise yaramayacaktir!

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

		resp.setCharacterEncoding("ISO-8859-9");
		// bu method println metodundan once cagrilmaldir!
		// Aksi durumda ise yaramayacaktir.

		PrintWriter pw = resp.getWriter();
		pw.println("ışçğüö");

		String responseEncoding = resp.getCharacterEncoding();
		// If no character encoding has been specified, ISO-8859-1
		// is returned.
		// Eger belirtilen bir encoding yoksa bu durumda varsayilan encoding
		// ISO-8859-1 olacaktir.
		System.out.println("responseEncoding:" + responseEncoding);
	}


Chrome da varsayilan encoding’im Turkish(ISO 8859-9 ) oldugu icin problem ortadan kalkacaktir fakat Firefoxta varsayilan encoding (ISO 8859-1) oldugu icin problem devam etmektedir. ( En azindan bendeki mevcut ayarlarda encoding bu sekilde)

Peki bu durumu nasil cozebiliriz ? Bunun icin HTML encoding’ini ayarlamamiz gereklidir.
Bunun icin HTML de su etiketi kullanabiliriz.

<meta charset=”utf-8″>

ResponseEncodingType.java

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 ResponseEncodingType extends HttpServlet {
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		resp.setCharacterEncoding("ISO-8859-9");
		// bu method println metodundan once cagrilmaldir!
		// Ask durumda ise yaramayacaktir.

		PrintWriter pw = resp.getWriter();

                pw.print("<html>");
                pw.print("<head> <meta charset='ISO-8859-9'> </head>");
                pw.print("<body>");
                pw.println("<p>ışçğüö</p>");
                pw.print("</body> </html>");

		String responseEncoding = resp.getCharacterEncoding();
		// If no character encoding has been specified, ISO-8859-1
		// is returned.
		// Eger belirtilen bir encoding yoksa bu durumda varsayilan encoding
		// ISO-8859-1 olacaktir.
		System.out.println("responseEncoding:" + responseEncoding);
	}
}


Bir diger yontem olarak setContentType() metodunu ile content yani icerik bilgisini verebiliriz. Bu sayede tarayicimiza yardimci oluruz ve icerik bilgisine uygun sekilde hareket etmesini saglariz.

setContentType metodu ile charset bilgisi verebiliriz.

Bu icerik bilgilerine MIME type denilir ve ornek olarak sunlari verebiliriz ;

text/html
application/pdf
video/quicktime
application/java
image/jpeg
application/jar

Daha detayli liste icin suraya bakabilirsiniz ;
mime-types-full

resp.setContentType("text/html; charset=UTF-8");
resp.setContentType("text/html; charset=ISO-8859-9");


ResponseContentType.java

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 ResponseContentType extends HttpServlet {

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

		resp.setContentType("text/html; charset=UTF-8");
		// resp.setContentType("text/html; charset=ISO-8859-9");
		// charset olarak ISO-8859-9 verirsek bu durumda html meta taginda da
		// ayni charset i kullanmaliyiz.
		// Benzer sekilde UTF-8 verirsek html meta taginda UTF-8 kullanmaliyiz.

	        PrintWriter pw = resp.getWriter();
                pw.print("<html>");
                pw.print("<head> <meta charset='UTF-8'> </head>");
                pw.print("<body>");
                pw.println("ışçğüö");
                pw.print("</body> </html>");
 
		
	        System.out.println(resp.getCharacterEncoding());
                System.out.println(resp.getContentType());

	}
}


web.xml dosyamiza servlet tanimini ekleyelim ;

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

 <servlet-mapping>
    <servlet-name>ResponseContentType</servlet-name>
    <url-pattern>/responsecontenttype</url-pattern>
 </servlet-mapping>

Not: setCharacterEncoding() ve setContentType() metotlari getWriter() metodu cagrilmadan once kullanilmalidir !

Ornegimizi calistirdigimizda sorunsuzca calisacaktir.

UTF-8
text/html;charset=UTF-8

charset,kullanabilecegimiz karakter formatini belirtir.
encoding,karakterlerin saklanacagi formati belirtir.

What’s the difference between encoding and charset?
Online sample of a CharSet property for conversion texts and files.

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 *