Spring JPetStore学习小结(3)
※ Web层
Web层是Spring JPetStore相对最为复杂的地方。Spring JPetStore同时支持了两种Web Framework:Struts和Spring Web MVC,分别位于org.springframework.samples.jpetstore.web.struts和org.springframework.samples.jpetstore.web.spring这两个包内。两者的切换只需要修改一下web.xml文件的相应配置即可。如果选择Spring Web MVC,则:
<servlet>
<servlet-name>petstore</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
DispatcherServlet是Spring Web MVC中负责请求调度的核心引擎,通过内嵌的<init-param>节点可以为其配置名为“contextConfigLocation”的
参数,该参数指定了Spring专属的Application Context配置文件的位置。如果忽略此设定,则默认为“/WEB-INF/<servlet name>-servlet.xml”,其中<servlet name>以此处的Servlet名替换(比如:petstore-servlet.xml)
在org.springframework.samples.jpetstore.web.spring包中,绝大部分类属于Controller,它们均维护了一个PetStoreFacade的实例变量,通过PetStoreFacade来访问业务层的功能。利用Spring的配置文件petstore-servlets.xml,可以将PetStoreFacade的实现类(PetStoreImpl)通过reference bean的方式“注入”到各个Controller中。
这些Controller几乎都实现自org.springframework.web.servlet.mvc.Controller接口,该接口只有一个抽象方法:
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response);
handleRequest的处理逻辑大致是:
- 从request中获取信息(并没有什么特别的,一切数据都是通过request以及session在众多jsp页面和controller间传递的)
- 调用相应的petStore业务方法(处理Cart相关的Controller例外)
- 装配并返回ModelAndView实例
- 由于可以在handleRequest中直接操纵response,因此另一种返回形式是调用reponse.sendRedirect
从中可以看出,这是与Servlet API紧密耦合的。
