Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

 登録項目の件数を検索する(struts)

はじめまして。最近strutsの勉強を始めまして、以下のようなWEBアプリを作っているんですが、うまくいきません。教えてください。

登録画面で性別(男・女)、血液型(A・B・O・AB)の2つの項目からそれぞれ一つずつ選び、登録する→検索画面で性別(男・女)を選び、検索→検索結果画面で性別ごとの血液型を表示させるのではなく、血液型それぞれの件数を表示させる(ex.男、A型で登録すると、検索結果はA型が1、B型が0、O型が0、AB型が0となる→今度は、男、B型で登録すると、検索結果はA型が1、B型が1、O型が0、AB型が0となる)

環境は、EclipceとMySQLです。よろしくお願いします。

ソース
登録画面(JSP)

<%@ page contentType="text/html;charset=Shift-JIS" %>
<%@ taglib uri="WEB-INF/struts-html.tld "prefix="html" %>
<%@ taglib uri="WEB-INF/struts-bean.tld "prefix="bean" %>
<%@ taglib uri="WEB-INF/struts-logic.tld" prefix="logic" %>


<html:html>
<body>
******    一部省略    ************
<table border="2" width=100%>
<tr>
<td>性別</td>
<td><html:select property="seibetsu">
    <html:option value="男">男</html:option>
    <html:option value="女">女</html:option>
  </html:select>
</td>    
</td>            
</tr>
<tr>
<td>血液型</td>
<td><html:select property="ketueki">
    <html:option value="A">A</html:option>
    <html:option value="B">B</html:option>
    <html:option value="O">O</html:option>
    <html:option value="AB">AB</html:option>
  </html:select>
</td>            
</tr>
</table>
<html:submit property="submit" value="送信"/>
</body>
</html:html>

検索画面(JSP)

<%@ page contentType="text/html;charset=Shift-JIS" %>
<%@ taglib uri="WEB-INF/struts-html.tld "prefix="html" %>
<%@ taglib uri="WEB-INF/struts-bean.tld "prefix="bean" %>
<%@ taglib uri="WEB-INF/struts-logic.tld" prefix="logic" %>


<html:html>
<body>
******    一部省略    ************
<table border="2" width=100%>
<tr>
<td>性別</td>
<td><html:select property="seibetsu">
    <html:option value="男">男</html:option>
    <html:option value="女">女</html:option>
  </html:select>
</td>    
</td>            
</tr>
</table>
<html:submit property="submit" value="検索信"/>
</body>
</html:html>

****    Form(登録用)    ****

import org.apache.struts.action.*;


public class DataForm extends ActionForm {

  
  private String seibetsu;
  private String ketueki;


 
  public void setSeibetsu(String seibetsu) {this.seibetsu = seibetsu;}
  public String getSeibetsu() {return seibetsu;}
  public void setKetsueki(String ketsueki) {this.ketsueki = ketsueki;}
  public String getKetsueki() {return ketsueki;}

}

****    Form(検索用)    ****

import org.apache.struts.action.*;


public class SearchForm extends ActionForm {

  
  private String seibetsu;
  private String ketueki;


 
  public void setSeibetsu(String seibetsu) {this.seibetsu = seibetsu;}
  public String getSeibetsu() {return seibetsu;}
  public void setKetsueki(String ketsueki) {this.ketsueki = ketsueki;}
  public String getKetsueki() {return ketsueki;}

}

****    Action(検索用)    ****

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.ServletContext;
import org.apache.struts.action.*;
import java.io.IOEXception;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.Connection;
import java.util.ArrayList;

public class SearchAction extends Action{

    public ArrayList getSearch(String seibetsu) throws Exception{
    
        DataForm dataForm = null;
        ArrayList searchList = new ArrayList();
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        ServletContext context = servlet.getServletContext();
        DataSource dataSource = (DataSource)context.getAttribute(org.apache.struts.Globals.DATA_SOURCE_KEY);
        
        try{
            
        conn = dataSource.getConnection();
        stmt = conn.createStatement();
        
        rs = stmt.executeQuery("select * from human where " + "SEIBETSU = '" + seibetsu + "';");
        
        while(rs.next()){
        
            dataForm = new DataForm();
            
            dataForm.setSeibetsu(rs.getString("seibetsu"));
            dataForm.setKetsueki(rs.getString("ketsueki"));
            searchList.add(dataForm):
        }

        }

        catch(SQLException e){

            sqle.printStackTrace();

        }

        finally{
            
            if(rs != null){
                rs.close();
            }

            if(stmt != null){
                stmt.close();
            }

            if(conn != null){
                conn.close();
            }
        }
        return dataForm;
    
    }

    public ActionForward execute(
            ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response)
            throws IOException, ServletException{

        request.setCharacterEncoding("windows-31J");

        String target = "success";

        String seibetsu = ((SearchForm)form).getSeibetsu();

        ArrayList dataForm = null;
        dataForm = getSearch(seibetsu);

        if(dataForm == null){
            target = "error";
            return(mapping.findForward(target));
        }

        else{
            request.setAttribute("dataForm", dataForm);
        }
        return(mapping.findForward(target));

    }

        
}

5

回答

80855

閲覧

5件の回答

評価

0

>うまくいきません。教えてください。

まず、"どのようにうまく行かないのか"がないですね。
どの部分がどうなる筈と思っているのか、それがどのようになってしまってうまく行かないと思っているのか、が見えないです。
またそれは、"うまくいきません。"とは言っていますが、「コードが書けた。動く筈なのでテストしてくれ」と言っているのと変わらないですね。
それが登録処理から検索処理まで全ての範囲のソースコードを挙げることにもなっているのではないかと推測されます。

1.登録処理が行われることを確認することでJSP/strutsがうまく行っていることが判断できる。
2.DBに期待通りに格納されていることを確認することでDB更新がうまく行っていることが判断できる。
3.(ついでに)検索してみてSQL文が適切であることを確認しておく。→検索処理のコードに活用するとか
4.検索処理が行われることを確認する。

と順序立てて考えていった上で、うまく行かないとなった時点が判ってくると思いますが、何処でうまく行かないのかが説明されていません。

パッとソースコードを眺めると、直ぐにexecuteQueryメソッドのSQL文で"*"が目に止まります。
ふと、まずSQL文というものを少し勉強してみる必要があるのか?と思えてみたりもしますが、続くwhileループでテーブルから読み出した結果をどういう形で扱いたいのかがコードに見えません。
つまり、SQL文でどのように取り出したいと考えているのかが読み取れないです。
従って、SQL文から勉強する必要があるのか、whileループ内でどのように処理すればいいのか(単に"どのようにコードを書けばいいのか"・・という風にも見えてしまいますが)判らないのか、どの程度の理解をしているのか判断できないですね。

テーブルからの結果の取り方が解っていないという風にも思われますが、もっと以前、登録処理から問題があるのか、前述の通り、きちんと示されていないので、どううまく行かないのか回答者側で調べろと言われているようなものでもあるように思われるし、何を聞きたいのかも解らないです。

評価

0

>>まあさん

ご回答ありがとうございます。
質問の仕方が悪かったです。すみません。もう少しくわしく書きます。

うまくいかないのは、血液型それぞれの件数を数字で表示させる検索用Actionのコードが書けないことです。つまり、whileループでテーブルから読み出した結果をただ表示させるのではなく、登録した件数分を数字で表示させるコードの書き方がわかりません。(whileループでテーブルから読み出した結果を単に表示させる処理まではできました。)

言葉足らずで、内容が不明確な質問で申し訳ありませんでした。再度よろしくおねがいします。

評価

0

>つまり、whileループでテーブルから読み出した結果をただ表示させるのではなく、登録した件数分を数字で表示させるコードの書き方がわかりません。

"表示させる"というのを取り除いて考えればいいんじゃないかなあ?
一度whileループ内のコードを全て削除して、「"登録した件数分"を得るにはどうすればいいか」ということを考えてみるのがよいのではないのでしょうか。

>読み出した結果をただ表示させるのではなく、
>登録した件数分を数字で表示させる
をしたいのですよね。

この部分はstrutsとか全然関係ないものになったりする筈と思います。
また欲しいのは"登録した件数分"を得ることであって、表示とかはその後のことになる筈です。

whileループの中で
>dataForm = new DataForm();
とかやってるけど、ActionFormクラスでないといけないのかなあ?とも思ったりしますけど
(ActionFormクラスって自分でnewする場合もあるもの?
strutsは詳しくないけど、もうちょっと仕組みとか勉強してみた方がいいような気もしたりする・・)
DataFormクラス自体、"血液型それぞれの件数を表示させる"ためのクラスにはなっていないと思うし・・。

評価

0

まあさんも触れていますがSQLの勉強ってしましたか?
DBを扱うのであればバーボンさんのやりたい処理はこれからも必要になるかもしれないので、調べてみるといいかもしれませんね。

また、スマートではありませんが
>whileループでテーブルから読み出した結果を単に表示させる処理まではできました。

とありますので、単に表示って部分をやりたい処理に変えてあげても同じような結果が得られると思いますよ。

勉強、大変でしょうが頑張ってくださいね。

評価

0

見たところ、たしかにSQLレベルの話ですね。
「レコード数」取得と、「グループ化」のSQLさえ勉強すれば、あとはなんとかなるかなと。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。