Merhaba Arkadaslar,
Bu yazimda javax.servlet.http.HttpServletRequest ve javax.servlet.ServletRequest arabirimlerinin bizim icin sagladigi metotlari inceleyecegiz. Bu metotlarin sayisi bir hayli fazla olmakla beraber burada bazilarini listeleyecegim ve bunlarin da bir kismini bu yazida inceleyecegiz.
ServletRequest
ServletRequest arabirimi javax.servlet paketi altinda bulunmaktadir.
ServletRequest arabiriminde tanimlanmis bazi metotlar sunlardir
public Object getAttribute(String name); public Enumeration<String> getAttributeNames(); public int getContentLength(); public ServletInputStream getInputStream() throws IOException; public String getParameter(String name); public Enumeration<String> getParameterNames(); public String[] getParameterValues(String name); public Map<String, String[]> getParameterMap(); public int getServerPort(); public int getLocalPort(); public int getRemotePort();
HttpServletRequest
HttpServletRequest arabirimi , ServletRequest arabirimini kalitir. Hatirlayacagimiz gibi Java da bir arabirim diger bir
arabirimi kalitabilir. HttpServletRequest , javax.servlet.http paketi altinda bulunur.
HttpServletRequest arabiriminde tanimlanmis bazi metotlar sunlardir.
public Cookie[] getCookies(); public String getHeader(String name); public Enumeration<String> getHeaders(String name); public int getIntHeader(String name); public Enumeration getHeaderNames(); public String getContextPath(); public String getQueryString(); public HttpSession getSession();
Aklimiza su soru gelebilir, ServletRequest ve HttpServletRequest arabirim ve bu metotlarda govdesiz metotlar. Peki bu metotlari kim uyguluyor/implementation ? Bu sorunun cevabi Container. Apache Tomcat ya da bir baska Servlet Container bu isi ustlenmektedir. Bize de guzel guzel kullanmak kaliyor.
Bu arabirimleri cok daha fazla metodu yer almakta fakat biz en onemlilerini kullanacagiz, yine de burada isimlerini yazdigim metotlarin hepsini bu bolumde kullanmayacagiz, ilerleyen bolumlerde yeri geldikce kullanacagiz.
Ornek Uygulama
Yeni bir paket ve servlet olusturup tanimlarini yapalim.
_05_Request
RequestGetForm
RequestGetForm.java
package _05_Request; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.Enumeration; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RequestGetForm extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String firstName = req.getParameter("firstName"); String lastName = req.getParameter("lastName"); String gender = req.getParameter("gender"); String maritalStatus = req.getParameter("marital status"); String[] language = req.getParameterValues("lang"); PrintWriter pw = resp.getWriter(); pw.print(""); pw.print(gender + " " + firstName + " " + lastName + " "); pw.print(maritalStatus + " "); if (language != null) { for (String str : language) { pw.print(str + " "); } } pw.print(""); Enumeration paramNames = req.getParameterNames(); while (paramNames.hasMoreElements()) { String paramName = paramNames.nextElement(); System.out.println(paramName); } Map<String, String[]> parameterMap = req.getParameterMap(); for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) { System.out.println(entry.getKey() + " " + Arrays.asList(entry.getValue())); } } }
Sinifimizin servlet tanimlarini web.xml dosyamiza ekleyelim.
web.xml
<servlet> <servlet-name>RequestGetForm</servlet-name> <servlet-class>_05_Request.RequestGetForm</servlet-class> </servlet> <servlet-mapping> <servlet-name>RequestGetForm</servlet-name> <url-pattern>/requestgetform</url-pattern> </servlet-mapping>
Projemize yeni HTML dosyasi ekleyecegiz. Bu html dosyamizi projemizde WebContent dizini altina olusturabiliriz.
dikkat : yanlislikla WEB-INF dizini altina olusturmayalim. WEB-INF klasoru direkt erisime kapalidir. Ilerleyen bolumlerde bu konudan bahsedecegim.
formGet.html
<html> <body> <form id="form1" action="requestgetform" method="get"> <div> </div> <table id="table1" cellspacing="5px" cellpadding="5%";> <tr> <td align="right">Isim:</td> <td><input type="text" name="firstName" /></td> </tr> <tr> <td align="right">Soy Isim:</td> <td><input type="text" name="lastName" /></td> </tr> <tr> <td align="right">Cinsiyet</td> <td> <select name="gender"> <option value="Bay" selected="selected">Bay</option> <option value="Bayan">Bayan</option> </select> </td> </tr> <tr> <td align="right">Medeni Hal</td> <td> <input type="radio" name="marital status" value="Bekar" />Bekar <input type="radio" name="marital status" value="Evli" /> Evli <input type="radio" name="marital status" value="Dul" />Dul <input type="radio" name="marital status" value="Javaci" />Javaci </td> </tr> <tr> <td align="right">Diller</td> <td> <input type="checkbox" name="lang" value="Java" /> Java <input type="checkbox" name="lang" value="C" />C <input type="checkbox" name="lang" value="C++" />C++ </td> </tr> <tr> <td> <input type="submit" value="Submit"/> </td> </tr> </table> </form> </body> </html>
HTML de dikkat edecegimiz nokta ;
<form id="form1" action="requestgetform" method="get">
action alaninda servletimizin url adresini yazdik. Bu html dosyamiz direkt WebContent atlinda oldugu icin relative path olarak servlet url adresini yazmamiz yeterli olur.
Eger bu html dosyamiz WebContent altinda bir klasor icerisinde olsaydi bu durumda ilgili servleti calistirmak icin action kismina ya absolute path bilgisi verecektik
<form id="form1" action="/injavawetrust/requestgetform" method="get">
ya da relative path kullaniyorsak bu durumda bir ust dizine iki nokta ile gidecektik ;
<form id="form1" action="../requestgetform" method="get">
WebContent altinda pathTest isminde dosya olusturup , absolute path ve relative path icin test yapabiliriz.
HTML form varsayilan olarak GET ile calisir ! method=”get” yazmasak bile sorunsuz calisacaktir.
formGet.html dosyamizi calistiralim ve ilgili alanlari dolduralim ;
Onayla butonuna tikladigimizda servletimize yonlendirecektir;
getParameter metodu yardimi ile name alan bilgisini verdigimiz HTML elemanlarinin value degerlerine ulasabiliriz.
<input type="text" name="firstName" /> <input type="text" name="lastName" />
Formumuzdan elde ettigimiz degerler sadece text tipi icin degildir.
<select name="gender">
combobox icin yine getParameter() metoduna “gender” String literalini verdik ve secilen <option> degeri/value degerini elde ederiz. Burada dikkat edilmesi gereken nokta, getParameter() ile value alanini elde ederiz.
Benzer mantikla secilen radio butonun da degerini elde ederiz.
Bir diger kullandigimiz metot getParameterValues() ;
bu metoda “lang” String literalini verdik. Checkbox icin birden fazla secim yapabiliriz. Dolayisiyla birden fazla secilen checkbox degerini almak icin bu metodu kullanabiliriz.
getParameterNames() metodu bize request parametlerin ismini dondurecektir.
getParameterMap() metodu request parametlerini (name) ve degerlerini (value) bir map yapisi icerisinde tutacaktir. Geriye Map<String,String[]> tipinde bir Map dondurecektir.
Eclipse’te, Console’da bu parametre isimlerini yazdirdik ;
firstName lastName gender marital status lang firstName [Levent] lastName [Erguder] gender [Bay] marital status [Javaci] lang [Java, C]
Dikkat etmemiz gereken bir diger nokta da, HTTP GET metodunu kullandigimiz icin parametreler URL de eklenecektir.
http://localhost:8080/injavawetrust/requestgetform?firstName=Volkan&lastName=OZTURK&gender=Bay&marital+status=Javaci&lang=Java&lang=C
HTTP GET metodunu kullandik, simdi de HTTP POST metoduyla ayni islemi yapalim. Bunun icin oncelikle yeni bir servlet olusturalim ve tanimi yapalim.
package _05_Request; import java.io.IOException; import java.io.PrintWriter; import java.util.Arrays; import java.util.Enumeration; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class RequestPostForm extends HttpServlet { @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String firstName = req.getParameter("firstName"); String lastName = req.getParameter("lastName"); String gender = req.getParameter("gender"); String maritalStatus = req.getParameter("marital status"); String[] language = req.getParameterValues("lang"); PrintWriter pw = resp.getWriter(); pw.print(""); pw.print(gender + " " + firstName + " " + lastName + " "); pw.print(maritalStatus + " "); if (language != null) { for (String str : language) { pw.print(str + " "); } } pw.print(""); Enumeration paramNames = req.getParameterNames(); while (paramNames.hasMoreElements()) { String paramName = paramNames.nextElement(); System.out.println(paramName); } Map<String, String[]> parameterMap = req.getParameterMap(); for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) { System.out.println(entry.getKey() + " " + Arrays.asList(entry.getValue())); } } }
Bu sinifimiz, diger sinifimizla ayni tek fark burada doGet metodu degil doPost metodunu kullandik.
web.xml
<servlet> <servlet-name>RequestPostForm</servlet-name> <servlet-class>_05_Request.RequestPostForm</servlet-class> </servlet> <servlet-mapping> <servlet-name>RequestPostForm</servlet-name> <url-pattern>/requestpostform</url-pattern> </servlet-mapping>
formPost.html
Bu dosyamiz formGet.html ile ayni icerikte olacak sadece su kismini degistirelim;
<form id="form1" action="requestpostform" method="post">
formPost.html dosyamizi calistiralim ve alanlari dolduralim ;
onayla butonuna bastigimizda RequestPostForm servletimize post edecegiz ;
Burada dikkat ederseniz , request parametrelerimiz URL de gozukmuyor, bunun nedeni HTTP POST metodunu kullandik. Hatirlayacagimiz gibi HTTP POST metodunda parametreler URLde degil payload da tasinir. Dolayisiyla guvenlik acisindan HTTP POST metodu HTTP GET metodundan daha guvenlidir.
HTTP POST metodunu kullanmak istedigimizde bunu action form kisminda acik bir sekilde yazmamiz gerekir , cunku varsayilan olarak calisan HTTP GET metodudur.
Bu bolumde bir kac metodu inceledik, bir sonraki bolumde ayni konu basliginda devam edecegiz.