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

Anu*_*rag 1 java jsp javabeans

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

这是我用于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;
     }
}
Run Code Online (Sandbox Code Playgroud)

这是我的BEAN duplicaterecords.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();

                        }
                        }

                       }
Run Code Online (Sandbox Code Playgroud)

这是我的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>
Run Code Online (Sandbox Code Playgroud)

从代码中可以清楚地看到

s.setAttribute("dates", getdate);

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

现在我想在我的JSP中调用它,如下所示:

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

但是调用值就像返回null一样.所以我想知道如何将getdate属性作为数组访问并打印所有值.救命?

Bal*_*usC 6

如果它不起作用,则意味着sbean中的HttpServletRequest实例与requestJSP中的实例不同.尽管代码远非自我记录,s但这封信表明它是一个HttpSession而不是一个HttpServletRequest.相应地修复它.


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

只需在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.
}
Run Code Online (Sandbox Code Playgroud)

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

<jsp:useBean id="bean" class="com.example.Bean" />
...
<c:forEach items="${bean.dates}" var="date">
    ${date}<br/>
</c:forEach>
Run Code Online (Sandbox Code Playgroud)

这样更好,但通常你会使用一个HttpServlet类来根据来自DB的数据创建和填充bean.


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

我现在也没心情为你重写一切.因此我建议将这一切放在一边,并根据一些基本的hello world示例重新启动.以下是一些入门链接:

您阅读了上述页面并使用基本示例进行操作以掌握基本概念之后,请按如下方式重写整个绒毛:

  1. 拥有一个Javabean类Report,其中包含表示单个报表的必要属性.
  2. 有一个DAO类,其list(Date start, Date end)方法使用JDBC List<Report>从DB 返回一个给定日期之间的报告.
  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);