浏览 12891 次
精华帖 (2) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-09-19
前言:
关于Struts2系列的文章网上基本上都有了,但鲜有比较系统的Demo。这几天朋友要我做了一个面试题,于是我用Struts2做了这个比较完整的Demo。
本程序用到的主要技术为:
Struts2,Spring,Hibernate,DWR,JavaMail,以及少部分正则表达式。其实都是非常基础简单的应用,目的就是让大家看看这些框架是如何协同工作的。开发平台为:Winxp2+JDK1.5+Tomcat5.5+MySQL5.0。
以下是本例子的需求:
每5分钟遍历一下页面(http://post.baidu.com/f?kw=%D2%EC%C8%CB%B0%C1%CA%C0%C2%BC),
请统计页面中"《"和"》"之间有多少个"异人"这两个字,
将这数值弹出一个alert并且发信给指定的邮件地址 获取页面内所有地方的以"<< >>"为标示的这个符号代表书名号,获取之中的内容 <<使用正则表达式>> 功能点:
1)URL抓取页面。
2)正则表达式匹配。
3)邮件系统调用 请注意设计思路和代码规范。
第一部分:
1. 设计实体
本程序共有四个实体:
User:用户基本信息,可用来登录本系统。
Article:存储每次通过正则从URL抓取的目标数据总数。
Log:邮件发送时的日志类。
Mail:邮件发送列表。
两个抽象实体,目的是为了承继。
PrimaryEntiry:承继主键(id)
CommonEntity:承继候选键(name)
实体之间的关系:
只有Log与Mai之间是多对一的关系。在看下面的Pojo类的时候需要注意一下,我这里用的是JPA,关系都写在Annotation里了。
以下是这几个实体详细信息:
PrimaryEntity.java
java 代码
CommonEntity.java java 代码
Article.java java 代码
Log.java java 代码
Mail.java java 代码
User.java java 代码
2. DAO与Service实现
正如大家所想,在Java世界里,DAO与Servcie的实现是大同小异的。这里我的例子足够小了,而且其实有了Hibernate就已经具备了DAO的能力,因些这里只有Service层的设计。
先定义一个父接口,把尽可能相同的事都在父类里面搞定:
IGenericService.java
java 代码
以及它的实现
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-11-01
GenericServiceImpl.java
/** * 顶层父类 */ package com.leo.service.impl; import java.io.Serializable; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.transaction.annotation.Transactional; import com.leo.service.IGenericService; import com.leo.util.PageInfo; /** * @author superleo * */ public class GenericServiceImpl<T, PK extends Serializable> implements IGenericService<T, PK> { private Class<T> type; private HibernateTemplate hibernateTemplate; public GenericServiceImpl(Class<T> type) { this.type = type; } @Transactional public void delete(T t) { hibernateTemplate.delete(t); } public T load(PK id) { return (T) hibernateTemplate.get(type, id); } @Transactional public PK store(T t) { return (PK) hibernateTemplate.save(t); } @Transactional public void update(T t) { hibernateTemplate.update(t); } public T findByNameExact(String name) { List<T> list = this.getHibernateTemplate().find( "from " + type.getName() + " e where e.name = ? ", name); return list != null && list.size() == 1 ? list.get(0) : null; } public List<T> findByName(String name, PageInfo pageInfo) throws Exception { String hql = "from " + type.getName() + " e where e.name like '%" + name + "%' "; return this.findByAll(hql, pageInfo); } public List<T> findByAll() throws Exception { String hql = "from " + type.getName() + " e"; System.out.println(hql); return this.getHibernateTemplate().find(hql); } public List<T> findByAll(final String hql, PageInfo pageInfo) throws Exception { List<T> pagelist = null; Session session = this.getHibernateTemplate().getSessionFactory() .openSession(); pageInfo.setRecordCount(this.getTotalCount(session, hql)); Query query = session.createQuery(hql); int start = (pageInfo.getPage() - 1) * pageInfo.getPageSize(); int rowNum = pageInfo.getPageSize(); query.setFirstResult(start); query.setMaxResults(rowNum); pagelist = query.list(); return pagelist; } public List<T> deleteByAll(final String hql) throws Exception { List<T> pagelist = null; Session session = this.getHibernateTemplate().getSessionFactory() .openSession(); Query query = session.createQuery(hql); query.executeUpdate(); return pagelist; } // 取得总数 public int getTotalCount(Session session, String hql) throws Exception { Integer amount = new Integer(0); int sql_from = hql.indexOf("from"); int sql_orderby = hql.indexOf("order by");// 为了改进 String countStr = ""; if (sql_orderby > 0) { countStr = "select count(*) " + hql.substring(sql_from, sql_orderby); } else countStr = "select count(*) " + hql.substring(sql_from); Query query = session.createQuery(countStr); if (!query.list().isEmpty()) { amount = new Integer(query.list().get(0).toString()); } else return 0; return amount.intValue(); } public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } } |
|
返回顶楼 | |
发表时间:2007-11-01
其它的Service只需要继承它了,就可以很方便的使用了,要编码的地方不是特别的多了。Javaeye Blog总出问题,只能这样发给大家看了,详细的代码会提交上来的。下面在第二篇来讲讲Spring的配置。
|
|
返回顶楼 | |
发表时间:2007-11-01
如果下载了原代码需要修改两个地方:
1.src下的leo.conf文件,里面改你数据用户,密码,以及你的邮件服务器,还有账号和密码 2.数据库表tbl_mail里的邮件改成你自己的邮件,这样项目运行后,你才知道你到底有没有收到信。 |
|
返回顶楼 | |
发表时间:2008-01-10
正则,说实话,在几年前用PHP的时候曾经使用非常频繁,而且写正则感觉很有成就感,呵呵,实际上对使用的人来说就一些标记而已,如果只是记那些东西,对一个人的技术能力没有太大关系。
|
|
返回顶楼 | |