我可以在运行时在tomcat服务器上添加<server-mapping>吗?

时间:2017-02-06 17:13:44

标签: java tomcat servlets

我正在为我的网络应用程序制作一个API,它运行在一个tomcat服务器上,计划是制作一个CRUD REST API像Prestashop,但我不知道如何添加ID一个表到url路径。

因此,当您转到客户(http://yourUrl.com/api/customers)时,您将收到回复:

<prestashop xmlns:xlink="http://www.w3.org/1999/xlink">
    <customers>
        <customer id="1" xlink:href="http://yourUrl.com/api/customers/1"/>
        <customer id="2" xlink:href="http://yourUrl.com/api/customers/2"/>
        <customer id="3" xlink:href="http://yourUrl.com/api/customers/3"/>
        <customer id="4" xlink:href="http://yourUrl.com/api/customers/4"/>
        <customer id="5" xlink:href="http://yourUrl.com/api/customers/5"/>
        <customer id="6" xlink:href="http://yourUrl.com/api/customers/6"/>
        <customer id="7" xlink:href="http://yourUrl.com/api/customers/7"/>
        <customer id="8" xlink:href="http://yourUrl.com/api/customers/8"/>
        <customer id="9" xlink:href="http://yourUrl.com/api/customers/9"/>
        <customer id="10" xlink:href="http://yourUrl.com/api/customers/10"/>
        <customer id="11" xlink:href="http://yourUrl.com/api/customers/11"/>
    </customers>
</prestashop>

然后你可以去http://yourUrl.com/api/customers/1 那么我的计划是添加一个带有多个映射的servlet,我已经发现了如何在运行时使用广告servlet而不是映射。

如何存档?

1 个答案:

答案 0 :(得分:1)

您已走上正轨,但每次添加客户时都无需修改web.xml。如果您需要使用“纯”servlet,那么最好的办法是将web.xml中的映射更改为:

<servlet-mapping>
    <servlet-name>CustomerHandler</servlet-name>
    <url-pattern>/api/customers/*</url-pattern>
</servlet-mapping>

然后,在servlet中(例如,doGet())

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
  String pathInfo = request.getPathInfo();

  // process pathinfo
}

您的pathInfo字符串将是之后的servlet路径。因此,例如,如果请求是“/ api / customers / 8”,则pathInfo字符串将为“/ 8”。你必须解析这个,处理错误(比如url是“/ api / customers / blah”)。如果pathInfo为null,则在“/ api / customers”之后没有提供任何内容,您可以假设这将返回带有ID的客户列表。

但是,有关信息,这是“旧的”方式。它会起作用,但它需要你做比需要更多的工作。 “新”方式是使用JAX-RS。在这种情况下,您可以定义服务以执行您想要的操作。语法如下:

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;


@Path("/api/customers")
public class CustomerProcessor {

    @Path("/")
    @Produces({ MediaType.APPLICATION_XML })
    @GET
    public Response getCustomerData() {
        // get the customer list - assume that it's a String
        String customerXML = ...;

        return Response.ok(customerXML).build();
    }

    @Path("/{customerId}")
    @Produces({ MediaType.TEXT_PLAIN }) # not sure of the return type
    @GET
    public Response getCustomer(@PathParam("customerId") Integer customerId) {
        // customerId is set to what is on the url but you didn't parse it
        Customer customer = getCustomer(customerId);

        return Response.ok(customer).build();
    }
}

请注意,您有两个映射到/ api / customers的方法 - 一个有一个,一个没有参数。这使您可以根据您是否拥有客户ID来保持代码分开。

第二个解决方案的最大问题是“开箱即用”不支持Tomcat。您需要向Tomcat添加JAX-RS支持或切换到本机支持它的服务器(如TomEE,Wildfly等)。

要让Tomcat支持JAX-RS,那里有other posts - 它并不可怕,但它也不是“免费”。