how2j.cn

下载区
文件名 文件大小
lib.rar 17m
WebContent.rar 1m
tmall_ssh.rar 19m

工具版本兼容问题
先做没有分页效果的分类查询功能



19分30秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器。 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)。 chrome 的 视频下载插件会影响播放,如 IDM 等,请关闭或者切换其他浏览器

步骤 1 : 先运行,看到效果,再学习   
步骤 2 : 模仿和排错   
步骤 3 : 新建项目   
步骤 4 : jar包   
步骤 5 : Category类   
步骤 6 : dao.impl   
步骤 7 : service   
步骤 8 : service.impl   
步骤 9 : action   
步骤 10 : index.jsp   
步骤 11 : listCategory.jsp   
步骤 12 : 静态资源   
步骤 13 : web.xml   
步骤 14 : applicationContext.xml   
步骤 15 : struts.xml   
步骤 16 : 测试数据   
步骤 17 : 启动tomcat   
步骤 18 : 访问测试地址   
步骤 19 : 思路图   
步骤 20 : 可运行项目   

步骤 1 :

先运行,看到效果,再学习

edit
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
接下来就开始一步一步来,由浅入深地开发功能了。

因为项目用到了SSH技术,SSH技术本身较为复杂,涉及到了多个框架、多个类、多个配置文件。 不仅如此,模仿天猫业务也较为复杂,所以在进行项目开发之前,一定要先按照 可运行的项目的指导,先下载右上角的可运行项目,配置运行起来, 先自己跑起来,确认项目本身没有问题,建立对学习内容的信心,然后再跟着步骤,一步步做出来。

十分不推荐一来就跟着步骤做下去,本知识点一共有15、6个步骤,只要任何一个步骤,跟着做的时候写错了,都有可能导致项目无法成功启动,影响学习情绪和学习效果。 所以一定要先按照 可运行的项目的指导,先下载右上角的可运行项目,配置运行起来,成功跑起来,然后再照着教程,一个一个地做下去,这样出了问题心里才有底,通过代码比较等手段,定位到问题所在,成功消化掉这个知识点。
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。
模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。
采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。

推荐使用diffmerge软件,进行文件夹比较。把你自己做的项目文件夹,和我的可运行项目文件夹进行比较。
这个软件很牛逼的,可以知道文件夹里哪两个文件不对,并且很明显地标记出来
这里提供了绿色安装和使用教程:diffmerge 下载和使用教程
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
本教程讲使用Dynamic Web Project的方式搭建项目,如果对Dynamic Web Project方式不太熟悉,请参考:使用Dynamic Web Project的方式开发J2EE应用

首先新建Dynamic Web Project项目: tmall_ssh

本教程依赖路径: e:\project, 请模仿的时候也放在这个位置,保证后续的学习更加顺畅
新建项目
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
下载右上角的lib.rar,并解压到目录下:

E:\project\tmall_ssh\WebContent\WEB-INF\lib


然后刷新项目,使得当前的这个Dynamic Web Project识别这些jar包
jar包
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
准备Category实体类,并用Hibernate注解标示其对应的表,字段等信息。

这里采用的是注解方式配置Hibernate需要的信息,如果这一部分知识有欠缺,请前往相关章节学习Hibernate 注解方式配置
package com.how2java.tmall.pojo; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "category") public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") int id; String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Category [id=" + id + ", name=" + name + "]"; } }
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
DAO类:DAOImpl 。
DAOImpl 继承了HibernateTemplate,从而提供了各种各样的CRUD方法,满足各种数据库操作的需要。

提供setSessionFactory()方法, 以用于注入SessionFactory

注: 这里没有使用DAO接口,而是直接使用了DAOImpl 实现类的方式,否则还要为DAO接口声明各种DAOImpl 里的方法,反而显得画蛇添足。

这个知识点涉及到了 Spring+Hibernate的整合SSH注解方式的整合
package com.how2java.tmall.dao.impl; import javax.annotation.Resource; import org.hibernate.SessionFactory; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.stereotype.Repository; @Repository("dao") public class DAOImpl extends HibernateTemplate { @Resource(name="sf") public void setSessionFactory(SessionFactory sessionFactory) { super.setSessionFactory(sessionFactory); }; }
package com.how2java.tmall.dao.impl;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Repository;

@Repository("dao")
public class DAOImpl extends HibernateTemplate {
	@Resource(name="sf")
	public void setSessionFactory(SessionFactory sessionFactory) {
		super.setSessionFactory(sessionFactory);
	};
}
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
设计CategoryService接口,用于提供业务方法list(),即查询所有的分类
package com.how2java.tmall.service; import java.util.List; public interface CategoryService{ public List list(); }
package com.how2java.tmall.service;

import java.util.List;

public interface CategoryService{
	
	public List list();
}
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
CategoryServiceImpl 实现了CategoryService 接口,提供list()方法的具体实现。
同时自动装配(注入) 了DAOImpl的实例dao。

在list()方法中,通过dao获取所有的分类对象。
package com.how2java.tmall.service.impl; import java.util.List; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Order; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.how2java.tmall.dao.impl.DAOImpl; import com.how2java.tmall.pojo.Category; import com.how2java.tmall.service.CategoryService; @Service public class CategoryServiceImpl implements CategoryService { @Autowired DAOImpl dao; @Override public List list() { DetachedCriteria dc = DetachedCriteria.forClass(Category.class); dc.addOrder(Order.desc("id")); return dao.findByCriteria(dc); } }
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
CategoryAction 类作为MVC设计模式中的控制层起作用。
1. 使用basicstruts,与本知识点接下来会讲到的配置文件struts.xml中定义的basicstruts保持一致
2. 在Result注解中,定义了返回的页面为/admin/listCategory.jsp
3. 自动装配(注入)categoryService对象,用于从数据库获取所有分类对象的集合。
4. 把对admin_category_list路径的访问映射到list方法上
5. list()方法通过categoryService获取到所有的分类对象,放在categorys属性中。
6. 同时提供了 getCategorys() 方法,用于向listCategory.jsp页面传递数据
package com.how2java.tmall.action; import java.util.List; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Namespace; import org.apache.struts2.convention.annotation.ParentPackage; import org.apache.struts2.convention.annotation.Result; import org.apache.struts2.convention.annotation.Results; import org.springframework.beans.factory.annotation.Autowired; import com.how2java.tmall.pojo.Category; import com.how2java.tmall.service.CategoryService; @Namespace("/") @ParentPackage("basicstruts") @Results( { /*分类管理*/ @Result(name="listCategory", location="/admin/listCategory.jsp"), }) public class CategoryAction { @Autowired CategoryService categoryService; List<Category> categorys; @Action("admin_category_list") public String list() { categorys = categoryService.list(); System.out.println(categorys); return "listCategory"; } public List<Category> getCategorys() { return categorys; } public void setCategorys(List<Category> categorys) { this.categorys = categorys; } }
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
在WebContent目录下新建admin目录
接着在admin目录下新建index.jsp文件
这个文件的作用是访问如下地址的时候:

http://127.0.0.1:8080/tmall_ssh/admin

会自动跳转到

http://127.0.0.1:8080/tmall_ssh/admin_category_list
index.jsp
<% response.sendRedirect("../admin_category_list"); %>
<% 
	response.sendRedirect("../admin_category_list");
%>
步骤 11 :

listCategory.jsp

edit
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
接着在admin目录下新建listCategory.jsp文件,其作用是显示从CategoryAction中传递过来的集合中的分类信息。

作为视图,担当的角色是显示数据。所以关键就是从第43行开始,借助JSTL的c:forEach标签遍历从CategoryAction的list() 的传递过来的集合。

<c:forEach items="${categorys}" var="c">



为了使listCategory.jsp可以正常工作,还需要在WebContent目录下新建一个include目录,接着在include目录下新建admin目录,并且在其中创建4个被包含的文件:adminHeader.jsp,adminNavigator.jsp,adminPage.jsp,adminFooter.jsp。形成如图所示的目录结构


这个包含较为复杂,涉及到了多个文件的包含关系,为了便于消化,将会在稍后的知识点中专门详细讲解: listCategory.jsp及其中的包含关系
listCategory.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" import="java.util.*"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@include file="../include/admin/adminHeader.jsp"%> <%@include file="../include/admin/adminNavigator.jsp"%> <script> $(function(){ $("#addForm").submit(function(){ if(!checkEmpty("name","分类名称")) return false; if(!checkEmpty("categoryPic","分类上传图片")) return false; return true; }); }); </script> <title>分类管理</title> <div class="workingArea"> <h1 class="label label-info" >分类管理</h1> <br> <br> <div class="listDataTableDiv"> <table class="table table-striped table-bordered table-hover table-condensed"> <thead> <tr class="success"> <th>ID</th> <th>图片</th> <th>分类名称</th> <th>属性管理</th> <th>产品管理</th> <th>编辑</th> <th>删除</th> </tr> </thead> <tbody> <c:forEach items="${categorys}" var="c"> <tr> <td>${c.id}</td> <td><img height="40px" src="img/category/${c.id}.jpg"></td> <td>${c.name}</td> <td><a href="admin_property_list?category.id=${c.id}"><span class="glyphicon glyphicon-th-list"></span></a></td> <td><a href="admin_product_list?category.id=${c.id}"><span class="glyphicon glyphicon-shopping-cart"></span></a></td> <td><a href="admin_category_edit?category.id=${c.id}"><span class="glyphicon glyphicon-edit"></span></a></td> <td><a deleteLink="true" href="admin_category_delete?category.id=${c.id}"><span class=" glyphicon glyphicon-trash"></span></a></td> </tr> </c:forEach> </tbody> </table> </div> <div class="pageDiv"> <%//@include file="../include/admin/adminPage.jsp" %> </div> <div class="panel panel-warning addDiv"> <div class="panel-heading">新增分类</div> <div class="panel-body"> <form method="post" id="addForm" action="admin_category_add" enctype="multipart/form-data"> <table class="addTable"> <tr> <td>分类名称</td> <td><input id="name" name="category.name" type="text" class="form-control"></td> </tr> <tr> <td>分类圖片</td> <td> <input id="categoryPic" type="file" name="img" /> </td> </tr> <tr class="submitTR"> <td colspan="2" align="center"> <button type="submit" class="btn btn-success">提 交</button> </td> </tr> </table> </form> </div> </div> </div> <%@include file="../include/admin/adminFooter.jsp"%>
<!DOCTYPE html> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix='fmt' %> <html> <head> <script src="js/jquery/2.0.0/jquery.min.js"></script> <link href="css/bootstrap/3.3.6/bootstrap.min.css" rel="stylesheet"> <script src="js/bootstrap/3.3.6/bootstrap.min.js"></script> <link href="css/back/style.css" rel="stylesheet"> <script> function checkEmpty(id, name){ var value = $("#"+id).val(); if(value.length==0){ alert(name+ "不能为空"); $("#"+id)[0].focus(); return false; } return true; } function checkNumber(id, name){ var value = $("#"+id).val(); if(value.length==0){ alert(name+ "不能为空"); $("#"+id)[0].focus(); return false; } if(isNaN(value)){ alert(name+ "必须是数字"); $("#"+id)[0].focus(); return false; } return true; } function checkInt(id, name){ var value = $("#"+id).val(); if(value.length==0){ alert(name+ "不能为空"); $("#"+id)[0].focus(); return false; } if(parseInt(value)!=value){ alert(name+ "必须是整数"); $("#"+id)[0].focus(); return false; } return true; } $(function(){ $("a").click(function(){ var deleteLink = $(this).attr("deleteLink"); console.log(deleteLink); if("true"==deleteLink){ var confirmDelete = confirm("确认要删除"); if(confirmDelete) return true; return false; } }); }) </script> </head> <body>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <div class="navitagorDiv"> <nav class="navbar navbar-default navbar-fixed-top navbar-inverse"> <img style="margin-left:10px;margin-right:0px" class="pull-left" src="img/site/tmallbuy.png" height="45px"> <a class="navbar-brand" href="#nowhere">天猫后台</a> <a class="navbar-brand" href="admin_category_list">分类管理</a> <a class="navbar-brand" href="admin_user_list">用户管理</a> <a class="navbar-brand" href="admin_order_list">订单管理</a> </nav> </div>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <script> $(function(){ $("ul.pagination li.disabled a").click(function(){ return false; }); }); </script> <nav> <ul class="pagination"> <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if>> <a href="?page.start=0${page.param}" aria-label="Previous" > <span aria-hidden="true">«</span> </a> </li> <li <c:if test="${!page.hasPreviouse}">class="disabled"</c:if>> <a href="?page.start=${page.start-page.count}${page.param}" aria-label="Previous" > <span aria-hidden="true">‹</span> </a> </li> <c:forEach begin="0" end="${page.totalPage-1}" varStatus="status"> <c:if test="${status.count*page.count-page.start<=20 && status.count*page.count-page.start>=-10}"> <li <c:if test="${status.index*page.count==page.start}">class="disabled"</c:if>> <a href="?page.start=${status.index*page.count}${page.param}" <c:if test="${status.index*page.count==page.start}">class="current"</c:if> >${status.count}</a> </li> </c:if> </c:forEach> <li <c:if test="${!page.hasNext}">class="disabled"</c:if>> <a href="?page.start=${page.start+page.count}${page.param}" aria-label="Next"> <span aria-hidden="true">›</span> </a> </li> <li <c:if test="${!page.hasNext}">class="disabled"</c:if>> <a href="?page.start=${page.last}${page.param}" aria-label="Next"> <span aria-hidden="true">»</span> </a> </li> </ul> </nav>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" isELIgnored="false"%> <div class="footer"> </div> </body> </html>
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
接下来是各种静态资源,诸如jquery, bootstrap, css, 图片等,内容稍杂,就不挨个列出来了。
这些静态资源打包在WebContent.rar里,放在右上角供下载,下载后解压即可,解压之后应该看到多出来如图所示的三个目录。
静态资源
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
在WebContent的WEB-INF目录下新建web.xml。
这个web.xml做了3件事情
1. 让所有请求都进入Struts2的过滤器StrutsPrepareAndExecuteFilter
2. 对所有请求进行UTF-8编码
3. 指定Spring配置文件的位置在classpath:applicationContext.xml
web.xml
<web-app> <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> <dispatcher>FORWARD</dispatcher> <dispatcher>REQUEST</dispatcher> <url-pattern>/*</url-pattern> </filter-mapping> <filter> <filter-name>encodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
步骤 14 :

applicationContext.xml

edit
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
Spring配置文件applicationContext.xml,在本文件中做了如下工作:
1. 启动注解配置
2. 扫描com.how2java包下的类
3. 配置注解驱动事务管理
4. 管理Hibernate的SessionFactory
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation-config /> <context:component-scan base-package="com.how2java" /> <tx:annotation-driven transaction-manager="transactionManager"/> <bean name="sf" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource" ref="ds" /> <!-- 注解扫描 --> <property name="packagesToScan"> <list> <value>com.how2java.*</value> </list> </property> <property name="schemaUpdate"> <value>true</value> </property> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.show_sql=false hbm2ddl.auto=update </value> </property> </bean> <bean name="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/tmall_ssh?characterEncoding=UTF-8" /> <property name="username" value="root" /> <property name="password" value="admin" /> </bean> <!-- 配置事务管理器(声明式的事务) --> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sf"></property> </bean> </beans>
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
Struts2的配置文件struts.xml,做了如下几件事情
1. 编码方式确定为UTF-8
2. 对象的管理,交由Spring进行
3. 使用basicstruts,与CategoryAction 中的相对应basicstruts相对应。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.i18n.encoding" value="UTF-8"></constant> <constant name="struts.objectFactory" value="spring"/> <package name="basicstruts" extends="struts-default"> </package> </struts>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
  <constant name="struts.i18n.encoding" value="UTF-8"></constant>
  <constant name="struts.objectFactory" value="spring"/>
  <package name="basicstruts" extends="struts-default">
        
 </package>
</struts>
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
使用测试类向数据库中添加测试数据。(假设数据库中没有数据,假如已经通过前面的教程导入了数据了,那么这一步就可以省略了)

使用JUnit Test的方式运行TestTmall 类,其作用是当数据库中没有分类数据的时候,添加两条数据
测试数据
package com.how2java.tmall.test; import java.util.List; import org.hibernate.criterion.DetachedCriteria; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.how2java.tmall.dao.impl.DAOImpl; import com.how2java.tmall.pojo.Category; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class TestTmall { @Autowired DAOImpl dao; @Test public void delete() { DetachedCriteria dc = DetachedCriteria.forClass(Category.class); List<Category> cs = dao.findByCriteria(dc); for (Category c : cs) { dao.delete(c); } } @Test public void test() { DetachedCriteria dc = DetachedCriteria.forClass(Category.class); List<Category> cs = dao.findByCriteria(dc); if (cs.isEmpty()) { for (int i = 0; i < 10; i++) { Category c = new Category(); c.setName("测试分类" + (i + 1)); dao.save(c); } System.out.println("成功添加10个测试分类"); } } }
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
在Eclipse中启动Tomcat,为了成功地在Eclipse中启动Tomcat需要多个步骤,如果不熟悉请参考: 使用Dynamic Web Project的方式开发J2EE应用-通过Eclipse启动Tomcat
启动tomcat
步骤 18 :

访问测试地址

edit
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
访问测试地址:

http://127.0.0.1:8080/tmall_ssh/admin_category_list


注: 没有图片是正常的,上传图片将在后续讲解
访问测试地址
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
学习到这个步骤,那么上面的该做的行为都做掉了,这个时候来整理一下调用思路,以便后续的学习思路更加清晰一些。

1. 访问路径/admin_category_list
2. web.xml中的过滤器会将请求交由struts进行处理
3. struts根据listCategory创建对应的CategoryAction
4. 创建CategoryAction的时候注入CategoryService
5. 创建CategoryService的时候注入DAOImpl
6. Struts 调用CategoryAction的list方法
7. 在list方法中调用注入好的DAOImpl,访问数据库,查询结果
8. 跳转到listCategory.jsp显示数据
思路图
完整的SSH模仿天猫项目,使用J2SE、前端技术(包含所有前端jsp文件)、J2EE,SSH一整套技术栈, 从无到有涵盖全部133个知识点,571个开发步骤, 充实SSH项目经验,为简历加上一个有吸引力的砝码.
增值内容,点击购买
在右上角有本知识点对应的可运行项目下载 ,实在自己搞不出来,就下载解压出来比较一下。


HOW2J公众号,关注后实时获知最新的教程和优惠活动,谢谢。


问答区域    
2019-12-10 Action是单例的。scope="prototype"属性添加,不知道添加到哪里?
Ivan2019

看基础知识,试着添加到action中,搞不定 惨! 谢谢




1 个答案

how2j
答案时间:2019-12-10
请参考 SSH系列教材 (三)- 单例: https://how2j.cn/k/ssh/ssh-singleton/787.html#nowhere



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到




2019-09-03 運行不成功
清茶




我所有的步驟都是按照上面的教程來做的,然後進行運行測試的時候報錯,目前都不知道出錯在哪裡?
加载中

							

							


3 个答案

how2j
答案时间:2019-09-04
说明你根本没做到 “所有的步驟都是按照上面的教程來做” 你还有其他地方自己改了,所以跑不起来。 完全照着做,节约的是你自己的时间哦

清茶
答案时间:2019-09-04
项目名称重新命一个也不行呀?因为我要开启两个项目,一个完整的项目和一个学习的项目

how2j
答案时间:2019-09-03
项目名称是 tmall_ssh, 而你的是 tmall_sshDemo, 这就是一个你声明的 “所有的步驟都是按照上面的教程來做” 并不是的地方。 所以还是老老实实的严格做吧,学这个的很多,大家都跑起来了的,要有耐心哦



回答已经提交成功,正在审核。 请于 我的回答 处查看回答记录,谢谢
答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2019-06-25 hibernate 5 是不行的吗?
2019-05-14 还是XSS的问题
2019-05-07 关于后台上传图片


提问太多,页面渲染太慢,为了加快渲染速度,本页最多只显示几条提问。还有 24 条以前的提问,请 点击查看

提问之前请登陆
提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢
关于 已下架实践项目-天猫整站SSH-查询 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 578362961
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: https://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图