由于是用的別名,在查到這個(gè)action后發(fā)現這個(gè)類(lèi)實(shí)現了urlAware,如下, 這樣它還會(huì )被一個(gè)UrlInterceptor的攔截器攔截,這個(gè)攔截器被設成struts2的default攔截器了, 在攔截器上打出了這個(gè)url請求的namespace 與action,確實(shí)附合動(dòng)態(tài)系統action的條件, 通過(guò)UrlAware這個(gè)接口定義的方法,攔截器將一些url上的參數信息傳給了action以進(jìn)行動(dòng)態(tài)處理,同時(shí)我也打出了DynamicSystemAct中生成的一些動(dòng)態(tài)信息,如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地址攔截器
- *
- * 針對頁(yè)面偽靜態(tài)地址,需要傳入多個(gè)參數
- *
- * @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('/'));
- // 前路徑結束點(diǎn)
- int preIndex = 0;
- if (lineIndex != -1) {
- // 有下劃線(xiàn)(有分頁(yè))
- preIndex = lineIndex;
- } else if (mlineIndex != -1) {
- // 有中劃線(xiàn)(有定制參數)
- preIndex = mlineIndex;
- } else {
- // 什么都沒(méi)有
- preIndex = pointIndex;
- }
- aware.setPageLink(url.substring(0, preIndex));
- // 后路徑開(kāi)始點(diǎn)
- int suffixIndex = 0;
- if (mlineIndex != -1) {
- // 有中劃線(xiàn)
- suffixIndex = mlineIndex;
- } else {
- suffixIndex = pointIndex;
- }
- aware.setPageSuffix(url.substring(suffixIndex));
- // 取頁(yè)數和附加參數
- if (preIndex == suffixIndex) {
- // 沒(méi)有分頁(yè),為第一頁(yè)。
- aware.setPageNo(1);
- } else {
- // 去掉下劃線(xiàn)"_"。
- 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這個(gè)action,在發(fā)現com.jeecms.cms.struts-font.xml中發(fā)現了它的定義.
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>
由此最終指向了一個(gè)模板.真是山路十八彎啊.