下面列出了怎么用org.springframework.web.servlet.support.RequestContextUtils的API类实例代码及写法,或者点击链接到github查看源代码。
private ModelAndView getModelAndView(ModelAndViewContainer mavContainer,
ModelFactory modelFactory, NativeWebRequest webRequest) throws Exception {
modelFactory.updateModel(webRequest, mavContainer);
if (mavContainer.isRequestHandled()) {
return null;
}
ModelMap model = mavContainer.getModel();
ModelAndView mav = new ModelAndView(mavContainer.getViewName(), model);
if (!mavContainer.isViewReference()) {
mav.setView((View) mavContainer.getView());
}
if (model instanceof RedirectAttributes) {
Map<String, ?> flashAttributes = ((RedirectAttributes) model).getFlashAttributes();
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
RequestContextUtils.getOutputFlashMap(request).putAll(flashAttributes);
}
return mav;
}
@RequestMapping(value="/{language}/categories/{id}", method=RequestMethod.POST)
public @ResponseBody DomainObjectUpdatedModel update(
@Valid CategoryEditForm form,
BindingResult result,
@PathVariable long id,
AuthorizedUser authorizedUser,
HttpServletRequest request,
HttpServletResponse response) throws BindException {
form.setId(id);
if (result.hasErrors()) {
throw new BindException(result);
}
Category category = categoryService.updateCategory(form.buildCategoryUpdateRequest(), authorizedUser);
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);
flashMap.put("updatedCategory", category);
RequestContextUtils.getFlashMapManager(request).saveOutputFlashMap(flashMap, request, response);
return new DomainObjectUpdatedModel<>(category);
}
private void saveFlashAttributes(ModelAndViewContainer mav, NativeWebRequest request, String location) {
mav.setRedirectModelScenario(true);
ModelMap model = mav.getModel();
if (model instanceof RedirectAttributes) {
Map<String, ?> flashAttributes = ((RedirectAttributes) model).getFlashAttributes();
if (!CollectionUtils.isEmpty(flashAttributes)) {
HttpServletRequest req = request.getNativeRequest(HttpServletRequest.class);
HttpServletResponse res = request.getNativeResponse(HttpServletResponse.class);
if (req != null) {
RequestContextUtils.getOutputFlashMap(req).putAll(flashAttributes);
if (res != null) {
RequestContextUtils.saveOutputFlashMap(location, req, res);
}
}
}
}
}
/**
* Print {@link MvcResult} details.
*/
@Override
public final void handle(MvcResult result) throws Exception {
this.printer.printHeading("MockHttpServletRequest");
printRequest(result.getRequest());
this.printer.printHeading("Handler");
printHandler(result.getHandler(), result.getInterceptors());
this.printer.printHeading("Async");
printAsyncResult(result);
this.printer.printHeading("Resolved Exception");
printResolvedException(result.getResolvedException());
this.printer.printHeading("ModelAndView");
printModelAndView(result.getModelAndView());
this.printer.printHeading("FlashMap");
printFlashMap(RequestContextUtils.getOutputFlashMap(result.getRequest()));
this.printer.printHeading("MockHttpServletResponse");
printResponse(result.getResponse());
}
/**
* 获得国际化信息
*
* @param request
* HttpServletRequest
* @param code
* 国际化代码
* @param args
* 替换参数
* @return
* @see org.springframework.context.MessageSource#getMessage(String,
* Object[], Locale)
*/
public static String getMessage(HttpServletRequest request, String code,
Object... args) {
WebApplicationContext messageSource = RequestContextUtils
.getWebApplicationContext(request);
if (messageSource == null) {
throw new IllegalStateException("WebApplicationContext not found!");
}
LocaleResolver localeResolver = RequestContextUtils
.getLocaleResolver(request);
Locale locale;
if (localeResolver != null) {
locale = localeResolver.resolveLocale(request);
} else {
locale = request.getLocale();
}
return messageSource.getMessage(code, args, locale);
}
@GetMapping(value = "/message")
@ResponseBody
public String message(HttpServletRequest request) {
//获取当前的本地区域信息
Locale locale = LocaleContextHolder.getLocale();
//或者
Locale locale1 = RequestContextUtils.getLocale(request);
Locale aDefault = Locale.getDefault();
//不能使用Locale.ENGLISH
Locale english = Locale.US;
//不能Locale.CHINESE
Locale chinese = Locale.CHINA;
//其中第二个参数为占位符数据
String welcome = messageSource.getMessage("welcome", null, english);
String hello = messageSource.getMessage("hello", new String[]{"i18n"}, english);
String welcome1 = messagesUtil.getMessage("welcome", chinese);
String hello1 = messagesUtil.getMessage("hello", new String[]{"i18n"}, chinese);
System.out.println(hello1 + welcome1);
return hello + welcome;
}
@RequestMapping(value="/{language}/categories", method=RequestMethod.POST)
public @ResponseBody DomainObjectSavedModel save(
@Valid CategoryCreateForm form,
BindingResult result,
AuthorizedUser authorizedUser,
HttpServletRequest request,
HttpServletResponse response) throws BindException {
if (result.hasErrors()) {
throw new BindException(result);
}
Category category = categoryService.createCategory(form.buildCategoryCreateRequest(), authorizedUser);
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);
flashMap.put("savedCategory", category);
RequestContextUtils.getFlashMapManager(request).saveOutputFlashMap(flashMap, request, response);
return new DomainObjectSavedModel<>(category);
}
/**
* Find the registered {@link RequestDataValueProcessor}, if any, and allow
* it to update the redirect target URL.
* @param targetUrl the given redirect URL
* @return the updated URL or the same as URL as the one passed in
*/
protected String updateTargetUrl(String targetUrl, Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) {
WebApplicationContext wac = getWebApplicationContext();
if (wac == null) {
wac = RequestContextUtils.findWebApplicationContext(request, getServletContext());
}
if (wac != null && wac.containsBean(RequestContextUtils.REQUEST_DATA_VALUE_PROCESSOR_BEAN_NAME)) {
RequestDataValueProcessor processor = wac.getBean(
RequestContextUtils.REQUEST_DATA_VALUE_PROCESSOR_BEAN_NAME, RequestDataValueProcessor.class);
return processor.processUrl(request, targetUrl);
}
return targetUrl;
}
private void saveFlashAttributes(ModelAndViewContainer mav, NativeWebRequest request, String location) {
mav.setRedirectModelScenario(true);
ModelMap model = mav.getModel();
if (model instanceof RedirectAttributes) {
Map<String, ?> flashAttributes = ((RedirectAttributes) model).getFlashAttributes();
if (!CollectionUtils.isEmpty(flashAttributes)) {
HttpServletRequest req = request.getNativeRequest(HttpServletRequest.class);
HttpServletResponse res = request.getNativeResponse(HttpServletResponse.class);
if (req != null) {
RequestContextUtils.getOutputFlashMap(req).putAll(flashAttributes);
if (res != null) {
RequestContextUtils.saveOutputFlashMap(location, req, res);
}
}
}
}
}
/**
* Find the registered {@link RequestDataValueProcessor}, if any, and allow
* it to update the redirect target URL.
* @param targetUrl the given redirect URL
* @return the updated URL or the same as URL as the one passed in
*/
protected String updateTargetUrl(String targetUrl, Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) {
WebApplicationContext wac = getWebApplicationContext();
if (wac == null) {
wac = RequestContextUtils.findWebApplicationContext(request, getServletContext());
}
if (wac != null && wac.containsBean(RequestContextUtils.REQUEST_DATA_VALUE_PROCESSOR_BEAN_NAME)) {
RequestDataValueProcessor processor = wac.getBean(
RequestContextUtils.REQUEST_DATA_VALUE_PROCESSOR_BEAN_NAME, RequestDataValueProcessor.class);
return processor.processUrl(request, targetUrl);
}
return targetUrl;
}
/**
* Print {@link MvcResult} details.
*/
@Override
public final void handle(MvcResult result) throws Exception {
this.printer.printHeading("MockHttpServletRequest");
printRequest(result.getRequest());
this.printer.printHeading("Handler");
printHandler(result.getHandler(), result.getInterceptors());
this.printer.printHeading("Async");
printAsyncResult(result);
this.printer.printHeading("Resolved Exception");
printResolvedException(result.getResolvedException());
this.printer.printHeading("ModelAndView");
printModelAndView(result.getModelAndView());
this.printer.printHeading("FlashMap");
printFlashMap(RequestContextUtils.getOutputFlashMap(result.getRequest()));
this.printer.printHeading("MockHttpServletResponse");
printResponse(result.getResponse());
}
/**
* Convert model to request parameters and redirect to the given URL.
* @see #appendQueryProperties
* @see #sendRedirect
*/
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
HttpServletResponse response) throws IOException {
String targetUrl = createTargetUrl(model, request);
targetUrl = updateTargetUrl(targetUrl, model, request, response);
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);
if (!CollectionUtils.isEmpty(flashMap)) {
UriComponents uriComponents = UriComponentsBuilder.fromUriString(targetUrl).build();
flashMap.setTargetRequestPath(uriComponents.getPath());
flashMap.addTargetRequestParams(uriComponents.getQueryParams());
FlashMapManager flashMapManager = RequestContextUtils.getFlashMapManager(request);
if (flashMapManager == null) {
throw new IllegalStateException("FlashMapManager not found despite output FlashMap having been set");
}
flashMapManager.saveOutputFlashMap(flashMap, request, response);
}
sendRedirect(request, response, targetUrl, this.http10Compatible);
}
/**
* Find the registered {@link RequestDataValueProcessor}, if any, and allow
* it to update the redirect target URL.
* @param targetUrl the given redirect URL
* @return the updated URL or the same as URL as the one passed in
*/
protected String updateTargetUrl(String targetUrl, Map<String, Object> model,
HttpServletRequest request, HttpServletResponse response) {
WebApplicationContext wac = getWebApplicationContext();
if (wac == null) {
wac = RequestContextUtils.findWebApplicationContext(request, getServletContext());
}
if (wac != null && wac.containsBean(RequestContextUtils.REQUEST_DATA_VALUE_PROCESSOR_BEAN_NAME)) {
RequestDataValueProcessor processor = wac.getBean(
RequestContextUtils.REQUEST_DATA_VALUE_PROCESSOR_BEAN_NAME, RequestDataValueProcessor.class);
return processor.processUrl(request, targetUrl);
}
return targetUrl;
}
private ModelAndView getModelAndView(ModelAndViewContainer mavContainer,
ModelFactory modelFactory, NativeWebRequest webRequest) throws Exception {
modelFactory.updateModel(webRequest, mavContainer);
if (mavContainer.isRequestHandled()) {
return null;
}
ModelMap model = mavContainer.getModel();
ModelAndView mav = new ModelAndView(mavContainer.getViewName(), model, mavContainer.getStatus());
if (!mavContainer.isViewReference()) {
mav.setView((View) mavContainer.getView());
}
if (model instanceof RedirectAttributes) {
Map<String, ?> flashAttributes = ((RedirectAttributes) model).getFlashAttributes();
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
RequestContextUtils.getOutputFlashMap(request).putAll(flashAttributes);
}
return mav;
}
@GetMapping
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) {
Map<String, Object> map = new HashMap<>();
List<TransferStatus> streamStatuses = statusService.getAllStreamStatuses();
List<TransferStatus> downloadStatuses = statusService.getAllDownloadStatuses();
List<TransferStatus> uploadStatuses = statusService.getAllUploadStatuses();
Locale locale = RequestContextUtils.getLocale(request);
List<TransferStatusHolder> transferStatuses = new ArrayList<>();
for (int i = 0; i < streamStatuses.size(); i++) {
long minutesAgo = streamStatuses.get(i).getMillisSinceLastUpdate() / 1000L / 60L;
if (minutesAgo < 60L) {
transferStatuses.add(new TransferStatusHolder(streamStatuses.get(i), true, false, false, i, locale));
}
}
for (int i = 0; i < downloadStatuses.size(); i++) {
transferStatuses.add(new TransferStatusHolder(downloadStatuses.get(i), false, true, false, i, locale));
}
for (int i = 0; i < uploadStatuses.size(); i++) {
transferStatuses.add(new TransferStatusHolder(uploadStatuses.get(i), false, false, true, i, locale));
}
map.put("transferStatuses", transferStatuses);
map.put("chartWidth", StatusChartController.IMAGE_WIDTH);
map.put("chartHeight", StatusChartController.IMAGE_HEIGHT);
return new ModelAndView("status","model",map);
}
/**
* Create a Tiles {@link Request}.
* <p>This implementation creates a {@link ServletRequest}.
* @param request the current request
* @param response the current response
* @return the Tiles request
*/
protected Request createTilesRequest(final HttpServletRequest request, HttpServletResponse response) {
return new ServletRequest(this.applicationContext, request, response) {
@Override
public Locale getRequestLocale() {
return RequestContextUtils.getLocale(request);
}
};
}
@Override
public Locale resolveLocale(Request request) {
try {
HttpServletRequest servletRequest = ServletUtil.getServletRequest(request).getRequest();
if (servletRequest != null) {
return RequestContextUtils.getLocale(servletRequest);
}
}
catch (NotAServletEnvironmentException ex) {
// ignore
}
return super.resolveLocale(request);
}
/**
* Convert model to request parameters and redirect to the given URL.
* @see #appendQueryProperties
* @see #sendRedirect
*/
@Override
protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
HttpServletResponse response) throws IOException {
String targetUrl = createTargetUrl(model, request);
targetUrl = updateTargetUrl(targetUrl, model, request, response);
// Save flash attributes
RequestContextUtils.saveOutputFlashMap(targetUrl, request, response);
// Redirect
sendRedirect(request, response, targetUrl, this.http10Compatible);
}
/**
* Return a ModelAndView object with the specified view name.
* <p>The content of the {@link RequestContextUtils#getInputFlashMap
* "input" FlashMap} is also added to the model.
* @see #getViewName()
*/
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response)
throws Exception {
String viewName = getViewName();
if (getStatusCode() != null) {
if (getStatusCode().is3xxRedirection()) {
request.setAttribute(View.RESPONSE_STATUS_ATTRIBUTE, getStatusCode());
}
else {
response.setStatus(getStatusCode().value());
if (getStatusCode().equals(HttpStatus.NO_CONTENT) && viewName == null) {
return null;
}
}
}
if (isStatusOnly()) {
return null;
}
ModelAndView modelAndView = new ModelAndView();
modelAndView.addAllObjects(RequestContextUtils.getInputFlashMap(request));
if (viewName != null) {
modelAndView.setViewName(viewName);
}
else {
modelAndView.setView(getView());
}
return modelAndView;
}
@Test
public void エラーメッセージがフラッシュスコープにセットされ出力される() throws Exception {
MessageContext context = new MessageContext(request);
context.saveErrorMessageToFlash("E-JX_ERRORS_TAG_TEST#0001");
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);
request.setAttribute(MessageContext.ERROR_MESSAGE_KEY_TO_FLASH, flashMap.get(MessageContext.ERROR_MESSAGE_KEY_TO_FLASH));
JseErrorsTag tag = new JseErrorsTag();
tag.setJspContext(page);
tag.doTag();
assertThat(response.getContentAsString(), is("<div class=\"jfw_messages\">"
+ "<p class=\"jfw_err_msg_style\">E-JX_ERRORS_TAG_TEST#0001</p></div>"));
}
/**
* FlashMapに値を書き出します。
*
* @param request
* @param response
* @param attr
* @param value
*/
protected void outputFlashMap(HttpServletRequest request, HttpServletResponse response, String attr, String value) {
val flashMap = RequestContextUtils.getOutputFlashMap(request);
flashMap.put(attr, value);
// flashMapを書き込む
val flashManager = RequestContextUtils.getFlashMapManager(request);
flashManager.saveOutputFlashMap(flashMap, request, response);
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws ServletException {
String newTheme = request.getParameter(this.paramName);
if (newTheme != null) {
ThemeResolver themeResolver = RequestContextUtils.getThemeResolver(request);
if (themeResolver == null) {
throw new IllegalStateException("No ThemeResolver found: not in a DispatcherServlet request?");
}
themeResolver.setThemeName(request, response, newTheme);
}
// Proceed in any case.
return true;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws ServletException {
String newLocale = request.getParameter(getParamName());
if (newLocale != null) {
if (checkHttpMethod(request.getMethod())) {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(request);
if (localeResolver == null) {
throw new IllegalStateException(
"No LocaleResolver found: not in a DispatcherServlet request?");
}
try {
localeResolver.setLocale(request, response, parseLocaleValue(newLocale));
}
catch (IllegalArgumentException ex) {
if (isIgnoreInvalidLocale()) {
if (logger.isDebugEnabled()) {
logger.debug("Ignoring invalid locale value [" + newLocale + "]: " + ex.getMessage());
}
}
else {
throw ex;
}
}
}
}
// Proceed in any case.
return true;
}
private void clearForFlash(String key, String code, MessageType type) {
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);
Messages messages = (Messages) flashMap.get(key);
if (messages == null) return;
if (Strings.isEmpty(code)) {
flashMap.remove(key);
} else {
messages.remove(code);
flashMap.put(key, messages);
}
}
/**
* 设置固定的Locale
* @param locale Locale
*/
public void setFixedLocale(Locale locale) {
LocaleResolver localeResolver = RequestContextUtils.getLocaleResolver(WebContext.getRequest());
if (localeResolver == null) {
throw new IllegalStateException(
"No LocaleResolver found: not in a DispatcherServlet request?");
}
localeResolver.setLocale(WebContext.getRequest(), WebContext.getRequestAttributes().getResponse(), locale);
}
private StrutsPopups initializePopups(ModelMap model, HttpServletRequest request) {
StrutsPopups popups = StrutsPopups.get(model);
if (popups == null) {
popups = new StrutsPopups();
StrutsPopups.put(model, popups);
}
StrutsPopups.put(RequestContextUtils.getOutputFlashMap(request), popups);
return popups;
}
@Override
public Locale resolveLocale(TilesRequestContext context) {
if (context instanceof JspTilesRequestContext) {
PageContext pc = ((JspTilesRequestContext) context).getPageContext();
return RequestContextUtils.getLocale((HttpServletRequest) pc.getRequest());
}
else if (context instanceof ServletTilesRequestContext) {
HttpServletRequest request = ((ServletTilesRequestContext) context).getRequest();
if (request != null) {
return RequestContextUtils.getLocale(request);
}
}
return super.resolveLocale(context);
}
/**
* Create a Tiles {@link Request}.
* <p>This implementation creates a {@link ServletRequest}.
* @param request the current request
* @param response the current response
* @return the Tiles request
*/
protected Request createTilesRequest(final HttpServletRequest request, HttpServletResponse response) {
return new ServletRequest(this.applicationContext, request, response) {
@Override
public Locale getRequestLocale() {
return RequestContextUtils.getLocale(request);
}
};
}
@Test
public void インフォメーションメッセージがフラッシュスコープにセットされ出力されない() throws Exception {
MessageContext context = new MessageContext(request);
context.saveInformationMessageToFlash("I-JX_INFORMATIONS_TAG_TEST#0001");
FlashMap flashMap = RequestContextUtils.getOutputFlashMap(request);
request.setAttribute(MessageContext.INFORMATION_MESSAGE_KEY_TO_FLASH, flashMap.get(MessageContext.INFORMATION_MESSAGE_KEY_TO_FLASH));
JseErrorsTag tag = new JseErrorsTag();
tag.setJspContext(page);
tag.doTag();
assertThat(response.getContentAsString(), is(""));
}
/**
* Retrieves the URL path to use for lookup and delegates to
* {@link #getViewNameForRequest}. Also adds the content of
* {@link RequestContextUtils#getInputFlashMap} to the model.
*/
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) {
String viewName = getViewNameForRequest(request);
if (logger.isTraceEnabled()) {
logger.trace("Returning view name '" + viewName + "'");
}
return new ModelAndView(viewName, RequestContextUtils.getInputFlashMap(request));
}