restfulweb服务与servlet中的web应用

ubof19bj  于 2021-07-07  发布在  Java
关注(0)|答案(1)|浏览(356)

我是java web应用程序的新手。我在intellij中使用Java1.8、TomcatServer9.0.4和jersey库。我希望有一个简单的网页,在调用get方法时显示一个数据库内容表,在调用post方法及其参数时显示一个来自同一地址的restfulapi,以便从同一个表中获取特定数据。这是我的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;
    }
}

这是我的web 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);
    }
}

当我在postman中调用地址localhost/hello?name=hana时,结果会显示出来,但当我在浏览器中打开localhost/hello时,只会出现一个空白页。我尝试添加另一个没有星号的servlet和servletMap,但是web服务器没有启动并触发错误。如何更改web.xml来实现这一点?

djp7away

djp7away1#

问题在于 <url-pattern>/*</url-pattern> 泽西岛的申请。这将使jersey处理所有请求。这使得servlet没有机会获得任何请求。泽西岛不会转发它不知道的请求。
但是,您可以做的不是使用servlet,而是创建一个jersey资源方法来注入 HttpServletRequest 以及 HttpServletResponse . 然后您可以使用与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模式改成其他类似的模式 /api/* 以便可以访问其他servlet(例如处理静态内容的默认servlet)。通过这种方式,其他静态文件(如css和js文件)可以按照容器提供服务的方式进行处理。
另一个选择是使用jersey的过滤器配置,如我在脚注中发布的链接中所述。我个人更喜欢前者,因为web应用程序和restapi的url是分开的。
1.可以将jersey配置为转发请求。它包括将jersey配置为作为servlet过滤器而不是servlet运行,以及设置configuration init param。请参阅jersey/*servletMap导致静态资源的404错误。

相关问题