简介
这两个项目是前期所学的知识综合,结合MVC思想完成的小项目。这里只写了类似伪代码的思路。没有提供代码,因为代码很多,没有思路来得实际。做完这两个项目心得就是,初期学这个没有一下敲出来的。只有不断的反复练习才能掌握
用户注册案例
1. 搭建环境 1.1 导开发包 dom4j开发包 BeanUtils开发包/logging jstl开发包 1.2 创建组织包 com.itheima.domain com.itheima.dao com.itheima.dao.impl com.itheima.service com.itheima.service.impl com.itheima.web.controller com.itheima.utils junit.test WEB-INF/jsp 放所有网站jsp 1.3 创建代表数据库xml文件 开发前奏 导包 BeanUtils/logging Dom4J/jaxen jstl/standard 1. users.xml作为数据库存储文件 2. 定义User实体类 private String id; private String username; private String password; private String email; private Date birthday; private String nickname; 3. 操作实体类 4. 定义接口UserDao-->定义实现类UserDaoImpl(判断是否存在这个用户) -->定义工具类操作xml文件Dom4JUtils 5. 定义业务逻辑,为上一层提供服务UserService接口--->UserServiceImpl 界面: 主页index.jsp(判断是否有user登录c:if标签) 登录页login.jsp(隐藏域设置操作信息,目的为了地址栏不显示请求参数) 注册页register.jsp (注册表单 value-<span区域显示错误信息>)/隐藏域设置id UserFormBean类 private String id; private String username; private String password; private String repass; private String email; private String birthday; private String nickname; private Map<String,String> errorMsg = new HashMap<String,String>(); validate()方法 ControllerServlet类 1. 解决表单乱码问题 2. 获取操作类型参数 2.1 用户登录操作 2.1.1 获取用户名和密码的值 2.1.2 调用业务逻辑(判断是否登录成功) 2.1.3 如果登录成功,将用户信息存储session中,重定向首页 否则失败,提示信息,并跳到登录 2.2 注册操作 2.2.1 注册页面输入的值填充到UserFormBean对象中 建立一个WebUtils工具类,定义填充的fillBean方法 2.2.2 验证业务实体类(formBean类)是否有效(validate),不为空说明有问题 将formbean设置request域中--->转发到register.jsp当前页面 方法结束 2.2.3 ConvertUtils---(DateLocaleConverter,Date.class) 将formBean的数据拷贝到user中(拷贝前要注册日期,否则类型不一致) 注册日期方式2. ConvertUtils中register方法重写Converter方法 1. 判断是否为空 2. 强转string类型判断是否为"" 3. 创建一个日期格式化类 4. 然后解析成日期格式返回 2.2.4 业务逻辑实现注册用户,提示注册成功,1秒后跳到登录页面 否则就是用户名已存在,将错误信息添加到集合中,在request域中设置formBean,转发到当前注册页面 2.3 注销操作 2.3.1 将用户信息移除 重定向到首页 总结: 涉及到request域使用转发 涉及到session域使用重定向 有跳转需求设置刷新头信息 页面设计 1. 主页index.jsp使用标签库中c:if标签判断user是否为空,如果不为空就显示欢迎提示 如果为空就显示登录和注册提示 2. 登录页login.jsp,登录表单提交到控制器中,隐藏域设置提交方式 3. 注册页register.jsp, 日期控件使用方式 3.1 Birthday-Calendar.js日历控件的使用 <script type="text/javascript" src="${pageContext.request.contextPath}/js/Birthday-Calendar.js"></script> <input readonly="readonly" οnclick="new Calendar().show(this);" type="text" name="birthday" /> 3.2 span区域和输入框中使用el表达式获取session中的值
购物车代码思路
前期准备 DB/domain/dao/service/controller/UI 2. 开发dao 3. 开发service 4. 开发web 1. 用DB类模拟书籍数据库 1.1 DB类 Map--->LinkedHashMap map.put("1", new Book("1","javaweb开发","老张",38,"一本好书")); map.put("2", new Book("2","jdbc开发","老黎",18,"一本好书")); map.put("3", new Book("3","ajax开发","老毕",328,"一本好书")); map.put("4", new Book("4","jbpm开发","老方",58,"一本好书")); map.put("5", new Book("5","struts开发","老张",28,"一本好书")); map.put("6", new Book("6","spring开发","老黎",98,"一本好书")); ---getAll()方法--获取所有书籍 1.2 ----Book类----- private String id; private String name; private String author; private int price; private String description; 2. 定义数据访问层的 类BookDaoImpl,其实就是两个方法 2.1 获取所有书籍返回map 2.2 根据id返回这本书 3. 购物车类Cart/ private Map<String,CartItem> map = new LinkedHashMap();(存储书的id和购物项) private double price; 购物车所有商品的总价 getPrice()----totalprice--->遍历map集合中所有购买项,每个购买项相加得到总价 public void add(Book book) 通过书的id获取购物项---map.get(book.getId()); 如果购物项为空 创建一个购物项-->将book添加到购物项(setBook)--->数量quantity为1 否则 直接修改数量setQuantity(item.getQuantity()+1); 4. 购物项类CartItem private Book book; private int quantity; 注意在设置数量时,同时要修改价格 price = getPrice()*quantity private double price; 5. 业务逻辑处理 BusinessServiceImpl类 1. 获取所有书籍/通过书籍id查找书 2. 删除购物车中的购物项--id,card 3. 清空购物车cart 4. 修改购物车中的数量--首先根据指定id得到购物项,然后在购物项中修改数量id,cart,quantity 6. UI页面转发类 ListCartUIServlet 转发到购物车页面getRequestDispatcher("/WEB-INF/jsp/listcart.jsp").forward(); 7. Web控制层写个总控制器ControllerServlet 1). 首先将客户端请求的操作类型获取到使用op保存 2). 通过session域获取购物车(购物车在购买时创建) 3). 获取请求书籍的id,方便操作这本书籍 if("showbooks".equals(op)) { showbooks(request,response); request.getRequestDispatcher("/WEB-INF/jsp/listbook.jsp").forward(request, response); return; } else if("buy".equals(op)) { buy(request,response, cart,id); } else if("change".equals(op)) { change(request,response,cart,id); } else if("delete".equals(op)) { delete(request,response,cart,id); } else if("clear".equals(op)) { clear(request,response,cart); } 7.1 请求显示所有书籍showBooks 获取所有书的集合,将集合设置到request域中 重定向到listbook.jsp页面上 7.2 请求购买操作类型buy 2). 业务逻辑层通过请求的id实现查找书籍 3). 通过session域得到购物车 4). 如果购物车为空,创建购物车,将该购物车设置到session域中 5). 把书籍添加到购物车中 7.3 请求删除类型 3). 业务逻辑实现通过id删除购物项 7.4 请求清空类型 2). 业务逻辑实现通过购物车清空购物车所有书籍 7.5 请求修改类型 1). 获取修改的数量 3). 业务逻辑实现通过购物车,id,修改数量 页面设计 1. index.jsp浏览书籍-->超链接到-->ControllerServlet类,请求参数为showBooks 2. listbook.jsp书籍页面-->*头部*:书名/作者/售价/描述/操作 遍历map集合显示所有书籍:(操作-->超链接到购买页将id发给ControllerServlet类,请求参数为buy) 3. 购物车页面listcart.jsp 3.1 判断购物车是否有书籍,没有书籍就直接输出没有购买任何商品 3.2. 否则就将购物车表单详情显示出来 *头部*: 书名/作者/单价/数量/小计/操作 forEach遍历购物车中的书籍cart.map 1). *(操作-->删除操作-->(超链接javascript:void(0))-->点击事件deletItem(entry.key书的id传过去)) 通过window.confirm确定是否删除,若删除就window.location.href=ControllerServlet?id='"+id+"'",请求参数类型为delete 2). *****(quantity数量可以手工录入--->改变事件changeQuantity(this,书id,书数量)**** 1>.定义变量接收数量的值 判断录入的数量是否小于0 或者quantity!=parseInt(quantity), 若成立提示信息,将老值赋给value,直接返回 2>.window.confirm否则提示确认修改数量+quantity window.location.href若确认ControllerServlet?id="+id+"&quantity="+quantity;,请求参数类型为change 3).**尾部**: 总价---->cart.price (清空购物车超链接javascript:void(0))--->点击事件clearcart(); 通过window.confirm确定是否删除,若删除就window.location.href="ControllerServlet",请求参数类型为clear