如果属性包含值的数组,则如何在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属性作为数组并打印所有值。帮帮我?
如果从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>
如果它不工作,那么它的原因意味着您的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
循环也试图覆盖每个循环的请求属性。有太多的错误,不可能发布单句答案来解决具体问题。
我现在还没有心情重写这一切给你。所以我建议把这一切放在一边,并重新启动一些基本的问候世界的例子。这里有一些链接上手:
后您已经阅读上面的网页,并以掌握基本的基本的例子发挥各地的概念,然后重写整个绒毛如下:
- 让Javabean类
Report
具有代表单个报告的必要属性。 - 有一个DAO类和
list(Date start, Date end)
方法,该方法使用JDBC从DB返回给定日期之间报告的List<Report>
。 - 有一个
search.jsp
页面,并带有必要的输入字段<form action="reports" method="post">
。 - 有一个
reports.jsp
页面,其中显示报告的<c:forEach items="${reports}" var="report">
。 - 具有侦听
/reports
并执行以下操作中doPost()
方法一个Servlet:- 收集的开始日期和结束日期作为请求参数。
- 根据开始日期和结束日期获取
List<Report>
。 - 放入请求范围由
request.setAttribute("reports", reports);
- 正向导致JSP通过
request.getRequestDispatcher("reports.jsp").forward(request, response);
@BaluC我把's'改成了'HttpServletRequest',但仍然是同样的问题。 – Anurag 2011-03-24 20:33:28
然后,它不是*相同*请求,或者在它被设置之前被访问*。在Javabean中抓取请求也是一个很奇怪的设计。通常一个Javabean类根本不应该知道这个请求。您通常将列表准备为一个bean属性,然后调用bean方法。 – BalusC 2011-03-24 20:34:02
@BaluC递归while循环使包含getter方法变得困难。我更新了整个代码。介意看看?顺便说一句,仍然没有输出,甚至没有** null ** – Anurag 2011-03-24 22:37:18
一些重要的代码缺失和一些变量远离自我记录。你确定's'是一个'HttpServletRequest'而不是'HttpSession'吗?至于整个上下方法,我建议让自己通过[这个答案](http://*.com/questions/3177733/how-to-avoid-java-code-in-jsp-files/ 3180202#3180202)作为一个很好的起点。 – BalusC 2011-03-24 19:45:42
然后它不是相同的请求,或者它已被设置之前被访问*。 – BalusC 2011-03-24 20:00:38
@BalusC我很抱歉。 's'是一个'HttpSession'。 – Anurag 2011-03-24 20:05:05