发表于: 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的运作。


返回列表 返回列表
评论

    分享到