问题描述
我正在关注 Java 教程读取和写入 URL,但我卡住了。
https://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html
有两个代码块。一种用于 servlet,一种用于客户端。
小服务程序。
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.net.*;
public class ReverseServlet extends HttpServlet
{
private static String message = "Error during Servlet processing";
public void doPost(HttpServletRequest req,HttpServletResponse resp) {
try {
int len = req.getContentLength();
byte[] input = new byte[len];
ServletInputStream sin = req.getInputStream();
int c,count = 0 ;
while ((c = sin.read(input,count,input.length-count)) != -1) {
count +=c;
}
sin.close();
String inString = new String(input);
int index = inString.indexOf("=");
if (index == -1) {
resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
resp.getWriter().print(message);
resp.getWriter().close();
return;
}
String value = inString.substring(index + 1);
//decode application/x-www-form-urlencoded string
String decodedString = URLDecoder.decode(value,"UTF-8");
//reverse the String
String reverseStr = (new StringBuffer(decodedString)).reverse().toString();
// set the response code and write the response data
resp.setStatus(HttpServletResponse.SC_OK);
OutputStreamWriter writer = new OutputStreamWriter(resp.getoutputStream());
writer.write(reverseStr);
writer.flush();
writer.close();
} catch (IOException e) {
try{
resp.setStatus(HttpServletResponse.SC_BAD_REQUEST);
resp.getWriter().print(e.getMessage());
resp.getWriter().close();
} catch (IOException ioe) {
}
}
}
}
和客户
import java.io.*;
import java.net.*;
public class Reverse {
public static void main(String[] args) throws Exception {
if (args.length != 2) {
System.err.println("Usage: java Reverse "
+ "http://<location of your servlet/script>"
+ " string_to_reverse");
System.exit(1);
}
String stringToReverse = URLEncoder.encode(args[1],"UTF-8");
URL url = new URL(args[0]);
URLConnection connection = url.openConnection();
connection.setDoOutput(true);
OutputStreamWriter out = new OutputStreamWriter(
connection.getoutputStream());
out.write("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();
}
}
当我使用命令运行客户端时
java http://localhost:8080/ReverseString "Reverse me"
<!DOCTYPE html>
<html lang="en">
<head>
<Meta charset="utf-8">
<link href="jetty-dir.css" rel="stylesheet" />
<title>Directory: /ReverseServlet/</title>
</head>
<body>
<h1 class="title">Directory: /ReverseServlet/</h1>
<table class="listing">
<thead>
<tr><th class="name"><a href="?C=N&O=D">Name ⇧</a></th><th class="lastmodified"><a href="?C=M&O=A">Last Modified</a></th><th class="size"><a href="?C=S&O=A">Size</a></th></tr>
</thead>
<tbody>
<tr><td class="name"><a href="/ReverseServlet/meta-inf/">meta-inf/ </a></td><td class="lastmodified">May 11,2021,6:52:48 AM </td><td class="size">4,096 bytes </td></tr>
<tr><td class="name"><a href="/ReverseServlet/ReverseServlet.java">ReverseServlet.java </a></td><td class="lastmodified">May 11,6:47:06 AM </td><td class="size">1,551 bytes </td></tr>
</tbody>
</table>
</body></html>
web.xml 是:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>ReverseServlet</servlet-name>
<servlet-class>ReverseServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ReverseServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<display-name>ReverseServlet</display-name>
</web-app>
我错过了什么?
解决方法
解决了。我已经在 github 上发布了代码以及我让它工作的步骤。 https://github.com/viardot/ReadingfromandWritingtoURL