SSH2项目网上书店系统手把手教学_Struts2+Spring+Hibernate整合开发

一 序言

鉴于目前J2EE的火热程度,SSH2是每个学生毕业前都必须掌握的一门技术,所以在这里我就使用SSH2技术做一个小型项目,和大家一起学习。

SSH2技术的基础概论就不再提了,直接说特点吧。

1)编程简单,使用SSH2技术使得JAVA代码的编程变得异常简单,几个模块一划分,功能不言自明。

2)控制逻辑有所优化,这里说有所优化是指对比severlet来讲,在SSH2项目编写过程中,关于XML的配置文件还是比较复杂的。

3)界面编写繁琐,其实这不是SSH2负责的领域了,但是作为一个系统必须有MVC,其中的V不可逾越,因此我们尽量多关注MVJSP页面的编程了解即可。


应大家要求,现提供源码下载,仅作参考:源码下载

二 系统分析

作为一个项目,完成一定的功能即可,过多的追究冷门细节意义不大。因此,项目中使用的SSH2都是基本功能,我的学习过程全靠百度,这里简单说一下SSH2各部门的作用。

Struts2负责控制业务逻辑,即怎么跳转页面,功能怎么组装。

Hibernate负责将对象与数据库关系映射,使我们可以使用面向对象的方法访问数据库。

Spring负责IoCAOP,属于大管家级别,贯穿整个项目。即管理所有对象的生成和负责事务管理。

三 JAVA代码

首先,我们将代码分包,dao,action,entity,filter,interceptor,一般项目都这样分包,当然还可以细分,比如增加service包。

3.1 entity包

实体类包,即存放所有的实体类。JAVA操作的基本单位是对象,实体即我们项目中需要操作的对象的类,这些类可以说是项目的基本组成单位。作为基本组成单位肯定要和数据库打交道,因此每个类需要配置XML来对数据库映射,映射即Hibernate的功能,映射完成后我们可以直接操作对象来与数据库打交道。

3.1.1 Book

我们网上书店肯定首先是书的定义
public class Book implements java.io.Serializable {


	private Integer bookId;//私有化Field,ID,书名,作者等
	private String bookNumber;
	private String bookName;
	private String bookAuthor;
	private String bookPress;
	private String bookPicture;
	private Integer bookAmount;
	private Type type;//这个很重要,这里涉及数据库关联,一本书只有一个类型,一个类型有很多本书,多对一关系many-to-one
	private Timestamp bookShelveTime;
	private Double bookPrice;
	private String bookRemark;
	private Integer bookSales;
	private Double bookNewPrice;

	public Book() {//由于我们写了自己的构造器,所以还要写一个空构造器
	}

	public Book(String bookNumber, String bookName, String bookAuthor,//自定义构造器,带参数
			String bookPress, String bookPicture, Integer bookAmount,
			Type type, Timestamp bookShelveTime, Double bookPrice,
			Integer bookSales) {
		this.bookNumber = bookNumber;
		this.bookName = bookName;
		this.bookAuthor = bookAuthor;
		this.bookPress = bookPress;
		this.bookPicture = bookPicture;
		this.bookAmount = bookAmount;
		this.type = type;
		this.bookShelveTime = bookShelveTime;
		this.bookPrice = bookPrice;
		this.bookSales = bookSales;
	}

	public Book(String bookNumber, String bookName, String bookAuthor,
			String bookPress, String bookPicture, Integer bookAmount,
			Type type, Timestamp bookShelveTime, Double bookPrice,
			String bookRemark, Integer bookSales,Double bookNewPrice) {
		this.bookNumber = bookNumber;
		this.bookName = bookName;
		this.bookAuthor = bookAuthor;
		this.bookPress = bookPress;
		this.bookPicture = bookPicture;
		this.bookAmount = bookAmount;
		this.type = type;
		this.bookShelveTime = bookShelveTime;
		this.bookPrice = bookPrice;
		this.bookRemark = bookRemark;
		this.bookSales = bookSales;
		this.bookNewPrice = bookNewPrice;
	}
//为Field属性生成getter setter 
...
}
entity类直接关系到数据库中,所以这里需要配置XML文件来完成与数据库的映射
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="entity.Book" table="book" catalog="bookstore">
        <id name="bookId" type="java.lang.Integer"><!-- 主键为ID -->
            <column name="bookId" />
            <generator class="native" /><!--跨数据库自增-->
        </id>
        <many-to-one name="type" class="entity.Type" lazy="false"><!-- 如代码中一样,配置到Type的多对一关系 -->
            <column name="typeId" not-null="true" />
        </many-to-one> 
        <property name="bookNumber" type="java.lang.String">
            <column name="bookNumber" length="21" not-null="true" />
        </property>
        <property name="bookName" type="java.lang.String">
            <column name="bookName" length="20" not-null="true" />
        </property>
        <property name="bookAuthor" type="java.lang.String">
            <column name="bookAuthor" length="20" not-null="true" />
        </property>
        <property name="bookPress" type="java.lang.String">
            <column name="bookPress" length="20" not-null="true" />
        </property>
        <property name="bookPicture" type="java.lang.String">
            <column name="bookPicture" length="100" not-null="true" />
        </property>
        <property name="bookAmount" type="java.lang.Integer">
            <column name="bookAmount" not-null="true" />
        </property>
        <property name="bookShelveTime" type="timestamp">
            <column name="bookShelveTime" length="14" not-null="true" />
        </property>
        <property name="bookPrice" type="java.lang.Double">
            <column name="bookPrice" precision="10" not-null="true" />
        </property>
        <property name="bookRemark" type="java.lang.String">
            <column name="bookRemark" length="200" />
        </property>
        <property name="bookSales" type="java.lang.Integer">
            <column name="bookSales" not-null="true" />
        </property>            
    </class>
</hibernate-mapping>

3.1.2 Type

书里面包含了书的类型,类型定义
public class Type implements java.io.Serializable {


	private Integer typeId;//类型编号,类型名
	private String typeName;

	public Type() {
	}

	public Type(String typeName) {
		this.typeName = typeName;
	}
//生成setter getter方法
...
}

3.1.3 User

接下来肯定是User用户类了
public class User implements java.io.Serializable {

	private Integer userId;
	private String userName;
	private String userPassword;
	private String userEmail;
	private String userNickname;
	private Sex sex;//性别为多对一关系
	private String userAddress;
	private String userPhone;
	private String userRemark;

	public User() {
	}

	public User(String userName, String userPassword, String userEmail,
			Sex sex) {
		this.userName = userName;
		this.userPassword = userPassword;
		this.userEmail = userEmail;
		this.sex = sex;
	}

	public User(String userName, String userPassword, String userEmail,
			String userNickname, Sex sex, String userAddress,
			String userPhone, String userRemark) {
		this.userName = userName;
		this.userPassword = userPassword;
		this.userEmail = userEmail;
		this.userNickname = userNickname;
		this.sex = sex;
		this.userAddress = userAddress;
		this.userPhone = userPhone;
		this.userRemark = userRemark;
	}
//生成getter setter方法
...
}

对User进行映射
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="entity.User" table="user" catalog="bookstore">
        <id name="userId" type="java.lang.Integer">
            <column name="userId" />
            <generator class="native" />
        </id>
        <many-to-one name="sex" class="entity.Sex" lazy="false"><!-- 多对一映射,lazy设置后读取时自动级联读取内容 -->
            <column name="sexId" not-null="true" />
        </many-to-one>        
        <property name="userName" type="java.lang.String">
            <column name="userName" length="16" not-null="true" />
        </property>
        <property name="userPassword" type="java.lang.String">
            <column name="userPassword" length="12" not-null="true" />
        </property>
        <property name="userEmail" type="java.lang.String">
            <column name="userEmail" length="100" not-null="true" />
        </property>
        <property name="userNickname" type="java.lang.String">
            <column name="userNickname" length="10" />
        </property>
        <property name="userAddress" type="java.lang.String">
            <column name="userAddress" length="200" />
        </property>
        <property name="userPhone" type="java.lang.String">
            <column name="userPhone" length="24" />
        </property>
        <property name="userRemark" type="java.lang.String">
            <column name="userRemark" length="200" />
        </property>
    </class>
</hibernate-mapping>

3.1.4 Sex

程序员看到这个字段可能会小激动一下,请冷静一下,这只是性别的男女而已
public class Sex implements java.io.Serializable {

	private Integer sexId;
	private String sexType;

	public Sex() {
	}

	public Sex(String sexType) {
		this.sexType = sexType;
	}
//生成setter getter方法
...
}

然后生成数据库映射
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="entity.Sex" table="sex" catalog="bookstore">
        <id name="sexId" type="java.lang.Integer">
            <column name="sexId" />
            <generator class="native" />
        </id>
        <property name="sexType" type="java.lang.String">
            <column name="sexType" length="4" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

3.1.5 Bargain

作为一个成熟的系统,肯定该出现一些稍微不是特别直观的实体类了,比如折扣,哪本书打折了,现在卖多少钱
public class Bargain implements java.io.Serializable {

	private Integer bargainId;
	private Book book;//多对一关系,一本书可以有各种折扣
	private Double bookNewPrice;

	public Bargain() {
	}

	public Bargain(Book book, Double bookNewPrice) {
		this.book = book;
		this.bookNewPrice = bookNewPrice;
	}
//生成getter setter方法
...
}

数据库映射
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="entity.Bargain" table="bargain" catalog="bookstore">
        <id name="bargainId" type="java.lang.Integer">
            <column name="bargainId" />
            <generator class="native" />
        </id>
        <many-to-one name="book" class="entity.Book" lazy="false" unique="true"><!-- 多对一配置,可以级联读取,唯一存在 -->
            <column name="bookId" not-null="true" />
        </many-to-one>
        <property name="bookNewPrice" type="java.lang.Double">
            <column name="bookNewPrice" precision="10" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

3.1.6 Manager

这时候就该出现管理员了,权限狗,来管理系统
public class Manager implements java.io.Serializable {


	private Integer managerId;
	private String managerName;
	private String managerPassword;

	public Manager() {
	}

	public Manager(String managerName, String managerPassword) {
		this.managerName = managerName;
		this.managerPassword = managerPassword;
	}
//生成getter setter方法
...
}

数据库映射
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="entity.Manager" table="manager" catalog="bookstore">
        <id name="managerId" type="java.lang.Integer">
            <column name="managerId" />
            <generator class="native" />
        </id>
        <property name="managerName" type="java.lang.String">
            <column name="managerName" length="16" not-null="true" />
        </property>
        <property name="managerPassword" type="java.lang.String">
            <column name="managerPassword" length="12" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

3.1.7 Order

订单类,由于订单里面需要出现用户,书,其他信息,所以这里用两张表来表示,使用两个多对一来完成多对多
<pre name="code" class="java">public class Orders implements java.io.Serializable {

	private Integer ordersId;
	private String ordersNumber;
	private User user;//这是哪个用户的订单,多对一关系
	private Timestamp ordersTime;
	private String isDeal;
	private Double totalMoney;

	public Orders() {
	}

	public Orders(String ordersNumber,User user, Timestamp ordersTime,String isDeal,Double totalMoney) {
		this.ordersNumber = ordersNumber;
		this.user = user;
		this.ordersTime = ordersTime;
		this.isDeal = isDeal;
		this.totalMoney = totalMoney;
	}
//生成getter setter方法
...
}

数据库映射
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="entity.Orders" table="orders" catalog="bookstore">
        <id name="ordersId" type="java.lang.Integer">
            <column name="ordersId" />
            <generator class="native" />
        </id>
        <property name="ordersNumber" type="java.lang.String">
            <column name="ordersNumber" length="21" not-null="true" />
        </property>        
        <many-to-one name="user" class="entity.User" lazy="false">
            <column name="userId" not-null="true" />
        </many-to-one>
        <property name="ordersTime" type="timestamp">
            <column name="ordersTime" length="19" not-null="true" />
        </property>
        <property name="isDeal" type="java.lang.String">
            <column name="isDeal" length="1" not-null="true" />
        </property>   
        <property name="totalMoney" type="java.lang.Double">
            <column name="totalMoney" precision="10" not-null="true" />
        </property>               
    </class>
</hibernate-mapping>

3.1.8 Ordersbook

public class Ordersbook implements java.io.Serializable {

	private Integer ordersBookId;
	private Orders orders;//好多书对应一个订单,因此是多对一
	private Book book;//好多订单都可以有某一本书,谋一本书可以出现在好多订单中,多对一
	private Integer bookAmount;

	public Ordersbook() {
	}

	public Ordersbook(Orders orders, Book book, Integer bookAmount) {
		this.orders = orders;
		this.book = book;
		this.bookAmount = bookAmount;
	}
//生成setter getter方法
...
}

数据库映射
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="entity.Ordersbook" table="ordersbook" catalog="bookstore">
        <id name="ordersBookId" type="java.lang.Integer">
            <column name="ordersBookId" />
            <generator class="native" />
        </id>
        <many-to-one name="orders" class="entity.Orders" lazy="false"><!-- 两个多对一代替了多对多 -->
            <column name="ordersId" not-null="true" />
        </many-to-one>
        <many-to-one name="book" class="entity.Book" lazy="false" unique="true">
            <column name="bookId" not-null="true" />
        </many-to-one>
        <property name="bookAmount" type="java.lang.Integer">
            <column name="bookAmount" not-null="true" />
        </property>
    </class>
</hibernate-mapping>

3.1.9 Recommended

推荐购书目录,大家都懂
public class Recommended implements java.io.Serializable {

	private Integer recommendedId;
	private Book book;

	public Recommended() {
	}

	public Recommended(Book book) {
		this.book = book;
	}
//生成getter setter方法
...
}

数据库映射
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping>
    <class name="entity.Recommended" table="recommended" catalog="bookstore">
        <id name="recommendedId" type="java.lang.Integer">
            <column name="recommendedId" />
            <generator class="native" />
        </id>
        <many-to-one name="book" class="entity.Book" lazy="false" unique="true">
            <column name="bookId" not-null="true" />
        </many-to-one>
    </class>
</hibernate-mapping>

至此,所有的实体类结束,实体类种类繁多,但是都很简单,不涉及逻辑,注意数据库关联的时候的多对一的关系即可

3.2 dao包

实体类结束,该管理实体类了。
其实这里可以额外分化出service包,即service定义管理方法,dao才去和数据库打交道。
比如,我的service定义有一个方法是先存储用户,后存储书,再存储订单,这三个功能是一个方法,dao就可以分别写三个方法,然后再service中组装。
这里我们的功能没那么复杂,所以就直接写成dao了。因为在功能简单的情况下,写完service和dao后,你会发现service写的和dao一模一样。

3.2.1 BookManager

管理图书的操作,CRUD以及花样CRUD
package dao;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import java.util.*;

import entity.*;

public class BookManage extends HibernateDaoSupport {

	// 添加新的图书
	public int addBook(Book book) {
		int i = 0;
		try {
			this.getHibernateTemplate().save(book);//利用hibernate的模板操作,编码简单
			i = 1;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return i;
	}
	// 修改图书
	public int updateBook(Book book) {
		int i = 0;
		try {
			this.getHibernateTemplate().update(book);
			i = 1;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return i;
	}

	// 根据图书ID查询该图书
	public Book findBook(int bookId) {
		try {
			Book book = (Book) this.getHibernateTemplate().get("entity.Book",bookId);
			return book;
		} catch (RuntimeException re) {
			throw re;
		}
	}

	// 查询销量最好的图书
	@SuppressWarnings("unchecked")
	public List<Book> bestSellingBook(int pageNumber, int pageSize) {
		String hql = "from Book as book where book.bookSales > 0 and book.bookAmount > 0 order by book.bookSales desc ";
		try {
			List<Book> bestSellingBook = this.getHibernateTemplate().find(hql);
			return bestSellingBook;
		} catch (RuntimeException re) {
			throw re;
		}
	}

	// 查询最新上架的图书
	@SuppressWarnings("unchecked")
	public List<Book> latestBook(int pageNumber, int pageSize) {
		String hql = "from Book as book where book.bookAmount > 0 order by book.bookShelveTime desc ";
		try {
			List<Book> latestBook = this.getHibernateTemplate().find(hql);
			return latestBook;
		} catch (RuntimeException re) {
			throw re;
		}
	}

	// 查询推荐图书ID
	@SuppressWarnings("unchecked")
	public List<Recommended> allRecommended(int pageNumber, int pageSize) {
		String hql = "from Recommended as recommended ";
		try {
			List<Recommended> allRecommended = this.getHibernateTemplate().find(hql);
			return allRecommended;
		} catch (RuntimeException re) {
			throw re;
		}
	}

	// 查询特价图书ID
	@SuppressWarnings("unchecked")
	public List<Bargain> allBargain(int pageNumber, int pageSize) {
		String hql = "from Bargain as bargain ";
		try {
			List<Bargain> allBargain = this.getHibernateTemplate().find(hql);
			return allBargain;
		} catch (RuntimeException re) {
			throw re;
		}
	}

	// 根据图书名称查询图书
	@SuppressWarnings("unchecked")
	public List<Book> allBookByName(String bookName, int pageNumber,
			int pageSize) {
		String hql = "from Book as book where book.bookName like '%" + bookName + "%'";
		try {
			this.getHibernateTemplate().setMaxResults(pageSize);
			List<Book> allBookByName = this.getHibernateTemplate().find(hql);
			return allBookByName;
		} catch (RuntimeException re) {
			throw re;
		}
	}

	// 根据作者查询图书
	@SuppressWarnings("unchecked")
	public List<Book> allBookByAuthor(String bookAuthor, int pageNumber, int pageSize) {
		String hql = "from Book as book where book.bookAuthor like '%" + bookAuthor + "%'";
		try {
			this.getHibernateTemplate().setMaxResults(pageSize);
			List<Book> allBookByAuthor = this.getHibernateTemplate().find(hql);
			return allBookByAuthor;
		} catch (RuntimeException re) {
			throw re;
		}
	}

	// 根据出版社查询图书
	@SuppressWarnings("unchecked")
	public List<Book> allBookByPress(String bookPress, int pageNumber, int pageSize) {
		String hql = "from Book as book where book.bookPress like '%" + bookPress + "%'";
		try {
			this.getHibernateTemplate().setMaxResults(pageSize);
			List<Book> allBookByPress = this.getHibernateTemplate().find(hql);
			return allBookByPress;
		} catch (RuntimeException re) {
			throw re;
		}
	}
	
	//根据类别ID来获取类别
	public Type findType(int typeId){
		try{
			Type type = (Type)this.getHibernateTemplate().get("entity.Type", typeId);
			return type;
		}catch(RuntimeException re){
			throw re;
		}
	}
	
	//根据图书类别来查询图书
	@SuppressWarnings("unchecked")
	public List<Book> allBookByType(int typeId, int pageNumber, int pageSize){
		String hql = "from Book as book where book.type.typeId="+typeId;
		try{
			List<Book> allBookByType= this.getHibernateTemplate().find(hql);
			return allBookByType;
		}catch(RuntimeException re){
			throw re;
		}
	}
	
	//查询图书是否为特价图书
	@SuppressWarnings("unchecked")
	public Bargain isBargain(int bookId){
		Bargain bargain = null;
		String hql = "from Bargain as bargain where bargain.book.bookId="+bookId;
		try{
			List<Bargain> bargainList = this.getHibernateTemplate().find(hql); 
			if(bargainList.size() > 0){
				bargain = bargainList.get(0);
			}
		}catch(RuntimeException re){
			throw re;
		}
		return bargain;
	}
}

3.2.2 OrdersManager

处理和订单相关的操作
package dao;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import java.sql.SQLException;
import java.util.*;
import entity.*;

public class OrdersManage extends HibernateDaoSupport{
	
	//查询所有订单
	@SuppressWarnings("unchecked")
	public List<Orders> allOrders(final int pageNumber,final int pageSize){
		List<Orders> allOrders = getHibernateTemplate().executeFind(new HibernateCallback() {
			public Object doInHibernate(Session session) throws HibernateException, SQLException {
				String hql = "from Orders as orders order by ordersTime desc";
				Query query = session.createQuery(hql);
				query.setFirstResult((pageNumber-1)*pageSize);
				query.setMaxResults(pageSize);
				List<Orders> list = query.list();
				return list;
			}
		});
		return allOrders;
	}
	
	//查询所有订单
	@SuppressWarnings("unchecked")
	public List<Orders> allOrdersByDeal(final String isDeal,final int pageNumber,final int pageSize){
		List<Orders> allOrders = getHibernateTemplate().executeFind(new HibernateCallback() {
			public Object doInHibernate(Session session) throws HibernateException, SQLException {
				String hql = "from Orders as orders where orders.isDeal = '"+isDeal+"' order by ordersTime desc";
				Query query = session.createQuery(hql);
				query.setFirstResult((pageNumber-1)*pageSize);
				query.setMaxResults(pageSize);
				List<Orders> list = query.list();
				return list;
			}
		});
		return allOrders;
	}

	//添加一个新的订单
	@SuppressWarnings("unchecked")
	public int addOrders(Orders orders){
		int i = 0;
		try{
			this.getHibernateTemplate().save(orders);
			String hql = "select max(ordersId) from Orders";
			List<Integer> idList = this.getHibernateTemplate().find(hql);
			if(idList.size()>0){
				i = idList.get(0);
			}
		}catch (RuntimeException re) {
			throw re;
		}
		return i ;
	}
	
	//删除一个订单
	public int deleteOrders(int ordersId){
		int i = 0;
		try{
			this.getHibernateTemplate().delete(this.getHibernateTemplate().get("entity.Orders", ordersId));
			i = 1;
		}catch(RuntimeException re){
			throw re;
		}
		return i ;
	}
	
	//修改订单
	public void updateOrders(Orders orders){
		try{
			this.getHibernateTemplate().update(orders);
		}catch(RuntimeException re){
			throw re;
		}
	}
	
	//根据ID查询订单
	public Orders findOrders(int ordersId){
		try{
			Orders orders = (Orders)this.getHibernateTemplate().get("entity.Orders", ordersId);
			return orders;
		}catch(RuntimeException re){
			throw re;
		}
	}
	
	//添加一条订单图书信息
	public void addOrdersbook(Ordersbook ordersbook){
		try{
			this.getHibernateTemplate().save(ordersbook);
		}catch (RuntimeException re) {
			throw re;
		}
	}
	
	//根据userId获取该用户所有订单
	@SuppressWarnings("unchecked")
	public List<Orders> allOrdersByUser(int userId,int pageNumber,int pageSize){
		String hql = "from Orders as orders where orders.user.userId="+userId+" order by ordersTime desc";
		try{
			List<Orders> allOrdersByUser = this.getHibernateTemplate().find(hql);
			return allOrdersByUser;
		}catch(RuntimeException re){
			throw re;
		}
	}
	//根据userId,订单处理状态获取该用户所有订单
	@SuppressWarnings("unchecked")
	public List<Orders> allOrdersByUserDeal(int userId,String isDeal,int pageNumber,int pageSize){
		String hql = "from Orders as orders where orders.user.userId="+userId+" and orders.isDeal='"+isDeal+"' order by ordersTime desc";
		try{
			List<Orders> allOrdersByUser = this.getHibernateTemplate().find(hql);
			return allOrdersByUser;
		}catch(RuntimeException re){
			throw re;
		}
	}
	
	//根据ordersId获取该订单所有订单图书
	@SuppressWarnings("unchecked")
	public List<Ordersbook> allOrdersbookByOrders(int ordersId){
		String hql = "from Ordersbook as ordersbook where ordersbook.orders.ordersId="+ordersId;
		try{
			List<Ordersbook> allOrdersbookByOrders = this.getHibernateTemplate().find(hql);
			return allOrdersbookByOrders;
		}catch(RuntimeException re){
			throw re;
		}
	}
	
	
}

3.2.3 PersonManager

对人的操作,包括用户与管理员
package dao;

import java.util.*;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import entity.*;

public class PersonManage extends HibernateDaoSupport {

	//管理员登录验证
	@SuppressWarnings("unchecked")
	public boolean checkManager(String managerName,String managerPassword){
		boolean flag = false;
		String hql = "from Manager as manager where manager.managerName = '"+managerName+"' and manager.managerPassword = '"+managerPassword+"'";
		List<Manager> managerList = this.getHibernateTemplate().find(hql);
		if(managerList.size()>0){
			flag = true;
		}
		return flag;
	}
	
	//获取用户信息
	public User findUser(int userId){
		try{
			User user = (User)this.getHibernateTemplate().get("entity.User", userId);
			return user;
		}catch(RuntimeException re){
			throw re;
		}
	}
	
	//普通用户登录验证
	@SuppressWarnings("unchecked")
	public User checkUser(String userName,String userPassword){
		String hql = "from User as user where user.userName = '"+userName+"' and user.userPassword = '"+userPassword+"'";
		User user = null;
		try{
			List<User> userList = this.getHibernateTemplate().find(hql);
			if(userList.size() > 0){
				user = new User();
				user = userList.get(0);
			}
		}catch(RuntimeException re){
			throw re;
		}
		return user;
	}
	//检查注册用户名是否已经存在
	@SuppressWarnings("unchecked")
	public boolean isUserNameExist(String userName){
		boolean flag = true;
		String hql = "from User as user where user.userName = '"+userName+"'";
		try{
			List<User> userList= this.getHibernateTemplate().find(hql);
			if(userList.size() == 0){
				flag = false;
			}
			return flag;
		}catch (RuntimeException re) {
			throw re;
		}
	}
	//添加一条用户信息
	public int addUser(User user){
		int i = 0;
		try{
			this.getHibernateTemplate().save(user);
			i = 1;
		}catch(RuntimeException re){
			throw re;
		}
		return i ;
	}
	//修改一条用户信息
	public int updateUserInfor(User user){
		int i = 0;
		try{
			this.getHibernateTemplate().update(user);
			i = 1;
		}catch (RuntimeException re) {
			throw re;
		}
		return i;
	}
	//根据sexId查询Sex
	public Sex findSex(int sexId){
		try{
			Sex sex = (Sex)this.getHibernateTemplate().get("entity.Sex", sexId);
			return sex;
		}catch (RuntimeException re) {
			throw re;
		}
	}
}
至此,常见的操作已经结束。
可能大家会觉得操作功能很乱,没有很清晰的逻辑,那是因为大家没有从做这个系统的需求分析,有了需求分析以后需要什么功能都一目了然,编写起来就不乱了。

3.3 action包

这是最烦的一个包,之前实现了各种功能。但是都是基础功能,这些功能还没有去组装起来。这里的Action完全支撑了JSP页面中的每一个按钮。
所以这里需要有那个Action其实也是需求分析里面分析过了的,页面有什么按钮,这里就有什么Action。
下面类名很清晰,基本不用什么解释

3.3.1 AllBookAction

获取推荐书、新书、特价书,这些可以作为全局变量看待,因为总是在JSP中显示。
package com.huizhi.action;

import com.opensymphony.xwork2.ActionSupport;

import java.util.*;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import dao.BookManage;
import entity.*;

@SuppressWarnings("serial")
public class AllBookAction extends ActionSupport{
	
	private BookManage bookManage;
	//Spring注入bookManage
	public void setBookManage(BookManage bookManage) {
		this.bookManage = bookManage;
	}
	
	public String execute(){
		//推荐书
		List<Recommended> allRecommended = bookManage.allRecommended(1, 6);
		List<Book> recommendedBook = new ArrayList<Book>();
		for(Recommended recommended : allRecommended){
			Book book = new Book();
			book = recommended.getBook();
			recommendedBook.add(book);
		}
		//特价书
		List<Bargain> allBargain = bookManage.allBargain(1, 6);
		List<Book> bargainBook = new ArrayList<Book>();
		for(Bargain bargain : allBargain){
			Book book = new Book();
			book = bargain.getBook();
			bargainBook.add(book);
		}
		//新书
		List<Book> latestBook = bookManage.latestBook(1, 6);
		
		HttpServletRequest request = ServletActionContext.getRequest();
		request.setAttribute("recommendedBook", recommendedBook);
		request.setAttribute("bargainBook", bargainBook);
		request.setAttribute("latestBook", latestBook);
		
		return null;
	}

}

3.3.2 AllOrderAction

获得所有订单信息
package com.huizhi.action;

import com.opensymphony.xwork2.ActionSupport;

import dao.*;
import java.util.*;
import entity.*;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

@SuppressWarnings("serial")
public class AllOrdersAction extends ActionSupport{

	private OrdersManage ordersManage;
	//Spring注入
	public void setOrdersManage(OrdersManage ordersManage) {
		this.ordersManage = ordersManage;
	}
	public String execute(){
		HttpServletRequest request = ServletActionContext.getRequest();
		List<Orders> allOrders = new ArrayList<Orders>();
		String pageNumberString = request.getParameter("pageNumber");
		if(pageNumberString == null || "".equals(pageNumberString.trim())){
			pageNumberString = "1";
		}
		int pageNumber = Integer.parseInt(pageNumberString);
		pageNumber = 1;
		int pageSize = 10;
		String searchType = request.getParameter("searchType");
		if(searchType == null || "".equals(searchType.trim())){
			searchType = "all";
		}
		if("all".equals(searchType)){
			allOrders = ordersManage.allOrders(pageNumber, pageSize);
		}
		if("isDeal".equals(searchType)){
			allOrders = ordersManage.allOrdersByDeal("1", pageNumber, pageSize);
		}
		if("isNotDeal".equals(searchType)){
			allOrders = ordersManage.allOrdersByDeal("0", pageNumber, pageSize);
		}
		int sequence = (pageNumber-1)*pageSize;
		request.setAttribute("allOrders", allOrders);
		request.setAttribute("sequence", sequence);
		return null;
	}
}

3.3.3 BookAction

package com.huizhi.action;

import java.io.File;
import java.sql.Timestamp;
import java.text.*;
import java.util.*;
import java.util.Date;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import dao.BookManage;
import entity.*;

@SuppressWarnings("serial")
public class BookAction extends ActionSupport{

	private String bookName;
	private String bookAuthor;
	private String bookPress;
	private String bookRemark;
	private int typeId;
	private int bookAmount;
	private double bookPrice;
	private BookManage bookManage;
	
	private File doc;
	private String fileName;
	private String contentType;
	private String dir;
	private String targetFileName;

	public void setDoc(File file) {
		this.doc = file;
	}

	public void setDocFileName(String fileName) {
		this.fileName = fileName;
	}
	public void setDocContentType(String contentType) {
		this.contentType = contentType;
	}
	
	public String getDir() {
		return dir;
	}
	public void setDir(String dir) {
		this.dir = dir;
	}
	public String getContentType() {
		return contentType;
	}
	public void setContentType(String contentType) {
		this.contentType = contentType;
	}
	public String getTargetFileName() {
		return targetFileName;
	}
	public void setTargetFileName(String targetFileName) {
		this.targetFileName = targetFileName;
	}
	private String generateFileName(String fileName){
		DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
		String formatDate = format.format(new Date());
		int random = new Random().nextInt(100000);
		int position = fileName.lastIndexOf(".");
		String extension = fileName.substring(position);
		return formatDate+random+extension;
	}
	
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public String getBookAuthor() {
		return bookAuthor;
	}
	public void setBookAuthor(String bookAuthor) {
		this.bookAuthor = bookAuthor;
	}
	public String getBookPress() {
		return bookPress;
	}
	public void setBookPress(String bookPress) {
		this.bookPress = bookPress;
	}
	public String getBookRemark() {
		return bookRemark;
	}
	public void setBookRemark(String bookRemark) {
		this.bookRemark = bookRemark;
	}
	public int getTypeId() {
		return typeId;
	}
	public void setTypeId(int typeId) {
		this.typeId = typeId;
	}
	public int getBookAmount() {
		return bookAmount;
	}
	public void setBookAmount(int bookAmount) {
		this.bookAmount = bookAmount;
	}
	public double getBookPrice() {
		return bookPrice;
	}
	public void setBookPrice(double bookPrice) {
		this.bookPrice = bookPrice;
	}
	public void setBookManage(BookManage bookManage) {
		this.bookManage = bookManage;
	}
	@SuppressWarnings("deprecation")
	public String execute(){
		String page = "success";
		String realPath = ServletActionContext.getRequest().getRealPath("/upload");
		String targetDirectory = realPath;
		targetFileName  =generateFileName(fileName);
		setDir(targetDirectory+"\"+targetFileName);
		File target = new File(targetDirectory,targetFileName);
		try {
			FileUtils.copyFile(doc, target);
		} catch (Exception e) {
			e.printStackTrace();
		}
		Book book = new Book();
		book.setBookName(bookName);
		book.setBookAuthor(bookAuthor);
		book.setBookPress(bookPress);
		book.setBookPicture(targetFileName);//图片地址
		book.setBookRemark(bookRemark);
		book.setBookPrice(bookPrice);
		book.setBookAmount(bookAmount);
		Type type = bookManage.findType(typeId);
		book.setType(type);//类别
		book.setBookSales(0);
		
		String bookNumber = "TSBH";
		DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
		String formatDate = format.format(new Date());
		int random = new Random().nextInt(100000);
		bookNumber += formatDate + random;
		
		book.setBookNumber(bookNumber);
		book.setBookShelveTime(new Timestamp(new Date().getTime()));
		bookManage.addBook(book);
		return page;
	}
}

3.3.4 DealOrdersAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import dao.OrdersManage;
import entity.Orders;

@SuppressWarnings("serial")
public class DealOrdersAction extends ActionSupport{

	private OrdersManage ordersManage;
	
	public void setOrdersManage(OrdersManage ordersManage) {
		this.ordersManage = ordersManage;
	}

	public String execute(){
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		String ordersIdString = request.getParameter("ordersId");
		int ordersId = Integer.parseInt(ordersIdString);
		Orders orders = ordersManage.findOrders(ordersId);
		orders.setIsDeal("1");
		ordersManage.updateOrders(orders);
		try {
			response.sendRedirect("../manage/manageAllOrders.jsp?searchType=all");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

3.3.5 EnrollAction

package com.huizhi.action;

import java.util.regex.Pattern;

import com.opensymphony.xwork2.ActionSupport;

import dao.PersonManage;
import entity.*;

@SuppressWarnings("serial")
public class EnrollAction extends ActionSupport{
		
	private String userName;
	private String userPassword;
	private String userRePassword;
	private String userEmail;
	private PersonManage personManage;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserPassword() {
		return userPassword;
	}
	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}
	public String getUserRePassword() {
		return userRePassword;
	}
	public void setUserRePassword(String userRePassword) {
		this.userRePassword = userRePassword;
	}
	public String getUserEmail() {
		return userEmail;
	}
	public void setUserEmail(String userEmail) {
		this.userEmail = userEmail;
	}
	public void setPersonManage(PersonManage personManage) {
		this.personManage = personManage;
	}
	
	public String execute(){
		User newUser = new User();
		newUser.setUserName(userName);
		newUser.setUserPassword(userPassword);
		newUser.setUserEmail(userEmail);
		Sex sex = personManage.findSex(3);
		newUser.setSex(sex);
		personManage.addUser(newUser);
		return "success";
	}
	public void validate(){
		if(!Pattern.matches("[a-zA-Z][a-zA-Z0-9]{5,15}", userName)){
			addFieldError("userName", "用户名请使用6-16位英文字母或数字,且以字母开头!");
		}
		if(!Pattern.matches("[a-zA-Z0-9]{6,12}", userPassword)){
			addFieldError("userPassword", "密码请使用6-12位英文字母或数字!");
		}
		if(!userRePassword.equals(userPassword)){
			addFieldError("userRePassword", "两次密码不一致!");
		}
		if("".equals(userEmail.trim())){
			addFieldError("userEmail", "邮箱不能为空!");
		}
		boolean flag = true; 
		flag = personManage.isUserNameExist(userName);
		if(flag){
			addFieldError("userName", "用户名已经存在!");
		}
	}
}

3.3.5 LeftAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

import java.util.*;

import dao.BookManage;
import entity.*;

@SuppressWarnings("serial")
public class LeftAction extends ActionSupport{
	private BookManage bookManage;
	public void setBookManage(BookManage bookManage) {
		this.bookManage = bookManage;
	}
	public String execute(){
		//销量排行榜
		List<Book>	bestSellingBook = bookManage.bestSellingBook(1, 10);
		HttpServletRequest request = ServletActionContext.getRequest();
		request.setAttribute("bestSellingBook", bestSellingBook);
		return null;
	}
}

3.3.6 LoginAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

import dao.PersonManage;
import entity.User;

@SuppressWarnings("serial")
public class LoginAction extends ActionSupport{
	
	private String userName;
	private String userPassword;
	private PersonManage personManage;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserPassword() {
		return userPassword;
	}
	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}
	public void setPersonManage(PersonManage personManage) {
		this.personManage = personManage;
	}
	
	
	//普通用户登录
	public String loginCheck(){
		String page = "fail";
		User user = new User();
		user = personManage.checkUser(userName, userPassword);
		if(user != null){
			page = "success";
			HttpServletRequest request = ServletActionContext.getRequest();
			HttpSession session = request.getSession();
			if(session.getAttribute("loginUser") != null){
				session.removeAttribute("loginUser");
			}
			session.setAttribute("loginUser", user);
		}
		return page;
	}
	//管理员登录
	public String managerLoginCheck(){
		String page = "fail";
		boolean flag = false;
		flag = personManage.checkManager(userName, userPassword);
		if(flag){
			page = "success";
			HttpServletRequest request = ServletActionContext.getRequest();
			HttpSession session = request.getSession();
			if(session.getAttribute("managerLoginName") != null){
				session.removeAttribute("managerLoginName");
			}
			session.setAttribute("managerLoginName", userName);			
		}
		return page;
	}
}

3.3.7 OneTypeAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

import java.util.*;
import dao.*;
import entity.*;

@SuppressWarnings("serial")
public class OneTypeAction extends ActionSupport{
	
	private BookManage bookManage;
	public void setBookManage(BookManage bookManage) {
		this.bookManage = bookManage;
	}
	
	public String execute(){
		String page = "oneType";
		List<Book> bookList = new ArrayList<Book>();
		String typeDescribe = "";
		HttpServletRequest request = ServletActionContext.getRequest();
		String searchType = request.getParameter("searchType");
		String searchDescribe = request.getParameter("searchDescribe");

		if(searchType == null || "".equals(searchType.trim())){
			page = "error";
		}
		else {
			if(searchDescribe == null || "".equals(searchDescribe.trim())){
				page = "error";
			}else{
				if("bookName".equals(searchType)){//按图书名称
					bookList = bookManage.allBookByName(searchDescribe, 1, 10);
					typeDescribe = searchDescribe;
				}
				else if("bookAuthor".equals(searchType)){//按作者名称
					bookList = bookManage.allBookByAuthor(searchDescribe, 1, 10);
					typeDescribe = searchDescribe;
				}
				else if("bookPress".equals(searchType)){//按出版社
					bookList = bookManage.allBookByPress(searchDescribe, 1, 10);
					typeDescribe = searchDescribe;
				}
				else if("bookType".equals(searchType)){//按书本类别
					int typeId = Integer.parseInt(searchDescribe);
					Type type = bookManage.findType(typeId);
					bookList = bookManage.allBookByType(typeId, 1, 10);
					typeDescribe = type.getTypeName();
				}
				else if("bookStatus".equals(searchType)){//按书本现状,指特价、畅销、最新、推荐
					if("bestSelling".equals(searchDescribe)){
						//畅销书
						typeDescribe = "畅销图书";
						bookList = bookManage.bestSellingBook(1, 10);
					}
					else if("latest".equals(searchDescribe)){
						//最新书
						typeDescribe = "最新图书";
						bookList = bookManage.latestBook(1, 10);
					}
					else if("recommended".equals(searchDescribe)){
						//推荐书
						typeDescribe = "推荐图书";
						List<Recommended> allRecommended = bookManage.allRecommended(1, 6);
						for(Recommended recommended : allRecommended){
							Book book = new Book();
							book = recommended.getBook();
							bookList.add(book);
						}
					}
					else if("bargain".equals(searchDescribe)){
						//特价书
						typeDescribe = "特价图书";
						List<Bargain> allBargain = bookManage.allBargain(1, 6);
						for(Bargain bargain : allBargain){
							Book book = new Book();
							book = bargain.getBook();
							bookList.add(book);
						}
					}else{
						page = "error";
					}
				}else{
					page = "error";
				}
			}
		}
		request.setAttribute("typeDescribe", typeDescribe);
		request.setAttribute("bookList", bookList);
		return page;
	}

}


3.3.8 OrdersAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

import dao.*;
import entity.*;
import java.util.*;

@SuppressWarnings("serial")
public class OrdersAction extends ActionSupport{

	private OrdersManage ordersManage;

	public void setOrdersManage(OrdersManage ordersManage) {
		this.ordersManage = ordersManage;
	}
	
	public String execute(){
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = request.getSession();
		User user = (User)session.getAttribute("loginUser");
		List<Orders> allOrdersByUser = new ArrayList<Orders>();
		String searchType = request.getParameter("searchType");
		if(searchType == null || "".equals(searchType.trim())){
			searchType = "all";
		}
		if("all".equals(searchType)){
			allOrdersByUser = ordersManage.allOrdersByUser(user.getUserId(), 1, 5);
		}
		if("isDeal".equals(searchType)){
			allOrdersByUser = ordersManage.allOrdersByUserDeal(user.getUserId(), "1", 1, 5);
		}
		if("isNotDeal".equals(searchType)){
			allOrdersByUser = ordersManage.allOrdersByUserDeal(user.getUserId(), "0", 1, 5);
		}
		request.setAttribute("allOrdersByUser", allOrdersByUser);
		int sequence = (1-1)*5;
		request.setAttribute("sequence", sequence);
		return null;
	}
}

3.3.9 OrdersManageAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

import dao.*;
import entity.*;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;

@SuppressWarnings("serial")
public class OrdersManageAction extends ActionSupport{

	private OrdersManage ordersManage;
	public void setOrdersManage(OrdersManage ordersManage) {
		this.ordersManage = ordersManage;
	}

	@SuppressWarnings("unchecked")
	public String execute(){
		
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = request.getSession();
		
		String updateType = request.getParameter("updateType");
		if("add".equals(updateType)){
			
			List<Book> shoppingBook = (List)session.getAttribute("shoppingBook");
			double totalMoney = (Double)session.getAttribute("totalMoney");
			User user = (User)session.getAttribute("loginUser");
			Orders orders = new Orders();
			orders.setUser(user);
			orders.setOrdersTime(new Timestamp(new Date().getTime()));
			orders.setIsDeal("0");
			orders.setTotalMoney(totalMoney);
			String ordersNumber = "DDBH";
			DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
			String formatDate = format.format(new Date());
			int random = new Random().nextInt(100000);
			ordersNumber +=  formatDate+random;
			
			orders.setOrdersNumber(ordersNumber);
			int ordersId = ordersManage.addOrders(orders);
			Orders newOrders = ordersManage.findOrders(ordersId);
			for(Book book : shoppingBook){
				Ordersbook ordersbook = new Ordersbook();
				ordersbook.setBook(book);
				ordersbook.setBookAmount(book.getBookAmount());
				ordersbook.setOrders(newOrders);
				ordersManage.addOrdersbook(ordersbook);
			}
			session.removeAttribute("shoppingBook");
			session.removeAttribute("totalMoney");
			return "success";
		}
		if("delete".equals(updateType)){
			String ordersId = request.getParameter("ordersId");
			int i = 0;
			i = ordersManage.deleteOrders(Integer.parseInt(ordersId));
			if(i == 0){
				return "error";
			}else{
				return "success";
			}
		}
		return null;
	}
}

3.3.10 ShoppingCartAction

package com.huizhi.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import java.util.*;
import entity.*;
import dao.*;
@SuppressWarnings("serial")
public class ShoppingCartAction extends ActionSupport{
	private BookManage bookManage;
	public void setBookManage(BookManage bookManage) {
		this.bookManage = bookManage;
	}
	@SuppressWarnings("unchecked")
	public String execute(){
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		HttpSession session = request.getSession();
		String bookId = request.getParameter("bookId");
		List<Book> shoppingBook = new ArrayList<Book>();
		if(session.getAttribute("shoppingBook") == null){
			session.setAttribute("shoppingBook", shoppingBook);
		}
		else{
			shoppingBook = (List<Book>) session.getAttribute("shoppingBook");
		}
		int i = 0;
		for(Book book : shoppingBook){
			if(bookId.equals(book.getBookId()+"")){
				i++;
			}
		}
		if(i == 0){
			Book book = bookManage.findBook(Integer.parseInt(bookId));
			book.setBookAmount(1);
			Bargain bargain = null;
			bargain = bookManage.isBargain(Integer.parseInt(bookId));
			if(bargain != null){
				book.setBookPrice(bargain.getBookNewPrice());
			}
			shoppingBook.add(book);
			double totalMoney = 0;
			if(session.getAttribute("totalMoney") == null){
				session.setAttribute("totalMoney", book.getBookPrice());
			}else{
				totalMoney = (Double) session.getAttribute("totalMoney");
				totalMoney += book.getBookPrice();
				session.removeAttribute("totalMoney");
				session.setAttribute("totalMoney", totalMoney);
			}
			session.removeAttribute("shoppingBook");
			session.setAttribute("shoppingBook", shoppingBook);
		}
		try {
			response.sendRedirect("../singleBook.jsp?bookId="+bookId);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

3.3.11 SingleBookAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import dao.BookManage;
import entity.*;

@SuppressWarnings("serial")
public class SingleBookAction extends ActionSupport{

	private BookManage bookManage;

	public void setBookManage(BookManage bookManage) {
		this.bookManage = bookManage;
	}
	
	public String execute(){
		HttpServletRequest request = ServletActionContext.getRequest();
		String bookId = request.getParameter("bookId");
		int bookIdInt = Integer.parseInt(bookId);
		Book book = new Book();
		book = bookManage.findBook(bookIdInt);
		Bargain bargain = null;
		bargain = bookManage.isBargain(bookIdInt);
		if(bargain == null){
			book.setBookNewPrice(book.getBookPrice());
		}else{
			book.setBookNewPrice(bargain.getBookNewPrice());
		}
		request.setAttribute("singleBook", book);
		return null;
	}
}

3.3.12 SingleOrdersAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import java.util.*;
import dao.*;
import entity.*;
@SuppressWarnings("serial")
public class SingleOrdersAction extends ActionSupport{
	
	private OrdersManage ordersManage;
	private BookManage bookManage;
	
	public void setOrdersManage(OrdersManage ordersManage) {
		this.ordersManage = ordersManage;
	}

	public void setBookManage(BookManage bookManage) {
		this.bookManage = bookManage;
	}

	public String execute(){
		HttpServletRequest request = ServletActionContext.getRequest();
		String ordersId = request.getParameter("ordersId");
		int ordersIdInt = Integer.parseInt(ordersId);
		Orders orders = new Orders();
		orders = ordersManage.findOrders(ordersIdInt);
		List<Ordersbook> allOrdersbookByOrders = new ArrayList<Ordersbook>();
		allOrdersbookByOrders = ordersManage.allOrdersbookByOrders(ordersIdInt);
		List<Book> bookList = new ArrayList<Book>();
		for(Ordersbook ordersbook : allOrdersbookByOrders){
			Book book = ordersbook.getBook();
			Bargain bargain = null;
			bargain = bookManage.isBargain(book.getBookId());
			if(bargain != null){
				book.setBookPrice(bargain.getBookNewPrice());
			}
			book.setBookAmount(ordersbook.getBookAmount());
			bookList.add(book);
		}
		request.setAttribute("bookList", bookList);
		request.setAttribute("orders", orders);
		return null;
	}

}

3.3.13 UpdateBookAction

package com.huizhi.action;

import java.io.File;
import java.text.*;
import java.util.*;
import java.util.Date;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import dao.BookManage;
import entity.*;

@SuppressWarnings("serial")
public class UpdateBookAction extends ActionSupport{

	private int bookId;
	private String bookName;
	private String bookAuthor;
	private String bookPress;
	private String bookRemark;
	private int typeId;
	private int bookAmount;
	private double bookPrice;
	private BookManage bookManage;
	
	private File doc;
	private String fileName;
	private String contentType;
	private String dir;
	private String targetFileName;

	public void setDoc(File file) {
		this.doc = file;
	}

	public void setDocFileName(String fileName) {
		this.fileName = fileName;
	}
	public void setDocContentType(String contentType) {
		this.contentType = contentType;
	}
	
	public String getDir() {
		return dir;
	}
	public void setDir(String dir) {
		this.dir = dir;
	}
	public String getContentType() {
		return contentType;
	}
	public void setContentType(String contentType) {
		this.contentType = contentType;
	}
	public String getTargetFileName() {
		return targetFileName;
	}
	public void setTargetFileName(String targetFileName) {
		this.targetFileName = targetFileName;
	}
	private String generateFileName(String fileName){
		DateFormat format = new SimpleDateFormat("yyMMddHHmmss");
		String formatDate = format.format(new Date());
		int random = new Random().nextInt(100000);
		int position = fileName.lastIndexOf(".");
		String extension = fileName.substring(position);
		return formatDate+random+extension;
	}
	
	public int getBookId() {
		return bookId;
	}

	public void setBookId(int bookId) {
		this.bookId = bookId;
	}

	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public String getBookAuthor() {
		return bookAuthor;
	}
	public void setBookAuthor(String bookAuthor) {
		this.bookAuthor = bookAuthor;
	}
	public String getBookPress() {
		return bookPress;
	}
	public void setBookPress(String bookPress) {
		this.bookPress = bookPress;
	}
	public String getBookRemark() {
		return bookRemark;
	}
	public void setBookRemark(String bookRemark) {
		this.bookRemark = bookRemark;
	}
	public int getTypeId() {
		return typeId;
	}
	public void setTypeId(int typeId) {
		this.typeId = typeId;
	}
	public int getBookAmount() {
		return bookAmount;
	}
	public void setBookAmount(int bookAmount) {
		this.bookAmount = bookAmount;
	}
	public double getBookPrice() {
		return bookPrice;
	}
	public void setBookPrice(double bookPrice) {
		this.bookPrice = bookPrice;
	}
	public void setBookManage(BookManage bookManage) {
		this.bookManage = bookManage;
	}
	@SuppressWarnings("deprecation")
	public String execute(){
		System.out.println(bookId);
		Book book = bookManage.findBook(bookId);
		System.out.println(book);
		if(doc != null){
			System.out.println("asd");
			String realPath = ServletActionContext.getRequest().getRealPath("/upload");
			String targetDirectory = realPath;
			targetFileName  =generateFileName(fileName);
			setDir(targetDirectory+"\"+targetFileName);
			File target = new File(targetDirectory,targetFileName);
			try {
				FileUtils.copyFile(doc, target);
				book.setBookPicture(targetFileName);//图片地址
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		System.out.println("ssss");
		book.setBookName(bookName);
		book.setBookAuthor(bookAuthor);
		book.setBookPress(bookPress);
		book.setBookRemark(bookRemark);
		book.setBookPrice(bookPrice);
		book.setBookAmount(bookAmount);
		Type type = bookManage.findType(typeId);
		book.setType(type);//类别
		bookManage.updateBook(book);
		return SUCCESS;
	}
}

3.3.14 UpdateCartAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import java.util.*;
import entity.*;

@SuppressWarnings("serial")
public class UpdateCartAction extends ActionSupport{

	@SuppressWarnings("unchecked")
	public String execute(){
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		HttpSession session = request.getSession();
		String updateType = request.getParameter("updateType");
		List<Book> shoppingBook = (List<Book>) session.getAttribute("shoppingBook");
		double totalMoney = 0;
		totalMoney =(Double) session.getAttribute("totalMoney");
		if("update".equals(updateType)){
			String bookId = request.getParameter("bookId");
			String bookAmount = request.getParameter("bookAmount");
			for(Book book : shoppingBook){
				if(bookId.equals(book.getBookId()+"")){
					totalMoney += (Integer.parseInt(bookAmount)-book.getBookAmount())*book.getBookPrice(); 
					book.setBookAmount(Integer.parseInt(bookAmount));
				}
			}
		}
		if("delete".equals(updateType)){
			String bookId = request.getParameter("bookId");
			Iterator<Book> iter = shoppingBook.iterator();
			while(iter.hasNext()){
				Book book = (Book)iter.next();
				if(bookId.equals(book.getBookId()+"")){
					totalMoney -= book.getBookAmount()*book.getBookPrice();
					iter.remove();
				}
			}
		}
		session.removeAttribute("shoppingBook");
		session.setAttribute("shoppingBook", shoppingBook);
		session.removeAttribute("totalMoney");
		session.setAttribute("totalMoney", totalMoney);
		try {
			response.sendRedirect("../shoppingCart.jsp");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}
}

3.3.15 UserExitAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class UserExitAction extends ActionSupport{

	public String execute(){
		String page = "firstPage";
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = request.getSession();
		String userType = request.getParameter("userType");
		if("ordinaryUser".equals(userType)){
			session.removeAttribute("loginUser");
		}else if("manager".equals(userType)){
			session.removeAttribute("managerLoginName");
			page = "managerLogin";
		}else{
			page = "error";
		}
		return page;
	}
}

3.3.16 UserInformationAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import dao.PersonManage;
import entity.User;

@SuppressWarnings("serial")
public class UserInformationAction extends ActionSupport{

	private PersonManage personManage;

	public PersonManage getPersonManage() {
		return personManage;
	}

	public void setPersonManage(PersonManage personManage) {
		this.personManage = personManage;
	}
	public String execute(){
		HttpServletRequest request = ServletActionContext.getRequest();
		String userIdString = request.getParameter("userId");
		int userId = Integer.parseInt(userIdString);
		User user = personManage.findUser(userId);
		request.setAttribute("user", user);
		return null;
	}
}

3.3.17 UserManageAction

package com.huizhi.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import dao.PersonManage;
import entity.*;

@SuppressWarnings("serial")
public class UserManageAction extends ActionSupport{

	private String userNickname;
	private int sexId;
	private String userEmail;
	private String userPhone;
	private String userAddress;
	private String userRemark;
	
	private String userPassword;
	private String newUserPassword;
	private String reNewUserPassword;
	
	private PersonManage personManage;
	public String getUserNickname() {
		return userNickname;
	}
	public void setUserNickname(String userNickname) {
		this.userNickname = userNickname;
	}
	public String getUserEmail() {
		return userEmail;
	}
	public int getSexId() {
		return sexId;
	}
	public void setSexId(int sexId) {
		this.sexId = sexId;
	}
	public void setUserEmail(String userEmail) {
		this.userEmail = userEmail;
	}
	public String getUserPhone() {
		return userPhone;
	}
	public void setUserPhone(String userPhone) {
		this.userPhone = userPhone;
	}
	public String getUserAddress() {
		return userAddress;
	}
	public void setUserAddress(String userAddress) {
		this.userAddress = userAddress;
	}
	public String getUserRemark() {
		return userRemark;
	}
	public void setUserRemark(String userRemark) {
		this.userRemark = userRemark;
	}
	public void setPersonManage(PersonManage personManage) {
		this.personManage = personManage;
	}
	public String getUserPassword() {
		return userPassword;
	}
	public void setUserPassword(String userPassword) {
		this.userPassword = userPassword;
	}
	public String getNewUserPassword() {
		return newUserPassword;
	}
	public void setNewUserPassword(String newUserPassword) {
		this.newUserPassword = newUserPassword;
	}
	public String getReNewUserPassword() {
		return reNewUserPassword;
	}
	public void setReNewUserPassword(String reNewUserPassword) {
		this.reNewUserPassword = reNewUserPassword;
	}
	public String updateUserInfor(){
		String page = "fail";
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = request.getSession();
		User user  = (User)session.getAttribute("loginUser");
		if(user == null){
			page = "error";
		}else{
			user.setUserNickname(userNickname);
			Sex sex = personManage.findSex(sexId);
			user.setSex(sex);
			user.setUserEmail(userEmail);
			user.setUserPhone(userPhone);
			user.setUserAddress(userAddress);
			user.setUserRemark(userRemark);
			int i = 0 ;
			i = personManage.updateUserInfor(user);
			if(i == 1){
				page="success";
				session.removeAttribute("loginUser");
				session.setAttribute("loginUser", user);
			}
			if(i == 0){
				page = "error";
			}
		}
		return page;
	}
	public String updateUserPassword(){
		String page="fail";
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpSession session = request.getSession();
		User user  = (User)session.getAttribute("loginUser");
		if(user == null){
			page = "error";
		}else{
			if(user.getUserPassword().equals(userPassword)){
				if(newUserPassword.equals(reNewUserPassword)){
					user.setUserPassword(newUserPassword);
					int i = 0;
					i = personManage.updateUserInfor(user);
					if( i == 1){
						page="success";
						session.removeAttribute("loginUser");
						session.setAttribute("loginUser", user);						
					}
					if(i == 0){
						page = "error";
					}					
				}
			}
		}	
		return page;
	}
}

至此,核心代码已经结束,慢慢看应该问题不大。

四 XML配置

xml是SSH2中最关键的一步,好多情况下代码正确,但是依然404,就是因为配置原因

4.1 struts.xml

由于struts的对象交给了Spring管理,因此这里的class引用写的不是类的地址,是Spring配置文件中类地址对应的名称
这个配置文件使用myeclipse可以清楚的看到个个action之间的联系
<!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.objectFactory" value="spring" />
	<constant name="struts.i18n.encoding" value="gb2312"/>
	<constant name="struts.custom.i18n.resources" value="globalMessages"/>
	
	<package name="default" extends="struts-default">
		<interceptors>
			<interceptor name="userLoginCheck" class="interceptor.UserLoginCheck"></interceptor>
		</interceptors>
		<global-results>
			<result name="error" type="redirect">/error.html </result>					
		</global-results>
		<action name="enrollAction" class="EnrollAction">
			<result name="input">/enroll.jsp </result>
			<result name="success">/login.jsp</result>
		</action>
		
		<action name="loginAction" class="LoginAction" method="loginCheck">
			<result name="fail">/login.jsp </result>
			<result name="success" type="redirect">/firstPage.jsp</result>
		</action>
		
		<action name="managerLoginAction" class="LoginAction" method="managerLoginCheck">
			<result name="fail">/managerLogin.jsp </result>
			<result name="success" type="redirect">/manage/manageWelcome.jsp</result>
		</action>
		
		<action name="leftAction" class="LeftAction">
		</action>
		
		<action name="allBookAction" class="AllBookAction">
		</action>
		
		<action name="singleBookAction" class="SingleBookAction">
		</action>
		
		<action name="bookAction" class="BookAction">
			<interceptor-ref name="fileUpload">
				<param name="allowedTypes">
					image/jpeg,image/gif,image/bmp,image/png
				</param>
				<param name="maximumSize">20000</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<result name="input">/manage/addBook.jsp </result>
			<result name="success" type="redirect">/manage/addBook.jsp </result>
		</action>
		
		<action name="oneTypeAction" class="OneTypeAction">
			<result name="oneType" type="redirect">/oneType.jsp </result>
		</action>
		
		<action name="userInforAction" class="UserManageAction" method="updateUserInfor">
			<result name="success" type="redirect">/personalInformation.jsp </result>
			<result name="fail" >/personalInformation.jsp </result>
		</action>
		
		<action name="updatePasswordAction" class="UserManageAction" method="updateUserPassword">
			<result name="success" type="redirect">/personalInformation.jsp </result>
			<result name="fail">/updatePassword.jsp </result>
		</action>
		
		<action name="ordersManageAction" class="OrdersManageAction">
			<result name="success" type="redirect">/allOrders.jsp </result>
		</action>
		
		<action name="ordersAction" class="OrdersAction">
		</action>
		
		<action name="userExitAction" class="UserExitAction">
			<result name="firstPage" type="redirect">/firstPage.jsp </result>
			<result name="managerLogin" type="redirect">/managerLogin.jsp </result>
		</action>
		
		<action name="shoppingCartAction" class="ShoppingCartAction">	
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<interceptor-ref name="userLoginCheck"></interceptor-ref>
			<result name="login" type="redirect">/login.jsp </result>			
		</action>
		
		<action name="updateCartAction" class="UpdateCartAction">
		</action>

		<action name="singleOrdersAction" class="SingleOrdersAction">
		</action>

		<action name="allOrdersAction" class="AllOrdersAction">
		</action>
		<action name="dealOrdersAction" class="DealOrdersAction">
		</action>
		<action name="userInformationAction" class="UserInformationAction">
		</action>
		<action name="updateBookAction" class="UpdateBookAction">
			<interceptor-ref name="fileUpload">
				<param name="allowedTypes">
					image/jpeg,image/gif,image/bmp,image/png
				</param>
				<param name="maximumSize">20000</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
			<result name="input">/manage/updateBook.jsp?bookId=${bookId}</result>
			<result name="success" type="redirect">/manage/updateBook.jsp?bookId=${bookId}</result>
		</action>
	</package>
</struts>

4.2 applicationContext.xml

Spring的配置文件,关键在于IOC的各个注入关系
<?xml version="1.0" encoding="UTF-8"?>
<beans
	xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">


	<bean id="candy" class="org.apache.commons.dbcp.BasicDataSource">
		<property name="driverClassName"
			value="com.mysql.jdbc.Driver">
		</property>
		<property name="url"
			value="jdbc:mysql://localhost:3306/bookstore">
		</property>
		<property name="username" value="root"></property>
		<property name="password" value="123456"></property>
	</bean>
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource">
			<ref bean="candy" />
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">
					org.hibernate.dialect.MySQLDialect
				</prop>
			</props>
		</property>
		<property name="mappingResources">
			<list>
				<value>entity/Bargain.hbm.xml</value>
				<value>entity/Book.hbm.xml</value>
				<value>entity/Manager.hbm.xml</value>
				<value>entity/Orders.hbm.xml</value>
				<value>entity/Recommended.hbm.xml</value>
				<value>entity/Sex.hbm.xml</value>
				<value>entity/Type.hbm.xml</value>
				<value>entity/User.hbm.xml</value>
				<value>entity/Ordersbook.hbm.xml</value></list>
		</property>
	</bean>
	<bean id="personManage" class="dao.PersonManage" abstract="false"
		lazy-init="default" autowire="default" dependency-check="default">
		<property name="sessionFactory" >
			<ref local="sessionFactory"/>
		</property>
	</bean>
	<bean id="bookManage" class="dao.BookManage" abstract="false"
		lazy-init="default" autowire="default" dependency-check="default">
		<property name="sessionFactory" >
			<ref local="sessionFactory"/>
		</property>
	</bean>
	<bean id="ordersManage" class="dao.OrdersManage" abstract="false"
		lazy-init="default" autowire="default" dependency-check="default">
		<property name="sessionFactory" >
			<ref local="sessionFactory"/>
		</property>
	</bean>
	<bean id="LoginAction" class="com.huizhi.action.LoginAction"  scope="prototype">
       <property name="personManage">
           <ref bean="personManage" />
       </property>  
    </bean>
	<bean id="EnrollAction" class="com.huizhi.action.EnrollAction"  scope="prototype">
	     <property name="personManage">
	         <ref bean="personManage" />
	     </property>  
	</bean>
	<bean id="LeftAction" class="com.huizhi.action.LeftAction"  scope="prototype">
       <property name="bookManage">
           <ref bean="bookManage" />
       </property>  
    </bean>
	<bean id="AllBookAction" class="com.huizhi.action.AllBookAction"  scope="prototype">
       <property name="bookManage">
           <ref bean="bookManage" />
       </property>  
    </bean>
	<bean id="SingleBookAction" class="com.huizhi.action.SingleBookAction"  scope="prototype">
       <property name="bookManage">
           <ref bean="bookManage" />
       </property>  
    </bean>
	<bean id="BookAction" class="com.huizhi.action.BookAction"  scope="prototype">
       <property name="bookManage">
           <ref bean="bookManage" />
       </property>  
    </bean>
	<bean id="OneTypeAction" class="com.huizhi.action.OneTypeAction"  scope="prototype">
       <property name="bookManage">
           <ref bean="bookManage" />
       </property>  
    </bean>
	<bean id="UserManageAction" class="com.huizhi.action.UserManageAction"  scope="prototype">
       <property name="personManage">
           <ref bean="personManage" />
       </property>  
    </bean>
	<bean id="UserExitAction" class="com.huizhi.action.UserExitAction"  scope="prototype">
	</bean>
	<bean id="UpdateCartAction" class="com.huizhi.action.UpdateCartAction"  scope="prototype">
	</bean>
	<bean id="ShoppingCartAction" class="com.huizhi.action.ShoppingCartAction"  scope="prototype">
       <property name="bookManage">
           <ref bean="bookManage" />
       </property>  
    </bean>	
	<bean id="SingleOrdersAction" class="com.huizhi.action.SingleOrdersAction"  scope="prototype">
       <property name="bookManage">
           <ref bean="bookManage" />
       </property>  
       <property name="ordersManage">
           <ref bean="ordersManage" />
       </property>  
    </bean>	
	<bean id="OrdersManageAction" class="com.huizhi.action.OrdersManageAction"  scope="prototype">
       <property name="ordersManage">
           <ref bean="ordersManage" />
       </property>  
    </bean>	
	<bean id="OrdersAction" class="com.huizhi.action.OrdersAction"  scope="prototype">
       <property name="ordersManage">
           <ref bean="ordersManage" />
       </property>  
    </bean>	
	<bean id="AllOrdersAction" class="com.huizhi.action.AllOrdersAction"  scope="prototype">
       <property name="ordersManage">
           <ref bean="ordersManage" />
       </property>  
    </bean>	
	<bean id="DealOrdersAction" class="com.huizhi.action.DealOrdersAction"  scope="prototype">
       <property name="ordersManage">
           <ref bean="ordersManage" />
       </property>  
    </bean>	
	<bean id="UserInformationAction" class="com.huizhi.action.UserInformationAction"  scope="prototype">
       <property name="personManage">
           <ref bean="personManage" />
       </property>  
    </bean>	
	<bean id="UpdateBookAction" class="com.huizhi.action.UpdateBookAction"  scope="prototype">
       <property name="bookManage">
           <ref bean="bookManage" />
       </property>  
    </bean>	
</beans>

4.3 web.xml

这个配置文件写起来比较简单,基本上可以通过Myeclipse自动生成,不过注意,Spring的监听器需要自己写上,不会自动生成
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
	
<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>	

<listener>
	<listener-class>
		org.springframework.web.context.ContextLoaderListener
	</listener-class>
</listener>  
<filter>
	<filter-name>struts2</filter-name>
	<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
	<filter-name>struts2</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
	<filter-name>managerLogin</filter-name>
	<filter-class>filter.ManagerLoginCheck</filter-class>
</filter>
<filter-mapping>
	<filter-name>managerLogin</filter-name>
	<url-pattern>/manage/*</url-pattern>
</filter-mapping>	
<welcome-file-list>
	<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

五 Jsp代码

JSP为显示端的问题,细节很多很杂,这里就不关注了。感兴趣的可以找我要源码直接对比看。

六 总结

至此,一个SSH2小型项目结束。
总结一下:
1.实体类是基础,注意实体类与数据库的映射关系
2.需求分析很重要,否则无法摸清楚业务间逻辑关系
3.每个Action都支撑起整个业务逻辑,最好对比JSP代码线性写。
4.要有宏观思路,培养产品经理的思想。


原文地址:https://www.cnblogs.com/kingszelda/p/7142698.html