Java Servlet 将用户信息存储到 Java DB 中



我写了一个java servlet来插入和显示数据库中的用户信息。我正在向所有用户插入一张照片。问题是当我想显示照片的字节数组时,它只显示第一个字节,例如:[B@43809cd3

private void doAddUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    InputStream inputStream = null;
    Part filePart = request.getPart("image");
         if (filePart != null) {
            // prints out some information for debugging
            System.out.println(filePart.getName());
            System.out.println(filePart.getSize());
            System.out.println(filePart.getContentType());
            // obtains input stream of the upload file
            inputStream = filePart.getInputStream();
        }
    String message = null;            
    try {
        // Register JDBC driver
        Class.forName("org.apache.derby.jdbc.ClientDriver");
        // Open a connection
        Connection conn = DriverManager.getConnection("jdbc:derby://127.0.0.1:1527/tutoriumDB", "db", "db");           
        // Execute SQL query
        PreparedStatement st= conn.prepareStatement("insert into users(ID,NAME,LAT,LONG,IMAGE) values(?,?,?,?,?)");                                 
        st.setString(1, request.getParameter("id1"));
        st.setString(2, request.getParameter("name"));
        st.setString(3, request.getParameter("lat"));
        st.setString(4, request.getParameter("long"));
         if (inputStream != null) {               
                //st.setBlob(5, inputStream);
                st.setBinaryStream(5, inputStream, (int)filePart.getSize());
        }
        int row = st.executeUpdate();
        if (row > 0) {
            message = "File uploaded and saved into database";
        }
        st.close();
        conn.close();
        try (PrintWriter out = response.getWriter()) {
                out.println("Der Benutzer mit der ID: " +request.getParameter("id1")+" und Name: " +
                    request.getParameter("name")+" wurde eingefuegt");
        }
    } catch (ClassNotFoundException | SQLException ex) {
        Logger.getLogger(TutServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
   // sets the message in request scope
    request.setAttribute("Message", message);
    // forwards to the message page
    getServletContext().getRequestDispatcher("/submit.jsp").forward(
            request, response);
}
private void getAllUsers(HttpServletRequest request, HttpServletResponse response) throws IOException
{
     try {
        // Register JDBC driver
        Class.forName("org.apache.derby.jdbc.ClientDriver");
        // Open a connection
        Connection conn = DriverManager.getConnection("jdbc:derby://127.0.0.1:1527/tutoriumDB", "db", "db");
        // Execute SQL query
        String sql = "SELECT * FROM users order by ID";
        Statement stmt = conn.createStatement();
        ResultSet rs = stmt.executeQuery(sql);
        byte[] imgData = null ;
        ArrayList<String> users = new ArrayList<String>();
        while (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            double lat = rs.getDouble("lat");
            double longit = rs.getDouble("long");
            byte[] bytes = rs.getBytes("image");            
            users.add(id + ", " + name+ ", " +lat+ ", " +longit+ ", " +bytes);
        }
        stmt.close();
        conn.close();
        try (PrintWriter out = response.getWriter()) {
            for (String s : users)
            {
                out.println(s);
            }
        }
    } catch (ClassNotFoundException | SQLException ex) {
        Logger.getLogger(TutServlet.class.getName()).log(Level.SEVERE, null, ex);
    }

}

getAllUser 的结果

好的,

让我检查一下我分析了您的代码并看到了图像,图像是正确的,因为您正在使用

users.add(id + ", " + name+ ", " +lat+ ", " +longit+ ", " +bytes);

如您所见,称为字节的 var 是这样的:

byte[] bytes = rs.getBytes("image");       

为什么它会得到[B@43809cd3?,因为方法toString没有覆盖字节。

你能做什么? 如果你的字节不是空的,那么迭代它并像这样制作你自己的字节:

byte[] bytes = new byte[2];
bytes[0] = 1;
bytes[1] = 127;
System.out.println(bytes);
StringBuilder byteAppender = new StringBuilder("");
if(null != bytes){
    for(byte b: bytes){
        byteAppender.append(b);
    }
    System.out.println("Ok bites are " +byteAppender);
}
所以

现在你将放置字节追加器而不是字节,所以这将是:

users.add(id + ", " + name+ ", " +lat+ ", " +longit+ ", " +byteAppender );

所以你的表德可能是这样的:

private void getAllUsers(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
         try {
            // Register JDBC driver
            Class.forName("org.apache.derby.jdbc.ClientDriver");
            // Open a connection
            Connection conn = DriverManager.getConnection("jdbc:derby://127.0.0.1:1527/tutoriumDB", "db", "db");
            // Execute SQL query
            String sql = "SELECT * FROM users order by ID";
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            byte[] imgData = null ;
            ArrayList<String> users = new ArrayList<String>();
            StringBuilder byteAppender = new StringBuilder(""); //here is the String you will make
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                double lat = rs.getDouble("lat");
                double longit = rs.getDouble("long");
                byte[] bytes = rs.getBytes("image");    
                if(null != bytes){ //you ask the object is not null
                    for(byte b: bytes){ //you itarete it
                        byteAppender.append(b); //you add it
                    }
                }
                users.add(id + ", " + name+ ", " +lat+ ", " +longit+ ", " +byteAppender); //you put it
                byteAppender.setLength(0); //you restart it
            }
            stmt.close();
            conn.close();
            try (PrintWriter out = response.getWriter()) {
                for (String s : users)
                {
                    out.println(s);
                }
            }
        } catch (ClassNotFoundException | SQLException ex) {
            Logger.getLogger(TutServlet.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

你也可以读到这个: 如何将字节数组转换为字符串,反之亦然

希望对您有所帮助。

赛亚

最新更新