在这一部分中,我将继续演示JSF,Guice和MyBatis的集成。 在持久层中使用DBCP连接池和MYSQL数据库。 看一下第1部分 。
在上一篇文章中 ,我们创建了一个ServletContextListener。 现在,我们只需要在contextInitialized方法中绑定BasicDataSourceProvider和JdbcTransactionFactory。
GuiceContextListener.java
package org.borislam;
import java.util.Properties;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import org.apache.log4j.xml.DOMConfigurator;
import org.borislam.mapper.StaffMapper;
import org.borislam.service.SimpleService;
import org.borislam.service.impl.SimpleServiceImpl;
import org.mybatis.guice.MyBatisModule;
import org.mybatis.guice.datasource.dbcp.BasicDataSourceProvider;
import org.mybatis.guice.datasource.helper.JdbcHelper;
import com.google.inject.Guice;
import com.google.inject.Injector;
import com.google.inject.Singleton;
import com.google.inject.name.Names;
public class GuiceContextListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent servletContextEvent) {
ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.removeAttribute(Injector.class.getName());
}
public void contextInitialized(ServletContextEvent servletContextEvent) {
Injector injector = Guice.createInjector(
new MyBatisModule() {
@Override
protected void initialize() {
install(JdbcHelper.MySQL);
environmentId('development');
bindDataSourceProviderType(BasicDataSourceProvider.class);
bindTransactionFactoryType(JdbcTransactionFactory.class);
Names.bindProperties(binder(), createServerProperties());
//add singleton service class
bind(SimpleService.class).to(SimpleServiceImpl.class).in(Singleton.class);
//add MyBatis Service class
addMapperClass(StaffMapper.class);
}
}
);
ServletContext servletContext = servletContextEvent.getServletContext();
servletContext.setAttribute(Injector.class.getName(), injector);
//log4J
DOMConfigurator.configure(
Thread.currentThread().getContextClassLoader()
.getResource('log4j.xml')
);
}
protected static Properties createServerProperties() {
Properties myBatisProperties = new Properties();
myBatisProperties.setProperty('JDBC.host', 'localhost');
myBatisProperties.setProperty('JDBC.port', '3306');
myBatisProperties.setProperty('JDBC.schema', 'ttcoach');
myBatisProperties.setProperty('JDBC.username', 'root');
myBatisProperties.setProperty('JDBC.password', '');
myBatisProperties.setProperty('JDBC.autoCommit', 'false');
return myBatisProperties;
}
}
Staff.java
package org.borislam.model;
public class Staff {
private String code;
private String name;
private String sex;
private String tel;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
}
StaffMapper.java
package org.borislam.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.borislam.model.Staff;
public interface StaffMapper {
final String SELECT_ALL = 'SELECT * FROM FREELANCER';
final String SELECT_BY_CODE = 'SELECT * FROM FREELANCER WHERE CODE = #{code}';
/**
* Returns the list of all Freelancer instances from the database.
* @return the list of all Freelancer instances from the database.
*/
@Select(SELECT_ALL)
@Results(value = {
@Result(property='code', column='code'),
@Result(property='name', column='name'),
@Result(property='sex', column='sex'),
@Result(property='tel', column='tel')
})
List<Staff> selectAll();
/**
* Returns a Freelancer instance from the database.
* @param id primary key value used for lookup.
* @return A Freelancer instance with a primary key value equals to pk. null if there is no matching row.
*/
@Select(SELECT_BY_CODE)
@Results(value = {
@Result(property='code', column='code'),
@Result(property='name', column='name'),
@Result(property='sex', column='sex'),
@Result(property='tel', column='tel')
})
Staff selectByCode(String code);
}
SimpleService.java
package org.borislam.service;
public interface SimpleService {
public void doSimpleThing();
}
SimpleServiceImpl.java
package org.borislam.service.impl;
import java.util.List;
import org.borislam.mapper.StaffMapper;
import org.borislam.model.Staff;
import org.borislam.service.SimpleService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.Inject;
public class SimpleServiceImpl implements SimpleService {
private StaffMapper staffMapper;
Logger logger = LoggerFactory.getLogger(this.getClass());
@Inject
public void setStaffMapper(StaffMapper staffMapper) {
this.staffMapper = staffMapper;
}
public void doSimpleThing() {
List<Staff> staffList = staffMapper.selectAll();
logger.debug('size 1: ' + staffList.size());
Staff staff = staffMapper.selectByCode('c001');
logger.debug('Code1 : ' + staff.getCode());
logger.debug('Name 1: ' + staff.getName());;
}
}
TestBean.java
package org.borislam.view;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.inject.Inject;
import org.borislam.service.SimpleService;
import org.borislam.service.TestService;
@ManagedBean
@SessionScoped
public class TestBean extends BasePageBean {
private SimpleService sService;
@Inject
public void setsService(SimpleService sService) {
this.sService = sService;
}
public String doTest(){
System.out.println('test 1 inside backing bean...');
sService.doSimpleThing();
return '';
}
public String doTest2(){
System.out.println('test 2 inside backing bean...');
sService.doSimpleThing();
return '';
}
}
index.xhtml
<html xmlns='http://www.w3c.org/1999/xhtml'
xmlns:h='http://java.sun.com/jsf/html'
xmlns:p='http://primefaces.org/ui'>
<h:head>
<style>
.ui-widget, .ui-widget .ui-widget {
font-size: 80% !important;
}
</style>
</h:head>
<h:body>
<h:form>
<h:outputText value='#{msg['website.title']}' />
<p:calendar id='popupButtonCal' showOn='button' />
<p:commandButton value='TEST2' action='#{testBean.doTest}'/>
<p:editor/>
<br/>
</h:form>
</h:body>
</html>
大功告成! 现在,您可以准备基于此框架编写JSF应用程序。 参考: 轻量级Web应用程序框架:来自我们的JCG合作伙伴 Boris Lam的PrimeFaces(JSF)+ Guice + MyBatis(PART 2) ,位于“ 编程和平”博客上。