《Spring实战》摘录 - 11
101
Q: #5.2.3-1 | 测试SpittleController处理针对“/spittles”的GET请求
A:
@Test
public void shouldShowRecentSpittles() throws Exception{
List<Spittle> expectedSpittles = createSpittleList(20);
SpittleRepository mockRepository = mock(SpittleRepository.class); // Mock Repository
when(mockRepository.findSpittles(Long.MAX_VALUE,20)).thenReturn(expectedSpittles);
SpittleController controller = new SpittleController(mockRepository);
MockMvc mockMvc = standaloneSetup(controller).setSingleView(new InternalResourceView(“/WEB-INF/views/spittles.jsp”)).build(); //Mock Spring MVC
mockMvc.perform(get(“/spittles”)) // 对”/spittles”发起GET请求
.andExpect(view().name(“spittles”))
.andExpect(model().attributeExists(“spittleList”))
.andExpect(model().attribute(“spittleList”, hasItems(expectedSpittles.toArray()))); //断言期望的值
}
…
private List<Spittle> createSpittleList(int count){
List<Spittle> spittles = new ArrayList<Spittles>();
for(int i=0; i<count; i++){
spittles.add(new Spittle(“Spittle ” + i, new Date()));
}
return spittles;
}
102
Q: #5.3-1 | Spring MVC允许以多种方式将客户端中的数据传送到控制器的处理器方法中,包括
A:
- 查询参数(Query Parameter)。
- 表单参数(Form Parameter)。
- 路径变量(Path Variable)。
103
Q: # 5.4-1 | 网络编程中,表单的作用
A: 展现表单以及处理用户通过表单提交的数据
104
Q: #5.4.1-1 | 当InternalResourceViewResolver看到视图格式中的“redirect:”前缀时,InternalResourceViewResolver会知道些什么?
A: 它就知道要将其解析为重定向的规则,而不是视图的名称
105
Q: #5.4.1-2 |
除了“redirect:”,InternalResourceViewResolver还能识别“forward:”前缀。当它发现视图格式中以“forward:”作为前缀时,它会怎么做?
A: 请求将会前往(forward)指定的URL路径,而不再是重定向。
106
Q: #5.4.2-1 | Java校验API所提供的校验注解
A:
- @AssertFalse - 所注解的元素必须是Boolean类型,并且值为false
- @AssertTrue - 所注解的元素必须是Boolean类型,并且值为true
- @DecimalMax - 所注解的元素必须是数字,并且它的值要小于或等于给定的BigDecimalString值
- @DecimalMin - 所注解的元素必须是数字,并且它的值要大于或等于给定的BigDecimalString值
- @Digits - 所注解的元素必须是数字,并且它的值必须有指定的位数
- @Future - 所注解的元素的值必须是一个将来的日期
- @Max - 所注解的元素必须是数字,并且它的值要小于或等于给定的值
- @Min - 所注解的元素必须是数字,并且它的值要大于或等于给定的值
- @NotNull - 所注解元素的值必须不能为null
- @Null - 所注解元素的值必须为null
- @Past - 所注解的元素的值必须是一个已过去的日期
- @Pattern - 所注解的元素的值必须匹配给定的正则表达式
- @Size - 所注解的元素的值必须是String、集合或数组,并且它的长度要符合给定的范围
107
Q: #6.1-1 | Spring自带了13个视图解析器,能够将逻辑视图名转换为物理实现
A:
- BeanNameViewResolver - 将视图解析为Spring应用上下文中的bean,其中bean的ID与视图的名字相同
- ContentNegotiatingViewResolver - 通过考虑客户端需要的内容类型来解析视图,委托给另外一个能够产生对应内容类型的视图解析器
- FreeMarkerViewResolver - 将视图解析为FreeMarker模板
- InternalResourceViewResolver - 将视图解析为Web应用的内部资源(一般为JSP)
- JasperReportsViewResolver - 将视图解析为JasperReports定义
- ResourceBundleViewResolver - 将视图解析为资源bundle(一般为属性文件)
- TilesViewResolver - 将视图解析为Apache Tile定义,其中tile ID与视图名称相同。注意有两个不同的TilesViewResolver实现,分别对应于Tiles 2.0和Tiles 3.0
- UrlBasedViewResolver - 直接根据视图的名称解析视图,视图的名称会匹配一个物理视图的定义
- VelocityLayoutViewResolver - 将视图解析为Velocity布局,从不同的Velocity模板中组合页面
- VelocityViewResolver - 将视图解析为Velocity模板
- XmlViewResolver - 将视图解析为特定XML文件中的bean定义。类似于BeanName-ViewResolver
- XsltViewResolver - 将视图解析为XSLT转换后的结果
108
Q: #6.2-1 | Spring提供了两种支持JSP视图的方式:
A:
- InternalResourceViewResolver会将视图名解析为JSP文件。另外,如果在你的JSP页面中使用了JSP标准标签库(JavaServer Pages Standard Tag Library,JSTL)的话,InternalResourceViewResolver能够将视图名解析为JstlView形式的JSP文件,从而将JSTL本地化和资源bundle变量暴露给JSTL的格式化(formatting)和信息(message)标签。
- Spring提供了两个JSP标签库,一个用于表单到模型的绑定,另一个提供了通用的工具类特性。
109
Q: #6.2.1-1 | InternalResourceViewResolver解析视图时,会在视图名上添加前缀和后缀,请画出相应的图
A:
110
Q: #6.2.1-2 | 使用@Bean注解的时候,我们可以按照如下的方式配置Internal-ResourceView Resolver,使其在解析视图时,可以自动加上前后缀
A:
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver =
new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
//作为替代方案,如果你更喜欢使用基于XML的Spring配置,那么可以按照如下的方式配置InternalResourceViewResolver:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.
InternalResourceViewResolver"
p:prefix="/WEB-INF/views/"
p:suffix=".jsp" />