Dashboard > SpringSide Wiki > ... > Quickstart > Helloworld
  SpringSide Wiki Log In | Sign Up   View a printable version of the current page.  
  Helloworld
Added by SpringSideTeam, last edited by Anonymous on 2007-04-15  (view change)
Labels: 

Helloworld Example

1. 概述

Hello World Example以标准的用户CRUD管理界面,演示了SSH经典架构的RoR Pragmatic版本,供大家入门了解SpringSide基本架构之用。

在线演示网站地址: http://demo.springside.org.cn/helloworld

进入examples/helloworld目录,双击bin/quickstart.bat即会看到上面的界面。

同时,Helloworld 还在extras目录提供了使用Struts与Hibernate的原生API而非SpringSide封装的版本,以及iBatis而非Hibernate的参考版本供大家对比参照。

2. 结构定义 

   目录结构参照 SpringSide项目目录结构说明,  数据库结构定义在 /src/resources/hsqldb/helloworld.script

3. CRUD核心代码

   一个CRUD界面由下面的五个关键文件组成

  • User--  POJO Entity
  • UserManager--Business Manager
  • UserAction -- Controller
  • userList.jsp -- 用户列表页面
  • userForm.jsp --新增与修改用户页面

3.1 User

        User类使用了Hibernate Annotation来标示ORM的映射关系,因为默认类名与数据库表名,属性名与数据库列名相同,因此注释量比hbm文件大大降低。

        代码中只以@Entity注释User类,以@Id 和 @GeneratedValue注释id列,表明主键及其生成策略,其余属性全部与数据库中的列默认映射。

@Entity
public class User {
  Integer id;
  String name;

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  public Integer getId() {
    return id;
  }
  public void setId(Integer id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
}

   完整代码见/src/java/org/springside/helloworld/model/User.java,详见 Hibernate Annotation篇

3.2 UserManager,继承HibernateEntityDao,基类使用SpringHibernateTemplate,并用泛型封装了默认的CRUD函数。

      UserManager类用泛型语法声明自己管理的Entity类为User,即拥有完整的CRUD能力,下面的代码就是全部,比RoR并不逊色:

public class UserManager extends HibernateEntityDao<User> {
 //....CRUD以外的其它商业方法
}

  完整代码见/src/java/org/springside/helloworld/service/UserManager.java,详见SpringSide的Hibernate封装

3.3 UserAction

    Struts Action 部分避免了旧式Struts 用法的繁琐,详见Pragmatic Struts篇

    新模式下,继承DispatchAction 每个Controller 响应一组相关操作,LazyValidatorForm免去FormBean定义,同样采用了强力的StrutsEntityAction CRUD基类。

    UserAction 首先用泛型声明管理类型为User,Manger类型为UserManager,再声明userManager变量和它的setter函数,就拥有了默认的CRUD管理函数。

public class UserAction extends StrutsEntityAction<User, UserManager> {
 private UserManager userManager; public void setUserManager(UserManager userManager) {
  this.userManager = userManager;
 }
}

  完整代码见/src/java/org/springside/helloworld/web/UserAction.java,如果Action无关CRUD,则继承于只带少量Utils方法的StrutsAction类.

3.4 userList.jsp

        完整代码见/webapp/WEB-INF/pages/userList.jsp,主要用ExtremeTable显示了用户列表。

3.5 userForm.jsp

        完整代码见/webapp/WEB-INF/pages/userForm.jsp,使用Struts的taglib显示用户新增和修改的表格,并用commons-validator 校验用户输入。

4. 配置文件

  虽然已经尽量减少,但仍需要一些很JavaEE特色的配置文件,才能把上面的CRUD代码跑起来。

  注意配置代码分两类:基础的配置只需项目初始时一次性配置即可,而另一类则将随着界面数量的增加而增加。

  Helloworld 中的配置文件为单模块的简单方式,多模块的方式请见BookStore 示例。

4.1 web.xml

     完整代码见/webapp/WEB-INF/web.xml,主要定义了Spring与Struts的入口,将class path中/spring目录下的所有xml文件载入为Spring的ApplicationContext,把*.do交由Struts处理,并载入WEB-INF/struts-config.xml作为Struts的配置文件。

    另外web.xml还定义了著名的Hibernte OpenSessionInView Filter和Encoding Filter。

4.2 Spring 配置文件

       完整代码见/src/resources/spring下各文件。

  • applicationContext.xml  定义应用公共部分,如AspectJ式事务控制定义 和载入properties文件--jdbc.properties
  • dataAccessContext.xml 定义数据库访问相关的部分。包括数据库连接池,使用Annotation式定义配置的Hibernate SessionFactory(AnnotationSessionFactoryBean)及TransactionManager
  • serviceContext.xml 增定义每个Manager类。
<beans default-autowire="byName" default-lazy-init="true">
    <bean id="userManager" class="org.springside.helloworld.service.UserManager"/>
</beans>

   因为该文件default-autowire="byName",而且载AspectJ 批量定义了事务,所以userManager 只需简单定义id 和class即可。

4.3 Struts 配置文件

    因为Struts与Spring集成,配置文件包括WEB-INF下struts的struts-config.xml与spring的action-servlet.xml.

    在struts-config.xml 中,引入了Spring的ContextLoaderPlugIn,指定了Commons-Validator,并定义UserAction

<form-beans>
   <form-bean name="userForm" type="org.apache.struts.validator.LazyValidatorForm"/>
 </form-beans>

<action-mappings>
   <action path="/user" name="userForm" scope="request" parameter="method" validate="false">
     <forward name="list" path="/WEB-INF/pages/userList.jsp"/>
     <forward name="edit" path="/WEB-INF/pages/userForm.jsp"/>
     <forward name="success" path="/user.do?method=list" redirect="true"/>
   </action>
</action-mappings>

   因为FormBean采用LazyValidatorForm,一行简单声明即可。

   Action因为与Spring集成,所以并没有声明具体实现类。 声明parameter="method",则 /user.do?method=list 将调用userController的list() 函数。通常,后台管理界面会使用通配符,无需逐个Action定义path。

   在spring的action-servlet.xml 中

<beans default-autowire="byName" default-lazy-init="true">
  <bean name="/user" class="org.springside.helloworld.web.UserAction"/>
</beans>

注意这里Spring的bean name 以action path"/user"命名,来绑定Struts在struts-config.xml <action-mappings>中所定义的Action,并声明实际的Action类型。

ExtremeTable (SpringSide Wiki)
nn (SpringSide Wiki)

Site powered by a free Open Source Project / Non-profit License (more) of Confluence - the Enterprise wiki.
Learn more or evaluate Confluence for your organisation.
Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.2.9 Build:#527 2006-09-07) - Bug/feature request - Contact Administrators