转自 http://www.blogjava.net/killme2008/archive/2007/02/06/98227.html
6。前端控制器(FrontController),它的任务我们已经很清楚,初始化配置文件;存储所有action到 ServletContext供整个框架使用;得到发起请求的path,提供给Dispachter查找相应的action;调用Dispatcher,执行getNextPage方法得到下一个页面的url并转发:
public
void
init()
throws
ServletException
{
// 初始化配置文件
ServletContext context = getServletContext();
String config_file = getServletConfig().getInitParameter( " config " );
String dispatcher_name = getServletConfig().getInitParameter( " dispatcher " );
if (config_file == null || config_file.equals( "" ))
config_file = " /WEB-INF/strutslet-config.xml " ; // 默认是/WEB-INF/下面的strutslet-config
if (dispatcher_name == null || dispatcher_name.equals( "" ))
dispatcher_name = Constant.DEFAULT_DISPATCHER;
try {
Map < String, ActionModel > resources = ConfigUtil.newInstance() // 工具类解析配置文件
.parse(config_file, context);
context.setAttribute(Constant.ACTIONS_ATTR, resources); // 存储在ServletContext中
log.info( " 初始化strutslet配置文件成功 " );
} catch (Exception e) {
log.error( " 初始化strutslet配置文件失败 " );
e.printStackTrace();
}
// 实例化Dispacher
try {
Class c = Class.forName(dispatcher_name);
Dispatcher dispatcher = (Dispatcher) c.newInstance();
context.setAttribute(Constant.DISPATCHER_ATTR, dispatcher); // 放在ServletContext
log.info( " 初始化Dispatcher成功 " );
} catch (Exception e) {
log.error( " 初始化Dispatcher失败 " );
e.printStackTrace();
}
..
// 初始化配置文件
ServletContext context = getServletContext();
String config_file = getServletConfig().getInitParameter( " config " );
String dispatcher_name = getServletConfig().getInitParameter( " dispatcher " );
if (config_file == null || config_file.equals( "" ))
config_file = " /WEB-INF/strutslet-config.xml " ; // 默认是/WEB-INF/下面的strutslet-config
if (dispatcher_name == null || dispatcher_name.equals( "" ))
dispatcher_name = Constant.DEFAULT_DISPATCHER;
try {
Map < String, ActionModel > resources = ConfigUtil.newInstance() // 工具类解析配置文件
.parse(config_file, context);
context.setAttribute(Constant.ACTIONS_ATTR, resources); // 存储在ServletContext中
log.info( " 初始化strutslet配置文件成功 " );
} catch (Exception e) {
log.error( " 初始化strutslet配置文件失败 " );
e.printStackTrace();
}
// 实例化Dispacher
try {
Class c = Class.forName(dispatcher_name);
Dispatcher dispatcher = (Dispatcher) c.newInstance();
context.setAttribute(Constant.DISPATCHER_ATTR, dispatcher); // 放在ServletContext
log.info( " 初始化Dispatcher成功 " );
} catch (Exception e) {
log.error( " 初始化Dispatcher失败 " );
e.printStackTrace();
}
..
doGet()和doPost方法我们都让它调用process方法:
protected
void
process(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
// 获取action的path
String reqURI = request.getRequestURI();
int i = reqURI.lastIndexOf( " . " );
String contextPath = request.getContextPath();
String path = reqURI.substring(contextPath.length(),i);
request.setAttribute(Constant.REQUEST_ATTR, path);
Dispatcher dispatcher = (Dispatcher) context.getAttribute(Constant.DISPATCHER_ATTR);
// make sure we don't cache dynamic data
response.setHeader( " Cache-Control " , " no-cache " );
response.setHeader( " Pragma " , " no-cache " );
// use the dispatcher to find the next page
String nextPage = dispatcher.getNextPage(request, context); // 调用Dispatcher的getNextPage
// forward control to the view
RequestDispatcher forwarder = request.getRequestDispatcher( " / "
+ nextPage);
forwarder.forward(request, response); // 转发页面
}
HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
// 获取action的path
String reqURI = request.getRequestURI();
int i = reqURI.lastIndexOf( " . " );
String contextPath = request.getContextPath();
String path = reqURI.substring(contextPath.length(),i);
request.setAttribute(Constant.REQUEST_ATTR, path);
Dispatcher dispatcher = (Dispatcher) context.getAttribute(Constant.DISPATCHER_ATTR);
// make sure we don't cache dynamic data
response.setHeader( " Cache-Control " , " no-cache " );
response.setHeader( " Pragma " , " no-cache " );
// use the dispatcher to find the next page
String nextPage = dispatcher.getNextPage(request, context); // 调用Dispatcher的getNextPage
// forward control to the view
RequestDispatcher forwarder = request.getRequestDispatcher( " / "
+ nextPage);
forwarder.forward(request, response); // 转发页面
}
7。最后,web.xml的配置就非常简单了,配置前端控制器,提供启动参数(配置文件所在位置,为空就查找/WEB-INF/下面的strutslet-config.xml文件),我们把所有以action结尾的请求都交给FrontController处理:
<
servlet
>
< servlet - name > StrutsletController </ servlet - name >
< servlet - class > com.strutslet.core.FrontController </ servlet - class >
<!--
< init - param >
< param - name > config </ param - name >
< param - value >/ WEB - INF / strutslet - config.xml </ param - value >
</ init - param >
-->
< load - on - startup > 0 </ load - on - startup >
</ servlet >
< servlet - mapping >
< servlet - name > StrutsletController </ servlet - name >
< url - pattern >* .action </ url - pattern >
</ servlet - mapping >
< servlet - name > StrutsletController </ servlet - name >
< servlet - class > com.strutslet.core.FrontController </ servlet - class >
<!--
< init - param >
< param - name > config </ param - name >
< param - value >/ WEB - INF / strutslet - config.xml </ param - value >
</ init - param >
-->
< load - on - startup > 0 </ load - on - startup >
</ servlet >
< servlet - mapping >
< servlet - name > StrutsletController </ servlet - name >
< url - pattern >* .action </ url - pattern >
</ servlet - mapping >
最后,让我们看看整个框架图: