SpringMVC第四天

Spring MVC 使用闪存属性
Flash属性(flash attributes)提供了一个请求为另一个请求存储有用属性的方法。
这在重定向的时候最常使用,比如常见的 POST/REDIRECT/GET 模式。
Flash属性会在重定向前被暂时地保存起来(通常是保存在session中),
重定向后会重新被下一个请求取用并立即从原保存地移除。
为支持flash属性,Spring MVC提供了两个抽象。
FlashMap被用来存储flash属性,而用FlashMapManager来存储、取回、管理FlashMap的实例。
对flash属性的支持默认是启用的,并不需要显式声明,
不过没用到它时它绝不会主动地去创建HTTP会话(session)。
对于每个请求,框架都会“传进”一个FlashMap,里面存储了从上个请求(如果有)保存下来的属性;
同时,每个请求也会“输出”一个FlashMap,里面保存了要给下个请求使用的属性。
两个FlashMap实例在Spring MVC应用中的任何地点都可以通过RequestContextUtils工具类的静态方法取得。
控制器通常不需要直接接触FlashMap。
一般是通过@RequestMapping方法去接受一个RedirectAttributes类型的参数,
然后直接地往其中添加flash属性。
通过RedirectAttributes对象添加进去的flash属性会自动被填充到请求的“输出”FlashMap对象中去。
类似地,重定向后“传进”的FlashMap属性也会自动被添加到服务重定向URL的控制器参数Model中去。
·····
public interface RedirectAttributes extends Model {

@Override
RedirectAttributes addAttribute(String attributeName, @Nullable Object attributeValue);

@Override
RedirectAttributes addAttribute(Object attributeValue);

@Override
RedirectAttributes addAllAttributes(Collection<?> attributeValues);

@Override
RedirectAttributes mergeAttributes(Map<String, ?> attributes);

/**
* Add the given flash attribute.
* @param attributeName the attribute name; never {@code null}
* @param attributeValue the attribute value; may be {@code null}
*/
RedirectAttributes addFlashAttribute(String attributeName, @Nullable Object attributeValue);

/**
* Add the given flash storage using a
* {@link org.springframework.core.Conventions#getVariableName generated name}.
* @param attributeValue the flash attribute value; never {@code null}
*/
RedirectAttributes addFlashAttribute(Object attributeValue);

/**
* Return the attributes candidate for flash storage or an empty Map.
*/
Map<String, ?> getFlashAttributes();

@RequiresPermissions("lifeCycle:" + PermissionConstants.ADD_PERMISSION)
@RequestMapping(value = "EquipmentSave")
public String EquipmentSave(DdpBase ddpBase, RedirectAttributes redirectAttributes) {
equipmentBasicService.cascadeDynamicsSaveDdpBaseAndDdpNameplate(ddpBase, ddpBase.getDdpNameplate());
String id = ddpBase.getDigitalPowerPlantId();
addMessage(redirectAttributes, "flash--应用over");
return redirect("redirect:listEquipment?digitalPowerPlantId=" + id, redirectAttributes);
}
匹配请求所使用的flash属性:
	flash属性的概念在其他许多的Web框架中也存在,
	并且实践证明有时可能会导致并发上的问题。这是因为从定义上讲,
	flash属性保存的时间是到下个请求接收到之前。问题在于,“下一个”请求不一定刚好就是你要重定向到的那个请求,
	它有可能是其他的异步请求(比如polling请求或者资源请求等)。这会导致flash属性在到达真正的目标请求前就被移除了。
	为了减少这个问题发生的可能性,
	重定向视图RedirectView会自动为一个FlashMap实例记录其目标重定向URL的路径和查询参数。
	然后,默认的FlashMapManager会在为请求查找其该“传进”的FlashMap时,匹配这些信息。
	这并不能完全解决重定向的并发问题,但极大程度地减少了这种可能性,
	因为它可以从重定向URL已有的信息中来做匹配。
	因此,一般只有在重定向的场景下,我们才推荐使用flash属性。

Spring MVC 构造URI
1 在Spring MVC中,使用了UriComponentsBuilder和UriComponents两个类来提供URI的加密解密。
UriComponents uriComponents = UriComponentsBuilder.fromUriString(
“http://example.com/hotels/{hotel}/bookings/{booking}”).build();
URI uri = uriComponents.expand(“42”, “21”).encode().toUri();
UriComponents是不可变对象。因此expand()与encode()操作在必要的时候会返回一个新的实例。
2 也可以使用一个URI组件实例对象来实现URI的填充与加密:
UriComponents uriComponents = UriComponentsBuilder.newInstance()
.scheme(“http”).host(“example.com”).path("/hotels/{hotel}/bookings/{booking}").build()
.expand(“42”, “21”)
.encode();
3 在servlet开发中,可以使用ServletUriComponentsBuilder类 提供一个静态工厂方法 可以从请求获取URI
ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromContextPath(request)
.path("/accounts").build()
4 如果DispatchServlet是通过名字请求映射的,还可以通过DispatchServlet获取请求
ServletUriComponentsBuilder ucb = ServletUriComponentsBuilder.fromServletMapping(request)
.path("/accounts").build(),也是基于父类Servlet的静态工厂方法
Spring MVC 提供地区信息
DispatcherServlet为你提供了自动使用用户的地区信息来解析消息的能力。而这,是通过LocaleResolver对象来完成的。
一个请求进入处理时,DispatcherServlet会查找一个地区解析器。如果找到,就尝试使用它来设置地区相关的信息。
通过调用RequestContext.getLocale()都能取到地区解析器所解析到的地区信息。
此外,如果你需要自动解析地区信息,你可以在处理器映射前加一个拦截器
Spring MVC 获取时区信息
除了获取客户端的地区信息外,有时他们所在的时区信息也非常有用。
LocaleContextResolver接口为LocaleResolver提供了拓展点,
允许解析器在LocaleContext中提供更多的信息,这里面就可以包含时区信息。
如果用户的时区信息能被解析到,那么你总可以通过RequestContext.getTimeZone()方法获得。
时区信息会自动被SpringConversionService下注册的日期/时间转换器Converter及格式化对象Formatter所使用。
SpringMVC Accept请求头解析器
AcceptHeaderLocaleResolver解析器会检查客户端(比如,浏览器,等)
所发送的请求中是否携带accept-language请求头。通常,该请求头字段中包含了客户端操作系统的地区信息。
不过请注意,该解析器不支持时区信息的解析。()
SpringMVC Cookie解析器
CookieLocaleResolver解析会检查客户端是否有Cookie,里面可能存放了地区Locale或时区TimeZone信息。
如果检查到相应的值,解析器就使用它们。通过该解析器的属性,你可以指定cookie的名称和其最大的存活时间。
定义一个CookieLocaleResolver:





CookieLocaleResolver的属性
(cookie名)cookieName: 默认值classname + LOCALE
cookieMaxAge:默认值 Integer.MAX_INT
(cookie被保存在客户端的最长时间。如果该值为-1,
那么cookie将不会被持久化,在客户端浏览器关闭之后就失效了)
cookiePath:存放位置 默认为/
SpringMVC Session解析器
SessionLocaleResolver允许你从session中取得可能与用户请求相关联的地区Locale和时区TimeZone信息。
与CookieLocaleResolver不同,这种存取策略仅将Servlet容器的HttpSession中相关的地区信息存取到本地。
因此,这些设置仅会为该会话(session)临时保存,session结束后,这些设置就会失效。
但该解析器与其他外部session管理机制,比如Spring的Session项目等,并没有直接联系。
该SessionLocaleResolver仅会简单地从与当前请求HttpServletRequest相关的HttpSession对象中,
取出对应的属性,并修改其值,仅此而已
SpringMVC地区更改拦截器
你可以在处理器映射前添加一个LocaleChangeInterceptor拦截器来更改地区信息。
它能检测请求中的参数,并根据其值相应地更新地区信息。
它通过调用LocaleResolver的setLocale()方法来更改地区。
.view路径并且携带了siteLanguage参数的资源请求更改地区。
一个URL为http://www.sf.net/home.view?siteLanguage=nl的请求将会将站点语言更改为荷兰语。











/**/
.view=someController

©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页