質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.01%

JSP submitの分岐 簡単なチャットアプリケーション

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,200

khr0404

score 41

前提・実現したいこと

閲覧頂きありがとうございます。

現在java研修中で、簡単なローカルホストで動くチャットアプリケーションをつくっています。

下のソースで(関係あるところだけ抜き出しています、足りない情報があれば仰ってください)実行すると投稿内容が表示されず投稿もされない状態です。

サーブレットクラスの

 if ( "設定".equals( act ) ) { 
を書かなければ実行はできるのですが、投稿ボタンと設定ボタンの区別がつかなくなってしまいます。
(同じsubmitでサーブレットで分岐を書いていないので当たり前なのですが。。。)
設定ボタンではJSPの<button type="submit" value=" 投稿 " name=act>投稿</button>
で入力した表示件数のみを変更する処理をしたいです。

javascriptは勉強を始めたばかりです

参考書などを見てもあまり例が書いていなく自分で訂正しても行き詰ってしまいました。

どうかご教授お願い致します。

JSP

<%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>
<% Date date = new Date();
            DateFormat df = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,
                    DateFormat.MEDIUM); %>
                    <%=df.format(date) %>


    <form action="/Test/Chat1" method="post">
        ID:     <input type="text" name = "Id" value = "" size=20>
        <br>
        タイトル:<input type="text" name="Title" value="" size=20>
        <br>
        本文:    <input type="text" name = "Body" value = "" size=40>
        <br>
        <br>
        <button type="submit" value=" 投稿 " name=act>投稿</button>
        <button type="button" onclick="location.replace(location.href)" value="ページを更新">ページを更新</button>
        <br>
        表示行数:<input type="number" name="num" value="5" min="1" max="100" step="1">行
        <button type="submit" value=" 設定 " name=act>設定</button>
    </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>

<br>
<hr style="border-top: 2px dotted #ff9d9d;width: 100%;">
<%}
%>
<br>
</body>
</html>

サーブレット

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 && id != "" && id != null ) {


                CDC.addContribution( new Contribution( id, title, body, datetime ) );
            }


            int number = 5;
            String num = request.getParameter( "num" );

            int aList = CDC.dataList.size();

            String act = request.getParameter( "act" );

            if ( "設定".equals( act ) ) {


                if ( num != null ) {

                    number = Integer.parseInt( num );
                }

                chatList = CDC.getContribution( number );

            }
            application.setAttribute( "chatList", chatList );//アプリケーションスコープにインスタンスを保存

            application.setAttribute( "初期値", primary );//アプリケーションスコープにインスタンスを保存


            application.setAttribute( "aList", aList );


            RequestDispatcher dispatch = request.getRequestDispatcher( "/ChatOutput.jsp" );
            dispatch.forward( request, response );


        } 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;
    }

}

DAOクラス

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() );

            System.out.println( c.getBody() );
            System.out.println();
            System.out.println( 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;

    }

}

補足情報(言語/FW/ツール等のバージョンなど)

eclipse  4.3    
JDK 1.7    
Tomcat 7    
DB = H2

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

servletのchatListは投稿が押下された場合に、newされるだけでchatListには何も保存されていません。
何も保存されていないchatListをapplication.setAttributeに上書きしているだけです。

また設定押下に関しても以下が気になります。
以下のHTMLのvalueにspaceが入っているので"設定".equals( act )が真にならないと思います。

<button type="submit" value=" 設定 " name=act>設定</button>

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/03 14:16

    omochiさん

    回答ありがとうございます。

    設定のほうではなく投稿のほうの記述をContributionに追加する記述の前に入れました。
    設定だけの分岐処理が出来なかったのが心残りなので時間があるとき勉強してみようと思います。

    ありがとうございました。

    キャンセル

0

解決できました。

設定のボタンで表示件数のみを変更する処理より
投稿ボタンを押したときのみ投稿する処理に変えました。

if ( title != "" && body != "" && title != null && body != null && id != "" && id != null ) {

                if ( act.equals( "投稿" ) ) {
                    CDC.addContribution( new Contribution( id, title, body, datetime ) );
                }
            }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる