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
		
时间: 2024-08-03 20:24:24

JavaWeb之项目练习(十)的相关文章

javaweb学习总结(二十八)——JSTL标签库之核心标签【转】

原文地址:javaweb学习总结(二十八)——JSTL标签库之核心标签 一.JSTL标签库介绍 JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的.使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码 二.JSTL标签库的分类 核心标签(用得最多) 国际化标签(I18N格式化标签) 数据库标签(SQL标签,很少使用) XML标签(几乎不用) JSTL函数(EL函数) 三.核心标签库使用说明 JSTL的核心标签库标签共13个,使用这些标签能够完成JSP页面的

新巴巴运动网 项目第十天

新巴巴运动网 项目第十天 今天内容 什么是单点登陆系统? 去登陆页面(单点登陆系统上) 提交登陆表单(用户名及密码) 验证码 为什么要保存到远程Session? 用户名或密码保存Session(本地Session Tomcat) 本次远程Session 保存Redis 密码加密(本次双重加密 .同时再加盐) 注意事项:不要用有规则的密码! 返回之前访问页面 跨域请求 (浏览器不让跨域) 实现跨域 什么是单点登陆系统 例如:QQ. 11223232 rwrew QQ腾讯公司 穿越火线.QQ飞车.Q

[项目构建 十五]babasport 项目总结及源码分享.

终于把这个项目自己手动的敲了一遍且总结了其中的知识点, 现在来做一个整体性的总结. 总目录: [项目构建 一]babasport 项目环境搭建. [项目构建 二]babasport SSM 三大框架整合 [项目构建 三]babasport Dubbo的使用及浅析. [项目构建 四]babasport 分页的使用及解析. [项目构建 五]babasport ajax图片上传及FastDFS入门案例. [项目构建 六]babasport Mybatis逆向工程构建项目实例. [项目构建 六]baba

JavaWeb学习总结(四十八)——模拟Servlet3.0使用注解的方式配置Servlet

JavaWeb学习总结(四十八)——模拟Servlet3.0使用注解的方式配置Servlet 一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: 1 <servlet> 2 <servlet-name>ActionServlet</servlet-name> 3 <servlet-class>me.gacl.web.controller.ActionServlet</s

javaweb学习总结(三十二)——JDBC学习入门【转】

原文地址:javaweb学习总结(三十二)——JDBC学习入门 一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后 才能够使用声卡和网卡,同样道理,我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数 据库打交道,如下所示: 1.2.JDBC介绍 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作

?IDEA+Maven+JavaWeb+tomcat项目搭建(图文并茂,详细)

一.创建Maven项目 1:如果刚打开IDEA,显示的是这个页面,我们直接单击 Create New Project(创建项目) 或者 File-> New-> Project 2:选中左侧的Maven –> 右侧选则你的jdk –> 勾选Create from archetype –>再选择maven-archetype-webapp –> 选好后再选择Next 3: 因为是maven项目,所以需要项目的Groupid, ArtifactId, Version 这是M

javaweb学习总结(四十五)——监听器(Listener)学习二

一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信息事件的监听器. 这三个监听器接口分别是ServletContextAttributeListener, HttpSessionAttributeListener 和ServletRequestAttributeListener,这三个接口中都定义了三个方法来处理被监听对象中的属性的增加,删除和替换

JavaWeb学习总结(五十)——文件上传和下载

在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用Servlet获取上传文件的输入流然后再解析里面的请求参数是比较麻烦,所以一般选择采用apache的开源工具common-fileupload这个文件上传组件.这个common-fileupload上传组件的jar包可以去apache官网上面下载,也可以在struts的lib文件夹下面找到,stru

javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据. Servlet+JSP+JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式. 这里以一个最常用的用户登录注册程序来讲解Servlet+JSP+JavaBean开发模式,通过这个用户登录注册程序综合案例,把之前的学过的XML.Xpat