0

完成项目:项目链接

所以我有这段代码应该验证 JSP 文件中的 4 个输入字段,但它不能正常工作:

它只是检查第一个输入字段,如果我正确填写了第一个输入字段,它就会传递并发送表单。在代码中,我刚刚为前两个输入字段设置了 if else if..。naam 和 straatnaam:

用户验证器.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;
    }

}
4

2 回答 2

2

您应该将if-else if-else后者更改为多个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");
}

另外,我想你应该改变:

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

到:

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

另外,我建议将列表声明移动到方法本身中,因为它仅用于那里。另外,我不是将模式存储为String,而是将它们存储为预编译模式,这样就不需要在每次方法调用时编译模式。

于 2013-10-25T09:57:39.503 回答
1

请找到最终解决方案,我部署了您的代码并进行了以下更改,并且在我的最后工作正常。 更新

在你的UserForm class

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

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

在您的控制器GebruikerWijzigController中,doPost method添加以下内容:

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

UserValidator课堂上,做如下改变:

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");
        }
    }

实际问题是您使用名称和期待 straatnaam 验证的时间。

还要确保您的课程正在构建并且您没有使用旧课程

于 2013-10-25T10:04:37.377 回答