zoukankan      html  css  js  c++  java
  • JavaWeb之项目练习(十)

    简介

    这两个项目是前期所学的知识综合,结合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" onclick="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,修改数量
    				
    	最后勿忘重定向listcart.jsp	
    	
    页面设计
    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
    		
  • 相关阅读:
    IE浏览器下报错: strict 模式下不允许一个属性有多个定义
    Vue 做的项目在IE下面打开一片空白解决方法
    小程序如何动态修改标题navigationBarTitleText
    小程序-for循环遍历的使用
    vue项目-打印页面中指定区域的内容(亲测有效!)
    vue省市区三级联动(高仿京东)
    vue-父组件向子组件传值
    Sea.js 手册与文档
    angular之模块开发二
    angular之跨域
  • 原文地址:https://www.cnblogs.com/codingpark/p/4251544.html
Copyright © 2011-2022 走看看