前提・実現したいこと
簡単なチャットを作成しているのですが表示画面に表示される一件目のデータがDBから得た情報ではなく入力された情報を表示してしまい、
DBでは文字数やnullを制限しているのに最初の投稿ボタン押下後では表示されてしまい、
再び投稿ボタン押下か再読み込みをすると消えるという現象が起きています。
データを表示する時にcontributionのgetでとってきているのですがどのように訂正すればよいでしょうか?
ご教授尾お願い致します。
DBは
CREATE TABLE CHAT (
ID VARCHAR (8)NOT NULL ,
TITLE VARCHAR(20) NOT NULL,
BODY VARCHAR (100)NOT NULL,
DATE VARCHAR (20) NOT NULL,
);
で作りました。
投稿データをDBから取得するクラス
public class ChatDataDAO_CHAT implements ChatDataDAO {
ArrayList<Contribution> dataList = new ArrayList();
private final String DRIVER_NAME = "org.h2.Driver";
private final String JDBC_URL = "jdbc:h2:~/test";
private final String DB_USER = "Me";
private final String DB_PASS = "";
public ChatDataDAO_CHAT() {
Connection conn = null;
try {
//データベースへ接続
Class.forName( DRIVER_NAME );//JDBCドライバーダウンロード
conn = DriverManager.getConnection( JDBC_URL, DB_USER, DB_PASS );//データベース接続
String sql = "SELECT * FROM CHAT"; //SELECT文の準備
PreparedStatement pStmt = conn.prepareStatement( sql );//preparedstatement作成
ResultSet result = pStmt.executeQuery();
String id = "";
String title = "";
String body = "";
String datetime = "";
while ( result.next() ) {
id = result.getString( "ID" );
title = result.getString( "TITLE" );
body = result.getString( "BODY" );
datetime = result.getString( "DATE" );
dataList.add( new Contribution( id, title, body, datetime ) );
}
} catch ( SQLException e ) {
e.printStackTrace();
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
} finally {
try {
if ( conn != null ) {
conn.close(); //データベースの切断
}
} catch ( SQLException e ) {
e.printStackTrace();
}
}
}
//投稿情報をdataListメンバに追加し、DBへ保存する
@Override
public void addContribution( Contribution c ) {
dataList.add( c );
Connection conn = null;
try {
//データベースへ接続
Class.forName( DRIVER_NAME );//JDBCドライバーダウンロード
conn = DriverManager.getConnection( JDBC_URL, DB_USER, DB_PASS );//データベース接続
String sql = "INSERT INTO CHAT VALUES(? , ? , ? ,? )"; //INSERT文の準備
PreparedStatement pStmt = conn.prepareStatement( sql );//preparedstatement作成
pStmt.setString( 1, c.getId() );
pStmt.setString( 2, c.getTitle() );
pStmt.setString( 3, c.getBody() );
pStmt.setString( 4, c.getDatetime() );
int result = pStmt.executeUpdate();
} catch ( SQLException e ) {
e.printStackTrace();
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
} finally {
try {
if ( conn != null ) {
conn.close(); //データベースの切断
}
} catch ( SQLException e ) {
e.printStackTrace();
}
}
}
//dataListからcount件数文の投稿データを保持したListに返却する
@Override
public ArrayList<Contribution> getContribution( int count ) {
ArrayList<Contribution> aList = new ArrayList<Contribution>();
int DLS = dataList.size();
if ( DLS < count ) {
for ( int j = 0; j < DLS; j++ )
aList.add( dataList.get( j ) );
} else {
for ( int j = DLS - count; j < DLS; j++ ) {
aList.add( dataList.get( j ) );
}
}
return aList;
}
}
サーブレットクラス
public class Chat1 extends HttpServlet {
private static final long serialVersionUID = 1L;
public Chat1() {
super();
}
@Override
protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
this.doPost( request, response );
}
@Override
protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException {
response.setContentType( "text/html; charset=UTF-8" );//HTML出力
request.setCharacterEncoding( "UTF-8" );
try {
ServletContext application = this.getServletContext();//ServletContextインスタンスの取得
ServletConfig sconfig = getServletConfig();
String primary = sconfig.getInitParameter( "chat" );
if ( primary == null ) {
primary = (String) application.getAttribute( "初期値" );
}
ChatDataDAO_CHAT CDC = (ChatDataDAO_CHAT) Class.forName( primary ).newInstance();
ArrayList<Contribution> chatList = new ArrayList<Contribution>();//ArrayListの生成
String id = request.getParameter( "Id" );
String title = request.getParameter( "Title" );
String body = request.getParameter( "Body" );
Date date = new Date();
String datetime = dateString( date );
if ( title != "" && body != "" && title != null && body != null ) {
CDC.addContribution( new Contribution( id, title, body, datetime ) );
}
int number = 5;
String num = request.getParameter( "num" );
if ( num != null ) {
number = Integer.parseInt( num );
}
chatList = CDC.getContribution( number );
int aList = CDC.dataList.size();
application.setAttribute( "chatList", chatList );//アプリケーションスコープにインスタンスを保存
application.setAttribute( "初期値", primary );//アプリケーションスコープにインスタンスを保存
application.setAttribute( "aList", aList );
RequestDispatcher dispatch = request.getRequestDispatcher( "/ChatOutput.jsp" );
dispatch.forward( request, response );
// System.out.println( chatList.size() );
} catch ( InstantiationException e ) {
e.printStackTrace();
} catch ( IllegalAccessException e ) {
e.printStackTrace();
} catch ( ClassNotFoundException e ) {
e.printStackTrace();
} finally {
System.out.println( "finally処置" );
}
}
static public final String DATE_PATTERN = "yyyy/MM/dd HH:mm:ss";
public static String dateString( Date date ) {
String str;
if ( date == null ) {
str = null;
} else {
str = new SimpleDateFormat( DATE_PATTERN ).format( date );
}
return str;
}
}
Contributionクラス
public class Contribution {
private String id = "";
private String title = " ";
private String body = "";
private String date = "";
public Contribution( String id, String title, String body, String date ) {
this.id = id;
this.title = title;
this.body = body;
this.date = date;
}
public String getId() {
return this.id;
}
public String getTitle() {
return this.title;
}
public String getBody() {
return this.body;
}
public String getDate() {
return this.date;
}
}
JSP
```java
<%ArrayList<Contribution> chatList = (ArrayList<Contribution>) application.getAttribute( "chatList" ); %>
<% int aList =(Integer)application.getAttribute( "aList" ); %>
<% %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>チャット</title>
<h1>チャットDAO</h1>
</head>
<body>
<form action="/Test/Chat1" method="post">
ID:<input type="text" name = "Id" value = "" size=20>
タイトル<input type="text" name="Title" value="" size=20>
<br>
<input type="text" name = "Body" value = "" size=40>
<input type="submit" value=" 投稿 " name="do">
<input type="button" onclick="location.replace(location.href)" value="ページを更新">
<br>
表示行数:<input type="number" name="num" value="5" min="1" max="100" step="1">行
<input type="submit" value=" 設定 " name="setting">
</form>
<% int CLS =chatList.size();
for( int i = 0; i < chatList.size(); i++ ) {%>
<%="ID:"%><%=chatList.get(CLS-1-i).getId()%>
<%=" タイトル:"%><%=chatList.get( CLS - 1 - i ).getTitle()%>
<%=" "%><%=chatList.get( CLS-1-i ).getDatetime( ) %>
<br>
<%=chatList.get(CLS - 1 - i ).getBody()%>
<br>
<%}
%>
</body>
</html>
`
補足情報(言語/FW/ツール等のバージョンなど)
eclipse 4.3
JDK 1.7
Tomcat 7
DB = H2
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
Chat1
クラスの
Date data = new Date();
String date = request.getParameter( "" );if ( title != "" && body != "" && title != null && body != null ) {
CDC.addContribution( new Contribution( id, title, body, date ) );
}
ここで指定しているのが 下の変数の「requestのパラメータから取得したdate
」だからだと思います。
想定しているのは、上の変数 Date型のdata
ではないですか?
紛らわしい変数名をつけると、バグの元になりかねません。
分かりやすい名前をつけましょう。
また、発言した日時を登録したいのですよね?
わざわざAPサーバー上のシステム日付を渡すのではなく、DBサーバ上のCURRENT_TIMESTAMP
を指定して登録してしまえばいいのではないでしょうか?
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
・ ChatDataDAO_CHATクラスの
pStmt.setString( 4, c.getDate() );
を
pStmt.setTimestamp( 4, new Timestamp( System.currentTimeMillis() ) );
に変更したら
時間はでるようになったのですが
ID:aa aa:a null
ID:fff fff:fff 2016-05-25 10:29:38.53
ID:sss sss:sss 2016-05-25 10:28:06.262
ID:ttt ttt:ttt 2016-05-25 10:28:00.14
ID:ff ff:ff 2016-05-25 10:27:54.064
のように次の投稿をするまでnullのままになってしまいます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
お騒がせしてすみません
サーブレットクラスのif分に記述が抜けていました。
if ( title != "" && body != "" && title != null && body != null && id != "" && id != null ) {
で訂正したところ表示もされなくなりました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
KiyoshiMotoki
2016/05/25 12:21
どのようにうまくいかないのかを追記してください。なにを書けばよいか分からない場合、まずは以下を一読することをお勧めします。 https://teratail.com/help/question-tips#questionTips3-4
khr0404
2016/05/30 11:22
KiyoshiMotokiさん
これからの質問では気をつけて質問していきます。
助言ありがとうございました。