SSH整合项目----在线商城
1.1 网上商城需求分析
1.1.1 前台:用户模块.
注册:
* JS非空校验.(不是必须)
* Struts2数据校验:在注册Action类同一包下新建UserAction-user_regist-validation.xml(针对注册regist)
* AJAX校验用户名是否存在:input文本框内加一条 - onblur="checkUserName()" -鼠标移除触发事件
不使用jquery:
function checkUserName(){
// 获得用户名的值:
var username = document.getElementById("username").value;
// 1.创建异步加载对象:
var xhr = createXMLHttpRequest();
// 2.设置监听
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
var data = xhr.responseText;
document.getElementById("span1").innerHTML = data;
}
}
}
// 3.打开连接:
xhr.open("GET","${pageContext.request.contextPath}/user_checkUserName.action?"+new Date().getTime()+"&username="+username,true);
// 4.发送
xhr.send(null);
} function createXMLHttpRequest() {
var xmlHttp;
try { // Firefox, Opera 8.0+, Safari
xmlHttp = new XMLHttpRequest();
} catch (e) {
try {// Internet Explorer
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {
}
}
} return xmlHttp;
}
使用jquery:
function checkUserName(){
var username = $("#username").val();
$("#span1").load("${pageContext.request.contextPath}/user_checkUserName.action?"+new Date().getTime(),{'username':username});
}
* 发送激活邮件:需要一个,邮件本地服务器,当然联网的话就不需要这个了,还需要两个jar包,,注意引入javaee时可能会发生jar冲突。
发送邮件的工具类:MailUtils
/**
* 发送邮件的工具类
*/
public class MailUtils {
public static void sendMail(String to,String code) throws Exception{
Properties props = new Properties();
props.setProperty("mail.smtp", "localhost");
// 1.Session对象.连接(与邮箱服务器连接)
Session session = Session.getInstance(props, new Authenticator() { @Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("service@shop.com", "111");
} }); // 2.构建邮件信息:
Message message = new MimeMessage(session);
// 发件人:
message.setFrom(new InternetAddress("service@shop.com"));
// 收件人:
message.setRecipient(RecipientType.TO, new InternetAddress(to));
// 设置标题
message.setSubject("来自SHOP激活邮件");
// 设置正文
message.setContent("<h1>来自SHOP的官网激活邮件</h1><h3><a href='http://localhost:8080/shop/user_active.action?code="+code+"'>http://localhost:8080/shop/user_active.action?code="+code+"</a></h3>", "text/html;charset=UTF-8"); // 3.发送对象
Transport.send(message);
}
}
其中code是发送邮件需要的一个密钥,由工具类UUIDUtils生成
/**
* 生成激活码
*/
public class UUIDUtils {
public static String getUUID(){
return UUID.randomUUID().toString().replace("-", "");
}
}
密钥在业务层注册的时候生成并通过MailUtils.setMail(user.getEmail(), code);前往邮箱激活
* 验证码程序.
激活:
* 点击邮件中连接地址,对用户进行激活.
登录:
* 数据校验.
* 激活后的用户才可以进行登录.
* 验证码程序.
退出:
* 销毁session.
120
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman",serif;}
1.1.2 前台:分类模块(首页):
查询一级分类:显示到菜单位置.
查询一级分类:关联二级分类.
1.1.3 前台:二级分类
根据一级分类:查询到二级分类.
1.1.4 前台:商品模块(首页):
查询热门商品:
* 检索10个热门商品.
查询最新商品:
* 检索10个最新商品.(按时间排序)
根据分类查询商品:
* 根据分类的ID检索商品.
* 对商品显示的时候,分页显示.
根据商品ID检索商品:
* 显示商品详情.
1.1.5 购物模块:
添加到购物车:
* 将购物项添加到购物车.
* 如果购物项已经存在在购物车中,那么数量和小计需要增加.
* 如果购物项没有在购物车中,添加一个新的购物项.
清空购物车:
* 将购物车中所有的购物项,清空.
从购物车中移除:
* 将某一个购物项从购物车中移除.
1.1.6 订单模块:
保存订单:
* 数据从购物车中获取.
显示某个订单:
* 根据订单ID检索订单.
查询我的订单:
* 根据用户ID检索订单.
在线支付:
* 选择第三方支付平台,为订单进行付款.
1.1.7 用户模块:(后台)
查询所有用户:
修改用户信息:
删除用户信息:
1.1.8 一级分类:(后台)
查询所有一级分类:
* 分页.
添加一级分类:
修改一级分类:
删除一级分类:
* 删除二级分类.(级联)
1.1.9 二级分类:(后台)
查询所有二级分类:
添加二级分类:
* 所属一级分类:
修改二级分类:
* 所属一级分类:
删除二级分类:
1.1.10商品模块(后台)
查询所有商品:
* 分页.
* 条件查询.
添加商品:
* 上传商品图片.
修改商品:
* 修改上传图片.
删除商品:
1.1.11订单模块(后台)
查询所有订单:
* 分页
按状态查询订单:
* 分页
是否可以删除订单:
120
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Times New Roman",serif;}
3.1 SSH环境搭建:
3.1.1 第一步:创建一个web项目.
3.1.2 第二步:导入相应jar包.
Struts2的jar包:
* struts2框架解压路径/apps/struts2-blank.war/WEB-INF/lib/*.jar
* struts2框架解压路径/lib/struts2-spring-plugin-2.3.15.3.jar
* struts2框架解压路径/lib/struts2-json-plugin-2.3.15.3.jar
Spring的jar包:
* Spring开发基本jar包
* spring框架解压路径/lib/spring-beans-3.2.0.RELEASE.jar
* spring框架解压路径/lib/spring-context-3.2.0.RELEASE.jar
* spring框架解压路径/lib/spring-core-3.2.0.RELEASE.jar
* spring框架解压路径/lib/spring-expression-3.2.0.RELEASE.jar
* spring框架依赖包解压路径/com.springsource.org.apache.commons.logging-1.1.1.jar
* spring框架依赖包解压路径/com.springsource.org.apache.log4j-1.2.15.jar
* Spring的AOP开发(Aspectj)
* spring框架解压路径/lib/spring-aop-3.2.0.RELEASE.jar
* spring框架解压路径/lib/spring-aspects-3.2.0.RELEASE.jar
* spring框架依赖包解压路径/com.springsource.org.aopalliance-1.0.0.jar
* spring框架依赖包解压路径/com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
* Spring的JDBC支持、事务管理、整合Hibernate
* spring框架解压路径/lib/spring-jdbc-3.2.0.RELEASE.jar
* spring框架解压路径/lib/spring-tx-3.2.0.RELEASE.jar
* spring框架解压路径/lib/spring-orm-3.2.0.RELEASE.jar
* Spring整合web项目:
* spring框架解压路径/lib/spring-web-3.2.0.RELEASE.jar
* Spring整合Junit单元测试:
* spring框架解压路径/lib/spring-test-3.2.0.RELEASE.jar
Hibernate框架jar包:
* hibernate框架解压路径/hibernate3.jar
* hibernate框架解压路径/lib/required/*.jar
* hibernate框架解压路径/lib/jpr/*.jar
* hibernate框架整合log4j
* slf4j-log4j12-1.7.2.jar
* 数据库驱动包
* c3p0连接池jar包.
3.1.3 第三步导入相应配置文件:
Struts框架中:
* web.xml
* 核心过滤器:
<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框架中:
* web.xml
<!-- Spring框架使用监听器,服务器启动的时候加载Spring的配置文件 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- 监听器默认加载WEB-INF/application.xml -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
* applicationCotnext.xml
<!-- 引入外部jdbc.properties文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<!-- 配置连接池的信息 -->
<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的相关属性 -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- 注入连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置Hibernate的其他的属性 -->
<property name="hibernateProperties">
<props>
<!-- Hibernate的方言 -->
<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.hbm2ddl.auto">update</prop>
<prop key="hibernate.connection.autocommit">false</prop>
</props>
</property>
</bean>
<!-- 声明式事务管理 -->
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 注入 sessionFactory-->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
* 不使用hibernate配置文件:
* 将hibernate的信息配置到spring框架中.
log4j的配置文件:
连接数据库基本参数配置文件:jdbc.properties
另外在对类及jsp页面等等的命名有了更全面的认识。
编码上出现过几个问题,不止下面这些(忘记了~)...:
异常The given object has a null identifier:修改数据时候主键没有传递
解决办法:<s:hidden name="action中实例对象名.id" id="id"></s:hidden>
hibernate总是报错 配置factory的id找不到,mapping配置文件Could not parse mapping document from input stream
解决办法:实体类映射表中"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">改为: "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd
数据库插入日期数据出现异常Data truncation: Incorrectdatetime value: '' for column 'ordertime' at row 1数据库时间类型和实体类中的定义的数据类型不匹配
解决办法:
1,更换最新的mysql连接数据库驱动,点此下载
2,使用SimpleDateFormat进行转换,转换成和数据库一致的格式:yyyy-MM-dd hh:mm:ss
对于查询的数据以页面的形式展现,在这个项目中有两种方法,一是离线查询,还有就是this.getHibernateTemplate().executeFInd
离线查询:
DetachedCriteria criteria = DetachedCriteria.forClass(Product.class);
criteria.add(Restrictions.eq("is_hot", 1));
List<Product> list = this.getHibernateTemplate().findByCriteria(criteria, 0, 10);
executeFind()方法:
PageHibernateCallback类
public class PageHibernateCallback<T> implements HibernateCallback<List<T>> { private String hql;
private Object[] params;
private int startIndex;
private int pageSize; public PageHibernateCallback(String hql, Object[] params,
int startIndex, int pageSize) {
super();
this.hql = hql;
this.params = params;
this.startIndex = startIndex;
this.pageSize = pageSize;
} public List<T> doInHibernate(Session session) throws HibernateException,
SQLException {
//1 执行hql语句
Query query = session.createQuery(hql);
//2 实际参数
if (params != null) {
for (int i = 0; i < params.length; i++) {
query.setParameter(i, params[i]);
}
}
//3 分页
query.setFirstResult(startIndex);
query.setMaxResults(pageSize); return query.list();
}
}
Dao层查询分页
List<Product> list = (List<Product>) this.getHibernateTemplate().executeFind(new PageHibernateCallback<Product>("from Product where is_hot=?", new Object[]{1}, 0, 10));
SSH整合项目----在线商城的更多相关文章
- 【Java EE 学习 67 下】【OA项目练习】【SSH整合JBPM工作流】【JBPM项目实战】
一.SSH整合JBPM JBPM基础见http://www.cnblogs.com/kuangdaoyizhimei/p/4981551.html 现在将要实现SSH和JBPM的整合. 1.添加jar ...
- SSH整合
首先,SSH不是一个框架,而是多个框架(struts+spring+hibernate)的集成,是目前较流行的一种Web应用程序开源集成框架,用于构建灵活.易于扩展的多层Web应用程序. 集成SSH框 ...
- SSH整合(struts2.3.24+hibernate3.6.10+spring4.3.2+mysql5.5+myeclipse8.5+tomcat6+jdk1.6)
终于开始了ssh的整合,虽然现在比较推崇的是,ssm(springmvc+spring+mybatis)这种框架搭配确实比ssh有吸引力,因为一方面springmvc本身就是遵循spring标准,所以 ...
- SSH整合之spring整合hibernate
SSH整合要导入的jar包: MySQL中创建数据库 create database ssh_db; ssh_db 一.spring整合hibernate带有配置文件hibernate.cfg.xml ...
- 【转载】SSH整合使用步骤
SSH整合使用步骤 由于刚开始学习SSH,其中的配置比较多,为了下次能够快速的进行配置,将SSH整合的过程记录下来,以便下次查阅. 软件环境:MyEclipse 9.0.Struts2.2.Sprin ...
- SSH整合,applicationContext.xml中配置hibernate映射文件问题
今天在applicationContext.xml中配置sessionFactory时遇到了各种头疼的问题,现在总结一下: 1.<property name="mappingDirec ...
- mysql+ssh整合样例,附源代码下载
项目引用jar下载:http://download.csdn.net/detail/adam_zs/7262727 项目源代码下载地址:http://download.csdn.net/detail/ ...
- Spring自学教程-ssh整合(六)
以下是本人原创,如若转载和使用请注明转载地址.本博客信息切勿用于商业,可以个人使用,若喜欢我的博客,请关注我,谢谢!博客地址 感谢您支持我的博客,我的动力是您的支持和关注!如若转载和使用请注明转载地址 ...
- SSH简单项目
这是我学习SSH整合时的一个测试项目,代码比较简单 整个项目实现从数据库中取数据,在页面上显示.项目的结构如下: (1)数据库设计 数据库使用的是student数据库中的一个数据库表grade,表的内 ...
随机推荐
- [牛客] [#1108 J] [树形结构] 买一送一
2019牛客国庆集训派对day3 链接:https://ac.nowcoder.com/acm/contest/1108/J来源:牛客网 题意 ICPCCamp 有 n 个商店,用 $1,2,..., ...
- Iterator、Generator、Decorator、Descriptor
Python中的迭代器.生成器.装饰器.描述符. 可迭代对象(iterable)但凡是可以返回一个迭代器的对象都可成为可迭代对象可迭代对象实现了__iter__方法,该方法返回一个迭代器对象迭代器(i ...
- 认识配置文件schema.xml(managed-schema)
1.schema文件是在SolrConfig中的架构工厂定义,有两种定义模式: 1.1.默认的托管模式: solr默认使用的就是托管模式.也就是当在solrconfig.xml文件中没有显式声明< ...
- C++最快获取像素值
HDC hdc, hdcTemp; RECT rect; BYTE* bitPointer; int x, y; int red, green, blue, alpha; while(true) { ...
- poj2987 Firing[最小割]
题目 求选最少点个数的最大权闭合子图.(板子题) 最小割入门题,什么都不想说,丢个别人题解地址就跑. 附加几点个人理解:与s相通的S点集是闭合子图,剩下的与t相通的T点集是其他的.任意一个割都保证了有 ...
- [洛谷P2605] ZJOI2016 基站选址
问题描述 有N个村庄坐落在一条直线上,第i(i>1)个村庄距离第1个村庄的距离为Di.需要在这些村庄中建立不超过K个通讯基站,在第i个村庄建立基站的费用为Ci.如果在距离第i个村庄不超过Si的范 ...
- 【转】推荐几本学习MySQL的好书-MySQL 深入的书籍
MySQL的使用 1 MySQL技术内幕InnoDB存储引擎 2 MySQL的官方手册 3 MySQL排错指南 4 高性能MySQL 5 数据库索引设计与优化 6 Effective MySQL系列 ...
- C# 扩展方法——mysql-dapper(MySqlMapperExtensions)
其他扩展方法详见:https://www.cnblogs.com/zhuanjiao/p/12060937.html 反射比较耗费性能,反射得到属性进行缓存 根据反射得到的属性,进行动态拼接sql语句 ...
- [人物存档]【AI少女】【捏脸数据】气质学生
点击下载(城通网盘): AISChaF_20191119010459547.png
- QT:设置布局边缘
QHBoxLayout * horizontalLayout = new QHBoxLayout; //setContentsMargins(int left, int top, int right, ...