1

基本的に、Spring モデルの広告リスト ${myAdverts} に付属する広告オブジェクトを取得する次の jsp があります。

そして、それらのいずれかがクリックされると、投稿リクエストがコントローラーに送信されますが、広告オブジェクトのインスタンスが送信されることを望みます。それはどういうわけか可能ですか?

ここに私のJSPコードがあります:

<xc:forEach var="advertisement" items="${myAdverts}" varStatus="stats">
    <li>

    <a class="furtherinfo-link" onclick="javascript:submitJoin(${stats.count})" >${advertisement.getName()}</a>
    </li>
</xc:forEach>
<form:form id="myform" method="POST" action="form_submit.html" commandName="myForm" name="MyForm">
 <form:input id="advertisementObj" path="advertisementObj" type="hidden"/>
 </form:form>

これは、春のMVCとjavascriptでの自動入力リストの処理に触発されたjavascriptで投稿を送り返す私の試みです:

JavaScript コード

 <script src="js/webmenu_nav.js"></script>

<script type="text/javascript">
      function submitJoin(position){
        $('#advertisementObj').val("myAdverts["+position+"]");

        document.MyForm.submit();
      }

</script>

そのコードの現在の動作は、Controller オブジェクトの post メソッドで常に空のadvertisingObj を取得することです。

コントローラー オブジェクトは非常に単純ですが、念のためにコードの一部にしています。

@Controller
public class MyController {

@RequestMapping(value="/show_advertisements.html",method = RequestMethod.GET)
public ModelAndView showAdv(@RequestParam(value="response", required=false) String incomingResponse) {

    Map<String, Object> model = new HashMap<String, Object>();
    model.put("response", incomingResponse);

    List<AdvertisementRecord> adverts = methodThatReturnsList();
    model.put("myAdverts", adverts);

    MyForm jform = new MyForm();
    model.put("myForm", jform);

    return new ModelAndView("show_advertisements", model) ;
}

@RequestMapping(value = "/form_submit.html", method = RequestMethod.POST)
public ModelAndView formSubmit(MyForm myForm,  BindingResult result, Map model){


    if(null != myForm.getAdvertisement())
        return showPage("adver " + myForm.getAdvertisement().getId());
    else
        return showPage("null advertisement on join");


}

 }

解決!!

ソリューション コードのスニペット

JSP コード:

<xc:forEach var="advertisement" items="${myAdverts}" varStatus="stats">
    <li>
    <a class="furtherinfo-link" onclick="javascript:submitForm(${stats.count})" >${advertisement.getName()}</a>
    </li>
</xc:forEach>
<form:form method="POST" id="theForm" action="form_submit.html" modelAttribute="myAdverts" name="MyForm">
</form:form>    

JavaScript:

<script src="js/webmenu_nav.js"></script>

    <script type="text/javascript">
          function submitForm(position){
           $('#theForm').attr("action","form_submit.html?position="+position);

            document.MyForm.submit();
          }

    </script>

</head> 

コントローラ:

 @Controller
 @SessionAttributes("myAdverts")
public class MyController {

@RequestMapping(value="/show_advertisements.html",method = RequestMethod.GET)
public ModelAndView showAdv(@RequestParam(value="response", required=false) String incomingResponse) {

    Map<String, Object> model = new HashMap<String, Object>();
    model.put("response", incomingResponse);

    List<AdvertisementRecord> adverts = methodThatReturnsList();
    model.put("myAdverts", adverts);

    //MyForm jform = new MyForm();
    //model.put("myForm", jform);

    return new ModelAndView("show_advertisements", model) ;
}

@RequestMapping(value = "/form_submit.html", method = RequestMethod.POST)
public ModelAndView formSubmit(@RequestParam("position") final int position, @ModelAttribute("adverts") @Valid List<AdvertisementRecord> adverts,  BindingResult result, Map model){


    if(null != adverts && null != adverts.get(position))
        return showPage("adver " + adverts.get(position).getId());
    else
        return showPage("null advertisement ");


}

 }

上記のコードでは、"form_submit.html?position="+position" を呼び出しているため、署名の最初にリクエスト パラメータを指定することが重要であることに注意してください。

4

2 に答える 2

2

モデルに配置したオブジェクトは、デフォルトでは現在のリクエストに対してのみ存在します。これは、myAdvertsリストが 2 番目のリクエスト (つまり、POST リクエスト) に存在しないことを意味します。ただし、アノテーションを使用@SessionAttributeして、Spring MVC にオブジェクトを http セッションに保存するように指示することができるため、以降のリクエストでそれらにアクセスできます。

コントローラーは次のようになります。

@Controller
@SessionAttributes("myAdverts")
public class MyController {
    @RequestMapping(value="...", method=RequestMethod.GET)
    public void get(ModelMap model){
        List myAdverts = // get your list of adverts.
        model.put("myAdverts", myAdverts)
    }

    @RequestMapping(value="...", method=RequestMethod.POST)
    public void post(@RequestParam("position") final int position, @ModelAttribute("myAdverts") List myAdverts,SessionStatus sessionStatus){
        myAdverts.get(position);
        // ...

        // tell spring to remove myAdverts from session
        sessionStatus.setComplete();
    }
}

詳細について@SessionAttributeは、こちらをご覧ください。

于 2012-11-14T14:24:43.393 に答える
0

広告に何らかの一意の ID があり、DAO に格納されている場合 (または ID から広告を取得する別の方法がある場合)、文字列引数を受け取り、それを広告に変換するコンバーターを実装できます。

public class StringToAdvertisementConverter implements Converter<String, Advertisement> {

    private AdvertisementRepository advertisementRepository

    @Autowired
    public setAdvertisementRepository(AdvertisementRepository repository){
        this.advertisementRepositort = repository;
    }

    @Override
    public Advertisement convert(String id) { 

         return advertisementRepository.lookup(id);
    }

}

コンバーターを変換サービスに登録した後

<mvc:annotation-driven conversion-service="conversionService"/>

<bean id="conversionService"
      class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="my.StringToAdvertisementConverter"/>
        </set>
    </property>

@RequestParamコントローラーは、 Advertisement クラスをおよび類似のアノテーションのパラメーターとして受け入れることができます。

    @RequestMapping(method = RequestMethod.POST, value = "/SomeMapping")
    public String handleSomething(@RequestParam(required = false) Advertisement advert,
        ModelMap model) {}

別の方法として、PropertyEditors を使用して同じ結果を得ることができます。Spring ドキュメントへのリンクがたくさんあるトピックに関する良い質問があります。

于 2012-11-14T14:53:19.147 に答える