Struts2 Hibernate Spring 註解,Lucene全文檢索索引,WebService 大整合

來源:互聯網
上載者:User

大家好,本人目前為上海張江男,這邊IT氛圍很好,本人在這邊生活了半年,感覺很不錯,哈哈。

下面是我自己總結的ssh2的註解,本人感覺入門還是可以的,所以就拿出手了,歡迎與大家交流,QQ:4218380 謝謝大家。

二話不說,直接上Spring.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:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/context           http://www.springframework.org/schema/context/spring-context-2.5.xsd">    <!-- 註解配置,掃描com.niclo包下面的資訊 -->    <context:annotation-config/>    <context:component-scan base-package="com.niclo" />    <!-- 資料庫屬性檔案 --><beanclass="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"><property name="locations"><value>classpath:jdbc.properties</value></property></bean><!-- 資料庫配置資訊 --><bean id="dataSource" destroy-method="close"class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName"value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></bean><!-- sessionFactory 配置資訊,這個必須滴 --><bean id="sessionFactory" destroy-method="destroy"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="dataSource" ref="dataSource" /> <property name="packagesToScan" value="com.niclo.vo"></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">${jdbc.dialect}</prop><prop key="hibernate.show_sql">true</prop><prop key="hibernate.hbm2ddl.auto">none</prop></props></property></bean></beans>

一個VO類,也有人說是PO,DTO,都可以這樣說,一個封裝類僅此而已。

package com.niclo.vo;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.GenerationType;import javax.persistence.Id;import javax.persistence.Table;@Entity@Table(name="testVo")public class TestVo {public static final String ID = "id";public static final String TITLE = "title";public static final String TYPE = "type";public static final String NAME = "name";public static final String DESCRIPTION = "description";public static final String URL = "url";private Integer id;private String title;private String type;private String name;private String description; private String url;@Id@GeneratedValue(strategy=GenerationType.AUTO)public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getTitle() {return title;}public void setTitle(String title) {this.title = title;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getUrl() {return url;}public void setUrl(String url) {this.url = url;}public String getDescription() {return description;}public void setDescription(String description) {this.description = description;}}

一個Dao介面,自訂的弱弱有點亂碼,但我相信犀利的會懂的。

package com.niclo.base;import java.io.Serializable;import java.util.List;import java.util.Map;import org.springframework.dao.DataAccessException;/** * BaseDao介面, 該介面可以被任何ssh/s2sh架構使用<br> * @author 北極光? * @QQ 4218380 * @version 0.8 $ Dec 07, 2010 $ 19:40:40 PM $ *  */public interface BaseDao {//void setConnection(String dbName);/** * 統計行數 *  * @param clazz *        �?參數為Class肯定比物件查詢效率高     �?��被統計的執行個體 */int count(Class clazz);/** * 查詢�?��對象 * 持久化指定的執行個體 * @param clazz *     被載入的�? *  @param id *   被序列化類別id */<T> T findById(Class clazz,Serializable id);/** * 儲存�?��對象 * 持久化指定的執行個體 * @param entity *    �?��被持久化的實�? */void save (Object entity);/** * 儲存�?��對象, 該方法與save方法的區別是: 假設Hibernate有一個saveWithGeneratorId()方法,     * 該方法負責向資料庫插入數�?在不�?��事務的情況下: save方法會去調用該方�? 進行對象的保�? 然後由資料庫進行復原     * persist()方法則不會去調用該方�? * entity * 持久化指定的執行個體 * @param entity *    �?��被持久化的實�? *@ */void persist(Object entity);/** *  這個叫果斷刪除一個對象不解釋     * 刪除�?��對象     * @param entity     * 要刪除的對象     */void delete(Object entity);       /**     * 使用namedQuery 執行刪除...     *      * @param namedQuery     * HQL語句名稱     * @param values     * 值列�?     * @return     * @throws DataAccessException     */    Integer deleteByNamedQuery (String namedQuery , Object ... values) throws DataAccessException;    /** * 使用HQL刪除資料 * @param HQL * HQL語句 * @param valueMap * 存放值的Map * @return * 刪除後的數量 * @throws DataAccessException */ Integer deleteByHQLQuery(String HQL, Map<String, Object> valueMap)throws DataAccessException;/** * 這個叫修改一個對象不解釋     * 修改�?��對象     * @param entity     * 要刪除的對象     */void update(Object entity);    /**     * 使用namedQuery 執行更新...     *      * @param namedQuery     * HQL語句名稱     * @param values     * 值列�?     * @return     * @throws DataAccessException     */    Integer updateByNamedQuery (String namedQuery , Object ... values) throws DataAccessException;    /** * 使用HQL更新資料 * @param HQL * HQL語句 * @param valueMap * 存放值的Map * @return * 更新或後的數�? * @throws DataAccessException */ Integer updateByHQLQuery(String HQL, Map<String, Object> valueMap)throws DataAccessException;/** * 儲存或�?更新�?��對象 * 持久化指定的執行個體 * @param entity     �?��被持久化的實�? */void saveOrUpdate (Object entity);    /**     * 使用get方法載入對象     * @param <T>     * 類型資訊 T     * @param entityClass     * 要載入的�?     * @param id     * 要載入的id     * @return     * 如果未找�? 則返回null.     * @throws DataAccessException     */    <T> T get(Class<T> entityClass, Serializable id);    /**     * 使用namedQuery查詢全部資料, 分頁查詢     * @param <T>     * @param namedQuery     * @param beginResult     * @param maxResult     * @param values     * @return     * @throws DataAccessException     */     <T> List<T> findByNamedQuery(String namedQuery, int beginResult, int maxResult, Object ... values)throws DataAccessException;               /**      * 使用namedQuery查詢全部資料, 分頁查詢      * @param <T>      * @param namedQuery      * @param cacheName      * 如果不指定緩衝名�? 則表示不緩衝      * @param values      * @return      * @throws DataAccessException      */      <T> List<T> findByNamedQuery(String namedQuery, String cacheName, Object ... values)throws DataAccessException;           /**      * 使用namedQuery查詢單個對象      *       * @param <T>        * @param namedQuery 支援去xxx.hbm.xml檔案找HQL語句哦,      * 不過我都放在NamedQueryConstants常量類裡面了,所以直接NamedQueryConstants.xxxx就可以啦      * @param values      * @return      * @throws DataAccessException      */     <T> T getByNamedQuery (String namedQuery , Object ... values) throws DataAccessException;               /**      * 根據條件尋找對象, 並是否緩�?      * @param <T>      * @param HQL      * @param valueMap      * @param cacheName      * 如果不指定緩衝名�? 則表示不緩衝      * @return      * @throws DataAccessException      */    <T> List<T> findByHQLQuery(String HQL, Map<String, Object> valueMap, String cacheName)throws DataAccessException;        /**     * 使用HQL從資料庫尋找資料, 支援分頁查詢     * @param HQL     * HQL語句, HQL語句�?��使用具名引數的形�?     * @param valueMap     * �?��Map, key 為命名參�?     * @param firstResult     * �?��行數     * @param maxResult     * �?��行數     * @return     * @throws DataAccessException     */   <T> List<T> findByHQLQuery(String HQL, Map<String, Object> valueMap, int firstResult, int maxResult)throws DataAccessException;        /**      * 該方法從資料庫中�?��單個對象, 支援動�?執行個體化結�?      * @param <T>      * @param HQL      * @param valueMap      * @return      * @throws DataAccessException      */     <T> T getByHQLQuery(String HQL, Map<String, Object> valueMap) throws DataAccessException;          /**      * 該方法從資料庫中�?��單個對象, 支援動�?執行個體化結�?      * @param <T>      * @param HQL      * @param valueMap      * @return      * @throws DataAccessException      */     <T> List<T> findByExample(String exampleName, Object exampleEntity,int firstResult,int maxResults);     }

DaoImpl實作類別,sessionFactory也在裡面哦,用到了hibernateTemplate , 唯寫一個實現方法,因為太多了。

/** * BaseDao為Dao基類, 該類可以被任意模組的DaoImpl類繼承使�?br> * @author 餘曉�? * @QQ 4218380 * @version 0.1 $ May 11, 2011 $ 13:40:40 PM $ *  */@Component("dao")public class BaseDaoImpl implements BaseDao{public HibernateTemplate hibernateTemplate;@Resource(name="sessionFactory")public void setSessionFactory(SessionFactory sessionFactory) {hibernateTemplate = new HibernateTemplate(sessionFactory);}public <T> T findById(Class entityClass, Serializable id) {return (T) hibernateTemplate.get(entityClass, id);}}

Service介面,只定義一個方法吧。

public interface BaseService {/** * 統計行數 *  * @param clazz * 參數為Class肯定比物件查詢效率高     �?��被統計的執行個體 */int count(Class clazz);/** * 查詢�?��對象 * 持久化指定的執行個體 * @param clazz *     被載入的�? *  @param id *   被序列化類別id */<T> T findById(Class entityClass,Serializable id);/** * 儲存�?��對象 * 持久化指定的執行個體 * @param entity     �?��被持久化的實�? */boolean save (Object entity);}

BaseServiceImpl實作類別,這裡關係到怎麼調用Dao ,其實很棒簡單,就是@Resource 一下,但是dao 是跟你在BaseDaoImpl的Component("dao")的dao名字一樣的哦,

同理其他類要引用此BaseServiceImpl就可以 private @Resource BaseServiceImpl service; 這樣就可以了,至於為什麼因為spring.xml裡面配置了,謝謝。

@Component("service")public class BaseServiceImpl implements BaseService{private @Resource BaseDao dao;public int count(Class entity) {returndao.count(entity);}public <T> T findById(Class entityClass, Serializable id) {return dao.findById(entityClass, id);}public boolean delete(Object entity) {boolean flag = false;try {dao.delete(entity);flag = true;} catch (DataAccessException e) {throw e;}return flag;}}

接下來是Struts2的Action怎麼引用Service 與 怎麼用Struts2的註解了。

package com.niclo.action;import java.util.List;import javax.annotation.Resource;import org.apache.struts2.convention.annotation.Action;import org.apache.struts2.convention.annotation.Result;import com.niclo.base.BaseService;import com.niclo.vo.TestVo;public class UserAction {private static final String SUCCESS = "(@.@)..?";private static final String INPUT = "(^.^)..!";private @Resource BaseService service;private List<TestVo> list;@Action(value="test")public void test(){TestVo vo =service.findById(TestVo.class, 1);System.out.println(vo.getName()+"test..");}@Action(value = "searchAction", results = {    @Result(name = SUCCESS,location="/result.jsp"),    @Result(name = INPUT,location="/lucene.jsp")  })public String searchAction(){//這裡service的方法要自己去寫點了。//list = service.調用查詢分頁,詳見該Dome的原始碼return SUCCESS;}public List<TestVo> getList() {return list;}public void setList(List<TestVo> list) {this.list = list;}}

好坤坤了,今天去浦江吹了一天風,最後一個FillMap協助類,此類是專解析HQL滴。

package com.niclo.util;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public final class FillMap {private static final Log log = LogFactory.getLog(FillMap.class);private FillMap(){}/** * 根據指定的HQL查詢條件和�?列表填充Map * @param factory * 查詢的HQL條件 * @param obj *     值列�? * @return * 封裝入Map後的�? */public static Map<String, Object> fillValue(String HQL, Object ... obj){Map<String, Object> valueMap = new HashMap<String, Object>(4);Pattern pattern = Pattern.compile("[:][a-zA-Z0-9]+");Matcher matcher = pattern.matcher(HQL);String findGroup = null;for(int i = 0; i < obj.length; i++){if(matcher.find()){findGroup = matcher.group();valueMap.put(findGroup.substring(1, findGroup.length()), obj[i]);}}pattern = null;matcher = null;if(log.isInfoEnabled()){log.info("〓�?〓�?〓�?〓�?〓�?〓�?〓�?〓�?〓�? GET THE HQL IS 〓�?〓�?〓�?〓�?〓�?〓�?〓�?〓�?〓�? \n " +HQL + "\n fill the named parameter key / value is \n" + valueMap);}return valueMap;}@SuppressWarnings("unchecked")public static void main(String[] args) {    List list = new ArrayList();    list.add(0);    list.add(-99);    list.add(1);    list.add(2);  System.out.println( fillValue("abc =:anc, dy=:dd, xx =:xx,yy=:yy", list.toArray()));}}

我把自己寫好的例子已經上傳到了CSDN裡面,可以直接下載的,搞例子包括ssh2註解 Lucene 全文檢索索引與WebService 。

技術是拿來分享與討論是最快樂的事情,因為只有人與人溝通才是最快樂的,與電腦只是為了讓生活更美好。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.