我开发了一个使用 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 的穿线之外,我是否应该在该动作中做一些类似穿线的事情?
如果您能帮助我或为我指明方向,我将不胜感激。