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

时间:2011-03-24 19:26:21

标签: 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;
     }
}

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

                        }
                        }

                       }

这是我的 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>

从代码中清楚

  

s.setAttribute("dates", getdate);

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

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

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

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

2 个答案:

答案 0 :(得分:6)

如果它不起作用,则表示bean中的s与JSP中的HttpServletRequest实例不同request实例。即使代码远非自我记录,但字母s表明它是HttpSession而不是HttpServletRequest。相应地修复它。


对于具体问题,

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

只需在bean中添加一个getter

javax.servlet

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

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.
}

那更好,但通常你使用<jsp:useBean id="bean" class="com.example.Bean" /> ... <c:forEach items="${bean.dates}" var="date"> ${date}<br/> </c:forEach> 类根据来自数据库的数据创建和填充bean。


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

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

之后你已经阅读了上面的页面并使用基本的例子来掌握基本概念,然后重写整个绒毛如下:

  1. 拥有一个Javabean类ResultSet,其中包含代表单个报告的必要属性。
  2. 使用Report方法创建一个DAO类,该方法使用JDBC从数据库返回list(Date start, Date end),并在给定日期之间生成报告。
  3. 拥有List<Report>页面,其中search.jsp包含必要的输入字段。
  4. <form action="reports" method="post">页面,其中reports.jsp显示报告。
  5. 拥有一个监听<c:forEach items="${reports}" var="report">并在/reports方法中执行以下操作的Servlet:
    • 将开始日期和结束日期作为请求参数进行收集。
    • 根据开始和结束日期获取doPost()
    • 通过List<Report>
    • 将其置于请求范围内
    • request.setAttribute("reports", reports);
    • 转发结果JSP

答案 1 :(得分:1)

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

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

在jstl:

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

<强>编辑

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

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