JEE Servlets

Introductie

Servlets zijn Web componenten die op de server worden afgehandeld. Oorspronkelijk werden Servlets gebruikt voor het afhandelen van HTML Forms, het uitvoeren van logic en het retourneren van HTML. Met de komst van JSP en JSF is dat echter niet meer gebruikelijk.
JSP en JSF maken echter onder de motorkap wel gebruik van de servlet technologie.
Ook spelen Servlets een belangrijke rol bij het toepassen van Ajax technologie.

Een Servlet wordt met de @WebServlet annotatie gedefinieerd met tussen haakjes het url pad waarmee deze voor clients bereikbaar is.

Onderstaand voorbeeld implementeert de servlet met de naam “Hello” en gebruikt de http GET request operatie. Er kunnen natuurlijk de POST, PUT, DELETE operaties worden gebruikt (doPost() etc.)
Voor het terugsturen van HTML wordt een PrintWriter object gemaakt via de getWriter() method van het response object. Daarna kunnen de HTML teksten daar naartoe worden geschreven.

@WebServlet("/Hello")
public class HelloServlet extends HttpServlet {
public HelloServlet() {
super();
}
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	      PrintWriter writer = response.getWriter();
	      response.setContentType("text/html");
	      writer.println("<html>");
	      writer.println("<body>");
	      writer.println("<h1>Hello</h1>");
	      writer.println("</body");
	      writer.println("</html>");
	}
}

De servlet kan nu worden aangeroepen, bijv in de browser met url:

http://[host]:[port]/[projectcontextpad]/Hello

Deployment Descriptor (web.xml)

Traditioneel, zonder gebruik van de @WebServlet annotatie, werd de servlet geconfigureerd in de web.xml deployment descriptor. Dit kan nog steeds.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
   <display-name>MyApp</display-name>
   <servlet>
      <servlet-name>GreetMe</servlet-name>
      <servlet-class>org.biz.myapp.servlets.HelloServlet</servlet-class>
  	<load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>GreetMe</servlet-name>
      <url-pattern>/Hallo</url-pattern>
      </servlet-mapping>
   <welcome-file-list>
      <welcome-file>index.xhtml</welcome-file>
   </welcome-file-list>
</web-app>

In dit voorbeeld wordt met de servlet tag de Java servlet “HelloServlet” geconfigureerd met de naam “GreetMe”.
In de servlet-class tag wordt het pad naar de Java servlet gespecificeerd.
In de servlet-mapping tag wordt voor de servlet, met naam “GreetMe”, het url pad gedefinieerd waaronder deze bereikbaar is, in dit voorbeeld “/Hallo”.

Nu kan dezelfde servlet worden aangeroepen in de browser met url:

http://[host]:[port]/[projectcontextpad]/Hallo

Voorbeeld van HTML form met Servlet

Hieronder een voorbeeld van een eenvoudige Calculator HTML form en Servlet.

Het form ziet er als volgt uit :

De HTML code voor het Calculator form:

<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Calculator</title>
</head>
<body>
<form action="Calculator" method="get">
		Operand 1:  <input type="text" name="op1" value="0" size="35"/>
		<br/>
		Operand 2:  <input type="text" name="op2" value="0" size="35"/>
		<br/>
		<input type="submit" name="action" value="Add"/>
		<input type="submit" name="action" value="Subtract" />
	</form>
</body>
</html>

Het form specificeert met action attribuut de servlet “Calculator” en als http method “GET”.
De waarden van de form fields worden als formparameters opgeslagen en meegetsuurd in het HttpServletRequest object.

Hieronder de Calculator servlet. Hierin is te zien hoe de servlet de form parameters leest uit het ontvangen HttpServletRequest object met de getParameter() method. Als argument wordt de naam van het formfield meegegeven. Het tekst datatype wordt geconverteerd naar int en de eventuele fout afgevangen en terug gezonden. De terug te zenden html wordt gemaakt in een aparte method “printMessage()”. Nadat de berekeing is uitgevoerd wordt het resultaat terug gezonden.

@WebServlet("/Calculator")
public class CalculatorServlet extends HttpServlet {

protected void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int op1;
	int op2;
	try {
	         op1 = Integer.parseInt(request.getParameter("op1"));
	         op2 = Integer.parseInt(request.getParameter("op2"));
	} catch (NumberFormatException nfe)
	{
	         printMessage(response, "Only integers are allowed in input");
	         return;
	}
	String action = request.getParameter("action");

	int result = 0;
	if (action.equals("Add"))
		result = calculator.add(op1, op2);
	else if (action.equals("Subtract"))
		result = calculator.subtract(op1, op2);
	      printMessage(response, "Answer = " + result);
 }

private void printMessage(HttpServletResponse resp, String msg) throws IOException
{
resp.setContentType("text/html");
	PrintWriter writer = resp.getWriter();
	writer.println("<html>");
	writer.println("<body>");
	writer.println("<h1> " + msg + "</h1>");
	writer.println("</body");
	writer.println("</html>");
}
}

Servlet Filters

Een servlet filter maakt het mogelijk om voorafgaand aan alle servlet aanroepen een stukje generieke code uit te voeren. Bijv. een bepaalde security check, of algemene logging van servlet calls. In plaats van alle servlets kan ook een deelverzameling worden gespecificeerd.
Het filter is van toepassing op gewone servlets maar ook op servlets die via bovenliggende technologieën worden aangeroepen zoals JSP, JSF, en REST Webservices.

Hieronder een voorbeeld van een filter “MyFilter”.
Hierin is te zien hoe verschillende gegevens van de servlet aanroep worden gelezen en gemanipuleerd. Er vindt een typecasting plaats van het ontvangen ServletRequest object naar HttpServletRequest, omdat hieruit meer / andere gegevens zijn te halen.

public class MyFilter implements javax.servlet.Filter {

	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
                                           throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
	  	HttpServletResponse response = (HttpServletResponse) resp;
        System.out.println(" RequestedSessionId = " + request.getRequestedSessionId() +
                           " Server = " + req.getServerName());

        response.setHeader("Access-Control-Allow-Origin", "http://" + req.getServerName());

        System.out.println(" method=" + request.getMethod()
                           " user=" + request.getRemoteUser() +
                           " principal=" + request.getUserPrincipal() +
                           " scheme=" + request.getScheme() +
                           " isinRole Administrator?" +  request.isUserInRole("Administrator"));

	    chain.doFilter(req, resp);

	@Override
	public void init(FilterConfig arg0) throws ServletException {
	}
	@Override
	public void destroy() {
	}
}

Er kunnen meerdere filters worden gemaakt. Deze worden met de aanroep “chain.doFilter()” als een ketting aan elkaar geregen.

De method int() wordt aangeroepen de eerste keer dat het filter wordt geinstantieerd (door de servlet container).
De method destroy() wordt aangeroepen als het filter wordt verwijderd.

Een filter wordt aangemaakt bij het deployen in een servlet container en wordt geconfigureerd in de web.xml deployment descriptor.
Met het filter tag wordt de naam gedefinieerd en de class die het implementeert, met de volledige padnaam.
Met het filter-mapping tag wordt gespecificeerd voor welke url’s het filter wordt aangeroepen.

<web-app …… >
  <filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>org.biz.myapp.filters.MyFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
</web-app>
This entry was posted in JEE and tagged . Bookmark the permalink.

One Response to JEE Servlets

  1. Jessica says:

    Bedankt voor het posten van deze info!

Geef een reactie

Je e-mailadres wordt niet gepubliceerd.

De volgende HTML tags en attributen zijn toegestaan: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>