2015-04-21 88 views
1

大家好我是java和jsp的新手,老實說我沒有json的知識。但我有一些要求,我必須從數據庫中提取數據並顯示在jsp頁面上。但是標準是我必須使用Bootstrap Data Table,爲什麼我使用這種方法是因爲它提供了很多靈活性,如分頁過濾排序多列排序單個列過濾器。 我得到一個java.lang.NullPointerException在我的jsp 任何機構可以告訴我爲什麼我得到這個錯誤。 這是我的jsp頁面jsp中的java.lang.NullPointerException

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) 
+0

您可以指向行號'114' – silentprogrammer

+2

轉到翻譯的Servlet'dataTable_jsp.java'這個JSP文件,看看行不114.這將是下'工作'文件夾,如果你正在通過tomcat服務器運行它。 – Braj

+0

可能會使用這個'http:// jquerygrid.net /' – Babel

回答

2

如果Ajil Mohan的答案阻止錯誤出現,這意味着您在參數映射中沒有任何值。

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"); 

這些行只是獲取請求的參數映射中的數據。如果給定不在映射中,則返回空(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,並從上一頁的表單中獲得幾個參數。這種形式可能不會給你的所有信息,這就是爲什麼你對這個

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

一個NPE爲了解決這個問題的告訴你AJIL磨憨,只是來回轉動等於其他的方式,因此,如果發動機NULL你有沒有問題

"".equals(engine); 

因爲「」永遠不會是空的,你永遠不會得到NPE。

現在您的表格中沒有任何數據。爲什麼?如果我是正確的,則通過連接多個數據來創建一個SQL查詢。 searchSQL = globeSearch + " and " + individualSearch;

individualSearch是連接您的參數的結果,但如果它們爲空呢?

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

在這段代碼中,如果瀏覽器爲空(正如我們前面所看到的都可以),您將添加" browser like '%null%'"你與和關鍵字查詢字符串。我不確定是否有任何名稱中包含「null」的瀏覽器。

你最好把這個測試:

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

謝謝。我沒有使用控制器類。從jsp它自我我試圖發送請求。如果可能請給我提供精度 – Varun

+0

目前你的工作流程是什麼。你有一個表單,你驗證並來到dataTable.jsp?或者,您是否使用dataTable.jsp並從數據庫獲取數據以提供表格? sSearch_0值來自哪裏? – RPresle

+0

我想用數據表來顯示數據從數據庫,所以我跟着這個鏈接https://datatables.net/development/server-side/jsp我也做了同樣的 – Varun

0

你有沒有考慮使用像谷歌GSON在你的控制器自動生成從模型類JSON?它可以減少jsp中的字符串操作。

更常見的模式是從前端ajax調用消耗的restful api中公開此信息。

Java的球衣與GSON或傑克遜組合可以實現很多的功能,這對你

+0

我沒有控制器,因爲我是全新的JSON我是隻是試圖使用Bootstrap Data Table將Table中的數據顯示到jsp。一旦我能夠找到它。我會和控制器一起執行。你能幫我一下嗎? – Varun

1

既然是JSP文件它非常難以調試。在這裏你得到一個NullPointerExceotion。從你的代碼中,我們可以看到一些會發生NullPointerException的地方。

例如: - 您從「sSearch_0」獲取參數。 engine = request.getParameter(「sSearch_0」);

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

然後下面的代碼將產生一個空指針異常。

如果(!engine.equals( 「」))

所以它始終是安全檢查如下, 如果(!」」 .equals(發動機))...

在這即使引擎有一個空值,你也不會得到空指針異常。

這可能不是問題,但我想提一提。

+0

正如你所建議的那樣,錯誤消失了。但我沒有得到價值。我只是得到

讓我們使用dataTabel

任何想法顯示數據庫中的數據? – Varun

相關問題