java - 无法使用 jSTL 将对象数组列表从 servlet 发送或传递到 jsp

标签 java database jsp servlets jstl

嘿,大家好,我试图通过将 arraylist 对象从 servlet 传递到 jsp 来显示数据库表中的用户列表,但无法这样做。

1.> 登录.java

package com.pms.servlet;

public class Login {

int id;
String fname;
String mname;
String lname;
String uname;
String utype;
String emailid;
String mobno;
String address;
String password1;
String password2;


public int getUid()
{
    return id;
}
public void setUid(int id)
{
    this.id=id;
}
public String getFname()
{
    return fname;
}
public void setFname(String fname)
{
    this.fname=fname;
}
public String getMname()
{
    return mname;
}
public void setMname(String mname)
{
    this.mname=mname;
}
public String getLname()
{
    return lname;
}
public void setLname(String lname)
{
    this.lname=lname;
}
public String getUname()
{
    return uname;
}
public void setUname(String uname)
{
    this.uname=uname;
}
public String getUtype()
{
    return utype;
}
public void setUtype(String utype)
{
    this.utype=utype;
}
public String getEmailid()
{
    return emailid;
}
public void setEmailid(String emailid)
{
    this.emailid=emailid;
}
public String getMobno()
{
    return mobno;
}
public void setMobno(String mobno)
{
    this.mobno=mobno;
}
public String getAddress()
{
    return address;
}
public void setAddress(String address)
{
    this.address=address;
}
public String getPassword1()
{
    return password1;
}
public void setPassword1(String password1)
{
    this.password1=password1;
}
public String getPassword2()
{
    return password2;
}
public void setPassword2(String password2)
{
    this.password2=password2;
}
}

2.>删除.java

package com.pms.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;

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;
import javax.swing.text.html.HTMLDocument.Iterator;

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

/**
 * @see HttpServlet#HttpServlet()
 */
public Delete() {
    super();
    // TODO Auto-generated constructor stub
}

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub

        Connection conn=null;
        String url="jdbc:mysql://localhost:3306/";
        String dbName="projectmanagement";
        String driver="com.mysql.jdbc.Driver";
        String dbUserName="root";
        String dbPassword="root";

        try{
        Class.forName(driver).newInstance();
        conn = DriverManager.getConnection(url+dbName,dbUserName,dbPassword);
        String strQuery="select * from user";
        System.out.println("The sql is " +strQuery);
    Statement st= conn.createStatement();
        ResultSet rs= st.executeQuery(strQuery);

        ArrayList<Login> al=new ArrayList<Login>();

    while(rs.next())
    {
        Login l=new Login();
        //l.setUid(rs.getInt("uid"));
        l.setFname(rs.getString("fname"));
        l.setMname(rs.getString("mname"));
        l.setLname(rs.getString("lname"));
        l.setUname(rs.getString("uname"));
        l.setUtype(rs.getString("utype"));
        l.setEmailid(rs.getString("emailid"));
        l.setMobno(rs.getString("mobno"));
        l.setAddress(rs.getString("address"));
        System.out.println(l);
        System.out.println(al);
        al.add(l);

        request.setAttribute("ual",al);
        System.out.println(al);
        }

        rs.close();
        st.close();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }



        response.setContentType("text/html");


    }

 }

3.>成功.jsp

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
  pageEncoding="ISO-8859-1"%>
 <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   "http://www.w3.org/TR/html4/loose.dtd">
 <html>
 <body>

 <form name="delete-user" action="Delete" method="post">
        <p><b><i>List of user details:</i></b></p>
        <table border="1">

            <tr>
            <th>First Name</th>
            <th>Middle Name</th>
            <th>Last Name</th>
            <th>User Name</th>
            <th>Usertype</th>
            <th>Email id</th>
            <th>Mobile No</th>
            <th>Address</th>
            <th>Delete User</th>
            </tr>
        <c:forEach items="${ual}" var="u">
            <tr>
            <td><c:out value="${u.fname}"></c:out></td>
            <td><c:out value="${u.mname}"></c:out></td>
            <td><c:out value="${u.lname}"></c:out></td>
            <td><c:out value="${u.uname}"></c:out></td>
            <td><c:out value="${u.utype}"></c:out></td>
            <td><c:out value="${u.emailid}"></c:out></td>
            <td><c:out value="${u.mobno}"></c:out></td>
            <td><c:out value="${u.address}"></c:out></td>
                <td><input type="button" name="delete" value="Delete User"/>    </td>
            </tr> 
        </c:forEach>
        </table>
        </form>
  </body>
  </html>

在这里,我无法将用户列表的对象数组列表从 servlet 传递到 jsp。没有运行时或编译时错误。我可以通过在 jSTL sql 标记中编写查询来显示用户列表,但无法在 java servlet 代码中执行此操作。 :(

在 web.xml 中,一切都很好,数据库连接也已正确完成。那我哪里出错了。

我检查了各种捕获和教程,但无法这样做。

请帮忙。

最佳答案

你有一个严重的误解。仅当提交表单时才调用 servlet。因此,您不能期望在 JSP 中访问应该在请求中创建并存储的列表,因为从未调用过执行此操作的 servlet。

您的 servlet 永远不会转发到 JSP。它所做的只是将响应的内容类型发送到 text/html。

此外,您在循环的每次迭代中都将相同的列表存储在请求属性中,而不是在循环结束时只执行一次:

while(rs.next()) {
    ...
}
request.setAttribute("ual", al);

这是您应该拥有的:

  1. ShowUsers servlet。该 servlet 应该有一个 doGet() 方法,该方法获取用户,将它们存储在请求属性中,然后转发到 showUsers.jsp 页面
  2. showUsers.jsp 应该为每个用户提供一个表单(而不是包含所有用户的单个表单)。每个表单都应该在隐藏输入字段中包含要删除的用户 ID,以及用于删除用户的提交按钮。该表单应具有DeleteUser servlet 的路径。
  3. DeleteUser servlet 应该有一个 doPost() 方法,该方法应该将要删除的用户的 ID 作为请求参数,从数据库中删除该用户,然后重定向到 ShowUsers servlet。

关于java - 无法使用 jSTL 将对象数组列表从 servlet 发送或传递到 jsp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22880560/

相关文章:

php - 查找 MAX AVG 的 SQL 请求

sql - 您可以在 select 命令中创建一个 case 语句来评估两个不同的表字段吗?

java - 如何在 JSP 中循环遍历 HashMap?

java - 将列表从 servlet 传递到 jsp null

java - & 位运算符如何在这里工作?

java - 如何在java中从一组大小为n的集合中迭代生成k个元素子集?

java - 找不到可用的空闲守护进程

java - Java 应用程序终止时是否释放了所使用的资源?

java - 用于 DB2 和 Oracle 数据源的 flexypool

java - 如何在JSP..中进行分页?