构建富客户端程序 GWT2.3 + Guice3.0 + hibernateJPA 程序代码
来源:互联网 发布:sql语句找出相同数据 编辑:程序博客网 时间:2024/05/21 11:09
构建富客户端程序 GWT2.3 + Guice3.0 + hibernateJPA 程序代码。
Created Thursday 05 May 2011
gwt2.3 是开发 web2.0 的最理想的技术框架。
但只有 MVC中的 显示 和控制。 而模型这部分 没有给出 相关的实现。
用 spring + hiberante 倒是可以。但是 太过重量级的了。本来 web2.0就是应该快速的。
用上 spring 的IOC 反而感觉会慢点了。启动慢,加载慢。所以选择了一个轻量级的IOC-guice
guice 从 2.0 的版本就开始关注。2.0的版本 还是一个IOC注入 框架。通过@Inject 标记注入bean。
我从 3.0的beta版本就开始关注了。发现里面有了持久层框架的实现 JpaPersistModule
开始的并没有太明白怎么使用这个Module。经过一段学习发现其实很简单。只要在模块启动时候new JpaPersistModule("XXX_unit")
就可以了。
废话少说。启动从 web.xml 开始配置下。
<!-- guice conf begin --> <listener> <listener-class>com.freewebsys.sns.guice.GuiceListener</listener-class> </listener> <filter> <filter-name>guice</filter-name> <filter-class>com.google.inject.servlet.GuiceFilter</filter-class> </filter><filter-mapping> <filter-name>guice</filter-name> <url-pattern>/*</url-pattern></filter-mapping><!-- guice conf end →
然后是GuiceListener类的实现
import com.freewebsys.core.dao.BaseDao;import com.freewebsys.core.dao.JpaBaseDao;import com.freewebsys.sns.server.GreetingServiceImpl;import com.google.inject.Guice;import com.google.inject.Injector;import com.google.inject.Singleton;import com.google.inject.persist.PersistFilter;import com.google.inject.persist.jpa.JpaPersistModule;import com.google.inject.servlet.GuiceServletContextListener;import com.google.inject.servlet.ServletModule;public class GuiceListener extends GuiceServletContextListener {public Injector getInjector() {return Guice.createInjector(new JpaPersistModule("jpa_unit"), new ServletModule() { protected void configureServlets() { // url重写 // bind(UrlRewriteFilter.class).in(Singleton.class); // filter("/*").through(UrlRewriteFilter.class); // 先进行事物控制 filter("/*").through(PersistFilter.class); // 不可以配置Singleton bind(BaseDao.class).to(JpaBaseDao.class); bind(GreetingServiceImpl.class).in(Singleton.class); serve("/freewebsys_gwt_sns/greet").with(GreetingServiceImpl.class); // Service End } }); }}
其中new JpaPersistModule("jpa_unit") 是加载 jpa实现的模块。配置在src/META-INF/persistence.xml
别忘记自己运行的时候修改 数据库连接用户名密码。还要创建数据库。表就不用创建了。用hibernate.hbm2ddl.auto" value="update创建。
<?xml version="1.0" encoding="UTF-8" ?><persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0"><!-- JPA "unit" --><persistence-unit name="jpa_unit" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <!-- Pojo Begin --> <class>com.freewebsys.sns.pojo.UserInfo</class> <!-- pojo End --> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties><property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /><property name="hibernate.connection.url" value="jdbc:mysql://127.0.0.1:3306/freewebsys?autoReconnect=true&useUnicode=true&characterEncoding=utf-8" /><property name="hibernate.connection.username" value="freewebsys" /><property name="hibernate.connection.password" value="freewebsys" /><property name="hibernate.connection.pool_size" value="2" /><property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /><property name="hiberante.cache_provider" value="org.hibernate.cache.NoCacheProvider" /><property name="hibernate.connection.autocommit" value="true" /><property name="hibernate.cache.use_query_cache" value="false" /><property name="hibernate.cache.use_second_level_cache" value="false" /><property name="hibernate.hbm2ddl.auto" value="update" /><property name="hibernate.show_sql" value="true" /><property name="hibernate.format_sql" value="false" /><!-- <property name="cglib.use_reflection_optimizer" value="true"/> --><!-- hibernate的c3p0连接池配置(需要jar包:c3p0-0.9.0.4.jar) --><property name="hibernate.connection.provider_class" value="org.hibernate.connection.C3P0ConnectionProvider" /><!-- 最小连接数 --><property name="hibernate.c3p0.min_size" value="5" /><!-- 最大连接数 --><property name="hibernate.c3p0.max_size" value="30" /><!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 <property name="hibernate.c3p0.maxIdleTime" value="60" /> --><!-- 获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒 --><property name="hibernate.c3p0.timeout" value="1800" /><!-- 最大的PreparedStatement的数量 --><property name="hibernate.c3p0.max_statements" value="50" /><!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒 --><property name="hibernate.c3p0.idle_test_period" value="120" /><!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 --><property name="hibernate.c3p0.acquire_increment" value="1" /><!-- 是否每次都验证连接是否可用 <property name="c3p0.validate" value="false" /> --> </properties></persistence-unit></persistence>
其中POJO类配置
@Entitypublic class UserInfo implements java.io.Serializable {public static final String USER_SESSION = "userInfoSession";// 用户session常量@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;//private Date createTime;// 创建时间@Column(length = 100)private String email;// 电子邮件@Column(length = 100)private String name;// 真实姓名@Column(length = 100)private String passwd;// 密码@Column(length = 1)private Integer sex;// 性别@Column(length = 10)private String birthday;// 生日@Column(length = 10)private String bloodType;// 血型private Integer currentProvince;// 所在省private Integer currentCity;// 所在城市@Column(length = 100)private String currentArea;// 所在地区private Integer adminLevel;// 管理员级别private Integer active;// 是否激活 private Integer score;// 积分.....省略get set 方法
这个是使用 hibernate JPA + c3p0 数据源的配置文件。
// 先进行事物控制
filter("/*").through(PersistFilter.class);
// 不可以配置Singleton,否则事物有问题
bind(BaseDao.class).to(JpaBaseDao.class);
配置一个通用dao的实现。
接下来就是gwt的servlet配置。在guice下面配置就不用在web.xml下面单独进行配置了。效果是一样的。
bind(GreetingServiceImpl.class).in(Singleton.class);//一定要配置成但立模式
serve("/freewebsys_gwt_sns/greet").with(GreetingServiceImpl.class);
接下来就是GreetingServiceImpl
@Inject private BaseDao baseDao; public String greetServer(String input) throws IllegalArgumentException { List<UserInfo> userList = baseDao.find("from UserInfo "); for (UserInfo userInfo : userList) { System.out.println("userInfo:getId:\t" + userInfo.getId()); } return "yes"; }
没执行复杂查询。就是将userInfo 全部查询并显示Id
gwt这里没有进行太复杂的代码就是 默认 创建的 一个 heloworld。点击一个按钮执行后台。
要运行这个程序需要 安装 google gwt 插件。并且需要修改 appengine本地运行的白名单。
在工程目录/doc/appengine-tools-api.jar下替换${appengine_home}/lib/appengine-tools-api.jar
然后就可以跑通程序了。
运行效果
代码下载地址:
http://freewebsys.googlecode.com/files/freewebsys_gwt_sns.2011.05.tar.gz