java 如果属性包含值数组,如何在 JSP 中导入 Bean 属性的值?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/5424431/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 11:03:53  来源:igfitidea点击:

How to import values of a Bean attribute in JSP if the attribute contains an array of values?

javajspjavabeans

提问by Anurag

UPDATED: I have included the whole code to clear the ambiguity.

更新:我已经包含了整个代码来消除歧义。

This is the CompileClass that I am using for getter and setter methods:

这是我用于 getter 和 setter 方法的 CompileClass:

 package user;

public class CompileClass {
    public String date1;
    public String date2;
    public String p_code;


    public CompileClass(){
    }    

    public void setDate1( String name ) {
        date1 = name;
    }
    public void setDate2( String name ) {
        date2 = name;
    }
    public void setP_code( String name ) {
        p_code = name;
    }

     public String getDate1() { 
        return date1;
    }

     public String getDate2() { 
         return date2;
     }

     public String getP_code() { 
         return p_code;
     }
}

And this is my BEANduplicaterecords.jsp:

这是我的BEAN重复记录.jsp

package user;

import java.io.* ;
import java.sql.*;
import java.text.*;
import javax.servlet.*;//modified for JSP
import javax.servlet.http.*;//modified for JSP

import user.CompileClass;
 /*to find duplicate records and their time stamps*/
public class duplicaterecords extends HttpServlet{//modified for JSP
    public static void main(String[] args,HttpServletRequest request, HttpServletResponse response)//modified for JSP 
    {
    int l,x=0,y=0,tow,i=0,tower1=0,t=0;
    String p_code,date[],date1,date2,getdate,date3,tower,t_split;

    String time2;
              //tow=new int[1000];
    date=new String[100];

    CompileClass c=new CompileClass();//modified for JSP

    //HttpServletRequest request;//modified for JSP     

     DecimalFormat df = new DecimalFormat("#.##");
     try
         {  

                                  BufferedReader b = new BufferedReader(new InputStreamReader(System.in)); //input buffer 
                        Class.forName("com.mysql.jdbc.Driver");
                                  Connection
                                  con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "root");
                                  Statement stmt=con.createStatement();

              String query1="select distinct(date) FROM `report_data` WHERE date>= ? and date<= ? "; //Query one for date input 
               PreparedStatement ps=con.prepareStatement(query1);

               //System.out.println("Enter the 1st DATE"); //Date 1 is entered 
                date1 = c.getDate1();//modified for JSP
                //System.out.println("Enter the 2nd DATE"); //Date 2 is entered 
                //date2=b.readLine();
                date2 = c.getDate2();//modified for JSP
                                    ps.setString(1,date1);
                ps.setString(2,date2);
                         //System.out.println("enter the param_code"); // param_code is entered 
                //p_code= b.readLine();
                  p_code=c.getP_code();//modified for JSP

               ResultSet result=ps.executeQuery();  
                          //System.out.print("Tow_id");

                         while(result.next() )
                        {
                          getdate=result.getString("date");
                          //System.out.print("\t"+getdate);
                          request.setAttribute("dates", getdate);//modified for JSP
                    date3='%'+getdate+'%';
                                    date[x]=date3;
                    x++;
                         }

                          l=x;


              String query2="SELECT distinct(tow_id) FROM  `tower_data` WHERE TIME_STAMP LIKE ? "; //query 2 for finding tower-id 
                                   PreparedStatement ps1=con.prepareStatement(query2);
                ps1.setString(1,date[0]);      
                ResultSet result1=ps1.executeQuery(); 
                while(result1.next())
                 { 
                  //System.out.println("");
                  tower=result1.getString("tow_id");
                   tower1= Integer.parseInt(tower);


                 t=y;
                 //System.out.print(tower1);
                 request.setAttribute("towers", tower1);//modified for JSP
                           int count=0;
                 x=0;

                           while(count<l)
                   {
                          String query3="SELECT time_stamp FROM tower_data WHERE `TIME_STAMP` LIKE ? AND `PARAM_CODE` = ? AND `TOW_ID`=? GROUP BY time_stamp HAVING count( * ) >1";
                                       //Query 3 for finding time stamps with duplicate data 
                    PreparedStatement ps2=con.prepareStatement(query3); 
                    ps2.setString(2,p_code);
                     ps2.setString(1,date[x]);
                    ps2.setInt(3,tower1);
                    ResultSet result2=ps2.executeQuery();

                                       int row=0;
                                      while(result2.next())
                  {

                  t_split=result2.getString("time_stamp");

                 String[] parts= t_split.split(" "); //splitting time_stamp to extract only time without date 
                                      time2=parts[1]; //time stored in time2
                //System.out.println("\t"+time2);
                                      request.setAttribute("times", time2);//modified for JSP
                row++;

                }
               if(row==0)
                                    {
                                    //System.out.println("\t"+"no duplicate");                          
                }
                      // System.out.print("\t"+"\t");



                                  x++;
             count++;
                   }                   
        }
        con.close();   

                          }
                         catch (Exception e)
                        {
                        e.printStackTrace();

                        }
                        }

                       }

This is my Result.jsp:

这是我的Result.jsp

<%@ page import="java.net.*"%>
<%@ page import="javax.servlet.*"%>
<%@ page import="java.util.ArrayList"%>

<jsp:useBean id="user" scope="session" class="user.duplicaterecords" />
<jsp:setProperty property="*" name="user"/>
<html>

  <body>
   Dates:<BR>    

<%--<%= request.getAttribute("dates")  %><br/>--%>
<%--Email: <%= user.getMail() %><BR>--%>
<%-- Age: <%= user.getAge() %><BR> --%>   

<c:forEach items="${sessionScope.dates}" var="item">
  <c:out value="${item}"/>
</c:forEach>  

  </body>
</html>

As clear from the code

从代码中可以清楚地看出

s.setAttribute("dates", getdate);

s.setAttribute("dates", getdate);

getdatewill contain an array of string values.

getdate将包含一个字符串值数组。

Now I want to call it in my JSP like this:

现在我想在我的 JSP 中这样调用它:

<%= request.getAttribute("dates") %>

<%= request.getAttribute("dates") %>

But calling the value like is returning null. So I wanted to know how can I access getdateattribute as an array and print all the values. Help?

但是调用该值就像返回null。所以我想知道如何将getdate属性作为数组访问并打印所有值。帮助?

回答by BalusC

If it doesn't work, then it means that the sin your bean is not the same HttpServletRequestinstance as requestin your JSP. Even though the code is far from self-documenting, the letter ssuggests that it's a HttpSessioninstead of a HttpServletRequest. Fix it accordingly.

如果它不起作用,则意味着s您的 bean 中的HttpServletRequest实例与request您的 JSP 中的实例不同。尽管代码远非自我记录,但信中s暗示它是一个HttpSession而不是HttpServletRequest. 相应地修复它。



Unrelatedto the concrete problem, the approach is odd and clumsy. Not only the whileloop is odd, you're overwriting the attribute value everytime with data from each row, but also a healthy javabean intented as an entityshouldn't have any javax.servletimport lines.

具体问题无关,这种方法既奇怪又笨拙。不仅while循环很奇怪,而且每次都用来自每一行的数据覆盖属性值,而且作为实体的健康 javabean不应该有任何javax.servlet导入行。

Just add a getter to the bean

只需在 bean 中添加一个 getter

private List<Date> dates;

public List<Date> getDates() {
    if (dates == null) {
        loadDates();
    }
    return dates;
}

private void loadDates() {
    dates = new ArrayList<Date>();
    // Fill it based on data from DB.
}

and access it as follows in your page

并在您的页面中按如下方式访问它

<jsp:useBean id="bean" class="com.example.Bean" />
...
<c:forEach items="${bean.dates}" var="date">
    ${date}<br/>
</c:forEach>

That's better, but normallyyou use a HttpServletclass to create and populate the bean based on data from DB.

这更好,但通常您使用HttpServlet类根据来自 DB 的数据创建和填充 bean。



Update: as per your question update. You're mixing several concepts, the setup is heavily flawed. The CompileClassclass is a bean (albeit the classname is far from self-documenting). The duplicaterecordsclass is a servlet, not a bean (albeit the right servlet methods are not been overriden). The main()method is not invoked at all when you construct a bean using jsp:useBean. The JDBC code is mingled in a servlet class. The whileloop on ResultSetis also attempting to overwrite the request attribute on every loop. There is too much wrong that it's impossible to post a single-sentence answer to fix the concrete problem.

更新:根据您的问题更新。您混合了几个概念,设置存在严重缺陷。该CompileClass班是一个bean(尽管类名称是远自文档)。该duplicaterecords班是一个servlet,而不是(不被覆写尽管右servlet方法)的bean。main()当您使用 构造 bean 时,根本不会调用该方法jsp:useBean。JDBC 代码混合在一个 servlet 类中。该while环上ResultSet也尝试覆盖在每个循环的请求属性。错误太多,不可能只用一句话回答来解决具体问题。

I am right now also not in a mood to rewrite it all for you. So I'd suggest to put this all aside and restart based on some basic hello world examples. Here are some links to get started:

我现在也没有心情为你重写这一切。所以我建议把这一切放在一边,然后根据一些基本的 hello world 示例重新启动。以下是一些入门链接:

Afteryou have read the above pages and played around with basic examples in order to grasp the basic concepts, then rewrite the whole fluff as follows:

您阅读了上述页面并尝试了基本示例以掌握基本概念后,然后将整个绒毛重写如下:

  1. Have a Javabean class Reportwith the necessary properties which represents a single report.
  2. Have a DAO class with a list(Date start, Date end)method which uses JDBC to return a List<Report>from the DB with reports between the given dates.
  3. Have an search.jsppage with a <form action="reports" method="post">with necessary input fields.
  4. Have a reports.jsppage with a <c:forEach items="${reports}" var="report">which displays the reports.
  5. Have a Servlet which listens on /reportsand does the following in doPost()method:
    • Gather start date and end date as request parameters.
    • Get a List<Report>based on start and end dates.
    • Put it in request scope by request.setAttribute("reports", reports);
    • Forward to result JSP by request.getRequestDispatcher("reports.jsp").forward(request, response);
  1. 有一个 Javabean 类Report,它具有表示单个报告的必要属性。
  2. 有一个带有list(Date start, Date end)方法的 DAO 类,该方法使用 JDBCList<Report>从数据库返回给定日期之间的报告。
  3. search.jsp一个<form action="reports" method="post">带有必要输入字段的页面。
  4. 有一个显示报告的reports.jsp页面<c:forEach items="${reports}" var="report">
  5. 有一个 Servlet 侦听/reports并在doPost()方法中执行以下操作:
    • 收集开始日期和结束日期作为请求参数。
    • 获取List<Report>基于开始和结束日期的。
    • 把它放在请求范围内 request.setAttribute("reports", reports);
    • 转发到结果 JSP request.getRequestDispatcher("reports.jsp").forward(request, response);

回答by lukastymo

If you call setAttribute from HttpSession you add object/value to session context so you should ask session scope about your attribute not request scope

如果您从 HttpSession 调用 setAttribute 您将对象/值添加到会话上下文,因此您应该询问会话范围关于您的属性而不是请求范围

<%
List bla = (ArrayList) request.getSession().getAttribute(dates);
for( Iterator i = bla.iterator() ; iter.hasNext(); ) {
   out.println( (String) iter.next() );
}%>

in jstl:

在jstl中:

<c:forEach items="${sessionScope.dates}" var="item">
  <c:out value="${item}"/>
</c:forEach>

edited

已编辑

Now you've changed the code and dates is into request scope. Your Servlet implementation is very incorrect - has main() method?!, change it - this is the reason why you in reality don't put dates into request scope

现在您已更改代码,日期已进入请求范围。您的 Servlet 实现非常不正确 - 有 main() 方法?!,更改它 - 这就是您实际上不将日期放入请求范围的原因

<c:forEach items="${dates}" var="item">
  <c:out value="${item}"/>
</c:forEach>