📄 freemarkerservlet.java
字号:
(HttpRequestHashModel) request.getAttribute(ATTR_REQUEST_MODEL);
if (requestModel == null || requestModel.getRequest() != request)
{
requestModel = new HttpRequestHashModel(request, response, wrapper);
request.setAttribute(ATTR_REQUEST_MODEL, requestModel);
request.setAttribute(
ATTR_REQUEST_PARAMETERS_MODEL,
createRequestParametersHashModel(request));
}
params.putUnlistedModel(KEY_REQUEST, requestModel);
params.putUnlistedModel(KEY_REQUEST_PRIVATE, requestModel);
// Create hash model wrapper for request parameters
HttpRequestParametersHashModel requestParametersModel =
(HttpRequestParametersHashModel) request.getAttribute(
ATTR_REQUEST_PARAMETERS_MODEL);
params.putUnlistedModel(KEY_REQUEST_PARAMETERS, requestParametersModel);
return params;
} catch (ServletException e) {
throw new TemplateModelException(e);
} catch (IOException e) {
throw new TemplateModelException(e);
}
}
/**
* Maps the request URL to a template path that is passed to
* {@link Configuration#getTemplate(String, Locale)}. You can override it
* (i.e. to provide advanced rewriting capabilities), but you are strongly
* encouraged to call the overridden method first, then only modify its
* return value.
* @param request the currently processed request
* @return a String representing the template path
*/
protected String requestUrlToTemplatePath(HttpServletRequest request)
{
// First, see if it is an included request
String includeServletPath = (String) request.getAttribute("javax.servlet.include.servlet_path");
if(includeServletPath != null)
{
// Try path info; only if that's null (servlet is mapped to an
// URL extension instead of to prefix) use servlet path.
String includePathInfo = (String) request.getAttribute("javax.servlet.include.path_info");
return includePathInfo == null ? includeServletPath : includePathInfo;
}
// Seems that the servlet was not called as the result of a
// RequestDispatcher.include(...). Try pathInfo then servletPath again,
// only now directly on the request object:
String path = request.getPathInfo();
if (path != null) return path;
path = request.getServletPath();
if (path != null) return path;
// Seems that it is a servlet mapped with prefix, and there was no extra path info.
return "";
}
/**
* Called as the first step in request processing, before the templating mechanism
* is put to work. By default does nothing and returns false. This method is
* typically overridden to manage serving of non-template resources (i.e. images)
* that reside in the template directory.
* @param request the HTTP request
* @param response the HTTP response
* @return true to indicate this method has processed the request entirely,
* and that the further request processing should not take place.
*/
protected boolean preprocessRequest(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
return false;
}
/**
* This method is called from {@link #init()} to create the
* FreeMarker configuration object that this servlet will use
* for template loading. This is a hook that allows you
* to custom-configure the configuration object in a subclass.
* The default implementation returns a new {@link Configuration}
* instance.
*/
protected Configuration createConfiguration() {
return new Configuration();
}
/**
* This method is called from {@link #init()} to create the
* FreeMarker object wrapper object that this servlet will use
* for adapting request, session, and servlet context attributes into
* template models.. This is a hook that allows you
* to custom-configure the wrapper object in a subclass.
* The default implementation returns a wrapper that depends on the value
* of <code>ObjectWrapper</code> init parameter. If <code>simple</code> is
* specified, {@link ObjectWrapper#SIMPLE_WRAPPER} is used; if <code>jython</code>
* is specified, {@link freemarker.ext.jython.JythonWrapper} is used. In
* every other case {@link ObjectWrapper#DEFAULT_WRAPPER} is used.
*/
protected ObjectWrapper createObjectWrapper() {
String wrapper = getServletConfig().getInitParameter(DEPR_INITPARAM_OBJECT_WRAPPER);
if (wrapper != null) { // BC
if (getInitParameter(Configurable.OBJECT_WRAPPER_KEY) != null) {
throw new RuntimeException("Conflicting init-params: "
+ Configurable.OBJECT_WRAPPER_KEY + " and "
+ DEPR_INITPARAM_OBJECT_WRAPPER);
}
if (DEPR_INITPARAM_WRAPPER_BEANS.equals(wrapper)) {
return ObjectWrapper.BEANS_WRAPPER;
}
if(DEPR_INITPARAM_WRAPPER_SIMPLE.equals(wrapper)) {
return ObjectWrapper.SIMPLE_WRAPPER;
}
if(DEPR_INITPARAM_WRAPPER_JYTHON.equals(wrapper)) {
// Avoiding compile-time dependency on Jython package
try {
return (ObjectWrapper) Class.forName("freemarker.ext.jython.JythonWrapper")
.newInstance();
} catch (InstantiationException e) {
throw new InstantiationError(e.getMessage());
} catch (IllegalAccessException e) {
throw new IllegalAccessError(e.getMessage());
} catch (ClassNotFoundException e) {
throw new NoClassDefFoundError(e.getMessage());
}
}
// return BeansWrapper.getDefaultInstance();
return ObjectWrapper.DEFAULT_WRAPPER;
} else {
wrapper = getInitParameter(Configurable.OBJECT_WRAPPER_KEY);
if (wrapper == null) {
// return BeansWrapper.getDefaultInstance();
return ObjectWrapper.DEFAULT_WRAPPER;
} else {
try {
config.setSetting(Configurable.OBJECT_WRAPPER_KEY, wrapper);
} catch (TemplateException e) {
throw new RuntimeException(e.toString());
}
return config.getObjectWrapper();
}
}
}
protected ObjectWrapper getObjectWrapper() {
return wrapper;
}
protected final String getTemplatePath() {
return templatePath;
}
protected HttpRequestParametersHashModel createRequestParametersHashModel(HttpServletRequest request) {
return new HttpRequestParametersHashModel(request);
}
/**
* Called when servlet detects in a request processing that
* application-global (that is, ServletContext-specific) attributes are not yet
* set.
* This is a generic hook you might use in subclasses to perform a specific
* action on first request in the context. By default it does nothing.
* @param request the actual HTTP request
* @param response the actual HTTP response
*/
protected void initializeServletContext(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
}
/**
* Called when servlet detects in a request processing that session-global
* (that is, HttpSession-specific) attributes are not yet set.
* This is a generic hook you might use in subclasses to perform a specific
* action on first request in the session. By default it does nothing. It
* is only invoked on newly created sessions; it is not invoked when a
* replicated session is reinstantiated in another servlet container.
*
* @param request the actual HTTP request
* @param response the actual HTTP response
*/
protected void initializeSession(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
}
/**
* Called before the execution is passed to template.process().
* This is a generic hook you might use in subclasses to perform a specific
* action before the template is processed. By default does nothing.
* A typical action to perform here is to inject application-specific
* objects into the model root
* @param request the actual HTTP request
* @param response the actual HTTP response
* @param template the template that will get executed
* @param data the data that will be passed to the template
* @return true to process the template, false to suppress template processing.
*/
protected boolean preTemplateProcess(
HttpServletRequest request,
HttpServletResponse response,
Template template,
TemplateModel data)
throws ServletException, IOException
{
return true;
}
/**
* Called after the execution returns from template.process().
* This is a generic hook you might use in subclasses to perform a specific
* action after the template is processed. It will be invoked even if the
* template processing throws an exception. By default does nothing.
* @param request the actual HTTP request
* @param response the actual HTTP response
* @param template the template that was executed
* @param data the data that was passed to the template
*/
protected void postTemplateProcess(
HttpServletRequest request,
HttpServletResponse response,
Template template,
TemplateModel data)
throws ServletException, IOException
{
}
/**
* Returns the {@link freemarker.template.Configuration} object used by this servlet.
* Please don't forget that {@link freemarker.template.Configuration} is not thread-safe
* when you modify it.
*/
protected Configuration getConfiguration() {
return config;
}
/**
* If the parameter "nocache" was set to true, generate a set of headers
* that will advise the HTTP client not to cache the returned page.
*/
private void setBrowserCachingPolicy(HttpServletResponse res)
{
if (nocache)
{
// HTTP/1.1 + IE extensions
res.setHeader("Cache-Control", "no-store, no-cache, must-revalidate, "
+ "post-check=0, pre-check=0");
// HTTP/1.0
res.setHeader("Pragma", "no-cache");
// Last resort for those that ignore all of the above
res.setHeader("Expires", EXPIRATION_DATE);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -