我是新手开发者。在我的代码中,html页面在浏览器中正确显示,但在提交数据后,它不会调用post方法,因此不会将数据存储在我的mysql workbence数据库中。数据库中的模式名称是注册,表名是reg_details。我正在使用apache tomcat服务器。
HTML文件:
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="Registration" method="post" autocomplete="on">
<fieldset>
<legend>Registration Details:</legend>
First Name   <input type="text" name="firstname" autofocus>   Middle name   <input type="text" name="middlename">   Last Name   <input type="text" name="lastname"><br><br>
Address   <br> <textarea name="address" rows="2" cols="25"></textarea>
<br><br>
Gender   <input type="radio" name="gender" value="male"> Male <input type="radio" name="gender" value="female"> Female<br><br>
Mobile No.   <input type="text" name="mobileno"> <br><br>
Email Id   <input type="email" name="emailid"> <br><br>
Birth Date   <input type="date" name="birthday"><br><br>
Username   <input type="text" name="username"><br><br>
Password   <input type="password" name="password"><br><br>
<input type="submit" value="Submit">
</fieldset>
</form>
</body>
</html>
registration.java文件
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Registration
*/
@WebServlet("/Registration")
public class Registration extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Registration() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//http://localhost:12093
try {
String firstname=request.getParameter("firstname");
PrintWriter print = response.getWriter();
print.println(firstname);
Class.forName("com.mysql.jdbc.Driver");
java.sql.Connection connection;
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/registration","root","rohan");
PreparedStatement ps=connection.prepareStatement("INSERT INTO reg_details (name) values ('rk');");
//Statement stmt = connection.createStatement();
// ResultSet result = stmt.executeQuery("INSERT INTO reg_details (name) values ('rohan');");
ps.setString(1, firstname);
ps.executeUpdate();
// while(result.next())
// {
// PrintWriter print = response.getWriter();
// print.println(result.getString("name"));
// }
connection.close();
ps.close();
} catch (SQLException | ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
For writing connection con = DriverManager.getconnection(); its telling me to write like this java.sql.Connection connection; or connection con = (connection)DriverManager.getconnection();
我更新了您的建议。我在结束时关闭了连接并删除了服务方法但在执行相同的错误退出后。我正在连接我的控制台,以便它可以帮助你。我使用mysql-connector-java-5.1.44-bin.jar进行数据库连接。
这是来自服务器控制台的堆栈跟踪:
org.apache.tomcat.util.digester.SetPropertiesRule begin
WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:Hospital Queue Management' did not find a matching property. org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:
org.apache.catalina.startup.VersionLoggerListener log
INFO: Server number: 8.0.48.0
org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture: amd64
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8085"]
org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["ajp-nio-8019"]
org.apache.catalina.startup.Catalina start
INFO: Server startup in 1512 ms
WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:964)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:897)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:886)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:860)
at com.mysql.jdbc.PreparedStatement.checkBounds(PreparedStatement.java:3327)
at com.mysql.jdbc.PreparedStatement.setInternal(PreparedStatement.java:3312)
at com.mysql.jdbc.PreparedStatement.setString(PreparedStatement.java:4027)
at Registration.doPost(Registration.java:44)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
答案 0 :(得分:1)
java.sql.SQLException:参数索引超出范围(1&gt;数 参数,即0)。
您没有任何占位符用于准备陈述(参数数量为0
)
INSERT INTO reg_details (name) values ('rk')
但是,你正试图设置
ps.setString(1, firstname);
这就是原因,你得到了例外。您需要更改SQL才能接受一个参数
INSERT INTO reg_details (name) values (?)
答案 1 :(得分:0)
如果在调用存储过程时遇到此异常:
java.sql.SQLException:参数索引X of超出范围(1,Z)
如果您正在使用
然后,您必须注意这些事情。
@Repository
public interface UserDao extends JpaRepository<User, Long>{
@Procedure(procedureName = "PersistUserInfo" , outputParameterName = "id")
long saveUserInfo(String userName, String firstName, String lastName);
}
因此您的存储过程应如下所示:
CREATE PROCEDURE `PersistUserInfo`(IN userName varchar(20), IN firstName varchar(100), IN lastName varchar(100), OUT id BIGINT)
在休眠日志中,您将找到如下所示的SP调用:
{call PersistUserInfo(?,?,?,?)}
通过这些更改,我能够解决问题并能够调用存储过程。