我上传了需要用到的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)添加不单单是名字了 而且增加了外键的知识点
前台页面
- 先选个位置 ,然后点菜 结算 之类的业务
- 选择你要吃的菜 这里 类似"饿了么" 点餐
- 点击单个菜 还能进入详细介绍
- 购物车 显示你买的菜 且可以 动态修改 点击下单 生成清单显示(只留下结账按钮了 同时后端 会有数据 )
- 后台管理
详细分析
- 我们有些环境没有部署好 还不能进行开发这是开发的准备工作通常是大佬帮你搭建 什么包啊,页面啊,数据库版本等等.
一:静态页面转动态页面;
这是一个大量而简单的工作(多刷新)
二步:静态页面分类 建立 app前台/sys后台
sys后台下 public公共页面(bottom,left,right,top) 文件
页面需求分析完成后 我们就可以设计数据库了
- 如何进行数据库设计?
- 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;
未完待续…