一个javaweb项目,项目结构如下:
数据库操作类BaseDao:
public class BaseDao {
private Connection conn=null;
private ResultSet rs=null;
private PreparedStatement presta=null;
private Connection getConnection(){
//String className=ConfigManager.getInstance().getString("jdbc.driver_class");
String url=ConfigManager.getInstance().getString("jdbc.connection.url");
String username=ConfigManager.getInstance().getString("jdbc.connection.username");
String pwd=ConfigManager.getInstance().getString("jdbc.connection.password");
try {
conn=DriverManager.getConnection(url,username,pwd);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* @Description: 判断连接是否打开
* @param @return
* @return boolean
* @throws
* @author ReticentZ
* @date 2016年4月6日
*/
public int executeUpdate(String sql,Object []params){
int updateCount=0;
if(conn==null){
conn=getConnection();
}
try {
presta=conn.prepareStatement(sql);
if(params!=null && params.length>0){
for(int i=0;i<params.length;i++){
presta.setObject(i+1, params[i]);
}
}
updateCount=presta.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
return updateCount;
}
public ResultSet executeQuery(String sql,Object []params){
rs=null;
if(conn==null){
conn=getConnection();
}
System.out.println(conn);
try {
presta=conn.prepareStatement(sql);
if(params!=null && params.length>0){
for(int i=0;i<params.length;i++){
presta.setObject(i+1, params[i]);
}
}
rs=presta.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public boolean closeResource(){
//按照先创建后释放的顺序释放
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(presta!=null){
try {
presta.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}
return true;
}
}
AlbumDao类:
AlbumDaoImpl继承了BaseDao数据库操作类和AlumDao接口,其中有一个函数是返回部分查询值(getHostAlbumList(),就是在前端页面调用这个函数时出了空指针!):
public class AlbumDaoImpl extends BaseDao implements AlbumDao {
private ArrayList<Album> relist=new ArrayList<Album>();
public static void main(String[] args) {
AlbumDaoImpl test=new AlbumDaoImpl();
ArrayList<Album> list=new ArrayList<Album>();
list=test.getHostAlbumList();
for(Album e:list){
System.out.println(e.getGenreid()+"\t"+e.getArtist()+"\t"+e.getTitle());
}
}
@Override
public ArrayList<Album> getAlbumList() {
String sql="select * from album";
Object []params={};
ResultSet res=null;
res=this.executeQuery(sql,params);
//System.out.println(res);
try {
while(res.next()){
Album reAlbum=new Album();
//System.out.println(id+"\t"+artist+"\t"+title+"\t"+price+"\t"+dateReleased+"\t"+description);
reAlbum.setId(res.getInt("id"));
reAlbum.setArtist(res.getString("artist"));
reAlbum.setDateReleased(res.getDate("DateReleased"));
reAlbum.setDescription(res.getString("Description"));
reAlbum.setPrice(res.getDouble("Price"));
reAlbum.setGenreid(res.getInt("Genreid"));
reAlbum.setTitle(res.getString("Title"));
relist.add(reAlbum);
}
} catch (SQLException e) {
e.printStackTrace();
}
finally{
this.closeResource();
}
return relist;
}
@Override
public ArrayList<Album> getAlbumsByGenreId(int genreid) {
String sql="select * from album where Genreid=?";
Object []params={genreid};
ResultSet res=null;
res=this.executeQuery(sql,params);
//System.out.println(res);
try {
while(res.next()){
Album reAlbum=new Album();
//System.out.println(ids+"\t"+artist+"\t"+title+"\t"+price+"\t"+dateReleased+"\t"+description);
reAlbum.setId(res.getInt("id"));
reAlbum.setArtist(res.getString("artist"));
reAlbum.setDateReleased(res.getDate("DateReleased"));
reAlbum.setDescription(res.getString("Description"));
reAlbum.setPrice(res.getDouble("Price"));
reAlbum.setGenreid(res.getInt("Genreid"));
reAlbum.setTitle(res.getString("Title"));
relist.add(reAlbum);
}
} catch (SQLException e) {
e.printStackTrace();
}
finally{
this.closeResource();
}
return relist;
}
@Override
public ArrayList<Album> getAlbumsByArtist(String artist) {
String sql="select * from album where Artist=?";
Object []params={artist};
ResultSet res=null;
res=this.executeQuery(sql,params);
//System.out.println(res);
try {
while(res.next()){
Album reAlbum=new Album();
//System.out.println(ids+"\t"+artist+"\t"+title+"\t"+price+"\t"+dateReleased+"\t"+description);
reAlbum.setId(res.getInt("id"));
reAlbum.setArtist(res.getString("artist"));
reAlbum.setDateReleased(res.getDate("DateReleased"));
reAlbum.setDescription(res.getString("Description"));
reAlbum.setPrice(res.getDouble("Price"));
reAlbum.setGenreid(res.getInt("Genreid"));
reAlbum.setTitle(res.getString("Title"));
relist.add(reAlbum);
}
} catch (SQLException e) {
e.printStackTrace();
}
finally{
this.closeResource();
}
return relist;
}
@Override
public boolean addAlbums(Album newalbum) {
boolean reBool=false;
int updateCount=-1;
String sql="insert into album(id,genreid,artist,title,price,dateReleased,description) values(?,?,?,?,?,?,?)";
Object[] params={
newalbum.getId(),
newalbum.getGenreid(),
newalbum.getArtist(),
newalbum.getTitle(),
newalbum.getPrice(),
newalbum.getDateReleased(),
newalbum.getDescription()};
updateCount=this.executeUpdate(sql, params);
if(updateCount>0)
reBool=true;
return reBool;
}
@Override
public boolean deleteAlbums(int id) {
boolean reBool=false;
int updateCount=-1;
String sql="delete from album where id=?";
Object[] params={id};
updateCount=this.executeUpdate(sql, params);
if(updateCount>0)
reBool=true;
return reBool;
}
@Override
public boolean deleteAlbums(String artist) {
boolean reBool=false;
int updateCount=-1;
String sql="delete from album where Artist=?";
Object[] params={artist};
updateCount=this.executeUpdate(sql, params);
if(updateCount>0)
reBool=true;
return reBool;
}
@Override
public void updateAlbums(int id, Album album) {
String sql="update Album set genreid=?,artist=?,title=?,price=?,dateReleased=?,description=? where id=?";
Object []params={
album.getGenreid(),
album.getArtist(),
album.getTitle(),
album.getPrice(),
album.getDateReleased(),
album.getDescription(),
album.getId()
};
this.executeUpdate(sql, params);
}
@Override
public Album getAlbumsById(int id) {
String sql="select * from album where id=?";
Album reAlbum=new Album();
Object []params={id};
ResultSet res=null;
res=this.executeQuery(sql,params);
//System.out.println(res);
try {
while(res.next()){
//System.out.println(ids+"\t"+artist+"\t"+title+"\t"+price+"\t"+dateReleased+"\t"+description);
reAlbum.setId(res.getInt("id"));
reAlbum.setArtist(res.getString("artist"));
reAlbum.setDateReleased(res.getDate("DateReleased"));
reAlbum.setDescription(res.getString("Description"));
reAlbum.setPrice(res.getDouble("Price"));
reAlbum.setGenreid(res.getInt("Genreid"));
reAlbum.setTitle(res.getString("Title"));
}
} catch (SQLException e) {
e.printStackTrace();
}
finally{
this.closeResource();
}
return reAlbum;
}
@Override
public ArrayList<Album> getHostAlbumList() {
Album temp=new Album();
int id=0;
int []albumnum =new int[25];
for(int i=0;i<25;i++){
albumnum[i]=0;
}
int count=0;
while(count<9){
id=(int) (Math.random()*25);
if(id==0)continue;
if(albumnum[id]==0){
count++;
temp=this.getAlbumsById(id);
relist.add(temp);
System.out.println(temp.getId()+"\t"+temp.getTitle());
albumnum[id]=1;
}
}
return relist;
}
}
AlbumService类:(就是AlbumDaoImpl的服务层)
public class AlbumServiceImpl implements AlbumService {
private ArrayList<Album> reList=new ArrayList<Album>();
private AlbumDao albumdao=new AlbumDaoImpl();
private Album al;
// public static void main(String[] args) {
// AlbumService albumService=new AlbumServiceImpl();
// ArrayList<Album> list=new ArrayList<Album>();
// list=albumService.getHostAlbumList();
//
// for(Album e:list){
// System.out.println(e.getTitle());
// }
// }
@Override
public ArrayList<Album> getAlbumList() {
reList=albumdao.getAlbumList();
return reList;
}
@Override
public ArrayList<Album> getAlbumsByGenreId(int genreid) {
reList=albumdao.getAlbumsByGenreId(genreid);
return reList;
}
@Override
public ArrayList<Album> getAlbumsByArtist(String artist) {
reList=albumdao.getAlbumsByArtist(artist);
return reList;
}
@Override
public boolean addAlbums(Album newalbum) {
boolean flag=false;
flag=albumdao.addAlbums(newalbum);
return flag;
}
@Override
public boolean deleteAlbums(int id) {
boolean flag=false;
flag=albumdao.deleteAlbums(id);
return flag;
}
@Override
public boolean deleteAlbums(String artist) {
boolean flag=false;
flag=albumdao.deleteAlbums(artist);
return flag;
}
@Override
public void updateAlbums(int id, Album album) {
albumdao.updateAlbums(id, album);
}
@Override
public Album getAlbumsById(int id) {
al=albumdao.getAlbumsById(id);
return al;
}
@Override
public ArrayList<Album> getHostAlbumList() {
reList=albumdao.getHostAlbumList();
return reList;
}
}
无论在AlbumDaoImpl和AlbumServiceImpl里这个getHostAlbumList()函数都是可以实现的,并且拿到数据的(后端测试图如下):
但是在前端的jsp页面中:
<p id="main">
<h3 id="main-title">最新热销唱片</h3>
<p id="hotAlbums">
<%
AlbumService albumService=new AlbumServiceImpl();
Album temp=new Album();
ArrayList<Album> list=new ArrayList<Album>();
list=albumService.getHostAlbumList();
for(Album e:list){
int id=e.getId();
String name=e.getTitle();
String picPath=String.valueOf(id)+".jpg";
%>
<dl class="hotAlbumsItem">
<dt>
<a href="AlbumDetail.jsp?albumid=2"><img src="CoverImages/10.jpg" alt=""/></a>
</dt>
<dd><%= name %></dd>
</dl>
<%
}
%>
</p>
</p>
执行的时候是空指针异常!
控制台信息:
网页信息:
不明白为什么在前端会有空指针异常,但是后端数据又可以取出来!!!而且引起空指针异常的路径问题,既然在后端都没事,为什么在前端就无法识别。难不成在前端还要加载mysql驱动= =||。
最近百度找到一个javaweb同为空指针问题的解决方案,贴出来大家参考下附上链接。但是我所使用的lib中并没有这两个jar包...
还望各路大神指点!!!
BaseDao クラス: Class.forName() は追加されません。
追加後、null ポインターの問題は解決されます。 ...................
しかし、なぜこの文を追加しなくても Java ファイルを直接実行するとデータが読み取れるのか疑問に思います。 Java ファイルが実行でき、データが読み取れることがわかったからといって、データベース クラスが正しいものだと常に思って無視していました。 ......
コード全文を直接投稿してください
これらのレイヤーは Spring を通じて注入されるのではありませんか?次に、新しいインスタンスを手動で作成して確認する必要があります
例外情報は非常に明確で、BaseDao の 86 行目にある null ポインタです。
二階の回答に同意します。