集成JAX-RS和Java servlet

集成JAX-RS和Java servlet,java,rest,servlets,Java,Rest,Servlets,我是一名大学生,目前正在为一个模块开发Android应用程序。正在将其连接到服务器以执行登录等操作。该部门为我们提供了一台服务器,并指示我们使用servlet。我宁愿以一种安静的方式来做,因为这似乎是一种行业标准。以下是我迄今为止编写的代码: import javax.ws.rs.QueryParam; /** * * @author Tom */ public class Login { public boolean doLogin(@QueryParam("email")

我是一名大学生,目前正在为一个模块开发Android应用程序。正在将其连接到服务器以执行登录等操作。该部门为我们提供了一台服务器,并指示我们使用servlet。我宁愿以一种安静的方式来做,因为这似乎是一种行业标准。以下是我迄今为止编写的代码:

import javax.ws.rs.QueryParam;

/**
 *
 * @author Tom
 */
public class Login {

    public boolean doLogin(@QueryParam("email") String email) {
        return checkCredentials(email);
    }

    private boolean checkCredentials(String email){
        boolean result = false;
        if (email != ""){
            try {
                result = DBConnection.checkLogin(email);
            } catch (Exception e) {
                result = false;
            }
        } else {
            result = false;
        }

        return result;
    }

}
我编写了另一个类,
DBConnection
,但它似乎工作正常(使用JDBC连接到MySQL数据库)

我遇到的问题是,当我运行Web服务器(使用
Jetty
,而
ant
是构建工具)并试图通过浏览器访问服务器上的页面时,它只会给我一个503,
Servlet未初始化
错误。我假设这是因为我没有扩展
HttpServlet
类?下面是他们给我们的一些Servlet代码示例:

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class Product extends HttpServlet
{
    protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException
    {
        httpServletResponse.setContentType("text/plain");
        PrintWriter out = httpServletResponse.getWriter();
        out.println("Hello");
        out.close();
    }
}
他们给了我们一个名为
JettyStart.java
的文件,当您运行ant时,该文件将启动web服务器:

import org.mortbay.jetty.Server;
import org.mortbay.jetty.servlet.ServletHttpContext;

public class JettyStart
{
    public static void main(String[] args) throws Exception
    {
        //A server running at http://localhost:8085 is created
        Server server = new Server();
        server.addListener(":8085");

        ServletHttpContext context = (ServletHttpContext) server.getContext("/");
        context.addServlet("/path/to/Login", "package.name.Login");

        server.start();
    }
}

那么,我将如何将servlet集成到与服务器/数据库通信的Restful方法中呢?还是我做错了?

我不确定这是否是一个答案,但如果您的项目基于maven并使用jetty maven插件,您可能会更走运。我个人有。如果您有一个可以生成简单maven原型的IDE,那么就很容易进行设置。您只需将插件放到pom中,然后从命令行运行mvnjetty:run。连接JAX-RS web服务并不太复杂,只需为它们提供正确的注释,如下所示:

package com.my.project.services;

// imports here 

@Path("/login")
public class Login extends HttpServlet {

    @GET
    @Produces({"text/html", MediaType.TEXT_HTML})
    public String getLoginInfo(@QueryParam("email") String email) {
        // ...
    }
}
只要您的web.xml设置正确,这就足以让JettyServlet容器获取它们。如果您使用maven webapp原型,这可能是为您完成的,否则您将不得不四处探索,但如果它有帮助,我的一个项目中的my web.xml(相关部分)就是这样的:

<web-app>

    <servlet>
        <servlet-name>rest</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
            <init-param>
                <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
                <param-value>true</param-value>
            </init-param>
            <init-param>
                <param-name>com.sun.jersey.config.property.packages</param-name>
                <param-value>com.my.project.services</param-value>
            </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>rest</servlet-name>
        <url-pattern>/myproject/rest/*</url-pattern>
    </servlet-mapping>

</web-app>

休息
com.sun.jersey.spi.container.servlet.ServletContainer
com.sun.jersey.api.json.POJOMappingFeature
真的
com.sun.jersey.config.property.packages
com.my.project.services
1.
休息
/我的项目/休息/*
这里的映射是将servlet名称“rest”映射到所有JAX-RS服务所在的包com.my.project.services,并在末尾附加@Path值(因此上面的登录服务将位于/myproject/rest/login)。可以按任何方式设置映射路径


编辑:应该提到我的项目也使用了Jersey。这里有一个很好的指南,可以帮助你建立这样一个项目:

嗨,谢谢你的回答。这听起来比使用ant好,但不幸的是,服务器是与其他学生共享的,因此如果我更改构建过程,这将意味着其他学生将无法使用它。不过,我会更深入地研究,可能会有一个解决办法或其他什么。