- PR -

jspで2回検索を行うと1回目の表示に追加され表示される

1
投稿者投稿内容
未記入
会議室デビュー日: 2004/04/09
投稿数: 3
投稿日時: 2004-04-09 11:42
はじめまして。
Javaの初心者ですが、教えて下さい。
JSPにて検索結果を表示され、その結果からクリックして詳細を表示するプログラム
を作成したのですが、ブラウザの戻るボタンにて再度、検索を行うと最初の検索結果
の下に追加される様に表示されてしまいます。scope="session"が悪いと思うのですが
sessionにしないと詳細の処理がうまくいきません。
どなたか、方法を教えて下さい。宜しくお願いします。


<%@ page contentType="text/html; charset=Shift_JIS" pageEncoding="Shift_JIS" %>
<%@ page import="java.util.Vector, java.util.HashMap" %>
<% request.setCharacterEncoding("Shift_JIS"); %>
<jsp:useBean id="searchBean" scope="session" class="schoolBeans.SchoolIchiran">
<jsp:setProperty name="searchBean" property="searchSchool_id" param="school_id" />
<jsp:setProperty name="searchBean" property="searchRyakusho" param="ryakusho" />
<jsp:setProperty name="searchBean" property="searchSchool_type" param="school_type" />
<jsp:setProperty name="searchBean" property="searchSchool_mei" param="school_mei" />

</jsp:useBean>
<% searchBean.logic(); %>

<html>
<head><title>学校一覧表</title></head>

<% if(searchBean.size() == 0){ %>
<frameset cols="100%">
      <frame src="SchoolIchiranErr.jsp" name="frame1">
</frameset>
<% } %>
<body bgcolor="ffffdd">
<h1>学校を検索しました!</h1>
<table border="5" cellpadding="4" bordercolor="77ddff" >
<tr bgcolor="ddffdd">
<td height="30" width="45" align="center">修正</td>
<td height="30" width="30" align="center">NO.</td>
<td height="30" width="200" align="center">略称</td>
<td height="30" width="40" align="center">種別</td>
<td height="30" width="200" align="center">TEL</td>
</tr>
</table>
<table border="5" cellpadding="4" bordercolor="77ddff" >
<% for(int i = 0; i < searchBean.size(); i++){ %>
<jsp:setProperty name="searchBean" property="currentSchool" value="<%= i %>"/>

<tr bgcolor="ddffdd">
<td height="30" width="45" align="center">

<a href="SchoolIndex.jsp?action=view&id=<jsp:getProperty name="searchBean" property="currentSchoolId"/>" >
<img src="../html/images/bottan_shuusei.jpg" >
</a>
</td >
<td height="30" width="30" align="right"><jsp:getProperty name="searchBean" property="currentSchoolId" /></td>

<td height="30" width="200" align="left"><jsp:getProperty name="searchBean" property="currentRyakusho" /></td>

<td height="30" width="40" align="center"><jsp:getProperty name="searchBean" property="currentSchoolType" /></td>

<td height="30" width="200"align="left"><jsp:getProperty name="searchBean" property="currentTel" />

</td>
</tr>
<% } %>
</table>
</body>
</html>
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-04-09 12:09
こんにちは。

jspがあっているかどうも重要ですが、
Beanのロジックは絶対問題ないって自信があるんですか?


_________________
世界平和を願う!
http://park8.wakwak.com/~chin/

[ メッセージ編集済み 編集者: CHN 編集日時 2004-04-09 12:12 ]
latte
常連さん
会議室デビュー日: 2002/11/07
投稿数: 38
投稿日時: 2004-04-09 12:13
初めの結果がセッションかどこかに残っているだけだったりしません?
SJ0392
ベテラン
会議室デビュー日: 2004/02/05
投稿数: 62
お住まい・勤務地: 神奈川・横浜
投稿日時: 2004-04-09 12:51
> <% for(int i = 0; i < searchBean.size(); i++){ %>
たぶん、この部分の size() の戻り値が増加してるんですよね?
searchBeanの初期化が、どのようにされているのか調べてみましたか?

あとJSPだとServlet形式(?)に変換されたプログラムがあるはずですが、
そちらも確認した方が良いかもしれません。
何せ自動変換されてものですから予期しない動作が発生しても不思議ではありません。
未記入
会議室デビュー日: 2004/04/09
投稿数: 3
投稿日時: 2004-04-10 15:19
ご回答ありがとうございました。
参考にさせて頂きましたが、頭の中が混乱して分からなくなって
きました。どうもすいません。
使用していますクラス下記3クラスにて初期化がうまくいって
いないのでしょうか。

////////////////////////////////////////////////////////
package schoolBeans;

import java.io.*;
import java.sql.*;
import java.util.Vector;
import java.util.HashMap;


public class SchoolIchiran extends SchoolModel{
private String query;
private String searchSchool_id;
private String searchRyakusho;
private String searchSchool_type;
private String searchSchool_mei;

public SchoolIchiran(){
query = "";
searchRyakusho = "";
searchSchool_mei = "";
searchSchool_id = "";

}

public void logic(){

query = "";

SchoolIchiranData db = new SchoolIchiranData();

//検索判断
if(0 == searchSchool_id.length()){
this.searchSchool_id = "1";
}

//検索条件作成
//none-null
if(searchRyakusho != null && searchSchool_type != null){
query = "select school_id,ryakusho,school_type,tel" +
" from school" +
" where school_type = '"+searchSchool_type+"'" +
" and ryakusho like '%"+searchRyakusho+"%'" +
" and school_id >= " +searchSchool_id;
//type-null
}else if(searchRyakusho != null && searchSchool_type == null){
query = "select school_id,ryakusho,school_type,tel" +
" from school" +
" where ryakusho like '%"+searchRyakusho+"%'" +
" and school_id >= " +searchSchool_id;
//ryaku-null
}else if(searchRyakusho == null && searchSchool_type != null){
query = "select school_id,ryakusho,school_type,tel" +
" from school " +
" where school_type = '"+searchSchool_type+"'" +
" and school_id >= " +searchSchool_id;
//type-null ryaku-null
}else{
query = "select school_id,ryakusho,school_type,tel" +
" from school" +
" where school_id >= " +searchSchool_id;
}

//DB接続
db.connect("org.gjt.mm.mysql.Driver",
"jdbc:mysql://localhost/alpha?useUnicode=true&characterEncoding=SJIS",
"alpha",
"tech"
);
//検索開始

Vector schools = new Vector();
schools.clear();
schools = db.doSelect(query);

//DB接続クローズ
db.close();

for(int i=0; i < schools.size(); i++){
mSchools.add(new School((HashMap)schools.get(i)));
}
}



//アクセスメソッド関連
//School_id
public String getSearchSchool_id(){
return searchSchool_id;
}
public void setSearchSchool_id(String searchSchool_id){
this.searchSchool_id = searchSchool_id;
}
//Ryakusho
public String getSearchRyakusho(){
return searchRyakusho;
}
public void setSearchRyakusho(String searchRyakusho){
this.searchRyakusho = searchRyakusho;
}
//School_type
public String getSearchSchool_type(){
return searchSchool_type;
}
public void setSearchSchool_type(String searchSchool_type){
this.searchSchool_type = searchSchool_type;
}
//School_mei
public String getSearchSchool_mei(){
return searchSchool_mei;
}
public void setSearchSchool_mei(String searchSchool_mei){
this.searchSchool_mei = searchSchool_mei;
}
}

//////////////////////////////////////////////////////////////
package schoolBeans;

import java.util.Vector;
import java.util.HashMap;

import java.sql.*;

public class SchoolIchiranData{

public Vector schools = null;
public Vector v = null;
public HashMap m = null;


// 接続保持
private Connection mConnection = null;

// コンストラクタ
public SchoolIchiranData(){;
}

// 接続メソッド
public void connect(String driver,String url,String user,String password){
try{
Class.forName(driver);
mConnection = DriverManager.getConnection(url,user,password);
}catch(ClassNotFoundException e){
System.err.println("Can't Find JDBC Driver.\n");

}catch(SQLException e){
System.err.println("Connect Error.\n");
}
}
public void close(){
try{
mConnection.close();
}catch(SQLException e){
System.err.println("Close Error.\n");
}
}

// SELECT 発行メソッド
public Vector doSelect(String query){
if(mConnection == null) return null;

try{
Statement statement = mConnection.createStatement();
ResultSet rs = statement.executeQuery(query);
return resultSetToVector(rs);
}catch(SQLException e){
System.err.println("SQL Execution Error.\n" + query);
}
return null;
}

private Vector resultSetToVector(ResultSet rs){
if(mConnection == null) return null;

//SELECTの結果をVectorに格納するためのメソッド
Vector v = new Vector();

try{
ResultSetMetaData meta = rs.getMetaData();
int cols = meta.getColumnCount();
while(rs.next()){
HashMap m = new HashMap();
for(int i = 1; i <= cols; i++){
m.put(meta.getColumnName(i),rs.getObject(i));
}

//Vectorの要素として HashMap オブジェクトが格納される。
v.add(m);
}
}catch(Exception e){;}

return v;

}

///////////////////////////////////////////////////////////////
package schoolBeans;

import java.util.Vector;
import java.util.HashMap;
import schoolBeans.SchoolIchiranData;

public class SchoolModel{
public Vector mSchools;
public School mCurrentSchool;
public SchoolIchiranData mDB;

public SchoolModel(){
mSchools = new Vector();
mCurrentSchool = null;
mDB = new SchoolIchiranData();
}

public SchoolModel(Vector searchBean){
mCurrentSchool = null;
}

public void setCurrentSchool(int index){
try{
mCurrentSchool = (School)mSchools.get(index);
}catch(Exception ex){
mCurrentSchool = null;
}
}

public School getById(int id){
for(int i = 0; i < mSchools.size(); i++){
School school = (School)mSchools.get(i);
if(school.getSchool_id() == id) return school;
}
return null;
}

public School get(int index){
try{
return (School)mSchools.get(index);
}catch(Exception ex){
return null;
}
}
public int size(){
return mSchools.size();
}

public int getCurrentSchoolId(){
return mCurrentSchool.getSchool_id();
}
public String getCurrentRyakusho(){
return mCurrentSchool.getRyakusho();
}
public String getCurrentSchoolType(){
return mCurrentSchool.getSchool_type();
}
public String getCurrentSchoolMei(){
return mCurrentSchool.getSchool_mei();
}
public String getCurrentYubinNo(){
return mCurrentSchool.getYubin_no();
}
public String getCurrentTodofuken(){
return mCurrentSchool.getTodofuken();
}
public String getCurrentAdd1(){
return mCurrentSchool.getAdd1();
}
public String getCurrentAdd2(){
return mCurrentSchool.getAdd2();
}
public String getCurrentAdd3(){
return mCurrentSchool.getAdd3();
}
public String getCurrentTel(){
return mCurrentSchool.getTel();
}
public String getCurrentFax(){
return mCurrentSchool.getFax();
}
public String getCurrentKyotoTan(){
return mCurrentSchool.getKyoto_tan();
}
public String getCurrentJohosenmonTan(){
return mCurrentSchool.getJohosenmon_tan();
}
public String getCurrentPcTan(){
return mCurrentSchool.getPc_tan();
}
public String getCurrentJimushitsuTan(){
return mCurrentSchool.getJimushitsu_tan();
}

}

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-04-10 17:19
混乱しているのなら自分で一度整理してみましょうよ。
インデントすらないこんなに長いコードをボランティアで見てもらおうというのがちょっと間違っていないですか?

コードを提示するのが悪いとは思いません。しかし現象を説明するのに必要十分な、シンプルで再現性のあるコードをまず作ってみるのが良いと思います。

また、話はそれますが "schoolBeans" というパッケージから JavaBeans として実装しているようですので java.io.Serializable を実装するべきではないでしょうか。意味がわからなければ調べてみてください。
せん
ぬし
会議室デビュー日: 2002/03/04
投稿数: 397
投稿日時: 2004-04-10 22:02
mSchools.add(new School((HashMap)schools.get(i)));

mSchools の初期化を何処でしてるかを確認するのが解決のポイント。



以下、関係ないけど。


引用:

混乱しているのなら自分で一度整理してみましょうよ。
インデントすらないこんなに長いコードをボランティアで見てもらおうというのがちょっと間違っていないですか?
コードを提示するのが悪いとは思いません。しかし現象を説明するのに必要十分な、シンプルで再現性のあるコードをまず作ってみるのが良いと思います。



それが出来ちゃう人は、こんな質問しませんよ^^;
その切り分けをしてほしいのでしょう。このような質問を投げる方々は。

なのでできれば、この場合はどこに注目すべきかを、スレッド主に教えて
あげてはいかがでしょうか?
未記入
会議室デビュー日: 2004/04/09
投稿数: 3
投稿日時: 2004-04-12 08:50
ありがとうございました。
ポイントにある「mSchools」の初期化が問題でした。
初心者の質問に答えてくれまして、助かりました。
1

スキルアップ/キャリアアップ(JOB@IT)