我正在尝试从 jsp 页面获取值,并希望使用 java 将这些值存储在 mysql(xampp) 数据库中。 连接已建立并成功登录,但当我尝试获取值时出现空指针异常
MainController.java
是
package classes;
import java.io.IOException;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
//import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* Servlet implementation class MainController
*/
@WebServlet("/MainController")
public class MainController extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MainController() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
}
//@SuppressWarnings("null")
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
String url= "jdbc:mysql://localhost/meeting_planner";
System.out.println("start");
// boolean stfound = false;
try {
System.out.println("reached controller");
Class.forName("com.mysql.jdbc.Driver");
Connection con = DriverManager.getConnection(url, "admin", "admin");
Statement stmt = con.createStatement();
//System.out.println("connection");
String button=request.getParameter("button");
System.out.println(button + request.getParameter("AId"));
if(button.equals("login"))
{
System.out.println("inside if");
String AdminId= request.getParameter("AId");
String password= request.getParameter("Password");
System.out.println(AdminId+" sadia "+password);
if(!(AdminId=="" || password==""))
{
boolean stfound = false;
System.out.println(AdminId+" sadia "+password);
String query = "SELECT AId,Password FROM administrator";
ResultSet rs = stmt.executeQuery(query);
System.out.println(query);
while(rs.next())
{
String dbadminid = rs.getString(1);
String dbadminpwd = rs.getString(2);
if(AdminId.equals(dbadminid) && password.equals(dbadminpwd))
{
HttpSession session = request.getSession(true);
session.setAttribute("userid",dbadminid);
stfound = true;
break;
}
}
if(stfound){
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher ( "/meeting_Id.jsp" ) ;
dispatcher.forward ( request, response ) ;
}
}
else{
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher ( "/index.jsp" ) ;
dispatcher.forward ( request, response ) ;
}
}
if(button.equals("Next"))
{
HttpSession session = request.getSession(true);
String AID =(String) session.getAttribute("aid");
int meetingid = Integer.parseInt(request.getParameter("meeting_id"));
/*String CNM= request.getParameter("CNM");
int CCD = Integer.parseInt(request.getParameter("CCD"));
int CCDD= Integer.parseInt(request.getParameter("CCDD"));
int PID= Integer.parseInt(request.getParameter("PID"));
int STFID=Integer.parseInt(AID);*/
meeting obj=new meeting();
obj.addmeeting(meetingid);
System.out.print("Sadia");
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher ( "/creat_date.jsp" ) ;
dispatcher.forward ( request, response ) ;
}
}catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
Meeting.java 是
package classes;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Statement;
public class meeting {
private int meeting_id;
Connection con=null;
Statement smt = null;
public static void main(String[] args) {
// TODO Auto-generated method stub
}
public meeting()throws ClassNotFoundException//construtor
, SQLException{
// try{
String url = "jdbc:mysql://localhost/meeting_planner";
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(url, "admin", "admin");
smt = con.createStatement();
//}catch(ClassNotFoundException e1){
//e1.printStackTrace();
}
public void addmeeting(int meeting_id1)throws ClassNotFoundException // from attribute web.xml
, SQLException{
System.out.println("------TRY INSERTION------");
String query = "SELECT meeting_Id FROM meeting";
ResultSet rs = smt.executeQuery(query);
int numCols = rs.getMetaData().getColumnCount()+1;
// STAFF_ID=numCols+1;
String query1 = "INSERT INTO Meeting VALUE ( "+meeting_id+")";
System.out.println(query1);
smt.executeUpdate(query1);
}
}
下一步按钮的名称是“下一步” 当我在这一行打印
next
的值时System.out.println("next"+next);
它为下一个参数打印 null
** 编辑:NullPointerException 的问题已解决,但现在抛出 NumberFormatException **
控制台是这样的
start
reached controller
inside if
111 sadia sadia
111 sadia sadia
SELECT AId,Password FROM administrator
start
reached controller
Oct 29, 2014 6:44:57 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [classes.MainController] in context with path [/Meeting1] threw
exception
java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at classes.MainController.doPost(MainController.java:141)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1023)
at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
index.jsp 是
<form method = "post" name="create" action="MainController">
<label for="author">Enter id: </label> <input type="text"
id="AId" name="AId" required="required" />
<div class="cleaner_h10"></div>
<label for="author">Enter_password: </label><input
type="password" name="Password" required="required" />
<div class="cleaner_h10"></div>
<br> <input type="submit"
name="button" " value="login"
style="height: 30px; width: 70px"></a>
</input>
</form>
meeting_Id.jsp 是
<form method="post" name="create" action="MainController">
<label for="author">Enter Meeting Id:</label> <input type="text" id="meeting_id" name="mid" required="required" />
<div class="cleaner_h10"></div>
<div class="cleaner_h10"></div><br>
<input type="submit" name="cancelbutton" value="Cancel" style="height:30px; width:70px">
</input>
<input type="submit" name="button" value="Next" style="height:30px; width:70px">
</input>
</form>
问题就在这里:
//System.out.println("connection");
String button=request.getParameter("button");
System.out.println(button + request.getParameter("AId"));
if(button.equals("login"))
从您自己的调试打印中可以看到,您打印的
button
和参数AId
都是空。
因此,当您尝试调用
button.equals("login")
时,您会收到 NullPointerException。那是因为你不能在 null 上调用方法。
在使用参数之前,您应该始终检查参数是否为
null
。即使您认为它们永远不应该是 null
- 因为黑客可以尝试在不控制您的表单的情况下向您的 servlet 发送内容。
这是一步一步发生的事情。
index.jsp
。您点击按钮。button
的 index.jsp
参数,所以一切正常,并且它到达最后的代码,将其转发到现在显示在浏览器上的 meeting_Id.jsp
。meeting_Id.jsp
中的表格发送回 MainController
。button
。因此你会得到 NullPointerException。您正在 MVC 环境中工作。每个表单都会发送到同一个控制器
MainContoller
,并且 MainController
应该足够聪明,能够知道哪个表单向其发送了请求,并相应地进行处理。但你的假设只有 index.jsp
正在调用它。但它不是这样工作的。当您单击 next
上的 meeting_Id.jspa
按钮时,您正在创建一个 新请求,该请求将发送到同一个 MainController
servlet,并导致错误。
您应该确保您的表单发送某种 ID,告诉
MainController
目前哪个表单正在使用它,然后控制器可以发送请求以由适当的模型处理。您使用它的输入应该具有相同的名称,并且应该存在于您发送的所有表单中。
现在您由于不同的原因遇到了类似的问题。在这一行中:
int meetingid = Integer.parseInt(request.getParameter("meeting_id"));
您正在尝试解析一个名为
meeting_id
的参数。问题是,您没有检查空值。你实际上没有这样的参数。
为什么?因为这就是您的 HTML(在
meeting_Id.jsp
中)所说的:
<input type="text" id="meeting_id" name="mid" required="required" />
如您所见,“meeting_id”是其 id,而不是其 name,并且
getParameter()
始终与输入的 name
配合使用。
除此之外,修复此问题后,您必须(使用正则表达式)确保参数中仅包含数字,或者必须在
NumberFormatException
行周围使用 try-catch 块来捕获 parseInt
。
始终、始终检查从用户那里获得的参数。永远不要假设它们存在,它们不为空,或者它们具有您期望它们具有的值。