Warm tip: This article is reproduced from serverfault.com, please click

java-RESTful Web Service和Servlet中的Web应用程序

(java - Restful web Service alongside web application in servlet)

发布于 2020-11-28 11:19:58

我是Java Web应用程序的新手。我在IntelliJ中使用Java 1.8,tomcat服务器9.0.4和球衣库。我希望有一个简单的网页,该网页在调用get方法时显示数据库内容的表,并且在调用post方法及其参数以从同一表中获取特定数据时,也显示来自同一地址的静态API 。这是我的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);
    }
}

当我在 Postman 中调用地址localhost / hello?name = hana时,结果显示出来,但是当我在浏览器中打开localhost / hello时,只会出现空白页面。我想添加另一个没有 Asterisk 的servlet和servlet映射,但是Web服务器无法启动并触发错误。我该如何更改web.xml来做到这一点?

Questioner
fatemeh poormohammad
Viewed
0
Paul Samsotha 2020-11-28 21:00:29

问题是<url-pattern>/*</url-pattern>Jersey应用程序的。这将使Jersey处理所有请求。这样,servlet就没有机会获得任何请求。泽西岛不会转发不知道的请求1

但是,你可以做的是代替使用Servlet,而只需创建一个注入HttpServletRequestand的Jersey资源方法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-pattern更改为其他类似内容,/api/*以便可以访问其他servlet(例如处理静态内容的默认servlet)。这样,其他静态文件(如CSS和JS文件)就可以按应由容器提供的方式进行处理。

另一个选择是使用脚注的链接中提到的Jersey的筛选器配置。就个人而言,我更喜欢前一种方法,因为Web应用程序的URL和REST API的URL是分开的。


1.可以将Jersey配置为转发请求。它涉及将Jersey配置为作为Servlet过滤器而不是Servlet来运行,还涉及设置配置init-param。请参阅Jersey / * servlet映射导致404错误的静态资源