Struts2+Spring+Hibernate In Action(一)
前言:关于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
}
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;
}
}
2 楼 kyo100900 2007-11-01 其它的Service只需要继承它了,就可以很方便的使用了,要编码的地方不是特别的多了。Javaeye Blog总出问题,只能这样发给大家看了,详细的代码会提交上来的。下面在第二篇来讲讲Spring的配置。 3 楼 kyo100900 2007-11-01 如果下载了原代码需要修改两个地方:
1.src下的leo.conf文件,里面改你数据用户,密码,以及你的邮件服务器,还有账号和密码
2.数据库表tbl_mail里的邮件改成你自己的邮件,这样项目运行后,你才知道你到底有没有收到信。 4 楼 huhaitao 2007-11-19 org.springframework.mail.MailSendException; nested exception details (1) are:
Failed message 1:
com.sun.mail.smtp.SMTPSendFailedException: 553 You are not authorized to send mail, authentication is required
at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1275)
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:895)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:524)
at org.springframework.mail.javamail.JavaMailSenderImpl.doSend(JavaMailSenderImpl.java:391)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:300)
at org.springframework.mail.javamail.JavaMailSenderImpl.send(JavaMailSenderImpl.java:286)
at com.leo.util.JavaMailSenderUtil.sendMail(JavaMailSenderUtil.java:45)
at com.leo.service.impl.ArticleServiceImpl.storeByURL(ArticleServiceImpl.java:79)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:281)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:199)
at $Proxy18.storeByURL(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.directwebremoting.impl.ExecuteAjaxFilter.doFilter(ExecuteAjaxFilter.java:34)
at org.directwebremoting.impl.DefaultRemoter$1.doFilter(DefaultRemoter.java:428)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:431)
at org.directwebremoting.impl.DefaultRemoter.execute(DefaultRemoter.java:283)
at org.directwebremoting.servlet.PlainCallHandler.handle(PlainCallHandler.java:52)
at org.directwebremoting.servlet.UrlProcessor.handle(UrlProcessor.java:101)
at org.directwebremoting.servlet.DwrServlet.doPost(DwrServlet.java:146)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:413)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:78)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:77)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685)
at java.lang.Thread.run(Thread.java:595)
帮忙看一下这是什么问题?谢谢! 5 楼 andyjames 2008-01-09 非常感谢。向你学习 6 楼 ken1984 2008-01-10 正则,说实话,在几年前用PHP的时候曾经使用非常频繁,而且写正则感觉很有成就感,呵呵,实际上对使用的人来说就一些标记而已,如果只是记那些东西,对一个人的技术能力没有太大关系。 7 楼 kingpeixin 2008-01-14 灰熊不错的说,继续跟踪学习 8 楼 xtwcw 2008-05-19 谢谢 学习中 9 楼 gongchangming 2008-07-05 照片是本人吗~!好漂亮啊~! 10 楼 depravedangel 2008-08-04 备注一下,以后慢慢看
11 楼 kingcxw 2008-08-05 学习~~~~~~~~~~~~~~~~~