Enterprise Java
Lightweight Web Application Framework: PrimeFaces (JSF) + Guice + MyBatis (Part 2)
In this part, I will continue to demonstrate the integration of JSF, Guice and MyBatis. DBCP connection pool and MYSQL database is used in persistence layer. Take a look at Part 1.
Integrate Google Guice with MyBatis
In the previous post, we have created a ServletContextListener. Now, we just bind the BasicDataSourceProvider and JdbcTransactionFactory in the contextInitialized method.
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; } }
Prepare your MyBatis mapper class and model class
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); }
Prepare your Service Class
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());; } }
Prepare your JSF Backing Bean and xhtml page
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>
That’s done! You can now ready to write your JSF application based on this framework.
Reference: Lightweight Web Application Framework: PrimeFaces (JSF) + Guice + MyBatis (PART 2) from our JCG partner Boris Lam at the Programming Peacefully blog.