我有一个JSP页面,它是一个充满表单的表。当我单击提交时,它会转到一个servlet,它假定使用getParamValues方法读取调查中表单的值,但它不起作用。当我尝试从getParamValues打印出String数组时,我不断获得nullpointerexceptions。
以下是相关的servlet代码:
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
resp.setContentType("text/plain");
PrintWriter out = resp.getWriter();
String[] nums = req.getParameterValues("questNum");
out.println(nums[2]);
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
doPost(req, resp);
}
以下是在GAE上运行的相关JSP代码:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page import="com.surveycreator.service.persistence.SurveyPersistence" %>
<%@ page import="com.surveycreator.service.model.Survey" %>
<%@ page import="com.surveycreator.service.model.SurveyQuestion" %>
<%@ page import="com.surveycreator.service.model.Survey" %>
<%@ page import="java.util.List" %>
<html>
<head>
<link type="text/css" rel="stylesheet" href="/stylesheets/main.css" />
</head>
<body>
<p>View Survey</p>
<form action="/storesurvey" method="post">
<input type="submit" value="Submit Survey" />
</form>
<%
SurveyPersistence persist = new SurveyPersistence();
String surveyName = request.getParameter("content");
Survey survey = persist.getSurvey(surveyName);
List<SurveyQuestion> question = survey.getSurvey();
out.println("<table border='1'><tr><th>QuestionNumber</th><th>Survey Question</th><th>(Yes/yes)(No/no)</th></tr>");
for (SurveyQuestion questionObject : question) {
int tableCounterString = questionObject.getQuestionNumber();
String quest = questionObject.getQuestion();
out.println("<tr><td><form><input id ='question' name='questNum' type='text' readonly='readonly' value='"+tableCounterString + " ' /></form></td><td><form><input id ='question' name='quest' type='text' readonly='readonly' value='"+quest + " ' /></form></td><td><form><input id ='ans' name='answer' type='text' value='' /></form></td></tr>");
}
%>
<%= survey.getSurveyName()%>
</body>
</html>
答案 0 :(得分:0)
根据目前提供的信息,NPE的唯一可能原因是您根本没有任何 <input>
,<select>
或{{1}在HTML表单中的任何地方都有<textarea>
的元素,它提交给servlet。
更新:提交按钮确实是不同的 HTML格式,而不是输入字段。您需要将提交按钮放在与输入字段相同的相同的 HTML表单中。根据功能要求 - 此时尚不清楚 - 您需要将提交按钮移动到表格单元格中,或者删除表格单元格中的name="questNum"
并将整个表格包裹在一个大的{{1}中}}
无关,在这种特殊情况下混合<form>
和<form>
是一种不好的做法。如果您通过在浏览器地址栏中输入其URL而不传递任何参数来打开servlet,那么您将肯定获取NPE。不要让他们这样做。仅将doGet()
用于预处理请求,并仅将doPost()
用于后处理请求。例如,您在JSP scriptlet doGet()
中拥有的所有Java代码都应该在doPost()
方法中完成,而HTML代码应该由JSTL重复{{1标签。
答案 1 :(得分:0)
我认为您的代码中有很多表单。当您按“提交调查”按钮时,没有值将被发送到servlet,而是按钮的值。
解决方案:(根据您提供的代码)
<head>
<link type="text/css" rel="stylesheet"
href="/stylesheets/main.css" />
</head>
<body>
<p>View Survey</p>
<form action="/storesurvey" method="post">
<input type="submit" value="Submit Survey" />
<%
SurveyPersistence persist = new SurveyPersistence();
String surveyName = request.getParameter("content");
Survey survey = persist.getSurvey(surveyName);
List<SurveyQuestion> question = survey.getSurvey();
out.println("<table border='1'><tr><th>QuestionNumber</th><th>Survey Question</th><th>(Yes/yes)(No/no)</th></tr>");
for (SurveyQuestion questionObject : question) {
int tableCounterString = questionObject.getQuestionNumber();
String quest = questionObject.getQuestion();
out.println("<tr><td><input id
='question' name='questNum' type='text' readonly='readonly'
value='"+tableCounterString + " '
/></td><td><input id
='question' name='quest' type='text' readonly='readonly' value='"+quest + "
' /></form></td><td><input id
='ans' name='answer' type='text' value='' /></td></tr>");
}
%>
</form> <-----(this is the change)
<%= survey.getSurveyName()%>
</body>
</html>
请注意,我在代码中删除了一些代码。
尝试一下。如果有bug,请在这里发布。 希望这有帮助。
NathanPhan