<filter>
<filter-name>deviceResolverHandlerFilter</filter-name>
<filter-class>org.springframework.mobile.device.DeviceResolverRequestFilter</filter-class>
</filter>
<filter>
<filter-name>sitemesh</filter-name>
<filter-class>com.yoursite.common.filter.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
SiteMeshFilter.java
package com.yoursite.common.filter;
import com.yoursite.common.SiteMeshDecoratorSelector;
import org.sitemesh.builder.SiteMeshFilterBuilder;
import org.sitemesh.config.ConfigurableSiteMeshFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* sitemesh 설정
*
* @author ysh3342
* @since 2014.10.07
*
*/
public class SiteMeshFilter extends ConfigurableSiteMeshFilter {
private static final Logger logger = LoggerFactory
.getLogger(SiteMeshFilter.class);
@Override
protected void applyCustomConfiguration(SiteMeshFilterBuilder builder) {
logger.debug("applyCustomConfiguration");
final String path = "/WEB-INF/vm/_decorators/";
SiteMeshDecoratorSelector decoratorSelector = new SiteMeshDecoratorSelector();
decoratorSelector.putMapping(SiteMeshDecoratorSelector.DEFAULT, path
+ "default.vm");
decoratorSelector.putMapping(SiteMeshDecoratorSelector.MOBILE, path
+ "mobile.vm");
decoratorSelector.put("/popup/*", path + "popup.vm");
decoratorSelector.put("/ajax/*", path + "null.vm"); // TEST
decoratorSelector.setUseCookie(true);
// Assign
builder.setCustomDecoratorSelector(decoratorSelector)
.addExcludedPath("/jsp/*").addExcludedPath("/*.jsp");
}
}
SiteMeshDecoratorSelector.java
package com.yoursite.common;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import org.sitemesh.config.PathBasedDecoratorSelector;
import org.sitemesh.content.Content;
import org.sitemesh.content.ContentChunk;
import org.sitemesh.webapp.WebAppContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mobile.device.site.SitePreference;
import org.springframework.mobile.device.site.SitePreferenceHandler;
/**
* 상황별 데코레이터를 선택한다
*
* @author ysh3342
* @since 2014.10.07
*/
public class SiteMeshDecoratorSelector extends
PathBasedDecoratorSelector<WebAppContext> {
private static final Logger logger = LoggerFactory
.getLogger(SiteMeshDecoratorSelector.class);
public static final String DEFAULT = "default";
public static final String MOBILE = "mobile";
public static final String TABLET = "tablet";
private final Map<String, String> mappings = new HashMap<String, String>();
private boolean useCookie = false;
private String cookieName = "PC";
@Override
public String[] selectDecoratorPaths(Content content,
WebAppContext siteMeshContext) throws IOException {
logger.debug("selectDecoratorPaths(Content content, WebAppContext siteMeshContext)");
// If page contains <meta name='decorator'
// content='/some/dec.html,/another/dec.html'>
ContentChunk decoratorMetaTag = content.getExtractedProperties()
.getChild("meta.decorator");
if (decoratorMetaTag.hasValue()) {
logger.debug("decoratorMetaTag : {}", decoratorMetaTag.getValue());
return decoratorMetaTag.getValue().split(",");
}
// request path 기준으로 매핑된 decorator path를 가져온다
String[] pathDecorator = super.getPathMapper().get(
siteMeshContext.getPath());
if (pathDecorator != null) {
logger.debug("pathDecorator : {}", (Object[]) pathDecorator);
return pathDecorator;
}
String decorator;
final SitePreference sitePreference = (SitePreference) siteMeshContext
.getRequest()
.getAttribute(
SitePreferenceHandler.CURRENT_SITE_PREFERENCE_ATTRIBUTE);
if (sitePreference.isMobile()) {
logger.debug("Mobile");
decorator = mappings.get(MOBILE);
} else if (sitePreference.isTablet()) {
logger.debug("Tablet");
decorator = mappings.get(TABLET);
} else {
logger.debug("PC");
decorator = mappings.get(DEFAULT);
}
if (decorator == null) {
decorator = "/WEB-INF/vm/_decorators/default.vm";
logger.info("Fail to load decorator path.");
logger.info("Using decorator path [{}] instead.", decorator);
// String[] empty = {};
// return empty;
}
logger.debug("decorator : {}", decorator);
return decorator.split(",");
}
public void putMapping(String pattern, String value) {
if (value != null) {
mappings.put(pattern, value);
}
}
public boolean isUseCookie() {
return useCookie;
}
public void setUseCookie(boolean useCookie) {
this.useCookie = useCookie;
}
public String getCookieName() {
return cookieName;
}
public void setCookieName(String cookieName) {
this.cookieName = cookieName;
}
}