Discussion:
[JSP ] 請問如何將搜尋與javaBean共同使用??
(时间太久无法回复)
longlyheart
2007-04-02 10:56:48 UTC
Permalink
小弟我寫了一個搜尋網頁,想要請問:
如何將寫在網頁裡面的資料庫移出來變成一個Bean??

以下是我的程式碼:
<%@ page contentType = "text/html; charset=utf-8" %>
<%@ page language = "java" %>
<%@ page import = "java.sql.*" %>

<html>
<head>
<title>show</title>
</head>

<body>
<%
//宣告變數
int count = 0;
String error = null;

//設定資料庫參數
String driver="com.mysql.jdbc.Driver";
String userName="帳號";
String password="密碼";
String url="jdbc:mysql://localhost:3306/資料庫名稱";

//接收資料
String dbname = request.getParameter("dbname");

//SQL指令
String comSQL = "SELECT * FROM articledb WHERE articlename like'%"+dbname+"%';";

try{
Class.forName(driver);
Connection conn = DriverManager.getConnection(url,userName,password);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(comSQL);

while(rs.next()){
int sn = rs.getInt("articlesn");
String pi = rs.getString("picture");
String na = rs.getString("articlename");
String slink = "buytwo.jsp?iid="+sn;

count++;

out.println("<a href = " + slink + "><img src = " + pi + "></a><br>");
out.println("<a href = " + slink + ">" + na + "</a><br>");
}

rs.close();
stmt.close();
conn.close();
}
catch(SQLException se){
error = se.toString();
}
catch(Exception e){
error = e.toString();
}

if(count==0){
out.println("非常抱歉,我們沒有您所需要的商品。");
}
%>
</body>

大約就是以上try裡面的東西,希望可以改成由Bean匯入
但是Bean不支援System.out.println這種東西....
所以寫了幾個Bean都沒辦法達到同樣的效果,請各位大大指導>"<

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.96.194
骨頭
2007-04-02 11:28:20 UTC
Permalink
※ 引述《longlyheart (longlyheart)》之銘言:
: 小弟我寫了一個搜尋網頁,想要請問:
: 如何將寫在網頁裡面的資料庫移出來變成一個Bean??
: 以下是我的程式碼:
: </body>
: 大約就是以上try裡面的東西,希望可以改成由Bean匯入
: 但是Bean不支援System.out.println這種東西....
: 所以寫了幾個Bean都沒辦法達到同樣的效果,請各位大大指導>"<

你弄錯了,System.out.println是consolo,
你看到的out 是屬於 JspWriter 類別。

你所需要的是在 JavaBean裡面把你要print的字串接起來,
在JSP裡調用JavaBean時透過 <%= %> 或 out.println()

去接你的JavaBean回傳的字串,而不是直接在JavaBean裡面print字串。

--
 String temp="relax"; | Life just like programing
 while(buringlife) String.forgot(temp); | to be right or wrong
 while(sleeping) brain.setMemoryOut(); | need not to say
 stack.push(life.running); | the compiler will
 stack.push(scouting.buck()); | answer your life
 stack.push(bowling.practice()); | Bone everything

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68
longlyheart
2007-04-02 11:46:53 UTC
Permalink
: 你弄錯了,System.out.println是consolo,
: 你看到的out 是屬於 JspWriter 類別。
: 你所需要的是在 JavaBean裡面把你要print的字串接起來,
: 在JSP裡調用JavaBean時透過 <%= %> 或 out.println()
: 去接你的JavaBean回傳的字串,而不是直接在JavaBean裡面print字串。

抱歉我說不清楚,我最主要的問題是在那個while迴圈
因為搜尋出來的東西會有很多個,如果我用Bean的話會只接收到最後一個
所以只好寫在網頁裡,請問要怎麼寫才能接收到"全部"的資料??

不過還是謝謝大大,我又多懂了一些~^^~

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.96.194
骨頭
2007-04-02 12:03:37 UTC
Permalink
※ 引述《longlyheart (longlyheart)》之銘言:
: 抱歉我說不清楚,我最主要的問題是在那個while迴圈
: 因為搜尋出來的東西會有很多個,如果我用Bean的話會只接收到最後一個
: 所以只好寫在網頁裡,請問要怎麼寫才能接收到"全部"的資料??
: 不過還是謝謝大大,我又多懂了一些~^^~

我是瞎猜的,不過我想唯一的可能性應該也只有這個。


你的SQL中有一個叫 dbname的 parameter,
你的JavaBean應該寫成一個method去接收它。

比方說

public String doSearch(String dbName){
StringBuffer output=new StringBuffer();

/* do connection */

String comSQL = "SELECT * FROM articledb WHERE articlename
like'%"+dbname+"

while( /* expression */ ){
/* do something */
output.append( /* HTML tag with data */);
}
..............

return output.toString();
}


如果說只會接收到最後一個,這句話帶來的訊息是資料庫的查詢有正確運作,
你的除錯方向就可以朝資料來源和SQL敘述去下手。


--
btw 別讓人回答A 後才跟別人說你的問題是B,會讓人覺得像在整人。
--
 String temp="relax"; | Life just like programing
 while(buringlife) String.forgot(temp); | to be right or wrong
 while(sleeping) brain.setMemoryOut(); | need not to say
 stack.push(life.running); | the compiler will
 stack.push(scouting.buck()); | answer your life
 stack.push(bowling.practice()); | Bone everything

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68
※ 編輯: TonyQ 來自: 220.134.27.68 (04/02 20:03)
longlyheart
2007-04-02 12:25:53 UTC
Permalink
: 我是瞎猜的,不過我想唯一的可能性應該也只有這個。
: 你的SQL中有一個叫 dbname的 parameter,
: 你的JavaBean應該寫成一個method去接收它。
: 比方說
: public String doSearch(String dbName){
: StringBuffer output=new StringBuffer();
: /* do connection */
: String comSQL = "SELECT * FROM articledb WHERE articlename
: like'%"+dbname+"
: while( /* expression */ ){
: /* do something */
: output.append( /* HTML tag with data */);
: }
: ..............
: return output.toString();
: }
: 如果說只會接收到最後一個,這句話帶來的訊息是資料庫的查詢有正確運作,
: 你的除錯方向就可以朝資料來源和SQL敘述去下手。

以下是小弟的Bean檔案,因為之前不能用的被我丟掉了(爆炸)
所以花了一些時間把他從我的腦袋裡挖出來(拖走)

package com.BuyPlus.Production;

import java.sql.*;

public class connectBean{

//設定資料庫參數
private String driver="com.mysql.jdbc.Driver";
private String userName="帳號";
private String password="密碼";
private String url="jdbc:mysql://localhost:3306/資料庫名稱";

//宣告資料庫物件
private Connection conn = null;
private Statement stmt = null;
private ResultSet rs = null;

//宣告SQL字串
private String comSQL = null;

//宣告暫存變數
private String error = null;
private int atSn;
private String atName = null;
private String atSize = null;
private int atPrice;
private String atPicture = null;
private String atNotice = null;
private String atClass = null;
private String SQLString = null;

//建立連線
public connectBean(){
try{
//載入JDBC驅動程式
Class.forName(driver);

//取得與資料庫的連線
conn = DriverManager.getConnection(url,userName,password);
}
catch(SQLException se){
error = se.toString();
}
catch(Exception e){
error = e.toString();
}
}

//資料庫控制
public void setdbControl(String dbname){
try{
//建立Statement物件
stmt = conn.createStatement();

//執行查詢
comSQL = "SELECT * FROM articledb WHERE articlesn like'%"+dbname+"%';";
rs = stmt.executeQuery(comSQL);

//讀取資料
while(rs.next()){
atSn = rs.getInt("articlesn");
atName = rs.getString("articlename");
atSize = rs.getString("size");
atPrice = rs.getInt("price");
atPicture = rs.getString("picture");
atNotice = rs.getString("notice");
atClass = rs.getString("class");
}

//關閉ResultSet物件
rs.close();

//關閉Statement物件
stmt.close();
}
catch(SQLException se){
error = se.toString();
}
catch(Exception e){
error = e.toString();
}
}

//中斷Connection方法
public void getconnOff(){
try{
//關閉Connection物件
conn.close();
}
catch(SQLException se){
error = se.toString();
}
}

//回傳參數
public int getatSn(){
return atSn;
}
public String getatName(){
return atName;
}
public String getatSize(){
return atSize;
}
public int getatPrice(){
return atPrice;
}
public String getatPicture(){
return atPicture;
}
public String getatNotice(){
return atNotice;
}
public String getatClass(){
return atClass;
}
}

之前的PO文如果引起大大們的不悅,在此致上十二萬分的歉意,請原諒..(磕頭)

這隻Bean我不知道要怎麼改才能讓使用的網頁收到全部的查詢結果,請大大指教

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.120.96.194
痞子軍團團長
2007-04-02 12:35:20 UTC
Permalink
※ 引述《longlyheart (longlyheart)》之銘言:
: : public String doSearch(String dbName){
: : StringBuffer output=new StringBuffer();
: : /* do connection */
: : String comSQL = "SELECT * FROM articledb WHERE articlename
: : like'%"+dbname+"
: : while( /* expression */ ){
: : /* do something */
: : output.append( /* HTML tag with data */);
: : }
: : ..............
: : return output.toString();
: : }

上面已經給你一種方向了,你引了他的言
至少也給人家一點回音,說說你對他這個解法的看法

真的是... 感覺就是把別人的好心回答直接無視...
至少人家的解法是可解的(漂亮與否就是另話)

: public class connectBean{
: private int atSn;
: private String atName = null;
: private String atSize = null;
: private int atPrice;
: private String atPicture = null;
: private String atNotice = null;
: private String atClass = null;

預設都是 null,以後可以不用打後半段了。

: //資料庫控制
: public void setdbControl(String dbname){
: try{
: //建立Statement物件
: stmt = conn.createStatement();
: //執行查詢
: comSQL = "SELECT * FROM articledb WHERE articlesn like'%"+dbname+"%';";
: rs = stmt.executeQuery(comSQL);
: //讀取資料
: while(rs.next()){
^^^^^^^^^^^^^^^^^ [嘆氣] 果然不出所料... [炸]

這跟 JavaBean 一點關係也沒有
麻煩請先搞清楚上面這段程式碼再幹麼
([小聲] tONYq,你也別一直當好人阿... 怎麼都不對我當好人...)

: atSn = rs.getInt("articlesn");
: atName = rs.getString("articlename");
: atSize = rs.getString("size");
: atPrice = rs.getInt("price");
: atPicture = rs.getString("picture");
: atNotice = rs.getString("notice");
: atClass = rs.getString("class");
: }

: 之前的PO文如果引起大大們的不悅,在此致上十二萬分的歉意,請原諒..(磕頭)
: 這隻Bean我不知道要怎麼改才能讓使用的網頁收到全部的查詢結果,請大大指教


這年頭適度引言快要變成一種美德了...

--
 侃侃長論鮮窒礙  首頁:http://www.psmonkey.idv.tw
 眾目睽睽無心顫  Blog:http://ps-think.blogspot.com
 煢居少聊常人事 
 殺頭容易告白難  歡迎參觀 Java 版(@ptt.cc)精華區 \囧/

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.228.193.189
骨頭
2007-04-03 01:57:17 UTC
Permalink
※ 引述《longlyheart (longlyheart)》之銘言:
: 感謝兩位大大的詳細解答,小弟我感激不盡..
: 話說..編輯文章要按哪一個鍵阿= =??
: 送出去發現自己文章有問題卻不會改..囧(今天第一次上BBS)

大寫字母 E 看板列表時按H可看操作說明

: 很漂亮..真的很漂亮..
: 看了之後才發現上課教的有跟沒有一樣ˊˋ..

orzorz 你要我說良心話,
我絕對不相信上課不會教你rs.next()是幹麻的啊(爆)

: : 預設都是 null,以後可以不用打後半段了。
: : ([小聲] tONYq,你也別一直當好人阿... 怎麼都不對我當好人...)
哦 因為你會跟我收咖啡的錢啊 XD

: 這個證明兩位關係很好~所以可以當壞人XD
: 請問小弟的引言過長了嗎@@?大概多長算是適當??
: 沒有別的意思,真的是想知道(虛心求教中)

引言就是引到自己需要用的話就好,
如果話都不需要,就只留最上面 "引述XXX的銘言",
讓人知道你在回誰的文章就好。



簡單來說,你在 setdbControl(String dbName) ,

跑了一個while迴圈,但是你每跑一次迴圈,
就把你所謂的"暫存變數"換成新一個資料,所以只有最後一次資料被保留。


你如果想取得資料,就得把你所有處理過的暫存變數都存起來,
至於想怎麼做, it's up to you!


這篇文章跟上篇文章已經提示得夠明顯了,
只差沒把code完整寫出來而已,請再多想想。:)

--
I am a person, and I am always thinking .
Thinking in love , Thinking in life ,
Thinking in why , Thinking in worth.
I can't believe any of what ,
I am just thinking then thinking ,
but worst of all , most of mine is thinking not actioning...

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.134.27.68

Loading...