Listener获取了bookList,在index.jsp读取时异常

来源:5-2 项目作业

wacky1

2020-07-28 12:18:04

http://img.mukewang.com/climg/5f1fa5a4099c3c9e12090799.jpg

一用<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);
    }
}

http://img.mukewang.com/climg/5f1fa6f7092ec3b904710710.jpg目录都在这了

写回答

4回答

好帮手慕阿慧

2020-07-28

同学你好,读不出数据可能是bookList集合中没有数据。建议同学在Controller最后输出一下bookList,看一下bookList是否为空。如下:http://img.mukewang.com/climg/5f1fd7100961bf7507230059.jpg

如果bookList为空,建议同学重新查询一下数据。

祝学习愉快~

0
hacky1
h 试了,有数据的
h020-07-28
共1条回复

好帮手慕阿慧

2020-07-28

同学你好,老师这边测试是没有问题的,可以在页面上展示图书。建议同学重构一下项目,如下:

http://img.mukewang.com/climg/5f1fe11109387fda02640146.jpg

清理一下浏览器缓存或者换个浏览器访问试试。

祝学习愉快~

0

wacky1

提问者

2020-07-28

http://img.mukewang.com/climg/5f1fd9fc09aa6c2b19201048.jpg

http://img.mukewang.com/climg/5f1fda0e09c91dd709650274.jpg

0

好帮手慕阿慧

2020-07-28

同学你好,

1、<c:forEarch>中items是要遍历的集合,应该写在${}中。

如下:

http://img.mukewang.com/climg/5f1fcf0b0991414506090114.jpg

注意:由于没有指定要从哪个作用域中获得bookList,会按request,session,application顺序找bookList,所以遍历的bookList不一定application域的,可能是session域的。

2、var是每次循环的变量。同学可以将循环的数字与图书的星级比较来显示星级。

参考代码如下:

http://img.mukewang.com/climg/5f1fcf2909135b7005190146.jpg

3、在BookController中,建议同学先查询图书信息,再转发到index.jsp。

参考代码如下:

http://img.mukewang.com/climg/5f1fcf440965a27407530130.jpg

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

0
hacky1
h 老师我在Listener监听器里面已经查询过了。改完之后读不出数据
h020-07-28
共1条回复

0 学习 · 8016 问题

查看课程