2

我想要一个可以在没有参数的情况下使用的简单 servlet。就像是 :

http://servername:8080/do/view/username/address

并像参数一样使用它:

http://servername:8080/do?action=view&login=username&page=address

两个 url 将具有相同的行为。我更喜欢不使用任何框架,只使用 servlet 和过滤器。

如何从 servlet 获取 url 名称?最好的解决方案是什么?


回复:


根据@BalusC 的回复,我创建了以下 servlet,可以满足我的所有需求:

@WebServlet("/do/*")
public class ActionTestCasesServlet extends HttpServlet {

protected void doGet(HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException  
{
  String pathInfo = request.getPathInfo();
  String[] parts = pathInfo.substring(1).split("/");
  RequestDispatcher destination = getServletContext()
            .getRequestDispatcher("/" + parts[0] + ".jsp");
  if (parts.length > 1) {
request.setAttribute("username", parts[1]);
  }
  if (parts.length > 2) {
    request.setAttribute("page", parts[2]);
  }
  destination.forward(request, response);

 }
}

此代码调用“view.jsp”传递属性“用户名”和“页面”。

4

4 回答 4

6

只需将 servlet 映射到/do/*而不是/do.

@WebServlet("/do/*")

这样您就可以使用HttpServletRequest#getPathInfo().

String pathInfo = request.getPathInfo(); // /view/username/address

您可以使用通常的String方法,例如String#split()将其拆分为片段。

String[] parts = pathInfo.substring(1).split("/"); // view, username, address

也可以看看:

  • 设计模式基于 Web 的应用程序- 对于您打算自己开发 MVC 的情况(注意:我不推荐这样做,如果它是用于学习/爱好目的,这很有趣,但如果它是为了真正的工作,宁愿选择一个现有的 MVC 框架,以便您可以确保覆盖每个陷阱)
于 2013-06-10T15:51:25.447 回答
2

你说你不想使用“任何框架,只有 servlet 和过滤器”,但你有没有考虑过tukey.org UrlRewriteFilter?这是一个单一的过滤器,您可以在 web.xml 中注册,然后声明规则,例如

    <rule>
        <from>/do/(.+)/(.+)/(.+)</from>
        <to>/do?action=$1&amp;login=$2&amp;page=$3</to>
    </rule>

在一个 XML 文件中。然后,您只需编写您的 servlet 以期望查询参数正常,并让过滤器处理“漂亮”的 URL。

于 2013-06-10T16:04:05.457 回答
1

Spring MVC 做得非常非常好。但是,如果您不想使用第三方框架,您可以处理 request.getRequestURI(),拆分此字符串并做您想做的事。例如,您可以使用模式 /entity/action。

于 2013-06-10T15:50:36.400 回答
0

我认为以前的线程回复是完美的解决方案。我玩了 web.xml 文件,看看我能做什么,这是我的结果。我能够更改 web.xml 以获得类似于您想要的“ http://localhost:8080/do/myServlet.do”的 url。这是与 servlet-name 和 url-pattern 相关的 web.xml 文件内容。

   <servlet>
      <servlet-name>do</servlet-name>
      <servlet-class>ControlServlet</servlet-class>
   </servlet>

   <servlet-mapping>
      <servlet-name>do</servlet-name>
      <url-pattern>/myServlet.do</url-pattern>
   </servlet-mapping>
</web-app>
于 2013-06-10T15:49:40.563 回答