Restful Web 服务和 servlet 中的 Web 应用程序

Restful web Service alongside web application in servlet

我是 java 网络应用程序的新手。我在 IntelliJ 中使用 java 1.8、tomcat 服务器 9.0.4 和球衣库。我想要一个简单的网页,在调用 get 方法时显示数据库内容的 table,在 post 时显示来自同一地址的 restful API方法及其参数被调用,以便从同一个 table 中获取特定数据。这是我的 web.xml 配置:

    <servlet>
        <servlet-name>Test API</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>

        <init-param>
            <param-name>com.sun.jersey.config.property.packages</param-name>
            <param-value>api</param-value>
        </init-param>
        <init-param>
            <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>

    </servlet>

    <servlet-mapping>
        <servlet-name>Test API</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

这是我的项目结构:

这是我的 API java 代码:

@Path("hello")
public class postRequest {

    @POST
    @Produces(MediaType.TEXT_PLAIN)
    public String doPost(@QueryParam("name") String name){
        return "Hello,I am " + name;
    }
}

这是我的网站 java 代码:

@WebServlet(name = "getRequest", urlPatterns = {"hello"})
public class getRequest extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html;charset=UTF-8");
        RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
        dispatcher.forward(request, response);
    }
}

当我在浏览器中调用地址 localhost/hello?name=hana in postman the result shows up but when I open the localhost/hello 时,出现的只是一个空白页面。我试图添加另一个不带星号的 servlet 和 servlet 映射,但网络服务器没有启动并触发错误。 我怎样才能改变 web.xml 来实现它?

问题是 Jersey 应用程序的 <url-pattern>/*</url-pattern>。这将使 Jersey 处理 all 请求。这使 servlet 没有机会获得任何请求。 Jersey 不会转发它不知道的请求1.

不过,您可以做的是不使用 Servlet,只需创建一个注入 HttpServletRequestHttpServletResponse 的 Jersey 资源方法。然后您可以使用与在 Servlet

中所做的相同的代码
@GET
@Path("redirect")
public void redirect(@Context HttpServletRequest request,
                     @Context HttpServletResponse response)
        throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");
    RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/index.jsp");
    dispatcher.forward(request, response);
}

刚刚用这个资源方法测试过,效果很好。

注意:如果您打算为整个 Web 应用程序提供服务,这可能不是最有效的方法。我要做的只是将 url-pattern 更改为 /api/* 之类的其他内容,以便可以访问其他 servlet(例如处理静态内容的默认 servlet)。这样,其他静态文件(如 CSS 和 JS 文件)就可以按照容器应提供的方式进行处理。

另一种选择是使用 Jersey 的过滤器配置,如我在脚注中发布的 link 中所述。就个人而言,我更喜欢前一种方法,因为 Web 应用程序的 URL 和 REST API 是分开的。


1.可以配置 Jersey 来转发请求。它涉及将 Jersey 配置为 运行 作为 servlet 过滤器而不是 Servlet,并且还设置配置 init-param。参见 Jersey /* servlet mapping causes 404 error for static resources