新增图书页封页显示

新增图书页封页显示

初始化监听器
package com.zhou.web.listener;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import com.zhou.web.domain.Books;
import com.zhou.web.domain.Category;
import com.zhou.web.domain.User;
/**
 * InitServletContextListener 启动程序时,初始化数据
 * @author 25677
 *
 */

//使用注解的方式对监听器进行配置
@WebListener
public class InitServletContextListener implements ServletContextListener {

	@Override
	public void contextDestroyed(ServletContextEvent arg0) {
		// TODO Auto-generated method stub

	}

	@Override
	public void contextInitialized(ServletContextEvent event) {
		
		//1.初始化账户列表参数
		//创建一个list集合用来保存用户
		List<User> userList = new ArrayList<User>();
		
		/*
		 * 假设管理员账号比较隐私 不允许别人创建等操作 我们现在web.xml中配置好管理员账号
		 * 然后再程序初始化的时候获取到保存到list集合中,根据用户登录时输入的数据进行比较
		 */
		String account  =  event.getServletContext().getInitParameter("account");
		String password  =  event.getServletContext().getInitParameter("password");
		
		//创建User对象 并将获得的管理员输入填入其中
		User user = new User(account,password);
		
		//将user对象填入userlist中
		userList.add(user);
		
		//将userList存入ServletContext全局对象中
		event.getServletContext().setAttribute("userList", userList);
		
		
		//2.初始化图书分类列表参数
		//创建默认分类数据
		Category category = new Category("ca0001","计算机类");
		//创建集合
		List<Category> categoryList = new ArrayList<Category>();
		//往集合中添加数据分类
		categoryList.add(category);
		//将集合对象categoryList存入ServletContext全局对象中
		event.getServletContext().setAttribute("categoryList", categoryList);
		
		
		//3.初始化图书列表
		Books books = new Books("book0001","Java基础","计算机类",29D,"img/g1.jpg","第一本");
		//创建集合
		List<Books> booksList= new ArrayList<Books>();
		//往集合中添加数据分类
		booksList.add(books);
		//将集合对象booksList存入ServletContext全局对象中
		event.getServletContext().setAttribute("booksList", booksList);
		
	}
}
package com.zhou.web.service;

import java.util.List;

import com.zhou.web.domain.Books;
import com.zhou.web.domain.Category;
import com.zhou.web.domain.User;

/**
 * UserService 处理业务逻辑的接口类
 * @author 25677
 *
 */
public interface UserService {
	
	//处理登录的业务逻辑接口
	public User login(List<User> listUser, User user);

	//处理添加分类逻辑的业务接口
	public boolean JudgeCategory(List<Category> categoryList, Category category);

	//处理删除分类逻辑的业务接口
	public void DeleteCategory(List<Category> categoryList, String categoryId);

	//处理添加图书逻辑的业务接口
	public Boolean JudgeBooks(List<Books> booksList, Books books);
}
package com.zhou.web.service.impl;

import java.util.Iterator;
import java.util.List;

import com.zhou.web.domain.Books;
import com.zhou.web.domain.Category;
import com.zhou.web.domain.User;
import com.zhou.web.service.UserService;

/**
 * UserServiceImpl 处理业务逻辑接口的实现类
 * @author 25677
 *
 */
public class UserServiceImpl implements UserService {
	
	/**
	 * 登入业务逻辑
	 */
	@Override
	public User login(List<User> listUser, User user) {
		for(User users: listUser) {
			if(users.getUser().equals(user.getUser()) && users.getPassword().equals(user.getPassword())) {
				return users;
			}
		}
		return null;
	}
	
	/**
	 * 处理添加分类的业务逻辑  
	 * true 表示添加成功 
	 */
	@Override
	public boolean JudgeCategory(List<Category> categoryList, Category category) {
		
		//如果分类名或者分类id存在一样相同我们都认为添加失败
		for(Category c: categoryList) {
			if(c.getId().equals(category.getId()) || c.getCategoryName().equals(category.getCategoryName())) {
				return false;
			}
		}
		//不存在相同的 则将新的分类添加到集合
		categoryList.add(category);
		
		return true;
	}
	
	/**
	 * 处理删除图书分类的业务逻辑
	 */
	@Override
	public void DeleteCategory(List<Category> categoryList, String categoryId) {
		/*
		 * for(Category category: categoryList) {
		 * if(category.getId().equals(categoryId)) { categoryList.remove(category); } }
		 */
		Iterator<Category> iterator = categoryList.iterator();
		while(iterator.hasNext()) {
			Category c = iterator.next();
			if(c.getId().equals(categoryId)) {
				iterator.remove();
				return;
			}
		}
	}
	
	/**
	 * 处理添加图书的业务逻辑
	 * Boolean ture 添加成功  false 添加失败
	 */
	@Override
	public Boolean JudgeBooks(List<Books> booksList, Books books) {
		
		for(Books book : booksList) {
			//存在相同id的图书
			if(book.getBookId().equals(books.getBookId())) {
				return false;
			}
		}
		//不存在相同的图书 则添加
		booksList.add(books);
		return true;
	}

}
package com.zhou.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.zhou.web.domain.Books;
import com.zhou.web.service.UserService;
import com.zhou.web.service.impl.UserServiceImpl;
import com.zhou.web.util.UploadBookImgUtil;

/**
 * AddBooksServlet 添加图书的控制器
 */
@WebServlet("/AddBooksServlet")
public class AddBooksServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收数据
		String bookId = request.getParameter("bookId");//图书编号
		String bookName = request.getParameter("bookName");//图书名
		String categoryId = request.getParameter("categoryId");//图书分类
		//Double bookPrice = Double.valueOf(request.getParameter("bookPrice"));//图书价格
		Double bookPrice = Double.parseDouble(request.getParameter("bookPrice"));//图书价格
		//String bookPic = request.getParameter("bookPic");//图书封面路径
		String remarks = request.getParameter("remarks");//图书备注
		
		System.out.println("bookID" + bookId + " bookNmae:" + bookName + " categoryID:" + categoryId
				+ " bookPrice: " + bookPrice + " remarks:" + remarks);
		
		
		  //将图书封面存入到服务其中 并获取到服务器中的地址 
		  String url = UploadBookImgUtil.uploadImg(request,response); System.out.println(url);
		  
		  //封装数据 	  
		  Books books = new Books(bookId,bookName,categoryId,bookPrice,url,remarks);
		  
		  //处理数据 
		  UserService userService = new UserServiceImpl();
		  //获取在初始化时存入在servletContext全局上下文中存在booksList集合
		  List<Books> booksList = (List<Books>) request.getServletContext().getAttribute("booksList");
		  //调用方法判断新添加的图书是否已经在图书集合中存在: 判断条件为图书编号不同即可
		  Boolean addFlag = userService.JudgeBooks(booksList,books);
		  
		  //显示数据 
		  if(addFlag) { 
			  //添加成功 重定向到图书信息管理页
			  response.sendRedirect(request.getContextPath() + "/page/bookList.jsp"); 
		  }else{ 
			  //添加失败 
			  //请求转发到增加图书addBook.jsp 并设置flag 提示失败
			  request.getRequestDispatcher("page/addBook.jsp?flag=0").forward(request,response); 
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
package com.zhou.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.zhou.web.domain.Category;
import com.zhou.web.service.UserService;
import com.zhou.web.service.impl.UserServiceImpl;

/**
 * AddCategoryServlet 添加分类的控制器
 */
@WebServlet("/AddCategoryServlet")
public class AddCategoryServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收数据
		String categoryId = request.getParameter("categoryId");//图书分类ID
		String categoryName = request.getParameter("categoryName");//分类名称
		
		//封装数据 
		Category category = new Category(categoryId,categoryName);
		
		//处理结果
		UserService userService = new UserServiceImpl();
		//获取当前图书分类集合categoryList
		List<Category> categoryList =(List<Category>) request.getServletContext().getAttribute("categoryList");
		//调用方法判断是否已经有相同的分类或者分类名称
		boolean flagAdd = userService.JudgeCategory(categoryList,category);
		
		//显示数据
		if(flagAdd) {
			//添加成功 重定向到图书分类管理页面
			response.sendRedirect(request.getContextPath() + "/page/categoryList.jsp");
		}else {
			//添加失败
			//设置失败标识
			request.setAttribute("flag", "0");
			System.out.println("失败 重复");
			request.getRequestDispatcher("/page/addCategory.jsp").forward(request, response);
			//response.sendRedirect(request.getContextPath() + "/page/addCategory.jsp");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
package com.zhou.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.zhou.web.domain.Category;
import com.zhou.web.service.UserService;
import com.zhou.web.service.impl.UserServiceImpl;

/**
 * DeleteCategoryServlet 删除图书分类的控制
 */
@WebServlet("/DeleteCategoryServlet")
public class DeleteCategoryServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收数据
		String categoryId = request.getParameter("categoryId");
		
		//处理数据
		UserService userService = new UserServiceImpl();
		//获取图书分类列表
		List<Category> categoryList = (List<Category>) request.getServletContext().getAttribute("categoryList");
		//删除图书
		userService.DeleteCategory(categoryList,categoryId);
		
		//显示结果
		//重定向到图书分类管理页面
		response.sendRedirect(request.getContextPath() + "/page/categoryList.jsp");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
package com.zhou.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.zhou.web.domain.User;
import com.zhou.web.service.UserService;
import com.zhou.web.service.impl.UserServiceImpl;

/**
 * LonginServlet 登入注册的判断的控制器
 */
@WebServlet("/LonginServlet")
public class LonginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收验证码并进行校验
		String verifyCode = request.getParameter("verifyCode");
		//先获取session中保存的验证码的信息
		String code =(String) request.getSession().getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);
		
		//equalsIgnoreCase 忽略大小写比较
		if(verifyCode==null || !verifyCode.equalsIgnoreCase(code)) {
			request.setAttribute("msg", "验证码输入不正确!");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
			//response.sendRedirect(request.getContextPath()+"/login.jsp");
			return;//结束下面的代码
		}
		
		//接收用户名与密码并判断
		String username =  request.getParameter("username");
		String password = request.getParameter("password");
		
		//封装数据
		User user = new User(username,password);
		
		//处理数据
		UserService userService = new UserServiceImpl();
		//.获取全局域ServletContext中用户集合 并调用业务逻辑处理接口中的方法进行判断
		List<User> listUser =(List<User>) request.getServletContext().getAttribute("userList");
		User existUser =  userService.login(listUser, user);
		
		if(existUser == null) {
			request.setAttribute("msg", "用户名或密码错误!");
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}else {
			//登录成功 再session设置一个标志表明用户已经登录
			request.getSession().setAttribute("loginName", existUser);
			//重定向到首页
			response.sendRedirect(request.getContextPath()+"/page/categoryList.jsp");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}


正在回答

登陆购买课程后可参与讨论,去登陆

8回答

同学你好,检查同学代码,发现同学搞混了一个知识点:

http://img1.sycdn.imooc.com//climg/5df1f127097a8bf600000000.jpg

url是上传文件的具体地址,在FileOutputStream中使用,而urlPath是上传成功后的服务器图片地址,将这个urlPath地址赋值给book中的地址属性。

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

  • jia_蛙 提问者 #1
    嗯 谢谢老师
    2019-12-12 16:36:52
提问者 jia_蛙 2019-12-12 16:28:07

http://img1.sycdn.imooc.com//climg/5df1f99609e2903416200681.jpg

http://img1.sycdn.imooc.com//climg/5df1f9af09ba1d4612790670.jpg

我也刚刚发现这个问题,现在已经修正了,图片已经可以正常显示,就是图片很大,这是因为我图片
大小的原因还是我的css样式没有作用到这里吗


  • 提问者 jia_蛙 #1
    老师 我直接根据前一张图片设置行内样式了 可以达到效果一样,但是图片有点压缩,应该没关系把
    2019-12-12 16:35:50
  • 好帮手慕小班 回复 提问者 jia_蛙 #2
    同学你好,1、图片并没有设置css样式,所以默认是按照图片原始大小来展示。2、图片本身太大,设置样式小一点后,可能造成图片的展示效果与原图有差别,但是这个与本章节的作业考察点无关,所以不用过于关注这个内容。如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
    2019-12-12 16:50:39
  • 提问者 jia_蛙 回复 好帮手慕小班 #3
    谢谢老师为我解答!幸苦了
    2019-12-12 17:42:42
提问者 jia_蛙 2019-12-12 15:02:25
package com.zhou.web.util;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.zhou.web.domain.Books;
/**
 * UploadBookImg 将图片存入服务器的工具类
 * @author 25677
 *
 */
public  class UploadBookImgUtil {
	public static Books uploadImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String urlPath = "";//图片地址
		Books books = new Books();
		
		//1.创建磁盘文件项工厂   (如果我们使用空构造的话,缓存区和临时文件存放的位置都会有一个默认值)
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		
		//2.创建核心解析类 (构造方法需要传入一个磁盘文件项工厂)
		ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
		
		//3.解析请求对象,将请求分成几个部分FileItem文件项:其中包括普通项、文件上传项
	
		try {
			List<FileItem> list = fileUpload.parseRequest(request);
			//4.遍历集合获得每个部分的对象
			for(FileItem fileItem:list) {
				String name = "";//普通项的名称
				String value = "";//普通项的值
				
				//判断时普通项还是文件上传项
				if(fileItem.isFormField()) {
					//普通项目
					
					//获取普通项的名称
					name = fileItem.getFieldName();
					//获取普通项的值
					value =  fileItem.getString("UTF-8");
					if(name.equals("bookId")) {
						books.setBookId(value);
					}else if(name.equals("bookName")) {
						books.setBookName(value);
					}else if(name.equals("categoryId")) {
						books.setBookCategory(value);
					}else if(name.equals("bookPrice")) {
						books.setBookPrice(Double.parseDouble(value));
					}else if(name.equals("remarks")) {
						books.setBookNotes(value);
					}else if(name.equals("bookPic")) {
						books.setBookPath(value);
					}
					
				}else{
					//文件上传项目
					//获得文件的名称
					String fileName = fileItem.getName();
					//适用工具类生成唯一的文件名
					String uuidFileName = UploadUtils.getUuidFileName(fileName);
					//获得文件的输入流 相当于获取文件具体的内容
					InputStream is =  fileItem.getInputStream();
					//设置需要将文件写入到服务器的某个路径
					//服务器内图片的地址
					urlPath = request.getContextPath() + "/uploadImg/" + uuidFileName;
					
					//创建输出流与输出流进行对接:
					OutputStream os = new FileOutputStream(urlPath);
					int len = 0;
					byte[] b = new byte[1024];
					while((len = is.read(b)) != -1) {
						os.write(b,0,len);
					}
					is.close();
					os.close();
				}
				
				
			}
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
		
		
		//将服务器中的图片地址重新设置
		books.setBookPath(urlPath);
		
		//将图片地址返回回去
		return books;
	}
}

http://img1.sycdn.imooc.com//climg/5df1e50409a311ac16720517.jpghttp://img1.sycdn.imooc.com//climg/5df1e50f097de9b211830419.jpg

系统找不到指定的路径。 现在图片也上传不到服务器的这个uploadImg这个文件中了


好帮手慕小班 2019-12-12 14:32:16

同学你好,在页面中图片地址是以这样的形式书写的 

        <img src="/regist_login/upload/a.jpg">

对应在页面中,例如:

http://img1.sycdn.imooc.com//climg/5df1dd410990b97711480465.jpg

所以在UploadBookImgUtil中向bookPath属性写入的内容为

http://img1.sycdn.imooc.com//climg/5df1ddc009f8fd2f07950127.jpg

在页面中书写的url地址

http://img1.sycdn.imooc.com//climg/5df1deb7094dde2004170042.jpg

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

  • 提问者 jia_蛙 #1
    老师麻烦看一下
    2019-12-12 15:02:42
提问者 jia_蛙 2019-12-12 12:12:51
package com.zhou.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.zhou.web.domain.Books;
import com.zhou.web.service.UserService;
import com.zhou.web.service.impl.UserServiceImpl;
import com.zhou.web.util.UploadBookImgUtil;

/**
 * AddBooksServlet 添加图书的控制器
 */
@WebServlet("/AddBooksServlet")
public class AddBooksServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
          //使用工具类接收并封装数据       
          Books books = UploadBookImgUtil.uploadImg(request,response); 
          
          //处理数据 
          UserService userService = new UserServiceImpl();
          //获取在初始化时存入在servletContext全局上下文中存在booksList集合
          List<Books> booksList = (List<Books>) request.getServletContext().getAttribute("booksList");
          //调用方法判断新添加的图书是否已经在图书集合中存在: 判断条件为图书编号不同即可
          Boolean addFlag = userService.JudgeBooks(booksList,books);
          
          //显示数据 
          if(addFlag) { 
              //添加成功 重定向到图书信息管理页
              response.sendRedirect(request.getContextPath() + "/page/bookList.jsp"); 
          }else{ 
              //添加失败 
              //请求转发到增加图书addBook.jsp 并设置flag 提示失败
              request.getRequestDispatcher("page/addBook.jsp?flag=0").forward(request,response); 
        }
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

}
package com.zhou.web.util;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.zhou.web.domain.Books;
/**
 * UploadBookImg 将图片存入服务器的工具类
 * @author 25677
 *
 */
public  class UploadBookImgUtil {
    public static Books uploadImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String url = "";//需要返回的图片地址
        Books books = new Books();
        
        //1.创建磁盘文件项工厂   (如果我们使用空构造的话,缓存区和临时文件存放的位置都会有一个默认值)
        DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
        
        //2.创建核心解析类 (构造方法需要传入一个磁盘文件项工厂)
        ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
        
        //3.解析请求对象,将请求分成几个部分FileItem文件项:其中包括普通项、文件上传项
    
        try {
            List<FileItem> list = fileUpload.parseRequest(request);
            //4.遍历集合获得每个部分的对象
            for(FileItem fileItem:list) {
                String name = "";//普通项的名称
                String value = "";//普通项的值
                
                //判断时普通项还是文件上传项
                if(fileItem.isFormField()) {
                    //普通项目
                    
                    //获取普通项的名称
                    name = fileItem.getFieldName();
                    //获取普通项的值
                    value =  fileItem.getString("UTF-8");
                    if(name.equals("bookId")) {
                        books.setBookId(value);
                    }else if(name.equals("bookName")) {
                        books.setBookName(value);
                    }else if(name.equals("categoryId")) {
                        books.setBookCategory(value);
                    }else if(name.equals("bookPrice")) {
                        books.setBookPrice(Double.parseDouble(value));
                    }else if(name.equals("remarks")) {
                        books.setBookNotes(value);
                    }else if(name.equals("bookPic")) {
                        books.setBookPath(value);
                    }
                    
                }else{
                    //文件上传项目
                    //获得文件的名称
                    String fileName = fileItem.getName();
                    //适用工具类生成唯一的文件名
                    String uuidFileName = UploadUtils.getUuidFileName(fileName);
                    //获得文件的输入流 相当于获取文件具体的内容
                    InputStream is =  fileItem.getInputStream();
                    //设置需要将文件写入到服务器的某个路径
                    //表示获取到web目录下的uploadImg文件的绝对路径
                    String path = request.getServletContext().getRealPath("/uploadImg");
                    //图片地址
                    url = path + "\\" + uuidFileName;
                    
                    //创建输出流与输出流进行对接:
                    OutputStream os = new FileOutputStream(url);
                    int len = 0;
                    byte[] b = new byte[1024];
                    while((len = is.read(b)) != -1) {
                        os.write(b,0,len);
                    }
                    is.close();
                    os.close();
                }
                
                
            }
        } catch (FileUploadException e) {
            e.printStackTrace();
        }
        
        
        //将服务器中的图片地址重新设置
        books.setBookPath(url);
        
        //将图片地址返回回去
        return books;
    }
}
package com.zhou.web.listener;

import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

import com.zhou.web.domain.Books;
import com.zhou.web.domain.Category;
import com.zhou.web.domain.User;
/**
 * InitServletContextListener 启动程序时,初始化数据
 * @author 25677
 *
 */

//使用注解的方式对监听器进行配置
@WebListener
public class InitServletContextListener implements ServletContextListener {

    @Override
    public void contextDestroyed(ServletContextEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void contextInitialized(ServletContextEvent event) {
        
        //1.初始化账户列表参数
        //创建一个list集合用来保存用户
        List<User> userList = new ArrayList<User>();
        
        /*
         * 假设管理员账号比较隐私 不允许别人创建等操作 我们现在web.xml中配置好管理员账号
         * 然后再程序初始化的时候获取到保存到list集合中,根据用户登录时输入的数据进行比较
         */
        String account  =  event.getServletContext().getInitParameter("account");
        String password  =  event.getServletContext().getInitParameter("password");
        
        //创建User对象 并将获得的管理员输入填入其中
        User user = new User(account,password);
        
        //将user对象填入userlist中
        userList.add(user);
        
        //将userList存入ServletContext全局对象中
        event.getServletContext().setAttribute("userList", userList);
        
        
        //2.初始化图书分类列表参数
        //创建默认分类数据
        Category category = new Category("ca0001","计算机类");
        //创建集合
        List<Category> categoryList = new ArrayList<Category>();
        //往集合中添加数据分类
        categoryList.add(category);
        //将集合对象categoryList存入ServletContext全局对象中
        event.getServletContext().setAttribute("categoryList", categoryList);
        
        
        //3.初始化图书列表
        Books books = new Books("book0001","Java基础","计算机类",29D,"img/g1.jpg","第一本");
        //创建集合
        List<Books> booksList= new ArrayList<Books>();
        //往集合中添加数据分类
        booksList.add(books);
        //将集合对象booksList存入ServletContext全局对象中
        event.getServletContext().setAttribute("booksList", booksList);
        
    }
}


老师 我修改了一下工具类,让其直接返回一books对象,boo是对象中的图片地址是tomcat中存储
图片的地址,现在tomcat的图片地址中也能显示上传的图片,但是我遇到一个问题:因为我在监听器
初始化的时候是这样初始化的:
Books books = new Books("book0001","Java基础","计算机类",29D,"img/g1.jpg","第一本");
然后再显示的bookList.jsp中是这样显示的:
<img src="${pageContext.request.contextPath}/${c.bookPath}">
但是如果我使用服务器的地址的话,我新添加的图片就显示不出来,地址会报错,我试了很久,无论
是修改监听器中的图片初始化中books中的地址的格式,还是jsp中拼接,我都失败了,麻烦老师帮
我看一下,我只修改了sevlet和工具类,我都贴出来了,其他都没修改,和之前贴出来的一样,麻烦
您了

http://img1.sycdn.imooc.com//climg/5df1b39a095c809618880818.jpg

好帮手慕小班 2019-12-11 19:18:35

同学你好,1、同学的表单提交形式是 multipart/form-data,设置"multipart/form-data"后,将表单中的数据变成二进制数据进行上传,所以这时如果用request是无法直接获取到相应表单的值,Double.parseDouble(null)就会报出空指针异常的错误。

    2、建议同学根据3-4 文件上传代码的实现,整体修改添加图书的Servlet,例如:

http://img1.sycdn.imooc.com/climg/5df0d0200959475112300510.jpg

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

  • 提问者 jia_蛙 #1
    麻烦老师看一下
    2019-12-12 12:13:08
提问者 jia_蛙 2019-12-11 18:46:44
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录</title>
<link rel="stylesheet" href="${pageContext.request.contextPath}/css/login.css">
		<script type="text/javascript">
       	 	function data_Judge(){
    			// 获得用户名的值
    			var username = document.getElementById("name").value;
    			if(username == null || username==""){
    				alert("用户名不能为空");
    				return false;
    			}
    			// 获得密码的值
    			var password = document.getElementById("pwd").value;
    			if(password == null || password==""){
    				alert("密码不能为空");
    				return false;
    			}
       	 		//获得验证码的值
       	 		var code = document.getElementById("code").value;
       	 		var length = code.length;
       	 		if(length != "5"){
       	 			alert("验证码格式有误");
       	 			return false;
       	 		}
    			
       	 	}
       	 
       	 //点击更换图片函数
       	 function changeImg(){
 			var codeImg = document.getElementById("codeImg");
 			/* 使用第三方直接获取验证码 */
 			codeImg.src="${pageContext.request.contextPath}/KaptchaServlet?time=" + new Date().getTime();
 		}
        </script>
</head>
<body>
	<div class="login">
		<div class="header">
			<h1>
				<a href="/login.do">登录</a>
				<!-- 如果登入失败 msg就会被赋值并提示错误信息 -->
				<p style="color:red">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${ msg }</p>
			</h1>
			<button></button>
		</div>
		<form action="${pageContext.request.contextPath}/LonginServlet" method="post" onsubmit="return data_Judge()">
			<div class="name">
				<input type="text" id="name" name="username">
				<p></p>
			</div>
			<div class="pwd">
				<input type="password" id="pwd" name="password">
				<p></p>
			</div>
			<div class="code">
				<input type="text" id="code" name="verifyCode" style="width: 150px">
				&nbsp;&nbsp;&nbsp;&nbsp; <img id="codeImg" onclick="changeImg()" src="${pageContext.request.contextPath}/KaptchaServlet" style="width: 150px; height: 42px; vertical-align: middle;">
				<p></p>
			</div>
			<div class="btn-red">
				<input type="submit" value="登录" id="login-btn">
			</div>
		</form>
	</div>
</body>
</html>
老师 ,我在添加图书的AddBooksServlet中 把前端数据接收过来,然后再用工具类根据地址
前端穿过来的图片存入到服务器中,让后再返回一个图片再服务器的地址,然后将再sevlet中获得
的其他前端数据和其返回过来的服务器中的图片地址封装成user,当我完成这一步时,只要一点击
前端页面的添加,它就报空指针异常,我看了一下报错的信息 ,看不懂,但是只出现了一个类是我
写的AddBooksServlet.java:30)AddBooksServlet.java:63),AddBooksServlet第三十行我是我
根据前端获取的值转成double的值,我之前设置的时候都没问题。不知道问题出在哪里。麻烦老师
帮我看看


http://img1.sycdn.imooc.com//climg/5df0c90f091beae913430563.jpg

提问者 jia_蛙 2019-12-11 18:45:58
package com.zhou.web.util;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
/**
 * UploadBookImg 将图片存入服务器的工具类
 * @author 25677
 *
 */
public  class UploadBookImgUtil {
	public static String uploadImg(HttpServletRequest request, HttpServletResponse response) throws IOException {
		String url = "";//需要返回的图片地址
		
		//1.创建磁盘文件项工厂   (如果我们使用空构造的话,缓存区和临时文件存放的位置都会有一个默认值)
		DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
		
		//2.创建核心解析类 (构造方法需要传入一个磁盘文件项工厂)
		ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
		
		//3.解析请求对象,将请求分成几个部分FileItem文件项:其中包括普通项、文件上传项
	
		try {
			List<FileItem> list = fileUpload.parseRequest(request);
			//4.遍历集合获得每个部分的对象
			for(FileItem fileItem:list) {
				//判断时普通项还是文件上传项
				if(!fileItem.isFormField()) {
					//文件上传项目
					//获得文件的名称
					String fileName = fileItem.getName();
					//适用工具类生成唯一的文件名
					String uuidFileName = UploadUtils.getUuidFileName(fileName);
					//获得文件的输入流 相当于获取文件具体的内容
					InputStream is =  fileItem.getInputStream();
					//设置需要将文件写入到服务器的某个路径
					//表示获取到web目录下的uploadImg文件的绝对路径
					String path = request.getServletContext().getRealPath("/uploadImg");
					//图片地址
					url = path + "\\" + uuidFileName;
					
					//创建输出流与输出流进行对接:
					OutputStream os = new FileOutputStream(url);
					int len = 0;
					byte[] b = new byte[1024];
					while((len = is.read(b)) != -1) {
						os.write(b,0,len);
					}
					is.close();
					os.close();
				}
			}
			
			
		} catch (FileUploadException e) {
			e.printStackTrace();
		}
		
		//将图片地址返回回去
		return url;
	}
}
package com.zhou.web.util;

import java.util.UUID;

/**
 * UploadUtils 解决文件名重名的方法
 * @author 25677
 *
 */
public class UploadUtils {
	
	/**
	 * 解决多个用户选择头像文件名重名覆盖的问题
	 * @param fileName 原来的文件名
	 * @return 新的不重名的文件名
	 */
	public static String getUuidFileName(String fileName) {
		//解决文件重名的问题:
		//a.jpg --> 获得后缀名.jpg --> 生成一段随机字符串将a替换掉 xxfsaf.jpg
		
		//对原来文件名进行替换
		//1.首先使用lastIndexOf找到  点 出现的位置 (lastIndexOf:是从右向左查某个指定的字符串在字符串中最后一次出现的位置)
		int ind  = fileName.lastIndexOf(".");
		
		//2.根据点出现的位置开始截取 (substring() 方法用于提取字符串中介于两个指定下标之间的字符。)
		String exName = fileName.substring(ind);
		
		//3.生成随机字符串
		//UUID 是 通用唯一识别码,作用是让每一个元素都有一个唯一辨识的信息。因为UUID会有-,如果你去掉可以使用replace替换
		String uuidFileName = UUID.randomUUID().toString().replace("-", "") + exName;
		
		//4返回新生成的文件名
		return uuidFileName;
	}
	
	//测试
	/*
	 * public static void main(String[] args) {
	 * System.out.println(UploadUtils.getUuidFileName("a.jpg")); }
	 */
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!--引入JSTL标签库  prefix表示为这个JSTL核心库声明一个前缀 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>新建图书信息</title>
        <link rel="stylesheet" href="${pageContext.request.contextPath}/css/bootstrap.min.css">
        <link rel="stylesheet" href="${pageContext.request.contextPath}/css/add.css">
        <%
			String flag = request.getParameter("flag");
		%>
		
        <script type="text/javaScript">
        	/* 根据响应回来的flag判断图书是否已经存在 判断标志位:图书ID是否相同 */
	        var flag = '<%=flag%>';
	    	if("0"==flag){
	    		alert("该图书已存在,请更改图书ID");
	    	}

        	
        	/* 表单提交的校验方法 */
        	function validate_form(){
        	 /* 对图书编号进行校验  */	
        		var bookId = document.getElementById("bookId").value;
        		var regex1 = /^book[0-9]{4}$/;
	        	 if(bookId == ""){
	        		 alert("图书编号不能为空");
	        		 return false;
	        	 }else if(!regex1.test(bookId)){
	        		 alert("图书编号请满足:bookxxxx xxxx为4为数字");
	        		 return false;
	        	 }
	        		
        	 /* 对书名进行校验  */
        		 var bookName = document.getElementById("bookName").value;
        		 console.log("bookName: " + bookName);
	        	 if(bookName == ""){
	        		 alert("图书名不能为空");
	        		 return false;
	        	 }
        	 
        	 /* 对分类进行校验 */
        	 	var categoryId = document.getElementById("categoryId").value;
	        	 if(categoryId == ""){
	        		 alert("图书分类未选中");
	        		 return false;
	        	 }
        	 
        	 /* 对价格进行校验 */
	        	  var bookPrice =  document.getElementById("bookPrice").value;
	        	  var regex2 = /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/;
	        	  if(bookPrice == ""){
	        		  alert("请输入价格!");
	        	  	  return false;
	        	  }else if(!regex2.test(bookPrice)){
	        		  alert("价格格式错误!");
	        	  	  return false;
	        	  }
        	 

	         /*  对图书封面进行校验 */
	          	var bookPic = document.getElementById("bookPic").value;
	          	if(bookPic == ""){
	          		alert("请选择图书封面");
	          		return false;
	          	}
	          	
	         /* 对备注进行校验 */
	          	var remarks = document.getElementById("remarks").value;
	          	if(remarks == ""){
	          		alert("请填写备注");
	          		return false;
	          	}
        	}
        </script>
    </head>
    <body>
        <nav class="navbar navbar-default">
            <div class="container">
                <div class="navbar-header">
                    <a class="navbar-brand" href="/dept/list.do">
                        图书信息管理
                    </a>
                </div>
            </div>
        </nav>
        <div class="container">
            <div class="jumbotron">
                <h1>Hello, XXX!</h1>
                <p>请小心地新增图书信息,要是建了一个错误的就不好了。。。</p>
            </div>
            <div class="page-header">
                <h3><small>新建</small></h3>
            </div>
            <form enctype="multipart/form-data"  class="form-horizontal" onsubmit="return validate_form()" action="${pageContext.request.contextPath}/AddBooksServlet" method="post" >
                <div class="form-group">
                    <label for="name" class="col-sm-2 control-label">图书编号 :</label>
                    <div class="col-sm-8">
                        <input name="bookId" class="form-control" id="bookId">
                    </div>
                </div>
                <div class="form-group">
                    <label for="name" class="col-sm-2 control-label">图书名称 :</label>
                    <div class="col-sm-8">
                        <input name="bookName" class="form-control" id="bookName">
                    </div>
                </div>
                <div class="form-group">
                    <label for="categoryId" class="col-sm-2 control-label">分类 :</label>
                    <select id="categoryId" name="categoryId" class="col-sm-2 form-control" style="width: auto;margin-left: 15px">
                        <c:forEach items="${applicationScope.categoryList}" var="c" varStatus="idx">
                              <option value='${c.categoryName}'>${c.categoryName}</option>
                        </c:forEach>
                    </select>
                </div>

                 <div class="form-group">
                    <label for="name" class="col-sm-2 control-label">价格 :</label>
                    <div class="col-sm-8">
                        <input name="bookPrice" class="form-control" id="bookPrice">
                    </div>
                  </div>
                   
                  <div class="form-group" >
                    <label for="name" class="col-sm-2 control-label">图书封面 :</label>
                    <input type="file" id="bookPic" name="bookPic" style="padding-left: 15px">
                  </div>

                  <div class="form-group">
                    <label for="name" class="col-sm-2 control-label">备注 :</label>
                    <div class="col-sm-8">
                        <input name="remarks" class="form-control" id="remarks">
                    </div>
                  </div>

                <div class="form-group">
                    <div class="col-sm-offset-2 col-sm-10">
                        <button type="submit" class="btn btn-primary">保存</button>&nbsp;&nbsp;&nbsp;
                    </div>
                </div>
            </form>
        </div>
        <footer class="text-center" >
            copy@imooc
        </footer>
    </body>
</html>




问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师