如何与 Java 客户端的 servlet 通信

How to communicate with a servlet from a Java client

我在 Windows 10 上使用 Netbeans 12 开发了一个 servlet。该 servlet 部署在我的机器上的 Apache Tomcat 9.0.39 上,它与 Netbeans IDE 集成。在开发 servlet 时,Netbeans IDE 会自动创建一个包含静态 Html 内容的 index.html 文件,并将该文件放在“src->main->webapp”文件夹下。
客户端向 servlet 发送一个字符串,然后 servlet 反转字符串并将 returns 返回给客户端。但是,我的客户端只能在 servlet 的响应中看到 index.html(上面提到的)的静态内容,而不是 servlet 写入 PrintWriter 对象的反向字符串对象(从 Response.getWriter() ).
这里是index.html的内容:

<!DOCTYPE html>
<html>
    <head>
        <title>My first servlet</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <h1>Reversing Strings!!!</h1>
        <p> This is index.html page</p>
    </body>
</html>


这里是web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
    <servlet>
        <servlet-name>ReverseString</servlet-name>
        <servlet-class>org.me.servletlearning.ReverseString</servlet-class>
        <init-param>
            <param-name>greeting</param-name>
            <param-value>Hello Tony</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>ReverseString</servlet-name>
        <url-pattern>/reversestring</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>


这里是context.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/reversestring"/>


这是 servlet:

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    String inputString = request.getParameter("reverse_string");
    StringBuilder temp = new StringBuilder(inputString);
    String result = temp.reverse().toString();
    try (PrintWriter out = response.getWriter()) {
        /* TODO output your page here. You may use following sample code. */
        out.println("<!DOCTYPE html>");
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet ReverseString</title>");            
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet ReverseString at " + request.getContextPath() + "</h1>");
        out.println("<p> The input string: "+inputString+"<br>");
        out.println("The reversed string: "+result+" </p>");
        out.println("</body>");
        out.println("</html>");
    }
}

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


@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}


客户:

public static void writeToURL() {
        try {
            //   need to study and understand servlet
            //   then write to a servelt through a URL object.
            String stringToReverse = URLEncoder.encode("HelloWorld", "UTF-8");
            
            URL url = new URL("http://localhost:8080/reversestring/");
            URLConnection connection = url.openConnection();
            connection.setDoOutput(true);
            
            OutputStreamWriter out = new OutputStreamWriter(
                    connection.getOutputStream());
            out.write("reverse_string=" + stringToReverse);
            out.close();
            
            BufferedReader in = new BufferedReader(
                    new InputStreamReader(
                            connection.getInputStream()));
            String decodedString;
            while ((decodedString = in.readLine()) != null) {
                System.out.println(decodedString);
            }
            in.close();
        } catch (UnsupportedEncodingException ex) {
                    ex.printStackTrace();
        } catch (MalformedURLException ex) {
            ex.printStackTrace();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }


客户端从servlet接收到的内容:

<!DOCTYPE html>
<html>
    <head>
        <title>My first servlet</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <h1>Reversing Strings!!!</h1>
        <p> This is index.html page</p>
    </body>
</html>


我的代码缺少什么? 谢谢

您的 webapp 上下文路径是 /reversestring。 string-reversing servlet 在该上下文中的路径 /reversestring 处注册。要向 servlet 发出请求,URL 应该是:

http://localhost:8080/reversestring/reversestring