| 
 步骤 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 : 可运行项目 
					
					完整的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包 
					
					完整的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 <% 
	response.sendRedirect("../admin_category_list");
%>
 <% 
	response.sendRedirect("../admin_category_list");
%>
					
					完整的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及其中的包含关系 
<%@ 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-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>
 
					
					完整的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
					 
					
					完整的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"属性添加,不知道添加到哪里? 
					
					
						
							
						
											
							
					
					
					
	   
 
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 条以前的提问,请 点击查看 
			
			提问之前请登陆
			
		 
		提问已经提交成功,正在审核。 请于 我的提问 处查看提问记录,谢谢	
	 | |||||||||||||||||