尝试发布请求时,JSP中出现状态500 –内部服务器错误的错误。
所以我需要对一些名称(测试等)在Dropbox上创建文件夹的http请求
我有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尝试它,它将起作用。
我需要在需要输入令牌和文件夹名称的网页上执行此操作。
为了测试,我没有从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无法打印它。我该如何解决?
更改方法以返回要输出的字符串。该方法当前正在将内容写入标准输出。那可能最终将在日志文件中。
我只需要创建文件夹。所以我需要将void转换为String并返回一些字符串,例如“ finish”等?
那将是一种方法。另一种方法是将
<%=
替换为<%
,这样它就不会尝试呈现该方法的输出(不存在)。