2011-03-24 22 views
1

更新:我已經包含了整個代碼來清除模糊。如果屬性包含值的數組,則如何在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://stackoverflow.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

回答

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> 
+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

6

如果它不工作,那麼它的原因意味着您的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

相關問題