我有一个带有单个页面的struts2应用程序,它可以显示存储在数据库中的许多值之一。该申请适用于拥有多个部门的学校,每个部门都有许多课程。使用像这样的URL

访问部门页面
department.action?id=2

并且DepartmentAction将加载id = 2的部门进行显示。所有这一切都很好,如果用户只是浏览网站,但如果我想在报纸上提供一个说工程部门的链接,那会很不舒服。该链接必须是www.myschooldomain.com/department.action?id=2。我看到了很多问题。

首先,它不是用户友好的。其次,它很容易被破坏,因为部门是动态维护的,部门的ID可以在没有警告的情况下改变,使链接不稳定。

我更喜欢打印这样的网址:www.myschooldomain.com/department/engineering并以某种方式进入department.action?id = 2.

到目前为止我的想法:创建一个动作,在最后解析部门名称的网址,然后按名称查找。也许我可以为每个部门的数据库添加一个friendlyurl字段。

但问题是:在struts2中有更好的方法吗?

感谢。

更新(2009年5月):我刚刚碰巧绊倒了这个问题,并认为我会说我做了什么来解决它。

我在struts.xml中创建了一个名为departments的新包。在此包中,只有一个操作映射到*。因此它会捕获所有请求到mydomain.com/departments/anything.html。

在动作类中,我只需解析url并查找departments /和.html之间的部分,这就是部门的名称,这样我就可以在数据库中查找它。这已经工作了近5个月了,我已经在网站的其他区域实施了它。

有帮助吗?

解决方案

这通常是通过将servlet映射到“/ department”的情况下,然后使用 path 信息(例如,'/ engineering')来确定ID。

由于Struts2调度程序没有实现此行为,因此编写自己的servlet可能最简单。该servlet将配置有效“友好”的映射。命名为不友好的数字标识符。这可以是实际的 Map ,也可以使用数据库查找器方法完成。

getPathInfo()的结果将用于查找ID,请求将是转发到department.action。处理 null 的情况也就是说,这意味着用户正在尝试浏览 / departments / 目录。

其他提示

您可以使用网址重写过滤器

这避免了对任何其他servlet或Java代码的需要,但需要XML描述符。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top