代码之家  ›  专栏  ›  技术社区  ›  Vincent Ramdhanie

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

  •  0
  • Vincent Ramdhanie  · 技术社区  · 17 年前

    我有一个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。

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

    但问题是:在Struts2中有没有更好的方法可以做到这一点?

    谢谢。

    更新(2009年5月): 我只是在这个问题上跌跌撞撞地想,我会说我做了什么来解决它。

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

    在action类中,我只需解析URL并查找departments/和.html之间的部分,这是部门的名称,因此我可以在数据库中查找它。这项工作已经顺利进行了近5个月,我已经在该网站的其他领域实施了它。

    2 回复  |  直到 17 年前
        1
  •  1
  •   erickson    17 年前

    这通常是通过将servlet映射到(在您的案例中是“/department”),然后使用 path servlet中用于确定ID的信息(例如'/工程')。

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

    结果 getPathInfo() 将用于查找ID,请求将 forwarded 部门行动。处理 null 也就是说,用户试图浏览 /departments/ 目录。

        2
  •  3
  •   Pool    17 年前

    你可以用 URL Rewrite filter

    这避免了需要任何附加servlet或Java代码,但需要XML描述符。