2015-05-04 97 views
1

我正在使用servlet从前端获取请求。 我能做出单一的servlet,可以根据url模式做多种操作吗? 这里将是我的URL映射构造多个servlet请求url模式

<servlet> 
<servlet-name>Hello</servlet-name> 
<servlet-class>HelloWorld</servlet-class> 
</servlet> 

<servlet-mapping> 
<servlet-name>Hello</servlet-name> 
<url-pattern>/HelloServlet</url-pattern> 
<url-pattern>/HelloServletOne</url-pattern> 
<url-pattern>/HelloServletTwo</url-pattern> 
</servlet-mapping> 

这意味着,如果我打的网址框下方应调用自己的功能。

  • URL:/ HelloServlet:它应该做的函数1
  • URL:/ HelloServletOne:它应该做的功能2
  • URL:/ HelloServletTwo:它应该做的功能3等

我如何通过扩展servlet来实现这一点?代码/链接示例非常感谢。

+1

您似乎可以这样做,但不同的方法可能是使用一个servlet映射,但使用HTTP动词来区分以类似于REST的方式执行的操作。 goGet方法检索,doPut方法更新,doPost插入,doDelete删除。我想我会朝着这个方向前进,而不是你所建议的servlet映射方法。 – DaveH

+0

只是为了理解你的权利 - 你想使用一个servlet(HelloWorld)。基于URL,应该调用HelloWorld servlet中的不同方法? – swinkler

+0

@DaveHowes使用休息服务可以实现。但我不擅长这一点。如果我能够使用servlet实现这一点,我的工作将变得更加容易。:) –

回答

4

关于你的url模式,你需要知道什么URL被调用。因为请求可以被制成,由于不同的HTTP的方法(GET,POST等),你可以使用FrontController Pattern

import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class HelloServlet extends HttpServlet { 

    private static final String SERLVET = "HelloServlet"; 
    private static final String SERLVET_ONE = "HelloServletOne"; 
    private static final String SERLVET_TWO = "HelloServletTwo"; 

    @Override 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    processRequest(req, resp); 
    } 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    processRequest(req, resp); 
    } 

    private void processRequest(HttpServletRequest req, HttpServletResponse resp) { 
    String path = req.getServletPath(); 
    switch (path) { 
     case SERLVET: 
     // ... call your function1 
     break; 
     case SERLVET_ONE: 
     // ... call your function2 
     break; 

     case SERLVET_TWO: 
     // ... call your function3 
     break; 
     default: 
     break; 
    } 

    // do something else 
    } 

} 

的getServletPath方法的部件,如你已经给了明确的URL的模式可能只工作。对于其他信息的URL检查this link

+0

谢谢@swinkler是这是我所期待的答案。这个链接也帮助我:http://stackoverflow.com/questions/4931323/whats-the-difference-between-getrequesturi-and-getpathinfo-methods-in-httpservl –

0

您不应该为此使用三个不同的Servlet。你应该使用不同的Servlet方法来实现这一点。

使用doGet获取数据的方法。
使用doPost插入数据的方法。
使用doPut更新数据的方法。
使用doDelete删除数据的方法。

详情请参考servlet api documentation

编辑:
了解更多关于这个here。 它说,如果你正在使用servlet api版本2.5或更高版本,你提供的url映射必须工作。

此外,请确保您在<servlet-name>中提供了servlet类的全限定名。

+0

这不是我正在寻找的答案。我需要根据url模式调用一些函数。请检查更新后的问题。 –

0

您可以通过使合同具有像'ACTION'这样的请求参数来处理同一个servlet的多个请求。然后在您的表单中添加这个隐藏字段,其值为'ACTION_1''ACTION_2''ACTION_3'。因此,在doPost()中,您可以检查此参数值,并且可以在同一个servlet中调用相应的处理方法。

class YourServlet extends HttpServlet{ 

     public void doPost(HttpReq req, HttpResp resp){ 
       String action = reg.getParameter('ACTION'); 
       if('ACTION_1'.equals(action)){ 
        doAction_1(); 
       } 
       if('ACTION_2'.equals(action)){ 
        doAction_2() 
       } 
       if('ACTION_3'.equals(action)){ 
        doAction_3() 
       } 
       else { 
        defaultAction(); 
       } 
     } 

} 
+0

这可以在单个url模式下实现。但对我来说,客户端API已经暴露,无法做任何改变。使用这些url模式,我需要区分来自客户端的请求。 –

+0

你能用'spring-mvc'框架吗?如果是的话,你可以使用'MultiActionController'轻松做你想做的事情。 @MadhukarHebbar – MChaker

+0

是的,它可以通过很多方式实现,但根据我所问的问题是它能够使用servlet实现。谢谢 –

0

我做成。

HttpServletRequest.getRequestURI()返回包含/ *和查询参数的URL模式(如果存在),并且HttpServletRequest.getPathInfo()返回由/ *匹配的部分(或者对于精确匹配为null)。

这里在我的情况下,我需要getPathInfo()它将返回 根据请求HelloServlet,HelloServletOne或HelloServletTwo。 谢谢。