您的位置:首页 > 编程语言 > Java开发

Freemarker SpringMVC 前台无法使用session;request等对象问题

2015-12-17 15:53 591 查看
SpringMVC和Freemarker整合时

我通过 继承org.springframework.web.servlet.view.AbstractTemplateView类实现FreeMarker的视图展现;

发现此视图展现为一个轻量级FreeemarkerView;由于它不支持request、session、application等对象;

另外此类为一个抽象类;需要写一个实现方法;在实现方法中重写renderMergedTemplateModel方式;

将session等对象注册到modelmap中;即可以在界面中使用了;

例:

package com.lmd.zjt.core;

import java.io.IOException;

import java.util.Calendar;

import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.BeansException;

import org.springframework.beans.factory.BeanFactoryUtils;

import org.springframework.beans.factory.NoSuchBeanDefinitionException;

import org.springframework.context.ApplicationContextException;

import org.springframework.web.servlet.view.AbstractTemplateView;

import org.springframework.web.servlet.view.freemarker.FreeMarkerConfig;

import freemarker.core.ParseException;

import freemarker.template.Configuration;

/**

* 轻量级的FreeemarkerView

*

* 不支持jsp标签、不支持request、session、application等对象,可用于前台模板页面。

*/

public class SimpleFreeMarkerView extends AbstractTemplateView {

/**

* 部署路径调用名称

*/

public static final String CONTEXT_PATH = "base";

/**

* 系统当前时间

*/

public static final String SYS_DATE = "sysTime";

private Configuration configuration;

public void setConfiguration(Configuration configuration) {

this.configuration = configuration;

}

protected Configuration getConfiguration() {

return this.configuration;

}

/**

* 自动检测FreeMarkerConfig

*

* @return

* @throws BeansException

*/

protected FreeMarkerConfig autodetectConfiguration() throws BeansException {

try {

return (FreeMarkerConfig) BeanFactoryUtils

.beanOfTypeIncludingAncestors(getApplicationContext(),

FreeMarkerConfig.class, true, false);

} catch (NoSuchBeanDefinitionException ex) {

throw new ApplicationContextException(

"Must define a single FreeMarkerConfig bean in this web application context "

+ "(may be inherited): FreeMarkerConfigurer is the usual implementation. "

+ "This bean may be given any name.", ex);

}

}

/**

* Invoked on startup. Looks for a single FreeMarkerConfig bean to find the

* relevant Configuration for this factory.

* <p>

* Checks that the template for the default Locale can be found: FreeMarker

* will check non-Locale-specific templates if a locale-specific one is not

* found.

*

* @see freemarker.cache.TemplateCache#getTemplate

*/

protected void initApplicationContext() throws BeansException {

super.initApplicationContext();

if (getConfiguration() == null) {

FreeMarkerConfig config = autodetectConfiguration();

setConfiguration(config.getConfiguration());

}

checkTemplate();

}

/**

* Check that the FreeMarker template used for this view exists and is

* valid.

* <p>

* Can be overridden to customize the behavior, for example in case of

* multiple templates to be rendered into a single view.

*

* @throws ApplicationContextException

* if the template cannot be found or is invalid

*/

protected void checkTemplate() throws ApplicationContextException {

try {

// Check that we can get the template, even if we might subsequently

// get it again.

logger.debug(getUrl());

logger.debug(this.getAttributesMap());

logger.debug(this.getStaticAttributes());

getConfiguration().getTemplate(getUrl());

} catch (ParseException ex) {

throw new ApplicationContextException(

"Failed to parse FreeMarker template for URL [" + getUrl()

+ "]", ex);

} catch (IOException ex) {

throw new ApplicationContextException(

"Could not load FreeMarker template for URL [" + getUrl()

+ "]", ex);

}

}

@SuppressWarnings({ "unchecked", "rawtypes" })

@Override

protected void renderMergedTemplateModel(Map model,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

model.put(CONTEXT_PATH, request.getContextPath());

model.put(SYS_DATE, Calendar.getInstance().getTime());

model.put("session", request.getSession());

model.put("request", request);

getConfiguration().getTemplate(getUrl()).process(model,

response.getWriter());

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: