【问题标题】:Status 500 – Internal Server Error On Java Servlet状态 500 – Java Servlet 上的内部服务器错误
【发布时间】:2020-04-13 13:17:57
【问题描述】:

当我尝试发布请求时,我的 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 尝试它,它就可以工作。 我需要在需要输入令牌和文件夹名称的网页上执行此操作。 对于测试,我没有从 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 类连接?

【问题讨论】:

    标签: java jsp servlets tomcat9


    【解决方案1】:

    行:

    <%= dropboxActioner.createFolder(name)%>
    

    说出调用dropboxActioner.createFolder(name)返回的值。

    但您已将 createFolder 声明为返回 void。所以 JSP 不能打印出来。

    我该如何解决?

    将方法更改为返回您要输出的字符串。该方法当前正在将内容写入标准输出。这可能最终会出现在一个日志文件中。

    我只需要创建文件夹。所以我需要将 void 转换为 String 并返回一些字符串,如“finish”等?

    那将是一种方法。另一种方法是将&lt;%= 替换为&lt;%,这样它就不会尝试呈现该方法的(不存在的)输出。

    【讨论】:

    • 我只需要创建文件夹。所以我需要将 void 转换为 String 并返回一些字符串,如“finish”等?
    • 只使用&lt;% 而不是&lt;%=
    • @dan1st - 我刚刚说过:-)
    • 只是一个 TL;DR :)
    猜你喜欢
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多