【问题标题】:Integrating JAX-RS and Java Servlets集成 JAX-RS 和 Java Servlet
【发布时间】:2016-05-07 15:55:56
【问题描述】:

我是一名大学生,目前正在为一个模块开发一个 Android 应用。正在将其连接到服务器以执行登录等。部门给了我们一个服务器来使用并指导我们使用 Servlet。我宁愿以一种 Restful 的方式来做这件事,因为它似乎是一个行业标准。这是我目前写的代码:

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 数据库)。

我遇到的问题是,当我运行网络服务器(使用Jettyant 是构建工具)并尝试通过浏览器访问服务器上的页面时,它只是给了我一个503,Servlet not initialised 错误。我认为这是因为我没有扩展 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 方法中以与服务器/数据库进行通信?还是我做错了?

【问题讨论】:

    标签: java rest servlets


    【解决方案1】:

    我不确定这是否是一个答案,但如果您的项目基于 maven 并使用 jetty-maven-plugin,您可能会有更好的运气。我有,个人。如果您有一个可以生成简单 maven 原型的 IDE,则很容易设置。您只需将插件放入您的 pom 并从命令行运行 mvn jetty: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 设置正确,这应该足以让 jetty servlet 容器拾取它们。如果您使用 maven webapp 原型,这可能会为您完成,否则您将不得不四处寻找,但如果它有帮助,这就是我的 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>
    

    这里的映射表示将 servlet 名称“rest”映射到我所有 JAX-RS 服务所在的包 com.my.project.services,并在末尾附加 @Path 值(所以上面的登录服务将位于 /myproject/rest/login)。您可以任意设置映射路径。

    编辑:应该提到我的项目也使用泽西岛。这里有一个很好的指南来设置这样的项目:http://crunchify.com/how-to-build-restful-service-with-java-using-jax-rs-and-jersey/

    【讨论】:

    • 您好,感谢您的回答。这听起来比使用 ant 更好,但不幸的是,服务器是与其他学生共享的,所以如果我更改构建过程,则意味着其他学生将无法使用它。不过,我会进一步研究它,可能有解决方法之类的。
    猜你喜欢
    • 2016-01-22
    • 2017-12-23
    • 2015-01-25
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-27
    相关资源
    最近更新 更多