📄 abstractservicer.java
字号:
service = createPageService();
service.start();
//Debug.debug("AbstractServicer.processPageService() Line:210....pageParams.pageName:" + pageParams.pageName);
// Note:response.isCommitted() always return true in RESIN Server 2.x and 3.x
if (!(response.isCommitted() || response.containsHeader(StringUtils.CONTENT_DISPOSITION))) {
forward(pageParams.pageName); //jsp页面
}
} finally {
if (service != null)
service.end();
}
}
/**
* 输出页面静态资源,主要是图片
* 注意:此静态资源位于 模块模板路径下
* 自 3.1 后,须在页面放入 base 标签指示相对路径资源(如图片)所在模板位置
* 基于 base 标签的静态资源由 app server 处理
*
* @param pathInfo
*/
private void renderContextReources(String pathInfo) {
if (module.moduleServletPath == null)
output(servlet.getServletContext().getResourceAsStream(
new StringBuffer().append('/').append(pathInfo).toString())
);
else
output(servlet.getServletContext().getResourceAsStream(
new StringBuffer().append('/').append(module.pageTemplateBase).append(pathInfo).toString())
);
}
private void renderFrameworkReources(String pathInfo) {
byte[] buf = null;
int index = pathInfo.lastIndexOf('/');
String resourceName = pathInfo.substring(index); //"FastJsp.js"
if (pathInfo.startsWith(StringUtils.RESOURCE_JS)) {
buf = (byte[]) frameworkResources.get(StringUtils.RESOURCE_JS);
if (buf == null) {
try {
resourceName = new StringBuffer().append(SCRITPS_PATH).append(resourceName).toString();
buf = ResourceResolver.getResourceAsBytes(resourceName);
frameworkResources.put(StringUtils.RESOURCE_JS, buf);
} catch (Exception e) {
e.printStackTrace();
}
}
}
if (buf != null) {
output(new ByteArrayInputStream(buf));
}
}
private final static String HEADER_LAST_MODIFIED = "Last-Modified:";
private final static String HEADER_EXPIRES = "Expires:";
private void output(InputStream in) {
if (in == null)
return;
OutputStream out = null;
try {
response.setHeader(HEADER_LAST_MODIFIED, new Date().toString());
response.setDateHeader(HEADER_EXPIRES, System.currentTimeMillis() + Constants.MONTH);
response.setContentLength(in.available());
out = response.getOutputStream();
byte[] buf = new byte[SystemUtils.IS_OS_SOLARIS ? 16384 : 2048];
int len = 0;
while ((len = in.read(buf)) != -1) {
out.write(buf, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (in != null)
in.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
if (out != null)
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 处理服务中产生的各类错误
*
* @param exeption 包括从程序和页面跑出的任何错误
* @throws IOException
* @throws ServletException
*/
private void handleException(Exception exeption) throws IOException, ServletException {
pageParams.layoutModule.getExceptionHandler().handle(exeption, this);
}
public FastJspServlet getServlet() {
return servlet;
}
public HttpServletRequest getRequest() {
return request;
}
public HttpServletResponse getResponse() {
return response;
}
public PageService getPageService() {
return (PageService) request.getAttribute(FastJsp.PAGE_SERVICE);
}
/**
* 激活指定表现页面
* 注:该页面是同一布局或模板目录下的页面
*
* @param pageName 如:"index","admin/login"
* @throws IOException
* @throws ServletException
*/
public void forward(String pageName) throws IOException, ServletException {
servlet.getServletContext().getRequestDispatcher(pageParams.getForwardingTemplateFile(pageName)).forward(request, response);
}
/**
* 取得对模板“布局”位置的相对定位
* 目的:用于布局范围的模板位置再定位
*
* @return 如:"","red","red/a1"
*/
public String getTemplateChild() {
return StringUtils.EMPTY;
}
protected PageParams getPageParams() {
return pageParams;
}
/**
* 生成当前page service
*
* @return
*/
private AbstractPageService createPageService() {
AbstractPageService o = (AbstractPageService) request.getAttribute(FastJsp.PAGE_SERVICE);
if (o == null) {
o = (AbstractPageService) module.getPageServiceFactory().createPageService(this);
o.initialize();
request.setAttribute(FastJsp.PAGE_SERVICE, o);
}
return o;
}
/**
* 取得当前模块
*
* @return
*/
public Module getModule() {
return module;
}
public String getServletContextPath() {
return servletContextPath;
}
protected StateURL getURLState() {
return new StateURL() {
public void encodeBeforeUrlBuild(Link link) {
}
public String encodeAfterUrlBuild(String url) {
return response.encodeURL(url);
}
public String decodeBeforeDataBuild(String uri) {
return uri;
}
public void decodeAfterDataBuild(PageData data) {
}
};
}
/**
* 当前模块所包含的布局列表
*
* @return
* @since 3.1
*/
protected abstract PageModule[] getLayoutModules();
/**
* 取得缺省布局
* 在url未包含布局信息时将应用此布局
*
* @return 空值表示无布局信息
* @since 3.1
*/
protected abstract PageModule getDefaultLayoutModule();
/**
* 取得欢迎页面
* 配置有效时,在以 servlet path 如 "/forums[/]" 访问时将提交此页面访问
* 注意:单布局不支持 welcomePage 因为 appserver 的 default 页面是"/index.html",而缺省布局页面也是 "index.html",情况过于复杂且无太大意义。
* 虽可以改进单独让 welcome 页面不是 index ,但在单布局情况下没有太大意义,要么就只能就配置web.xml的 servletPath为"/forums"等情况
*
* @return null 表示无欢迎页面,直接跳转到缺省布局
* @see PageParamsImpl
*/
protected PageModule getWelcomePageModule() {
return null;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -