上一文安装篇讲述了如何把jpetstore导入netbeans工程,现在所有已经准备就绪,接下来就可以开始进入正题了。
首先,我先大概介绍一下jpetstore的整体架构,spring的这个版本主要使用了struts+spring+ibatis的框架组合,
而在MVC层的框架,这个版本又同时提供了两个实现版本,一个是struts,一个是spring 自带的web框架,
而数据库持久层使用的是ibatis框架,这个框架是一个SQL映射框架,轻量级而且使用非常容易,基本上会
使用JDBC的朋友看一两个小时就会使用了。
下图是该应用的一个简略架构图,没有什么好的工具,就大概画了一个,虽然比较简单,不过也基本可以
概括应用的整体框架了,首先是JSP请求,通过struts-config.xml(这里只是根据struts来画的,spring其实也差不多),
请求转到相应的Action中,可以看到,这里有一个BaseAction,是所有Action实现的父类,这个类的作用稍后再讲,
然后就是每个Action通过PetStoreFacade的对象调用后台DAO对象,从而通过ibatis进行数据的持久操作,
这里使用了门面(Facade)模式,隔离了前台与后台耦合度,而PetStoreFacade就是这个门面。结合下图,
相信大家对整个jpetstore会有个大概的了解。

好了,大概的结构讲了下,接下来我们就从代码入手,在这里考虑到struts大家比较熟悉,因此,
本文是以struts版本来讲,同时声明,本文并不会一段段代码详细讲述,而只是提供一个学习的参考,
大概讲解一下流程,让大家不再茫然不知从哪开始,好了,废话也不多说了。
既然是WEB应用,那当然首先从配置文件看起,那就非web.xml莫属了,打开WEB-INF目录下的web.xml,
我们挑出目前我们应该关注的配置代码:
代码
petstore
org.springframework.web.servlet.DispatcherServlet
2
action
org.apache.struts.action.ActionServlet
3
petstore
*.do
在这里可看到两个servlet设置,以及一个servlet mapping,第一个petstore的servlet是用于spring web框架的,
而第二个action的servlet就是用于struts的,而这个版本的mapping默认的是使用spring web,可以看到,action这一行是被注释掉了,我们要使用struts的话,那就把这个注释去掉,
改为注释掉petstore,好了,如此注释以后,整个应用就会以struts的框架运行。
(这些配置是什么意思?如果你还搞不懂的话,建议你先去学学基础再来研究应用吧)
接下来我们可以打开strutc-config.xml文件,这里就是struts的默认配置文件,在这里可以看到struts的相关配置信息。
好了,接下来我们就以一个请求来讲述基本的请求流程,以search为例,生成项目,再启动,
成功之后进入应用的首页,我们终于可以看到久违的鹦鹉界面了,激动吧,呵呵,在界面的右上角,
有一个Search文本框,我们就以这个Search为例子来讲解,输入一个关键字cat,然后点search,
结果出来了,这个过程的内部是如何运作的呢?
我们用鼠标右键点击页面,然后选择属性,我们看到显示的地址可能是:
http://localhost:8080/shop/searchProducts.do;jsessionid=E2D01E327B82D068FEE9D073CA33A2A3
这个地址就是我们刚才点击查询时提交的地址了,我们看到searchProducts.do这个字符串,
我们之前在web.xml里面的设置大家还记得吗?
action
*.do
代表着所有以.do为结尾的请求,都将被名叫action的servlet处理,也就是通过struts-config配置进行处理,那我们就去struts-config.xml里面看看,打开struts-config.xml文件,ctrl+F弹出查询界面,输入searchProducts,我们就可查到
struts.SearchProductsAction" name="emptyForm" scope="session" validate="false">
根据以上配置,我们可以得知,刚才我们的提交将会被SearchProductsAction处理,而该action的form是emptyForm,查找emptyForm这个别名,我们可以找到它指向一个BaseActionForm,打开这个form我们可以看到,里面只有两个validate方法和一个addErrorIfStringEmpty方法,没有任何的属性,那就是说search这个提交并没有把我们输入的关键字保存在form里面,打开SearchProductsAction,我们看到execute方法里的第一句就是
String keyword = request.getParameter("keyword");
也就是说我们输入的关键字是以参数的形式传入到request里面,参数名字为“keyword”,我们打开IncludeTop.jsp,这个文件在WEB-INF/jsp/struts目录下。
注意了,jsp目录下分别有spring以及struts两个目录,这两个目录就是分别对应两个web框架的,我们使用的是struts所以jsp代码就到struts目录里面,为什么打开IncludeTop.jsp呢,我们可以看到,无论我们进入哪个页面,search那个文本框都存在,也就是说,这个文本框是被当作一个模板插入到所有页面当中去的,我们随便打开一个页面,就可以看到页面开头都是:
这句就是把IncludeTop.jsp当作页面头部包含进来,所以凡是包含这个头页面的页面,他们的头部都是一样的,这也是我们在开发中常用的一种方式,统一界面的一种方式,我们也可以看到在这些文件尾部也有类似的代码,如:
其作用也是一样。打开IncludeTop.jsp后,我们看到其中有一段代码: