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

问题描述:

更新:我已经包含了整个代码来清除模糊。如果属性包含值的数组,则如何在JSP中导入Bean属性的值?

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

         } 
         } 

         } 

这是我结果。 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") %>

但在调用值等返回。所以我想知道如何访问getdate属性作为数组并打印所有值。帮帮我?

+0

一些重要的代码缺失和一些变量远离自我记录。你确定's'是一个'HttpServletRequest'而不是'HttpSession'吗?至于整个上下方法,我建议让自己通过[这个答案](http://*.com/questions/3177733/how-to-avoid-java-code-in-jsp-files/ 3180202#3180202)作为一个很好的起点。 – BalusC 2011-03-24 19:45:42

+0

然后它不是相同的请求,或者它已被设置之前被访问*。 – BalusC 2011-03-24 20:00:38

+0

@BalusC我很抱歉。 's'是一个'HttpSession'。 – Anurag 2011-03-24 20:05:05

如果从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> 
+0

@smas我使用了你给出的jstl标签,但现在我没有得到任何输出。甚至没有** null ** – Anurag 2011-03-24 20:39:39

+0

哦,对不起:)试试这个..应该工作(我猜在数组中你有字符串) – smas 2011-03-24 20:44:07

+0

@smas我已经更新了整个代码现在的问题。仍然没有输出,甚至没有** null ** – Anurag 2011-03-24 22:37:58

如果它不工作,那么它的原因意味着您的JSP中的s与您的JSP中的HttpServletRequest实例不一样request。即使代码远离自我记录,字母s表明它是一个HttpSession而不是一个HttpServletRequest。相应地修复它。


无关到混凝土问题,该方法是奇数且笨拙。不仅while循环很奇怪,您每次都会覆盖每行数据的属性值,而且作为实体的健康javabean不应具有任何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> 

这是更好的遵循,但通常您使用HttpServlet类来创建和填充基于来自数据库的数据的bean。


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

我现在还没有心情重写这一切给你。所以我建议把这一切放在一边,并重新启动一些基本的问候世界的例子。这里有一些链接上手:

后您已经阅读上面的网页,并以掌握基本的基本的例子发挥各地的概念,然后重写整个绒毛如下:

  1. 让Javabean类Report具有代表单个报告的必要属性。
  2. 有一个DAO类和list(Date start, Date end)方法,该方法使用JDBC从DB返回给定日期之间报告的List<Report>
  3. 有一个search.jsp页面,并带有必要的输入字段<form action="reports" method="post">
  4. 有一个reports.jsp页面,其中显示报告的<c:forEach items="${reports}" var="report">
  5. 具有侦听/reports并执行以下操作中doPost()方法一个Servlet:
    • 收集的开始日期和结束日期作为请求参数。
    • 根据开始日期和结束日期获取List<Report>
    • 放入请求范围由request.setAttribute("reports", reports);
    • 正向导致JSP通过request.getRequestDispatcher("reports.jsp").forward(request, response);
+0

@BaluC我把's'改成了'HttpServletRequest',但仍然是同样的问题。 – Anurag 2011-03-24 20:33:28

+1

然后,它不是*相同*请求,或者在它被设置之前被访问*。在Javabean中抓取请求也是一个很奇怪的设计。通常一个Javabean类根本不应该知道这个请求。您通常将列表准备为一个bean属性,然后调用bean方法。 – BalusC 2011-03-24 20:34:02

+0

@BaluC递归while循环使包含getter方法变得困难。我更新了整个代码。介意看看?顺便说一句,仍然没有输出,甚至没有** null ** – Anurag 2011-03-24 22:37:18