【问题标题】:Populating a drop down list in JSP from a Array List of Bean type从 Bean 类型的数组列表填充 JSP 中的下拉列表
【发布时间】:2014-12-14 22:24:12
【问题描述】:

在我的 Java EE 项目中,我有以下 Servlet:

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

import javax.naming.InitialContext;
import javax.servlet.RequestDispatcher;
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.sql.DataSource;

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

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

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        System.out.println("Inside doGet()!");

        ArrayList<BeanTitle> bt=new ArrayList<BeanTitle>();

        java.io.PrintWriter out = response.getWriter();
        response.setContentType("text/html"); 

        Connection conn=null;


        try {
            /* get the DataSource from using the JNDI name */
            Class.forName("com.mysql.jdbc.Driver");
            InitialContext ctx = new InitialContext();
            DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/Test");

            //Create connection and then continue as usual other JDBC calls 
            conn=ds.getConnection();
            System.out.println("\nConnection Successful in TitlePopulatorServlet !");
            Statement s= conn.createStatement();
            ResultSet rs=s.executeQuery("SELECT * FROM story");

            while (rs.next() ) 
            {
                BeanTitle b = new BeanTitle();
                b.setBtitle(rs.getString(1));
                bt.add(b);
            }

        } catch (Exception e){
            out.println("Failed!"+ e);
        }


            request.setAttribute("bt", bt);                                                         
            request.getRequestDispatcher("/StoryTitlePage.jsp").forward(request,response);


    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {



    }
}

BeanTitle如下:

public class BeanTitle 
{
    private String btitle;

    public String getBtitle() {
        return btitle;
    }

    public void setBtitle(String btitle) {
        this.btitle = btitle;
    }
}

而JSP页面(“StoryTitlePage.jsp”)如下:

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">


<html>
<head>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean id="storylist" class="serv.TitlePopulatorServlet" scope="request" />

<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

<title>Story Title Page</title>
</head>
<body>

<form action="/ReportData/DisplayReport" method="post" >

        Please select an element: 

        <select id="selectedRecord" name="selectedRecord">

            <c:forEach var="item" items=${storylist.bt} >
                <option>${item.tarr}</option>
            </c:forEach>
        </select>

        <input type="submit" value="Submit"> 

    </form>

</body>
</html>

但是当我在服务器上启动 TitlePopulatorServlet 时它不起作用。 我在迭代/EL 中哪里出错了?

【问题讨论】:

    标签: eclipse jakarta-ee arraylist jstl


    【解决方案1】:

    servlet 在名为“bt”的属性下存储请求中的列表。所以它已经存在,在请求中。没必要做

    <jsp:useBean id="storylist" class="serv.TitlePopulatorServlet" scope="request" />
    

    这只会创建您的 servlet 的一个新实例,这没有任何意义。 bt 是请求属性。它不是 servlet 的属性。所以使用${storylist.bt} 也没有任何意义。

    你想遍历bt的元素,所以你只需要

    <c:forEach var="item" items="${bt}">
    

    最后,bt 的每一项都是BeanTitle 类型。而你正在做

    ${item.tarr}
    

    这相当于调用

    beanTitle.getTarr()
    

    而且 BeanTitle 中没有 tarr 属性。唯一的属性是btitle(因为该类的唯一getter 名为getBTitle())。

    所以你必须使用的是

    ${item.btitle}
    

    你的名字很糟糕,只会让你更加困惑。你为什么不使用真实的单词来命名你的类和属性?比如说

    public class Book {
        private String title;
    
        public String getTitle() 
    
        ...
    }
    

    【讨论】:

    • 感谢经典的讲解!但经过所有更正后,它显示此错误:消息 java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/LoopTag 我已包含 JSTL1.2.jar、jstl-impl.jar。而且我还确保 1) jar 文件位于 WEB-INF 下的 lib 文件夹中,而不仅仅是在构建路径中引用。 2)tomcat 8 运行时库包含在我的构建路径中
    • 阅读stackoverflow.com/tags/jstl/info 了解在哪里下载以及如何安装 JSTL。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 2016-12-14
    相关资源
    最近更新 更多