首页 > 解决方案 > 执行jsp时无法为JSP编译类

问题描述

我一直在努力让这个项目工作,这个项目在五六年前开发时正在工作,不知道如何让它再次工作。有一个登录表单,每当我尝试这样做时,我都会收到错误

An error occurred at line: [14] in the jsp file: [/web/user2.jsp]
databasecon cannot be resolved
11: String id=null,name=null,userid=null,email=null;
12:     try{
13:         
14:     Connection con = databasecon.getconnection();
15: PreparedStatement ps=con.prepareStatement("select id,name,userid,email from user where userid='"+a+"' && pass='"+b+"'");
16: ResultSet rs=ps.executeQuery();
17: if(rs.next())


Stacktrace:
    org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:102)
    org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:213)
    org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:544)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:381)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:351)
    org.apache.jasper.compiler.Compiler.compile(Compiler.java:335)
    org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:597)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:399)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:382)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:330)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:733)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

这是jsp代码

<%@ page import="java.sql.*,databaseconnection.*"%>

<%


   
    String a=request.getParameter("user1");
String b=request.getParameter("pass");
    
    
String id=null,name=null,userid=null,email=null;
    try{
        
    Connection con = databasecon.getconnection();
PreparedStatement ps=con.prepareStatement("select id,name,userid,email from user where userid='"+a+"' && pass='"+b+"'");
ResultSet rs=ps.executeQuery();
if(rs.next())
        {
        id=rs.getString("id");
        name=rs.getString("name");
        userid=rs.getString("userid");
        email=rs.getString("email");
                session.setAttribute("id",id);
        session.setAttribute("name",name);
        session.setAttribute("userid",userid);
        session.setAttribute("email",email);        
        //response.sendRedirect("user5.jsp");
    response.sendRedirect("user3.jsp");
        //out.print(name2);
        }
        else
        {
        out.println("enter correct user id and password");
        }
        

    }
    catch(Exception e2){
        out.println(e2.getMessage());
    }
%>

java类

package databaseconnection;
import java.sql.*;

public class databasecon
{
    static Connection con;
    public static Connection getconnection()
    {
        
            
        try
        {
            Class.forName("com.mysql.jdbc.Driver"); 
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/tpa","root","root");
        }
        catch(Exception e)
        {
            System.out.println("class error");
        }
        return con;
    }
    
}

这就是我在 web.xml 中的内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
</web-app>

我已经提供了我可以看到人们使用的所有内容,但我无法使其正常工作。

标签: javajspweb

解决方案


目前尚不清楚问题是 JSP 的语法问题还是类路径问题。

我看到的教程都是在导入多个类时在逗号后显示一个空格;例如

<%@ page import="java.sql.*, databaseconnection.*"%>

                            ^

另一方面,我查看的 JSP 2.3 规范并没有明确要求空格。它说:

“该值与 Java 编程语言中的导入声明中一样,是一个(逗号分隔)列表,要么是表示该类型的完全限定 Java 编程语言类型名称,要么是后跟.*字符串的包名称,表示所有公共类型在那个包裹里声明。”

或者,您可以使用单独的导入;例如

<%@ page import="java.sql.*"%>
<%@ page import="databaseconnection.*"%>

问题也可能是您没有正确地将包含已编译databasecon类的 JAR 包含在 webapp 的 WAR 文件中。


话说回来:

  1. 忽略 Java 标识符约定是一个坏主意。类名以大写字母开头。

  2. 在 JSP 中嵌入业务逻辑(例如数据库查询)是一个坏主意。最好使用 JSP 进行渲染。有许多的原因; 有关摘要,请参阅JSTL 与 JSP Scriptlets

  3. 通过字符串连接创建查询是一个非常糟糕的想法,尤其是当某些字符串组件取自用户请求参数时。阅读有关SQL 注入攻击的信息。您应该使用PreparedStatement.

  4. 在数据库中存储密码(明文或加密)是一个非常糟糕的主意;看

    推荐的方法是存储加盐的加密哈希。


推荐阅读