Tomcat 无法为 JSP 编译类

Posted

技术标签:

【中文标题】Tomcat 无法为 JSP 编译类【英文标题】:Tomcat Unable to compile class for JSP 【发布时间】:2021-10-04 04:28:33 【问题描述】:

所以我正在做一个项目,它涉及在 java 中编写一个访问 sql 数据库的 servlet。该 servlet 通过前端 jsp 页面访问,所有这些都托管在 tomcat 上。我的所有文件都放在了正确的位置,当我尝试在 Tomcat 上打开它时,我得到了这个...

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: [32] in the jsp file: [/index.jsp]
textBox cannot be resolved to a variable
29:             <form action = "/Project3/main" method = "post" style="margin-top: 15px;" class="text-center">
30:                 <div class="form-group row">
31:                     <div class=" col-sm-12 col-md-12 col-lg-12">
32:                         <textarea name="textBox" class="form-control" id="textBox" rows="8" cols="50"><%= textBox %></textarea>
33:                     </div>
34:                 </div>
35: 


An error occurred at line: [45] in the jsp file: [/index.jsp]
result cannot be resolved to a variable
42: 
43:     <div class="text-center">
44:         <%-- jsp statement with out sql response--%>
45:         <%= result %>
46:     </div>
47: 
48: 

所以我的jsp文件中有两个无法解析的变量。不知道这意味着什么。这是我的jsp代码的主体:

<body>


    <div class="container-fluid ">
        <row class="row justify-content-center">
            <h1 class="text-center col-sm-12 col-md-12 col-lg-12"> Remote Database Management System </h1>
            <div class="text-center col-sm-12 col-md-12 col-lg-12"> You are connected to the Project 3 Database.</div>
            <div class="text-center col-sm-12 col-md-12 col-lg-12"> Please enter sql query or update statement.</div>
            <form action = "/Project3/main" method = "post" style="margin-top: 15px;" class="text-center">
                <div class="form-group row">
                    <div class=" col-sm-12 col-md-12 col-lg-12">
                        <textarea name="textBox" class="form-control" id="textBox" rows="8" cols="50"><%= textBox %></textarea>
                    </div>
                </div>

                <button style="margin-bottom: 15px;" type="submit" class="btn btn-dark">Execute Command</button>
                <button onClick="reset();" style="margin-bottom: 15px;" type="reset" class="btn btn-dark">Clear Form</button>
            </form>
        </row>
    </div>


    <div class="text-center">
        <%-- jsp statement with out sql response--%>
        <%= result %>
    </div>


    </div>

</body>
</html>

Textbox 和 Result 都是 servlet 顺便说一句的 java 代码中的变量。任何帮助将不胜感激!

【问题讨论】:

您是否将这些变量作为请求属性传递? 很抱歉,我不能 100% 确定您的问题是什么意思。在我的 java 代码中,变量文本框在我的 doGet 方法中声明,该方法调用 HttpServlet 请求和响应。我声明的那一行是 - String textBox = request.getParameter("textBox");至于结果变量,它不是请求变量。 【参考方案1】:

编辑:基于your comment 我假设您有一个带有doGet 方法的servlet,如下所示:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
  String textBox = req.getParameter("textBox");
  ...
  String result = ...
  req.getRequestDispatcher("/your.jsp").forward(req, resp);

servlet 中的局部变量和 JSP 页面(被编译成 servlet)中的局部变量是不同的!您不能在 JSP 页面中使用 textBoxresult

开箱即用的 JSP 页面可以访问 8 个局部变量:implicit objects。由于textBox 是一个请求参数,您可以通过以下方式获取它:

<%= request.getParameter("textBox") %>

要检索result,您需要将其保存为您的servlet 中的请求属性:

req.setAttribute("result", result);

您可以在JSP页面中检索它:

<%= request.getAttribute("result") %>

您可以使用 JSP 声明 &lt;%! ... &gt; 或 JSP 脚本 &lt;%= ... &gt; 来声明其他变量,例如:

<% String textBox = request.getParameter("textBox"); %>

备注:近 20 年来不鼓励使用 JSP 表达式 &lt;%= ... %&gt;(参见 this question)。您应该改用 EL 表达式:

$param.textBox
$result

EL 表达式有一个much larger 可解析标识符列表,其中包括所有页面、请求、会话和 servlet 上下文属性。

【讨论】:

以上是关于Tomcat 无法为 JSP 编译类的主要内容,如果未能解决你的问题,请参考以下文章

解决org.apache.jasper.JasperException: 无法为JSP编译类

在tomcat中手动部署的JSP编译无法解析为某种类型

org.apache.jasper.JasperException:无法为 JSP 编译类:

java web应用程序出错[无法为JSP编译类]根本原因

tomcat无法加载action亲各位大虾帮帮我

无法为 JSP 编译类:无法解析 java.util.Map$Entry 类型。它是从所需的 .class 文件中间接引用的