jsp中的java.lang.NullPointerException
大家好,我是java和jsp的新手,老实说,我不懂json。但我有一些要求,我必须从数据库中提取数据并显示在jsp页面上。但标准是我必须使用引导数据表为什么我要使用它,因为它提供了很多灵活性,比如分页筛选排序多列排序单列筛选。 在我的jsp中的java.lang.NullPointerException,java,json,twitter-bootstrap,jsp,Java,Json,Twitter Bootstrap,Jsp,大家好,我是java和jsp的新手,老实说,我不懂json。但我有一些要求,我必须从数据库中提取数据并显示在jsp页面上。但标准是我必须使用引导数据表为什么我要使用它,因为它提供了很多灵活性,比如分页筛选排序多列排序单列筛选。 在我的jsp 谁能告诉我为什么我会犯这个错误。 这是我的jsp页面 dataTable.jsp <%@page import="org.codehaus.jettison.json.JSONObject"%> <%@ page language="ja
jsp
谁能告诉我为什么我会犯这个错误。
这是我的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>
您是否考虑过在控制器中使用类似于GoogleGSON的东西从模型类自动生成json?它可以减少jsp中的字符串操作 更常见的模式是从restful api公开这些信息,前端的ajax调用使用restful api
Java Jersey与gson或Jackson的结合可以为您实现许多这类功能,因为它是一个jsp文件,很难调试。这是一个NullPointerExceotion。从您的代码中,我们可以看到出现NullPointerException的一些地方 例如:- 您正在从“sSearch_0”获取参数。 引擎=请求.getParameter(“sSearch_0”) 想象一下,如果它是一个空值 然后,下面的代码将生成一个null指针异常 如果(!engine.equals(“”) 因此,始终可以安全地进行以下检查:, 如果(!“”.equals(引擎)) 这样,即使引擎有空值,也不会出现空指针异常
这可能不是问题所在,但我想提一提。如果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");
这些行仅获取请求的参数映射中的数据。如果给定值不在映射中,则返回null()。
此映射是在您使用表单中包含的数据在上一页上发送POST请求时创建的。您的输入字段必须使用您为getParameter方法指定的名称进行设置
若您并没有包含表单的上一页,那个么您可能希望将数据从服务器发送到JSP。如果您使用Servlet,那么应该使用请求属性映射
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告诉你的那样,只需将等式反过来,这样如果引擎为空,你就没有问题了
"".equals(engine);
因为“”从不为空,所以您将永远无法获得NPE
现在表中没有任何数据。为什么?如果我是正确的,您可以通过连接多个数据来创建SQL查询<代码>搜索SQL=globeSearch+“和”+个人搜索代码>
individualSearch
是连接参数的结果,但如果参数为空怎么办
if (!"".equals(browser)) {
String sBrowser = " browser like '%" + browser + "%'";
sArray.add(sBrowser);
}
在这段代码中,如果browser为null(正如我们前面看到的那样),您将使用and关键字向查询中添加字符串“类似于“%null%”的浏览器”
。我不确定是否会有任何浏览器的名称中带有“null”
你最好做个测试:
if (!"".equals(browser) && browser != null) {
String sBrowser = " browser like '%" + browser + "%'";
sArray.add(sBrowser);
}
您能否指向该jsp文件的行号
114
转到已翻译的ServletdataTable\u jsp.java
,并查看行号114。如果您通过tomcat服务器运行它,它将位于工作
文件夹下。可以使用此http://jquerygrid.net/
@singhakash第114行显示:String dir-dataTable.\u jspService(HttpServletRequest,HttpServletResponse)我没有控制器,因为我对json完全陌生,所以我只是尝试使用引导数据表将数据从表显示到jsp。一旦我能弄明白。我将与控制器一起实现。你能帮我一下吗?正如你所说,错误已经消失了。但我没有得到价值。我刚刚得到了让我们使用dataTabel显示数据库中的数据的任何想法??谢谢。我没有使用控制器类。我试图从jsp it本身发送请求。如果可能,请向我提供您目前的工作流程。您是否有一个表单可以验证并访问dataTable.jsp?或者,您是在dataTable.jsp上运行并从数据库中获取数据以提供给您的表?sSearch_0值从何而来?我想使用数据表来显示数据库中的数据,所以我遵循了这个链接,我也做了同样的事情。顺便说一下,你应该看看HTML 5,它将成为标准。JSP现在是一种非常古老的技术,有很多方法可以改进您想要做的事情。也许你应该考虑有一个控制器来获取你的数据,然后将数据转发给JSP。然后在JSP中,您可以使用“”(EL)创建HTML页面。但是代码块是英文的。别忘了接受答案
if (!"".equals(browser) && browser != null) {
String sBrowser = " browser like '%" + browser + "%'";
sArray.add(sBrowser);
}