我写了一个 SQL 解析器,代码工作正常,我可以在解析结束时看到正确的输出。现在我尝试在 JSP 中显示解析的输出。为此,我在 IntelliJ 上设置了该项目,如下图所示。
我之前编写的解析器在 getTableColumn
中有其主要方法,该方法在图像中的红色框中标记。
看起来像这样。
public class getTableColumn {
..
..
public static void main(String args[]) throws SQLException {
ReadQueries rq = new ReadQueries("query");
String output = rq.getData();
....
....
....
....
}
}
ReadQueries 是我声明所有自定义方法来解析 SQL 的类。 getData
方法返回解析后的输出,它存在于字符串output
中。我正在尝试在 jsp 中显示 output
的值。
我将 getTableColumn
中的 main 方法重命名为 processQuery
,以便我也可以从其他类调用它。
基于 JSP 中的下拉列表,我尝试将字符串值传递到 getTableColumn 的 processQuery
中,如下所示。
import com.query.data.ReadQueries;
import com.table.modules.TableModules;
import com.where.WhereData;
import gudusoft.gsqlparser.EDbVendor;
import gudusoft.gsqlparser.IMetaDatabase;
import save.querydata.InsertColumns;
import java.io.File;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
class sampleMetaDB implements IMetaDatabase {
String columns[][] = { {"server", "db", "schema", "TBL_BBGPOS_REP", "M_TP_PFOLIO"
}, { "server", "db", "schema", "A_FXPOSITIONDEL_REP", "M_FXDELTA"},
{"server", "db", "schema", "A_FXPOSITIONDEL_REP", "M_CLOSING_E" },
{"server", "db", "schema", "A_FXPOSITIONDEL_REP", "M_FXDELTA_Z"}
};
public boolean checkColumn(String server, String database, String schema, String table, String column) {
boolean bServer, bDatabase, bSchema, bTable, bColumn, bRet = false;
for (int i = 0; i < columns.length; i++) {
if ((server == null) || (server.length() == 0)) {
bServer = true;
} else {
bServer = columns[i][0].equalsIgnoreCase(server);
}
if (!bServer) continue;
if ((database == null) || (database.length() == 0)) {
bDatabase = true;
} else {
bDatabase = columns[i][1].equalsIgnoreCase(database);
}
if (!bDatabase) continue;
if ((schema == null) || (schema.length() == 0)) {
bSchema = true;
} else {
bSchema = columns[i][2].equalsIgnoreCase(schema);
}
if (!bSchema) continue;
bTable = columns[i][3].equalsIgnoreCase(table);
if (!bTable) continue;
bColumn = columns[i][4].equalsIgnoreCase(column);
if (!bColumn) continue;
bRet = true;
break;
}
return bRet;
}
}
public class getTableColumn {
private static File[] listFiles(File sqlFiles) {
List<File> children = new ArrayList<File>();
if (sqlFiles != null)
listFiles(sqlFiles, children);
return children.toArray(new File[0]);
}
private static void listFiles(File rootFile, List<File> children) {
if (rootFile.isFile())
children.add(rootFile);
else {
File[] files = rootFile.listFiles();
for (int i = 0; i < files.length; i++) {
listFiles(files[i], children);
}
}
}
public String processQuery(String category) throws SQLException {
EDbVendor vendor = EDbVendor.dbvmysql;
System.out.println("Processing " + vendor.toString() + "...");
TGetTableColumn getTableColumn = new TGetTableColumn(vendor);
getTableColumn.showDetail = false;
getTableColumn.showSummary = true;
getTableColumn.showTreeStructure = false;
getTableColumn.showBySQLClause = false;
getTableColumn.showJoin = false;
getTableColumn.showColumnLocation = true;
getTableColumn.linkOrphanColumnToFirstTable = false;
getTableColumn.showIndex = false;
getTableColumn.showDatatype = true;
getTableColumn.listStarColumn = true;
getTableColumn.setMetaDatabase(new sampleMetaDB());
String sqlQuery = queryDetails[1];
getTableColumn.run(sqlQuery, false);
String issue = category;
ReadQueries rq = new ReadQueries(issue);
String outputQuery = rq.getQueries();
long t = System.currentTimeMillis();
EDbVendor vendor = EDbVendor.dbvmysql;
return outputQuery();
}
private static void displayInitInformation() {
System.out.println("Usage: java getTableColumn [/f <path_to_sql_file>] [/d <path_to_directory_includes_sql_files>] [/t <database type>] [/<show option>]");
System.out.println("/f: specify the sql file path to analyze.");
System.out.println("/t: option, set the database type. Support oracle, mysql, mssql, db2, netezza, teradata, informix, sybase, postgresql, hive, greenplum and redshift, the default type is oracle");
System.out.println("/showSummary: default show option, display the summary information.");
System.out.println("/showDetail: show option, display the detail information.");
System.out.println("/showTreeStructure: show option, display the information as a tree structure.");
System.out.println("/showBySQLClause: show option, display the information group by sql clause type.");
System.out.println("/showJoin: show option, display the join table and column.");
}
}
我看到的问题是我无法在 servlet 类中创建 getTableColumn
对象。
package com.servlets;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/getdata.do")
public class DataServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String issue = request.getParameter("reportSelection");
getTableColumn gt = new getTableColumn();
if ("Latency".equals(issue)) {
getTableColumn gt = new getTableColumn();
System.out.println("Latency");
} else if ("DataQuality".equals(issue)) {
System.out.println("Data quality");
} else if ("Outage".equals(issue)) {
}
}
}
行:getTableColumn gt = new getTableColumn();
表示无法解析符号“getTableColumn”
。我尝试编写该类的导入语句,但它也不起作用。
我不明白如何解决这个问题。谁能告诉我如何修复它?
最佳答案
我认为您遇到了问题,因为您的 getTableColumn
类不在包中(或者更确切地说,它在默认包中),并且 you can't import a class from the default package 。所以:
- 将
getTableColumn
类移至包中,例如tablecolumn
- 然后在
DataServlet
中添加:import tablecolumn.getTableColumn
以及其他导入
并且请将您的类的第一个字母大写:getTableColumn
en tableRelationAnalyze
不是有效名称
关于java - 如何调用另一个 .java 文件中存在的类(不是嵌套类)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59319544/