快速入门四 SSH2附带源码
来源:互联网 发布:java orm框架 编辑:程序博客网 时间:2024/05/22 00:09
博客地址 http://blog.csdn.net/ftx2540993425
1.1 编码实现:
1.1.1 搭建开发环境:
SSH整合:
1.创建一个web工程:
2.引入jar包和配置文件:
* struts2:
* jar包:
struts-2.3.15.3\apps\struts2-blank.war\WEB-INF\lib\*.jar
struts-2.3.15.3\lib\struts2-json-plugin-2.3.15.3.jar
struts-2.3.15.3\lib\struts2-spring-plugin-2.3.15.3.jar
* 配置文件:
* web.xml
<!-- 配置Struts2的核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
* struts.xml
* Spring:
* jar包:
Spring3.2 开发最基本jar包
spring-beans-3.2.0.RELEASE.jar
spring-context-3.2.0.RELEASE.jar
spring-core-3.2.0.RELEASE.jar
spring-expression-3.2.0.RELEASE.jar
com.springsource.org.apache.commons.logging-1.1.1.jar
com.springsource.org.apache.log4j-1.2.15.jar
AOP开发
spring-aop-3.2.0.RELEASE.jar
spring-aspects-3.2.0.RELEASE.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
Spring Jdbc开发
spring-jdbc-3.2.0.RELEASE.jar
spring-tx-3.2.0.RELEASE.jar
Spring事务管理
spring-tx-3.2.0.RELEASE.jar
Spring整合其他ORM框架
spring-orm-3.2.0.RELEASE.jar
Spring在web中使用
spring-web-3.2.0.RELEASE.jar
Spring整合Junit测试
spring-test-3.2.0.RELEASE.jar
* 配置文件:
* web.xml
<!-- 配置Spring的核心监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
* applicationContext.xml
* log4j.properties
* Hibernate:
* jar包:
* hibernate-distribution-3.6.10.Final\hibernate3.jar
* hibernate-distribution-3.6.10.Final\lib\required\*.jar
* hibernate-distribution-3.6.10.Final\lib\jpa\*.jar
* slf4j-log4j整合的jar包 :
* 数据库驱动:
* 连接池:(c3p0连接池)
* 配置文件:
* 没有hibernate的核心配置文件的方式整合:
* 映射文件:
3.配置基本配置信息:
* C3P0连接池:
* 引入外部属性文件:
* jdbc.properties
* 配置连接池:
<!-- 配置连接池: -->
<!-- 引入外部属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置C3P0连接池: -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
* Hibernate相关信息:
<!-- Hibernate的相关信息 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置Hibernate的其他的属性 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.connection.autocommit">false</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
<!-- 配置Hibernate的映射文件 -->
</bean>
* 事务管理:
<!-- 事务管理: -->
<!-- 事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
1.1.2 引入页面:
1.引入静态页面:
* 在WEB-INF/jsp/
* 将静态页面复制到jsp下.
* 将css/js 放到 WebRoot下.
1.1.3 访问首页:
建包的格式:
* cn.itcast.shop.index
* action
* cn.itcast.shop.user
* action
* service
* dao
* vo
1.编写Action:
* IndexAction
2.改造JSP
* 将css和image的相对路径改变成绝对路径 :
* ./css 替换成 ${pageContext.request.contextPath}/css
3.配置Action
* 配置applicationContext.xml
<!-- 首页访问的Action -->
<bean id="indexAction" class="cn.itcast.shop.index.action.IndexAction" scope="prototype">
</bean>
* 配置struts.xml
<!-- 配置首页访问的Action -->
<action name="index" class="indexAction">
<result name="index">/WEB-INF/jsp/index.jsp</result>
</action>
1.1.4 用户模块:注册
跳转到注册页面:
1.点击注册链接(添加到一个Action中,从Action中完成页面转向).
* 修改注册的访问路径:
${ pageContext.request.contextPath }/user_registPage.action
* 编写Action:
* 配置Action:
* 配置applicationContext.xml
<!-- 用户模块的Action -->
<bean id="userAction" class="cn.itcast.shop.user.action.UserAction" scope="prototype">
</bean>
* 配置struts.xml
<!-- 配置用户模块的Action -->
<action name="user_*" class="userAction" method="{1}">
<result name="registPage">/WEB-INF/jsp/regist.jsp</result>
</action>
* 修改regist.jsp:
* ./css 替换成 ${pageContext.request.contextPath}/css
用户注册校验:
表创建:
CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`phone` varchar(255) DEFAULT NULL,
`addr` varchar(255) DEFAULT NULL,
`state` int(11) DEFAULT NULL,
`code` varchar(64) DEFAULT NULL,
PRIMARY KEY (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
前台校验:
* JS校验:
* 事件触发:onsubmit
* 校验:
function checkForm(){
// 校验用户名:
// 获得用户名文本框的值:
var username = document.getElementById("username").value;
if(username == null || username == ''){
alert("用户名不能为空!");
return false;
}
// 校验密码:
// 获得密码框的值:
var password = document.getElementById("password").value;
if(password == null || password == ''){
alert("密码不能为空!");
return false;
}
// 校验确认密码:
var repassword = document.getElementById("repassword").value;
if(repassword != password){
alert("两次密码输入不一致!");
return false;
}
}
使用AJAX完成用户名是否存在异步校验:
1.事件触发:
* onblur
2.编写AJAX代码:
* 项Action中提交:传递username参数
3.编写Action
* 接收username:模型驱动接收.
* 编写实体类
* User
* User.hbm.xml
* 配置到Spring中.
4.编写DAO
* 继承HibernateDaoSupport
* 在配置中注入sessionFactory
5.编写Service:
* 注入UserDao
* 事务管理:
用户注册:后台数据校验:
1.在Action所在包下创建一个校验的xml.
* 创建一个与Action类名-validation.xml(针对所有方法进行校验,只需要针对regist方法进行校验)
* UserAction-user_regist-validation.xml
<validators>
<!-- 校验用户名 -->
<field name="username">
<field-validator type="requiredstring">
<message>用户名不能为空!</message>
</field-validator>
</field>
<!-- 校验用户名 -->
<field name="password">
<field-validator type="requiredstring">
<message>密码不能为空!</message>
</field-validator>
</field>
<!-- 校验邮箱 -->
<field name="email">
<field-validator type="email">
<message>邮箱格式不正确!</message>
</field-validator>
</field>
</validators>
2.配置INPUT逻辑视图:
用户注册:
1.将数据保存到数据库 :
* 完善user对象.
2.发送激活邮件:
* 电子邮箱:
* jt@itcast.cn
* 邮件服务器:
* 邮件协议:
* smtp:发送邮件协议
* pop:接收邮件协议
* 邮箱发送全过程:
* 搭建邮箱服务器:
* 安装邮箱服务器:
* 修改域名:
* 工具---->服务器设置---->shop.com
* 注册账号:
* 账号---->新建账号
* 安装客户端软件:(接收和发送邮件.)
* outlook 和 foxmail
* 安装foxmail:
* 配置:
* 配置发送邮件服务器:
* localhost
* 配置接收邮件服务器:
* localhost
* 编码实现发送邮件:
* 复制mail.jar和activation.jar
* 删除EE5.0中自带发送邮件jar包:
* windows---->preferences--->lib
* 编写代码完成发送邮件:
1.1.5 用户激活:
1.在邮箱客户端中点击激活链接:
* 根据传递激活码进行用户查询.
* 如果用户不为空:
* 修改用户状态 改为1
* 如果用户为空:
* 激活码被篡改了.
1.1.6 用户登录:
跳转到登录页面:
1.修改登录链接:
* 改为action路径:
* 编写Action中方法:
* 转向:
用户登录:
1.接收用户名和密码:(模型驱动会自动接收)
2.调用userService进行查询:
* 用户名和密码及状态.
* 查询到:登录成功:
* 将用户的信息存入到session
* 跳转到首页
* 没查询到:登录失败:
* 跳转回登录页面:
1.1.7 用户退出:
点击退出的链接:
* 提交到Action---销毁session
* 页面跳转(首页)
1.1.8 验证码程序:(注册)
1.编写Action:
* 验证码Action:
* 完成配置:
2.在页面中写<img src=”验证码Action路径”>
3.编写JS,看不清换一张
4.提交到Action,在Action中进行比较.
* 如果一致提交成功
* 如果不一致回到注册页面
1.1.9 首页上的一级分类的查询:
1.创建一级分类的表:
CREATE TABLE `category` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`cname` varchar(255) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
2.建包及相应的类:
* cn.itcast.shop.category
* action
* service
* CategoryService:业务层对象
* dao
* CategoryDao:持久层对象
* vo
* Category:实体对象
* Category.hbm.xml:映射文件
3.对Service和DAO进行配置:
* 在DAO中注入sessionFactory
* 在Service中注入DAO
4.需要在IndexAction中注入一级分类的Service.
* Action-----Service------Dao
* 将一级分类的数据显示到页面:
* 将一级分类的数据存入到session范围.
1.1.10 首页上热门商品显示:
1.建表:
创建二级分类的表:
CREATE TABLE `categorysecond` (
`csid` int(11) NOT NULL AUTO_INCREMENT,
`csname` varchar(255) DEFAULT NULL,
`cid` int(11) DEFAULT NULL,
PRIMARY KEY (`csid`),
KEY `FK936FCAF21DB1FD15` (`cid`),
CONSTRAINT `FK936FCAF21DB1FD15` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8;
创建商品表:
CREATE TABLE `product` (
`pid` int(11) NOT NULL AUTO_INCREMENT,
`pname` varchar(255) DEFAULT NULL,
`market_price` double DEFAULT NULL,
`shop_price` double DEFAULT NULL,
`image` varchar(255) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
`pdesc` varchar(255) DEFAULT NULL,
`is_hot` int(11) DEFAULT NULL,
`pdate` datetime DEFAULT NULL,
`csid` int(11) DEFAULT NULL,
PRIMARY KEY (`pid`),
KEY `FKED8DCCEFB9B74E02` (`csid`),
CONSTRAINT `FKED8DCCEFB9B74E02` FOREIGN KEY (`csid`) REFERENCES `categorysecond` (`csid`)
) ENGINE=InnoDB AUTO_INCREMENT=74 DEFAULT CHARSET=utf8;
2.创建包及类
* cn.itcast.shop.product
* action
* ProductAction
* service
* ProductService
* dao
* ProductDao
* vo
* Product
* Product.hbm.xml
3.将Service和Dao完成配置:
4.Action-----ProductService------>ProductDao
* 查询热门商品:
* is_hot: 0 :不是热门 1:是热门.
* 查询带有个数:
* 分页查询:
* 将查询到数据保存到值栈中.
1.1.11 首页上最新商品显示:
1.Action-----ProductService------>ProductDao
* 查询最新商品:
* 按商品上传日期倒序进行排序 只显示10个.
* 将查询到记录保存到值栈中:
1.1.12 首页上点击商品显示商品详情:
1.点击商品链接:
* 传递商品id.
2.编写Action:
* 编写Action类,继承ActionSupport实现模型驱动接口.
* 编写一个执行的方法.
3.配置Action:
* 在applicationContext.xml中配置Action
* 在struts.xml中配置Action
4.在Action中调用Service完成根据ID进行查询的方法:
* 注入ProductService.
* 完成查询
5.在页面上显示相应数据 :
* 页面转向
* 修改页面
* 显示数据
1.1.13 首页上点击一级分类,查询商品列表:(左侧一级分类和二级分类关联查询)
1.创建二级分类的包及类:
* cn.itcast.shop.categorysecond
* action
* CategoryAction
* service
* CategoryService
* dao
* CategoryDao
* vo
* CategorySecond
* CategorySecond.hbm.xml
2.配置一级分类和二级分类的关联关系:
* Category.xml
<!-- 配置二级分类的集合 -->
<set name="categorySeconds">
<key column="cid"/>
<one-to-many class="cn.itcast.shop.categorysecond.vo.CategorySecond"/>
</set>
* CategorySecond.xml
<many-to-one name="category" class="cn.itcast.shop.category.vo.Category" column="cid"></many-to-one>
3.点击一级分类的链接:
* 传递一级分类的id.
4.编写Action:
* 接收cid:
* 编写一个执行的方法:直接返回字符串(页面)
* 显示左侧分类
* 关联查找:(直接session中获得一级分类的数据(需要配置一级分类上二级分类的集合lazy=”false”))
1.1.14 首页上点击一级分类,查询商品列表:(显示商品列表)
1.查询商品,带有分页显示商品.
* 回到商品列表页面:
* 商品集合,当前页数,总页数(总记录数),每页显示记录数.( 将后台 这些数据 带到页面上,首选 值栈. )
* 将这些数据封装到一个分页类中.(最后将分页类保存到值栈中就OK).
2.封装一个PageBean.
3.完成查询:
* 传递当前页数:
* 调用Service完成查询.
4.配置二级分类和商品关联关系:
1.1.15 商品分类页面根据二级分类ID查询商品:
1.点击二级分类链接:
* 传递csid
* 传递page=1
2.编写Action :
* 接收csid:
* 接收page
3.调用Service完成查询:
* 封装成PageBean
4.在页面中进行显示:
1.1.16 将商品添加到购物车:
1.封装一个购物车对象:
* Cart:购物车对象:
* CartItem的集合:(选择Map集合,移除购物车时候比较方便.)
* total:总计:
* 功能:
* 将购物项添加到购物车:
* 从购物车中移除购物项:
* 清空购物车:
public class Cart {
// 购物车属性
// 购物项集合:Map的key就是商品pid,value:购物项
private Map<Integer, CartItem> map = new LinkedHashMap<Integer, CartItem>();
// Cart对象中有一个叫cartItems属性.
public Collection<CartItem> getCartItems(){
return map.values();
}
// 购物总计:
private double total;
public void setTotal(double total) {
this.total = total;
}
// 购物车的功能:
// 1.将购物项添加到购物车
public void addCart(CartItem cartItem) {
// 判断购物车中是否已经存在该购物项:
/*
* * 如果存在:
* * 数量增加
* * 总计 = 总计 + 购物项小计
* * 如果不存在:
* * 向map中添加购物项
* * 总计 = 总计 + 购物项小计
*/
// 获得商品id.
Integer pid = cartItem.getProduct().getPid();
// 判断购物车中是否已经存在该购物项:
if(map.containsKey(pid)){
// 存在
CartItem _cartItem = map.get(pid);// 获得购物车中原来的购物项
_cartItem.setCount(_cartItem.getCount()+cartItem.getCount());
}else{
// 不存在
map.put(pid, cartItem);
}
// 设置总计的值
total += cartItem.getSubtotal();
}
// 2.从购物车移除购物项
public void removeCart(Integer pid) {
// 将购物项移除购物车:
CartItem cartItem = map.remove(pid);
// 总计 = 总计 -移除的购物项小计:
total -= cartItem.getSubtotal();
}
// 3.清空购物车
public void clearCart() {
// 将所有购物项清空
map.clear();
// 将总计设置为0
total = 0;
}
}
* CartItem:购物项对象:
* Product:商品信息.
* count:购买某种商品数量:
* subtotal:购买某种商品的小计:
public class CartItem {
private Product product;// 购物项中商品信息
private int count;// 购买某种商品数量
private double subtotal;// 购买某种商品小计
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
// 小计自动计算的.
public double getSubtotal() {
return count * product.getShop_price();
}
/*public void setSubtotal(double subtotal) {
this.subtotal = subtotal;
}
*/
}
2.跳转到购物车页面:
* 点击加入购物车链接:
* 提交表单
* pid
* 数量
* 完成页面转向:
3.添加到购物车:
* 在Action中:
* 根据pid查询.
* 将商品记录封装到CartItem中.
* 获得Cart的方法.
* 调用Cart中addCart(CartItem cartItem);完成添加到购物车操作.
4.清空购物车:
* 在Action中:
* 获得购物车
* 调用购物车中clearCart();方法完成清空.
* 判断,如果购物车为空不显示.
5.从购物车中移除购物项:
* 点击购物车页面中删除链接
* 传递一个pid.
* Action中:
* 获得购物车
* 调用购物车中removeCart(Integer pid);
6.点击我的购物车:
* 跳转到购物车页面:
1.1.17 前台订单的模块:
订单模块的准备工作:
创建表:
订单表
CREATE TABLE `orders` (
`oid` int(11) NOT NULL AUTO_INCREMENT,
`total` double DEFAULT NULL,
`ordertime` datetime DEFAULT NULL,
`state` int(11) DEFAULT NULL,
`name` varchar(21) DEFAULT NULL,
`addr` varchar(60) DEFAULT NULL,
`phone` varchar(20) DEFAULT NULL,
`uid` int(11) DEFAULT NULL,
PRIMARY KEY (`oid`),
KEY `FKC3DF62E5AA3D9C7` (`uid`),
CONSTRAINT `FKC3DF62E5AA3D9C7` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
订单项:(中间表 中间表参与到业务逻辑中)
CREATE TABLE `orderitem` (
`itemid` int(11) NOT NULL AUTO_INCREMENT,
`count` int(11) DEFAULT NULL,
`subtotal` double DEFAULT NULL,
`pid` int(11) DEFAULT NULL,
`oid` int(11) DEFAULT NULL,
PRIMARY KEY (`itemid`),
KEY `FKE8B2AB6166C01961` (`oid`),
KEY `FKE8B2AB6171DB7AE4` (`pid`),
CONSTRAINT `FKE8B2AB6166C01961` FOREIGN KEY (`oid`) REFERENCES `orders` (`oid`),
CONSTRAINT `FKE8B2AB6171DB7AE4` FOREIGN KEY (`pid`) REFERENCES `product` (`pid`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
创建包:
* cn.itcast.shop.order
* action
* OrderAction
* service
* OrderService
* dao
* OrderDao
* vo
* Order
* Order.hbm.xml
* OrderItem
* OrderItem.hbm.xml
配置:
* applicationContext.xml
* 配置映射
* Action、Service、Dao
订单模块代码实现:
1.在购物车页面点击:提交订单 按钮.完成页面跳转!
2.生成订单:
* 保存订单的数据:
* 在页面中显示订单数据:
* 通过模型驱动的对象将数据传递到页面.(值栈)
3.我的订单:
* 根据用户的id查询当前用户的所有的订单:
4.订单列表上点击:付款
* 跳转到页面:
* 根据订单的id查询订单.
* 在页面中对其进行付款:
5.订单付款的功能:
* 在线支付的方式:
* 在线支付:
* 与第三方支付公司对接:(易宝)
* 在线支付的流程:
* 付款功能代码实现:
* 修改订单数据:(收货人,地址,电话)
* 完成付款的功能:
项目下载地址:http://download.csdn.net/detail/ftx2540993425/9438677
- 快速入门四 SSH2附带源码
- 快速入门一 SSH2附带源码
- 快速入门二 SSH2附带源码
- 快速入门三 SSH2附带源码
- 快速入门五 SSH2附带源码
- SOCKET套接字入门实例 附带源码
- eXtremeDB快速入门:四
- Gradle源码入门四
- Struts快速入门(四)
- Struts快速入门(四)
- Struts快速入门(四)
- Struts快速入门(四)
- Struts快速入门(四)
- Struts快速入门(四)
- Delphi快速入门(四)
- Delphi快速入门(四)
- TimesTen快速入门(四)
- JavaScript快速入门(四)
- 自定义居于底部的选择国家的滚动选择器
- Ubuntu14.04安装搜狗输入法
- Error 'Incorrect key file for table 'test'
- hive导出数据导本地的方法
- 创建Android应用程序-从艰难的方式中学习获得的的30条经验教训
- 快速入门四 SSH2附带源码
- 沿海信标台站的说明(来源于网络)
- C++ and C Combination Compile Extern
- 《Android源码设计模式解析与实战》——Builder模式
- 以服务的方式运行软件
- bzoj1013: [JSOI2008]球形空间产生器
- 【精】iOS知识树,知识点(包括对象、Block、消息转发、GCD、运行时、runloop、动画、Push、KVO、tableview,UIViewController、提交AppStore)
- API简介
- Android中View的绘制流程详解