1. SSH 配置
- 1). applicationContext.xml
<?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:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 外部化 Bean 配置信息 --> <context:property-placeholder location="classpath:c3p0.properties" /> <!-- 配置数据源 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="user" value="${user}" /> <property name="password" value="${password}" /> <property name="jdbcUrl" value="${url}" /> <property name="driverClass" value="${driver}" /> <property name="minPoolSize" value="5" /> <property name="initialPoolSize" value="2" /> <property name="maxPoolSize" value="20" /> <property name="acquireIncrement" value="2" /> </bean> <!-- 配置 Hibernate 的 SessionFactory 对象 --> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:hibernate.cfg.xml"></property> </bean> <!-- 配置 Bean --> <bean id="user" class="com.tieba.hibernate.domain.User"></bean> <bean id="article" class="com.tieba.hibernate.domain.Article"></bean> <!-- 配置 DAO --> <bean id="userDao" class="com.tieba.hibernate.dao.UserDao"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="articleDao" class="com.tieba.hibernate.dao.ArticleDao"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="articleIndexDao" class="com.tieba.hibernate.dao.ArticleIndexDao"> <property name="compass" ref="compass" /> <property name="compassTemplate" ref="compassTemplate" /> </bean> <!-- 配置 Action --> <!-- 用户 --> <bean name="/user-add" class="com.tieba.web.struts.action.UserAction"> <property name="userDao" ref="userDao" /> </bean> <!-- 文章管理 --> <bean name="/article" class="com.tieba.web.struts.action.ArticleAction"> <property name="articleDao" ref="articleDao" /> </bean> <!-- 搜索文章 --> <bean name="/searchArticle" class="com.tieba.web.struts.action.SearchArticleAction"> <property name="articleIndexDao" ref="articleIndexDao"/> </bean> <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- 1. 配置基于 注解的事务驱动 <tx:annotation-driven transaction-manager="transactionManager"/> --> <!-- 2.1 声明事物通知 方法使用哪些事物属性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <!-- 配置事务属性 为那些方法配置事物属性,eg:事物传播性(REQUIRED(常用), REQUIERS_NEW),事物的隔离级别, 设置事物的回滚属性(运行异常, 检查异常(IOException)),事物超时回滚时间, 事物是否只读 --> <tx:method name="findAll*" propagation="REQUIRED" read-only="true"/> <tx:method name="*"/> </tx:attributes> </tx:advice> <!-- 2.2 配置事务的应用 配置对哪些类的哪些方法使用事物管理 --> <aop:config proxy-target-class="true"> <aop:pointcut expression="execution(* com.tieba.hibernate.dao.*.*(..))" id="txPontCut" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="txPontCut" /> </aop:config> <!-- 配置拦截器 --> <bean name="logger" class="com.tieba.spring.aop.LoggingInterceptor" /> <!-- 配置拦截器代理 --> <bean name="loggingAutoProxy" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> <property name="beanNames"> <list> <value>/article</value> </list> </property> <property name="interceptorNames"> <list> <value>logger</value> </list> </property> </bean> </beans>
- 2). hibernate.cfg.xml
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- SQL 方言 --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- sql 格式化 --> <property name="show_sql">true</property> <!-- Drop and re-create the database schema on startup create-drop --> <property name="hbm2ddl.auto">update</property> <!-- SSH中使用getCurrentSession()获得session 需要配置如下属性 <property name="current_session_context_class">thread</property> --> <!-- 使用二级缓存 <property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.use_query_cache">true</property> <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property> --> <mapping resource="com/tieba/hibernate/domain/User.hbm.xml"/> <mapping resource="com/tieba/hibernate/domain/Article.hbm.xml"/> <!-- <class-cache class="com.tieba.hibernate.domain.Article" usage="read-only"/> --> </session-factory> </hibernate-configuration>
- 3). c3po.properties
user=root password=rootroot driver=com.mysql.jdbc.Driver url=jdbc\:mysql\:///tieba
- 4). struts-config.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "http://struts.apache.org/dtds/struts-config_1_3.dtd"> <struts-config> <form-beans> <form-bean name="userForm" type="com.tieba.web.struts.from.UserForm" /> <form-bean name="articleFrom" type="com.tieba.web.struts.from.ArticleFrom"/> <form-bean name="searchArticleActionForm" type="com.tieba.web.struts.from.SearchArticleActionForm"/> </form-beans> <action-mappings> <!-- 初始化 --> <action path="/init" type="cn.itcast.lucene.init.InitAction"> <forward name="toListTopic" path="/article.do?method=listTopic" redirect="true"></forward> </action> <action path="/user-add" name="userForm" parameter="method" scope="request" type="org.springframework.web.struts.DelegatingActionProxy" input="/register.jsp"> <forward name="success" path="/success.jsp" /> </action> <!-- 贴子管理 --> <action path="/article" name="articleFrom" parameter="method" scope="request" type="org.springframework.web.struts.DelegatingActionProxy" validate="false"> <forward name="listTopic" path="/WEB-INF/pages/article/listTopic.jsp" /> <forward name="toListTopic" path="/article.do?method=listTopic" redirect="true" /> <forward name="showTopic" path="/WEB-INF/pages/article/showTopic.jsp" /> </action> <action path="/searchArticle" name="searchArticleActionForm" parameter="method" scope="request" type="org.springframework.web.struts.DelegatingActionProxy" input="/register.jsp"> <forward name="showResult" path="/WEB-INF/pages/search/showResult.jsp"></forward> </action> </action-mappings> <message-resources parameter="com.tieba.web.struts.resource.ApplicationResources" /> </struts-config>
- 5). web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>tieba</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/classes/applicationContext*.xml</param-value> </context-param> <!-- 注册Spring的监听 --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <!-- Standard Action Servlet Configuration --> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/classes/struts-config.xml</param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <!-- Standard Action Servlet Mapping --> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <!-- spring的字符集过滤器 --> <filter> <filter-name>springCharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>springCharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- Log4Init --> <servlet> <servlet-name>log</servlet-name> <servlet-class>com.tieba.web.servlet.Log4Init</servlet-class> <load-on-startup>1</load-on-startup> </servlet> </web-app>
2. compass 配置.
- applicationContext-compass.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" default-lazy-init="true"> <!-- 用注解的方式 索引 --> <bean id="annotationConfiguration" class="org.compass.annotations.config.CompassAnnotationsConfiguration"></bean> <!-- 配置 Compass --> <bean id="compass" class="org.compass.spring.LocalCompassBean"> <!-- <property name="resourceDirectoryLocations"> <list> <value>classpath:com</value> </list> </property> --> <!-- 设置索引目录 --> <property name="connection"> <value>/lucene/indexes</value> </property> <!-- 配置建立索引的类 --> <property name="classMappings"> <list> <value>com.tieba.hibernate.domain.Article</value> </list> </property> <property name="compassConfiguration" ref="annotationConfiguration" /> <!-- 设置 分词器 高亮器 摘要长度 等信息 --> <property name="compassSettings"> <props> <prop key="compass.transaction.factory"> org.compass.spring.transaction.SpringSyncTransactionFactory </prop> <!-- 庖丁 分解器 中文分词器:jeasy.analysis.MMAnalyzer --> <prop key="compass.engine.analyzer.MMAnalyzer.CustomAnalyzer"> net.paoding.analysis.analyzer.PaodingAnalyzer </prop> <!-- 指定摘要的文本长度 --> <prop key="compass.engine.highlighter.default.fragmenter.simple.size">100</prop> <!-- 配置高亮效果的前缀 <用<替代 >用>替代 --> <prop key="compass.engine.highlighter.default.formatter.simple.pre"><span style='color:red; font-weight:900'></prop> <!-- 配置高亮效果的后缀 --> <prop key="compass.engine.highlighter.default.formatter.simple.post"></span></prop> </props> </property> <property name="transactionManager" ref="transactionManager" /> </bean> <!--hibernate驱动 链接compass和hibernate --> <bean id="hibernateGpsDevice" class="org.compass.gps.device.hibernate.HibernateGpsDevice"> <property name="name"> <value>hibernateDevice</value> </property> <property name="sessionFactory" ref="sessionFactory" /> <property name="mirrorDataChanges"> <value>true</value> </property> </bean> <!-- 同步更新索引 --> <bean id="compassGps" class="org.compass.gps.impl.SingleCompassGps" init-method="start" destroy-method="stop"> <property name="compass" ref="compass" /> <property name="gpsDevices"> <list> <bean class="org.compass.spring.device.SpringSyncTransactionGpsDeviceWrapper"> <property name="gpsDevice" ref="hibernateGpsDevice" /> </bean> </list> </property> </bean> <bean id="compassTemplate" class="org.compass.core.CompassTemplate"> <property name="compass" ref="compass" /> </bean> <!-- 定时重建索引(利用quartz)或随Spring ApplicationContext启动而重建索引 --> <bean id="compassIndexBuilder" class="com.tieba.web.service.CompassIndexBuilder" lazy-init="false"> <property name="compassGps" ref="compassGps" /> <!-- 每次起动时是否重建索引 true重建, false不重建 --> <property name="buildIndex" value="true" /> <property name="lazyTime" value="10" /> </bean> </beans>
3. 主要方法.
- 1). CompassIndexBuild.java
package com.tieba.web.service; import org.apache.log4j.Logger; import org.compass.gps.CompassGps; import org.springframework.beans.factory.InitializingBean; /** * 通过quartz定时调度定时重建索引或自动随Spring ApplicationContext启动而重建索引的Builder. * 会启动后延时数秒新开线程调用compassGps.index()函数. * 默认会在Web应用每次启动时重建索引,可以设置buildIndex属性为false来禁止此功能. * 也可以不用本Builder, 编写手动调用compassGps.index()的代码. * */ public class CompassIndexBuilder implements InitializingBean { Logger log = Logger.getLogger(InitializingBean.class); // 是否需要建立索引,可被设置为false使本Builder失效. private boolean buildIndex = false; // 索引操作线程延时启动的时间,单位为秒 private int lazyTime = 10; // Compass封装 private CompassGps compassGps; // 索引线程 private Thread indexThread = new Thread() { @Override public void run() { try { Thread.sleep(lazyTime * 1000); // System.out.println("begin compass index....."); log.info("begin compass index....."); long beginTime = System.currentTimeMillis(); // 重建索引. // 如果compass实体中定义的索引文件已存在,索引过程中会建立临时索引, // 索引完成后再进行覆盖. compassGps.index(); long costTime = System.currentTimeMillis() - beginTime; // System.out.println("compss index finished."); // System.out.println("costed " + costTime + " milliseconds"); log.info("compss index finished."); log.info("costed " + costTime + " milliseconds"); } catch (InterruptedException e) { e.printStackTrace(); } } }; /** * 实现<code>InitializingBean</code>接口,在完成注入后调用启动索引线程. * * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet() */ public void afterPropertiesSet() throws Exception { if (buildIndex) { indexThread.setDaemon(true); indexThread.setName("Compass Indexer"); indexThread.start(); } } public void setBuildIndex(boolean buildIndex) { this.buildIndex = buildIndex; } public void setLazyTime(int lazyTime) { this.lazyTime = lazyTime; } public void setCompassGps(CompassGps compassGps) { this.compassGps = compassGps; } }
- 2). 搜索方法 ArticleIndexDaoImpl.java
/** * 搜索 * @param quertyString 关键词 * @return */ public List<Article> find(String queryString){ CompassSession session = compass.openSession(); CompassHits hits = null; List<Article> list = new ArrayList<Article>(); try { hits = session.find(queryString); for (int i = 0; i < hits.length(); i++) { Article article = (Article) hits.data(i); // ====================================== 使用高亮器 // 如果在高亮的属性值中没有出现关键词,就返回null String title = hits.highlighter(i).fragment("title"); String content = hits.highlighter(i).fragment("content"); if (title != null) { article.setTitle(title); } if (content != null) { article.setContent(content); } list.add(article); } } catch (Exception e) { e.printStackTrace(); } finally { session.close(); } return list; }
相关推荐
在整合Compass时,Spring可以帮助管理搜索引擎的生命周期,以及提供事务一致性。 2. Struts2:作为MVC(Model-View-Controller)框架,它负责处理HTTP请求,并将业务逻辑与视图分离。在整合Compass后,可以通过...
这篇博客文章“Compass与ssh框架整合”将深入探讨如何将Compass集成到SSH框架中,以实现更高效的数据检索。 首先,我们需要理解SSH框架的核心组件: 1. **Spring**:是一个全面的开源应用框架,提供了依赖注入(DI...
本资源是struts2 + spring2.5 + hibernate 3.2 + lucene 2.4 + compass 2.0整合实例,可以为初学入门者,提供个参考,本人也是网上找的,感觉很不错(因其中所用的jar文件太大,无法上传,大家可以自己添加各框架...
SSH+compass整合的小例子,导入即可运行,数据库用的是mysql,用的都是注解技术,代码良好,dao层用了江南白衣的思想,根据泛型和反射封装,可以做基类,里面有注册和查询的小例子,基本可以在此基础上继续开放你所...
**整合 Compass、Hibernate、Struts 2 和 Spring:** 这个集成示例可能包含了一个使用这些框架协同工作的 Web 应用项目。通常,整合步骤会涉及到以下内容: - 将所有必要的 JAR 包添加到项目的类路径中,包括 ...
通过研究这个SSH2+Compass2.2搜索实例,开发者可以学习到如何在J2EE应用中整合多个框架以实现复杂的功能,如搜索引擎集成。此外,还会了解如何使用MyEclipse这样的IDE进行开发,以及如何管理和部署SQL数据库。这是一...
Spring还能管理事务、整合其他框架,如Hibernate,以及提供服务层和数据访问层的支持。 Hibernate作为持久化层的解决方案,简化了数据库操作,通过对象关系映射(ORM)实现了Java对象与数据库表的对应,支持CRUD...
标题中的“compass+ssh2集成 hibernategps问题”指的是在Java开发中,开发者尝试将Compass搜索引擎库与SSH2(Spring、Struts和Hibernate)框架整合时遇到的问题,特别是与Hibernate的GPS(Global Persistent ...
这个实例提供了从零开始使用Compass进行全文检索的一个起点,通过它你可以快速地了解和实践Compass的使用,同时也可以学习如何在SSH框架下整合全文检索功能。在深入学习和实践中,你将进一步掌握如何利用Compass提升...
这个是compass整合ssh的例子,最重要的一点是一对多的关联这方面,寡人整了一天才把compass关联搞定,网上有关compass的资源太少了,不想让以后的人这么为难,咱就上传个我自己的练习吧,有较为详细的注释,希望能对...
- Compass Lucene用于整合全文搜索功能。 5. 软件开发和维护效率的提升: - 通过SSH框架的扩展与集成,开发者可以在统一的架构下利用各种技术优势,降低开发复杂性,提高代码的复用度,从而提高软件开发和维护的...
总结来说,这个项目展示了如何通过整合Struts2、Hibernate、Spring和Compass,构建一个具备全文检索功能的Java Web应用。这样的架构不仅实现了业务逻辑和数据访问的解耦,还提高了数据查询的性能,为用户提供了一种...
标题中的“业余框架整合-SSHD-(1)-整体概述”指的是一个关于集成SSH(Spring、Struts、Hibernate)与SSHD(Secure Shell Daemon)框架的教程。SSH是Java Web开发中常用的三大框架,用于构建MVC模式的应用程序,而...
整合这些技术时,开发者通常会创建一个综合的配置文件体系,例如Spring的配置文件可以管理所有组件的依赖和配置,通过引入Struts、Hibernate、JPA、Lucene、JBPM和Compass的相关配置。这需要对每个框架的原理有深入...
他还熟练掌握Spring框架,包括IOC、DI、AOP以及SSH整合。此外,他了解Mybatis和SpringMVC框架。在数据库技能方面,他熟悉Oracle和MySQL,能进行PL/SQL开发并优化MySQL数据库。 除了这些核心技术,王强还擅长前端...
Spring框架的使用也很熟练,包括IOC/DI、AOP、声明式事务处理以及SSH整合。他还/她熟悉Mybatis和SpringMVC框架。 在数据库技能方面,工程师熟悉Oracle和MySQL,能够进行PL/SQL开发和数据库优化。除此之外,他/她还...
此外,他还熟悉Spring框架,包括IOC、DI、AOP和SSH整合。 在数据库技能方面,景鑫熟悉Oracle和MySQL,能够进行PL/SQL开发,并了解MySQL的优化。他掌握了JBPM工作流技术,了解Lucene和Compass全文搜索引擎,以及Web ...