MOTIVECODEX
MOTIVECODEX

Reputation: 2752

Java validation doesn't work correctly

Complete project: LINK TO PROJECT

So I have this code that should validate 4 input fields in a JSP file, but it doesn't work correctly:

It just checks the first input field and if I correctly fill out the first input field, it just passes and sends the form. In the code I just have made the if else if.. for the first two input fields. naam and straatnaam:

UserValidator.java:

public class UserValidator {

    private static final String USERNAME_PATTERN = "[a-zA-Z]{3,10}";
    private static final String STRAAT_PATTERN = "[a-zA-Z]{3,50}";
    private static final String PLAATS_PATTERN = "[a-zA-Z]{3,50}";
    private static final String HUISNUMMER_PATTERN = "([0-9]){1,}([a-z]){0,3}";

    List<String> errors = new ArrayList<String>();

    public List<String> validate(UserForm userForm) {

        String naam = userForm.getName();
        String straatnaam = userForm.getName();

        if (naam == null || naam.trim().isEmpty()) {
            errors.add("User must have a name");
        } else if (straatnaam == null || straatnaam.trim().isEmpty()) {
            errors.add("Straatnaam must have a name");
        } else {
            if (!this.validUsername(naam)) {
                errors.add("Naam: must be 3 to 10 characters a-zA-Z");
            } else if (!this.validStraatnaam(straatnaam)) {
                errors.add("Straatnaam: must be 3 to 50 characters a-zA-Z");
            }
        }
        return errors;
    }

    public static boolean validUsername(String s) {
        Pattern pattern = Pattern.compile(USERNAME_PATTERN);
        Matcher matcher = pattern.matcher(s);
        return matcher.matches();
    }

    public static boolean validStraatnaam(String s) {
        Pattern patternStraat = Pattern.compile(STRAAT_PATTERN);
        Matcher matcherStraat = patternStraat.matcher(s);
        return matcherStraat.matches();
    }

    public static boolean validPlaats(String s) {
        Pattern patternPlaats = Pattern.compile(PLAATS_PATTERN);
        Matcher matcherPlaats = patternPlaats.matcher(s);
        return matcherPlaats.matches();
    }

    public static boolean validHuisnummer(String s) {
        Pattern patternHuisnummer = Pattern.compile(HUISNUMMER_PATTERN);
        Matcher matcherHuisnummer = patternHuisnummer.matcher(s);
        return matcherHuisnummer.matches();
    }

}

GebruikerWijzigen.jsp:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@page contentType="text/html" pageEncoding="windows-1252"%>
<!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=windows-1252">
        <title>${paginaTitel}</title>
        <link href="/WEBappMVCMavenSolution/style.css" rel="stylesheet" type="text/css">
    </head>
    <body>
        <h2>${paginaTitel}</h2>
        <c:if test="${errors != null}">
            <!-- Mochten er errors zijn, dan worden ze hier getoond -->
            <p>${errors}</p>
        </c:if>
        <c:choose>
            <c:when test="${id == null}">
                <!-- Als er geen id is meegegeven, ga je een gebruiker toevoegen -->
                <form id="nieuweGebruiker" action="nieuw" method="post">
                </c:when>
                <c:otherwise>
                    <!-- Anders ga je een gebruiker wijzigen -->
                    <form id="wijzigenGebruiker" action="wijzig" method="post">
                    </c:otherwise>
                </c:choose>
                <p>
                    <c:if test="${id != null}">
                        <!-- Het id wordt meegestuurd, om te bepalen welke gebruiker je gaat wijzigen -->
                        <input type="hidden" name="id" id="id" value="${id}"></input>
                    </c:if>
                <table border="0">
                    <tr>
                        <td>
                            <label for="naam">Naam</label>
                        </td>
                        <td>
                            <input type="textfield" id="naam" name="naam" value="${naam}"></input>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <label for="straatnaam">Straatnaam</label>
                        </td>
                        <td>
                            <input type="textfield" id="straatnaam" name="straatnaam" value="${adres}"></input>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <label for="plaats">Plaats</label>
                        </td>
                        <td>
                            <input type="textfield" id="plaats" name="plaats" value="${plaats}"></input>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <label for="huisnummer">Huisnummer</label>
                        </td>
                        <td>
                            <input type="textfield" id="huisnummer" name="huisnummer" value="${huisnummer}"></input>
                        </td>
                    </tr>
                    <tr>
                        <td>
                            <label for="plaats">Rol</label>
                        </td>
                        <td>
                            <select id="rolenummer" name="rolenummer" >
                                <c:forEach var="tempRollen" items="${rollen}">
                                    <option value="${tempRollen.rol}">${tempRollen.rol}</option>
                                </c:forEach>
                            </select>
                        </td>
                    </tr>
                </table>
                </p>
                <p>
                    <input class="submit" type="submit" value="Verzenden">
                </p>
            </form>
    </body>
</html>

GebruikerWijzigenController.java:

package controllers;

import java.io.*;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.*;
import javax.servlet.http.*;
import models.User;
import models.UserForm;
import validation.UserValidator;

public class GebruikerWijzigController extends HttpServlet {

    private static String titelNieuw = "Nieuwe gebruiker"; //Titel voor de Nieuwe gebruiker pagina
    private static String titelWijzig = "Wijzigen gebruiker"; //Titel voor de Wijzig gebruiker pagina

    /* HTTP GET request */
    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        if (request.getParameter("id") != null) {
            //Als er een id is meegegeven, worden de gegevens van de gebruiker opgehaald.
            long id = Long.parseLong(request.getParameter("id"));
            request.setAttribute("id", id); // TODO: why?

            // Haal een sessie object op uit het request
            HttpSession sessie = request.getSession();
            LinkedList gebruikers = (LinkedList) sessie.getAttribute("gebruikers"); //Haalt de lijst met gebruikers op en slaat deze op in een LinkedList

            for (int i = 0; i < gebruikers.size(); i++) {
                User tempGebruiker = (User) gebruikers.get(i);

                //Als de gebruiker overeenkomt met het gegeven id, worden de gegevens ingevuld in het formulier.
                if (tempGebruiker.getCustomerNumber() == id) {
                    request.setAttribute("naam", tempGebruiker.getName());
                    request.setAttribute("adres", tempGebruiker.getStreetAddress());
                    request.setAttribute("plaats", tempGebruiker.getCity());
                    request.setAttribute("huisnummer", tempGebruiker.getHouseNumber());
                    request.setAttribute("rolenummer", tempGebruiker.getRolenummer());
                }
            }
            doorsturen(request, response, titelWijzig); //Stuurt door naar de Wijzig gebruiker pagina.
        } else {
            doorsturen(request, response, titelNieuw); //Stuurt door naar de Nieuwe gebruiker pagina.
        }
    }

    @Override
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {
        String dispatchUrl = null;

        long id = 0;
        long rolenummer = 0;

        List<String> errors = new ArrayList<String>();
        UserForm userform = new UserForm();

        userform.setName(request.getParameter("naam"));
        userform.setStreetAddress(request.getParameter("straatnaam"));
        userform.setHouseNumber(request.getParameter("huisnummer"));
        userform.setCity(request.getParameter("plaats"));

        if (request.getParameter("id") != null) {
            id = Long.parseLong(request.getParameter("id"));
        }

        if (request.getParameter("role") != null) {
            rolenummer = Long.parseLong(request.getParameter("role"));
        }
        // validate userForm
        UserValidator userValidator = new UserValidator();
        errors = userValidator.validate(userform);


        if (!errors.isEmpty()) {  // zolang er errors zijn , keer terug naar het invulformulier
            request.setAttribute("errors", errors);
            request.setAttribute("form", userform);

            dispatchUrl = "/gebruiker_wijzigen.jsp";

        } else {
            // Haal een sessie object op uit het request
            HttpSession sessie = request.getSession();

            // Als the parameter 'id' niet null is, dan hebben we te maken met
            // een user die wordt geupdate
            boolean isUserUpdate = request.getParameter("id") != null;

            // Haal de lijst met gebruikers op uit de sessie
            List<User> gebruikers = (List) sessie.getAttribute("gebruikers");

            // Controleer of de lijst met gebruikers niet null is, zo ja, 
            // creër een lege lijst en zet deze op de sessie
            if (gebruikers == null) {
                gebruikers = new LinkedList<User>();
            }

            // Zet de form parameters om in een User object
            User formUser = getUserFromRequest(request);

            // Indien we hier met een gebruikers update te maken hebben, dan halen
            // we deze gebruiker op uit de lijst met gebruikers en wijzigen we zijn
            // gegevens
            if (isUserUpdate) {
                for (int i = 0; i < gebruikers.size(); i++) {
                    User tempGebruiker = (User) gebruikers.get(i);

                    // Als het CustomerNumber van de tempGebruiker overeenkomt met 
                    // het CutomerNumber van de formUser, dan wordt de gebruiker geupdate.
                    if (tempGebruiker.getCustomerNumber() == formUser.getCustomerNumber()) {
                        tempGebruiker.setName(formUser.getName());
                        tempGebruiker.setStreetAddress(formUser.getStreetAddress());
                        tempGebruiker.setCity(formUser.getCity());
                        tempGebruiker.setHouseNumber(formUser.getHouseNumber());
                        tempGebruiker.setRolenummer(formUser.getRolenummer());
                    }
                }
            } else {
                // Anders zetten we een uniek id op het User object en voegen we 
                // deze als nieuwe gebruiker toe aan de lijst met gebruikers
                long uniekId = System.nanoTime();
                formUser.setCustomerNumber(uniekId);
                gebruikers.add(formUser);
            }

            sessie.setAttribute("gebruikers", gebruikers);

            sessie.setAttribute("aantalGebruikers", gebruikers.size());
            response.sendRedirect("../gebruikers");
        }
        if (dispatchUrl != null) {
            RequestDispatcher rd
                    = request.getRequestDispatcher(dispatchUrl);
            rd.forward(request, response);
        }
    }

    private void doorsturen(HttpServletRequest request, HttpServletResponse response, String titel)
            throws ServletException, IOException {
        // Set de pagina titel op het request
        request.setAttribute("paginaTitel", titel);

        // Stuur het resultaat van gebruiker_wijzigen.jsp terug naar de client
        String address = "/gebruiker_wijzigen.jsp";
        RequestDispatcher dispatcher = request.getRequestDispatcher(address);
        dispatcher.forward(request, response);
    }

    /**
     * Maakt een User object aan de hand van de parameters uit het http request.
     */
    private User getUserFromRequest(HttpServletRequest request) {
        User u = new User();

        if (request.getParameter("id") != null && !request.getParameter("id").isEmpty()) {
            u.setCustomerNumber(Long.parseLong(request.getParameter("id")));
        }
        if (request.getParameter("naam") != null) {
            u.setName(request.getParameter("naam"));
        }
        if (request.getParameter("straatnaam") != null) {
            u.setStreetAddress(request.getParameter("straatnaam"));
        }
        if (request.getParameter("plaats") != null) {
            u.setCity(request.getParameter("plaats"));
        }
        if (request.getParameter("huisnummer") != null) {
            u.setHouseNumber(request.getParameter("huisnummer"));
        }
        if (request.getParameter("rolenummer") != null) {
            u.setRolenummer(request.getParameter("rolenummer"));
        }

        return u;
    }

}

Upvotes: 0

Views: 274

Answers (2)

Prateek
Prateek

Reputation: 12242

Please find the final solution, i deployed your code and did following changes and its working fine at my end. UPDATE

In your UserForm class

private String straatnaam; 
public String getStraatnaam() {
    return straatnaam;
}

public void setStraatnaam(String straatnaam) {
    this.straatnaam = straatnaam;
}

In your controller GebruikerWijzigController , doPost method add this:

userform.setStraatnaam(request.getParameter("straatnaam"));

And in UserValidator class,do changes show below :

if (naam == null || naam.trim().isEmpty()) {
        errors.add("User must have a name");
    } 
    if (straatnaam == null || straatnaam.trim().isEmpty()) {
        errors.add("Straatnaam must have a name");
    } 

    if(!errors.isEmpty()) {          
       if (!validUsername(naam)) { // Use not(!)
            errors.add("Naam: must be 3 toooooooo 10 characters a-zA-Z");
        }

        if (!validStraatnaam(straatnaam)) { //Use not(!)
            errors.add("Straatnaam: must be 3 tooooo 50 characters a-zA-Z");
        }
    }

Actual issue is that both the time you are using name and expecting the validation for straatnaam.

Also make it sure that you classes are getting build and you are not using the old classes

Upvotes: 1

Rohit Jain
Rohit Jain

Reputation: 213281

You should change your if-else if-else latter to multiple if's:

if (naam == null || naam.trim().isEmpty()) {
    errors.add("User must have a name");
} 

if (straatnaam == null || straatnaam.trim().isEmpty()) {
    errors.add("Straatnaam must have a name");
} 

if (!this.validUsername(naam)) {
   errors.add("Naam: must be 3 to 10 characters a-zA-Z");
}  

if (!this.validStraatnaam(straatnaam)) {
    errors.add("Straatnaam: must be 3 to 50 characters a-zA-Z");
}

Also, I guess you should change:

String naam = userForm.getName();
String straatnaam = userForm.getName();

to:

String naam = userForm.getName();
String straatnaam = userForm.getStraatName();  // Or whatever is the name

Also, I would suggest to move the list declaration inside the method itself, as it is used there only. Also, I rather than storing the patterns as String, I would store them as pre-compiled patterns, so that the pattern is not needed to be compiled on each method invocation.

Upvotes: 2

Related Questions