1、JSF+Spring+JPAHibernate实现的环境搭建写之前的感受刘岩 先说好的,文章后再说缺点。JSF+Spring+JPA以我个人看来,应该说是Struts2+Spring+Hibernate的替代解决方案。引入JPA去取代或者说包装或者说是升级Hibernate是为了符合JAVA EE的规范,达到ORM统一的结果。下次项目用EJB也好、用TOPLINK也好、用ibatis也罢,我们的开发人员代价会很小。在目前很多项目来说,引入此规范,能更好的代码复用,持久层和控制层相当于进一步的解耦合了,你只需要开启项目之前好好地建立领域模型。那么用JSF取代Struts2或者更早一点的Strut
2、s1又是为何!答案依然是,它是规范。是符合某些标准的规范。不是说Struts2不好,这个因项目而定才行。我个人还是比较推崇apache的Struts2的,当然了,apache的JSF实现和JSF组件也是相当地杠杠的!JSF更贴近事件比较多的web前端处理机制。想想我们一般要接收和处理页面的各种事件是用什么:js函数+ajax处理是吧(Flex我没有接触过,不知道它是怎么样的处理前后台交互的)。JSF可以采用事件监听机制,控件(JSF里面叫做控件)被触发了某些时间,直接优雅的和POJO进行了交互,配合ajax4jsf,处理大量的控件的事件是很简洁方便的。言归正传,开始。1. 首先利用IDE建立一
3、个Web项目2. 加入相应的jar包,注意:所有的开源框架都是加入jar包的时候最麻烦,尤其加入了Spring,搞不好就他妈的启动服务的时候报错。我已经将相应需要的jar包放到了csdn上面共享了,网址是3. web项目加入JSF支持修改web.xml,加入如下内容 org.springframework.web.context.ContextLoaderListener javax.faces.CONFIG_FILES /WEB-INF/faces-config.xml contextConfigLocation /WEB-INF/classes/applicationContext.xml
4、 javax.faces.STATE_SAVING_METHOD client facelets.LIBRARIES /WEB-INF/facelets/tags/arcmind.taglib.xml;/WEB-INF/tomahawk.taglib.xml 指定facelets支持的后缀 javax.faces.DEFAULT_SUFFIX .xhtml Ajax4jsf Filter ajax4jsf org.ajax4jsf.Filter ajax4jsf Faces Servlet REQUEST FORWARD INCLUDE Faces Servlet javax.faces.we
5、bapp.FacesServlet 1 Faces Servlet *.faces 为正确使用tomahawk组件包而配置 extensionsFilter org.apache.myfaces.webapp.filter.ExtensionsFilter uploadMaxFileSize 10m uploadThresholdSize 100 extensionsFilter *.faces extensionsFilter /faces/*在WEB-INF下面加入jsf_core.tld、html_basic.tld和tomahawk.taglib.xml文件、新建一个faces-con
6、fig.xml文件,内容配置如下: zh_CN com.sun.facelets.FaceletViewHandler org.springframework.web.jsf.DelegatingVariableResolver 再加入facelets框架的标签支持包,整个环境包大致如下图所示:4. 上面的配置好了,JSF和Spring就集成起来了。下面我们加入JPA支持,并且将JPA和Spring集成起来。首先加入persistence.xml文件,内容如下: org.hibernate.ejb.HibernatePersistence test.vo.Test 之后建立一个值对象,代码如下
7、:package mangerTeam.vo;import java.io.Serializable;import java.util.Set;import javax.persistence.Basic;import javax.persistence.CascadeType;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.FetchType;import javax.persistence.GeneratedValue;import javax.persiste
8、nce.GenerationType;import javax.persistence.Id;import javax.persistence.JoinColumn;import javax.persistence.JoinTable;import javax.persistence.Lob;import javax.persistence.ManyToMany;import javax.persistence.ManyToOne;import javax.persistence.Table;/* * 运动员实体 * * author 刘岩 */EntityTable(name = playe
9、r)public class PlayersVO implements Serializable Id GeneratedValue(strategy = GenerationType.AUTO) Column(name = id, unique = true, nullable = false) private Integer id; Column(name = name) private String name; ManyToOne(optional=true, fetch = FetchType.LAZY) JoinColumn(name = teamId) private TeamVO
10、 teamVO; ManyToOne(fetch = FetchType.LAZY) JoinColumn(nullable=false,name = nationalityId) private NationalityVO nationalityVO; Lob Basic(fetch = FetchType.LAZY) Column(name = pic) private byte pic; Lob Basic(fetch = FetchType.LAZY) Column(name = mess) private String mess; ManyToMany(cascade = Casca
11、deType.REFRESH, fetch = FetchType.LAZY) JoinTable(name = plays_position, joinColumns = JoinColumn(name = playerId) , inverseJoinColumns = JoinColumn(name = positionId) ) private Set positions; public Integer getId() return id; public void setId(Integer id) this.id = id; public String getName() retur
12、n name; public void setName(String name) this.name = name; public Set getPositions() return positions; public void setPositions(Set positions) this.positions = positions; public TeamVO getTeamVO() return teamVO; public void setTeamVO(TeamVO teamVO) this.teamVO = teamVO; public NationalityVO getNatio
13、nalityVO() return nationalityVO; public void setNationalityVO(NationalityVO nationalityVO) this.nationalityVO = nationalityVO; public byte getPic() return pic; public void setPic(byte pic) this.pic = pic; public String getMess() return mess; public void setMess(String mess) this.mess = mess; 之后写DAO,
14、无论你是用IDE生成的DAO还是自己写的DAO,代码大致如下:package mangerTeam.dao;import java.util.HashMap;import java.util.List;import javax.persistence.EntityManager;import javax.persistence.PersistenceException;import javax.persistence.Query;import mangerTeam.vo.PlayersVO;import org.springframework.context.ApplicationContex
15、t;import org.springframework.orm.jpa.JpaCallback;import org.springframework.orm.jpa.support.JpaDaoSupport;import org.springframework.transaction.annotation.Transactional;Transactionalpublic class PlayerDAO extends JpaDaoSupport implements IPlayerDAO / property constants public static final String NA
16、ME = name; public static final String MESS = mess; public static final String PIC = pic; public void save(PlayersVO entity) logger.info(saving Player instance); try getJpaTemplate().persist(entity); logger.info(save successful); catch (RuntimeException re) logger.error(save failed, re); throw re; pu
17、blic void delete(PlayersVO entity) logger.info(deleting Player instance); try entity = getJpaTemplate().getReference(PlayersVO.class, entity.getId(); getJpaTemplate().remove(entity); logger.info(delete successful); catch (RuntimeException re) logger.error(delete failed, re); throw re; public Players
18、VO update(PlayersVO entity) logger.info(updating Player instance); try PlayersVO result = getJpaTemplate().merge(entity); logger.info(update successful); return result; catch (RuntimeException re) logger.error(update failed, re); throw re; public PlayersVO findById(Integer id) logger.info(finding Pl
19、ayer instance with id: + id); try PlayersVO instance = getJpaTemplate().find(PlayersVO.class, id); return instance; catch (RuntimeException re) logger.error(find failed, re); throw re; SuppressWarnings(unchecked) public List findByProperty(String propertyName, final Object value, final int. rowStart
20、IdxAndCount) logger.info(finding Player instance with property: + propertyName + , value: + value); try final String queryString = select model from PlayersVO model where model. + propertyName + = :propertyValue; return getJpaTemplate().executeFind(new JpaCallback() public Object doInJpa(EntityManager em) throws PersistenceException Query query = em.createQuery(queryString); query.setParameter(propertyValue, value); if (rowStartIdxAndCount != null & rowStartIdxAndCount.length 0) / 有分页 int rowStartIdx = Math.max(0, rowStartIdxAndCount0); / 开始页 if (rowStartIdx
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1