在struts2中为动态资源创建友好的URL

时间:2008-10-22 17:08:34

标签: java struts2 friendly-url

我有一个带有单个页面的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个月了,我已经在网站的其他区域实施了它。

2 个答案:

答案 0 :(得分:3)

您可以使用URL Rewrite filter

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

答案 1 :(得分:1)

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

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

getPathInfo()的结果将用于查找ID,请求将forwarded添加到department.action。处理null案例也意味着用户正在尝试浏览/departments/目录。