3

Stripes フレームワークを使用していますが、解決できない問題があります。

「クリーチャー」フォルダに「add.jsp」というページがあり、クリーチャー (モデル内のエンティティ) を DB に追加します。そのページでこのフォームを使用します。

add.jsp

<s:layout-render name="/layout.jsp" title="Creatures">
<s:layout-component name="menu">
    <ul class="navcontainer" id="main-navigation">
        <li><s:link href="/regions.jsp">Region</s:link></li>
        <li class="current"><s:link href="/creatures/show.jsp">Creatures</s:link></li>
        <li><s:link href="/types.jsp">Creature types</s:link></li>
        <li><s:link href="/weapons.jsp">Weapons</s:link></li>
    </ul>
</s:layout-component>
<s:layout-component name="main_content">
    <div class="main-content">
        <div class="content">
            <img src="../images/banner.png" alt="Banner" id="banner"/>
            <h1>Create a new creature</h1>
            <s:link href="/creatures/show.jsp">Back</s:link>
            <s:form beanclass="cz.muni.fi.pa165.creatures.web.CreaturesActionBean">
                <%@include file="/forms/createCreature.jsp"%>
                <s:submit name="create" value="Create"/>
            </s:form>
        </div>
    </div>
</s:layout-component>

フォーム自体も含めて、アクション Bean のメソッド「create」にマップする必要がある name="create" の送信ボタンがありますか?

わかりましたので、次のようなクラスがあります。

@UrlBinding("/creatures/{$event}")
public class CreaturesActionBean implements ActionBean {

final static Logger logger = 
    Logger.getLogger(CreaturesActionBean.class.getName());

private ActionBeanContext context;

@SpringBean
protected CreatureService creatureService;

@ValidateNestedProperties(value = {
    @Validate(on = {"create"}, field = "name", required = true, maxlength=256),
    @Validate(converter=LongTypeConverter.class , on = {"create"}, 
        field = "weight", required = false, minvalue=1, maxvalue=1000),
    @Validate(converter=LongTypeConverter.class , on = {"create"}, 
        field = "height", required = false, minvalue=1, maxvalue=1000)
})
private CreatureDTO creatureDTO;

public void setCreatureDTO(CreatureDTO creatureDTO) {
    this.creatureDTO = creatureDTO;
}

public CreatureDTO getCreatureDTO() {
    return this.creatureDTO;
}

public Resolution create() {
    logger.log(Level.INFO, "add() creature={}", creatureDTO);
    creatureService.create(creatureDTO);
    return new RedirectResolution(this.getClass(), "all");
}

@DefaultHandler
public Resolution all() {
    logger.log(Level.INFO, "getting all creatures");
    return new ForwardResolution("/creatures/show.jsp");
}

つまり、「create」という名前のサブミットがあると、そのアクション Bean で create メソッドが実行され、creativeDTO が保存されます。

しかし

アクション Bean のその「作成」メソッドはまったく実行されず、呼び出されたページにリダイレクトされます

http://localhost:8080/pa165/creatures/

アプリケーションコンテキストはpa165で、送信ボタンをクリックした後にそのページにリダイレクトした後、そのディレクトリ内のすべてのファイル(add.jspなど、クリーチャーディレクトリ内のすべてのファイル)のリストが表示され、そのメソッドはまったく実行されません.

行単位で処理しているcreative/show.jspのページにリダイレクトさせたい

return new RedirectResolution(this.getClass(), "all");

つまり、そこにあるすべての方法でリダイレクトされます

うまくいかないのはなぜですか?

4

2 に答える 2

2

検証結果をどこかに出力しますか? (<stripes:errors> タグ) 「create」メソッドがまったく実行されていない場合、フォームの送信が検証に合格していない可能性があります。たぶん、フィールド名が一致していないか、そのようなものです。

于 2012-11-26T09:37:48.210 に答える
1

問題は、URL バインディングがフォルダー構造と同じであってはならないことです。のようなバインディングを変更するだけ@UrlBinding("/mycreatures/{$event}")です。私は同じ問題を抱えていましたが、これは魅力のように機能しました。詳細については、このリンクを参照してください。

于 2013-12-23T12:36:54.520 に答える