• SSH整合项目----在线商城


    1.1 网上商城需求分析

    1.1.1    前台:用户模块.

    注册:

    * JS非空校验.(不是必须)

    * Struts2数据校验:在注册Action类同一包下新建UserAction-user_regist-validation.xml(针对注册regist)

    * AJAX校验用户名是否存在:input文本框内加一条 - onblur="checkUserName()" -鼠标移除触发事件

    不使用jquery:

     1 function checkUserName(){
     2         // 获得用户名的值:
     3         var username = document.getElementById("username").value;
     4         // 1.创建异步加载对象:
     5         var xhr = createXMLHttpRequest();
     6         // 2.设置监听
     7         xhr.onreadystatechange = function(){
     8             if(xhr.readyState == 4){
     9                 if(xhr.status == 200){
    10                     var data = xhr.responseText;
    11                     document.getElementById("span1").innerHTML = data;
    12                 }
    13             }
    14         }
    15         // 3.打开连接:
    16         xhr.open("GET","${pageContext.request.contextPath}/user_checkUserName.action?"+new Date().getTime()+"&username="+username,true);
    17         // 4.发送
    18         xhr.send(null);
    19     }
    20     
    21     function createXMLHttpRequest() {
    22         var xmlHttp;
    23         try { // Firefox, Opera 8.0+, Safari
    24             xmlHttp = new XMLHttpRequest();
    25         } catch (e) {
    26             try {// Internet Explorer
    27                 xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    28             } catch (e) {
    29                 try {
    30                     xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    31                 } catch (e) {
    32                 }
    33             }
    34         }
    35 
    36         return xmlHttp;
    37     }

    使用jquery:

    1 function checkUserName(){
    2         var username = $("#username").val();
    3         $("#span1").load("${pageContext.request.contextPath}/user_checkUserName.action?"+new Date().getTime(),{'username':username});
    4     }

    * 发送激活邮件:需要一个,邮件本地服务器,当然联网的话就不需要这个了,还需要两个jar包,,注意引入javaee时可能会发生jar冲突。

    发送邮件的工具类:MailUtils

     1 /**
     2  * 发送邮件的工具类
     3  */
     4 public class MailUtils {
     5     public static void sendMail(String to,String code) throws Exception{
     6         Properties props = new Properties();
     7         props.setProperty("mail.smtp", "localhost");
     8         // 1.Session对象.连接(与邮箱服务器连接)
     9         Session session = Session.getInstance(props, new Authenticator() {
    10 
    11             @Override
    12             protected PasswordAuthentication getPasswordAuthentication() {
    13                 return new PasswordAuthentication("service@shop.com", "111");
    14             }
    15 
    16         });
    17 
    18         // 2.构建邮件信息:
    19         Message message = new MimeMessage(session);
    20         // 发件人:
    21         message.setFrom(new InternetAddress("service@shop.com"));
    22         // 收件人:
    23         message.setRecipient(RecipientType.TO, new InternetAddress(to));
    24         // 设置标题
    25         message.setSubject("来自SHOP激活邮件");
    26         // 设置正文
    27         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");
    28 
    29         // 3.发送对象
    30         Transport.send(message);
    31     }
    32 }

    其中code是发送邮件需要的一个密钥,由工具类UUIDUtils生成

    1 /**
    2  * 生成激活码
    3  */
    4 public class UUIDUtils {
    5     public static String getUUID(){
    6         return UUID.randomUUID().toString().replace("-", "");
    7     }
    8 }

    密钥在业务层注册的时候生成并通过MailUtils.setMail(user.getEmail(), code);前往邮箱激活

    * 验证码程序.

    激活:

    * 点击邮件中连接地址,对用户进行激活.

    登录:

    * 数据校验.

    * 激活后的用户才可以进行登录.

    * 验证码程序.

    退出:

    * 销毁session.

    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订单模块(后台)

    查询所有订单:

    * 分页

    按状态查询订单:

    * 分页

    是否可以删除订单:

    3.1    SSH环境搭建:

    3.1.1    第一步:创建一个web项目.

    3.1.2    第二步:导入相应jar.

    Struts2jar:

    * 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

    Springjar:

    * 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

    * SpringAOP开发(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

    * SpringJDBC支持、事务管理、整合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

    离线查询:

    1 DetachedCriteria criteria = DetachedCriteria.forClass(Product.class);
    2 criteria.add(Restrictions.eq("is_hot", 1));
    3 List<Product> list = this.getHibernateTemplate().findByCriteria(criteria, 0, 10);

    executeFind()方法:

    PageHibernateCallback类

     1 public class PageHibernateCallback<T> implements HibernateCallback<List<T>> {
     2 
     3     private String hql;
     4     private Object[] params;
     5     private int startIndex;
     6     private int pageSize;
     7 
     8     public PageHibernateCallback(String hql, Object[] params,
     9                                  int startIndex, int pageSize) {
    10         super();
    11         this.hql = hql;
    12         this.params = params;
    13         this.startIndex = startIndex;
    14         this.pageSize = pageSize;
    15     }
    16 
    17     public List<T> doInHibernate(Session session) throws HibernateException,
    18             SQLException {
    19         //1 执行hql语句
    20         Query query = session.createQuery(hql);
    21         //2 实际参数
    22         if (params != null) {
    23             for (int i = 0; i < params.length; i++) {
    24                 query.setParameter(i, params[i]);
    25             }
    26         }
    27         //3 分页
    28         query.setFirstResult(startIndex);
    29         query.setMaxResults(pageSize);
    30 
    31         return query.list();
    32     }
    33 }

    Dao层查询分页

    1 List<Product> list = (List<Product>) this.getHibernateTemplate().executeFind(new PageHibernateCallback<Product>("from Product where is_hot=?", new Object[]{1}, 0, 10));

     

  • 相关阅读:
    Swagger接入
    Elasticsearch5.0.1索引压测结果
    Elasticsearch5.0 BreakChange摘要
    Elasticsearch1.7到2.3升级实践总结
    Java动态代理全面分析
    Spring之AntPathMatcher
    Lock的实现之ReentrantLock详解
    Elasticsearch之client源码简要分析
    elasticserach 索引删除 源码分析
    httpClient4.5.2工具类总结
  • 原文地址:https://www.cnblogs.com/lesliehe/p/8179965.html
Copyright © 2020-2023  润新知