快速入门四 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

Springweb中使用

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

cssimage的相对路径改变成绝对路径 :

* ./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.jaractivation.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.ServiceDAO进行配置:

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.ServiceDao完成配置:

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 {

// 购物车属性

// 购物项集合:Mapkey就是商品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的方法.

调用CartaddCart(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

配置映射

* ActionServiceDao

订单模块代码实现:

1.在购物车页面点击:提交订单 按钮.完成页面跳转!

 

2.生成订单:

保存订单的数据:

在页面中显示订单数据:

通过模型驱动的对象将数据传递到页面.(值栈)

 

3.我的订单:

根据用户的id查询当前用户的所有的订单:

 

4.订单列表上点击:付款

跳转到页面:

根据订单的id查询订单.

在页面中对其进行付款:

 

5.订单付款的功能:

在线支付的方式:

在线支付:

与第三方支付公司对接:(易宝)

在线支付的流程:

付款功能代码实现:

修改订单数据:(收货人,地址,电话)

完成付款的功能:

 

项目下载地址:http://download.csdn.net/detail/ftx2540993425/9438677


0 0
原创粉丝点击