当我尝试发布请求时,我的 JSP 中出现状态 500 – 内部服务器错误的错误。 所以我需要执行 http 请求以在 Dropbox 上创建具有某些名称的文件夹(测试等) 我有 Tomcat 9.0.30 并添加 jSTL-1-2.jar 我有一个 DropboxActioner 类
package ua.oleh.application;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
public class DropboxActioner {
private String token ="Bearer <my token>";
public void createFolder(String path) throws Exception {
try {
URL url = new URL("https://api.dropboxapi.com/2/files/create_folder");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
String parameters = "{\"path\": \"" + path + "\"}";
conn.setRequestProperty("Content-Type", "application/json");
conn.addRequestProperty ("Authorization", token);
conn.setRequestMethod("POST");
conn.setDoOutput(true);
DataOutputStream writer = new DataOutputStream(conn.getOutputStream());
writer.writeBytes(parameters);
writer.flush();
if (writer != null)
writer.close();
if (conn.getResponseCode() != 200) {
System.out.println(conn.getResponseMessage());
throw new RuntimeException("Failed : HTTP error code : "
+ conn.getResponseCode());
}
BufferedReader br = new BufferedReader(new InputStreamReader(
(conn.getInputStream())));
String output;
System.out.println("Output from Server .... \n");
while ((output = br.readLine()) != null) {
System.out.println(output);
}
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果我用 public static void main 尝试它,它就会起作用。 我需要在需要输入 token 和文件夹名称的网页上执行此操作。 为了进行测试,我没有从 JSP 获取此参数并将其静态写入代码中。 我有JSP页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>DropboxDemo</title>
</head>
<body>
Enter token
<input id ="key"></input>
Enter folder Name
<input id ="folder_name"></input>
<button id="login">Login</button>
<button id ="create">Create folder</button>
<%@page import="ua.oleh.application.DropboxActioner" %>
<% DropboxActioner dropboxActioner = new DropboxActioner();%>
<% String token;%>
<% String name = request.getParameter("name");%>
<%= dropboxActioner.createFolder(name)%>
</body>
</html>
我在 Chrome 上遇到错误
Type Exception Report
Message Unable to compile class for JSP:
Description The server encountered an unexpected condition that prevented it from fulfilling the request.
Exception
org.apache.jasper.JasperException: Unable to compile class for JSP:
An error occurred at line: [18] in the jsp file: [/index.jsp]
The method print(boolean) in the type JspWriter is not applicable for the arguments (void)
15: <% DropboxActioner dropboxActioner = new DropboxActioner();%>
16: <% String token;%>
17: <% String name = request.getParameter("name");%>
18: <%= dropboxActioner.createFolder(name)%>
19: </body>
20: </html>
Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:213)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:519)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:392)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:362)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:346)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:605)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:400)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
org.apache.jasper.servlet.JspServlet.init(JspServlet.java:139)
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:678)
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:367)
org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860)
org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1598)
org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
java.lang.Thread.run(Thread.java:748)
Note The full stack trace of the root cause is available in the server logs.
我在 Youtube 上查看了一个指南,其中程序员使用 Java 类中的方法获取数据
<% DropboxActioner dropboxActioner = new DropboxActioner();%>
<% String token;%>
<% String name = request.getParameter("name");%>
<%= dropboxActioner.createFolder(name)%>
但是我有一个错误。 我该如何解决它? 也许我只能从 jsp/html 读取数据到 Java 类并在 public static void main 中运行它,并且不将 jsp 页面与 Java 类连接?
最佳答案
行:
<%= dropboxActioner.createFolder(name)%>
表示输出调用 dropboxActioner.createFolder(name)
返回的值.
但是你已经声明了createFolder
返回void
。所以JSP无法打印它。
How i can resolve it?
更改方法以返回您想要输出的字符串。该方法当前正在将内容写入标准输出。这可能最终会出现在日志文件中。
I need only create folder. So i need convert void to String and return some string like "finish" etc?
这将是一种方法。另一个会替换 <%=
与 <%
这样它就不会尝试渲染该方法的(不存在的)输出。
关于java - 状态 500 – Java Servlet 上的内部服务器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59435190/