Listener获取了bookList,在index.jsp读取时异常
来源:5-2 项目作业
wacky1
2020-07-28 12:18:04

一用<c:foreach>标签在index.jsp迭代就报错老师帮忙看看是哪里错了
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<title>Home</title>
<!-- Custom Theme files -->
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="keywords" content="" />
<!-- //Custom Theme files -->
<link href="/css/bootstrap.css" type="text/css" rel="stylesheet" media="all">
<link href="/css/style.css" type="text/css" rel="stylesheet" media="all">
<!-- js -->
<script src="/js/jquery.min.js"></script>
<script type="text/javascript" src="/js/bootstrap-3.1.1.min.js"></script>
<!-- //js -->
<!-- cart -->
<script src="js/simpleCart.min.js"> </script>
<!-- cart -->
<script type="text/javascript">
</script>
</head>
<body>
<!--header-->
<div class="header">
<div class="container">
<nav class="navbar navbar-default" role="navigation">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<h1 class="navbar-brand"><a href="">IMOOC</a></h1>
</div>
<!--navbar-header-->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="/book/list.do" class="active">首页</a></li>
<!-- 此处分类应从数据库中读取 -->
<li class="dropdown">
<a href="">Java</a>
</li>
<li class="dropdown">
<a href="">前端</a>
</li>
</ul>
</div>
</nav>
</div>
<div class="clearfix"> </div>
</div>
</div>
<!--//header-->
<!--banner-->
<div class="banner">
<div class="container" style="height: 300px">
<h2 class="hdng">IMOOC <span>图书</span></h2>
<p>读万卷书,行万里路</p>
<a href="#">SHOP NOW</a>
<!--
<div class="banner-text">
<img src="../../../images/tushu.jpeg" alt=""/>
</div>
-->
</div>
</div>
<!--//banner-->
<!--gallery-->
<div class="gallery">
<div class="container">
<div class="gallery-grids">
<c:forEach items="bookList" var="book">
<div class="col-md-3 gallery-grid " style="float:left">
<a href="#">
<img src="${book.imgPath}" class="img-responsive" alt=""/>
<div class="gallery-info">
<p><span class="glyphicon glyphicon-eye-open" aria-hidden="true"></span> view</p>
<a class="shop" href="single.html">SHOP NOW</a>
<div class="clearfix"> </div>
</div>
</a>
<div class="galy-info">
<p style="size: 30px">${book.name}</p>
<div class="galry">
<div class="prices">
<h5 class="item_price">¥${book.price}</h5>
</div>
<div class="rating">
<c:forEach begin="1" end="5" var="${book.level}">
<span>☆</span>
</c:forEach>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
</c:forEach>
</div>
<div align="right">
<!-- 分页部分可以参照MyBatis拦截器的例子-->
</div>
</div>
</div>
<!--//gallery-->
<!--subscribe-->
<!--//subscribe-->
<!--footer-->
<!--//footer-->
<div class="footer-bottom">
<div class="container">
<p>Copyright © 2017 imooc.com All Rights Reserved | 京ICP备 13046642号-2</p>
</div>
</div>
</body>
</html>Listener
package com.imooc.bookshop.global;
import com.imooc.bookshop.biz.BookBiz;
import com.imooc.bookshop.biz.impl.BookBizImpl;
import com.imooc.bookshop.entity.Book;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.util.List;
public class Listener implements ServletContextListener {
private BookBiz bookBiz = new BookBizImpl();
public void contextInitialized(ServletContextEvent sce) {
List<Book> list = bookBiz.selectAll();
for (Book list1:list
) {
System.out.println(list1);
}
sce.getServletContext().setAttribute("bookList", list);
}
}Listener已经可以获取bookList并且把数据输出了
GlobalController
package com.imooc.bookshop.global;
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class GlobalController extends GenericServlet {
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
/*
servlet应该有/Book/add.do
/Book/delect.do
/Category/add.do
/Category/delect.do
*/
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
String path = request.getServletPath();
String className = null;
String methodName = null;
if(path.indexOf("Book")!=-1){
className = "com.imooc.bookshop.controller."+path.substring(1,5)+"Controller";
path = path.substring(6);
}else if(path.indexOf("Category")!=-1){
className = "com.imooc.bookshop.controller."+path.substring(1,9)+"Controller";
path = path.substring(10);
}else if(path.indexOf("Book")==-1&&path.indexOf("Category")==-1){
return;
}
int index = path.indexOf(".do");
System.out.println(className);
methodName = path.substring(0,index);
try {
/*使用反射获取到Class对象*/
Class cla = Class.forName(className);
/* 创建该对象的实例对象*/
Object object = cla.newInstance();
/* 通过反射的方式执行方法*/
Method method = cla.getMethod(methodName,HttpServletRequest.class, HttpServletResponse.class);
method.invoke(object,request,response);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}EncodingFilter
package com.imooc.bookshop.global;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class EncodingFilter implements Filter {
/* 设置默认的编码*/
private String encoding = "UTF-8";
public void init(FilterConfig filterConfig) throws ServletException {
/* 判断一下配置文件中有没有设置编码格式
如果有,则使用配置的
如果没有,则使用默认值UTF-8*/
if(filterConfig.getInitParameter("encoding")!=null)
encoding = filterConfig.getInitParameter("encoding");
}
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
/* 设置request和response的编码格式,并放行访问链接*/
request.setCharacterEncoding(encoding);
response.setCharacterEncoding(encoding);
filterChain.doFilter(request,response);
}
public void destroy() {
}
}DaoFacotry
package com.imooc.bookshop.global;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
public class DaoFactory {
private static DaoFactory daoFactory;
private SqlSessionFactory sessionFactory;
private DaoFactory(){
/* 加载配置文件,获取sessionFactory*/
SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder();
try {
sessionFactory = sessionFactoryBuilder.build(Resources.getResourceAsReader("/mybatis.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}
/* 使用单例模式创建该类的实例对象*/
public static DaoFactory getInstence(){
if(daoFactory==null)
daoFactory = new DaoFactory();
return daoFactory;
}
/*创建一个传入泛型类Dao的实例对象*/
public <T> T getDao(Class<T> tClass){
return sessionFactory.openSession(true).getMapper(tClass);
}
}Book.java
package com.imooc.bookshop.entity;
public class Book {
private int id;
private int categoryId;
private String name;
private int level;
private int price;
private String imgPath;
private String createTime;
private String updateTime;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getcategoryId() {
return categoryId;
}
public void setcategoryId(int categoryId) {
this.categoryId = categoryId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getImgPath() {
return imgPath;
}
public void setImgPath(String imgPath) {
this.imgPath = imgPath;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
@Override
public String toString() {
return "book{" +
"id=" + id +
", categoryId=" + categoryId +
", name='" + name + '\'' +
", level=" + level +
", price=" + price +
", imgPath='" + imgPath + '\'' +
", createTime='" + createTime + '\'' +
", updateTime='" + updateTime + '\'' +
'}';
}
}BookDao
package com.imooc.bookshop.dao;
import com.imooc.bookshop.entity.Book;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface BookDao {
@Insert("<script>" +
"insert into book(category_id,name,level,price,img_path,create_time,update_time) values" +
"<foreach collection='list' item='book' separator=','>" +
"(#{book.categoryId},#{book.name},#{book.level},#{book.price},#{book.imgPath},now(),now())" +
"</foreach>" +
"</script>")
@Options(useGeneratedKeys = true,keyProperty = "id")
void insertBook(List<Book> list);
@Delete("delete from book where id = #{id}")
void deleteBook(int id);
@Select("select * from book")
@Results(id="all",value = {
@Result(column = "id",property = "id",id=true),
@Result(column = "category_id",property = "categoryId"),
@Result(column = "name",property = "name"),
@Result(column = "level",property = "price"),
@Result(column = "img_paht",property = "imgPath"),
@Result(column = "create_time",property = "createTime"),
@Result(column = "update_time",property = "updateTime")
})
List<Book> selectAll();
@Select("select * from book where category_id = #{categoryId}")
@ResultMap("all")
List<Book> selectByCatregoryId(int categoryId);
}BookController
package com.imooc.bookshop.controller;
import com.imooc.bookshop.biz.BookBiz;
import com.imooc.bookshop.biz.impl.BookBizImpl;
import com.imooc.bookshop.entity.Book;
import com.sun.org.apache.xpath.internal.XPathContext;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
public class BookController {
private BookBiz bookBiz = new BookBizImpl();
//Book/add.do
/**
* 添加书本方法
*/
public void add(HttpServletRequest request, HttpServletResponse response) throws FileUploadException, IOException, ServletException {
Book book = new Book();
List<Book> bookList = new ArrayList<Book>();
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
List<FileItem> list = upload.parseRequest(request);
for (FileItem item : list) {
if (item.isFormField()) {
if (item.getFieldName().equals("name")) {
book.setName(item.getString("utf-8"));
}
if (item.getFieldName().equals("categoryId")) {
book.setcategoryId(Integer.parseInt(item.getString("utf-8")));
}
if (item.getFieldName().equals("level")) {
book.setLevel(Integer.parseInt(item.getString("utf-8")));
}
if (item.getFieldName().equals("price")) {
book.setPrice(Integer.parseInt(item.getString("utf-8")));
}
} else {
if (item.getFieldName().equals("smallImg")) {
if (item.getSize() <= 100) {
continue;
}
String rootPath = request.getServletContext().getRealPath("/");
String path = item.getName();
String type = ".jpg";
if (path.indexOf(".") != -1) {
type = path.substring(path.lastIndexOf("."));
}
path = "/download/images" + System.currentTimeMillis() + type;
try {
item.write(new File(rootPath + path));
book.setImgPath(path);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
bookList.add(book);
bookBiz.add(bookList);
request.getSession().setAttribute("bookList",bookList);
request.getRequestDispatcher("/index.jsp").forward(request,response);
}
}BookBiz
package com.imooc.bookshop.biz;
import com.imooc.bookshop.entity.Book;
import java.util.List;
public interface BookBiz {
void add(List<Book> list);
List<Book> selectAll();
List<Book> selectByCategoryId(int categoryId);
}BookBizImpl
package com.imooc.bookshop.biz.impl;
import com.imooc.bookshop.dao.BookDao;
import com.imooc.bookshop.entity.Book;
import com.imooc.bookshop.global.DaoFactory;
import java.util.List;
public class BookBizImpl implements com.imooc.bookshop.biz.BookBiz {
private BookDao bookDao = DaoFactory.getInstence().getDao(BookDao.class);
public void add(List<Book> list) {
bookDao.insertBook(list);
}
public List<Book> selectAll() {
return bookDao.selectAll();
}
public List<Book> selectByCategoryId(int categoryId) {
return bookDao.selectByCatregoryId(categoryId);
}
}
目录都在这了
4回答
同学你好,读不出数据可能是bookList集合中没有数据。建议同学在Controller最后输出一下bookList,看一下bookList是否为空。如下:
如果bookList为空,建议同学重新查询一下数据。
祝学习愉快~
好帮手慕阿慧
2020-07-28
同学你好,老师这边测试是没有问题的,可以在页面上展示图书。建议同学重构一下项目,如下:

清理一下浏览器缓存或者换个浏览器访问试试。
祝学习愉快~
wacky1
提问者
2020-07-28


好帮手慕阿慧
2020-07-28
同学你好,
1、<c:forEarch>中items是要遍历的集合,应该写在${}中。
如下:

注意:由于没有指定要从哪个作用域中获得bookList,会按request,session,application顺序找bookList,所以遍历的bookList不一定application域的,可能是session域的。
2、var是每次循环的变量。同学可以将循环的数字与图书的星级比较来显示星级。
参考代码如下:

3、在BookController中,建议同学先查询图书信息,再转发到index.jsp。
参考代码如下:

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
相似问题