복붙노트

[SPRING] 드롭 박스 - 스프링 MVC 모델 / 컨텍스트에서 freemarker를 사용하여 폼으로

SPRING

드롭 박스 - 스프링 MVC 모델 / 컨텍스트에서 freemarker를 사용하여 폼으로

이것은 아주 기본적인 것이어야하지만 나는 웹에서 그걸 발견 할 수 없다. 나는 함께 맞출 수없는 것처럼 보인다.

우리는 freemarker와 함께 Spring MVC를 사용하고 있습니다. 이제는 내 페이지에 양식을 추가하여 미리 정의 된 목록에서 값을 선택할 수있게하고 싶습니다 (백엔드에서 데이터베이스 액세스가 필요합니다).

내 컨트롤러 :

@RequestMapping(value = "/{id}", method = RequestMethod.GET)
public ModelAndView get(@PathVariable Integer id) {

    // stuff..
    ModelAndView mav = new ModelAndView();

    mav.addObject("targetObject", new TargetObject());
    mav.addObject("options", Arrays.asList("a", "b", "c"));
    mav.setViewName("someview");

    return mav;
}

나는 freemarkers spring support spring.ftl을 발견했으며, 이렇게 시도한 <@ spring.formSingleSelect>을 사용해야합니다.

someView.ftl :

<#import "../spring.ftl" as spring />

<form action="somePath" method="POST">
    <@spring.formSingleSelect "targetObject.type", "options", " " />
    <input type="submit" value="submit"/>
</form>

따라서 targetObject.type은 보이는 매크로에 의해 자동으로 바인딩됩니다.

그러나 매크로가 옵션을 생성 할 수 있도록 freemarker 시퀀스에 내 옵션을 어떻게 얻을 수 있습니까?

지금 나는 얻는다 :

Expected collection or sequence. options evaluated instead to freemarker.template.SimpleScalar on line 227, column 20 in spring.ftl.
The problematic instruction:
----------
==> list options as value [on line 227, column 13 in spring.ftl]
 in user-directive spring.formSingleSelect [on line 53, column 9 in productBase/show.ftl]
----------

나는 또한 시험했다 :

<@spring.bind "${options}" />

그리고 그 라인을 따라 더 많은 것들이 있지만 성공하지 못했습니다 :

freemarker.core.NonStringException: Error on line 48, column 18 in someView.ftl
Expecting a string, date or number here, Expression options is instead a freemarker.template.SimpleSequence

어떤 도움을 주셔서 감사합니다!

해결법

  1. ==============================

    1.많은 말을 한 후 다시 생각해 보니 마침내 해결책을 발견했습니다.

    많은 말을 한 후 다시 생각해 보니 마침내 해결책을 발견했습니다.

    먼저

    나는 분명히 콩을 가지고 있어야한다.

    둘째

    옵션은 문자열 목록으로 초기화되고 Spring MVC가 페이지에 제공해야합니다.

    public ModelAndView get() {
    
        // ...
        ModelAndView mav = new ModelAndView();
        List<String> options = Arrays.asList(getOptionsFromDatabaseAndConvertToStringList());
        mav.addObject("options",options );
        mav.setViewName("someview");
    
        return mav;
    }
    

    제삼

    옵션은 이제 freemarker 템플릿에 바인딩되어야하며 다른 freemarker 변수와 마찬가지로 액세스 할 수 있습니다 (즉 인용 부호 없음).

    <@spring.bind "options" />
    
    <form action="whatever" method="POST">
        <@spring.formSingleSelect "targetBean.choice", options, " " />
        <input type="submit" value="submit"/>
    </form>
    
  2. ==============================

    2.formSingleSelect의 문서에 따르면

    formSingleSelect의 문서에 따르면

    @param options a map (value=label) of all the available options
    

    가장 좋은 방법은 값을 키와 레이블로 맵에 맵 값으로 제공하는 것입니다. 그렇지 않으면 freemarker가 아마 당신을 위해 포장을하려고 할 것이고 당신은 통제력이 떨어진다.

    나는 단지 유효성을 확인했다 : 당신이 당신 자신의지도를 제공한다면 모든 것이 잘된다.

    <spring.formSingleSelect "target.property" referenceToYourMapProvidedInController ""/>
    
  3. from https://stackoverflow.com/questions/11433510/dropdown-box-from-spring-mvc-model-context-to-form-using-freemarker by cc-by-sa and MIT license