实训第六周/8/22/一个web项目的优化和升级(一)

我上传了需要用到的jar文件
在这里插入图片描述

前几天在做一个项目他的功能是:

在网页上读取数据库内容为前提 实现
用户模块: 用户登录,注册,忘记密码
信息管理模块 : 用户的信息 管理 如增 删 改 查(分为按照某个属性进行查询)

其中涉及的技术

util包:用户密码加密的MD5Utils.java
分页使用的 PageUtils.java
数据库连接池DBUtils.java ( ComboPooledDataSource )
过滤器技术:filter 编码统一处理 页面审核
单元测试 @Test junit.jar
文件上传技术
<c: 标签 jstl.jar/standard.jar包
监听器技术 未完成

文件上传
//1.创建工厂对象
		FileItemFactory factory=new DiskFileItemFactory();
		//2.获取文件上传的核心工具类
		ServletFileUpload upload=new ServletFileUpload(factory);
		//3.设置文件大小
		upload.setFileSizeMax(10*1024*1024); //单个文件
		upload.setSizeMax(50*1024*1024);//总文件大小
		upload.setHeaderEncoding("utf-8");
		
   if  (upload.isMultipartContent(request)) {
			Note note = new Note();
			List<FileItem> listItems = upload.parseRequest(request);
			
	for (FileItem fileItem :listItems) {
		//FileItem类的常用方法:
	    if (fileItem.isFormField()){
          //普通字段
	    	processFormFied(fileItem,note);
   			    	  
			    	  
	     } else {
		//处理文件上传
		processFileUpload(fileItem,note);
	     }
		
      }
	 noteServiceImpl.insert(note);
	 path="note?status=selectall&page=1&keyword="; 
	 request.getRequestDispatcher(path).forward(request, response);

public void processFileUpload(FileItem fileItem, Note note) {
		//处理文件上传  --->path
		String realPath = this.getServletContext().getRealPath("/upload");
		//将一个字符串分割为子字符串,然后将结果作为字符串数组返回。
		String name=fileItem.getName().split("\\.")[1];
		String fullName="";
		if(name!=null&&!"".equals(name)){
			fullName = UUID.randomUUID().toString()+"."+name;
		}
		File file=new File(realPath);
		//判断文件目录是否存在
		if(!file.exists()){
			file.mkdirs();
		}
		try {
			fileItem.write(new File(realPath,fullName));
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		fileItem.delete();//删除临时文件
		note.setImg(realPath+File.separator+fullName); //windows "/" linux(服务器)
		note.setImgUrl("/upload/"+fullName);
		
		
		
	}

	public void processFormFied(FileItem fileItem,Note note){
		
		
		String name=fileItem.getFieldName(); //getFieldName方法用于返回表单标签name属性的值。如上例中<input type="text" name="column" />的value。
		String value="";
		try {
			value=fileItem.getString("utf-8"); //value
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if("title".equals(name)){
			//将title的value存到note对象的属性中
			note.setTitle(value);
		}
		if("author".equals(name)){
			//将title的value存到note对象的属性中
			note.setAuthor(value);
		}
		if("content".equals(name)){
			//将title的value存到note对象的属性中
			note.setContent(value);
		}
	}

// 分页应用 在查询所有数据时
 String pageNo=request.getParameter("page");
		
		 if(pageNo==null ){//|| "undefined".equals(pageNo)
			 pageNo="1";
	
		 }
		//关键字
		 String keyword=request.getParameter("keyword");
		 //分类
		 String category=request.getParameter("col");
		 //category null.equals
		 if("".equals(category)||category==null){
			 category=null;
		 }
		 
		 //获取总记录数
		 int count=noteServiceImpl.getCount(category, keyword);
		 
		 PageUtils pageUtils=new PageUtils(count,pageNo,3);
		 int currentPage=pageUtils.getCurrentPage(); //当前页
		 //前台需要分页的信息
		 request.setAttribute("pageUtil", pageUtils);
		 
		 List<Note> all=noteServiceImpl.queryByLike(category, keyword, (currentPage-1)*pageUtils.getPageSize(), pageUtils.getPageSize()) ;//limit i,j
		 request.setAttribute("all", all);
		path="list_notes.jsp";
	    request.getRequestDispatcher(path).forward(request, response);

factory(包)
这个包内是工厂方法 对dao.impl 的方法进行了处理

工厂模式:主要是生产某个类对实例对象的,达到解耦和隐藏实例对象的细节。之后我们会对他进行优化

开发流程

一套科学的开发流程 是否重要 它使得每一步工作都不是多余的 而且稳健成功率高 减少返工 如果开发中出现问题 我们也可以按步骤 的排查 因为你清楚 之前某个测试节点没问题 然后你做了什么 导致出错.

设计流程:
页面–分析需求 --功能点—设计数据库–映射表的实体对象–dao接口–dao实现类–
dao测试—业务层接口–业务实现层—业务层测试—查看页面传参数调用url(接口文档定义)—控制层–测试

这个流程可以完成一个模块功能,多个流程走完 项目也就完成了.
大体描述了一下重要的部分. 今天对之前的项目进行了优化

优化代码,它变得整洁, 量减少

优化方法无处 不体现着设计者的智慧和努力.

代码升为二级以后 发生了什么变化? 它是如何改变的?

在这里插入图片描述

这些改变 体现在一个新的项目上 <酒店管理>
一开始拿到手的是静态页面,即没有连接数据库 也没有业务逻辑
我们的工作也包含 将他转换为动态页面 和 后台编写

页面–需求–功能 分析

后端页面
  1. 餐桌管理:
    在这里插入图片描述
    [数据库内容]

[餐桌]的增删改查

  1. 菜系管理
    和餐桌类似
  2. 菜品管理
    在这里插入图片描述
    大致类似餐桌设计 区别
    1)添加不单单是名字了 而且增加了外键的知识点
    水水
前台页面
  1. 先选个位置 ,然后点菜 结算 之类的业务
    在这里插入图片描述
  2. 选择你要吃的菜 这里 类似"饿了么" 点餐
    在这里插入图片描述
  3. 点击单个菜 还能进入详细介绍
    在这里插入图片描述
  4. 购物车 显示你买的菜 且可以 动态修改 点击下单 生成清单显示(只留下结账按钮了 同时后端 会有数据 )
    在这里插入图片描述
  5. 后台管理
    在这里插入图片描述
详细分析

在这里插入图片描述

  1. 我们有些环境没有部署好 还不能进行开发这是开发的准备工作通常是大佬帮你搭建 什么包啊,页面啊,数据库版本等等.

一:静态页面转动态页面;
777
这是一个大量而简单的工作(多刷新)

二步:静态页面分类 建立 app前台/sys后台
sys后台下 public公共页面(bottom,left,right,top) 文件

页面需求分析完成后 我们就可以设计数据库了

  1. 如何进行数据库设计?
  • dinnertable

编号,桌名,预定状态 0/1 ,日期(datetime)
餐桌

  • food(他和foodtype的关系是多对一 一个菜删除对 菜系 不影响
    但是一个菜系 删除了 菜系下面的菜品就都没了)

编号,菜名,所属菜系,价格,描述,照片
在这里插入图片描述

  • foodtype
    在这里插入图片描述
  • orders 订单

编号,那个桌子,时间, 结算金额,状态在这里插入图片描述

  • orderdetail 订单详情

编号,订单id,菜品名字_id, 选了几个
在这里插入图片描述

数据库操作详解

MySQL数据表CRUD(増、删、改、查)操作
1、増
①insert into 数据表名字 values(值);
②insert into 表名(字段名,字段名……)values(值,值……); 值须和字段名形成一一对应关系。

2、删
①delete from 表名;删除所有数据
②delete from 表名 where 条件;带条件的删除

3、改
①update 表名 set 字段名=值;更改所有数据 (建议少用)
②update 表名 set 字段名=值 where 条件; (推荐使用)

4、查
①select * from 表名;查询所有
②select 字段名,字段名… from 表名;指定字段 (列)
③select *|字段名 from 表名 where 条件;按条件查找

④select *|字段名 from 表名[where 条件] order by 字段名 asc(升序)|desc(降序);按升序或者降序查看
⑤select *|字段名 from 表名[where 条件] order by 字段名 asc|desc,字段名 asc|desc;主排序和副排序

⑥select *|字段名 from 表名[where 条件] limit 数字;获取前面几条数据
⑦select *|字段名 from 表名[where 条件] limit start,length;获取指定开始位置到结束的数据

#添加语句 INSERT INTO student(name,age,sex,grade) VALUES(‘小红’,‘16’,‘女’,‘89’);
#修改语句UPDATE student SET sex=‘女’ WHERE id=3;

#DELETE FROM student WHERE id=1;
#查询 SELECT 属性 FROM student;
#查询指定列,查询时添加常量列(多显示一列’列表内容’ AS ‘属性’),查询时合并(xx+xx)列只能合并数值类型的字段
#查询时去除重复记录DISTINCT +属性 ,
#条件查询条件查询(where) 逻辑条件: and(与) or(或) |比较条件: > < >= <= = <>(不等于) between and (等价于>= 且 <=)|

#判空条件 – 判断null is nul – 判断空字符串 =’’ – 需求: 查询有地址的学生(不包括null和空字符串)is not null + <>

#模糊条件: like
– 通常使用以下替换标记:
– % : 表示任意个字符
– _ : 表示一个字符

#聚合查询 sum() 求和 avg() 平均 max() min() count() 有多少 对属性进行计算

#分页查询 SELECT * FROM student LIMIT 0,2; 第0行开始 列出2列 为第一页内容

#查询排序 表名+ order by 字段 asc (顺序,正序。数值:递增,字母:自然顺序(a-z))/desc (倒序,反序。数值:递减,字母:自然反序(z-a))

#分组查询-- 2.11 分组查询(group by)
– 需求: 查询男女的人数
– 预期结果:
– 男 3 — 女 2
– 1) 把学生按照性别分组(GROUP BY gender)
– 2) 统计每组的人数(COUNT(*))

#SELECT gender,COUNT(*) FROM student GROUP BY gender;

#分组查询后筛选
– 2.12 分组查询后筛选
– 需求: 查询总人数大于2的性别
– 1) 查询男女的人数
– 2)筛选出人数大于2的记录(having)
#— 注意: 分组之前条件使用where关键字,分组之前条件使用having关键字

#SELECT gender,COUNT() FROM student WHERE GROUP BY gender HAVING COUNT()>2;

未完待续…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值