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

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

0

seasar2による掲示板作成

お世話になっております。
現在seasar2を用いての掲示板作成を行っております。
どうしてもコメントを書き込んだときに、その書き込まれたコメントを画面下部に表示させる方法がわからないでおります。
javaの先輩方、恐縮ですが手段をご教授いただければと思います。

※入力された値をformで保持し、DTOを利用して画面に値を永続的に表示したいと思っております。
現時点ではDBへの接続処理は考慮しておりません。

※ソースを記載します。

    @Resource
    @ActionForm
    public MessageForm messageForm;

    @Resource
    public MessageDto messageDto;

    @Execute(validator=false)
    public String sendMessage(){

        //List<MessageDto> list = new ArrayList<MessageDto>();

        this.messageDto.userName = messageForm.userName;
        this.messageDto.messageComment = messageForm.messageComment;

        System.out.println("★★★★★★"+messageDto+"★★★★★★★");

        return "message.jsp";
    }

}

---------------------------------------------
<html>
  <head>
    <title>掲示板作成</title>
  </head>
<body>
  <div>掲示板作成</div>


   <div>
     <!-- <form action="${f:url("sedMessage") }" method = "post">-->
     <form >
     NAME:<input type="text" name ="userName" placeholder="名前" /><p>
     COMMENT:<textarea type ="text" name = "messageComment" placeholder="コメント"></textarea>
     <s:submit property="sendMessage" value = "書き込み" >
     </s:submit>

     </form>
    </div>

   <c:forEach var ="i"  items="${MessageDto}" >
     <c:out value="${i.messageDto.userName }"></c:out>
     <c:out value="${i.messageDto.messageComment }"></c:out>
     <div style = "float:left;width:100px">${f:h(i.messageComment) }</div>
   </c:forEach>

</body>
</html>

----------------------------------------------

以上、どうぞよろしくお願いいたします。

19

回答

89022

閲覧

19件の回答

評価

0

下に表示するためには、何がどういう状態ならいいのか。
実現したいことを、分解して考えるんだよ。

評価

0

seasar2では別の解があるかもしれませんが
//List<MessageDto> list = new ArrayList<MessageDto>();
これをクラスのフィールドに定義しリクエストに設定して出力すればよいのではないでしょうか。
ただArrayListはスレッドセーフではなかった気がするので試す程度で。

評価

0

質問者です。
> //List<MessageDto> list = new >ArrayList<MessageDto>();
>これをクラスのフィールドに定義しリクエストに設定し
>て出力すればよいのではないでしょうか。

なるほどです。その手段を試してみます。

余談ですが、デバッグをするとDTOに格納された値がJSP側に持っていけているようにみえるため、JSPの記述方法に誤りがある(下記の部分)と考えている面もあるのですが、
何かお分かりになりますでしょうか。




評価

0

先ほどの回答者です

下記の部分部分とはc:forEachでしょうか。
MessageDtoがどのようなものかわからないのですが
List<MessageDto> MessageDto = new ArrayList<MessageDto>();
このようなものでしょうか。
${i.messageDto.userName }

でしたら
${i.userName }こうではないでしょうか。

評価

0

質問者です。
たびたびのご回答ありがとうございます。

MessageDtoは下記の内容です。
------------------------------
@Component(instance = InstanceType.SESSION)
public class MessageDto implements Serializable {

    private static final long serialVersionUID = 1L;

    public String userName;

    public String messageComment;

}
-----------------------------------------------

-----------------------------------------------
listのコメントアウトをはずして、Actionを以下のようにしてみたのですが、うまくいきませんでした…。
    @Execute(validator=false)
    public String sendMessage(){

        List<MessageDto> list = new ArrayList<MessageDto>();

        this.messageDto.userName = messageForm.userName;
        this.messageDto.messageComment = messageForm.messageComment;

        list.add(messageDto);

        System.out.println("★★★★★★"+messageDto+"★★★★★★★");

        return "message.jsp";
    }
-----------------------------------------------

Formで保持した値をDTOに格納し、listにつめて、jsp側に送り返そうとしています。

ソースの記述方法に問題があったりしますでしょうか?

評価

0

MessageDtoをセッションに保持しているのと

List<MessageDto> listをローカル変数としている理由がわかりません。
MessageDtoをセッションに保持して編集しても毎回同じインスタンスに対しての変更となってしまうのでは?

    // セッション保持がよければseasar2を利用してセッションにいれる。
    // まはたsendMessage内でセッションに格納しればよい
    // このままのstaticならばsendMessage内でリクエストに設定しなければならない
    private static List<MessageDto> list = new ArrayList<MessageDto>();

    @Resource
    @ActionForm
    public MessageForm messageForm;

    @Execute(validator=false)
    public String sendMessage(){

    MessageDto messageDto = new MessageDto();
        messageDto.userName = messageForm.userName;
        messageDto.messageComment = messageForm.messageComment;

        System.out.println("★★★★★★"+messageDto+"★★★★★★★");

        return "message.jsp";
    }


   <c:forEach var ="i"  items="${list}" >
     <c:out value="${i.userName }"></c:out>
     <c:out value="${i.messageComment }"></c:out>
     <div style = "float:left;width:100px">${f:h(i.messageComment) }</div>
   </c:forEach>

評価

0

list.add(messageDto)が抜けてますね

評価

0

質問者です。

>MessageDtoをセッションに保持して編集しても毎回同じインスタンスに対しての変更となってしまうのでは?

これはご指摘のとおりですね。
勉強になります。

Actionをご教授いただいた内容で修正してみたのですが、
現状うまくいかない状況です。

JSP側も以下のように修正してみました。

---------------------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Dolteng Auto Generated</title>
</head>
<body>
<h1>Hello World!</h1>
<div>BuiltenBorad</div>

<!-- メッセージを投稿する部分 -->
<div>
<form action="${f:url("/sendMessage") }" method="post">
<input type="text" name="userName" placeholder="名前" /><br />
<textarea name="text" placeholder="メッセージ" /></textarea>
<input type="submit" />
</form>
</div>
<!-- メッセージを表示する部分 -->
<!-- forで複数メッセージ表示できるようにする -->
<c:forEach var="message" items="${list }">
<div style="border:solid 1px #333"></div>
<div style="float:left;width:100px">$f:h(message.userName)}</div>
<div style="float:left;margin-left:10px">$f:br(f:h(message.messageComment))}</div>
<br style="clear:both" />
</c:forEach>
</body>
</html>
---------------------------------------
---------------------------------------
public class IndexAction {

    @Resource
    @ActionForm
    public MessageForm messageForm;

     private static List<MessageDto> list = new ArrayList<MessageDto>();


    @Execute(validator = false)
    public String index() {
        return "index.jsp";
    }

    @Execute(validator=false)
    public String sendMessage(){


        MessageDto messageDto = new MessageDto();

        messageDto.userName = messageForm.userName;
        messageDto.messageComment = messageForm.messageComment;

        list.add(messageDto);

        System.out.println("★★★★★★"+messageDto+"★★★★★★★");

        return "index.jsp";
    }
}
---------------------------------------

うーん…。難しいです。

評価

0

下記の意味はわかりましたか。
// セッション保持がよければseasar2を利用してセッションにいれる。
// まはたsendMessage内でセッションに格納しればよい
// このままのstaticならばsendMessage内でリクエストに設定しなければならない

リクエストやセッションやアプリケーションスコープに設定しなければ出力できません。


以下のコードを追加すればリクエストに設定できるはずです。

// 以下をフィールドに定義
@Resource
protected HttpServletRequest request;

// リストをリクエストに設定する
request.setAttribute("list", list);

評価

0

質問者です。

度々の回答、誠にありがとうございます。

>@Resource
>protected HttpServletRequest request;
>
>// リストをリクエストに設定する
>request.setAttribute("list", list);

参考にさせていただきました。
現状のコードではリクエストの表示ができなかったですね。

恐縮なのですが、setAttribute()を利用していることは、呼び出し側で
getAttribute()で値を取り出さなくてはならないと思っているのですが、その場合JSP側のコードは現状のままではダメで、スクリプトレットを等を利用したものに書き換えなければならないのでしょうか。

評価

0

どのような理由でgetAttributeするのでしょうか。
EL式の仕様は理解しているでしょうか。

評価

0

>どのような理由でgetAttributeするのでしょうか。
EL式の仕様は理解しているでしょうか。

EL式を理解していませんでした。
ググりました。
${}のような感じで値の取り出しができるのですね。

教えていただいてばかりで申し訳ないのですが、
listから値を取り出すことができません。

----------------------------------------
<jsp:useBean id="list" class="java.util.ArrayList" scope="request" />

<c:forEach var="message" items="${list}" >
<div style="border:solid 1px #333" />
<!-- <div style="float:left;width:100px" >-->${f:h(message)}
<!-- <div style="float:left;margin-left:10px">-->{$f:br(f:h(message))}
<br style="clear:both" /></div>
</c:forEach>
----------------------------------------

のような形にしてみたのですが、
ダメでした。

最後にこのlistからの取り出し方法についてお教えいただけないでしょうか。

よろしくお願いいたします。

評価

0

>ダメでした。
こういう書き方じゃだめだよ。
エラーが出たならそのエラーをしっかり書かないと。

評価

0

>ダメでした。
こういう書き方じゃだめだよ。
エラーが出たならそのエラーをしっかり書かないと。

すみません。おっしゃるとおりです。

以下のようなエラーが出力されました。

-------------------------------------------
致命的: サーブレット default のServlet.service()が例外を投げました
javax.el.PropertyNotFoundException: Property 'userName' not found on type sample.dto.MessageDto
-------------------------------------------
MessageDtoにはuserNameというプロパティは記述してあります。

forでまわす変数も"${list}"のような下記をしているため、現状、なぜこのエラーが出力されているのかわからないでいます。
-------------------------------------
<c:forEach var="message" items="${list}" >
<div style="border:solid 1px #333" /></div>
<div style="float:left;width:100px"> ${f:h(message.userName)}</div>
<div style="float:left;margin-left:10px">{$f:br(f:h(message))}</div>
<br style="clear:both" />
</c:forEach>
-------------------------------------

言葉足らずで申し訳ないです。

評価

0

javaのプロパティというのは
public String field();
ではなくて
private String field();
public void setField() {
  this.field = field;
}
// 当然getterも必要
を指します。

public String field();という書き方は
推奨されていません。
また多くのフレームワークやライブラリが動きません。

評価

0

おはようございます。質問者です。

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

問題の切り分けを行いたいのですが、
現状下記のどれに該当しますでしょうか。

&#9312;action側のコードに問題有
&#9313;jsp側に問題有
&#9314;両方に問題有

皆様に助けていただいたおかげでもうゴールは近い

思うですが。

jsp側のコードを一度精査していただけないでしょう
か。

評価

0

どんどん、人任せになってるぞ。
色々とヒントをもらっているのに、自分で何も考えていない
かのようだ。
エラーの件にしてもそうだが、人任せにする前に自分ででき
ることがないか、考えてから質問しよう。

評価

0

質問者です。

そうですね。ちょっと頼り過ぎてしまいまし
た…。

ここからは自分で頭捻ってみます!

ご回答いただいた皆様、ありがとうございまし
た。

評価

0

呉々も、質問すること自体がだめなのではないんで、そこは
間違えないで欲しい。
これだけ調べて考えているけど、ここで詰まっている。
だからここだけ、どう考えればいいか教えて欲しい。
そういう話なら分かるんだが、とくに先の書き込みは、整理
したいとしつつ整理させようとしている。
「精査して」と、あたかも関係者に対してするような依頼を
している。
赤の他人にそこまでさせるのはおかしいだろう?という話な
んだ。

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