0

我开发了一个使用 Struts2 作为控制器的网站,并将其与 Spring 和 Hibernate 集成以执行业务逻辑和数据库内容。该网站的 URI 是http://my.domian.com/URI;其中 {URI} 是通过管理员 cms 动态生成的。每个 uri 到 servlet 的映射是在 Apache mod_rewrite 的帮助下完成的,如下所示:

RewriteCond %{HTTP_HOST} ^www\.domain\.com
RewriteRule ^([a-zA-Z0-9_-]+)$ /dynamic\.action?f=$1 [QSA,L]  

(在任何进一步的信息之前,这是一个好的和合适的方法吗?)

struts 配置只是一个典型的学术配置:

<package name="Default" extends="struts-default" namespace="/">  
    ...  
    <action name="dynamic" class="DynamicContentAction">  
        <result name="index">/content/web/dynamic/index.jsp</result>  
    </action>  
</package>

DynamicContentAction 正在扩展 ActionSupport 并实现 ServletRequestAware、ServletContextAware。我正在检查几件事(例如被识别为子域的当前访问语言),在数据库中查找请求的 uri 是否有效,生成该 uri 的内容并设置几个运行时全局变量(例如当前访问的页面 id、由于当前访问语言而导致的布局配置 ...) 并将其放在此 servlet 中的 Request 对象上。

一切看起来都很好,甚至可以正常工作,除非单个用户同时请求了太多动态页面。就我而言,“太多”至少有 9-10 页。在这种情况下,它会抛出异常,不同的!有时 HttpServletRequest 请求为空,有时 ServletContext servletContext 为空,有时这些都可以,但运行时变量为空,用于业务逻辑或数据库查询。

我用谷歌搜索了一下,发现这个动作被实例化为“每个请求”。不是这样吗?如果每个请求都有一个操作,那么这个冲突或“可空性事物”有什么问题。除了 strut 的穿线之外,我是否应该在该动作中做一些类似穿线的事情?

如果您能帮助我或为我指明方向,我将不胜感激。

4

1 回答 1

0

这是 DynamicContentAction.java 的简化版本

public class DynamicContentAction extends ActionSupport implements ServletRequestAware, ServletContextAware {
    private HttpServletRequest request;
    private ServletContext servletContext;

    private ResourceSelectorService resourceSelectorService;

    private String f = null;

    public String execute() {
        if ( f != null ) {
            HashMap<String, Object> resolvedURI = resourceSelectorService.resolveURI(f);

            if ( resolvedURI.get("ERROR").equals(true) ) {
                //Generating nice 404 error page content
            } else {
                //Generating Content
                //and put it on request object as:
                //request.setAttribute("attrName", resourceContent);
            }
        }

        else {
            //Generating nice 404 error page content
        }

        request = null;
        servletContext = null;

        f = null;

        return "index";
    }

    @Override
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;  
    }

    @Override
    public void setServletContext(ServletContext servletContext) {
        this.servletContext = servletContext;  
    }

    public void setF(String f) {
        this.f = f;
    }

    public String getF() {
        return f;
    }
}

在我写这篇文章时,我了解到这个类不是线程安全的。是吗?因此,我对其进行了一些更改,如下所示:

这是 DynamicContentAction.java 的较新版本

public class DynamicContentAction extends ActionSupport {
    private ResourceSelectorService resourceSelectorService;

    private String f = null;

    public String execute() {
        if ( f != null ) {
            final HttpServletRequest request = ServletActionContext.getRequest();
            final ServletContext servletContext = ServletActionContext.getServletContext();

            HashMap<String, Object> resolvedURI = resourceSelectorService.resolveURI(f);

            if ( resolvedURI.get("ERROR").equals(true) ) {
                //Generating nice 404 error page content
            } else {
                //Generating Content
                //and put it on request object as:
                //request.setAttribute("attrName", resourceContent);
            }
            f = null;
        }

        else {
            //Generating nice 404 error page content
        }

        return "index";
    }

    public void setF(String f) {
        this.f = f;
    }

    public String getF() {
        return f;
    }
}

Null 的东西问题几乎没有了,但与生成的内容仍然存在冲突。例如,如果用户尝试打开:

http://www.domain.com/A
http://www.domain.com/B
http://www.domain.com/C
http://www.domain.com /D
http://www.domain.com/E

同时,所有页面都会在浏览器中渲染,但是A的内容显示在A和B中,C是正确的,很有可能D 和 E 的内容也不正确。

于 2010-11-01T14:03:18.037 回答