복붙노트

[SPRING] 자바, 스프링 프레임 워크 MVC - 방향 전환

SPRING

자바, 스프링 프레임 워크 MVC - 방향 전환

나는 스프링 프레임 워크 3을 사용하고있다. 기사에 의견을 게시 할 수있는 양식이 있습니다. 양식이 제출되면 오류가 있는지 점검합니다. 오류가없는 경우 컨트롤러는 문자열을 반환합니다.

"redirect:entryView/"+comment.getEntryId();

그리고 모든 것은 괜찮습니다.

하지만 오류가있는 경우 컨트롤러가 반환하면

"redirect:entryView/"+comment.getEntryId();

오류는 spring-form.tld 태그와 함께 양식에 표시되어야합니다.

<form:errors path="author"/>

그러나 표시된 오류가 없습니다! 돌아 오려고 할 때

"entryView/"+comment.getEntryId();

Redirect : prefix가 없다면 /rus/WEB-INF/jsp/entryView/8.jsp로 가고 HTTP Status 404가 있습니다.하지만 http://example.com/rus/entryView/8로 가야합니다. 즉 코멘트와 관련된 기사와 양식이있는 페이지!

이것은보기 해결 자입니다 :

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
</bean>

어떻게해야합니까?

제어기 나머지 :

@Controller
public class CommentController {
private RusService rusService;
private CommentValidator commentValidator;
@Autowired
public CommentController(RusService rusService,CommentValidator commentValidator){
    this.rusService = rusService;
    this.commentValidator = commentValidator;
}
@RequestMapping(value="/addComment",method=RequestMethod.POST)
public String addComment(Comment comment,BindingResult result){
    commentValidator.validate(comment, result);
    if(result.hasErrors()){
        return "redirect:entryView/"+comment.getEntryId();
    }else{
        rusService.postComment(comment);
        return "redirect:entryView/"+comment.getEntryId();
    }
}
}

해결법

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

    1.
    의 오류 표시는 다음과 같이 작동합니다.

    의 오류 표시는 다음과 같이 작동합니다.

    redirect : url을 사용할 때 Spring이 클라이언트의 브라우저에 302 Found를 보내어 브라우저가 새로운 URL로 두 번째 요청을하도록합니다.

    리디렉션 된 페이지가 다른 요청 / 응답 개체 집합과 함께 작동하기 때문에 원래의 오류는 손실됩니다.

    새 페이지를 표시하기 위해 리디렉션하려는 페이지에 "오류"를 전달하는 가장 간단한 방법은 두 번째 페이지의 컨트롤러가 볼 수있는 세션 개체에 메시지를 추가하는 것입니다 (또는 URL에 인수를 전달하여).

  2. ==============================

    2.새 메모를 표시하는보기로 리디렉션하지 않고 "메모 추가"양식의 페이지보기를 사용해보십시오.

    새 메모를 표시하는보기로 리디렉션하지 않고 "메모 추가"양식의 페이지보기를 사용해보십시오.

    if(result.hasErrors()) {
        return "commentForm";
    }
    

    메소드 서명에 @ModelAttribute Comment를 추가해야 할 수도 있습니다 ...

  3. ==============================

    3.bkent314가 맞습니다.

    bkent314가 맞습니다.

    이 두 가지 방법을 살펴 보아라. 도메인 개체를 양식 GUI 개체 (FolderCreateCommand)에서 분리하지만 그건 내 스타일입니다. 그리고이 경우에는 string 대신 return을 위해 ModelAndView를 사용합니다. 왜냐하면 모델에 대한 완전한 제어권을 가지고 있기 때문입니다.

    @RequestMapping(method = RequestMethod.GET, params = "form")
    public ModelAndView createForm() {
        return modelAndViewForCreate(new FolderCreateCommand(..default values..));
    }
    
    @RequestMapping(method = RequestMethod.POST)
    public ModelAndView create(@Valid FolderCreateCommand folderCreateCommand,
              BindingResult bindingResult) {
    
        if (bindingResult.hasErrors()) {
            return modelAndViewForCreate(folderCreateCommand);
        }
        Folder folder = this.folderService.createFolder(folderCreateCommand);
        return redirectToShow(folder);
    }
    
    
    private ModelAndView modelAndViewForCreate(FolderCreateCommand folderCreateCommand) {
        ModelMap uiModel = new ModelMap();
        uiModel.addAttribute("folderCreateCommand", folderCreateCommand);
        uiModel.addAttribute("parentFolders", this.folderDao.readAll());
        return new ModelAndView("folders/create", uiModel);
    }
    
    private ModelAndView redirectToShow(Folder folder) {
        return new ModelAndView(new RedirectView("/folders/" + folder.getId(), true));
    }
    
  4. from https://stackoverflow.com/questions/6780756/java-spring-framework-mvc-redirection by cc-by-sa and MIT license