专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »博文摘选 » 点击这里:使用SpringSide 3.1.4.3开发Web项目的全过程 »正文

点击这里:使用SpringSide 3.1.4.3开发Web项目的全过程

来源: 发布时间:星期二, 2009年12月8日 浏览:0次 评论:0
SpringSide 3.1.4.3是目前SpringSide最新版本也是完成度比较高个版本用来做实际项目开发应该丝毫不成问题这里写下使用该版本开发个简单Web项目全过程当然最重要是我自己些心得体会体会文章很长只有耐下性子细看才能体会个中 3味
步、下载SpringSide 3.1.4.3 all-in-one这个过程太简单了SpringSide官方网站WebSite是www.springside.org.cn去那里就可以下载了all-in-one版当然是懒人们不 2选择这里有点很搞笑该版本标SpringSide 3.1.4.3但是下载后解压缩解压缩出来文件是springside-3.1.4.2这可能是江南白衣点小小失误据我猜测3.1.4.33.1.4.1进步应该是加入了jsp-api.jar个库希望白衣这次不要为了更改这个版本号上失误而再推出个新版本如果真要推出新版本如何样也应该把我最近研究出来多数据库配置加进去
第 2步、安装SpringSide如果安装过SpringSide以前版本最好把用户目录下.m2文件夹删掉这个文件夹是Maven本地仓库所在地虽说Maven可以有效保证库文件不会发生版本冲突但是删除这个文件夹会使安装过程加快否则SpringSide安装过程会不停询问你是否覆盖某某文件删除.m2文件夹后运行springside-3.1.4.2目录下bin目录中quickstart.bat即可(前提条件是已经安装好了JDK5或以上版本如果你电脑中连JDK都没有就别来趟SpringSide浑水了)等待这个文件运行完就可以看到SpringSide 3提供 3个举例项目mini-webmini-serviceshow都运行起来了这时你可以细细体会SpringSide实现各种特性
仔细察看SpringSidebin目录发现该版本提供脚本更加明确和有用start-db.bat可以用来启动Derby数据库start-selenium.bat用来启动selenium serverstart-tomcat.bat那就别说了地球人都知道
如果要想使用SpringSide来生成项目还有点点小工作要做就是把Mavenbin目录加入到PATH环境变量中如下图:
 
第 3步使用SpringSide生成项目运行bin目录下-project.bat即可如下图:
4
在创建项目过程中该脚本会提出些问题其中groupId是你组织名称由于该项目由我私人贡献纯属示范用所以我填了youxia.personal因此在第5个问题上我选择了personal.you作为我项目中package名字这也是符合国际惯例artactId是项目名字这里为MultiDatasourceExample名字有点长从名字就可以看出来我要示范多个数据源配置
第 4步、启动Eclipse导入项目生成项目位于SpringSide目录下tools\generator\generated-project目录下下面是Eclipse截图:
5
项目导入成功后Eclispe资源管理器截图:



 可以看到该项目经导入立即可用个烦人红叉都没有这也正介绍说明了该版本是SpringSide 3个革命性版本从该版本开始SpringSide 3易用性提高了不止个档次

Eclipse推荐使用3.4及以上版本在该版本中Tomcat服务器管理更加方便只需要在项目快捷菜单中选择Run _disibledevent=>即可自动打开Tomcat服务器并部署项目如下图:

这里有定要注意由于SpringSide生成项目默认使用Derby数据库所以要想成功运行项目必须先启动Derby数据库还记得前面提到start-db.bat吗?运行它!然后运行该项目bin目录下init-db.jar在数据库中放入该项目化数据
然后就可以点Run _disibledevent=>来启动项目了让大家见识Eclipse嵌入式浏览器、Tomcat服务器视图、Console视图是太方便了:

第 5步、将数据库迁移到MySQL在项目中创建数据库和化数据库语句都是以SQL文件存在如下图:

但是该语句都是针对Derby如果要应用于MySQL还必须得要做些修改才行先修改schema.sql如下:

drop table  exists RESOURCES_AUTHORITIES;drop table  exists ROLES_AUTHORITIES;drop table  exists USERS_ROLES;drop table  exists RESOURCES;drop table  exists AUTHORITIES;drop table  exists USERS;drop table  exists ROLES;create table USERS (ID eger primary key auto_increment,LOGIN_NAME varchar(20not null unique,PASSWORD varchar(20),NAME varchar(20),EMAIL varchar(30));create unique index USERS_LOGIN_NAME_INDEX on USERS(LOGIN_NAME);create table ROLES (ID eger primary key auto_increment,NAME varchar(20not null unique
);create table USERS_ROLES (USER_ID eger not null,ROLE_ID eger not null,FOREIGN KEY (ROLE_ID) references ROLES(ID),FOREIGN KEY (USER_IDreferences USERS(ID));CREATE TABLE AUTHORITIES (ID eger primary key auto_increment,NAME varchar(20not null,DISPLAY_NAME varchar(20not null
);create table ROLES_AUTHORITIES (ROLE_ID eger not null,AUTHORITY_ID eger not null,FOREIGN KEY (ROLE_ID) references ROLES(ID),FOREIGN KEY (AUTHORITY_ID) references AUTHORITIES(ID));CREATE TABLE RESOURCES (ID eger primary key auto_increment,RESOURCE_TYPE varchar(20not null,VALUE varchar(255not null,ORDER_NUM float not null
);create table RESOURCES_AUTHORITIES (AUTHORITY_ID eger not null,RESOURCE_ID eger not null,FOREIGN KEY (AUTHORITY_ID) references AUTHORITIES(ID),FOREIGN KEY (RESOURCE_ID) references RESOURCES(ID));

该修改主要包含两个地方个是在drop table后面加上了 exists个是把GENERATED ALWAYS as IDENTITY修改为auto_incrementload-data.sql不需要修改
然后启动MySQLMySQL中使用上面两个sql文件创建数据库和添加化数据如下图:

然后更改数据库连接修改项目application.properties文件如下:

#jdbc tingsjdbc.url=jdbc:mysql://localhost:3306/MultiDatasourceExample?useUnicode=true&characterEncoding=utf8jdbc.username=youxiajdbc.password=******
#hibernate tingshibernate.show_sql=falsehibernate.format_sql=falsehibernate.ehcache_config_file=/ehcache/ehcache-hibernate-local.xml

修改项目applicationContext.xml文件这里要修改两个地方个为DriverClassName个为hibernate.dilect如下:

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
    default-lazy-init="true">

    <description>Spring公共配置文件 </description>

    <!-- 定义受环境影响易变变量 -->
    <bean ="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
        <property name="ignoreResourceNotFound" value="true" />
        <property name="locations">
            <list>
                <!-- 标准配置 -->
                <value>path*:/application.properties</value>
                <!-- 本地开发环境配置 -->
                <value>path*:/application.local.properties</value>
                <!-- 服务器生产环境配置 -->
                <!-- <value>file:/var/myapp/application.server.properties</value> -->
            </list>
        </property>
    </bean>

    <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired属性被注入 -->
    <context:component-scan base-package="personal.youxia" />

    <!-- 数据源配置,使用应用内DBCP数据库连接池 -->
    <bean id="dataSource" ="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <!-- Connection Info -->
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />

        <!-- Connection Pooling Info -->
        <property name="initialSize" value="5" />
        <property name="maxActive" value="100" />
        <property name="maxIdle" value="30" />
        <property name="maxWait" value="1000" />
        <property name="poolPreparedStatements" value="true" />
        <property name="defaultAutoCommit" value="false" />
    </bean>

    <!-- 数据源配置,使用应用服务器数据库连接池 -->
    <!--<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ExampleDB" />-->

    <!-- Hibernate配置 -->
    <bean id="sessionFactory" ="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="namingStrategy">
            <bean ="org.hibernate.cfg.ImprovedNamingStrategy" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
                <prop key="hibernate.cache.provider_">org.hibernate.cache.EhCacheProvider                </prop>
                <prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.ehcache_config_file}</prop>
            </props>
        </property>
        <property name="packagesToScan" value="personal.youxia.entity.*" />
    </bean>

    <!-- 事务管理器配置,单数据源事务 -->
    <bean id="transactionManager" ="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

    <!-- 事务管理器配置,多数据源JTA事务-->
    <!--        <bean id="transactionManager" ="org.springframework.transaction.jta.JtaTransactionManager or        WebLogicJtaTransactionManager" />    -->

    <!-- 使用annotation定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" /></beans>

由于SpringSide不提供Mysqljdbc驱动所以需要自己去MySQL官方网站WebSite下载将下载到mysql-connector-5.*.jar复制到项目WEB-INFlib目录中然后运行项目成功至此成功将项目迁移到MySQL
第 6步、添加数据表、编写Entity类、编写Dao类、Manager并进行单元测试还是以前几篇文章中提到文章发布系统为例篇文章对应多篇评论所以说据库中需创建articlescomments两个数据表如下:

create   table  articles(id     primary   key  auto_increment,subject  varchar ( 20 )  not   null ,content  text );create   table  comments(id     primary   key  auto_increment,content  varchar ( 255 ),article_id     not   null ,foreign   key  (article_id)  references  articles(id));

在编写Java代码的前我还要做点小工作什么工作呢?那就是要为我自己项目创建个单独源文件夹src\\java这个文件夹已经被江南白衣放入了太多package而且涉及到security所以层次也不明显操作起来不方便找起代码来也不够快下面是我创建了自己源文件夹后截图:

在我自己源文件夹中只创建了 4个package刚好代表从底到上 4个层次这样找起代码来要方便得多
先来EntityArticle.java代码如下:

package personal.youxia.entity;import java.util.LinkedHashSet;import java.util.Set;import javax.persistence.CascadeType;import javax.persistence.Entity;import javax.persistence.JoinColumn;import javax.persistence.OneToMany;import javax.persistence.OrderBy;import javax.persistence.Table;import org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;import org.hibernate.annotations.Fetch;import org.hibernate.annotations.FetchMode;
@Entity// 表名和类名不相同时重新定义表名.@Table(name = "articles")// 默认缓存Cache策略.@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)public  Article extends IdEntity {    private String subject;    private String content;    private Set<Comment> comments =  LinkedHashSet<Comment>;
    public String getSubject {         subject;    }
    public void Subject(String subject) {        this.subject = subject;    }
    public String getContent {         content;    }
    public void Content(String content) {        this.content = content;    }
    @OneToMany(cascade = { CascadeType.ALL })    @JoinColumn(name = "article_id")    // Fecth策略定义    @Fetch(FetchMode.SUBSELECT)    // 集合按id排序.    @OrderBy("id")    // 集合中对象id缓存Cache.    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)    public Set<Comment> getComments {         comments;    }
    public void Comments(Set<Comment> comments) {        this.comments = comments;    }}


Comment.java如下:

package personal.youxia.entity.entities;
import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.Table;
import org.hibernate.annotations.Cache;import org.hibernate.annotations.CacheConcurrencyStrategy;
import personal.youxia.entity.IdEntity;

@Entity// 表名和类名不相同时重新定义表名.@Table(name = "comments")// 默认缓存Cache策略.@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)public  Comment extends IdEntity {
    
private String content;
    
private Long articleId;

    
public String getContent {
        
 content;
    }

    
public void Content(String content) {
        
this.content = content;
    }
    
    @Column(name = "article_id")
    
public Long getArticleId {
        
 articleId;
    }

    
public void ArticleId(Long articleId) {
        
this.articleId = articleId;
    }
}

编写Dao层代码ArticleDao.java如下:

package personal.youxia.dao;import org.springside.modules.orm.hibernate.HibernateDao;import personal.youxia.entity.Article;public  ArticleDao extends HibernateDao<Article, Long> {
}


CommentDao.java如下:

package personal.youxia.dao;import org.springside.modules.orm.hibernate.HibernateDao;import personal.youxia.entity.Comment;public  CommentDao extends HibernateDao<Comment, Long> {
}

可以看出以上代码都从HibernateDao继承得益于泛型支持基本不需要编写行代码
编写Bussiness层代码白衣使用包名为service而类名后缀都是Manager我就跟他学算了懒得改了
ArticleManager.java如下:

package personal.youxia.service;import org.springframework.beans.factory.annotation.Autowired;import org.springside.modules.orm.hibernate.HibernateDao;import personal.youxia.dao.ArticleDao;import personal.youxia.entity.Article;public  ArticleManager extends EntityManager<Article, Long> {    @Autowired    private ArticleDao articleDao;
    public void ArticleDao(ArticleDao articleDao) {        this.articleDao = articleDao;    }
    @Override    protected HibernateDao<Article, Long> getEntityDao {        // TODO Auto-generated method stub         articleDao;    }
}


CommentManager.java如下:

package personal.youxia.service;import org.springframework.beans.factory.annotation.Autowired;import org.springside.modules.orm.hibernate.HibernateDao;import personal.youxia.dao.CommentDao;import personal.youxia.entity.Comment;public  CommentManager extends EntityManager<Comment, Long> {    @Autowired    private CommentDao commentDao;
    public void CommentDao(CommentDao commentDao) {        this.commentDao = commentDao;    }
    @Override    protected HibernateDao<Comment, Long> getEntityDao {        // TODO Auto-generated method stub         commentDao;    }
}

以上代码大同小异都是从EntityManager继承并使用SpringIoC特性Dao类注入到Manager类的中并重载getEntityDao思路方法来使用该注入Dao这个时候为了验证这些数据访问相关层能否正常运行可以编写单元测试代码如下:

package personal.youxia.test;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springside.modules.test.junit4.SpringTxTestCase;import personal.youxia.entity.entities.Article;import personal.youxia.entity.entities.Comment;import personal.youxia.service.ArticleManager;import personal.youxia.service.CommentManager;public  DataAccessTest extends SpringTxTestCase {    @Autowired    private ArticleManager articleManager;    @Autowired    private CommentManager commentManager;
    public void ArticleManager(ArticleManager articleManager) {        this.articleManager = articleManager;    }
    @Test    public void addArticle {        Comment comment =  Comment;        Article article =  Article;        article.Subject("test");        article.Content("test");        articleManager.save(article);        comment.ArticleId(article.getId);        commentManager.save(comment);    }}

单元测试运行发现了 3个问题先是出现Manager类没有注入成功经检查发现所有Manager类都应该使用@Service注解再出现是提示Dao类没有注入成功经检查发现所有Dao类须使用@Repository注解最后出现是找不到Entity经检查发现Entity类不能位于personal.youxia.entity包中必须位于其子包中这是由applicationContext.xml文件中配置决定更改包名为personal.youxia.entity.entities问题解决
步就应该是编写ActionJSP由于文章太长Blogjava编辑器中编辑已经非常缓慢了所以只有将该文章分为上中下 3部分且看下回分解!

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: