- 浏览: 413744 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
liyuanhoa_:
...
struts2.0中struts.xml配置文件详解 -
chenmingde:
...
Velocity应用(一) -
weizhikai_ai:
第二十六,当一个线程进入一个对象的一个synchronized ...
Java常见面试题(含答案) -
Aurora_lr:
...
Spring宠物商店学习笔记(一) - -
zs911zs:
all copy from http://www.iteye ...
Mule入门文档
相关文章:
springframe中的petstore中的setServlet()什么时候调用
webwork怎么获取spring的ApplicationContext
『讨论』运用Spring做项目1个月有余,过程中遇到一些问题,...
推荐圈子: GT-Grid
更多相关推荐 上一文安装篇讲述了如何把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,我们挑出目前我们应该关注的配置代码:
Java代码
<servlet>
<servlet-name>petstore</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>petstore</servlet-name>
<!--
<servlet-name>action</servlet-name>
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>petstore</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>petstore</servlet-name>
<!--
<servlet-name>action</servlet-name>
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
在这里可看到两个servlet设置,以及一个servlet mapping,第一个petstore的servlet是用于spring web框架的,而第二个action的servlet就是用于struts的,而这个版本的mapping默认的是使用spring web,可以看到,<servlet-name>action</servlet-name>这一行是被注释掉了,我们要使用struts的话,那就把这个注释去掉,改为注释掉<servlet-name>petstore</servlet-name>,好了,如此注释以后,整个应用就会以struts的框架运行。(这些配置是什么意思?如果你还搞不懂的话,建议你先去学学基础再来研究应用吧)
接下来我们可以打开strutc-config.xml文件,这里就是struts的默认配置文件,在这里可以看到struts的相关配置信息。
好了,接下来我们就以一个请求来讲述基本的请求流程,以search为例,生成项目,再启动,成功之后进入应用的首页,我们终于可以看到久违的鹦鹉界面了,激动吧,呵呵,在界面的右上角,有一个Search文本框,我们就以这个Search为例子来讲解,输入一个关键字cat,然后点search,结果出来了,这个过程的内部是如何运作的呢?
我们用鼠标右键点击页面,然后选择属性,我们看到显示的地址可能是:
http://localhost:8080/shop/searchProducts.do;jsessionid=E2D01E327B82D068FEE9D073CA33A2A3
这个地址就是我们刚才点击查询时提交的地址了,我们看到searchProducts.do这个字符串,我们之前在web.xml里面的设置大家还记得吗?
Java代码
<servlet-mapping>
<!--
<servlet-name>petstore</servlet-name>
-->
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!--
<servlet-name>petstore</servlet-name>
-->
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
代表着所有以.do为结尾的请求,都将被名叫action的servlet处理,也就是通过struts-config配置进行处理,那我们就去struts-config.xml里面看看,打开struts-config.xml文件,ctrl+F弹出查询界面,输入searchProducts,我们就可查到
Java代码
<action path="/shop/searchProducts" type="org.springframework.samples.jpetstore.web.struts.SearchProductsAction" name="emptyForm" scope="session" validate="false">
<forward name="success" path="/WEB-INF/jsp/struts/SearchProducts.jsp"/>
</action>
<action path="/shop/searchProducts" type="org.springframework.samples.jpetstore.web.struts.SearchProductsAction" name="emptyForm" scope="session" validate="false">
<forward name="success" path="/WEB-INF/jsp/struts/SearchProducts.jsp"/>
</action>
根据以上配置,我们可以得知,刚才我们的提交将会被SearchProductsAction处理,而该action的form是emptyForm,查找emptyForm这个别名,我们可以找到它指向一个BaseActionForm,打开这个form我们可以看到,里面只有两个validate方法和一个addErrorIfStringEmpty方法,没有任何的属性,那就是说search这个提交并没有把我们输入的关键字保存在form里面,打开SearchProductsAction,我们看到execute方法里的第一句就是:
Java代码
String keyword = request.getParameter("keyword");
String keyword = request.getParameter("keyword");
也就是说我们输入的关键字是以参数的形式传入到request里面,参数名字为“keyword”,我们打开IncludeTop.jsp,这个文件在WEB-INF/jsp/struts目录下。
注意了,jsp目录下分别有spring以及struts两个目录,这两个目录就是分别对应两个web框架的,我们使用的是struts所以jsp代码就到struts目录里面,为什么打开IncludeTop.jsp呢,我们可以看到,无论我们进入哪个页面,search那个文本框都存在,也就是说,这个文本框是被当作一个模板插入到所有页面当中去的,我们随便打开一个页面,就可以看到页面开头都是:
Java代码
<%@ include file="IncludeTop.jsp" %>
<%@ include file="IncludeTop.jsp" %>
这句就是把IncludeTop.jsp当作页面头部包含进来,所以凡是包含这个头页面的页面,他们的头部都是一样的,这也是我们在开发中常用的一种方式,统一界面的一种方式,我们也可以看到在这些文件尾部也有类似的代码,如:
Java代码
<%@ include file="IncludeBottom.jsp" %>
<%@ include file="IncludeBottom.jsp" %>
其作用也是一样。打开IncludeTop.jsp后,我们看到其中有一段代码:
Java代码
<form action="<c:url value="/shop/searchProducts.do"/>" method="post">
<input type="hidden" name="search" value="true"/>
<input name="keyword" size="14"/> <input border="0" src="../images/search.gif" type="image" name="search"/>
</form>
<form action="<c:url value="/shop/searchProducts.do"/>" method="post">
<input type="hidden" name="search" value="true"/>
<input name="keyword" size="14"/> <input border="0" src="../images/search.gif" type="image" name="search"/>
</form>
这段代码就是我们search文本框以及提交链接的代码,在这里就不做详细介绍了。
好了,接下来我们再看看这个action的后续代码:
Java代码
if (keyword != null) {
if (!StringUtils.hasLength(keyword)) {
request.setAttribute("message", "Please enter a keyword to search for, then press the search button.");
return mapping.findForward("failure");
}
PagedListHolder productList = new PagedListHolder(getPetStore().searchProductList(keyword.toLowerCase()));
productList.setPageSize(4);
request.getSession().setAttribute("SearchProductsAction_productList", productList);
request.setAttribute("productList", productList);
return mapping.findForward("success");
}
if (keyword != null) {
if (!StringUtils.hasLength(keyword)) {
request.setAttribute("message", "Please enter a keyword to search for, then press the search button.");
return mapping.findForward("failure");
}
PagedListHolder productList = new PagedListHolder(getPetStore().searchProductList(keyword.toLowerCase()));
productList.setPageSize(4);
request.getSession().setAttribute("SearchProductsAction_productList", productList);
request.setAttribute("productList", productList);
return mapping.findForward("success");
}
这里第一句就是判断keyword是否为空,不为空就执行其中的代码,我们search的时候这个keyword肯定是不为空的,那就是说这段if包含的代码就是我们search的处理代码了,有的人也许会说,如果我不输入关键字而直接点search呢,这keyword不就是为空了吗?我想这个你在此处加个断点,再运行一下就知道了,虽然你没有输入,但是keyword一样不是null,它将是一个空字符串,而不是空对象。我们看到if里面还包含有一个if,这里就是判断keyword是否为空字符串了,StringUtils.hasLength()方式是一个工具类,用来判断keyword是否为空字符串,如果是空字符串就返回false,而这句判断当返回false时,因为前面有个感叹号,所以值为false就执行被if所包含的语句,里面的代码就是保存一个错误信息,然后return mapping.findForward("failure");,这句的意思就不再解释了。
现在假设我们正确输入keyword,那么程序将不会执行if语句中的代码,直接向下执行,我们看到
Java代码
PagedListHolder productList = new PagedListHolder(getPetStore().searchProductList(keyword.toLowerCase()));
PagedListHolder productList = new PagedListHolder(getPetStore().searchProductList(keyword.toLowerCase()));
这句代码,PagedListHolder是spring提供的一个用来保存查询结构类,通常用来进行分页处理,因此我们可以知道
Java代码
getPetStore().searchProductList(keyword.toLowerCase())
getPetStore().searchProductList(keyword.toLowerCase())
这一句就是用来查询,并返回查询结果的。getPetStore()这个方法是继承自BaseAction的,它将获得一个PetStoreFacade的实现,我们打开BaseAction的代码,可以看到如下代码
Java代码
public void setServlet(ActionServlet actionServlet) {
super.setServlet(actionServlet);
if (actionServlet != null) {
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.petStore = (PetStoreFacade) wac.getBean("petStore");
}
}
public void setServlet(ActionServlet actionServlet) {
super.setServlet(actionServlet);
if (actionServlet != null) {
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.petStore = (PetStoreFacade) wac.getBean("petStore");
}
}
这句代码里面最重要的一句就是
Java代码
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
这句代码的作用就是获取一个WebApplicationContext对象wac,在这里我们只需要知道这个对象的作用,而不对其进行深入研究,通过这个对象,我们可以根据spring的配置文件,获得相应的Bean,下面这句就是用来获取相应bean的语句:
Java代码
this.petStore = (PetStoreFacade) wac.getBean("petStore");
this.petStore = (PetStoreFacade) wac.getBean("petStore");
petStore这个就是bean的id,这个petStore的bean具体是哪个类呢?我们打开applicationContext.xml,可以找到以下配置代码
Java代码
<bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">
<property name="accountDao" ref="accountDao"/>
<property name="categoryDao" ref="categoryDao"/>
<property name="productDao" ref="productDao"/>
<property name="itemDao" ref="itemDao"/>
<property name="orderDao" ref="orderDao"/>
</bean>
<bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">
<property name="accountDao" ref="accountDao"/>
<property name="categoryDao" ref="categoryDao"/>
<property name="productDao" ref="productDao"/>
<property name="itemDao" ref="itemDao"/>
<property name="orderDao" ref="orderDao"/>
</bean>
从这里可以看到,petStoreFacade的具体类就是PetStoreImpl,而这个类当中,分别通过spring IOC注入了几个DAO的bean,这几个DAO的配置可以在dataAccessContext-local.xml文件里面找到,我们打开PetStoreImpl这个实现类,我们看到类里有一个searchProductList方法,这个方法就是我们在Action当中调用的方法
Java代码
return this.productDao.searchProductList(keywords);
return this.productDao.searchProductList(keywords);
从这句代码可以看出,这个方法是通过调用productDao的searchProductList方法来获得结果的,productDao这个DAO从上面的配置文件可以看出,是通过IOC容器进行注入的,我们打开dataAccessContext-local.xml文件,可以看到
Java代码
<bean id="productDao" class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapProductDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
<bean id="productDao" class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapProductDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
这句配置代表了productDao的实现类就是SqlMapProductDao,同时这个类包含有一个sqlMapClient的属性对象,这个对象也是通过ioc注入的,再在这个配置文件里,我们可以找到如下一段代码
Java代码
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
这段代码就是sqlMapClient这个bean的配置,这里的实现是SqlMapClientFactoryBean,它是spring专门为ibatis框架提供的一个支持,通过这个对象就可以很好的集成ibatis框架,具体的介绍可以通过spring官方文档或者是其他一些教程获得,在这里就不多做介绍。
好了,接下来我们知道了,实际查询数据是通过DAO的实现类SqlMapProductDao进行的,而SqlMapProductDao当中就是通过了ibatis进行数据的查询,从而返回结果,这里也就不多做介绍了,大家可以通过ibatis的教程获得ibatis的使用方法,非常的简单,search操作从前台到后台的大概流程就介绍到这里了。
在这个参考文章中,我并没有对具体技术做过多的讲解,那是因为本文只是作为一个研究jpetstore的参考,提供一个可供参考的研究流程,主要是为了那些想开始研究jpetstore但是又不知道从哪开始或者是不知道如何进行研究的新人朋友们而准备的,如果具体的讲解每一部分,那我想将不仅仅是一篇文章就可以完成的事情,因为这里涉及到struts,spring,ibatis等具体的框架技术,每一个框架基本都可以写成一本书,用一篇文章来讲就不太实际了,而且我个人更倾向于遇到不理解的地方的时候,多使用google来搜索,这样能够进一步加深自己对问题的理解。
好了,关于jpetstore源码研究入门的文章就写到这里结束了,由于本人技术和文笔有限,有错漏或者表达不当的地方请不要介意,欢迎各位朋友来指正。
springframe中的petstore中的setServlet()什么时候调用
webwork怎么获取spring的ApplicationContext
『讨论』运用Spring做项目1个月有余,过程中遇到一些问题,...
推荐圈子: GT-Grid
更多相关推荐 上一文安装篇讲述了如何把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,我们挑出目前我们应该关注的配置代码:
Java代码
<servlet>
<servlet-name>petstore</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>petstore</servlet-name>
<!--
<servlet-name>action</servlet-name>
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>petstore</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>petstore</servlet-name>
<!--
<servlet-name>action</servlet-name>
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
在这里可看到两个servlet设置,以及一个servlet mapping,第一个petstore的servlet是用于spring web框架的,而第二个action的servlet就是用于struts的,而这个版本的mapping默认的是使用spring web,可以看到,<servlet-name>action</servlet-name>这一行是被注释掉了,我们要使用struts的话,那就把这个注释去掉,改为注释掉<servlet-name>petstore</servlet-name>,好了,如此注释以后,整个应用就会以struts的框架运行。(这些配置是什么意思?如果你还搞不懂的话,建议你先去学学基础再来研究应用吧)
接下来我们可以打开strutc-config.xml文件,这里就是struts的默认配置文件,在这里可以看到struts的相关配置信息。
好了,接下来我们就以一个请求来讲述基本的请求流程,以search为例,生成项目,再启动,成功之后进入应用的首页,我们终于可以看到久违的鹦鹉界面了,激动吧,呵呵,在界面的右上角,有一个Search文本框,我们就以这个Search为例子来讲解,输入一个关键字cat,然后点search,结果出来了,这个过程的内部是如何运作的呢?
我们用鼠标右键点击页面,然后选择属性,我们看到显示的地址可能是:
http://localhost:8080/shop/searchProducts.do;jsessionid=E2D01E327B82D068FEE9D073CA33A2A3
这个地址就是我们刚才点击查询时提交的地址了,我们看到searchProducts.do这个字符串,我们之前在web.xml里面的设置大家还记得吗?
Java代码
<servlet-mapping>
<!--
<servlet-name>petstore</servlet-name>
-->
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!--
<servlet-name>petstore</servlet-name>
-->
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
代表着所有以.do为结尾的请求,都将被名叫action的servlet处理,也就是通过struts-config配置进行处理,那我们就去struts-config.xml里面看看,打开struts-config.xml文件,ctrl+F弹出查询界面,输入searchProducts,我们就可查到
Java代码
<action path="/shop/searchProducts" type="org.springframework.samples.jpetstore.web.struts.SearchProductsAction" name="emptyForm" scope="session" validate="false">
<forward name="success" path="/WEB-INF/jsp/struts/SearchProducts.jsp"/>
</action>
<action path="/shop/searchProducts" type="org.springframework.samples.jpetstore.web.struts.SearchProductsAction" name="emptyForm" scope="session" validate="false">
<forward name="success" path="/WEB-INF/jsp/struts/SearchProducts.jsp"/>
</action>
根据以上配置,我们可以得知,刚才我们的提交将会被SearchProductsAction处理,而该action的form是emptyForm,查找emptyForm这个别名,我们可以找到它指向一个BaseActionForm,打开这个form我们可以看到,里面只有两个validate方法和一个addErrorIfStringEmpty方法,没有任何的属性,那就是说search这个提交并没有把我们输入的关键字保存在form里面,打开SearchProductsAction,我们看到execute方法里的第一句就是:
Java代码
String keyword = request.getParameter("keyword");
String keyword = request.getParameter("keyword");
也就是说我们输入的关键字是以参数的形式传入到request里面,参数名字为“keyword”,我们打开IncludeTop.jsp,这个文件在WEB-INF/jsp/struts目录下。
注意了,jsp目录下分别有spring以及struts两个目录,这两个目录就是分别对应两个web框架的,我们使用的是struts所以jsp代码就到struts目录里面,为什么打开IncludeTop.jsp呢,我们可以看到,无论我们进入哪个页面,search那个文本框都存在,也就是说,这个文本框是被当作一个模板插入到所有页面当中去的,我们随便打开一个页面,就可以看到页面开头都是:
Java代码
<%@ include file="IncludeTop.jsp" %>
<%@ include file="IncludeTop.jsp" %>
这句就是把IncludeTop.jsp当作页面头部包含进来,所以凡是包含这个头页面的页面,他们的头部都是一样的,这也是我们在开发中常用的一种方式,统一界面的一种方式,我们也可以看到在这些文件尾部也有类似的代码,如:
Java代码
<%@ include file="IncludeBottom.jsp" %>
<%@ include file="IncludeBottom.jsp" %>
其作用也是一样。打开IncludeTop.jsp后,我们看到其中有一段代码:
Java代码
<form action="<c:url value="/shop/searchProducts.do"/>" method="post">
<input type="hidden" name="search" value="true"/>
<input name="keyword" size="14"/> <input border="0" src="../images/search.gif" type="image" name="search"/>
</form>
<form action="<c:url value="/shop/searchProducts.do"/>" method="post">
<input type="hidden" name="search" value="true"/>
<input name="keyword" size="14"/> <input border="0" src="../images/search.gif" type="image" name="search"/>
</form>
这段代码就是我们search文本框以及提交链接的代码,在这里就不做详细介绍了。
好了,接下来我们再看看这个action的后续代码:
Java代码
if (keyword != null) {
if (!StringUtils.hasLength(keyword)) {
request.setAttribute("message", "Please enter a keyword to search for, then press the search button.");
return mapping.findForward("failure");
}
PagedListHolder productList = new PagedListHolder(getPetStore().searchProductList(keyword.toLowerCase()));
productList.setPageSize(4);
request.getSession().setAttribute("SearchProductsAction_productList", productList);
request.setAttribute("productList", productList);
return mapping.findForward("success");
}
if (keyword != null) {
if (!StringUtils.hasLength(keyword)) {
request.setAttribute("message", "Please enter a keyword to search for, then press the search button.");
return mapping.findForward("failure");
}
PagedListHolder productList = new PagedListHolder(getPetStore().searchProductList(keyword.toLowerCase()));
productList.setPageSize(4);
request.getSession().setAttribute("SearchProductsAction_productList", productList);
request.setAttribute("productList", productList);
return mapping.findForward("success");
}
这里第一句就是判断keyword是否为空,不为空就执行其中的代码,我们search的时候这个keyword肯定是不为空的,那就是说这段if包含的代码就是我们search的处理代码了,有的人也许会说,如果我不输入关键字而直接点search呢,这keyword不就是为空了吗?我想这个你在此处加个断点,再运行一下就知道了,虽然你没有输入,但是keyword一样不是null,它将是一个空字符串,而不是空对象。我们看到if里面还包含有一个if,这里就是判断keyword是否为空字符串了,StringUtils.hasLength()方式是一个工具类,用来判断keyword是否为空字符串,如果是空字符串就返回false,而这句判断当返回false时,因为前面有个感叹号,所以值为false就执行被if所包含的语句,里面的代码就是保存一个错误信息,然后return mapping.findForward("failure");,这句的意思就不再解释了。
现在假设我们正确输入keyword,那么程序将不会执行if语句中的代码,直接向下执行,我们看到
Java代码
PagedListHolder productList = new PagedListHolder(getPetStore().searchProductList(keyword.toLowerCase()));
PagedListHolder productList = new PagedListHolder(getPetStore().searchProductList(keyword.toLowerCase()));
这句代码,PagedListHolder是spring提供的一个用来保存查询结构类,通常用来进行分页处理,因此我们可以知道
Java代码
getPetStore().searchProductList(keyword.toLowerCase())
getPetStore().searchProductList(keyword.toLowerCase())
这一句就是用来查询,并返回查询结果的。getPetStore()这个方法是继承自BaseAction的,它将获得一个PetStoreFacade的实现,我们打开BaseAction的代码,可以看到如下代码
Java代码
public void setServlet(ActionServlet actionServlet) {
super.setServlet(actionServlet);
if (actionServlet != null) {
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.petStore = (PetStoreFacade) wac.getBean("petStore");
}
}
public void setServlet(ActionServlet actionServlet) {
super.setServlet(actionServlet);
if (actionServlet != null) {
ServletContext servletContext = actionServlet.getServletContext();
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
this.petStore = (PetStoreFacade) wac.getBean("petStore");
}
}
这句代码里面最重要的一句就是
Java代码
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(servletContext);
这句代码的作用就是获取一个WebApplicationContext对象wac,在这里我们只需要知道这个对象的作用,而不对其进行深入研究,通过这个对象,我们可以根据spring的配置文件,获得相应的Bean,下面这句就是用来获取相应bean的语句:
Java代码
this.petStore = (PetStoreFacade) wac.getBean("petStore");
this.petStore = (PetStoreFacade) wac.getBean("petStore");
petStore这个就是bean的id,这个petStore的bean具体是哪个类呢?我们打开applicationContext.xml,可以找到以下配置代码
Java代码
<bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">
<property name="accountDao" ref="accountDao"/>
<property name="categoryDao" ref="categoryDao"/>
<property name="productDao" ref="productDao"/>
<property name="itemDao" ref="itemDao"/>
<property name="orderDao" ref="orderDao"/>
</bean>
<bean id="petStore" class="org.springframework.samples.jpetstore.domain.logic.PetStoreImpl">
<property name="accountDao" ref="accountDao"/>
<property name="categoryDao" ref="categoryDao"/>
<property name="productDao" ref="productDao"/>
<property name="itemDao" ref="itemDao"/>
<property name="orderDao" ref="orderDao"/>
</bean>
从这里可以看到,petStoreFacade的具体类就是PetStoreImpl,而这个类当中,分别通过spring IOC注入了几个DAO的bean,这几个DAO的配置可以在dataAccessContext-local.xml文件里面找到,我们打开PetStoreImpl这个实现类,我们看到类里有一个searchProductList方法,这个方法就是我们在Action当中调用的方法
Java代码
return this.productDao.searchProductList(keywords);
return this.productDao.searchProductList(keywords);
从这句代码可以看出,这个方法是通过调用productDao的searchProductList方法来获得结果的,productDao这个DAO从上面的配置文件可以看出,是通过IOC容器进行注入的,我们打开dataAccessContext-local.xml文件,可以看到
Java代码
<bean id="productDao" class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapProductDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
<bean id="productDao" class="org.springframework.samples.jpetstore.dao.ibatis.SqlMapProductDao">
<property name="sqlMapClient" ref="sqlMapClient"/>
</bean>
这句配置代表了productDao的实现类就是SqlMapProductDao,同时这个类包含有一个sqlMapClient的属性对象,这个对象也是通过ioc注入的,再在这个配置文件里,我们可以找到如下一段代码
Java代码
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="WEB-INF/sql-map-config.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
这段代码就是sqlMapClient这个bean的配置,这里的实现是SqlMapClientFactoryBean,它是spring专门为ibatis框架提供的一个支持,通过这个对象就可以很好的集成ibatis框架,具体的介绍可以通过spring官方文档或者是其他一些教程获得,在这里就不多做介绍。
好了,接下来我们知道了,实际查询数据是通过DAO的实现类SqlMapProductDao进行的,而SqlMapProductDao当中就是通过了ibatis进行数据的查询,从而返回结果,这里也就不多做介绍了,大家可以通过ibatis的教程获得ibatis的使用方法,非常的简单,search操作从前台到后台的大概流程就介绍到这里了。
在这个参考文章中,我并没有对具体技术做过多的讲解,那是因为本文只是作为一个研究jpetstore的参考,提供一个可供参考的研究流程,主要是为了那些想开始研究jpetstore但是又不知道从哪开始或者是不知道如何进行研究的新人朋友们而准备的,如果具体的讲解每一部分,那我想将不仅仅是一篇文章就可以完成的事情,因为这里涉及到struts,spring,ibatis等具体的框架技术,每一个框架基本都可以写成一本书,用一篇文章来讲就不太实际了,而且我个人更倾向于遇到不理解的地方的时候,多使用google来搜索,这样能够进一步加深自己对问题的理解。
好了,关于jpetstore源码研究入门的文章就写到这里结束了,由于本人技术和文笔有限,有错漏或者表达不当的地方请不要介意,欢迎各位朋友来指正。
发表评论
-
访问Spring示例JPetStore的OrderService服务
2008-11-27 17:27 1383Spring--当前流行的J2EE开发的轻量级框架,提供了对M ... -
read-jpetstore-1-安装与配置
2008-11-27 17:26 1280项目导入 登录http://www.springframe ... -
spring jpetstore研究入门—安装篇
2008-11-27 16:06 1553之所以写这个jpetstore研究入门的文章,是为了给茫然不知 ... -
spring JpetStore学习笔记
2008-11-27 16:04 1901首先看看工程的web.xml文件 指定web应用的根, 为W ... -
spring入门编程问题集锦
2008-11-27 16:01 1035相关文章: 问一下<sping:bind& ... -
代理和AOP
2008-11-26 18:02 933一.起源 有时,我们在写一些功能方法的时候,需要加上特定的功 ... -
在Spring中使用JMS
2008-11-26 16:37 1114准备工作: 熟悉下JMS的基础知识,这里不再罗嗦,主要是实 ... -
Spring发布包内容详解
2008-11-26 16:26 947版权声明:作者junsan, ... -
在项目中应用Spring的Acegi安全框架的步骤
2008-11-26 12:22 18740、准备:配置数据源 1、配置认证管理器(org.acegi ... -
Spring宠物商店学习笔记(二)
2008-11-26 12:21 1317项目框架 1、Struts/Spring MVC 2、Sp ... -
Spring宠物商店学习笔记(一) -
2008-11-26 12:21 2745一、概述 JPet ... -
Spring基础知识(三)
2008-11-26 12:20 1189参阅:Spring Framework 开 ... -
Spring基础知识(二)
2008-11-26 12:19 1222参阅:Spring Framework 开 ... -
Spring基础知识(一)
2008-11-26 12:19 1436http://book.csdn.net/bookfiles/ ... -
Spring精髓
2008-11-26 12:18 18501\、好处 A、 使用配置文件来组装应用系统,使得在不用修改 ... -
Spring Security 中文参考文档
2008-11-25 16:56 1328http://peak.iteye.com/blog/2361 ... -
Spring的声明式事务管理
2008-11-21 16:37 6440小结:用Spring AOP配置事务要注意的几项 Spring ...
相关推荐
标题 "spring例子: jpetstore" 提到的是一个基于Spring框架的应用示例——JPetStore。这个项目是Spring官方...通过研究JPetStore和可能的PetClinic项目,我们可以深入了解Spring框架的实践应用,提升自己的开发技能。
《Spring框架学习:以JpetStore为例》 Spring框架是Java企业级应用开发中的核心框架,它为开发者提供了丰富的功能,简化了开发流程,提高了代码的可测试性和可维护性。JpetStore作为Spring的经典示例项目,是学习...
通过深入研究Spring JPetStore项目,开发者可以更好地理解和掌握Spring框架的诸多功能,同时也能了解如何在一个实际的Web应用中整合不同的技术,提升开发效率和代码质量。无论是初学者还是经验丰富的开发者,都能...
《Spring JPetStore 2.5:MyEclipse下的实战指南》 在IT行业中,Spring框架作为Java企业级应用开发的主流选择,以其强大的功能和灵活性赢得了广大开发者喜爱。而JPetStore作为Spring官方提供的一个示例应用,是学习...
**Spring jpetstore** 是一个基于Spring框架的开源...通过研究Spring jpetstore,开发者不仅可以掌握Spring的基本用法,还能了解到如何设计和实现一个完整的Web应用。这是一个很好的实践项目,有助于提升实际开发能力。
《基于Spring、Struts和iBatis的jpetstore4.0详解》 jpetstore4.0是一款经典的电子商务示例应用,它采用Spring、Struts和iBatis这三个核心框架构建,展示了如何在Java环境下实现一个完整的MVC(Model-View-...
《基于jpetstore的Spring、iBatis与Struts整合实战》 jpetstore项目是Spring框架的一个经典示例,它全面展示了如何将Spring、iBatis和Struts这三个核心的Java Web技术进行集成,构建出一个完整的MVC(Model-View-...
《Spring之JPetStore:深度解析与实践指南》 在Java世界中,Spring框架以其强大的功能和灵活性,已经成为企业级应用开发的首选。而JPetStore作为Spring框架的经典示例项目,是学习和理解Spring核心特性的绝佳起点。...
《MyEclipse中加载Spring的JPetStore详解》 在软件开发领域,Spring框架以其强大的功能和灵活性,已经成为Java企业级应用开发的事实标准。而MyEclipse作为一款强大的Java集成开发环境,为开发者提供了便捷的Spring...
本篇文章将深入探讨如何在MyEclipse环境中搭建和运行这个基于Spring的JPetStore工程,并介绍其中涉及的关键技术点。 首先,JPetStore是一个完整的电子商务应用,展示了Spring MVC的用法,包括模型(Model)、视图...
最新spring带的JPetStore的MyEclipse项目,包括了数据库,可用hsqldb直接运行,可以直接导入MyEclipse中并部署运行。 在Myeclipse里新建一个web项目,导入shopping项目即可,数据库在db文件夹里
spring自带的JPetStore,我已经配置好(数据库也配置好,用的是hsqldb),可以直接导 入eclipse中运行。共3个压缩包
《Eclipse环境下的Spring框架——以JPetStore项目为例》 在Java开发领域,Eclipse作为一款强大的集成开发环境(IDE)被广泛使用,而Spring框架则是企业级应用开发的重要选择。本文将深入探讨如何在Eclipse环境中...
综上所述,JPetStore (Struts + Spring + Hibernate)版是一个理想的学习资源,它展示了如何在实际项目中集成和使用这些流行的技术,对于Java Web开发人员来说,深入研究这个项目可以提升他们对现代企业级应用开发的...
在 jpetstore 中,Spring 作为整个应用的“胶水”,管理各个组件的生命周期和依赖关系。它可能通过XML配置或注解驱动的方式来定义bean,这些bean可以是DAO(数据访问对象)、Service、Controller等。Spring还提供了...
该jpetstore经典案例为最新SPRING开发包里面的完全案例,并集成到eclipse里面了,在eclipse里面可以直接运行并调试,在工作目录里面直接建立jpetstore目录,自动导入该目录下文件,修改jdbc.properties配置文件,连接...
尽管jpetstore5.0系统架构图未明确提及Spring框架,但Spring在企业级应用开发中起着举足轻重的作用。它提供的依赖注入(DI)和面向切面编程(AOP)功能,极大地提升了代码的灵活性和可维护性。在实际应用中,Spring...
《Spring与iBatis结合的JPetStore实例详解》 在Java Web开发领域,Spring框架以其强大的依赖注入和面向切面编程能力,以及全面的整合能力,成为了许多开发者的选择。而iBatis作为一款轻量级的数据访问层框架,以其...
**Spring MVC 自带的 JPetStore 源码解析** `Spring MVC` 是一个轻量级的、模型-视图-控制器(Model-View-Controller)框架,它为开发基于 Java 的 Web 应用程序提供了强大的支持。而 `jpetstore` 是 Spring 社区...