【问题标题】:java.lang.NullPointerException in jspjsp 中的 java.lang.NullPointerException
【发布时间】:2015-06-28 03:50:45
【问题描述】:

大家好,我是 java 和 jsp 的新手,老实说,我不了解 json。但我有一些要求,我必须从数据库中提取数据并显示在 jsp 页面上。但条件是我必须使用 Bootstrap Data Table 为什么我使用它,因为它提供了很多灵活性,例如分页过滤排序多列排序单个列过滤器。 我在jsp 中收到了java.lang.NullPointerException 任何人都可以告诉我为什么会出现此错误。 这是我的jsp页面

dataTable.jsp

<%@page import="org.codehaus.jettison.json.JSONObject"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
   <%@ page import ="java.util.*" %>
  <%--  <%@ page import="com.varun.DataBase"%> --%>
   <%@ page import="java.sql.*" %>
<%--    <%@ page import="org.json.*"%> --%>
   <%@ page import ="net.sf.json.JSONArray" %>


 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>DataTable</title>
</head>
<body>
<h1>Lets display the data from database using dataTabel</h1>

<%

String[] cols = { "id","engine", "browser", "platform", "version", "grade" };
String table = "ajax";

JSONObject result = new JSONObject();
JSONArray arr = new JSONArray();


int amount = 10;
int start = 0;
int echo = 0;
int col = 0;

int  id=0;
String engine = "";
String browser = "";
String platform = "";
String version = "";
String grade = "";



String dir = "asc";
String sStart = request.getParameter("iDisplayStart");
String sAmount = request.getParameter("iDisplayLength");
String sEcho = request.getParameter("sEcho");
String sCol = request.getParameter("iSortCol_0");
String sdir = request.getParameter("sSortDir_0");

engine = request.getParameter("sSearch_0");
browser = request.getParameter("sSearch_1");
platform = request.getParameter("sSearch_2");
version = request.getParameter("sSearch_3");
grade = request.getParameter("sSearch_4");


List<String> sArray = new ArrayList<String>();
if (!engine.equals("")) {
    String sEngine = " engine like '%" + engine + "%'";
    sArray.add(sEngine);
    //or combine the above two steps as:
    //sArray.add(" engine like '%" + engine + "%'");
    //the same as followings
}

if (!browser.equals("")) {
    String sBrowser = " browser like '%" + browser + "%'";
    sArray.add(sBrowser);
}
if (!platform.equals("")) {
    String sPlatform = " platform like '%" + platform + "%'";
    sArray.add(sPlatform);
}
if (!version.equals("")) {
    String sVersion = " version like '%" + version + "%'";
    sArray.add(sVersion);
}
if (!grade.equals("")) {
    String sGrade = " grade like '%" + grade + "%'";
    sArray.add(sGrade);
}

String individualSearch = "";
if(sArray.size()==1){
    individualSearch = sArray.get(0);
}else if(sArray.size()>1){
    for(int i=0;i<sArray.size()-1;i++){
        individualSearch += sArray.get(i)+ " and ";
    }
    individualSearch += sArray.get(sArray.size()-1);
}


if (sStart != null) {
    start = Integer.parseInt(sStart);
    if (start < 0)
        start = 0;
}
if (sAmount != null) {
    amount = Integer.parseInt(sAmount);
    if (amount < 10 || amount > 100)
        amount = 10;
}
if (sEcho != null) {
    echo = Integer.parseInt(sEcho);
}
if (sCol != null) {
    col = Integer.parseInt(sCol);
    if (col < 0 || col > 5)
        col = 0;
}
if (sdir != null) {
    if (!sdir.equals("asc"))
        dir = "desc";
}


String colName = cols[col];
int total = 0;
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","system","admin");
try {
    String sql = "SELECT count(*) FROM "+table;
    PreparedStatement ps = conn.prepareStatement(sql);
    ResultSet rs = ps.executeQuery();
    if(rs.next()){
        total = rs.getInt("count(*)");
    }
}catch(Exception e){

}
int totalAfterFilter = total;
//result.put("sEcho",echo);

try {
    String searchSQL = "";
    String sql = "SELECT * FROM "+table;
    String searchTerm = request.getParameter("sSearch");
    String globeSearch =  " where (engine like '%"+searchTerm+"%'"
                            + " or browser like '%"+searchTerm+"%'"
                            + " or platform like '%"+searchTerm+"%'"
                            + " or version like '%"+searchTerm+"%'"
                            + " or grade like '%"+searchTerm+"%')";
    if(searchTerm!=""&&individualSearch!=""){
        searchSQL = globeSearch + " and " + individualSearch;
    }
    else if(individualSearch!=""){
        searchSQL = " where " + individualSearch;
    }else if(searchTerm!=""){
        searchSQL=globeSearch;
    }
    sql += searchSQL;
    sql += " order by " + colName + " " + dir;
    sql += " limit " + start + ", " + amount;

    PreparedStatement ps = conn.prepareStatement(sql);
    ResultSet rs = ps.executeQuery();
    while (rs.next()) {
       // JSONArray ja = new JSONArray();
        net.sf.json.JSONArray ja = new net.sf.json.JSONArray(); 

        ja.add(rs.getInt("id"));
        ja.add(rs.getString("engine"));
        ja.add(rs.getString("browser"));
        ja.add(rs.getString("platform"));
        ja.add(rs.getString("version"));
        ja.add(rs.getString("grade"));
        arr.add(ja); 
    } 
    String sql2 = "SELECT count(*) FROM "+table;
    if (searchTerm != "") {
        sql2 += searchSQL;
        PreparedStatement ps2 = conn.prepareStatement(sql2);
        ResultSet rs2 = ps2.executeQuery();
        if (rs2.next()) {
            totalAfterFilter = rs2.getInt("count(*)");
        }
    }
    result.put("iTotalRecords", total);
    result.put("iTotalDisplayRecords", totalAfterFilter);
    result.put("aaData", arr);
    response.setContentType("application/json");
    response.setHeader("Cache-Control", "no-store");
    out.print(result);
    conn.close();
} catch (Exception e) {

}

%>

</body>
</html>

堆栈跟踪

11:26:50,224 ERROR [[jsp]] Servlet.service() for servlet jsp threw exception
java.lang.NullPointerException
    at org.apache.jsp.dataTable_jsp._jspService(dataTable_jsp.java:114)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:322)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:249)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:235)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
    at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:190)
    at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:92)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.process(SecurityContextEstablishmentValve.java:126)
    at org.jboss.web.tomcat.security.SecurityContextEstablishmentValve.invoke(SecurityContextEstablishmentValve.java:70)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:158)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:330)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:829)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:598)
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    at java.lang.Thread.run(Unknown Source)

【问题讨论】:

  • 能不能指向行号114
  • 转到这个jsp文件的翻译后的ServletdataTable_jsp.java并查看第114行。如果您通过tomcat服务器运行它,它将在work文件夹下。
  • 可以用这个http://jquerygrid.net/
  • @singhakash 第 114 行说:String dir - dataTable._jspService(HttpServletRequest, HttpServletResponse)

标签: java json twitter-bootstrap jsp


【解决方案1】:

您是否考虑过在控制器中使用 Google gson 之类的东西来自动从模型类生成 json?它可以减少你的jsp中的字符串操作。

更常见的模式是从一​​个 restful api 中公开此信息,该 api 由前端的 ajax 调用使用。

Java Jersey 结合 gson 或 Jackson 可以为您实现很多这样的功能

【讨论】:

  • 我没有控制器,因为我对 json 完全陌生,所以我只是想使用 Bootstrap Data Table 将数据从 Table 显示到 jsp 。一旦我能够弄清楚。我将用控制器实现。你能帮帮我吗?
【解决方案2】:

由于它是一个 jsp 文件,因此很难调试。在这里你得到一个 NullPointerExceotion 。从您的代码中我们可以看到某些地方会发生 NullPointerException。

例如:- 您正在从“sSearch_0”获取参数。 engine = request.getParameter("sSearch_0");

想象一下,如果它是一个空值。

那么下面的代码会产生一个空指针异常。

如果 (!engine.equals(""))

所以检查如下总是安全的, if(!" ".equals(engine)) ...

这样即使引擎有空值,你也不会得到空指针异常。

这可能不是问题,但我想提一下。

【讨论】:

  • 正如您所建议的,错误消失了。但我没有得到价值。我只是得到

    Lets display the data from database using dataTabel

    任何想法??
【解决方案3】:

如果 Ajil Mohan 的回答阻止了错误的出现,则意味着您的 ParametersMap 中没有任何值。

engine = request.getParameter("sSearch_0");
browser = request.getParameter("sSearch_1");
platform = request.getParameter("sSearch_2");
version = request.getParameter("sSearch_3");
grade = request.getParameter("sSearch_4");

这些行只是获取请求的参数映射中的数据。如果给定不在地图中,则返回 null (https://docs.oracle.com/javaee/6/api/javax/servlet/ServletRequest.html#getParameter%28java.lang.String%29)。 当您使用表单中包含的数据在上一页上发送 POST 请求时,将创建此映射。您的输入字段必须设置为您为 getParameter 方法提供的名称。

如果您没有带有表单的上一页,那么您可能希望将数据从服务器发送到 JSP。如果您使用 Servlet,那么您应该使用请求 AttributeMap。

public class BasicTotoServlet extends HttpServlet {
 /**
  * Manage GET HTTP Request
  */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        String data = getData();
        request.setAttibute("sSearch_0", data)
    }
}

然后在你的 JSP 中:

engine = request.getAttribute("sSearch_0");

我希望我已经足够清楚了。 如果需要,要求精确

编辑: 这是我的理解。

您到达您的 JSP 并从前一页的表单中获得几个参数。此表格可能无法为您提供所有信息,这就是您在此获得 NPE 的原因

engine = request.getParameter("sSearch_0");
engine.equals("")

要按照 Ajil Mohan 告诉你的那样解决这个问题,只需将等号反过来,这样如果 engine 为 NULL 你就没有问题

"".equals(engine);

由于 "" 永远不会为空,因此您永远不会得到 NPE。

现在您的表中没有任何数据。为什么?如果我是正确的,您可以通过连接多个数据来创建 SQL 查询。 searchSQL = globeSearch + " and " + individualSearch;

individualSearch 是连接参数的结果,但如果它们为空怎么办?

if (!"".equals(browser)) {
    String sBrowser = " browser like '%" + browser + "%'";
    sArray.add(sBrowser);
}

在这段代码中,如果 browser 为 null(正如我们之前看到的那样),您将使用 and 关键字将字符串 " browser like '%null%'" 添加到您的查询中。我不确定是否会有任何名称中包含“null”的浏览器。

你最好把这个测试:

if (!"".equals(browser) && browser != null) {
    String sBrowser = " browser like '%" + browser + "%'";
    sArray.add(sBrowser);
}

【讨论】:

  • 谢谢。我没有使用控制器类。从jsp它自己我试图发送请求。如果可能的话,请提供我的精度
  • 您目前的工作流程是什么。您是否有一个您验证并来到 dataTable.jsp 的表单?或者您是否使用 dataTable.jsp 并从数据库中获取数据来提供您的表格? sSearch_0 值从何而来?
  • 我想使用数据表来显示数据库中的数据,所以我点击了这个链接datatables.net/development/server-side/jsp我也做了同样的事情
  • 顺便说一下,您应该看看 HTML 5,它将成为标准。 JSP 现在是一项相当古老的技术,有很多方法可以改进您想做的事情。也许您应该考虑使用控制器来获取数据,然后将数据转发到 JSP。然后在 JSP 中您可以使用“Expression language”(EL)来创建您的 HTML 页面。 Here is an example in French 但代码块是英文的。不要忘记接受答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 2015-03-06
相关资源
最近更新 更多