?? velocitycontroller.java
字號:
package dark.web.frame.velocity.controller;
/**
* <p>Title: 支持Velocity的控制器</p>
* <p>Description: 根據org.apache.velocity.servlet.VelocityViewServlet進行修改,
* 從而將Velocity整合進dwf框架</p>
* <p>Copyright: Copyright (c) 2005</p>
* <p>Company: DIS</p>
* <p>Create Time: 2005-2-28 16:24:43</p>
* @author <a href="mailto:dark_he@hotmail.com">darkhe</a>
* @version 1.0
*/
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dark.web.frame.Controller;
import dark.web.frame.Helper;
import dark.web.frame.controller.FrontController;
import dark.web.frame.velocity.command.VelocityCommand;
import dark.web.frame.velocity.form.VelocityForm;
import dark.web.frame.velocity.page.UnknownVelocityPage;
import dark.web.frame.velocity.page.VelocityPage;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.RuntimeSingleton;
import org.apache.velocity.tools.view.ToolboxManager;
import org.apache.velocity.tools.view.servlet.ServletLogger;
import org.apache.velocity.tools.view.servlet.ServletToolboxManager;
import org.apache.velocity.tools.view.servlet.WebappLoader;
public abstract class VelocityController
extends FrontController
implements Controller
{
/** The HTTP content type context key. */
public static final String CONTENT_TYPE = "default.contentType";
/** The default content type for the response */
public static final String DEFAULT_CONTENT_TYPE = "text/html";
/** Default encoding for the output stream */
public static final String DEFAULT_OUTPUT_ENCODING = "ISO-8859-1";
/**
* Key used to access the ServletContext in
* the Velocity application attributes.
*/
public static final String SERVLET_CONTEXT_KEY =
ServletContext.class.getName();
/**
* Key used to access the toolbox configuration file path from the
* Servlet or webapp init parameters ("org.apache.velocity.toolbox").
*/
protected static final String TOOLBOX_KEY =
"toolbox";
/**
* This is the string that is looked for when getInitParameter is
* called ("org.apache.velocity.properties").
*/
protected static final String INIT_PROPS_KEY =
"velocity";
/** A reference to the toolbox manager. */
protected ToolboxManager toolboxManager = null;
/**
* The default content type. When necessary, includes the
* character set to use when encoding textual output.
*/
protected String defaultContentType;
/**
* <p>Initializes servlet, toolbox and Velocity template engine.
* Called by the servlet container on loading.</p>
*
* @param config servlet configuation
*/
public void init(ServletConfig config) throws ServletException
{
super.init(config);
// do whatever we have to do to init Velocity
initVelocity(config);
// init this servlet's toolbox (if any)
initToolbox(config);
// we can get these now that velocity is initialized
defaultContentType =
RuntimeSingleton.getString(CONTENT_TYPE, DEFAULT_CONTENT_TYPE);
String encoding =
RuntimeSingleton.getString(RuntimeSingleton.OUTPUT_ENCODING,
DEFAULT_OUTPUT_ENCODING);
// For non Latin-1 encodings, ensure that the charset is
// included in the Content-Type header.
if (!DEFAULT_OUTPUT_ENCODING.equalsIgnoreCase(encoding))
{
int index = defaultContentType.lastIndexOf("charset");
if (index < 0)
{
// the charset specifier is not yet present in header.
// append character encoding to default content-type
defaultContentType += "; charset=" + encoding;
}
else
{
// The user may have configuration issues.
Velocity.warn("VelocityController: Charset was already " +
"specified in the Content-Type property. " +
"Output encoding property will be ignored.");
}
}
Velocity.info("VelocityController: Default content-type is: " +
defaultContentType);
}
/**
* Initializes the ServletToolboxManager for this servlet's
* toolbox (if any).
*
* @param config servlet configuation
*/
protected void initToolbox(ServletConfig config) throws ServletException
{
ServletContext servletContext = config.getServletContext();
/* check the servlet config for a toolbox */
String file = config.getInitParameter(TOOLBOX_KEY);
/* check the servlet context for a toolbox */
if (file == null || file.length() == 0)
{
file = servletContext.getInitParameter(TOOLBOX_KEY);
}
/* if we have a toolbox, get a manager for it */
if (file != null)
{
toolboxManager =
ServletToolboxManager.getInstance(servletContext, file);
}
else
{
Velocity.info("VelocityController: No toolbox entry in configuration.");
}
}
/**
* Initializes the Velocity runtime, first calling
* loadConfiguration(ServletConfig) to get a
* org.apache.commons.collections.ExtendedProperties
* of configuration information
* and then calling Velocity.init(). Override this
* to do anything to the environment before the
* initialization of the singleton takes place, or to
* initialize the singleton in other ways.
*
* @param config servlet configuration parameters
*/
protected void initVelocity(ServletConfig config) throws ServletException
{
Velocity.setApplicationAttribute(SERVLET_CONTEXT_KEY, getServletContext());
// default to servletlogger, which logs to the servlet engines log
Velocity.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
ServletLogger.class.getName());
// by default, load resources with webapp resource loader
Velocity.setProperty(RuntimeConstants.RESOURCE_LOADER, "webapp");
Velocity.setProperty("webapp.resource.loader.class",
WebappLoader.class.getName());
try
{
InputStream is = Helper.getInputStream(config.getServletContext(), INIT_PROPS_KEY);
Properties p = new Properties();
p.load(is);
/*
* now, lets get the two elements we care about, the
* template path and the log, and fix those from relative
* to the webapp root, to absolute on the filesystem, which is
* what velocity needs
*/
String path = p.getProperty("file.resource.loader.path");
if (path != null)
{
path = getServletContext().getRealPath(path);
log.info("file.resource.loader.path=" + path);
p.setProperty("file.resource.loader.path", path);
}
path = p.getProperty("runtime.log");
if (path != null)
{
path = getServletContext().getRealPath(path);
log.info("runtime.log=" + path);
p.setProperty("runtime.log", path);
}
Velocity.init(p);
log.info("初始化Velocity引擎成功......");
}
catch (IOException e)
{
log.error("初始化Velocity引擎出錯", e);
}
catch (Exception e)
{
log.error("初始化Velocity引擎出錯", e);
}
}
/**
*
* @param request
* @param response
* @throws ServletException
* @throws IOException
* @see dark.web.frame.Controller#doRequest(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
public void doRequest(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 獲取page.postfix和command.postfix
// 從而根據用戶的請求后綴的不同調用頁面處理程序或者命令處理程序
String page_postfix = configuration.getString("page.postfix");
String command_postfix = configuration.getString("command.postfix");
if (page_postfix.equals(getRequestPostfix(request)))
// 調用頁面處理程序
{
String uri = request.getRequestURI();
VelocityPage page = getVelocityPage((HttpServletRequest) request);
// 初始化頁面類
page.init(
getServletContext(),
getServletConfig(),
request,
response);
// 設置velocity模版
page.setTarget(uri);
// 檢證頁面類的執行權限
if (page.isAuthentic())
{
// 執行真實的商業邏輯
page.process();
}
}
else if (command_postfix.equals(getRequestPostfix(request)))
// 調用命令處理程序
{
// 如果要求做表單驗證,則處理之
if (isValidate(request))
{
String input = getInput(request);
// 如果用戶沒有指定請求轉發路徑,則指定default value
if (input.equals(""))
{
input = configuration.getString("default.input");
log.warn(
"dont't specify parameter $INPUT, use default.input:"
+ input);
request.setAttribute(
"$WARM",
"dont't specify parameter $INPUT, use default.input"
+ input);
}
VelocityForm form = getVelocityForm(request);
// 初始化表單驗證類
form.init(getServletContext(), request, response, getMessage());
// 設置default的ContentType
form.setContentType(defaultContentType);
// 設置defautl的OutputEncoding
form.setOutputEncoding(DEFAULT_OUTPUT_ENCODING);
// 傳入toolboxManager
form.setToolboxManager(toolboxManager);
// 設置當前表單驗證的用戶請求轉發路徑
form.setInput(input);
// 檢證表單驗證類的執行權限
if (form.isAuthentic())
{
// 執行實際的驗證操作
form.validate(request, response);
if (!form.isPass())
{
// 如果isPass()返回false,
// 則說明驗證出表單錯誤,
// 立即停止程序處理
//log.debug("表單驗證失敗");
return;
}
//log.debug("表單驗證成功");
//log.debug("form.isPass()=" + form.isPass());
}
}
String target = getTarget(request);
// 如果用戶沒有指定請求轉發路徑,則指定default value
if (target.equals(""))
{
target = configuration.getString("default.target");
log.warn(
"don't specify paramter $TARGER, use default.target:"
+ target);
request.setAttribute(
"$WARM",
"don't specify paramter $TARGER, use default.target:"
+ target);
}
VelocityCommand command = getVelocityCommand(request);
// 初始化命令類
command.init(
getServletContext(),
getServletConfig(),
request,
response);
// 設置default的ContentType
command.setContentType(defaultContentType);
// 設置defautl的OutputEncoding
command.setOutputEncoding(DEFAULT_OUTPUT_ENCODING);
// 傳入toolboxManager
command.setToolboxManager(toolboxManager);
// 設置當前命令的用戶請求轉發路徑
command.setTarget(target);
// 檢證命令類的執行權限
if (command.isAuthentic())
{
// 執行真實的商業邏輯
command.process();
}
}
}
/**
* @param request
* @return
*/
protected VelocityForm getVelocityForm(HttpServletRequest request)
throws ServletException
{
try
{
return (VelocityForm) getFormClass(request).newInstance();
}
catch (Exception e)
{
throw new ServletException(e);
}
}
/**
* @param req
* @return
*/
protected VelocityCommand getVelocityCommand(HttpServletRequest request)
throws ServletException
{
try
{
return (VelocityCommand) getCommandClass(request).newInstance();
}
catch (Exception e)
{
throw new ServletException(e);
}
}
/**
* @param request
* @return
*/
protected VelocityPage getVelocityPage(HttpServletRequest request)
throws ServletException
{
try
{
return (VelocityPage) getVelocityPageClass(request).newInstance();
}
catch (Exception e)
{
throw new ServletException(e);
}
}
/**
* 通過類名串值到得類對象
* @param req
*/
protected Class getVelocityPageClass(HttpServletRequest request)
{
Class result = null;
String cp = configuration.getString("page.package");
String pageName = getPageName(request);
String pageClassName = cp + "." + pageName;
try
{
result = Class.forName(pageClassName);
}
catch (ClassNotFoundException e)
{
log.info(
"class:"
+ pageClassName
+ " not found, return UnknownVelocityPage.class");
result = UnknownVelocityPage.class;
}
return result;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -