www.fatihkabakci.com

Personal Website and Computer Science TUR EN

SERVLET HTTP UYGULAMASI

Last update: 4/20/2015 11:39:00 PM

Yazan: Fatih KABAKCI

Servlet uygulamaları, çoğunlukla World Wide Web(www, w3)' in istemci - sunucu(client - server) haberleşme protokollerinin temeli olan Hypertext Transfer Protocol, kısaca HTTP protokolünü kullanır. Genelde bir tarayıcı arkasında olan kullanıcılar, sunuculara bir takım isteklerde bulunurlar. Bu istekler HTTP istekleridir. Servlet uygulamaları bu istekleri cevaplayacak şekilde tasarlanmıştır. Geliştiriciler aksini belirtmediği sürece, bu işi Servlet konteyner' larına bırakır. Ancak kimi zaman bazı durumlar için belirli tepkiler vermek isteyebilirsiniz. Örneğin bir kullanıcı yetkinliği olmayan bir sayfaya giriş yapmak istediğinde, ona HTTP 407, PROXY AUTHENTICATION REQUIRED dönmek isteyebilirsiniz. Ya da, sunucunuzun tarayıcılardan gelen çözümleyemediği içeriklere HTTP 400, BAD REQUEST ile cevap vermek isteyebilirsiniz. Bu ve bunun gibi durumlarda Servlet uygulamanızın HTTP protokolünü kullanarak istemcilere cevap vermesini veya istemcilerden gelen HTTP isteklerinin türüne göre davranış göstermesini isteyebilirsiniz.

Bunun için aşağıda basitçe bir uygulama gösterilmektedir. Şayet kullanıcı HTML text girdisine admin yazarsa, yetkilendirilerek HTTP 200 OK alır. Aksi halde 407 PROXY AUTHENTICATION REQUIRED alarak sayfaya giriş yapamaz.

HTML Formu

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Authentication Page</title>
</head>
<body>
<form action="AuthenticationServlet" method="post">
<h1>Authentication Process</h1>
<div>
    User Name: <input type="text" name="textUserName"> <br>
    <input type="submit" value="Search" name="btn_submit">
</div>
</form>
</body>
</html>

Servlet Sınıfı

package com.fatihkabakci;

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

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

/**
 * Servlet implementation class AuthenticationServlet
 * 
 * @author www.fatihkabakci.com
 */
@WebServlet("/AuthenticationServlet")
public class AuthenticationServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AuthenticationServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      String userName = request.getParameter("textUserName");
      if (userName.equals("admin")) {
         response.setStatus(HttpServletResponse.SC_OK);
         response.setContentType("text/plain");
         PrintWriter out = response.getWriter();
         out.println("Authentication successfully !");
      }
      else {
         response.sendError(HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED,
                            "Authentication Required ! You are not authenticated");
      }
   }
}

Olumsuz durumlarda istemcilere sendError() metodu ile cevap verilmektedir. Bazende kullanıcıyı farklı bir sayfaya yönlendirebileceğiniz sendRedirect() metodunu kullanabilirsiniz. Her iki senaryonun çıktıları da aşağıda gösterilmektedir.

Olumlu Senaryo


Olumsuz Senaryo


Daha önceden açıklandığı gibi, beklenmedik durumlarda gelişen hatalarda Servlet konteyner' ı kontrolü ele alır ve uygun bir cevabı istemciye döner. Örneğin AuthenticationServletini doğrudan çalıştırmaya kalkdığınızda, 500 SERVER INTERNAL ERROR hatası alırsınız. Çünkü Servlet sınıfı içinde uygun bir service() metodu bulunmadığı için, konteyner bu hatayı sizin yerinize döner.

HTTP header, parameter ve raw data

HTTP data, header(başlık) ve body(gövde) olmak üzere iki parçadan oluşur. HTTP body, içerik tipine göre sunucu tarafında farklı adlandırılırç Örneğin bir HTTP Post uygulamasında, HTTP body içerisinde taşınan HTML form parametreleri, sunucu tarafında getParameter() metodu ile yakalanır. Ancak bir HTTP data kimi zaman payload olarak düz metin şeklinde de taşınabilir. Böyle olduğunda Servlet bu dataya isteğin getInputStream() veya getReader() metotlarıyla ulaşır. Bu farklılıklar aşağıdaki istemci kodlarında görüldüğü gibi, HTTP datanın içerik tipine göre değişir. Aşağıdaki örnekte, sunucu tarafında çalışan Servletin, istemciden aldığı HTTP datanın, header, parametre veya payload şeklinde analizi yapılmaktadır. Elde edilen HTTP veriler, istemcinin ekranına gönderilir.

package com.fatihkabakci;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

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

/**
 * Servlet implementation class BasicHttpServlet
 * 
 * @author www.fatihkabakci.com
 */
@WebServlet("/BasicHttpServlet")
public class BasicHttpServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;
   /**
    * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
    */
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();
      
      out.println("Getting the HTTP request parameters");
      Enumeration<String> parameters = request.getParameterNames();
      while (parameters.hasMoreElements()) {
         String parameterName = parameters.nextElement();
         String parameterValue = request.getParameter(parameterName);
         out.println("<h3>" + parameterName + " " + parameterValue + "</h3>");
      }     

      out.println("Getting the HTTP request headers");
      Enumeration<String> headers = request.getHeaderNames();
      while (headers.hasMoreElements()) {
         String headerName = headers.nextElement();
         String headerValue = request.getHeader(headerName);
         out.println("<h4>" + headerName + " " + headerValue + "</h4>");
      }
      
      out.println("Getting the HTTP request payload");
      BufferedReader reader = request.getReader();
      String line;
      while ((line = reader.readLine()) != null) {
         out.println(line);
      }
   }
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      doGet(request, response);
   }
}

HTTP POST Request From Java Client

package Formatter;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @author www.fatihkabakci.com
 */

public class HttpPostRequest {
   public static void main(String[] args) throws IOException {

      URL url = new URL("http://localhost:8080/JServlet/BasicHttpServlet");
      HttpURLConnection servlet = (HttpURLConnection) url.openConnection();
      servlet.setDoOutput(true);
      servlet.setRequestMethod("POST");
      servlet.setRequestProperty("content-type", "application/x-www-form-urlencoded");

      OutputStream os = servlet.getOutputStream();
      os.write("name=John&&age=24".getBytes());
      os.flush();

      BufferedReader in = new BufferedReader(new InputStreamReader(servlet.getInputStream()));
      String inputLine;
      while ((inputLine = in.readLine()) != null)
         System.out.println(inputLine);
      in.close();
   }
}

HTTP GET Request From Java Client

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @author www.fatihkabakci.com
 */

public class HttpGetRequest {
   public static void main(String[] args) throws IOException {

      URL url = new URL("http://localhost:8080/JServlet/BasicHttpServlet?name=John&age=24");
      HttpURLConnection servlet = (HttpURLConnection) url.openConnection();
      servlet.setDoOutput(true);
      servlet.setRequestMethod("GET");

      BufferedReader in = new BufferedReader(new InputStreamReader(servlet.getInputStream()));
      String inputLine;
      while ((inputLine = in.readLine()) != null)
         System.out.println(inputLine);
      in.close();
   }
}

Servlet sunucusunun istemciye döndürdüğü çıktı aşağıda gösterilmektedir.

Servlet uygulamasının istemcinin ekranına döndürdüğü çıktı aşağıdaki gibidir.

Getting the HTTP request parameters
<h3>name John</h3>
<h3>age 24</h3>
Getting the HTTP request headers
<h4>content-type application/x-www-form-urlencoded</h4>
<h4>user-agent Java/1.7.0</h4>
<h4>host localhost:8080</h4>
<h4>accept text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2</h4>
<h4>connection keep-alive</h4>
<h4>content-length 17</h4>
Getting the HTTP request payload

İstemci, içeriği şayet düz metin şeklinde belirlerse, veri HTTP nin raw datası, yani payload'ı olarak adlandılır.

servlet.setRequestProperty("content-type", "text/plain");

Bu durumda çıktı aşağıdaki gibi değişir.

Getting the HTTP request parameters
Getting the HTTP request headers
<h4>content-type text/plain</h4>
<h4>user-agent Java/1.7.0</h4>
<h4>host localhost:8080</h4>
<h4>accept text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2</h4>
<h4>connection keep-alive</h4>
<h4>content-length 17</h4>
Getting the HTTP request payload
name=John&&age=24
There has been no comment yet

Name:


Question/Comment
   Please verify the image




The Topics in Computer Science

Search this site for





 

Software & Algorithms

icon

In mathematics and computer science, an algorithm is a step-by-step procedure for calculations. Algorithms are used for calculation, data processing, and automated reasoning.

Programming Languages

icon

A programming language is a formal constructed language designed to communicate instructions to a machine, particularly a computer. It can be used to create programs to control the behavior of a machine. Java,C, C++,C#

Database

icon

A database is an organized collection of data. The data are typically organized to model aspects of reality in a way that supports processes requiring information.

Hardware

icon

Computer hardware is the collection of physical elements that constitutes a computer system. Computer hardware refers to the physical parts or components of a computer such as the monitor, memory, cpu.

Web Technologies

icon

Web development is a broad term for the work involved in developing a web site for the Internet or an intranet. Html,Css,JavaScript,ASP.Net,PHP are one of the most popular technologies. J2EE,Servlet, JSP,JSF, ASP

Mobile Technologies

icon

Mobile application development is the process by which application software is developed for low-power handheld devices, such as personal digital assistants, enterprise digital assistants or mobile phones. J2ME

Network

icon

A computer network or data network is a telecommunications network that allows computers to exchange data. In computer networks, networked computing devices pass data to each other along data connections.

Operating Systems

icon

An operating system is software that manages computer hardware and software resources and provides common services for computer programs. The OS is an essential component of the system software in a computer system. Linux,Windows

Computer Science

icon

Computer science is the scientific and practical approach to computation and its applications.A computer scientist specializes in the theory of computation and the design of computational systems.