복붙노트

[SPRING] Thymeleaf 및 Spring MVC에서 양식 매개 변수가 null입니다.

SPRING

Thymeleaf 및 Spring MVC에서 양식 매개 변수가 null입니다.

Thymeleaf와 Spring MVC에 문제가 있습니다.

spring.io 웹 사이트 http://spring.io/guides/gs/handling-form-submission/에서 자습서를 진행 중이며이 자습서를 확장하려고 시도 할 때 문제가 발생했습니다.

내 모델 클래스에 다른 매개 변수를 추가하면 (예를 들어, Date 매개 변수와 긴 매개 변수를 추가했습니다.) 내 견해에 추가하지 마십시오.이 날짜 매개 변수는 마지막 수정 날짜이며이 긴 매개 변수입니다. 임의 값),이 값을 제출하면이 메서드는이 2 개의 매개 변수를 null로 만듭니다.

다음은 제 코드입니다.

내 모델 클래스

public class Greeting {

    private long id;
    private String content;
    private Date hour;
    private long longNumber;
.... getters and setters ....
}

내 컨트롤러

@Controller
public class GreetingController {

@RequestMapping(value="/greeting", method=RequestMethod.GET)
public String greetingForm(Model model) {

    Greeting greeting = new Greeting();
    greeting.setHour(new Date());
    greeting.setLongNumber(1234L);
    System.out.println(greeting.toString());
    model.addAttribute("greeting", greeting);
    return "greeting";
}

@RequestMapping(value="/greeting", method=RequestMethod.POST)
public String greetingSubmit(@ModelAttribute Greeting greeting, Model model) {
    System.out.println(greeting.toString());
    model.addAttribute("greeting", greeting);
    return "result";
}
}

내 양식

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Handing Form Submission</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <h1>Form</h1>
    <form action="#" th:action="@{/greeting}" th:object="${greeting}" method="post">
        <p>Id: <input type="text" th:field="*{id}" /></p>
        <p>Message: <input type="text" th:field="*{content}" /></p>
        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
    </form>
</body>
</html>

결과 페이지

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Handing Form Submission</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <h1>Result</h1>
    <p th:text="'id: ' + ${greeting.id}" />
    <p th:text="'content: ' + ${greeting.content}" />
    <p th:text="'Date: ' + ${greeting.hour}" />
    <a href="/greeting">Submit another message</a>
</body>
</html>

이것은 내 모델 클래스의 내 콘솔 인쇄물입니다.

Greeting [id=0, content=null, hour=Sun Apr 26 22:29:25 GMT-03:00 2015, longNumber=1234]
Greeting [id=0, content=aaaa, hour=null, longNumber=0]

보시다시피 내보기에없는 매개 변수는 모두 게시 (두 번째 줄) 이후에 null이되고 첫 번째 줄에는 값이 있습니다. 나는 다른 좋은 프레임 워크 (JSF)에서 왔기 때문에 그 이유를 알지 못합니다. 거기에는 그런 문제가 없습니다. 아시다시피, 저는 튜토리얼에서와 마찬가지로 스프링 4를 사용하고 있는데, 왜 내 견해에 있지 않은 매개 변수가 있습니까? 이 매개 변수 중 일부는 마지막 레지스터 업데이트 날짜, 레지스터를 업데이트 한 마지막 사용자 및 내 응용 프로그램 ID와 같은 일부 데이터를 보유하기 때문에.

아무도 내가 이것에 대한 답을 찾도록 도와 줄 수 있습니까?

편집하다:

약간의 시간과 실험 후에, 나는 나의 문제에 대한 해결책을 발견했다. 다음과 같은 의미로 작동하는 코드 조각을 따르십시오.

@Controller
@SessionAttributes({"obj"})
public class MyController {

    @RequestMapping(value = "/path", method = RequestMethod.GET)
    public ModelAndView myGet() {       
        ModelAndView modelAndView = new ModelAndView("view");
        MyClass object = new MyClass();
        modelAndView.addObject("obj", object );     
        return modelAndView;
    }

    @RequestMapping(value = "/path", method = RequestMethod.POST)
    public ModelAndView myPost(@ModelAttribute("obj") @Validated MyClass object, BindingResult result){

        ModelAndView modelAndView = new ModelAndView("view");       
        if(result.hasErrors())
            modelAndView.addObject("obj",object);
        else 
            service.save(object);
        return modelAndView;
    }   
}

해결법

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

    1.이것이 예상되는 동작입니다. greetings 뷰로 들어가는 동안 응답에 모델이 있지만 http 요청 / 응답이 완료되면 더 이상 존재하지 않습니다.
    태그에 값을 저장하므로 양식 제출시이 값을 제공해야합니다.

    이것이 예상되는 동작입니다. greetings 뷰로 들어가는 동안 응답에 모델이 있지만 http 요청 / 응답이 완료되면 더 이상 존재하지 않습니다. 태그에 값을 저장하므로 양식 제출시이 값을 제공해야합니다.

    즉,이 값을 다시 보내려면이 두 값을 저장하기 위해 2 개의 숨겨진 입력을 추가해야합니다.

    <form action="#" th:action="@{/greeting}" th:object="${greeting}" method="post">
        <p>Id: <input type="text" th:field="*{id}" /></p>
        <p>Message: <input type="text" th:field="*{content}" /></p>
        <input type="hidden" th:field="*{hour}" />
        <input type="hidden" th:field="*{longNumber}" />
        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
    </form>
    
  2. from https://stackoverflow.com/questions/29885802/form-parameter-is-null-with-thymeleaf-and-spring-mvc by cc-by-sa and MIT license