JSP : MVC met Servlets

Introductie

Dit is een artikel uit een reeks over JSP . Zie ook de volgende delen :

JSP’s worden meestal gebruikt in een Model-View-Control patroon :

  • View: is ingevuld met JSP pagina’s (1).
  • Control: is ingevuld met Servlet’s :
    • Behandelen JSP Form inputs (2)
    • Benaderen Model Classes voor verwerking en opslag (3)
    • Openen nieuwe JSP’s met forward() calls na afloop van de Model verwerking (4)
  • Model: is ingevuld met verschillende mogelijke Java Classes zoals : andere Servlets, JavaBeans, EJB’s, Webservices, etc. Hier bevindt zich de business logic en gegevensopslag. Een veel gebruikte invulling is Data Access Objects (DAO) die een gegevensinterface bieden naar een opslag technologie zoals JPA Entities. Eventueel bevindt zich boven de DAO nog een service laag met de business logic. Naast DAO kunnen zich nog andere interfaces en resources bevinden zoals webservices, message queue’s etc.

Onderstaande figuur geeft het schematisch weer:

Hierna worden voorbeelden gegeven van de verschillende MVC componenten:

  • EmployeeController.java : De servlet die de JSP pagina’s inputs behandelt en een EmployeeDAO EJB benadert voor data.
  • employee.jsp: De JSP page met form voor het maken en bewerken van employees.
  • employeeList.jsp: De JSP page met een table voor het tonen van een employee list.
  • web.xml: De deployment descriptor met de configuratie van de controller servlet.

Er wordt gebruik gemaakt van een EmployeeDAO EJB voor het benaderen van gegevens in een database.

Controller Servlet : EmployeeController.java

De servlet bevat een doPost() en een doGet() method.
doGet() : behandelt url requests van de browser en van foward() calls en wordt gestuurd door een url parameter “action” wat betreft de benodigde dao acties en de forward naar de volgende JSP pagina’s employee.jsp of employeeList.jsp.
doPost() behandelt de form input van employee.jsp, voert een dao save() of update() uit, vraagt met dao.getAll() de nieuwe employee list, afgesloten met een forward naar employeeList.jsp.
Met een request.setAttribute() call wordt de list “employees” opgeslagen in het request zodat de employeeList.jsp deze kan lezen en tonen.

public class EmployeeController extends HttpServlet {
    @EJB private EmployeeDAO dao;
    private static String EDIT = "/employee.jsp";
    private static String LIST = "/employeeList.jsp";

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
        String action = request.getParameter("action");
        List<Employee> list;
        int id;
        if (action.equalsIgnoreCase("delete")){
            id = Integer.parseInt(request.getParameter("employeeId"));
            dao.delete(id);
            forward = LIST;
            list = dao.getAll();
            request.setAttribute("employees", list);
        } else if (action.equalsIgnoreCase("edit")){
            forward = EDIT;
            id = Integer.parseInt(request.getParameter("employeeId"));
            Employee emp = dao.findById(id);
            request.setAttribute("employee", emp);
        } else if (action.equalsIgnoreCase("list")){
            forward = LIST;
            list = dao.getAll();
            request.setAttribute("employees", list);
        } else {
            forward = EDIT;
        }
        RequestDispatcher view = request.getRequestDispatcher(forward);
        view.forward(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
        Employee emp = new Employee();
        String firstName = request.getParameter("firstName"); emp.setFirstName(firstName);
        String lastName = request.getParameter("lastName"); emp.setLastName(lastName);
        String sbirthDate = request.getParameter("birthDate");
        Date birthDate = null;
        String employeeId = request.getParameter("employeeId");
        String departmentId = request.getParameter("departmentId");
        try {
             birthDate = new SimpleDateFormat("yyyy-MM-dd").parse(sbirthDate);
             emp.setBirthDate(birthDate);
        } catch (ParseException e) {
             e.printStackTrace();
        }
        if(employeeId == null || employeeId.isEmpty())
        {
            dao.save(emp);
        } else {
    	    int id = Integer.parseInt(employeeId);
            emp.setEmployeeId(id);
	    dao.update(id, emp);
        }
        view = request.getRequestDispatcher(LIST);
        List<Employee> list = dao.getAll();
	request.setAttribute("employees", list);
	view.forward(request, response);
    }
}

JSP Form : employee.jsp

Deze JSP pagina bevat een form voor het aanmaken of bewerken van employees.
In geval van het bewerken van een bestaande employee wordt de value van de form fields ingesteld op de JavaBean properties van de employee die als object in het request object is opgeslagen door de EmployeeController servlet met de setAttribute() method.
Het form specificeert als action de EmployeeController servlet.
De form fields hebben elk een name attribuut waarmee ze als parameter kunnen worden ingelezen in de EmployeeController servlet.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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=ISO-8859-1">
<title>Add/Edit Employee</title>
</head>
<body>
	<h1>Add/Edit Employee</h1>
    <form method="POST" action="EmployeeController" name="frm">
    <table>
        <tbody>
        <tr><td>Id :         </td><td><input type="text" readonly="readonly" name="employeeId"
value="${employee.employeeId}" /></td></tr>
        <tr><td>First Name : </td><td><input type="text" name="firstName"
value="${employee.firstName}" /></td></tr>
        <tr><td>Last Name  : </td><td><input type="text" name="lastName"
value="${employee.lastName}" /></td></tr>
        <tr><td>Birthdate  : </td><td><input type="text" name="birthDate"
value="${employee.birthDate}" /></td></tr>
        <tr><td><input type="submit" value="Submit" /></td><td></td></tr>
        </tbody>
    </table>
    </form>
</body>
</html>

JSP Result : employeeList.jsp

Deze JSP pagina bevat een tabel met de list “employees” zoals deze is opgeslagen in het request object door de EmployeeController servlet met de setAttribute() method.
In de tabel worden extra kolommen weergegeven voor de delete en update acties met een url request naar de EmployeeController die daarmee een dao.delete(), resp. de JSP pagina employee.jsp zal openen.
Onderaan de tabel staat nog een insert actie middels een url request naar de EmployeeController die daarmee de JSP pagina employee.jsp zal openen voor het invoeren van een nieuwe employee.
Gedemonstreerd wordt hoe de tag wordt gebruikt om de lijst te maken met het “employees” object die via de ${employees} expressie wordt benaderd.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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=ISO-8859-1">
<title>Employees</title>
</head>
<body>
<h1>Employees</h1>
    <table border=1>
        <thead>
            <tr>
                <th>Employee Id</th>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Birthdate</th>
                <th colspan=2>Action</th>
            </tr>
        </thead>
        <tbody>
            <c:forEach items="${employees}" var="emp">
                <tr>
                    <td><c:out value="${emp.employeeId}" /></td>
                    <td><c:out value="${emp.firstName}" /></td>
                    <td><c:out value="${emp.lastName}" /></td>
                    <td><c:out value="${emp.birthDate}" /></td>
                    <td><a href="EmployeeController?action=edit&employeeId=<c:out value="${emp.employeeId}" />">Update</a></td>
                    <td><a href="EmployeeController?action=delete&employeeId=<c:out value="${emp.employeeId}" />">Delete</a></td>
                </tr>
            </c:forEach>
        </tbody>
    </table>
    <p><a href="EmployeeController?action=insert">Add Employee</a></p>
</body>
</html>

Deployment Descriptor : web.xml

Onderstaande web.xml deployment descriptor specificeert de EmployeeController servlet.
(Dat kan uiteraard ook zonder web.xml met de annotaties).

<?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>employeesJSPH</display-name>
  <servlet>
    <description></description>
    <display-name>EmployeeController</display-name>
    <servlet-name>EmployeeController</servlet-name>
    <servlet-class>org.biz.employees.control.EmployeeController</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>EmployeeController</servlet-name>
    <url-pattern>/EmployeeController</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
This entry was posted in JEE, JSP and tagged . Bookmark the permalink.

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>