SlideShare a Scribd company logo
Servlet3-javaConfig
한방 스팀팩
JBOSS USER GROUP 이용혁
13년 9월 8일 일요일
Agenda
✓ servlet3
✓ javaConfig
✓ Spring3.2
✓ properties
✓ datasource
✓ mybatis3
✓ mongoDB
✓ cache - infinispan
✓ sitemesh
✓ DEMO
✓ Q & A
✓ Thanks
13년 9월 8일 일요일
Servlet3
✓ @WebServlet
✓ @WebFilter
✓ @WebInitParam
✓ @WebListener
✓ @MultipartConfig
http://download.oracle.com/otn-pub/jcp/servlet-3.0-fr-eval-oth-JSpec/servlet-3_0-final-spec.pdf?AuthParam=1378521700_c856fbccc3460a9c9e8be159abb92ee9
13년 9월 8일 일요일
javaConfig
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://
java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/
ns/javaee/web-app_2_5.xsd" version="2.5">
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/classes/app-config.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
web.xml
13년 9월 8일 일요일
javaConfig with Spring
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
{
@Override
protected Class<?>[] getRootConfigClasses() {
return null;
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class<?>[] { WebConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[] { characterEncodingFilter, new SiteMeshFilter()};
}
}
WebInitializer.java
13년 9월 8일 일요일
Spring 3.2.?
http://static.springsource.org/spring-framework/docs/
3.2.0.RELEASE/spring-framework-reference/html/
mvc.html#mvc-container-config
13년 9월 8일 일요일
Spring 3.2.? with javaConfig
@EnableWebMvc
@ComponentScan(basePackages = "com.playfam.web")
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
localeChangeInterceptor.setParamName("lang");
registry.addInterceptor(localeChangeInterceptor);
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
Charset s = Charset.forName("UTF-8");
converters.add(new StringHttpMessageConverter(s));
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/views/");
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Bean
public MultipartResolver multipartResolver() {
CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
multipartResolver.setMaxUploadSize(5*1024*1024);
return multipartResolver;
}
}
13년 9월 8일 일요일
properties
@Configuration
@PropertySource({
"classpath:db.${spring.profiles.active:local}.properties",
"classpath:conf.${spring.profiles.active:local}.properties"
})
public class PropertiesConfig {
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){
return new PropertySourcesPlaceholderConfigurer();
}
}
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:db.${spring.profiles.active}.properties</value>
<value>classpath:conf.${spring.profiles.active}.properties</value>
</list>
</property>
</bean>
13년 9월 8일 일요일
datasource
<tx:annotation-driven/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${db.mssql.driverClassName}"/>
<property name="url" value="${db.mssql.url}"/>
<property name="username" value="${db.mssql.username}"/>
<property name="password" value="${db.mssql.password}"/>
<property name="maxActive" value="${db.mssql.maxActive}" />
<property name="maxIdle" value="${db.mssql.maxIdle}" />
<property name="maxWait" value="${db.mssql.maxWait}" />
<property name="defaultAutoCommit" value="${db.mssql.defaultAutoCommit}" />
</bean>
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
13년 9월 8일 일요일
datasource
@Configuration
@EnableTransactionManagement
public class DatabaseConfig {
@Profile({ "local", "dev", "stg" })
static class Local {
@Autowired Environment env;
@Bean
public DataSource dataSource() {
BasicDataSource ds = new BasicDataSource();
try{
ds.setDriverClassName(env.getProperty("db.mysql.driverClassName"));
ds.setUrl(env.getProperty("db.mysql.url"));
ds.setUsername(env.getProperty("db.mysql.username"));
ds.setPassword(env.getProperty("db.mysql.password"));
}catch(Exception e){
e.printStackTrace();
}
return ds;
}
}
@Bean
@Autowired
public DataSourceTransactionManager txManager(DataSource dataSource){
DataSourceTransactionManager txManager = new DataSourceTransactionManager();
txManager.setDataSource(dataSource);
return txManager;
}
}
@Profile({ "real" })
@Resource(name="jdbc/MyDB")
static class Prod {
@Bean
public DataSource dataSource() {
final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
dsLookup.setResourceRef(true);
DataSource dataSource = dsLookup.getDataSource("java:comp/dnv/jdbc/MyDB");
return dataSource;
}
}
13년 9월 8일 일요일
mybaties3.?
@Configuration
//@MapperScan("classpath:com/playfam/web/model/mapper/**/*.xml")
public class MybatisConfig {
@Bean
@Autowired
public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{
SqlSessionFactoryBean sb = new SqlSessionFactoryBean();
sb.setDataSource(dataSource);
sb.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:com/playfam/web/model/mapper/*.xml")
);
sb.setConfigLocation(new DefaultResourceLoader().getResource("classpath:config_mybatis.xml"));
return sb.getObject();
}
@Bean
@Autowired
public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory){
SqlSessionTemplate s = new SqlSessionTemplate(sqlSessionFactory);
return s;
}
}
기존설정 유지
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mapperLocations" value="classpath:com/playfam/model/mapper/**/*.xml" />
<property name="configLocation" value="classpath:config_mybatis.xml" />
</bean>
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory" />
</bean>
13년 9월 8일 일요일
mongoDB
@Configuration
public class MongoConfig {
@Autowired Environment env;
@Bean
public MongoTemplate mongoTemplate() {
return new MongoTemplate(
env.getProperty("db.mongo.dbName"),
env.getProperty("db.mongo.user"),
env.getProperty("db.mongo.pass"),
env.getProperty("db.mongo.host"),
Integer.parseInt(env.getProperty("db.mongo.port")),
Boolean.parseBoolean(env.getProperty("db.mongo.autoConnectRetry")),
Integer.parseInt(env.getProperty("db.mongo.connectionsPerHost")),
Integer.parseInt(env.getProperty("db.mongo.connectTimeout")),
Integer.parseInt(env.getProperty("db.mongo.maxWaitTime")),
Integer.parseInt(env.getProperty("db.mongo.threadsAllowedToBlockForConnectionMultiplier")),
Integer.parseInt(env.getProperty("db.mongo.socketTimeout"))
);
}
}
<bean id="mongoTemplate" class="com.itembay.common.mongo.MongoTemplate">
<constructor-arg name="dbName" value="${db.mongo.name}"/>
<constructor-arg name="username" value="${db.mongo.user}"/>
<constructor-arg name="password" value="${db.mongo.pass}"/>
<constructor-arg name="host" value="${db.mongo.host}"/>
<constructor-arg name="port" value="${db.mongo.port}"/>
<constructor-arg name="autoConnectRetry" value="${db.mongo.autoConnectRetry}"/>
<constructor-arg name="connectionsPerHost" value="${db.mongo.connectionsPerHost}"/>
<constructor-arg name="connectTimeout" value="${db.mongo.connectTimeout}"/>
<constructor-arg name="maxWaitTime" value="${db.mongo.maxWaitTime}"/>
<constructor-arg name="threadsAllowedToBlockForConnectionMultiplier" value="$
{db.mongo.threadsAllowedToBlockForConnectionMultiplier}"/>
<constructor-arg name="socketTimeout" value="${db.mongo.socketTimeout}"/>
<constructor-arg name="cacheConfigPath" value="${cache.prop.path}"/>
</bean>
13년 9월 8일 일요일
mongoDB
public class MongoTemplate {
private static DB db;
private static MongoClient mongoClient;
public MongoTemplate(String dbName, String username, String password,
String host, int port, boolean autoConnectRetry,
int connectionsPerHost, int connectTimeout,
int maxWaitTime, int threadsAllowedToBlockForConnectionMultiplier,
int socketTimeout) {
if(mongoClient == null){
Builder b = MongoClientOptions.builder();
b.autoConnectRetry(autoConnectRetry);
b.connectionsPerHost(connectionsPerHost);
b.connectTimeout(connectTimeout);
b.maxWaitTime(maxWaitTime);
b.threadsAllowedToBlockForConnectionMultiplier(threadsAllowedToBlockForConnectionMultiplier);
b.socketTimeout(socketTimeout);
MongoClientOptions options = b.build();
try {
List<ServerAddress> list = new ArrayList<ServerAddress>();
for(String h : host.split(";")){
list.add(new ServerAddress(h.split(":")[0], Integer.parseInt(h.split(":")[1])));
}
mongoClient = new MongoClient(list,options);
mongoClient.setWriteConcern(WriteConcern.SAFE);
db = mongoClient.getDB(dbName);
db.authenticate(username, password.toCharArray());
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static DBCollection getDBCollection(String collectionName){
return db.getCollection(collectionName);
}
}
13년 9월 8일 일요일
cache - infinispan
@Configuration
@EnableCaching
public class InfinispanConfig {
@Bean
public SpringRemoteCacheManagerFactoryBean cacheManager() throws Exception{
SpringRemoteCacheManagerFactoryBean cacheManager = new SpringRemoteCacheManagerFactoryBean();
String active = System.getProperty("spring.profiles.active", "local");
cacheManager.setConfigurationPropertiesFileLocation(
new DefaultResourceLoader().getResource("classpath:hotrod-client-"+active+".properties")
);
return cacheManager;
}
} @Autowired CacheManager cacheManager;
@Test
public void test() throws Exception {
//obtain a handle to the remote default cache
Cache cache = cacheManager.getCache("default");
//now add something to the cache and make sure it is there
cache.put("car", "ferrari");
assert cache.get("car").get().equals("ferrari");
cache.evict("car");
assert cache.get("car").equals(null);
}
https://docs.jboss.org/author/display/ISPN/Using+Infinispan+as+a+Spring+Cache+provider
13년 9월 8일 일요일
cache - infinispan
✓ @Cacheable
✓ @CachePut
✓ @CacheEvict
@Cacheable(value = "authCache", key = "#key")
public DBObject getAuthInfo(String key) throws Exception
@CachePut(value = "authCache", key = "#key")
public DBObject generateAuthInfo(String key) throws Exception
@CacheEvict(value = "authCache", key = "#key")
public void removeAuthInfo(String key) throws Exception
13년 9월 8일 일요일
sitemesh@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
return new Filter[] { characterEncodingFilter, new SiteMeshFilter()};
}
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/WEB-INF/decorators/">
<excludes>
<pattern>/rss/*</pattern>
<pattern>/test/*</pattern>
<pattern>*.json</pattern>
</excludes>
<decorator name="default" page="mobileLayout.jsp">
<pattern>/</pattern>
</decorator>
<decorator name="mobile" page="webLayout.jsp">
<pattern>*.m</pattern>
</decorator>
<decorator name="app" page="appLayout.jsp">
<pattern>*.app</pattern>
</decorator>
</decorators>
13년 9월 8일 일요일
Thank You !
Q & A
www.playfam.com
unlogicaldev@gmail.com
https://github.com/unlogicaldev/springServlet3JavaConfig
13년 9월 8일 일요일

More Related Content

PDF
[Spring Camp 2013] Java Configuration 없인 못살아!
PDF
Cloud, Cache, and Configs
PDF
Apache ignite - a do-it-all key-value db?
DOC
Apache hadoop 2_installation
PDF
Czym jest webpack i dlaczego chcesz go używać?
ODP
DbSetup
PDF
The Spring 4 Update - Josh Long
PDF
Burn down the silos! Helping dev and ops gel on high availability websites
[Spring Camp 2013] Java Configuration 없인 못살아!
Cloud, Cache, and Configs
Apache ignite - a do-it-all key-value db?
Apache hadoop 2_installation
Czym jest webpack i dlaczego chcesz go używać?
DbSetup
The Spring 4 Update - Josh Long
Burn down the silos! Helping dev and ops gel on high availability websites

What's hot (20)

ODP
Unit testing: unitils & dbmaintain
ODP
Assertj-DB
KEY
Talkaboutlithium
PDF
4069180 Caching Performance Lessons From Facebook
PPTX
SpringBoot with MyBatis, Flyway, QueryDSL
KEY
Sexy.js: A Sequential Ajax (Sajax) library for jQuery
ODT
Hadoop on aws amazon
PDF
Zendcon 2007 Api Design
KEY
Drupal as a web framework
PDF
Nagios Conference 2012 - Sheeri Cabral - Alerting With MySQL and Nagios
PDF
DBD::SQLite
PDF
Multi Client Development with Spring - Josh Long
PPTX
Azure Expert Leading Camp UA - 2015
PDF
Algotitmo Moinho
PDF
Managing a shared mysql farm dpc11
PDF
HTML5 JavaScript APIs
PDF
PuppetCamp SEA 1 - Version Control with Puppet
PPT
Plmce2015 java 101 - david bennett
PDF
OSGi framework overview
PDF
Ansible leveraging 2.0
Unit testing: unitils & dbmaintain
Assertj-DB
Talkaboutlithium
4069180 Caching Performance Lessons From Facebook
SpringBoot with MyBatis, Flyway, QueryDSL
Sexy.js: A Sequential Ajax (Sajax) library for jQuery
Hadoop on aws amazon
Zendcon 2007 Api Design
Drupal as a web framework
Nagios Conference 2012 - Sheeri Cabral - Alerting With MySQL and Nagios
DBD::SQLite
Multi Client Development with Spring - Josh Long
Azure Expert Leading Camp UA - 2015
Algotitmo Moinho
Managing a shared mysql farm dpc11
HTML5 JavaScript APIs
PuppetCamp SEA 1 - Version Control with Puppet
Plmce2015 java 101 - david bennett
OSGi framework overview
Ansible leveraging 2.0
Ad

Viewers also liked (20)

PDF
الكتاب المقدس العهد الجديد - رسالة بولس الرسول لاهل روميه
PPTX
PDF
الكتاب المقدس العهد القديم - سفر التكوين
PPTX
Svb Time
PPTX
나는 거대한 꿈을 꿨다(2012년11월)
PPTX
Albert helps the BYOD phenomenon
PDF
Executive-Classic Resume vs. Standard Resume
PDF
Inv pres q32014_final
PPTX
Travis Weisleder "Special Finance Online"
DOCX
Rancangan mengajar yang betul
DOCX
Peresmian kelas honda
PPTX
Arco animazione
PPTX
Tools and practices for rapid application development
PPTX
Content Hub "Robotik im Pflegesektor"
PDF
20 09 12 tresc projektu rozporzadzenia
PPTX
Goods And Services Tax
PPT
Instant GMP Compliance Series -Better Compliance through Master Manufacturing...
PPT
PDF
الصهيونيه و المسيحيه نقيضان محاضرة ل الدكتور القس رياض جرجور
PPTX
7 advanced facebook techniques for the savvy dealer
الكتاب المقدس العهد الجديد - رسالة بولس الرسول لاهل روميه
الكتاب المقدس العهد القديم - سفر التكوين
Svb Time
나는 거대한 꿈을 꿨다(2012년11월)
Albert helps the BYOD phenomenon
Executive-Classic Resume vs. Standard Resume
Inv pres q32014_final
Travis Weisleder "Special Finance Online"
Rancangan mengajar yang betul
Peresmian kelas honda
Arco animazione
Tools and practices for rapid application development
Content Hub "Robotik im Pflegesektor"
20 09 12 tresc projektu rozporzadzenia
Goods And Services Tax
Instant GMP Compliance Series -Better Compliance through Master Manufacturing...
الصهيونيه و المسيحيه نقيضان محاضرة ل الدكتور القس رياض جرجور
7 advanced facebook techniques for the savvy dealer
Ad

Similar to spring3.2 java config Servler3 (20)

ODP
Running ms sql stored procedures in mule
ODP
Running ms sql stored procedures in mule
PDF
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
PDF
the Spring 4 update
PDF
Jaxitalia09 Spring Best Practices
PPTX
สปริงเฟรมเวิร์ค4.1
PDF
Rediscovering Spring with Spring Boot(1)
PDF
dokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdf
PDF
dokumen.tips_rediscovering-spring-with-spring-boot1.pdf
PDF
Java Web Programming [5/9] : EL, JSTL and Custom Tags
PDF
Jlook web ui framework
PPTX
JBoss AS Upgrade
PPTX
Spring dependency injection
PDF
Tomcat连接池配置方法V2.1
PDF
Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010
PDF
How to replace rails asset pipeline with webpack?
PDF
Java Web Development with Stripes
PDF
GlassFish REST Administration Backend
KEY
[Coscup 2012] JavascriptMVC
PDF
GlassFish REST Administration Backend at JavaOne India 2012
Running ms sql stored procedures in mule
Running ms sql stored procedures in mule
자바 웹 개발 시작하기 (1주차 : 웹 어플리케이션 체험 실습)
the Spring 4 update
Jaxitalia09 Spring Best Practices
สปริงเฟรมเวิร์ค4.1
Rediscovering Spring with Spring Boot(1)
dokumen.tips_rediscovering-spring-with-spring-boot1 (1).pdf
dokumen.tips_rediscovering-spring-with-spring-boot1.pdf
Java Web Programming [5/9] : EL, JSTL and Custom Tags
Jlook web ui framework
JBoss AS Upgrade
Spring dependency injection
Tomcat连接池配置方法V2.1
Servlets 3.0 - Asynchronous, Extensibility, Ease-of-use @ JavaOne Brazil 2010
How to replace rails asset pipeline with webpack?
Java Web Development with Stripes
GlassFish REST Administration Backend
[Coscup 2012] JavascriptMVC
GlassFish REST Administration Backend at JavaOne India 2012

More from YongHyuk Lee (6)

PDF
Vert.X and MSA - DevOps
PPTX
Microservices chat
PDF
2015 JBUG KOREA MEETUP - spring4 width infinispan
PDF
Infinispan
PDF
LBS with MongoDB
PDF
OAuth2.0
Vert.X and MSA - DevOps
Microservices chat
2015 JBUG KOREA MEETUP - spring4 width infinispan
Infinispan
LBS with MongoDB
OAuth2.0

Recently uploaded (20)

PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PPTX
sap open course for s4hana steps from ECC to s4
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
Cloud computing and distributed systems.
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
cuic standard and advanced reporting.pdf
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Encapsulation_ Review paper, used for researhc scholars
PPT
Teaching material agriculture food technology
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
20250228 LYD VKU AI Blended-Learning.pptx
sap open course for s4hana steps from ECC to s4
Understanding_Digital_Forensics_Presentation.pptx
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Dropbox Q2 2025 Financial Results & Investor Presentation
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
MYSQL Presentation for SQL database connectivity
Cloud computing and distributed systems.
Review of recent advances in non-invasive hemoglobin estimation
cuic standard and advanced reporting.pdf
Unlocking AI with Model Context Protocol (MCP)
MIND Revenue Release Quarter 2 2025 Press Release
Encapsulation_ Review paper, used for researhc scholars
Teaching material agriculture food technology
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Programs and apps: productivity, graphics, security and other tools
Chapter 3 Spatial Domain Image Processing.pdf
Network Security Unit 5.pdf for BCA BBA.
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...

spring3.2 java config Servler3

  • 1. Servlet3-javaConfig 한방 스팀팩 JBOSS USER GROUP 이용혁 13년 9월 8일 일요일
  • 2. Agenda ✓ servlet3 ✓ javaConfig ✓ Spring3.2 ✓ properties ✓ datasource ✓ mybatis3 ✓ mongoDB ✓ cache - infinispan ✓ sitemesh ✓ DEMO ✓ Q & A ✓ Thanks 13년 9월 8일 일요일
  • 3. Servlet3 ✓ @WebServlet ✓ @WebFilter ✓ @WebInitParam ✓ @WebListener ✓ @MultipartConfig http://download.oracle.com/otn-pub/jcp/servlet-3.0-fr-eval-oth-JSpec/servlet-3_0-final-spec.pdf?AuthParam=1378521700_c856fbccc3460a9c9e8be159abb92ee9 13년 9월 8일 일요일
  • 4. javaConfig <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http:// java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ ns/javaee/web-app_2_5.xsd" version="2.5"> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <servlet> <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/classes/app-config.xml </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Spring MVC Dispatcher Servlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> web.xml 13년 9월 8일 일요일
  • 5. javaConfig with Spring public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return null; } @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] { WebConfig.class }; } @Override protected String[] getServletMappings() { return new String[] { "/" }; } @Override protected Filter[] getServletFilters() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceEncoding(true); return new Filter[] { characterEncodingFilter, new SiteMeshFilter()}; } } WebInitializer.java 13년 9월 8일 일요일
  • 7. Spring 3.2.? with javaConfig @EnableWebMvc @ComponentScan(basePackages = "com.playfam.web") public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); } @Override public void addInterceptors(InterceptorRegistry registry) { LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor(); localeChangeInterceptor.setParamName("lang"); registry.addInterceptor(localeChangeInterceptor); } @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { Charset s = Charset.forName("UTF-8"); converters.add(new StringHttpMessageConverter(s)); } @Bean public ViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); viewResolver.setPrefix("/WEB-INF/views/"); viewResolver.setSuffix(".jsp"); return viewResolver; } @Bean public MultipartResolver multipartResolver() { CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); multipartResolver.setMaxUploadSize(5*1024*1024); return multipartResolver; } } 13년 9월 8일 일요일
  • 8. properties @Configuration @PropertySource({ "classpath:db.${spring.profiles.active:local}.properties", "classpath:conf.${spring.profiles.active:local}.properties" }) public class PropertiesConfig { @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer(){ return new PropertySourcesPlaceholderConfigurer(); } } <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>classpath:db.${spring.profiles.active}.properties</value> <value>classpath:conf.${spring.profiles.active}.properties</value> </list> </property> </bean> 13년 9월 8일 일요일
  • 9. datasource <tx:annotation-driven/> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${db.mssql.driverClassName}"/> <property name="url" value="${db.mssql.url}"/> <property name="username" value="${db.mssql.username}"/> <property name="password" value="${db.mssql.password}"/> <property name="maxActive" value="${db.mssql.maxActive}" /> <property name="maxIdle" value="${db.mssql.maxIdle}" /> <property name="maxWait" value="${db.mssql.maxWait}" /> <property name="defaultAutoCommit" value="${db.mssql.defaultAutoCommit}" /> </bean> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> 13년 9월 8일 일요일
  • 10. datasource @Configuration @EnableTransactionManagement public class DatabaseConfig { @Profile({ "local", "dev", "stg" }) static class Local { @Autowired Environment env; @Bean public DataSource dataSource() { BasicDataSource ds = new BasicDataSource(); try{ ds.setDriverClassName(env.getProperty("db.mysql.driverClassName")); ds.setUrl(env.getProperty("db.mysql.url")); ds.setUsername(env.getProperty("db.mysql.username")); ds.setPassword(env.getProperty("db.mysql.password")); }catch(Exception e){ e.printStackTrace(); } return ds; } } @Bean @Autowired public DataSourceTransactionManager txManager(DataSource dataSource){ DataSourceTransactionManager txManager = new DataSourceTransactionManager(); txManager.setDataSource(dataSource); return txManager; } } @Profile({ "real" }) @Resource(name="jdbc/MyDB") static class Prod { @Bean public DataSource dataSource() { final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup(); dsLookup.setResourceRef(true); DataSource dataSource = dsLookup.getDataSource("java:comp/dnv/jdbc/MyDB"); return dataSource; } } 13년 9월 8일 일요일
  • 11. mybaties3.? @Configuration //@MapperScan("classpath:com/playfam/web/model/mapper/**/*.xml") public class MybatisConfig { @Bean @Autowired public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception{ SqlSessionFactoryBean sb = new SqlSessionFactoryBean(); sb.setDataSource(dataSource); sb.setMapperLocations( new PathMatchingResourcePatternResolver().getResources("classpath:com/playfam/web/model/mapper/*.xml") ); sb.setConfigLocation(new DefaultResourceLoader().getResource("classpath:config_mybatis.xml")); return sb.getObject(); } @Bean @Autowired public SqlSessionTemplate sqlSession(SqlSessionFactory sqlSessionFactory){ SqlSessionTemplate s = new SqlSessionTemplate(sqlSessionFactory); return s; } } 기존설정 유지 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="mapperLocations" value="classpath:com/playfam/model/mapper/**/*.xml" /> <property name="configLocation" value="classpath:config_mybatis.xml" /> </bean> <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg ref="sqlSessionFactory" /> </bean> 13년 9월 8일 일요일
  • 12. mongoDB @Configuration public class MongoConfig { @Autowired Environment env; @Bean public MongoTemplate mongoTemplate() { return new MongoTemplate( env.getProperty("db.mongo.dbName"), env.getProperty("db.mongo.user"), env.getProperty("db.mongo.pass"), env.getProperty("db.mongo.host"), Integer.parseInt(env.getProperty("db.mongo.port")), Boolean.parseBoolean(env.getProperty("db.mongo.autoConnectRetry")), Integer.parseInt(env.getProperty("db.mongo.connectionsPerHost")), Integer.parseInt(env.getProperty("db.mongo.connectTimeout")), Integer.parseInt(env.getProperty("db.mongo.maxWaitTime")), Integer.parseInt(env.getProperty("db.mongo.threadsAllowedToBlockForConnectionMultiplier")), Integer.parseInt(env.getProperty("db.mongo.socketTimeout")) ); } } <bean id="mongoTemplate" class="com.itembay.common.mongo.MongoTemplate"> <constructor-arg name="dbName" value="${db.mongo.name}"/> <constructor-arg name="username" value="${db.mongo.user}"/> <constructor-arg name="password" value="${db.mongo.pass}"/> <constructor-arg name="host" value="${db.mongo.host}"/> <constructor-arg name="port" value="${db.mongo.port}"/> <constructor-arg name="autoConnectRetry" value="${db.mongo.autoConnectRetry}"/> <constructor-arg name="connectionsPerHost" value="${db.mongo.connectionsPerHost}"/> <constructor-arg name="connectTimeout" value="${db.mongo.connectTimeout}"/> <constructor-arg name="maxWaitTime" value="${db.mongo.maxWaitTime}"/> <constructor-arg name="threadsAllowedToBlockForConnectionMultiplier" value="$ {db.mongo.threadsAllowedToBlockForConnectionMultiplier}"/> <constructor-arg name="socketTimeout" value="${db.mongo.socketTimeout}"/> <constructor-arg name="cacheConfigPath" value="${cache.prop.path}"/> </bean> 13년 9월 8일 일요일
  • 13. mongoDB public class MongoTemplate { private static DB db; private static MongoClient mongoClient; public MongoTemplate(String dbName, String username, String password, String host, int port, boolean autoConnectRetry, int connectionsPerHost, int connectTimeout, int maxWaitTime, int threadsAllowedToBlockForConnectionMultiplier, int socketTimeout) { if(mongoClient == null){ Builder b = MongoClientOptions.builder(); b.autoConnectRetry(autoConnectRetry); b.connectionsPerHost(connectionsPerHost); b.connectTimeout(connectTimeout); b.maxWaitTime(maxWaitTime); b.threadsAllowedToBlockForConnectionMultiplier(threadsAllowedToBlockForConnectionMultiplier); b.socketTimeout(socketTimeout); MongoClientOptions options = b.build(); try { List<ServerAddress> list = new ArrayList<ServerAddress>(); for(String h : host.split(";")){ list.add(new ServerAddress(h.split(":")[0], Integer.parseInt(h.split(":")[1]))); } mongoClient = new MongoClient(list,options); mongoClient.setWriteConcern(WriteConcern.SAFE); db = mongoClient.getDB(dbName); db.authenticate(username, password.toCharArray()); } catch (Exception e) { e.printStackTrace(); } } } public static DBCollection getDBCollection(String collectionName){ return db.getCollection(collectionName); } } 13년 9월 8일 일요일
  • 14. cache - infinispan @Configuration @EnableCaching public class InfinispanConfig { @Bean public SpringRemoteCacheManagerFactoryBean cacheManager() throws Exception{ SpringRemoteCacheManagerFactoryBean cacheManager = new SpringRemoteCacheManagerFactoryBean(); String active = System.getProperty("spring.profiles.active", "local"); cacheManager.setConfigurationPropertiesFileLocation( new DefaultResourceLoader().getResource("classpath:hotrod-client-"+active+".properties") ); return cacheManager; } } @Autowired CacheManager cacheManager; @Test public void test() throws Exception { //obtain a handle to the remote default cache Cache cache = cacheManager.getCache("default"); //now add something to the cache and make sure it is there cache.put("car", "ferrari"); assert cache.get("car").get().equals("ferrari"); cache.evict("car"); assert cache.get("car").equals(null); } https://docs.jboss.org/author/display/ISPN/Using+Infinispan+as+a+Spring+Cache+provider 13년 9월 8일 일요일
  • 15. cache - infinispan ✓ @Cacheable ✓ @CachePut ✓ @CacheEvict @Cacheable(value = "authCache", key = "#key") public DBObject getAuthInfo(String key) throws Exception @CachePut(value = "authCache", key = "#key") public DBObject generateAuthInfo(String key) throws Exception @CacheEvict(value = "authCache", key = "#key") public void removeAuthInfo(String key) throws Exception 13년 9월 8일 일요일
  • 16. sitemesh@Override protected Filter[] getServletFilters() { CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter(); characterEncodingFilter.setEncoding("UTF-8"); characterEncodingFilter.setForceEncoding(true); return new Filter[] { characterEncodingFilter, new SiteMeshFilter()}; } <?xml version="1.0" encoding="UTF-8"?> <decorators defaultdir="/WEB-INF/decorators/"> <excludes> <pattern>/rss/*</pattern> <pattern>/test/*</pattern> <pattern>*.json</pattern> </excludes> <decorator name="default" page="mobileLayout.jsp"> <pattern>/</pattern> </decorator> <decorator name="mobile" page="webLayout.jsp"> <pattern>*.m</pattern> </decorator> <decorator name="app" page="appLayout.jsp"> <pattern>*.app</pattern> </decorator> </decorators> 13년 9월 8일 일요일
  • 17. Thank You ! Q & A www.playfam.com unlogicaldev@gmail.com https://github.com/unlogicaldev/springServlet3JavaConfig 13년 9월 8일 일요일