项目目次布局大抵如下:
正如我在上图红线画的三个对象:Dao、service、servlet 这三层是主要的布局,雷同 MVC 架构,Dao是模子实体类(逻辑层),service是处事层,servlet是视图层,三者协作配合完成项目。
这里的User是由user表来界说的一个类,再封装增删改查等操纵,实现从数据库查询与插入,修改与删除等操纵,并实现了分页操纵,也实现了将图片放随处事器上运行的结果。
Dao层:主要实现了User类的界说,接口IUserDao的界说与实现(UserDaoImpl);
service层:直接界说一个接口类IUserService,与IUserDao相似,再实现其接口类UserServiceImpl,直接实例化UserDaoImpl再挪用其要领来实现本身的要领,重用了代码。详见代码吧;
servlet层:起初是将表User 的每个操纵要领都界说成一个servlet 去实现,固然简朴,可是太多了,欠好打点,于是操作 基类BaseServlet 实现了“反射机制”,通过获取的 action 参数本身智能地挪用对应的要领,而UserServlet则详细实现本身的要领,以供挪用,利便很多,详见之前的博文或下述代码。
将文件上传到 tomcat 处事器的编译后运行的进程的某个文件要害要在每次编译后手动为其建设该文件夹来存放相应的上传文件,不然会导致每次重启 tomcat 处事器后该编译后的工程包围了原先的,导致上传文件存放的文件夹不存在,导致代码找不到该文件夹而报错,即上传不乐成。如下图所示:
主要是思量图片路径的问题,手工配置路径必定不能担保不反复,所以取到上传图片的后缀名后操作随机生成的随机数作为图片名,这样就不会反复名字了:
String extendedName = picturePath.substring(picturePath.lastIndexOf("."),// 截取从最后一个'.'到字符串竣事的子串。 picturePath.length()); // 把文件名称重定名为全球独一的文件名 String uniqueName = UUID.randomUUID().toString(); saveFileName = uniqueName + extendedName;// 拼接路径名
增加用户时代码如下:
// 增 public void add(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println("add要领被挪用"); // 获取数据 int id = 0; String username = null; String password = null; String sex = null; Date birthday = null; String address = null; String saveFileName = null; String picturePath = null; // 获得表单是否以enctype="multipart/form-data"方法提交 boolean isMulti = ServletFileUpload.isMultipartContent(request); if (isMulti) { // 通过FileItemFactory获得文件上传的工具 FileItemFactory fif = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(fif); try { List<FileItem> items = upload.parseRequest(request); for (FileItem item : items) { // 判定是否是普通表单控件,可能是文件上传表单控件 boolean isForm = item.isFormField(); if (isForm) {// 是普通表单控件 String name = item.getFieldName(); if ("id".equals(name)) { id = Integer.parseInt(item.getString("utf-8")); System.out.println(id); } if ("sex".equals(name)) { sex = item.getString("utf-8"); System.out.println(sex); } if ("username".equals(name)) { username = item.getString("utf-8"); System.out.println(username); } if ("password".equals(name)) { password = item.getString("utf-8"); System.out.println(password); } if ("birthday".equals(name)) { String birthdayStr = item.getString("utf-8"); SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd"); try { birthday = sdf.parse(birthdayStr); } catch (ParseException e) { e.printStackTrace(); } System.out.println(birthday); } if ("address".equals(name)) { address = item.getString("utf-8"); System.out.println(address); } if ("picturePath".equals(name)) { picturePath = item.getString("utf-8"); System.out.println(picturePath); } } else {// 是文件上传表单控件 // 获得文件名 xxx.jpg String sourceFileName = item.getName(); // 获得文件名的扩展名:.jpg String extendedName = sourceFileName.substring( sourceFileName.lastIndexOf("."), sourceFileName.length()); // 把文件名称重定名为全球独一的文件名 String uniqueName = UUID.randomUUID().toString(); saveFileName = uniqueName + extendedName; // 获得上传随处事器上的文件路径 // C:\\apache-tomcat-7.0.47\\webapps\\taobaoServlet4\\upload\\xx.jpg String uploadFilePath = request.getSession() .getServletContext().getRealPath("upload/"); File saveFile = new File(uploadFilePath, saveFileName); // 把生存的文件写出随处事器硬盘上 try { item.write(saveFile); } catch (Exception e) { e.printStackTrace(); } } } } catch (NumberFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (FileUploadException e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 2、封装数据 User user = new User(id, username, password, sex, birthday, address, saveFileName); // 3、挪用逻辑层API IUserService iUserService = new UserServiceImpl(); // 4、节制跳转 HttpSession session = request.getSession(); if (iUserService.save(user) > 0) { System.out.println("添加新用户乐成!"); List<User> users = new ArrayList<User>(); users = iUserService.listAll(); session.setAttribute("users", users); response.sendRedirect("UserServlet?action=getPage"); } else { System.out.println("添加新用户失败!"); PrintWriter out = response.getWriter(); out.print("<script type='text/javascript'>"); out.print("alert('添加新用户失败!请重试!');"); out.print("</script>"); } }