简体   繁体   English

将Servlet中提交的表单值传递给Java类,从而插入数据库

[英]passing form values submitted in a servlet to a java class and hence inserting into database

The form values are submitted to the servlet and I need to retrieve those values into a class "RegisterDetails" and hence insert into the database "userdetails".. I used session to store the values and later retrieve it in the class file. 表单值被提交到servlet,我需要将这些值检索到“ RegisterDetails”类中,并因此插入到数据库“ userdetails”中。.我使用了会话来存储这些值,然后在类文件中对其进行检索。 Its a failure. 这是一个失败。 How am I supposed to bring those values into the class file??? 我应该如何将这些值带入类文件??? Later I need to pass the values into a jsp as well. 稍后,我还需要将这些值传递到一个jsp中。 Please instruct me. 请指示我。 If there's any mistakes please help me... 如果有任何错误,请帮助我...

Servlet: p1.java Servlet:p1.java

import java.io.IOException;
import java.sql.Connection;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
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;

//import reg.common.Co;
//import agge.db.geg;
//import agge.model.m_login;
import reg.db.RegisterDetails;


/**
 * Servlet implementation class p1
 */
@WebServlet("/p1")
public class p1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public p1() {
        super();
        // TODO Auto-generated constructor stub
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        HttpSession session = request.getSession();
        String a=request.getParameter("username1");
        String b=request.getParameter("password1");
        String c = request.getParameter("confirmpassword1");
        String d = request.getParameter("email1");
        String ee = request.getParameter("mob1");
        String f =request.getParameter("address1");

        System.out.println("Hai User "+a);
        System.out.println("Password is "+b);


        session.setAttribute("de", a); 
        session.setAttribute("de1", b);
        session.setAttribute("de2", c);
        session.setAttribute("de3", d);
        session.setAttribute("de4", ee);
        session.setAttribute("de5",f);
        RegisterDetails details = new  RegisterDetails();

        session.setAttribute("details", details);
        getServletContext().getRequestDispatcher("/jsp/Welcome.jsp").forward(request, response);
    }
}

Class: RegisterDetails.java 类:RegisterDetails.java

package reg.db;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpSession;

import java.sql.*;
public class RegisterDetails {
    String user13;
    String pass13;
    String confpassword13;
    String email13;
    String mobile13;
    String address13;
    private ServletRequest session;


    String n=(String)session.getAttribute("de");
    String n1=(String)session.getAttribute("de1");
    String n2=(String)session.getAttribute("de2");
    String n3=(String)session.getAttribute("de3");
    String n4=(String)session.getAttribute("de4");
    String n5=(String)session.getAttribute("de5");



    public boolean insertDB() throws Exception {        

        Connection conn=null;
        PreparedStatement st = null;

        st=conn.prepareStatement("insert into user_details(username, password, confpassword, email,mobile, address) values ('" + n + "','" + n1 + "','" + n2 + "','" + n3 + "','" + n4 + "',' "+n5+ "')");

        ResultSet rs =st.executeQuery();
        boolean l_status=false;
        while(rs.next()){
            user13          =   rs.getString("username");
            pass13          =   rs.getString("password");
            confpassword13  =   rs.getString("confpassword");
            email13         =   rs.getString("email");
            mobile13            =   rs.getString("mobile");
            address13           =   rs.getString("address");
        }
        return l_status=true;

    }
}

Database connectivity: Dbconnect.java 数据库连接:Dbconnect.java

package reg.common;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Dbconnect {

    Connection conn=null;

    public  Connection getConnection() { 
         try {
             String driverName = "org.postgresql.Driver";
             Class.forName(driverName).newInstance(); 

             conn=DriverManager.getConnection("jdbc:postgresql://localhost:5432/postgres","postgres", "postgres");
         } 
         catch (ClassNotFoundException e) {e.printStackTrace();
             System.out.println("db Error1");
         } 
         catch (SQLException e) {
             e.printStackTrace();
             System.out.println("DB Error 2");
         }
         catch (Exception e) {

        }
         return conn;
    }

    public void closeConnection(Connection connection) {
        try{
            connection.close();
        }
        catch (Exception e) {

        }

    }
}

jsp:Welcome.jsp JSP:Welcome.jsp中

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
    <%@ page import="reg.db.RegisterDetails" %>

<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

  Hai
<% RegisterDetails details = (RegisterDetails)session.getAttribute("details");%>

</body>
</html>

In your p1 servlet, you are setting your session attribute "details" with a new instance of RegisterDetails without setting any properties of that object (ie username, etc.). 在您的p1 servlet中,您正在使用RegisterDetails的新实例设置会话属性“详细信息”,而没有设置该对象的任何属性(即用户名等)。

Instead, you are setting those properties as cryptically named session attributes ("de", "de1" and so on). 而是将这些属性设置为隐式命名的会话属性(“ de”,“ de1”等)。

This is likely to cause your issue (aside from all considerations in terms of architecture or security), since the RegisterDetails you retrieve will essentially be an empty object. 这可能会导致您的问题(除了体系结构或安全性方面的所有注意事项之外),因为您检索的RegisterDetails本质上将是一个空对象。

Try these few steps ... 1. Instead of storing the parameter values in various String objects, you should set the value of the data members of your RegisterDetails object 尝试执行以下几个步骤... 1.而不是将参数值存储在各种String对象中,您应该设置RegisterDetails对象的数据成员的值

  1. Create another class that specifically handles the job of working with the database (use the connection object in that class) 创建另一个专门处理数据库工作的类(使用该类中的连接对象)

  2. Create methods for CRUD operations in the above class and pass the RegisterDetails object. 在上述类中为CRUD操作创建方法,并传递RegisterDetails对象。

  3. Call the insert method of the newly created class from within your servlet and pass the RegisterDetails object in it 从您的Servlet中调用新创建的类的insert方法,并在其中传递RegisterDetails对象

  4. Once inserted then add the RegisterDetails object to the servlet request and dispatch the request to your jsp 插入后,将RegisterDetails对象添加到servlet请求中,并将请求分派到您的jsp

You are setting the parameters received in your servlet into other session attributes and setting an empty RegisterDetails Object. 您要将在servlet中接收到的参数设置为其他会话属性,并设置一个空的RegisterDetails对象。 Instead set the values received in the RegisterDetails object in you servlet. 而是在Servlet中设置RegisterDetails对象中接收的值。 Something like this:- 像这样的东西:

RegisterDetails details = new  RegisterDetails();
details.user13=request.getParameter("username1");
details.pass13=request.getParameter("password1");
details.confpassword13= request.getParameter("confirmpassword1");
details.email13= request.getParameter("email1");
details.mobile13 = request.getParameter("mob1");
details.address13 =request.getParameter("address1");

This should solve your issue, but apart from this I suggest to redesign your solution and follow coding best practices. 这应该可以解决您的问题,但除此之外,我建议您重新设计解决方案并遵循编码最佳实践。 Alteast generate getter/setter methods for you RegisterDetails class, and then set the object data memeber values using that, intead of directly accessing them. Alteast为您的RegisterDetails类生成getter / setter方法,然后使用该方法设置对象数据成员值,以直接访问它们。

Edit:- It seems that the access specifier of your data members for RegisterDetails is default , change it to public to access and assign them values, since your servlet and RegisterDetails classes are in different packages. 编辑:-似乎您的数据成员对RegisterDetails的访问说明符是default ,将其更改为public以访问并为其分配值,因为您的Servlet和RegisterDetails类位于不同的程序包中。 Although the recommended approach would be to set them as private and generate public getter/setters. 尽管推荐的方法是将它们设置为private并生成公共获取者/设置者。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM