How to import values of a Bean attribute in JSP if the attribute contains an array of values?
UPDATED: I have included the whole code to clear the ambiguity.
This is the CompileClass that I am using for getter and setter methods:
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;
}
}
And this is my 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开发者_如何学JAVA=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();
}
}
}
This is my 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>
As clear from the code
s.setAttribute("dates", getdate);
getdate will contain an array of string values.
Now I want to call it in my JSP like this:
<%= request.getAttribute("dates") %>
But calling the value like is returning null. So I wanted to know how can I access getdate attribute as an array and print all the values. Help?
If it doesn't work, then it means that the s
in your bean is not the same HttpServletRequest
instance as request
in your JSP. Even though the code is far from self-documenting, the letter s
suggests that it's a HttpSession
instead of a HttpServletRequest
. Fix it accordingly.
Unrelated to the concrete problem, the approach is odd and clumsy. Not only the while
loop is odd, you're overwriting the attribute value everytime with data from each row, but also a healthy javabean intented as an entity shouldn't have any javax.servlet
import lines.
Just add a getter to the bean
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.
}
and access it as follows in your page
<jsp:useBean id="bean" class="com.example.Bean" />
...
<c:forEach items="${bean.dates}" var="date">
${date}<br/>
</c:forEach>
That's better, but normally you use a HttpServlet
class to create and populate the bean based on data from DB.
Update: as per your question update. You're mixing several concepts, the setup is heavily flawed. The CompileClass
class is a bean (albeit the classname is far from self-documenting). The duplicaterecords
class is a servlet, not a bean (albeit the right servlet methods are not been overriden). The main()
method is not invoked at all when you construct a bean using jsp:useBean
. The JDBC code is mingled in a servlet class. The while
loop on ResultSet
is also attempting to overwrite the request attribute on every loop. There is too much wrong that it's impossible to post a single-sentence answer to fix the concrete problem.
I am right now also not in a mood to rewrite it all for you. So I'd suggest to put this all aside and restart based on some basic hello world examples. Here are some links to get started:
- Our JSP wiki page
- Our Servlets wiki page
- Basic DAO tutorial
After you have read the above pages and played around with basic examples in order to grasp the basic concepts, then rewrite the whole fluff as follows:
- Have a Javabean class
Report
with the necessary properties which represents a single report. - Have a DAO class with a
list(Date start, Date end)
method which uses JDBC to return aList<Report>
from the DB with reports between the given dates. - Have an
search.jsp
page with a<form action="reports" method="post">
with necessary input fields. - Have a
reports.jsp
page with a<c:forEach items="${reports}" var="report">
which displays the reports. - Have a Servlet which listens on
/reports
and does the following indoPost()
method:- Gather start date and end date as request parameters.
- Get a
List<Report>
based on start and end dates. - Put it in request scope by
request.setAttribute("reports", reports);
- Forward to result JSP by
request.getRequestDispatcher("reports.jsp").forward(request, response);
If you call setAttribute from HttpSession you add object/value to session context so you should ask session scope about your attribute not request scope
<%
List bla = (ArrayList) request.getSession().getAttribute(dates);
for( Iterator i = bla.iterator() ; iter.hasNext(); ) {
out.println( (String) iter.next() );
}%>
in jstl:
<c:forEach items="${sessionScope.dates}" var="item">
<c:out value="${item}"/>
</c:forEach>
edited
Now you've changed the code and dates is into request scope. Your Servlet implementation is very incorrect - has main() method?!, change it - this is the reason why you in reality don't put dates into request scope
<c:forEach items="${dates}" var="item">
<c:out value="${item}"/>
</c:forEach>
精彩评论