得到了一个给我带来问题的家庭作业......它通过添加两个页面和一个控制器servlet以及另外两个bean来修改一个带有两个页面的bean和一个适合MVC2的bean。新的主页面转发到第二个新页面或旧的第一个页面。我的问题是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();
}
无论在两个框中输入什么内容,单步执行调试都会显示未传递给参数的值。如果两个字段都有文本,如果只有一个有文本,两个都是空的,我会在屏幕上方打印创建的例外。
答案 0 :(得分:2)
您的请求参数名称与输入字段名称不匹配。您已为输入字段指定了usernameTF
和passwordTF
的名称。然后,这些名称可以作为请求参数使用,但您尝试使用名称username
和password
来获取它们。因此,您需要修复输入字段名称或请求参数名称,以便它们相互匹配。
顺便说一句,为什么从像JSF这样的现代MVC框架回归到具有混合业务代码的笨拙的90年代样式JSP?是真的家庭作业要求你做什么?自1998年以来,HTML <font>
元素也被弃用。您从哪里了解它?课程的质量真的很好吗?