急急急,关于新建图书分类类在jsp页面不显示问题
-categoryList.jsp
1 | <%@ page language= "java" contentType= "text/html; charset=UTF-8" <br> pageEncoding= "UTF-8" %><br><%@ taglib uri= "http://java.sun.com/jsp/jstl/core" prefix= "c" %><br><!DOCTYPE html><br><html><br><head><br><meta charset= "UTF-8" ><br><title>图书后台管理</title><br><link rel= "stylesheet" href= "css/index.css" ><br><link rel= "stylesheet" href= "css/bootstrap.min.css" ><br></head><br><br><body><br> <header><br> <div class = "container" ><br> <nav><br> <a href= "bookList.html" >图书信息管理</a><br> </nav><br> <nav><br> <a href= "categoryList.html" >分类管理</a><br> </nav><br><br> </div><br> </header><br> <section class = "banner" ><br> <div class = "container" ><br> <div><br> <h1>图书管理系统</h1><br> <p>图书分类管理</p><br> </div><br> </div><br> </section><br> <section class = "main" ><br> <div class = "container" ><br> <table class = "table table-striped" ><br> <thead><br> <tr><br> <th>序号</th><br> <th>分类编号</th><br> <th>分类名称</th><br> <th>操作</th><br> </tr><br> </thead><br> <tbody><br> <c:forEach items= "${applicationScope.categoryDb }" var= "ctg" varStatus= "idx" ><br> <tr><br> <td>${idx.index+ 1 }</td><br> <td>${ctg.categoryId }</td><br> <td>${ctg.categoryName }</td><br> <td><a href= "/deleteCategory?categoryId=ca0001" >删除</a></td><br> <!--在循环显示数据时,此处的ca0001可以用EL表达式进行替换--><br><br> </tr><br> </c:forEach><br> </tbody><br> </table><br> </div><br> </section><br> <section class = "page" ><br> <div class = "container" ><br> <div id= "fatie" ><br> <a href= "addCategory.jsp" ><button>新建</button></a><br> </div><br> </div><br> </section><br> <footer> copy@慕课网 </footer><br></body><br></html><br> |
-addCategory.jsp
1 | <%@ page language= "java" contentType= "text/html; charset=UTF-8" <br> pageEncoding= "UTF-8" %><br><!DOCTYPE html><br><html><br><head><br><meta charset= "UTF-8" ><br><title>新建图书分类</title><br><link rel= "stylesheet" href= "css/bootstrap.min.css" ><br><link rel= "stylesheet" href= "css/add.css" ><br></head><br><body><br> <nav class = "navbar navbar-default" ><br> <div class = "container" ><br> <div class = "navbar-header" ><br> <a class = "navbar-brand" href= "" > 图书分类管理 </a><br> </div><br> </div><br> </nav><br> <div class = "container" ><br> <div class = "jumbotron" ><br> <h1>Hello, XXX!</h1><br> <p>请小心地新增图书分类,要是建了一个错误的就不好了。。。</p><br> </div><br> <div class = "page-header" ><br> <h3><br> <small>新建</small><br> </h3><br> </div><br> <form class = "form-horizontal" <br> action= "${pageContext.request.contextPath }/AddCategoryServlet" <br> method= "post" ><br> <div class = "form-group" ><br> <label for = "categoryId" class = "col-sm-2 control-label" >分类ID<br> :</label><br> <div class = "col-sm-8" ><br> <input name= "categoryId" class = "form-control" id= "categoryId" ><br> </div><br> </div><br> <div class = "form-group" ><br> <label for = "categoryName" class = "col-sm-2 control-label" >分类名称<br> :</label><br> <div class = "col-sm-8" ><br> <input name= "categoryName" class = "form-control" id= "categoryName" ><br> </div><br> </div><br><br> <div class = "form-group" ><br> <div class = "col-sm-offset-2 col-sm-10" ><br> <button type= "submit" class = "btn btn-primary" >保存</button><br> <p>${ msg}</p><br> <br> </div><br> </div><br> </form><br> </div><br> <footer class = "text-center" > copy @imooc </footer><br></body><br></html><br> |
-InitServletContextListener
1 | package com.imooc.web.listener;<br><br> import java.util.ArrayList;<br> import java.util.List;<br><br> import javax.servlet.ServletContext;<br> import javax.servlet.ServletContextEvent;<br> import javax.servlet.ServletContextListener;<br><br> import com.imooc.domain.Category;<br> import com.imooc.domain.User;<br><br> public class InitServletContextListener implements ServletContextListener {<br><br> public InitServletContextListener() {<br> }<br><br> // 销毁<br> public void contextDestroyed(ServletContextEvent sce) {<br> }<br><br> // 初始化用户和图书分类类<br> public void contextInitialized(ServletContextEvent sce) {<br> ServletContext context = sce.getServletContext();<br> // 创建一个用于保存用户信息的List集合<br> List<User> userList = new ArrayList<User>();<br> // 将List集合存入到ServletContext域中<br> userList.add(new User("aaa", "123456"));<br> userList.add(new User("bbb", "234567"));<br> userList.add(new User("ccc", "345678"));<br> context.setAttribute("userList", userList);<br> if (context.getAttribute("cateogryDb") == null) {<br> List<Category> ctgList = new ArrayList<Category>();<br> ctgList.add(new Category("ca0001", "计算机类"));<br> context.setAttribute("categoryDb", ctgList);<br> }<br> }<br>}<br> |
-接口
1 | package com.imooc.service;<br><br> import java.util.ArrayList;<br><br> import java.util.List;<br><br> import com.imooc.domain.Category;<br> //负责简洁清晰的展示接口中必要的方法和属性<br>public interface CategoryService {<br> public static final List<Category> categoryDb =new ArrayList<Category>();<br><br> public void addCategory(String categoryId, String categoryName);<br><br> public void deleteCatgory(String categoryId);<br><br>}<br> |
-实现类
1 | package com.imooc.service.impl;<br><br> import java.util.ArrayList;<br> import java.util.List;<br><br> import com.imooc.domain.Category;<br> import com.imooc.service.CategoryService;<br> //用来实现接口中属性和方法的实现类<br>public class CategoryServiceImpl implements CategoryService {<br><br> private static final List<Category> categoryDb = new ArrayList<Category>();<br><br> public static List<Category> getCategoryDb() {<br> return categoryDb;<br> }<br><br> //纯添加,判断在servlet里进行<br> @Override<br> public void addCategory(String categoryId, String categoryName) {<br> Category category = new Category(categoryId, categoryName);<br> categoryDb.add(category);<br> }<br><br> @Override<br> public void deleteCatgory(String categoryId) {<br> Category categoryExist = null;<br> for (Category c : categoryDb) {<br> if (categoryId.equals(c.getCategoryId())) {<br> categoryExist = c;<br> }<br> }<br> }<br>}<br> |
-AddCategoryServlet
1 | package com.imooc.web.servlet;<br><br> import java.io.IOException;<br> import java.util.List;<br><br> import javax.servlet.ServletException;<br> import javax.servlet.annotation.WebServlet;<br> import javax.servlet.http.HttpServlet;<br> import javax.servlet.http.HttpServletRequest;<br> import javax.servlet.http.HttpServletResponse;<br><br> import com.imooc.domain.Category;<br> import com.imooc.service.CategoryService;<br> import com.imooc.service.impl.CategoryServiceImpl;<br><br> @WebServlet ( "/AddCategoryServlet" )<br> public class AddCategoryServlet extends HttpServlet {<br> private static final long serialVersionUID = 1L;<br><br> public AddCategoryServlet() {<br> super ();<br> }<br><br> protected void doGet(HttpServletRequest request, HttpServletResponse response)<br> throws ServletException, IOException {<br> // 接受数据<br> String categoryId = request.getParameter("categoryId");<br> String categoryName = request.getParameter("categoryName");<br> // 在这里判断输入的是否为空(根据id)<br> if (categoryId.isEmpty() && categoryName.isEmpty()) {<br> request.setAttribute("msg", "id及名称为空!");<br> request.getRequestDispatcher("/addCategory.jsp").forward(request, response);<br> } else {<br> // 封装数据<br> Category ctg = new Category(categoryId, categoryName);<br> CategoryService ctgService = new CategoryServiceImpl();// 接口引用指向具体的实现类,多态的体现<br> // 处理数据<br> // 在这里判断一下列表里是否已经有id重名的情况再存进去<br> List<Category> list = CategoryServiceImpl.getCategoryDb();<br> for (Category cExist : list) {<br> if (cExist.getCategoryId().equals(ctg.getCategoryId())<br> && cExist.getCategoryName().equals(ctg.getCategoryName())) {<br> request.setAttribute("msg", "该分类已存在!");<br> request.getRequestDispatcher("/addCategory.jsp").forward(request, response);<br> return;<br> } else {<br> ctgService.addCategory(categoryId, categoryName);<br> request.getServletContext().setAttribute("categoryDb", CategoryServiceImpl.getCategoryDb());<br> }<br> }<br> }<br> // 交给jsp展示数据<br> request.getRequestDispatcher("/categoryList.jsp").forward(request, response);<br> }<br><br> protected void doPost(HttpServletRequest request, HttpServletResponse response)<br> throws ServletException, IOException {<br> doGet(request, response);<br> }<br><br>}<br> |
老师请问
1、为什么我新建图书分类在jsp页面不显示,点击前后如图。自己已经找到了一些问题了,比如因为监听器初始化不显示设置在了全局域中,应该从ServletContext域中获取
1 | request.getServletContext().setAttribute( "categoryDb" , CategoryServiceImpl.getCategoryDb());<br> |
2、初始化放在监听器中可以吗,有没有更好的方法
3、怎么可以把判断放在实现类中,我看了老师其他答案在void add方法中返回boolean变量,但在AddServlet中怎么获取这个变量啊
4、关于msg,我判断为空的提示正常输出显示,但重名已存在的msg怎么不显示啊
正在回答
同学你好,老师是将同学的Servlet拼接到自己的项目中,让代码能跑起来,现在测试同学的代码有前面提出的三个问题,同学使用如下修改后的代码再来试试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | package com.imooc.web.servlet; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.imooc.domain.Category; import com.imooc.service.CategoryService; import com.imooc.service.impl.CategoryServiceImpl; @WebServlet ( "/AddCategoryServlet" ) public class AddCategoryServlet extends HttpServlet { private static final long serialVersionUID = 1L; public AddCategoryServlet() { super (); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 接受数据 String categoryId = request.getParameter( "categoryId" ); String categoryName = request.getParameter( "categoryName" ); // 在这里判断输入的是否为空(根据id) if (categoryId.isEmpty() && categoryName.isEmpty()) { request.setAttribute( "msg" , "id及名称为空!" ); request.getRequestDispatcher( "/addCategory.jsp" ).forward(request, response); } else { // 封装数据 Category ctg = new Category(categoryId, categoryName); CategoryService ctgService = new CategoryServiceImpl(); // 接口引用指向具体的实现类,多态的体现 // 处理数据 // 在这里判断一下列表里是否已经有id重名的情况再存进去 List<Category> list = CategoryServiceImpl.getCategoryDb(); boolean flag = false ; for (Category cExist : list) { if (cExist.getCategoryId().equals(ctg.getCategoryId()) && cExist.getCategoryName().equals(ctg.getCategoryName())) { flag = true ; System.out.println( "存在相同的" ); return ; } else { flag = false ; System.out.println( "没有相同的" ); //return; //这里else不需要再次return } } //if (flag = false) { //flag判断要使用== if (flag == false ) { ctgService.addCategory(categoryId, categoryName); request.getServletContext().setAttribute( "categoryDb" , CategoryServiceImpl.getCategoryDb()); System.out.println( "添加成功" ); request.getRequestDispatcher( "/categoryList.jsp" ).forward(request, response); } else { System.out.println( "存在相同的没有添加" ); request.setAttribute( "msg" , "该分类已存在!" ); request.getRequestDispatcher( "/addCategory.jsp" ).forward(request, response); } } // 交给jsp展示数据 //if-else条件语句执行完后不需要再次执行跳转语句 //request.getRequestDispatcher("/categoryList.jsp").forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } } |
如上所示就是修改后的代码,同学再来测试运行一下。
同学你好,测试拼接同学贴出的代码有如下问题:
1、提交响应后无法转发。
因为同学在if--else的条件语句中已经存在转发,在if的条件外面又进行了转发,导致出现这个问题,建议同学直接在if条件中书写对应的跳转,比如:
2、在判断列表里是否已经有id重名的情况时,不要在else中写return语句,return表示返回不再继续执行。
这样书写条件语句有问题,比如: 当传入的分类属性与集合中的第一个对象不一样,它直接判断完成后直接跳出,最后得到的结果就是列表里没有重名的id,但是它只比较了集合中的第一个对象。
修改建议如下:
3、注意判断是"==",赋值是"=",在最后的判断语句中,注意是==,
因为是拼接同学的代码,可能某些方法名或属性与同学的不一样,同学理解意思就好。如上所示的问题修改后再来试试。
1 | package com.imooc.web.servlet;<br><br> import java.io.IOException;<br> import java.util.List;<br><br> import javax.servlet.ServletException;<br> import javax.servlet.annotation.WebServlet;<br> import javax.servlet.http.HttpServlet;<br> import javax.servlet.http.HttpServletRequest;<br> import javax.servlet.http.HttpServletResponse;<br><br> import com.imooc.domain.Category;<br> import com.imooc.service.CategoryService;<br> import com.imooc.service.impl.CategoryServiceImpl;<br><br> @WebServlet ( "/AddCategoryServlet" )<br> public class AddCategoryServlet extends HttpServlet {<br> private static final long serialVersionUID = 1L;<br><br> public AddCategoryServlet() {<br> super ();<br> }<br><br> protected void doGet(HttpServletRequest request, HttpServletResponse response)<br> throws ServletException, IOException {<br> // 接受数据<br> String categoryId = request.getParameter("categoryId");<br> String categoryName = request.getParameter("categoryName");<br> // 在这里判断输入的是否为空(根据id)<br> if (categoryId.isEmpty() && categoryName.isEmpty()) {<br> request.setAttribute("msg", "id及名称为空!");<br> request.getRequestDispatcher("/addCategory.jsp").forward(request, response);<br> } else {<br> // 封装数据<br> Category ctg = new Category(categoryId, categoryName);<br> CategoryService ctgService = new CategoryServiceImpl();// 接口引用指向具体的实现类,多态的体现<br> // 处理数据<br> // 在这里判断一下列表里是否已经有id重名的情况再存进去<br> List<Category> list = CategoryServiceImpl.getCategoryDb();<br> boolean flag = false;<br> for (Category cExist : list) {<br> if (cExist.getCategoryId().equals(ctg.getCategoryId())<br> && cExist.getCategoryName().equals(ctg.getCategoryName())) {<br> flag = true;<br> System.out.println("存在相同的");<br> return;<br> } else {<br> flag = false;<br> System.out.println("没有相同的");<br> return;<br> }<br> }<br> if (flag = false) {<br> ctgService.addCategory(categoryId, categoryName);<br> request.getServletContext().setAttribute("categoryDb", CategoryServiceImpl.getCategoryDb());<br> System.out.println("添加成功");<br> } else {<br> System.out.println("存在相同的没有添加");<br> request.setAttribute("msg", "该分类已存在!");<br> request.getRequestDispatcher("/addCategory.jsp").forward(request, response);<br> }<br> }<br> // 交给jsp展示数据<br> request.getRequestDispatcher("/categoryList.jsp").forward(request, response);<br> }<br><br> protected void doPost(HttpServletRequest request, HttpServletResponse response)<br> throws ServletException, IOException {<br> doGet(request, response);<br> }<br><br>}<br> |
唉,还是不行啊老师
- 参与学习 人
- 提交作业 676 份
- 解答问题 9666 个
本阶段将从前端网页搭建入手,到Java Web基础,前后端结合助你完成Java Web小白的蜕变!
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧