玩JPETSTORE的可以看看

March 02, 2007

根据petclinic项目手把手教你剖析SpringFramework源代码-日志篇[转]

关键词:Spring,log4j

在petclinic项目中,在web.xml有几个条目和log4j有关,它们是: 

继续阅读 "根据petclinic项目手把手教你剖析SpringFramework源代码-日志篇[转]" »

根据petclinic项目手把手教你剖析SpringFramework源代码-mvc篇[转]

关键词:SpringFramework,mvc

二.SpringFramework的mvc

既然petclinic是个web application,我们当然从web.xml文件入手了。首先当然welcome-file-list条目了,该条目指出index.jsp是网站的入口。index.jsp写得很简单,只有3行。如下所示:
<%@ include file="/WEB-INF/jsp/includes.jsp" %>
<%-- Redirected because we can't set the welcome page to a virtual URL. --%>
<c:redirect url="/welcome.htm"/>

继续阅读 "根据petclinic项目手把手教你剖析SpringFramework源代码-mvc篇[转]" »

根据petclinic项目手把手教你剖析SpringFramework源代码-准备篇[转]

关键词:SpringFramework,mvc


自 从用上hibernate这种o/r mapping的工具后,我就再也不想用ejb了,原来的那套以ejb为重心的j2ee设计模式,自然也不合我的口 味了。在这个时候,我找到了Spring,一个轻量级的j2ee framework.从数据访问层到表示层,Spring都提供了一个很不错的解决方 案。经过一段时间的研究之后,对Spring终于有所了解,我愿意把对SpringFramework的研究经历写下来,供大家参考。我用的开发环境是: mysql+tomcat5.0(weblogic7.0)+eclipse
其他开发环境我想应该是大同小异的。在开始研究之前,建议把spring的参考文档的第三章Beans and the ApplicationContext和第九章Web framework仔细研读一番,在研究的过程中再回头参考一下文档。

继续阅读 "根据petclinic项目手把手教你剖析SpringFramework源代码-准备篇[转]" »

January 25, 2007

用 Spring 更好地处理 Struts 动作三种整合 Struts 应用程序与 Spring 的方式

为什么 Spring 这么了不起?

Spring 的创立者 Rod Johnson 以一种批判的眼光看待 Java™ 企业软件开发,并且提议很多企业难题都能够通过战略地使用 IOC 模式(也称作依赖注入)来解决。当 Rod 和一个具有奉献精神的开放源码开发者团队将这个理论应用于实践时,结果就产生了 Spring 框架。简言之,Spring 是一个轻型的容器,利用它可以使用一个外部 XML 配置文件方便地将对象连接在一起。每个对象都可以通过显示一个 JavaBean 属性收到一个到依赖对象的引用,留给您的简单任务就只是在一个 XML 配置文件中把它们连接好。


原文链接:http://www-128.ibm.com/developerworks/cn/java/j-sr2.html

基于Spring框架的WebSphere应用开发[转]



  轻量级的企业应用开发越来越受到广大J2EE应用开发者的追捧,而Spring框架又是轻量级容器的杰出代 表。由于Spring的使用日渐广泛,因此已有许多基于WebSphere应用服务器(WAS)的应用采用了Spring框架。本文首先介绍使用 Spring开发Web应用的基本问题,然后结合WebSphere应用服务器,讲述Spring应用如何结合容器提供的服务。文章目的是与大家一起探讨 如何更好的采用Spring框架开发基于WebSphere应用服务器的应用。

  1、Spring框架的主要思想描述

   Spring框架的核心思想我们可以用两个字来描述,那就是"解耦"。应用程序的各个部分之间(包括代码内部和代码与平台之间)尽量形成一种松耦合的结 构,使得应用程序有更多的灵活性。应用内部的解耦主要通过一种称为控制反转(IOC)的技术来实现。控制反转的基本思想就是本来由应用程序本身来主动控制 的调用等逻辑转变成由外部配置文件来被动控制。通常我们用一个所谓的好莱坞原则(Don't call me. I will call you.)来比喻这种控制反转的关系。由于控制反转的概念相对比较广泛,很多应用服务器实际上也实现了不同程度的控制反转技术,只是这些应用服务器对应用 程序的侵入性太强。因此Martin Fowler专门写了一篇文章讨论控制反转这个概念,并提出一个描述更为准确的概念,叫依赖注入(Dependency Injection)。

   Spring框架中的各个部分都充分使用了这种依赖注入的技术实现,从而给应用以最大的灵活度。实际上,这种依赖注入的参数化应用控制并不是 Spring的首创,比如IBM的多渠道应用整合平台(Branch Transformation Toolkit,BTT)很早就采用了这种外部参数化控制的技术。BTT中的"对象工厂"与Spring框架中的BeanFactory也有着异曲同工之 妙。

  Spring框架另外一个比较重要的技术是它对于面向切面的编程(AOP)的支持。随着应用复杂度的逐渐上升和对应用灵活性要求 的提高,IT逻辑和业务逻辑尽量分离的呼声也越来越高。AOP技术作为实现这种分离的一种比较好的途径而越来越受到大家的重视。Spring提供的是一种 动态AOP实现,也即通过代理模式动态地在目标对象的方法前后插入相应的处理代码。应用程序与底层应用服务器平台的解耦也可以借助AOP技术来实现。 Spring内置的AOP支持是一种锦上添花的功能。它使得一些本来必须由容器支持的功能,比如事务控制可以脱离开容器运行,从而达到"瘦身"的目的。这 也是为什么Spring框架常被人成为轻量级容器的一个原因。

Spring框架可以与许多已有的框架技术结合使用。J2EE技术应用的一 个重要特点是相关的开源社区非常活跃。Web应用的不同层次都有非常多优秀的开源框架存在。比如Web层的Struts,OR映射层的Hibernate 等。Spring框架并不重新发明轮子,它的出现不是为了替代这些已有的框架。相反,Spring框架在设计上可以独立构建应用或者结合已有的框架一起构 建应用。另外一个值得指出的地方是Spring框架的几大模块之间相互耦合度很小,因此Spring框架的使用可以根据实际需要选其部分模块循序渐进的使 用,而非必须统统照搬。

  2、基于Spring的Web应用基础

  2.1 Web应用的典型层次

  Web应用一般在逻辑上根据功能分为以下几层:

  1.展示层

   这一层主要如何生成展示给最终用户的界面,尽可能少的包含业务逻辑处理。对于基于J2EE的Web应用,JSP是其最为常见的一种技术。Spring对 于展示层的支持非常灵活,除了直接支持JSP之外,它还支持基于FreeMarker模板,基于Velocity模板或其它文档类型的界面等的表现层实 现。

  2.业务层

  业务层一般包含主要的业务逻辑,尤其是与用例相对应的那些业务逻辑。另外,这一层也适合包含事务管理和安全控制方面的逻辑。良好的业务层设计可以使得展示层可以采用不同的技术而不影响业务层。业务层的功能上可以类比于J2EE技术中的无状态会话BEAN层次。

  3.数据访问对象(DAO)接口层

   DAO实际上就是数据接口层,在应用中建议通过接口来体现。DAO的存在使得数据访问可以与底层持久化层的具体实现相分离。一般在DAO接口中主要就是 实现数据对象的查询、存储、删除等操作。从理论上讲,DAO层与底层数据的存储方式是独立的,也就是说并不一定要求是关系型数据库。Spring框架在设 计的时候也考虑到了其它非关系型数据库数据源的情况。

  4.持久业务对象

  持久业务对象是问题域中业务对象的持久化 表示,比如一个用户对象,一个银行帐户等。我们一般通过某种O/R映射技术来实现这些业务对象的持久化。持久业务对象是可以包含业务逻辑的,与业务层所包 含的业务逻辑不同的地方是持久业务对象所包含的是与具体业务对象直接相关且更为通用的业务逻辑。

  5.企业信息系统

  企业信息系统泛指Web应用需要连接的后台系统,一般可以分为三大类,即ERP系统,企业传统的遗留系统和关系型数据库。大部分Web应用都是基于关系型数据库的,这也是像Spring等常见框架所主要考虑的企业信息系统。

  设计良好的Web应用在层次一般是上一层依赖下一层,但是下一层不依赖上一层。我们可以暂时概括为"向下而不向上依赖原则"。为了使得不同层次之间的依赖降到最低,建议使用接口耦合。这一点又是Spring框架发挥它外部配置优势的地方。

  2.2 MVC的选择

  虽然说MVC这种模式早在Java语言出现前就有了,但是这种模式在J2EE时代才大行其道,为广大Web应用开发者所接受。对于各种基于MVC的框架而言,其要解决的问题主要可以分为以下几部分:

  1.将Web页面中的输入封装成一个数据对象,比如像Struts的表单BEAN,Spring MVC中的命令类等。

  2.根据请求的不同,由负责分发的控制器来映射和调用相应的逻辑处理单元,并将上面的数据对象作为参数传入。

  3.逻辑处理单元完成相应的处理之后又把结果放入一个数据对象。

  4.在选择的展现界面中把返回的数据对象通过某种方式显示出来。

   在使用Spring构建MVC的时候,可以选择直接使用Spring自己的MVC实现,或者利用Spring对已有的一些MVC框架的支持。比如 Spring可以支持Struts,WebWork等,与它们结合使用。Spring引以为傲的非侵入的特性在Spring MVC上表现得并不如人意。它与Servlet API的耦合度较其它部分高,而且需要使用一些Spring的接口和类。

   Spring MVC的主要分发器实现是org.springframework.web.servlet.DispatcherServlet,这是Spring MVC的访问入口。Spring提供SimpleFormController,AbstractCommandController等类来帮助应用构建 各种控制器动作,并用ModelAndView类来联系展示和逻辑返回数据。如上节所述,Spring MVC能够支持不同的界面展示技术,而且界面的展示和其后面控制器的实现是分离的,也即界面展示技术的变化不用修改控制器的实现,只需要利用Spring 的控制反转技术修改外部配置文件即可。比如,在使用JSP展示技术时,外部配置文件的viewResolver定义如下:








<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass">
<value>org.springframework.web.servlet.view.JstlView</value>
</property>
<property name="prefix"><value>/view/</value></property>
<property name="suffix"><value>.jsp</value></property>
</bean>


  如果切换到FreeMaker模板技术,那么除了页面模板的修改之外,主要就是把对应的外部配置文件更改一下即可,如下所示。具体的展示逻辑部分不用做什么修改。








<bean id="viewResolver"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="viewClass">
<value>
org.springframework.web.servlet.view.freemarker.FreeMarkerView
</value>
</property>
<property name="suffix"><value>.ftl</value></property>
</bean>
<bean id="freemarkerConfig"
class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath">
<value>/view/</value>
</property>
</bean>


   如果不使用Spring的MVC框架而想结合已有的一些MVC框架,Spring也是支持的。Spring对于常见的MVC框架都提供了支持,包括 Struts,WebWork,Tapestry和JSF等。结合使用这些框架的一个好处是可以使用一些已有的熟悉的技术,另外结合Spring的AOP 拦截器可以相对比较容易地处理框架动作共有的事情,比如动作的日志处理等。如果选择这些MVC框架,那么在使用框架的配置文件和应用的Spring配置文 件都需要做相应的修改。比如使用Struts的时候,Struts-config.xml配置文件中的映射动作类型一般会设置成 org.springframework.web.struts.DelegatingActionProxy,或者设置控制器为 org.springframework.web.struts.DelegatingRequestProcessor。然后需要在相应应的 WebApplicationContext中定义与Struts Action对应的Bean。这样就可以充分利用Spring的控制反转技术来管理Struts的Action了。

  另外在使用这些框 架的时候要解决的一个问题是上下文的装载。比如使用Struts,可以使用ContextLoaderPlugin来装载Web上下文。这个 ContextLoaderPlugin替换了原来通过DispacherServlet装载的方式。需要在struts-config.xml文件中添 加如下条目:<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn"/>。这种方式可以使 Spring的Web上下文随着Struts ActionServlet的初始化而装载。

  因此,如果用户已有的应用是基于某个 MVC框架,或者用户熟悉某个框架,那么可以利用Spring对这些框架的支持结合使用。因为我们的目的本来就是为了解决问题而不是为了使用某种技术。但 是对其它用户而言,如果不是对已有的一些MVC框架比较熟悉的话,那就直接使用Spring的MVC框架就可以了。

继续阅读 "基于Spring框架的WebSphere应用开发[转]" »

从Jpetstore 开始IBATIS之旅[转]

前 一阵在研究O/R MAPPING,觉得HIBERNATE和IBATIS都是好东西,但IBATIS更容易上手,而且跟数据库打交道的时候只需把SQL 语句配置在XML里即可,不象HIBERNAMTE要写复合其规范的HQL。当然现在HIBERNATE大行其道肯定是有道理的,我过一阵子也打算好好学 习一下。
技术发展的太快,学习方法是很重要的。(看来开源确实促进了生产力的发展啊,由此推断,共产主义社会肯定会实现的啦。)我认为必须摒弃抱本书按部就班的学 习方法,而应该是STUDY IN ACTION,在实践中学习,缺啥补啥,大不了不断重构好了。当然前提是有一定的技术积累了。 为了学习IBATIS,除了大致看了一下IBATIS的官方文档,我把主要精力放在研究作者的范例JPETSTORE上了,大家可以道 WWW.IBATIS.COM去下载4.0版本的例子,3.X的不要下了,代码写的没有4.0的优美。 然后再去下载MYSQL,TOMCAT,安装调试让JETSTORE跑起来。这个过程我就不讲了,大家动动脑筋找点成就感吧。工欲善其事,必先利其器。我 用的是JBUILDER9,因为我以前用DELPHI的对BORLAND的产品有感情啊(当然BORLAND不会对我有感情,因为。。。。。。^_^,中 国特色)。建一个新项目,保存后关掉PROJECT,然后把JPETSTORE的代码包拷贝到:project rc\下,再打开刚才的项目,顺利的话你就能看到项目下的一堆包啦。现在编译肯定是有问题的,别急别急,在项目里加载上JPETSTORE源码LIB目录 下的所有.JAR和SERVLET.JAR,为了连MYSQL,你还得加载MYSQL的JDBC驱动。具体做法,你可以在JBUILDER9 Tools\config libraries 新建三个LIB,比如IBATISLIB里放上JPETSTORE源码LIB目录下的所有.JAR,servlet就不要建了,JB9里带了,再建一个 MYSQLLIB放上MYSQL的JDBC驱动的.jar,然后修改JPETSTORE源码SRC\PROPERTIES\ database.properties的内容,例如,我的是driver=org.gjt.mm.mysql.Driverurl=jdbc: mysql://localhost/jpetstoreusername=jpetstorepassword=ibatis9977现在MAKE PROJECT应该可以通过了。好啦,打开com.ibatis.jpetstore底下的所有.java文件吧。Domain目录下放的是 JAVABEAN,一般是跟表相对应的。Persistence目录下放的是DAO接口和具体实现类,DAO即数据访问对象(DATA ACCESS OBJECT),是用来跟数据库打交道的。IBATIS的O/R MAPPING的使用方法也就在这个目录里面。Presentation目录下放的是FORMBEAN,后面还要说到JPETSTORE范例对 STRUTS的创造性使用。Service目录下放的是SERVICE类,通过SERVICE对象调用DAO对象的方法来访问数据库的,这是一种常用的设 计模式。 常见的STRUTS编程应该是一个动作对应一个ACTION,例如写一个交友网站,用户登录和用户查询就得写分别写两个ACTION来处理。而 JPETSTORE的作者克林顿(Clinton Begin,名字够响亮的)写了一个ACTION动态的调用FORMBEAN的不同方法来处理不同的动作。代码如下,注意execute()的写法!
public class BeanAction extends Action {
public ActionForward execute(ActionMapping mapping,
ActionForm form, HttpServletRequest request,
HttpServletResponse response)
throws Exception {
String forward = "success";
try {
ActionContext.initialize(request, response);
if (form != null) {
// Explicit Method Mapping
Method method = null;
String methodName = mapping.getParameter();
if (methodName != null && !"*".equals(methodName)) {
try {
method = form.getClass().getMethod(methodName,
null); forward = (String) method.invoke(form, null);
} catch (Exception e) {
throw new BeanActionException("Error dispatching
bean action via method parameter ('" + methodName + "').
Cause: " + e, e);
}
}
// Path Based Method Mapping
if (method == null && !"*".equals(methodName)) {
methodName = mapping.getPath();
if (methodName.length() > 1) {
int slash = methodName.lastIndexOf("/") + 1;
methodName = methodName.substring(slash);
if (methodName.length() > 0) {
try {
method = form.getClass().getMethod
(methodName, null);
forward = (String) method.invoke(form, null);
} catch (Exception e) {
throw new BeanActionException("Error dispatching
bean action via URL pattern ('" + methodName + "').
Cause: " + e, e);
}
}
}
}
}
} catch (Exception e) {
request.setAttribute("BeanActionException", e);
throw e;
}
return mapping.findForward(forward);
}
}

也 就是通过对struts-config.xml的配置信息的读取来决定调用的方法,或者是不调用任何方法。例如: 当ACTIONSERVLET收到请求/shop/viewCategory.shtml,(JPETSTORE里后缀定义的是“.shtml”)调用 catalogBean的viewCategory方法。怎么样,有创意吧,如果你愿意,就再也不用写那么多的ACTION了。下面谈一谈IBATIS的 O/R MAPPING吧。请大家打开目录your project\com\ibatis\jpetstore\persistence qlmapdao ql,看到了什么?除了配置文件sql-map-config.xml以外,是一些和JAVABEAN相对应的XML,打开sql-map- config.xml和Acount.xml看看吧,再返到your project\com\ibatis\jpetstore\persistence目录,打开dao.xml发现他们的关系了吧。可能这时你搞不清这些 XML有什么用处,别急,IBATIS官方文档里说的很清楚(有中文版的哦)。我大致说一下跟JAVABEAN对应的那些XML文件的作用吧,比如 Acount.xml,是映射JAVABEAN和数据库的表的文件。你可以按照IBATIS的规范在里面写任意的SQL语句,参数和返回值可以是基本类型 及其包装类,MAP,自定义的类。最常用的当然是返回自定义类实例了。不过如果返回值是自定义的类实例的话,你就需要先定义resultMap,比如: <resultMap id="accountResult" class="account"> <result property="username" column="USERID"/> <result property="email" column="EMAIL"/> <result property="firstName" column="FIRSTNAME"/> <result property="lastName" column="LASTNAME"/> <result property="status" column="STATUS"/> <result property="address1" column="ADDR1"/> <result property="address2" column="ADDR2"/> <result property="city" column="CITY"/> <result property="state" column="STATE"/> <result property="zip" column="ZIP"/> <result property="country" column="COUNTRY"/> <result property="phone" column="PHONE"/> <result property="languagePreference" column="LANGPREF"/> <result property="favouriteCategoryId" column="FAVCATEGORY" /> <result property="listOption" column="MYLISTOPT" /> <result property="bannerOption" column="BANNEROPT" /> <result property="bannerName" column="BANNERNAME" /> <resultMap>然后再引用:<select id="getAccountByUsername" resultMap="accountResult" parameterClass="string"> select SIGNON.USERNAME as USERID, ACCOUNT.EMAIL, ACCOUNT.FIRSTNAME, ACCOUNT.LASTNAME, ACCOUNT.STATUS, ACCOUNT.ADDR1, ACCOUNT.ADDR2, ACCOUNT.CITY, ACCOUNT.STATE, ACCOUNT.ZIP, ACCOUNT.COUNTRY, ACCOUNT.PHONE, PROFILE.LANGPREF, PROFILE.FAVCATEGORY, PROFILE.MYLISTOPT, PROFILE.BANNEROPT, BANNERDATA.BANNERNAME from ACCOUNT, PROFILE, SIGNON, BANNERDATA where ACCOUNT.USERID = #value# and SIGNON.USERNAME = ACCOUNT.USERID and PROFILE.USERID = ACCOUNT.USERID and PROFILE.FAVCATEGORY = BANNERDATA.FAVCATEGORY <select>再打开AccountSqlMapDao.java看看:
public Account getAccount(String username) { return (Account) queryForObject("getAccountByUsername", username); }
思考一下,看明白其中的关联了吧。打开AccountService.JAVA:
public Account getAccount(String username) {
return accountDao.getAccount(username);
}
打开AccountBean.java:
public String newAccount() {
try {
accountService.insertAccount(account);
account = accountService.getAccount
(account.getUsername());//在这调用的
myList = catalogService.getProductListByCategory
(account.getFavouriteCategoryId());
authenticated = true;
repeatedPassword = null;
return "success";
} catch (Exception e) {
throw new BeanActionException ("There was a problem
creating your Account Information. Cause: " + e, e); }
}
看了半天,写个例子试试吧
package com.ibatis.jpetstore.service;
import com.ibatis.dao.client.DaoManager;
import com.ibatis.jpetstore.domain.*;
import com.ibatis.jpetstore.persistence.DaoConfig;
import com.ibatis.common.util.PaginatedList;
import com.ibatis.jpetstore.persistence.iface.*;
import java.util.*;
public class IbatisTest {
private DaoManager daoManager =
DaoConfig.getDaomanager();
private AccountDao accountDao;
public IbatisTest() {
accountDao = (AccountDao) daoManager.getDao
(AccountDao.class);
Account account=accountDao.getAccount("j2ee", "j2ee");
System.out.println(account.getFirstName());
}
public static void main(String[] args) {
IbatisTest ibatisTest=new IbatisTest();
}
}
你 还可以试试insert,update,delete。IBATIS里可是支持分页的,用起来很爽的,大家有空还是花点功夫钻研一下吧。关于DEBUG: 我前两天照搬JPETSTORE的架构试着写了一个交友网站,基本上挺顺利,只是感觉DEBUG比较麻烦,通常为了找一个错花上几个小时。 JBUILDER带的DEBUG我没用过,但可是肯定肯定和DELPHI上的DEBUG是有天壤之别的。而且JUNIT我也是刚开始学,也没用上。这里, 我把自己比较土的办法介绍一下:一,当你写了新的O/R MAPPING的时候,可以先写个包含MAIN方法的类测试一下,就向我上面的测试例子一样。二,当你想跟踪变量值的时候,你可以利用IBATIS带的工 具类ActionContext把变量写到SESSION里,比如你有你个FORMBEAN:UserBean.java,其中有一个方法是处理用户登录 的,你为了跟踪用户的用户名和密码,可以这样写:
public String logon() {
try {
user = userService.getUser(user.getUsername(),
user.getPassword());
if (user== null ) {
clear();
return "failure";
} else {
user.setPassword(null);
authenticated = true;
user.setMessageCount
(messageService.getMessageNewCount(user.getUserId()));
ActionContext.getActionContext().setSimpleMessage
("newCount="+newCount.toString()+"
toUserId="+user.getUserId());//写入SESSION
return " failure ";}//导入到Error.jsp
}catch (Exception e){
throw new BeanActionException ("There was a problem
logoning your Account Information. Cause: " + e, e);
}
}
当然你需要包含下面的语句
import com.ibatis.struts.ActionContext;
Error.jsp:
<%@ taglib uri="struts-logic" prefix="logic" %>
<%@ taglib uri="struts-bean" prefix="bean" %>
<%@ taglib uri="struts-html" prefix="html" %>
<%@ page import="java.io.PrintWriter"%>
<logic:present name="message">
<bean:write

name="message" />
</logic:present>
//输出你需要的信息
<logic:present name="errors">
<logic:iterate id="error" name="errors">


<bean:write name="error" />

</logic:iterate>
</logic:present>
<logic:notPresent name="BeanActionException">
<logic:notPresent name="message">
Something happened...
But no further information was provided.
</logic:notPresent>
</logic:notPresent>


<logic:present name="BeanActionException">>
Error!

name="BeanActionException"
property="class.name"/>


<bean:write name="BeanActionException"
property="message"/>
</logic:present>


<logic:present name="BeanActionException">
Stack


<%
Exception e = (Exception)request.getAttribute
("BeanActionException");
e.printStackTrace(new PrintWriter(out));
%>


</logic:present>
三, 为跟踪变量,你还可以利用LOG4J把变量值写到LOG里去,这种方法很常见,不明白就去www.google.com查吧。四,为避免写 javabean出现大小写或其他的错误,强烈建议不要把BEAN当做普通CLASS来写,要用IDE 新建一个BEAN,这样IDE会帮你找出很多错误。我就吃了不少苦头。入门了吗?有问题请留言。为了贴上XML费了老鼻子劲,不容易啊。我要开始研究 SPRING和HIBERNATE啦。

在Win2003+Tomcat+MySQL下运行JPetStore


早就听说JPetStore是一个非常优秀的J2EE开发的例子!在上周终于有时间把它配置成功,还没来得及仔细研究,在这里先说一下如何在Win2003+Tomcat下运行JPetStore


在这里,我认为您的Java水平和我一样糟糕,我以前做.net,现在Java刚刚开始学习,大约两周左右的时间,如果您的Java水平比我高,那我不要看这篇文章了,看了只能浪费您的时间。


第一步:配置JDKMySQL


我相信您已经配置好了,什么,还没有,^-^,比我还笨哪,^-^!那您看看我写的《搭建Java开发环境》吧,那里详细的说明了如何搭建Java开发环境!


最好把 jdk下的lib/tools.jar 复制一份到 Tomcatcommon/lib (以后做其它项目也会用到的)


第二步:下载JPetStore


http://www.ibatis.com/jpetstore/jpetstore.html页面上提供了JPetStore下载



建议您下载最新版本,但注意,JDKMySQL也要用相应版本。当前版本号:4.0.5


第三步:创建JPetStore数据库


iBATIS_JPetStore-4.0.5\ddl\mysqljpetstore-mysql-schema.sql,


jpetstore-mysql-dataload.sql, jpetstore-mysql-create-user.sql 三个文件拷贝到MySQLbin目录下,到MySQL的命令提示符下分别运行这三个文件:


mysql -uroot –p < jpetstore-mysql-schema.sql


mysql -uroot –p < jpetstore-mysql-dataload.sql


mysql -uroot –p < jpetstore-mysql-create-user.sql


以上三个文件分别是创建数据库JPetStore,导入数据,分配权限。如果你安装了MySQL的管理工具,您也可以在您按装的管理工具下运行这三个文件。


第四步:部属JPetStore


iBATIS_JPetStore-4.0.5\build\wars下的jpetstore.war复制到TomcatWebapps目录下,接着运行Tomcat(http://localhost:8080)。接着在看Webapps目录下会出现jpetstore文件夹,找到该文件夹下WEB-INF\classes\properties目录下的database.properties,把里面的内容替换成如下:


####################################


# Database Connectivity Properties


####################################


 


driver=org.gjt.mm.mysql.Driver


url=jdbc:mysql://localhost:3306/jpetstore


username=jpetstore


password=ibatis9977


重启Tomcat


IE地址栏里输入: http://localhost:8080/jpetstore/ 看到画面了吧?点击“ Enter the Store ”看到鹦鹉了吧?都看到了,在点击测试几个连接,没问题,那好,配置成功!!!


January 12, 2007

Spring框架快速入门之简介

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。

   在这篇由三部分组成的 Spring 系列 的第 1 部分中,我将介绍 Spring 框架。我先从框架底层模型的角度描述该框架的功能,然后将讨论两个最有趣的模块:Spring 面向方面编程(AOP)和控制反转 (IOC) 容器。接着将使用几个示例演示 IOC 容器在典型应用程序用例场景中的应用情况。这些示例还将成为本系列后面部分进行的展开式讨论的基础,在本文的后面部分,将介绍 Spring 框架通过 Spring AOP 实现 AOP 构造的方式。

  Spring 框架

  Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图 1 所示。


图 1. Spring 框架的 7 个模块

  组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:

  ☆ 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。

  ☆ Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

  ☆ Spring AOP: 通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。

  ☆ Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写 的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。

  ☆ Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。

  ☆ Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。

  ☆ Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

   Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。

  IOC 和 AOP

  控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器 (在 Spring 框架中是 IOC 容器) 负责将这些联系在一起。

  在典型的 IOC 场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。下表列出了 IOC 的一个实现模式。

















类型 1 服务需要实现专门的接口,通过接口,由对象提供这些服务,可以从对象查询依赖性(例如,需要的附加服务)
类型 2 通过 JavaBean 的属性(例如 setter 方法)分配依赖性
类型 3 依赖性以构造函数的形式提供,不以 JavaBean 属性的形式公开


  Spring 框架的 IOC 容器采用类型 2 和类型3 实现。

  面向方面的编程

  面向方面的编程,即 AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。

   AOP 和 IOC 是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和 Java 类中才能实现日志功能。在 AOP 方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是 Java 类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用 Spring AOP 编写的应用程序代码是松散耦合的。

  AOP 的功能完全集成到了 Spring 事务管理、日志和其他各种特性的上下文中。

  IOC 容器

   Spring 设计的核心是 org.springframework.beans 包,它的设计目标是与 JavaBean 组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是 BeanFactory 接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory 也可以管理对象之间的关系。

  BeanFactory 支持两个对象模型。

  □ 单态 模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton 是默认的也是最常用的对象模型。对于无状态服务对象很理想。

  □ 原型 模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。

  bean 工厂的概念是 Spring 作为 IOC 容器的基础。IOC 将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring 框架使用 JavaBean 属性和配置数据来指出必须设置的依赖关系。

  BeanFactory 接口

  因为 org.springframework.beans.factory.BeanFactory 是一个简单接口,所以可以针对各种底层存储方法实现。最常用的 BeanFactory 定义是 XmlBeanFactory,它根据 XML 文件中的定义装入 bean,如清单 1 所示。

  清单 1. XmlBeanFactory








BeanFactory factory = new XMLBeanFactory(new FileInputSteam("mybean.xml"));


  在 XML 文件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前,bean 本身不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方法,传入将要检索的 bean 的名称即可,如清单 2 所示。

  清单 2. getBean()








MyBean mybean = (MyBean) factory.getBean("mybean");


  每个 bean 的定义都可以是 POJO (用类名和 JavaBean 初始化属性定义) 或 FactoryBean。FactoryBean 接口为使用 Spring 框架构建的应用程序添加了一个间接的级别。

  IOC 示例

  理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。

  我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用户与以下服务进行交互:

  ☆ 信用级别评定服务,查询用户的信用历史信息。

  ☆ 远程信息链接服务,插入客户信息,将客户信息与信用卡和银行信息连接起来,以进行自动借记(如果需要的话)。

  ☆ 电子邮件服务,向用户发送有关信用卡状态的电子邮件。

  三个接口

  对于这个示例,我假设服务已经存在,理想的情况是用松散耦合的方式把它们集成在一起。以下清单显示了三个服务的应用程序接口。

  清单 3. CreditRatingInterface








public interface CreditRatingInterface {
 public boolean getUserCreditHistoryInformation(ICustomer iCustomer);
}


  清单 3 所示的信用级别评定接口提供了信用历史信息。它需要一个包含客户信息的 Customer 对象。该接口的实现是由 CreditRating 类提供的。

  清单 4. CreditLinkingInterface








public interface CreditLinkingInterface {
 public String getUrl();
 public void setUrl(String url);
 public void linkCreditBankAccount() throws Exception ;
}


    信用链接接口将信用历史信息与银行信息(如果需要的话)连接在一起,并插入用户的信用卡信息。信用链接接口是一个远程服务,它的查询是通过 getUrl() 方法进行的。URL 由 Spring 框架的 bean 配置机制设置,我稍后会讨论它。该接口的实现是由 CreditLinking 类提供的。

  清单 5. EmailInterface








public interface EmailInterface {

 public void sendEmail(ICustomer iCustomer);
 public String getFromEmail();
 public void setFromEmail(String fromEmail) ;
 public String getPassword();
 public void setPassword(String password) ;
 public String getSmtpHost() ;
 public void setSmtpHost(String smtpHost);
 public String getUserId() ;
 public void setUserId(String userId);

}


  EmailInterface 负责向客户发送关于客户信用卡状态的电子邮件。邮件配置参数(例如 SMPT 主机、用户名、口令)由前面提到的 bean 配置机制设置。Email 类提供了该接口的实现。

  Spring 使其保持松散

  这些接口就位之后,接下来要考虑的就是如何用松散耦合方式将它们集成在一起。在清单6中可以看到信用卡帐户用例的实现。

   注意,所有的 setter 方法都是由 Spring 的配置 bean 实现的。所有的依赖关系(也就是三个接口)都可以由 Spring 框架用这些 bean 注入。createCreditCardAccount() 方法会用服务去执行其余实现。在清单7中可以看到 Spring 的配置文件。我用箭头突出了这些定义。

  运行应用程序

  要运行示例应用程序,首 先必须 下载 Spring 框架 及其所有依赖文件。接下来,将框架释放到(比如说)磁盘 c:\,这会创建 C:\spring-framework-1.2-rc2 (适用于当前发行版本) 这样的文件夹。在继续后面的操作之前,还必须下载和释放 Apache Ant。

  接下来,将源代码释放到文件夹,例如 c:\ 盘,然后创建 SpringProject。将 Spring 库(即 C:\spring-framework-1.2-rc2\dist 下的 spring.jar 和 C:\spring-framework-1.2-rc2\lib\jakarta-commons 下的 commons-logging.jar)复制到 SpringProject\lib 文件夹中。完成这些工作之后,就有了必需的构建依赖关系集。

  打开命令提示符,将当前目录切换到 SpringProject,在命令提示符中输入以下命令:build。

   这会构建并运行 CreateCreditAccountClient 类,类的运行将创建 Customer 类对象并填充它,还会调用 CreateCreditCardAccount 类创建并链接信用卡帐户。CreateCreditAccountClient 还会通过 ClassPathXmlApplicationContext 装入 Spring 配置文件。装入 bean 之后,就可以通过 getBean() 方法访问它们了,如清单 8 所示。

  清单 8. 装入 Spring 配置文件

  ClassPathXmlApplicationContext appContext =
                    new ClassPathXmlApplicationContext(new String[] {
     "springexample-creditaccount.xml"
    });

  CreateCreditCardAccountInterface creditCardAccount =
                    (CreateCreditCardAccountInterface)
 appContext.getBean("createCreditCard");

  结束语

  在这篇由三部分组成的 Spring 系列 的第一篇文章中,我介绍了 Spring 框架的基础。我从讨论组成 Spring 分层架构的 7 个模块开始,然后深入介绍了其中两个模块:Spring AOP 和 IOC 容器。

   由于学习的最佳方法是实践,所以我用一个工作示例介绍了 IOC 模式 (像 Spring 的 IOC 容器实现的那样)如何用松散耦合的方式将分散的系统集成在一起。在这个示例中可以看到,将依赖关系或服务注入工作中的信用卡帐户应用程序,要比从头开始构 建它们容易得多。

November 01, 2006

spring事务探索 [转]

spring自建事务管理模块。而且这个事务管理是一个抽象设计,可以应用到很多场合,包括普通的DataSource,jta,jms和hibernate上。 

要正确使用spring的事务,首先需要了解spring在事务设计上的一些概念 
统观spring事务,围绕着两个核心PlatformTransactionManager和TransactionStatus

继续阅读 "spring事务探索 [转]" »

posted on 2007-04-01 13:50 金家寶 阅读(2180) 评论(0)  编辑  收藏 所属分类: J2EE技术实例


只有注册用户登录后才能发表评论。


网站导航: