发表于: 2017-10-13 22:09:48
1 648
一 今天完成的事情:
1 从实例中学习SpringMVC
学习Spring实战第五章:
使用SpringMVC开发基于java注解形式(不使用xml)的Web应用
SpringMVC通过DispatcherServlet接受、处理请求并返回响应。
(1)接受请求后,通过处理器映射(handle Mapping)根据URL来确定使用哪个控制器(controller)。
(2)DispatherServlet将请求发给对应的控制器,控制器完成逻辑处理后产生一些信息,称为模型(model)。打包模型,标识逻辑视图名并返回。
(3)通过视图解析器(view resolve)将逻辑视图名匹配为特定的视图实现并返回。
(4)输出这个视图响应。
实例:Spittr应用
(1)配置一个DispatcherServlet:
创建SpittrWebAppInitializer类继承AbstractAnnotationConfigDispatcherServletInitializer
重写3个方法:
根配置上下文 protected Class<?>[] getRootConfigClasses() {return new Class<?>[] {RootConfig.class}; }
Web配置上下文 protected Class<?>[] getServletConfigClasses() {return new Class<?>[] {WebConfig.class};}
映射DispatcherServlet到"/" protected String[] getServletMappings() {return new String[] {"/"};}
(2)WebConfig配置:
①启用组件扫描
@Configuration//注明配置
@EnableWebMvc //启用SpringMVC
@ComponentScan("spitter.web") //启用组件扫描
创建Webconfig 继承WebMvcConfigurerAdapter
②配置视图解析器
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");//添加前缀
resolver.setSuffix(".jsp");//添加后缀
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
③配置静态资源的处理
public void configureDefalutServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();//使得DispatcherServlet将对静态资源的请求转发到Servlet容器中的默认Servlet
}
(3)RootConfig:
@Configuration
@ComponentScan(basePackages= {"spitter"},
excludeFilters= {
@Filter(type=FilterType.ANNOTATION, value=EnableWebMvc.class)
})//这是说的啥?
public class RootConfig {}//
(4)控制器HomeController:处理对"/"的GET请求,返回视图名home
@Controller //控制型的组件
public class HomeController {
@RequestMapping(value="/", method=GET)
public String home() {
return "home";
}
}
(5)JSP 照着写的
(6)测试 (MockMvc类的学习先放置一边)
@Test
public void testHome() throws Exception{
HomeController controller = new HomeController();
MockMvc mockMvc = standaloneSetup(controller).build();
mockMvc.perform(get("/")).andExpect(view().name("home"));
}
下一个列举出来的测试啃不动,只能让他跑了起来(要添加mockito-core包):
@Test
public void shouldShowRecentSpittles() throws Exception {
List<Spittle> expectedSpittles = createSpittleList(20);
SpittleRepository mockRepository =
mock(SpittleRepository.class);
when(mockRepository.findSpittles(Long.MAX_VALUE, 20))
.thenReturn(expectedSpittles);
SpittleController controller =
new SpittleController(mockRepository);
MockMvc mockMvc = standaloneSetup(controller).
setSingleView(
new InternalResourceView("/WEB-INF/view/spittles.jsp"))
.build();
mockMvc.perform(get("/spittles"))
.andExpect(view().name("spittles"))
.andExpect(model().attributeExists("spittleList"))
.andExpect(model().attribute("spittleList",
hasItems(expectedSpittles.toArray())));
}
private List<Spittle> createSpittleList(int count) {
List<Spittle> spittes = new ArrayList<Spittle>();
for(int i = 0 ; i < count ;i++) {
spittes.add(new Spittle("Spittle " + i, new Date()));
}
return spittes;
}
二 明天计划的事情:
继续SpringMVC的学习和熟悉。
三 遇到的问题:
1错误:
The type javax.servlet.ServletException cannot be resolved. It is indirectly referenced from required .class files
原因:缺少servlet-api.jar
解决:从tomcat/lib中导入包
java.lang.NoSuchMethodError: org.hamcrest.Matcher.describeMismatch(Ljava/lang/Object;Lorg/hamcrest/Description;)V
原因:包冲突。。。
解决:更换jar
JUnit 4.12
hamcrest-core 1.3
mockito-core 1.10.19
2 Spring实战的例子牵涉很多,会出现很多细节如Mock模拟测试类的运用。感觉很难。
四 收获:
通过SpringMVC的简单练习,对于基础框架有一定程度的了解。了解了一点DispatcherServlet的运作。
评论