애노테이션 컨트롤러를 사용하여 스프링 MVC 기반 사이트에서 상태 메시지 ("데이터는 성공적으로 저장/추가/삭제되었습니다")를 구성하는 가장 좋은 방법은 무엇입니까?스프링 MVC 기반 사이트 (애노테이션 컨트롤러)의 상태 메시지
그래서 문제는 contoller의 POST 메서드에서 메시지를 보내는 방식입니다.
애노테이션 컨트롤러를 사용하여 스프링 MVC 기반 사이트에서 상태 메시지 ("데이터는 성공적으로 저장/추가/삭제되었습니다")를 구성하는 가장 좋은 방법은 무엇입니까?스프링 MVC 기반 사이트 (애노테이션 컨트롤러)의 상태 메시지
그래서 문제는 contoller의 POST 메서드에서 메시지를 보내는 방식입니다.
플래쉬 메시지를 사용하는 방법에 대한 우수한 포스트했다 Spring 3.1부터 RedirectAttributes를 사용하는 것이 가장 좋습니다. 블로그에 제공된 샘플에 i18n을 추가했습니다. 그래서 이것은 완전한 샘플이 될 것입니다.
@RequestMapping("/users")
@Controller
public class UsersController {
@Autowired
private MessageSource messageSource;
@RequestMapping(method = RequestMethod.POST, produces = "text/html")
public String create(@Valid User user, BindingResult bindingResult, Model uiModel, HttpServletRequest httpServletRequest, Locale locale, RedirectAttributes redirectAttributes) {
...
...
redirectAttributes.addFlashAttribute("SUCCESS_MESSAGE", messageSource.getMessage("label_user_saved_successfully", new String[] {user.getUserId()}, locale));
return "redirect:/users/" + encodeUrlPathSegment("" + user.getId(), httpServletRequest);
}
...
...
}
메시지 묶음에 적절한 메시지를 추가합니다 (예 : messages.properties).
label_user_saved_successfully=Successfully saved user: {0}
을 편집하여 jspx 파일은 어떻게 난 단지 200 OK 메시지가있는 경우에 표시해야합니다 어떤 메시지를 알 수 관련 속성을
<c:if test="${SUCCESS_MESSAGE != null}">
<div id="status_message">${SUCCESS_MESSAGE}</div>
</c:if>
단순하게 유지하고 특정 HTTP 1.1 상태 코드를 사용해야합니다. 따라서 성공적인 전화를 받으려면 200 OK를 반환합니다. 그리고 클라이언트 측에서는 컨트롤러가 200을 반환 할 때 사용자에게 특정 메시지를 보여주고 싶다면 거기에 보여줍니다.
를 사용하지만 서로 다른 메시지를 표시 할 경우 상황에 따라 달라 하는가? – olegflo
중요한 것은 상태가 정상인 경우에만 200을 반환한다는 것입니다. 무언가 발견되지 않으면 서버 오류가 500을 반환하면 무단으로 반환합니다. 403. –
일부 POST 후에 페이지가 다시로드된다는 것을 의미하는 경우보기에 플래그를 포함시킬 수 있습니다 (JSP 또는 속도 또는 사용하는 모든 것). 예 : 이
<c:if test="${not empty resultMessage}">
<spring:message code="${resultMessage}" />
</c:if>
그리고 당신의 메시지 번들 같은 그 코드에 대한 메시지를 포함해야합니다. 당신이 AJAX POST 일부 데이터를 제출 할 (즉, 페이지를 다시로드하지 않고 당신이 메시지를 표시해야합니다) 경우
당신은
1)를 사용하면 JS 동적 (JSP 또는 속도, 다시) 및 삽입 파일을 만들 수 있습니다 이 <spring:message>
태그 (정말이 옵션을 좋아하지 않는다)
또는
2
) this link의 조언을 따라하고 JS에 상태 개체를 반환@ResponseBody
를 사용합니다. 객체 내부에
@ResponseBody
으로 표시하면 상태와 메시지를 둘 다 넣을 수 있습니다. 예 : 메시지 번들을
this case처럼 사용하십시오.
JSP에 메시지를 표시하는 가장 간단한 방법은 표시 할 메시지가 포함 된 범위 지정 (어쩌면 세션, 어쩌면 요청) 대상을 갖는 것입니다. 예를 들어 다음을 할 수 있습니다.
... java stuff ...
List messages = new ArrayList();
messages.add("some message");
messages.add("some other message");
request.addAttribute("NotableMessages", messages);
... java stuff ...
... jsp and JSTL stuff ...
<c:if test="not empty NotableMessages">
<ul>
<c:forEach items="${NotableMessages}" var="item">
<li>${item}</li>
</c:forEach>
</ul>
</c:if>
... jsp stuff ...
적절한 상태 코드와 함께 원하는 특정 메시지가있는 머리글을 설정할 수 있습니다. 물론 컨트롤러를 사용하는 방법 (예 : 제 3 자 없음)을 제어 할 수 있다면이 방법이 실제로 좋은 아이디어입니다.
입증 된 접근법은 다음 GET 요청까지 유지되어야하는 메시지에 특별한 플래시 범위를 사용하는 것입니다.
public interface Flash {
void info(String message, Serializable... arguments);
void error(String message, Serializable... arguments);
Map<String, MessageSourceResolvable> getMessages();
void reset();
}
@Component("flash")
@Scope(value = "session", proxyMode = ScopedProxyMode.INTERFACES)
public class FlashImpl implements Flash {
...
}
특별한 MVC 인터셉터가 플래시 개체에서 플래시 값을 읽고 요청 범위에 배치됩니다 : 이제
public class FlashInterceptor implements WebRequestInterceptor {
@Autowired
private Flash flash;
@Override
public void preHandle(WebRequest request) {
final Map<String, ?> messages = flash.getMessages();
request.setAttribute("flash", messages, RequestAttributes.SCOPE_REQUEST);
for (Map.Entry<String, ?> entry : messages.entrySet()) {
final String key = "flash" + entry.getKey();
request.setAttribute(key, entry.getValue(), RequestAttributes.SCOPE_REQUEST);
}
flash.reset();
}
...
}
내가 세션을 사용하려면
플래시 객체를 범위 컨트롤러에 간단히 "플래시 범위"에 메시지를 배치 할 수 있습니다 :@Conteroller
public class ... {
@Autowired
private Flash flash;
@RequestMapping(...)
public void doSomething(...) {
// do some stuff...
flash.info("your.message.key", arg0, arg1, ...);
}
}
를보기 y를에서 플래시 메시지를 반복합니다.
<c:forEach var="entry" items="${flash}">
<div class="flash" id="flash-${entry.key}">
<spring:message message="${entry.value}" />
</div>
</c:forEach>
이 정보가 도움이되기를 바랍니다.
이제 Spring 3.1이 GA가되었으므로 krishnakumarp의 대답을 내 것보다 선호하는 것으로 승격합니다. –
잠시 동안 머리를 두드리는 소리가 들린 후 마침내 작동하게 만들었습니다.
스프링 3.1을 사용하고 있으며 리디렉션을 통해 전달되는 requestFlashAttributes를 지원합니다.
내 문제를 해결하기위한 열쇠는 반환 유형을 ModelAndView 객체가 아닌 문자열로 변경하는 것이 었습니다.
이 사람은 muanis 언급 된 바와 같이 스프링 (http://www.tikalk.com/java/redirectattributes-new-feature-spring-mvc-31)
위 링크가 깨졌습니다. 새 링크는 http://www.tikalk.com/redirectattributes-new-feature-spring-mvc-31/ – Stifler
컨트롤러에서 ** messageSource ** 보류를 얻으려면 어떻게해야합니까? – ManuPK
// Autowire messageSource. 이 변경 사항을 반영하도록 원래 응답이 수정되었습니다. @Autowired 비공개 MessageSource messageSource; – krishnakumarp
나는 보통 컨트롤러에서 플래쉬 메시지를 렌더링하지 않고 단순히 플래시 컨텍스트에서 메시지 코드를 저장한다. 그런 다음 플래시 메시지를 렌더링하는보기에서 i18n'ed 메시지에 대한 해상도가 수행됩니다. –