我注意到SO非常好地生成了它的网址,让我们说在创建问题时,网址就像这个http://stackoverflow.com/questions/ask
或查看问题http://stackoverflow.com/questions/QUESTIONNUM/some-question-title
Stackoverflow如何实现这样优雅的URL,它的url中没有任何查询字符串,即使没有查询字符串,它仍然可以识别正在访问的页面或问题编号。我想在我的应用程序中实现这样的url。
我的问题如何在应用程序中实现此功能?我正在使用Apache Tomcat和Struts2。
答案 0 :(得分:2)
StackOverflow使用ASP.NET MVC构建。它使用ASP.NET routing。此网址的重要部分是QUESTIONNUM
。这是用于查询数据库和检索问题编号的内容。问题标题完全是任意的。例如,这两个网址指向完全相同的位置:
https://stackoverflow.com/questions/14011268/stackoverflow-like-urls-with-struts2-or-jsp
https://stackoverflow.com/questions/14011268/foo-bar-baz
所以基本上当生成给定问题的链接时,问题id用于从数据库中检索问题详细信息(例如问题的标题),并且在ASP.NET中使用HTML帮助程序构建正确的URL MVC。由于问题的标题可能包含任意字符,因此通过regular expression
过滤此标题以删除危险字符并将其替换为安全等效字符。
答案 1 :(得分:2)
您可以随时编写自己的ActionMapper并使用而不是默认的映射器,如下所示:
<bean type="org.apache.struts2.dispatcher.mapper.ActionMapper" name="myMapper" class="com.company.MyActionMapper" />
<constant name="struts.mapper.class" value="myMapper" />