В этой части я продолжу демонстрировать интеграцию JSF, Guice и MyBatis. Пул соединений DBCP и база данных MYSQL используются на постоянном уровне. Посмотрите на часть 1 .
Интегрировать Google Guice с MyBatis
В предыдущем посте мы создали ServletContextListener. Теперь мы просто связываем BasicDataSourceProvider и JdbcTransactionFactory в методе contextInitialized.
GuiceContextListener.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
|
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; }} |
Подготовьте свой класс картографа MyBatis и класс модели
Staff.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
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
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
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
|
1
2
3
4
5
|
package org.borislam.service;public interface SimpleService { public void doSimpleThing();} |
SimpleServiceImpl.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
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());; }} |
Подготовьте страницу поддержки JSF и XML-страницу
TestBean.java
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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@SessionScopedpublic 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
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
<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 на основе этого фреймворка.
Ссылка: облегченная платформа веб-приложений: PrimeFaces (JSF) + Guice + MyBatis (ЧАСТЬ 2) от нашего партнера по JCG Бориса Лэма в блоге Programming Peaceful .