0

得到了一个给我带来问题的家庭作业......它修改了一个带有两个页面和一个 bean 的 JSF 项目,通过添加另外两个页面和一个控制器 servlet 和另一个 bean 来适应 MVC2 两个附加页面。新的主页转发到第二个新页面或旧的第一页。我的问题是 response.getParameter() 总是导致 null。

<%@page session="false" import="java.util.Iterator"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<jsp:useBean id="status" scope="request" class="JSFRegistration.Status" />
<!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>JSP Page</title>
    </head>
    <body>
        <% if (status!=null && !status.isSuccessful()){%>
            <font color="red">Processing errors:
                <ul><%Iterator errors=status.getExceptions();
            while (errors.hasNext()){
                Exception e = (Exception) errors.next();%>
                <li><%= e.getMessage()%><%}%></ul></font><%}%>
        <form action="LoginServlet" method="POST">
            <% String username = request.getParameter("username");
            if (username==null) username="";%>
            <input type="text" name="usernameTF" value="<%=username%>" />
            <% String password = request.getParameter("password");
            if (password==null) password="";%>
            <input type="password" name="passwordTF" value="<%=password%>" />
            <input type="submit" value="Login" />
        </form>

    </body>
</html>

这基本上是我们书中的直接副本,但是我需要新主页的字段。与控制器 servlet 相同,直接复制除了只包含我需要的字段。

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    RequestDispatcher view = null;
    Status status = new Status();
    request.setAttribute("status", status);
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    if (username==null || username.length()==0)
        status.addException(new Exception("Please enter username"));
    if (password==null)
        status.addException(new Exception("Please enter password"));
    if (!status.isSuccessful()){
        view = request.getRequestDispatcher("Login.jsp");
        //view.forward(request, response);
    }
    else
        try{
            request.setAttribute("username", username);
            request.setAttribute("password", password);
        view = request.getRequestDispatcher("Registration.jsp");
        } catch (Exception e) {
            status.addException(new Exception("Error"));
            view = request.getRequestDispatcher("Login.jsp");
        }
    view.forward(request, response);
}

和 Status 类,同样是本书的直接副本。

public class Status {
private ArrayList exceptions;

public Status(){
    exceptions = new ArrayList();
}
public void addException(Exception exception) {
    exceptions.add(exception);
}
public boolean isSuccessful(){
    return (exceptions.isEmpty());
}
public Iterator getExceptions(){
    return exceptions.iterator();
}

无论在两个框中键入什么,单步调试都会显示未传递给参数的值。如果两个字段都有文本,如果只有一个有文本并且两个字段都为空,我会在屏幕上方打印创建的异常。

4

1 回答 1

2

您的请求参数名称与输入字段名称不匹配。您已为输入字段分配了usernameTF和的名称passwordTF。然后它们可以通过这些名称作为请求参数使用,但您正在尝试使用名称usernamepassword. 因此,您需要修复输入字段名称或请求参数名称,以便它们相互匹配。

顺便说一句,为什么要从像 JSF 这样的现代 MVC 框架退回到笨拙的 90 年代风格的混杂业务代码的 JSP?这真的是家庭作业要求你的吗?此外,HTML<font>元素自 1998 年以来已被弃用。您从哪里了解到它的?课程质量真的好吗?

于 2012-07-01T15:44:42.197 回答