【问题标题】:Unable to compile class for JSP in tomcat无法在 tomcat 中为 JSP 编译类
【发布时间】:2024-04-23 14:20:02
【问题描述】:

症状

项目中的任何 JSP 页面都会产生如下错误消息:

org.apache.jasper.JasperException:无法为 JSP 编译类 在 jsp 文件中的第 5 行发生错误:/check.jspf 生成的 servlet 错误: *重复的局部变量 usr* 在 jsp 文件中的第 5 行发生错误:/check.jspf 生成的 servlet 错误: *重复的局部变量路径* 在 jsp 文件中的第 5 行发生错误:/check.jspf 生成的 servlet 错误: *重复的局部变量pos* 在 jsp 文件中的第 5 行发生错误:/check.jspf 生成的 servlet 错误: *重复的局部变量hSession* 在 jsp 文件中的第 5 行发生错误:/check.jspf 生成的 servlet 错误: *重复的局部变量testRegister* org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:512) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) javax.servlet.http.HttpServlet.service(HttpServlet.java:802) com.byinsight.logic.EncodingFilter.doFilter(EncodingFilter.java:22)

开发环境

  • JDK 1.5
  • Tomcat 5.0
  • IDE Eclipse 3.3

原因

我使用jsp-config 在每个 JSP 文件中包含一个 JSPF。 web.xml 如下:

<jsp-config>
    <jsp-property-group>
        <url-pattern>*.jsp</url-pattern>
        <include-prelude>/check.jspf</include-prelude>
    </jsp-property-group>
</jsp-config>

包含的文件是check.jspf。 JSPF中的代码如下:

<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@page import="com.byinsight.model.User"%>
<%@page import="javax.servlet.http.HttpSession"%>

<%
    //String str = (String)session.getAttribute("login");
    User usr = (User)session.getAttribute("user");
    String path = request.getServletPath();
    int pos = path.indexOf("index.jsp");
    HttpSession hSession = request.getSession(false);
    String testRegister = (String)hSession.getAttribute("register");
    if (-1 == pos) {
        if ((null == usr) && (!testRegister.equals("login"))) {
            throw new RuntimeException("you have to login first ");
        }           
    }
%>

该项目在 Eclipse 中运行良好,但是当我将 WAR 部署到产品系统中时,出现错误。我不明白错误消息是什么意思,这里没有重复的变量!有人知道吗?非常感谢!

【问题讨论】:

    标签: jsp tomcat jsp-tags


    【解决方案1】:

    我建议将check.jspf 替换为Filter。只需将相同的代码放在doFilter() 方法中即可。

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpSession session = req.getSession();
        User usr = (User) session.getAttribute("user");
        String path = req.getServletPath();
        int pos = path.indexOf("index.jsp");
        String testRegister = (String) session.getAttribute("register");
        if (-1 == pos) {
            if ((null == usr) && (!testRegister.equals("login"))) {
                throw new RuntimeException("you have to login first "); // I'd just redirect to login page rather than throwing a RuntimeException.
            }           
        }
        chain.doFilter(request, response);
    }
    

    &lt;jsp-config&gt; 替换为

    <filter>
        <filter-name>checkFilter</filter-name>
        <filter-class>com.example.CheckFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>checkFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>
    

    另见:

    【讨论】:

      【解决方案2】:

      是否有可能包含此文件的任何 jsp 也声明了这些变量?

      【讨论】: