更新:我已将整个代码包含在内以消除歧义。
这是我用于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 属性作为数组访问并打印所有值。帮助
答案 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示例重新启动。以下是一些入门链接:
在之后你已经阅读了上面的页面并使用基本的例子来掌握基本概念,然后重写整个绒毛如下:
ResultSet
,其中包含代表单个报告的必要属性。Report
方法创建一个DAO类,该方法使用JDBC从数据库返回list(Date start, Date end)
,并在给定日期之间生成报告。List<Report>
页面,其中search.jsp
包含必要的输入字段。<form action="reports" method="post">
页面,其中reports.jsp
显示报告。<c:forEach items="${reports}" var="report">
并在/reports
方法中执行以下操作的Servlet:
doPost()
。List<Report>
request.setAttribute("reports", reports);
答案 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>