jeecms 的自定义的伪静态的实现分析

jeecms是一个ssh+freemarker的优秀的cms系统,最近下载了一个版本装了一下,很不错,但是除了那一些自定义的freemarker 标签外,还有些头大的事,就是很难查清楚它的自定义的伪静态的实现, htm是怎样对映到action上去的,最近花了几天看了一下,有点发现,记录下来.

          如下图, 点击一个article的标题,会弹出一个像是静态的url, 这个显然是要提交到一个action上的,但是怎么实现的呢?

Html代码 http://localhost:8080/JEECMS/movie/38.htm


查了一下每个aticle的静态页面,它的url都是有一定规则的,channel名加上article的id号,如果要分页还要加上一些附加的 _*之类的url.

 

以下分析一下其大体的实现流程:

    首先看一下它的struts2的全局配置:

Sql代码struts.action.extension=do,htm,jspa,jspx,php,asp,aspx
struts.objectFactory=spring
struts.enable.DynamicMethodInvocation=false
struts.devMode=true
struts.locale=zh_CN
struts.i18n.encoding=GBK
struts.ui.theme=simple
#struts.custom.i18n.resources=i18n
struts.ui.templateDir=/WEB-INF/template

#struts.multipart.saveDir=temp/
struts.multipart.maxSize=8388608
struts.enable.SlashesInActionNames=true

第一个配置说明surfix 以do, html, jspa,jspx,php,asp,aspx结尾的url都被视为struts2的action处理,那么显然这个
htm结尾的是要当做action处理的了。
下面看一下这个url是如何对应到一个action的.
在com.jeecms.cms的下面有一个struts-core-front.xml的配置文件,定义如下:
这个<action name="**" class="core.dynamicSystemAct">很明显会载到namespace 为"/"的所有action.

Xml代码

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN"
"http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<!--动态系统-->
<package name="core.front.dynamic" namespace="" extends="empty-default">
<action name="**" class="core.dynamicSystemAct">
<result type="chain">
<param name="namespace">${namespace}</param>
<param name="actionName">${actionName}</param>
</result>
<interceptor-ref name="startTime"/>
<interceptor-ref name="exception"/>
<interceptor-ref name="domain"/>
<interceptor-ref name="cookieIdentity"/>
<interceptor-ref name="url"/>
</action>       
</package>

<package name="front.attachment" namespace="/front/attachment" extends="inde-default">
<action name="Com_*" method="{1}" class="core.attachmentAct">
<result name="edit">/WEB-INF/bbs_sys/topic/img.html</result>
</action>
</package>
</struts>

由于是用的别名,在查到这个action后发现这个类实现了urlAware,如下, 这样它还会被一个UrlInterceptor的拦截器拦截,这个拦截器被设成struts2的default拦截器了, 在拦截器上打出了这个url请求的namespace 与action,确实附合动态系统action的条件, 通过UrlAware这个接口定义的方法,拦截器将一些url上的参数信息传给了action以进行动态处理,同时我也打出了 DynamicSystemAct中生成的一些动态信息,如namespace与action.

Java代码

package com.jeecms.common.struts2.interceptor;

import javax.servlet.http.HttpServletRequest;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.math.NumberUtils;
import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

/**
* URL地址拦截器
*
* 针对页面伪静态地址,需要传入多个参数
*
* @author liufang
*
*/
public class UrlInterceptor extends MethodFilterInterceptor {
private static final long serialVersionUID = 1L;

@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
//check the name space.
String namespace = invocation.getProxy().getNamespace();
String actionname =invocation.getProxy().getActionName();
if (!StringUtils.isBlank(namespace)) {
if ("/".equals(namespace.trim())) {

} else {
namespace += "/";
}
}
System.out.println("namespace is "+namespace+"\n actionname is"+actionname);
//=============

ActionContext ctx = invocation.getInvocationContext();
HttpServletRequest req = (HttpServletRequest) ctx
.get(StrutsStatics.HTTP_REQUEST);
if (action instanceof UrlAware) {

System.out.println("UrlInterceptor active..");
UrlAware aware = (UrlAware) action;
String url = req.getRequestURL().toString();
System.out.println("request url is:"+url);
int pointIndex = url.indexOf('.', url.lastIndexOf('/'));
if (pointIndex == -1) {
url += "index.do";
pointIndex = url.indexOf('.', url.lastIndexOf('/'));
}
String paramStr = req.getQueryString();
if (paramStr != null && !paramStr.trim().equals("")) {
url += "?" + paramStr;
}
aware.setWholeUrl(url);

int lineIndex = url.indexOf('_', url.lastIndexOf('/'));
int mlineIndex = url.indexOf('-', url.lastIndexOf('/'));
// 前路径结束点
int preIndex = 0;
if (lineIndex != -1) {
// 有下划线(有分页)
preIndex = lineIndex;
} else if (mlineIndex != -1) {
// 有中划线(有定制参数)
preIndex = mlineIndex;
} else {
// 什么都没有
preIndex = pointIndex;
}
aware.setPageLink(url.substring(0, preIndex));
// 后路径开始点
int suffixIndex = 0;
if (mlineIndex != -1) {
// 有中划线
suffixIndex = mlineIndex;
} else {
suffixIndex = pointIndex;
}
aware.setPageSuffix(url.substring(suffixIndex));
// 取页数和附加参数
if (preIndex == suffixIndex) {
// 没有分页,为第一页。
aware.setPageNo(1);
} else {
// 去掉下划线"_"。
String page = url.substring(preIndex + 1, suffixIndex);
aware.setPageNo(NumberUtils.toInt(page, 1));
}
// 路径参数
String pathParm = ctx.getName();
lineIndex = pathParm.indexOf("_");
mlineIndex = pathParm.indexOf("-");
if (lineIndex != -1) {
pathParm = pathParm.substring(0, lineIndex);
} else if (mlineIndex != -1) {
pathParm = pathParm.substring(0, mlineIndex);
}
aware.setPathParams(pathParm.split("/"));
// 附加参数
if (mlineIndex != -1) {
String otherParam = ctx.getName().substring(mlineIndex + 1);
aware.setOtherParams(otherParam.split("-"));
}
//System.out.println(TypeUtil.typeToString("UrlAware--:\n",aware));
}
//----------test the url interceptor------//
else
{
System.out.println("UrlInterceptor ignored..");

}
return invocation.invoke();
}
}



Java代码
package com.jeecms.cms.action;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.jeecms.common.struts2.interceptor.DomainNameAware;
import com.jeecms.common.struts2.interceptor.UrlAware;
import com.jeecms.core.Constants;
import com.jeecms.core.entity.Website;
import com.jeecms.core.manager.WebsiteMng;
import com.opensymphony.xwork2.Action;

@Scope("prototype")
@Controller("core.dynamicSystemAct")
public class DynamicSystemAct implements Action, DomainNameAware, UrlAware {
public String execute() {
System.out.println("comming into DynamicSystemAct");
Website web = websiteMng.getWebsite(domainName);
if (web == null) {
// 检查别名
web = websiteMng.getByAlias(domainName);
if (web != null) {
redirectUrl = web.getWebUrl();
return Constants.REDIRECT;
} else {
return Constants.WEBSITE_NOT_FOUND;
}
}
String sys = web.getCurrentSystem();
namespace = "/jeedynamic/" + sys;
actionName = "Page";
System.out.println("DynamicSystemAct namespace is "+namespace+"\n actionname is"+actionName);
return SUCCESS;
}

private String namespace;
private String actionName;
private String pageName;
private String pathName;
private String domainName;

private String[] pathParams;
private String[] otherParams;
private String wholeUrl;
private String pageLink;
private String pageSuffix;
private int pageNo = 1;

private String redirectUrl;
@Autowired
private WebsiteMng websiteMng;

public void setDomainName(String domainName) {
this.domainName = domainName;
}

public void setPathParams(String[] pathParams) {
this.pathParams = pathParams;
}

public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}

public void setPageLink(String pageLink) {
this.pageLink = pageLink;
}

public void setPageSuffix(String pageSuffix) {
this.pageSuffix = pageSuffix;
}

public void setWholeUrl(String wholeUrl) {
this.wholeUrl = wholeUrl;
}

public String getNamespace() {
return namespace;
}

public void setNamespace(String namespace) {
this.namespace = namespace;
}

public String getActionName() {
return actionName;
}

public void setActionName(String actionName) {
this.actionName = actionName;
}

public String getPageName() {
return pageName;
}

public void setPageName(String pageName) {
this.pageName = pageName;
}

public String getPathName() {
return pathName;
}

public void setPathName(String pathName) {
this.pathName = pathName;
}

public String getDomainName() {
return domainName;
}

public String[] getPathParams() {
return pathParams;
}

public String getWholeUrl() {
return wholeUrl;
}

public String getPageLink() {
return pageLink;
}

public String getPageSuffix() {
return pageSuffix;
}

public int getPageNo() {
return pageNo;
}

public String getRedirectUrl() {
return redirectUrl;
}

public void setRedirectUrl(String redirectUrl) {
this.redirectUrl = redirectUrl;
}

public String[] getOtherParams() {
return otherParams;
}

public void setOtherParams(String[] otherParams) {
this.otherParams = otherParams;
}
}


综合上面的信息,再查page这个action,在发现com.jeecms.cms.struts-font.xml中发现了它的定义.

Xml代码
<package name="cms.front.page" namespace="/jeedynamic/jeecms" extends="empty-default">       
<action name="Page" class="cms.cmsPageAct">
<result>${tplPath}</result>
<result name="pageCache" type="pageCache">${tplPath}</result>
<interceptor-ref name="exception"/>
<interceptor-ref name="chain"/>
</action>
</package>

由此最终指向了一个模板.真是山路十八弯啊.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值