如何使用像参数一样的URL

时间:2013-06-10 15:45:02

标签: java url servlets

我想要一个可以在没有参数的情况下使用的简单servlet。类似的东西:

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

并像参数一样使用它:

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

两个网址都会有相同的行为。我更喜欢不使用任何框架,只使用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”传递属性“username”和“page”。

4 个答案:

答案 0 :(得分:6)

只需在/do/*而不是/do上映射servlet。

@WebServlet("/do/*")

这样您就可以使用HttpServletRequest#getPathInfo()获取路径信息。

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

您可以使用String#split()等常用String方法将其拆分为片段。

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

另见:

  • Design Patterns web based applications - 对于你想要移植MVC的情况(注意:我不推荐这个,如果这是为了学习/爱好的目的,它是有趣的,但如果它是真正的工作,而是选择现有的MVC框架这样你就可以确保每个陷阱都被覆盖了。)

答案 1 :(得分:2)

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

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

在XML文件中。然后你只需编写你的servlet就可以使查询参数正常,并让过滤器处理“漂亮”的URL。

答案 2 :(得分:1)

Spring MVC做得非常好。但是,如果您不想使用第三方框架,则只需处理request.getRequestURI(),拆分此字符串并执行您想要的操作。例如,您可以使用模式/实体/操作。

答案 3 :(得分:0)

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

   <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>