struts2+spring3+hibernate4

//web.xml
	<?xml version="1.0" encoding="UTF-8"?>
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://java.sun.com/xml/ns/javaee"
		xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
		id="WebApp_ID" version="2.5">
		<display-name>struts_hibernate</display-name>
		<filter>
			<filter-name>struts2</filter-name>
			<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
		</filter>
		<filter-mapping>
			<filter-name>struts2</filter-name>
			<url-pattern>/*</url-pattern>
		</filter-mapping>
	</web-app>
//struts.xml
	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC
		"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
		"http://struts.apache.org/dtds/struts-2.3.dtd">
	<struts>
		<package name="default" namespace="/" extends="struts-default">
			<action name="login" class="action.action" method="login">
				<result>/success.jsp</result>
				<result name="input">index.jsp</result>
			</action>
		</package>
	</struts>

//Struts依赖的JAR包说明
	//文件名		说明
	struts-core		核心类库
	xwork-core		WebWork核心库,struts构建基础
	ognl			使用的一种表达式语言类库
	freemarker		标签模板使用类库
	javassist		javaScript字节码解释器
	commons-fileupload	文件上传组件依赖包
	commons-io		输入输出
	commons-language	数据类型工具
	commons-logging		日志管理组件依赖包

// Struts2标签库
	//表单标签的公共属性
	//属性名		说明	
	title		设置title属性
	disable 	设置是否可用
	label		设置label属性
	labelPosition	设置label显示位置,可选:top和left(默认)
	name		设置name属性,与action中的属性名对应
	value		设置表单元素值
	cssClass	设置表单元素的CLASS
	cssStyle	设置表单元素的style
	required	设置表单元素为必填
	requiredposition  设置必填标记,默认标记为*相对于label位置
						可选left和right(默认)
	tabindex	设置表单元素的tabindex属性
	
	//简单的表单标签
	//标签			说明
	<s:form>		表单标签
	<s:textfield>	单行文本框
	<s:password>	密码输入框
	<s:textarea>	文本框
	<s:submit>		提交按钮
	<s:reset>		重置按钮
	<s:select>		下拉列表
	<s:radio>		单选按钮
	<s:checkbox>	复选框
	//例
	<s:form action="register" method="post">
		<s:textfield name="username" label="姓名"></s:textfield>
		<s:password name="password" label="密码"></s:password>
		<s:select list="{'高中及以下','大学专科','大学本科','研究生及以上'}" name="degree" label="学历"></s:select>
		<s:radio list="{'男','女'}" label="性别" name="sex"></s:radio>
		<s:textarea name="protocol" label="注册协议" value="这里可以省略协议"></s:textarea>
		<s:checkbox name="love" label="同意工作登记协议"></s:checkbox>
		<s:submit value="提交"></s:submit>
		<s:reset value="重置"></s:reset>
	</s:form>
	
//<s:checkboxlist>
	属性		必须	说明
	name		0		指定复选框名称	
	label		0		指定复选框前显示文本
	list		1		指定复选框要迭代的选项集合
	listKey		0		指定复选框value属性
	listValue	0		指定复选框的label属性
	//例
	//BookService
	public class BookService {
	public Book[] getBooks(){
		return new Book[]{ 
				new Book("Java编程思想","TOM"),
				new Book("Java编程思想","TOM"),
					new Book("Java编程思想","TOM")};
		}
	}
	//Book
	public class Book {
	private String name;
	private String author;
	//seter、geter、空参、带参构造器
	}
	//ShowCheckboxlist.jsp
	<s:form>
		<!-- 使用简单字符串集合,生成多个复选框 -->
		<s:checkboxlist list="{'Java程序设计','jsp程序设计','J2EE企业级开发'}" name="bn"
		label="请选择喜欢的图书" labelposition="top"></s:checkboxlist>
		<!-- 使用简单Map对象,来生成多个复选框 -->
		<s:checkboxlist list="#{'Java':'2013.8','jsp':'201312','J2EE':'201402'}" name="bd"
		label="请选择出版日期" labelposition="top" listKey="key" listValue="value"></s:checkboxlist>
		<!-- 使用Bean标签来创建一个实例 -->
		<s:bean name="service.BookService" id="bs"></s:bean>
		<!-- 集合中存放多个JavaBean实例来生成多个复选框 -->
		<s:checkboxlist list="#bs.books" name="bookBean"
		label="请选择您喜欢的图书" labelposition="top" listKey="name" listValue="name"></s:checkboxlist>
	</s:form>
	
//<s:commbobox>
	//例
	//action
	public class action extends ActionSupport {
		private static final long serialVersionUID = 1L;
		private String bookName;
		private String bookAuthor;
		//geter、seter方法
		public String execute(){
			return SUCCESS;
		}
	}
	//BookService
	public class BookService {
		public Book[] getBooks(){
			return new Book[]{ 
					new Book("Java编程思想","Java"),
					new Book("JSP编程思想","JSP"),
					new Book("J2EE编程思想","J2EE")};
		}
	}	
	//ShowCombobox.jsp
	<s:form action="bookAction">
		<s:combobox list="{'Java程序设计','jsp程序设计','J2EE企业级开发'}" 
		name="bookName" label="请选择书" maxlength="20" headerValue="---请选择---" 
		emptyOption="true" value="Jsp程序设计"></s:combobox>
		<s:bean name="service.BookService" id="bs"></s:bean>
		<s:combobox list="#bs.books" listKey="author" listValue="author" 
		name="bookAuthor" label="选择作者" labelposition="top"></s:combobox>
		<s:submit value="提交"></s:submit>
	</s:form>
	//ShowComboboxSuccess.jsp
	书名:<s:property  value="bookName"></s:property>
	作者:<s:property  value="bookAuthor"></s:property>
	
//<s:optgroup>
	//例
	<s:form action="">
		<s:select
			list="#{'Java程序设计':'Java','jsp程序设计':'Jsp','J2EE企业级开发':'J2EE'}"
			label="选择您喜欢的书" name="book" listKey="value" listValue="key">
			<s:optgroup label="清华大学出版社" listKey="value" listValue="key"
				list="#{'Java程序设计':'Java','jsp程序设计':'Jsp','J2EE企业级开发':'J2EE'}" />
			<s:optgroup label="人民邮电出版社" listKey="value" listValue="key"
				list="#{'Java程序设计':'Java','jsp程序设计':'Jsp','J2EE企业级开发':'J2EE'}" />
		</s:select>
	</s:form>
	
//<s:doubleselect>
	//例
	<s:form action="aa">
		<!-- 默认情况下,第一个下拉列表只支持两项 -->
		<s:doubleselect label="请选择城市" name="city" list="{'北京市','上海市'}"
			doubleName="cityZ"
			doubleList="top=='北京市'?{'东城区','西城区','朝阳区'}:{'闸北区','普陀区','闵行区'}" />
		<s:set name="citys"
			value="#{'江苏省':{'南京市','苏州市','无锡市','扬州市'}
			,'浙江省':{'杭州市','宁波市','温州市'},'安徽省':{'合肥市','芜湖市'}}"></s:set>
		<s:doubleselect label="选择你所在的城市" name="privince" size="1"
			list="#citys.keySet()" doubleSize="5" doubleList="#citys[top]"
			doubleName="cityP" />
	</s:form>
	
//<s:file>
	//例
	<s:file name="uploadFile" accept="text/*"/>
	<s:file name="otherUploadFile" accept="text/html.text/plain"/>

//<s:token/>
	//例
	//struts.xml
	<action name="loginAction" class="action.LoginAction">
			<interceptor-ref name="defaultStack"/>
			<interceptor-ref name="token"/>
			<result name="invalid.token">index.jsp</result>
			<result>index.jsp</result>
	</action>
	//LoginAction
	public class LoginAction extends ActionSupport{
		private static final long serialVersionUID = 1L;
		private String username;
		private String password;
		public String getUsername() {
			return username;
		}
		public void setUsername(String username) {
			this.username = username;
		}
		public String getPassword() {
			return password;
		}
		public void setPassword(String password) {
			this.password = password;
		}
		@Override
		public String execute() throws Exception {
			return super.execute();
		}
	}
	//jsp
	<s:form action="loginAction">
		<s:textfield label="用户名" name="username"></s:textfield>
		<s:password label="密码" name="password"></s:password>
		<s:submit value="提交"></s:submit>
		<s:token/><s:actionerror/>
	</s:form>
	
//<s:updownselect>
	//例
	//BookService
	public class BookService {
		public Book[] getBooks(){
			return new Book[]{ 
					new Book("Java编程思想","Java"),
					new Book("JSP编程思想","JSP"),
					new Book("J2EE编程思想","J2EE")};
		}
	}
	//jsp
	<s:form>
		<s:updownselect list="{'Java程序设计','jsp程序设计','J2EE企业级开发'}" name=""
		label="请选择您喜欢的图书" labelposition="left" moveUpLabel="上移"></s:updownselect>
		<s:updownselect list="#{'Java程序设计':'Java','jsp程序设计':'Jsp','J2EE企业级开发':'J2EE'}"
		name="bd" label="请选择喜欢的出版日期" labelposition="left" moveDownLabel="下移"
		emptyOption="true" listKey="key" listValue="value"></s:updownselect>
		<s:bean name="service.BookService" id="bs"></s:bean>
		<s:updownselect name="bookBean" label="请选择喜欢的作者" labelposition="left"
		 selectAllLabel="全选" multiple="true" list="#bs.books" listKey="author"
		 listValue="name"></s:updownselect>
	</s:form>

//<s:optiontransferselect>
	//例
	//jsp
	<s:form>
		<s:optiontransferselect list="{'Java程序设计','jsp程序设计','J2EE企业级开发'}" name="cnb"
		 leftTitle="中文图书" rightTitle="外文图书"	label="请选择您喜欢的图书"  multiple="true"
		 leftDownLabel="下移" leftUpLabel="上移" addToLeftLabel="左移" addToRightLabel="右移"
		 addAllToLeftLabel="全部左移" addAllToRightLabel="全部右移" selectAllLabel="全部选择"
		 headerKey="cnKey" headerValue="--请选择中文图书--" emptyOption="true" 
		 doubleList="{'JAVA','JSP','AJAX'}" doubleName="enb" doubleHeaderKey="enKey"
		 doubleHeaderValue="--请选择外文图书--" doubleEmptyOption="true" doubleMultiple="true"
		 rightDownLabel="下移" rightUpLabel="上移" />
	</s:form>
	
//<s:actionerror/>	<s:actionmessage/>	<s:fielderror>
	//例
	//action
	public class action extends ActionSupport {
		private static final long serialVersionUID = 1L;
		@Override
		public String execute() throws Exception {
			this.addActionError("ActionError1");
			this.addActionError("ActionError2");
			this.addActionMessage("ActionMessage1");
			this.addActionMessage("ActionMessage2");
			this.addFieldError("FieldError1", "FieldError1");
			this.addFieldError("FieldError2", "FieldError2");
			return super.execute();
		}
	}
	//xml
	<package name="default" namespace="/" extends="struts-default">
		<action name="action" class="action.action">
			<result>index.jsp</result>
		</action>
	</package>
	//jsp
	<a href="action">action</a>
	<s:actionerror/>
	<s:actionmessage/>
	<s:fielderror value="fielderror1"></s:fielderror>
	
//<s:component>
	//ShowComponent.jsp
	<s:form>
		<s:component template="TemplateComponent.jsp">
			<s:param  name="interestlist" />
			<s:param name="booklist" value="{'Java','JSP','SSH','Android'}"/>
		</s:component>
	</s:form>
	//TemplateComponent.jsp		WebRoot/template/xhtml
	<s:checkboxlist list="{'唱歌','跳舞','看书','球类运动'}" name="interestlist" 
	label="您的兴趣爱好"/>
	<s:select list="parameters.booklist" cssStyle="font-size:12px" labelposition="left"
	label="您最感兴趣书" name="booklist"/>
	
//控制标签
	//if:选择输出标签
	//elseif:与if结合使用,控制选择输出
	//else:与if结合使用,控制选择输出
	//iterator:迭代器,集合迭代输出
	//append:多集合拼接成新集合
	//merge:多集合拼接新集合,与append拼接方式不同
	//sort:对集合进行排序
	//generator:将字符串解析成集合
	//subset:截取集合部分,形成新集合
//<s:if>   <s:elseif>    <s:else>
	<s:if test="">
	</s:if>
	<s:elseif test="">
	</s:elseif>
	<s:else>
	</s:else>
	
//<s:iterator>
	//value:可选,指定被迭代集合,通常OGNL,没有指定,使用栈顶对象
	//id:可选,指定集合里元素的ID
	//status:可选,当前迭代的索引
	//Begin:开始索引位置
	//End:结束索引位置
	//Step:迭代步长
	//getCount:遍历集合元素的数目
	//isEven:返回当前遍历元素索引是否为偶数
	//isOdd:返回当前遍历元素索引是否为奇数
	//isFirst:返回是否为集合第一个元素
	//isLast:返回是否为集合最后一个元素
	//jsp
	<s:iterator value="{'黄鹤楼','下扬州'}" var="poem">
		<s:property value="poem"/><br>
	</s:iterator><hr>
	<s:iterator value="#{'1001':'JAVA','1002':'JSP','1003':'SSH' }" var="bookName">
		<s:property value="key"/>
		<s:property value="value"/><br>
	</s:iterator><hr>
	<s:iterator value="{'清华','复旦','北大'}" var="university" status="stat">
		<s:if test="#stat.odd">
			<s:property value="#stat.count"/>-<s:property/><br>
		</s:if>
	</s:iterator><hr>
	<table border="1">
		<tr>
			<td>序号</td>
			<td>出版社</td>
		</tr>
		<s:iterator value="{'清华','人民','北大'}" var="publisher" status="stat">
			<tr>
				<s:if test="#stat.index%2==0">
					<td><s:property value="#stat.count"/> </td>
					<td style="background-color: red;" >
						<s:property value="publisher"/>
					</td>
				</s:if>
				<s:else>
					<td><s:property value="#stat.count"/> </td>
					<td style="background-color: gray;" >
						<s:property value="publisher"/>
					</td>
				</s:else>
			</tr>
		</s:iterator>
	</table>
	
//<s:append>
	<s:append var="poem"> 
		<s:param value="{'黄鹤楼','李白'}"></s:param>
		<s:param value="{'黄鹤楼','下扬州'}"></s:param>
		<s:param value="{'碧空净','天际流'}"></s:param>
	</s:append>
	<s:iterator value="#poem" id="sentence" >
		<s:property value="sentence" /><br>
	</s:iterator>
	
//<s:merge>	
	<s:merge var="poemMerge">
		<s:param value="{'黄鹤楼','李白'}"></s:param>
		<s:param value="{'黄鹤楼','下扬州'}"></s:param>
		<s:param value="{'碧空净','天际流'}"></s:param>
	</s:merge>
	<s:iterator value="#poemMerge" id="sentence" >
		<s:property value="sentence" /><br>
	</s:iterator>

//<s:sort>
	//comparator:必填,进行排序
	//source:可选,指定集合
	//id:可选,指定集合存储page范围内的变量名
	<s:bean id="myComparator" name="action.MyComparator" />
	<s:sort comparator="#myComparator" id="fruit" 
	source="{'watermelon','peach','banana'}" >
	</s:sort>
	排序后<br>
	<s:iterator value="#attr.fruit" var="order">
		<s:property value="order" />
	</s:iterator>
	//MyComparator
	public class MyComparator implements Comparator{
		@Override
		public int compare(Object o1, Object o2) {
			return ((String)o1).compareTo((String) o2);
		}
	}
	
//<s:generator>	
	<s:generator separator="," val="'北京,上海,广州,深圳'" id="city" />
	分割后:<br>
	<s:iterator value="#attr.city" var="directcity" >
		<s:property value="directcity"/><br>
	</s:iterator>
	
//<s:subset>
	<s:subset  source="{'北京','上海','广州','深圳'}" var="city"  start="0" count="4"/>
	分割后:<br>
	<s:iterator value="#attr.city" var="directcity" >
		<s:property value="directcity"/><br>
	</s:iterator>
	
//<s:action>
	//id:可选,指定引用Action的ID
	//name:必填,指定被调用Action名字
	//Namespace:可选,指定action所对应的namespace
	//executeResult:可选,是否将Action的处理结果包含到JSP页面,默认值false
	//ignoreContextParams:可选,指定是否忽略参数
	//Music
	public class Music {
		private String name;
		private String author;
		private String type;
			//geter,seter
	}
	//action
	public class action extends ActionSupport {
		private static final long serialVersionUID = 1L;
		private Music music;
			//geter seter
		@Override
		public String execute() throws Exception {
			return super.execute();
		}
	}
	//xml
	<action name="musicAction" class="action.action">
		<result>/ShowActionSuccess.jsp</result>
	</action>	
	//index.jsp
	<s:action name="musicAction" executeResult="true" namespace="/"></s:action>
	//ShowActionSuccess.jsp
	<s:property value="music.name"/>
	<s:property value="music.author"/>
	<s:property value="music.type"/>

//<s:property>
	//default:可选属性,当为Null时,显示default属性
	//escape:可选属性,是否escape HTML代码
	//value:可选属性,需要输出的属性值,null输出栈顶
	//id:可选属性,指定元素标识
	//jsp
	输出字符串:<s:property value="'<h3>HELLOWORLD</h3>'"/><br>
	设置忽略HTML代码:
	<s:property value="'<h3>HELLOWORLD</h3>'" escape="true" /><br>
	设置不忽略HTML代码:
	<s:property value="'<h3>HELLOWORLD</h3>'" escape="false" /><br>
	输出请求参数sex的值:<s:property value="#parameters.sex" /><br>
	输出默认值:<s:property value="sex" default="true" />
	
//<s:param>
	//name:可选,设置参数的参数名
	//value:可选,设置参数的参数值
	//id:可选,引用元素的id
	<s:param name="color" value="blue" ></s:param>
	<s:param name="color" >blue</s:param>

//<s:bean>
	//name:必填,实例化JAVABEAN
	//id:可选,指定javaBean实例储存变量名
	<s:bean name="entity.Book" id="book">
		<s:param name="name">SSH</s:param>
		<s:param name="author" value="'gmy'">SSH</s:param>
	</s:bean>
	书名:<s:property value="#book.name" /><br>
	作者:<s:property value="#book.author"/>
	
//<s:date>
	//format:可选,指定格式化样式
	//name:必填,要被格式化的日期值,必须指定java,util,Date
	//id:可选,引用元素的ID值
	//nice:可选,是否输出当前日期值与指定日期值之间的时间差。默认false
	<%
		Calendar cal = Calendar.getInstance();
		cal.set(2014,5,13);
		pageContext.setAttribute("Football", cal.getTime());
	%>
	<s:bean name="java.util.Date" id="now">
		通过property:<s:property value="#now"/>	<br>
		指定format,没有nice:<s:date name="#attr.now" format="yyyy年MM月dd日"/><br>
		指定format,nice:<s:date name="#attr.now" format="yyyy年MM月dd日" nice="true" /><br>
		距离开幕还有:<s:date name="#attr.Football" nice="true" />
	</s:bean>
	
//<s:set>
	//name:必填,新变量的名字
	//scope:可选,可以使application seesion request page action, 默认stack Context
	//value:可选,指定赋给新变量,默认把栈顶给新变量
	//id:可选,指定新元素的ID
	<s:bean name="entity.Book" id="book">
		<s:param  name="name" value="'JAVA'" />
		<s:param name="author" >gmy</s:param>
	</s:bean>
	<s:set value="#book" name="b1" scope="action"></s:set>
	action范围:<s:property value="#b1.name" /><br>
	<s:set value="#book" name="b2" scope="request"></s:set>
	request范围:<s:property value="#request.b2.author" /><br>
	<s:set value="%{'清华出版社'}" name="pub" scope="session"></s:set>
	session范围:<s:property value="#session.pub" /><br>
	
//<s:url>
	//action:可选,指定Ation,默认使用value作为URL
	//anchor:可选,指定URL锚点
	//encode:可选,指定是否需要encode请求参数
	//forceAddSchemeHostAndPort:可选,是否需要URL对应的地址里强制添加scheme、主机、端口
	//includeContext:可选,是否需要将当前上下文包含到URL地址中
	//includeParams:可选,指定是否包含请求参数默认get,属性值 none get all
	//method:可选,指定使用Action
	//namespace:可选,属性指定命名空间
	//portletMode:可选,结果页面的portlet模式
	//scheme:可选,设置模式
	//value:可选,指定URL,默认action指定Action作为URL
	//var:可选,指定URL元素应用ID,建议使用var
	//windowState:可选,结果页面的porlet的窗口状态
	指定value形式:<s:url value="showBook.action" ></s:url><hr>
	指定action属性,使用param传参数:
	<s:url action="showBook" >
		<s:param name="author" value="'smith'" ></s:param>
	</s:url><hr>
	不指定action属性和value属性,使用param传入参数形式:
	<s:url includeParams="get" >
		<s:param name="id" value="%{'22'}" ></s:param>
	</s:url><hr>
	指定action属性和value属性,使用param传参数形式:
	<s:url action="showBook" value="xxxx" >
		<s:param name="author" value="smith" ></s:param>
	</s:url>
	
//<s:include>
	<s:include value="ShowActionSuccess.jsp"></s:include>	
	
//<s:debug>
	<s:debug></s:debug>
	
//<s:push>
	//value:必填,放到valuestack栈顶的值
	//id:可选,标签的ID,建议使用var
	<s:bean name="entity.Book" var="book">
		<s:param name="name" value="'JAVA'" />
		<s:param name="author" value="'gmy'" />
	</s:bean>
	<s:push value="#book">
	<s:debug></s:debug>
		书名:<s:property value="name"/>
		作者:<s:property value="author"/>
	</s:push>
	
//<s:i18n> <s:text>
	//name:必填,获取资源属性
	//searchValueStack:可选,无法获取资源属性,是否到栈里搜索
	//var:可选,指定命名得到的资源属性,放到ValueStack
	<s:text name="struts.date.format"></s:text>
	<s:text name="struts.date.format" var="date"></s:text>
	
//验证
	//重写validate数据校验
	//action
	public class action extends ActionSupport {
		private static final long serialVersionUID = 1L;
		private String username;
		private String password;
		//geter seter execute()
		@Override
		public void validate() {
			if(getUsername() == null || "".equals(getUsername().trim())){
				this.addFieldError("usernameMsg", "用户名不能为空");
			}else{
				Pattern compile = Pattern.compile("\\w{6,20}");
				Matcher matcher = compile.matcher(getUsername().trim());
				if(!matcher.matches()){
					this.addFieldError("usernameMsg", "用户名由下划线,长度6-20");
				}
			}
			if(getPassword().trim().length() == 0){
				this.addFieldError("passwordMsg", "密码不能为空");
			}else{
				int length = getPassword().trim().length();
				if(length<6 || length>30){
					this.addFieldError("passwordMsg", "密码,长度6-30");
				}
			}
		}
	}
	//struts.xml
	<package name="default" namespace="/" extends="struts-default">
		<action name="login" class="action.action">
			<result>/success.jsp</result>
			<result name="input">index.jsp</result>
		</action>
	</package>
	//index.jsp
	<s:fielderror/>
	<s:form action="login" method="post">
		<s:textfield name="username" label="用户名" ></s:textfield>
		<s:textfield name="password" label="密   码" ></s:textfield>
		<s:submit value="登录"></s:submit>
	</s:form>
	//success.jsp
	欢迎<s:property value="username"/> 登录
	
	//重写validateXXX数据校验
		//先调用validateXxx,再调用xxx
	//action
	public class action extends ActionSupport {
		private static final long serialVersionUID = 1L;
		private String username;
		private String password;
		//geter seter execute()
		
		public String login(){
			return "success";
		}
	
		public void validateLogin() {
			if(getUsername()=="admin" && getPassword()=="123"){
				this.addFieldError("username", "用户名或密码不正确123");
			}
		}
	}
	//struts.xml
	<package name="default" namespace="/" extends="struts-default">
		<action name="login" class="action.action" method="login">
			<result>/success.jsp</result>
			<result name="input">index.jsp</result>
		</action>
	</package>
	//index.jsp
	<s:fielderror/>
	<s:form action="login" method="post">
		<s:textfield name="username" label="用户名" ></s:textfield>
		<s:textfield name="password" label="密   码" ></s:textfield>
		<s:submit value="登录"></s:submit>
	</s:form>
	//success.jsp
	欢迎<s:property value="username"/> 登录
	
	//框架校验
	//ActionName-validate.xml
	<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator 1.0.2//EN"
        "http://struts.apache.org/dtds/xwork-validator-1.0.2.dtd">
	<validators>
		<field name="username">
			<field-validator type="requiredstring">
				<message key="requiredstring"/>
			</field-validator>
		</field>
		<field name="password">
			<field-validator type="requiredstring">
				<message key="requiredstring"/>
			</field-validator>
		</field>
	</validators>

	//例
	//action
	public class action extends ActionSupport {
		private static final long serialVersionUID = 1L;
		private String username;
		private String password;
		private String telephone;
		private String realname;
		private String repassword;
		private String email;
		//geter、seter  execute
	}
	//action-validation.xml
	<validators>
		<field name="username">
			<field-validator type="requiredstring">
				<param name="trim">true</param>
				<message>用户名不能为空</message>
			</field-validator>
			<field-validator type="stringlength">
				<param name="maxLength">10</param>
				<param name="minLength">6</param>
				<message>用户名长度${maxLength}和${minLength}之间</message>
			</field-validator>
		</field>
		<field name="password">
			<field-validator type="requiredstring">
				<message>密码不能为空</message>
			</field-validator>
			<field-validator type="stringlength">
				<param name="minLength">6</param>
				<message>密码长度必须大于等于${minLength}</message>
			</field-validator>
		</field>
		<field name="repassword">
			<field-validator type="requiredstring">
				<message>确认密码不能为空</message>
			</field-validator>
			<field-validator type="stringlength">
				<param name="expression">password==repassword</param>
				<message>两次密码必须相同</message>
			</field-validator>
		</field>
		<field name="telephone">
			<field-validator type="requiredstring">
				<message>电话号码不能为空</message>
			</field-validator>
			<field-validator type="fieldexpression">
				<param name="expression">^(\d{3,4}-){0,1}(\d{7,8})$</param>
				<message>电话号码格式不正确</message>
			</field-validator>
		</field>
		<field name="email">
			<field-validator type="requiredstring">
				<message>电子邮箱不能为空</message>
			</field-validator>
			<field-validator type="email">
				<message>电子邮箱格式不正确</message>
			</field-validator>
		</field>
	</validators>
	//struts.xml
	<struts>
		<package name="default" namespace="/" extends="struts-default">
			<action name="reg" class="action.action">
				<result>/success.jsp</result>
				<result name="input">index.jsp</result>
			</action>
		</package>
	</struts>
	//jsp
	<s:form action="reg" method="post">
		<s:textfield name="username" label="用户名" ></s:textfield>
		<s:textfield name="password" label="密   码" ></s:textfield>
		<s:textfield name="repassword" label="确认密码"></s:textfield>
		<s:textfield name="telephone" label="电话号码"></s:textfield>
		<s:textfield name="realname" label="真实姓名"></s:textfield>
		<s:textfield name="email" label="电子邮箱"></s:textfield>
		<s:submit value="注册"></s:submit>
	</s:form>
	
//国际化
	//Locale类
	//getDefault:获取默认的Locale对象
	//getCountry:获取区域名字
	//getLanguage:获取语言
	//getDisplayCountry:获取当前用户区域名称
	//getDisplayLanguage:获取当前用户语言
	//getAvailableLocales:返回Locale支持的所有语言环境
	public static void main(String[] args) {
		Locale[] availableLocales = Locale.getAvailableLocales();
		for (int i = 0; i < availableLocales.length; i++) {
			System.out.print(availableLocales[i].getDisplayCountry()+"=");
			System.out.print(availableLocales[i].getCountry()+" ");
			System.out.print(availableLocales[i].getDisplayLanguage()+"=");
			System.out.print(availableLocales[i].getLanguage()+"\n");
	}
	//例
	//struts.xml
	//value属性决定src下的资源文件名前缀
	<constant name="struts.custom.i18n.resources" value="regResource"></constant>
	<package name="default" namespace="/" extends="struts-default">
		<action name="reg" class="action.action">
			<result>/success.jsp</result>
			<result name="input">index.jsp</result>
		</action>
	</package>
	//index.jsp
	<s:form action="reg" method="post">
		<s:textfield name="username" key="username" ></s:textfield>
		<s:textfield name="password" key="password" ></s:textfield>
		<s:textfield name="repassword" key="repassword"></s:textfield>
		<s:textfield name="telephone" key="telephone"></s:textfield>
		<s:textfield name="realname" key="realname" ></s:textfield>
		<s:textfield name="email" key="email" ></s:textfield>
		<s:submit value="%{getText('submit')}"></s:submit>
	</s:form>
	//action
	public class action extends ActionSupport {
		private static final long serialVersionUID = 1L;
		private String username;
		private String password;
		private String telephone;
		private String realname;
		private String repassword;
		private String email;
	}
	//regResource_en.properties 文件名前缀一定要和配置的value值一致  (放在SRC下)
	title= title
	username = username
	password = password
	repassword = repassword
	telephone =  telephone
	realname=realname
	email=email
	submit=submit
	//regResource.properties
	title= \u6CE8\u518C
	username = \u7528\u6237\u540D
	password = \u5BC6\u7801
	repassword = \u786E\u8BA4\u5BC6\u7801
	telephone =  \u7535\u8BDD\u53F7\u7801
	realname=\u771F\u5B9E\u59D3\u540D
	email=\u7535\u5B50\u90AE\u7BB1
	submit=\u6CE8\u518C
	//国际化检验同上,在校验文件的使用<message>标签的key属性
	
	//方法2:自行选择语言环境实现国际化(推荐)
	//struts.xml
	<constant name="struts.custom.i18n.resources" value="regResource"></constant>
	<package name="default" namespace="/" extends="struts-default">
		<action name="reg" class="action.action">
			<result>/success.jsp</result>
			<result name="input">index.jsp</result>
		</action>
		<action name="lang" class="action.action" method="lang">
			<result name="input">index.jsp</result>
		</action>
	</package>
	//regResource_en.properties
	title= title
	username = username
	password = password
	repassword = repassword
	telephone =  telephone
	realname=realname
	email=email
	submit=submit
	//regResource.properties
	title= \u6CE8\u518C
	username = \u7528\u6237\u540D
	password = \u5BC6\u7801
	repassword = \u786E\u8BA4\u5BC6\u7801
	telephone =  \u7535\u8BDD\u53F7\u7801
	realname=\u771F\u5B9E\u59D3\u540D
	email=\u7535\u5B50\u90AE\u7BB1
	submit=\u6CE8\u518C
	//actiom
	public class action extends ActionSupport {
		private static final long serialVersionUID = 1L;
		private String username;
		private String password;
		private String telephone;
		private String realname;
		//geter seter execute
		private String repassword;
		private String email;
		public String lang() {
			return "input";
		}
	}
	//jsp
	<a href="lang?request_locale=en_US">English</a>
	<a href="lang?request_locale=zh_CN">中文</a>
	<s:form action="reg" method="post">
		<s:textfield name="username" key="username" ></s:textfield>
		<s:textfield name="password" key="password" ></s:textfield>
		<s:textfield name="repassword" key="repassword"></s:textfield>
		<s:textfield name="telephone" key="telephone"></s:textfield>
		<s:textfield name="realname" key="realname" ></s:textfield>
		<s:textfield name="email" key="email" ></s:textfield>
		<s:submit value="%{getText('submit')}"></s:submit>
	</s:form>
	
//文件上传
	//单个文件上传
	//action
	public class action extends ActionSupport {
		private static final long serialVersionUID = 1L;
		private File uploadFile;
		private String uploadFileContentType;//必须这样命名
		private String uploadFileFileName;//必须这样命名
		//geter seter 
		@Override
		public String execute() throws Exception {
			System.out.println();
			InputStream fileInputStream = new FileInputStream(uploadFile);//文件输入流
			String realPath = ServletActionContext.getServletContext().getRealPath("/upload");
			File file = new File(realPath,this.getUploadFileFileName());
			FileOutputStream fileOutputStream = new FileOutputStream(file);//输出流
			byte[] buffer = new byte[1024];
			int length = 0;
			while ((length=fileInputStream.read(buffer))>0) {
				fileOutputStream.write(buffer, 0, length);
			}
			fileInputStream.close();
			fileOutputStream.close();
			return SUCCESS;
		}
	}
	//struts.xml
	<package name="default" namespace="/" extends="struts-default">
		<action name="fileUpload" class="action.action">
			<result>/success.jsp</result>
			<result name="input">index.jsp</result>
		</action>
	</package>
	//index.jsp
	<s:form	action="fileUpload" enctype="multipart/form-data" method="post">
		<s:file name="uploadFile" label="上传文件" />
		<s:submit value="上传" />
		<s:reset value="重置" />
	</s:form>
	//success.jsp
	文件名:${uploadFileFileName }<br>
	文件类型:${uploadFileContentType }
	//配置上传大小和类型 需要修改struts.xml文件
	<struts>
		<package name="default" namespace="/" extends="struts-default">
			<action name="fileUpload" class="action.action">
			<interceptor-ref name="fileUpload">
				<param name="allowedTypes">
					image/bmp
				</param>
				<param name="maxmumSize">81920</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
				<result>/success.jsp</result>
				<result name="input">index.jsp</result>
			</action>
		</package>
	</struts>
	//提示信息不友好需要加入国际化标签
	struts.messages.error.file.too.large
	struts.messages.error.content.type.not.allowed
	
	//多文件上传
	//一个文件都不上传会被空指针,通过检验来控制
	public class action extends ActionSupport {
		private static final long serialVersionUID = 1L;
		private File[] multiFile;
		private String[] multiFileContentType;
		private String[] multiFileFileName;
		private String savePath;
		//geter、seter
		@Override
		public String execute() throws Exception {
			File[] multiFile2 = this.getMultiFile();
			for (int i = 0; i < multiFile2.length; i++) {
				FileInputStream fileInputStream = new FileInputStream(multiFile2[i]);
				String realPath = ServletActionContext.getServletContext().getRealPath(savePath);
				File file = new File(realPath,this.getMultiFileFileName()[i]);
				FileOutputStream fileOutputStream = new FileOutputStream(file);
				byte[] buffer = new byte[1024];
				int length = 0;
				while ((length=fileInputStream.read())>0) {
					fileOutputStream.write(buffer, 0, length);
				}
				fileInputStream.close();
				fileOutputStream.close();
			}
			return super.execute();
		}
	}
	//struts.xml
	<struts>
		<package name="default" namespace="/" extends="struts-default">
			<action name="multiFile" class="action.action">
			<param name="savePath">/upload</param>
			<interceptor-ref name="fileUpload">
				<param name="allowedTypes">
					text/plain,image/jpeg
				</param>
				<param name="maxmumSize">81920</param>
			</interceptor-ref>
			<interceptor-ref name="defaultStack"></interceptor-ref>
				<result>/success.jsp</result>
				<result name="input">index.jsp</result>
			</action>
		</package>
	</struts>
	//index.jsp
	<s:form	action="multiFile" enctype="multipart/form-data" method="post">
		<s:file name="multiFile" label="选择文档" /><br>
		<s:file name="multiFile" label="选择文档" /><br>
		<s:file name="multiFile" label="选择文档" /><br>
		<s:submit value="上传" />
		<s:reset value="重置" />
	</s:form>
	//success.jsp
	<s:iterator var="fileName" value="multiFileFileName" status="st">
		文件名:<s:property value="fileName"/>&emsp;&emsp;
		文件类型:<s:property value="multiFileContentType[#st.getIndex()]"/><br>
	</s:iterator>
	
//文件下载
	//index.jsp
	<a href="download">struts2.ppt</a>
	//struts.xml
	<action name="download" class="action.action">
		<result type="stream">
			<param name="contentType">application/vnd.ms-powerpoint</param>
			<param name="contentDisposition">
				attachment;filename="Struts2.ppt"
			</param>
			<param name="inputName">downloadFile</param>
		</result>
	</action>
	//action
	public class action extends ActionSupport {
		private static final long serialVersionUID = 1L;
		public InputStream getDownloadFile() throws Exception{
			return ServletActionContext.getServletContext()
					.getResourceAsStream("/upload/Struts2.ppt");
		}
		@Override
		public String execute() throws Exception {
			return super.execute();
		}
	}

//struts2+jdbc的CRUD实例
	src
		action
			UserAction.java
			UserAction-userAdd-validation.xml	//Action名字-别名-validation.xml 
												//别名是struts.xml中作用<action>的名字
		biz	//业务层
			UserBiz.java
			UserBizImpl.java
		dao
			BaseDao.java
			UserDao.java
			UserDaoImpl.java
		entity
			User.java
		struts.xml
	WebContent
		addUser.jsp
		detailUser.jsp
		index.jsp
		updateUser.jsp
	//UserAction
	public class UserAction extends ActionSupport {
		private static final long serialVersionUID = 1L;
		private List<User> list;
		public List<User> getList() {
			return list;
		}
		public void setList(List<User> list) {
			this.list = list;
		}
		//显示全部
		public String toList() throws Exception{
			UserBiz userBiz = new UserBizImpl();
			list = userBiz.getAllUser();
			return "toList";
		}
		private String [] sexs = new String[]{"男","女"};
		//跳转
		public String[] getSexs() {
			return sexs;
		}
		public void setSexs(String[] sexs) {
			this.sexs = sexs;
		}
		public String toAdd() throws Exception{
			return "toAdd";
		}
		private User user;
		public User getUser() {
			return user;
		}
		public void setUser(User user) {
			this.user = user;
		}
		//添加
		public String add() throws Exception{
			UserBiz userBize = new UserBizImpl();
			userBize.addUser(user);
			return this.toList();
		}
		//更新跳转
		public String toUpdate() throws Exception{
			UserBiz userBize = new UserBizImpl();
			user = userBize.getUserById(user.getId());
			return "toUpdate";
		}
		//更新
		public String update() throws Exception{
			UserBiz userBize = new UserBizImpl();
			userBize.updateUser(user);
			return this.toList();
		}
		//删除
		public String delete() throws Exception{
			UserBiz userBize = new UserBizImpl();
			userBize.deleteUser(user.getId());
			return this.toList();
		}
		//详细页
		public String toDetail() throws Exception{
			UserBiz userBize = new UserBizImpl();
			user = userBize.getUserById(user.getId());
			return "toDetail";
		}
	}
	//UserAction-userAdd-validation.xml
	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC
		"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
		"http://struts.apache.org/dtds/struts-2.3.dtd">
	<struts>
		<package name="default" namespace="/" extends="struts-default">
			<action name="userToList" class="action.UserAction" method="toList">
				<result name="toList">/index.jsp</result>
			</action>
			<action name="userToAdd" class="action.UserAction" method="toAdd">
				<result name="toAdd">/addUser.jsp</result>
			</action>
			<action name="userAdd" class="action.UserAction" method="add">
				<result name="toList">/index.jsp</result>
				<result name="input">/addUser.jsp</result>
			</action>
			<action name="userToUpdate" class="action.UserAction" method="toUpdate">
				<result name="toUpdate">/updateUser.jsp</result>
			</action>
			<action name="userUpdate" class="action.UserAction" method="update">
				<result name="toList">/index.jsp</result>
			</action>
			<action name="userDelete" class="action.UserAction" method="delete">
				<result name="toList">/index.jsp</result>
			</action>
			<action name="userToDetail" class="action.UserAction" method="toDetail">
				<result name="toDetail">/detailUser.jsp</result>
			</action>
		</package>
	</struts>
	//UserBiz
	public interface UserBiz {
		public List<User> getAllUser();
		public User getUserById(int id);
		public int addUser(User u);
		public int updateUser(User u);
		public int deleteUser(int id);
	}
	//UserBizImpl
	public class UserBizImpl implements UserBiz {
		UserDao userDao = new UserDaoImpl();
		
		@Override
		public List<User> getAllUser() {
			return userDao.getAllUser();
		}

		@Override
		public User getUserById(int id) {
			return userDao.getUserById(id);
		}

		@Override
		public int addUser(User u) {
			return userDao.addUser(u);
		}

		@Override
		public int updateUser(User u) {
			return userDao.updateUser(u);
		}

		@Override
		public int deleteUser(int id) {
			return userDao.deleteUser(id);
		}
	}
	//BaseDao
	public class BaseDao {
		public Connection getConnection(){
			Connection conn=null;
			try {
				Class.forName("com.mysql.jdbc.Driver");
				conn = DriverManager
						.getConnection("jdbc:mysql:///user?auseUnicode=true&characterEncoding=utf8","root","root");
				System.out.println("连接成功");
			} catch (Exception e) {
				System.out.println("连接失败");
			}
			return conn;
		}
		public void closeAll(Connection conn,PreparedStatement pstmt,ResultSet rs){
			if(rs!=null){
				try {
					rs.close();
				} catch (Exception e) {
				}
			}
			if(pstmt!=null){
				try {
					pstmt.close();
				} catch (Exception e) {
				}
			}
			if(conn!=null){
				try {
					conn.close();
				} catch (Exception e) {
				}
			}
		}
	}
	//UserDao
	public interface UserDao {
		public List<User> getAllUser();
		public User getUserById(int id);
		public int addUser(User u);
		public int updateUser(User u);
		public int deleteUser(int id);
	}
	//UserDaoImpl
	public class UserDaoImpl extends BaseDao implements UserDao{
		Connection conn=null;
		PreparedStatement pstmt =null;
		ResultSet rs=null;
		@Override
		public List<User> getAllUser() {
			ArrayList<User> arrayList = new ArrayList<User>();
			String sql = "select * from userinfo order by id";
			try {
				conn = this.getConnection();
				pstmt = conn.prepareStatement(sql);
				rs = pstmt.executeQuery();
				User u = null;
				while(rs.next()){
					u = new User();
					u.setId(rs.getInt("id"));
					u.setName(rs.getString("name"));
					u.setSex(rs.getString("sex"));
					u.setAge(rs.getInt("age"));
					u.setTelephone(rs.getString("telephone"));
					u.setSchool(rs.getString("school"));
					arrayList.add(u);
				}
			} catch (Exception e) {
			}finally{
				this.closeAll(conn, pstmt, rs);
			}
			return arrayList;
		}

		@Override
		public User getUserById(int id) {
			User user =null;
			String sql= "select * from userinfo where id=" + id;
			try {
				conn = this.getConnection();
				pstmt = conn.prepareStatement(sql);
				rs = pstmt.executeQuery();
				user = new User();
				if(rs.next()){
					user.setId(rs.getInt("id"));
					user.setName(rs.getString("name"));
					user.setSex(rs.getString("sex"));
					user.setAge(rs.getInt("age"));
					user.setTelephone(rs.getString("telephone"));
					user.setSchool(rs.getString("school"));
				}
			} catch (Exception e) {
			}finally{
				this.closeAll(conn, pstmt, rs);
			}
			return user;
		}

		@Override
		public int addUser(User u) {
			int result= 0;
			String sql ="insert into userinfo(name,sex,age,"
					+ "telephone,school) values(?,?,?,?,?)";
			try {
				conn = this.getConnection();
				pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, u.getName());
				pstmt.setString(2, u.getSex());
				pstmt.setInt(3, u.getAge());
				pstmt.setString(4, u.getTelephone());
				pstmt.setString(5, u.getSchool());
				result = pstmt.executeUpdate();
				if(result!=0){
					System.out.println("添加了一条消息");
				}
			} catch (Exception e) {
			}finally{
				this.closeAll(conn, pstmt, rs);
			}
			return result;
		}

		@Override
		public int updateUser(User u) {
			int result = 0;
			String sql = "update userinfo set name=?,sex=?,age=?,"
					+ "telephone=?,school=?  where id=" + u.getId();
			try {
				conn = this.getConnection();
				pstmt = conn.prepareStatement(sql);
				pstmt.setString(1, u.getName());
				pstmt.setString(2, u.getSex());
				pstmt.setInt(3, u.getAge());
				pstmt.setString(4, u.getTelephone());
				pstmt.setString(5, u.getSchool());
				result = pstmt.executeUpdate();
				if(result!=0){
					System.out.println("修改了一条消息");
				}
			} catch (Exception e) {
			}finally{
				this.closeAll(conn, pstmt, rs);
			}
			return result;
		}

		@Override
		public int deleteUser(int id) {
			int result = 0;
			String sql="delete from userinfo where id = ?";
			try {
				conn = this.getConnection();
				pstmt =  conn.prepareStatement(sql);
				pstmt.setInt(1, id);
				result = pstmt.executeUpdate();
				if(result!=0){
					System.out.println("删除了id为"+ id +"的记录");
				}
			} catch (Exception e) {
			}finally{
				this.closeAll(conn, pstmt, rs);
			}
			return result;
		}
	}
	//User
	public class User {
		private int id;
		private String name;
		private String sex;
		private int age;
		private String telephone;
		private String school;
		//geter seter
	}
	//struts.xml
	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC
		"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
		"http://struts.apache.org/dtds/struts-2.3.dtd">
	<struts>
		<package name="default" namespace="/" extends="struts-default">
			<action name="userToList" class="action.UserAction" method="toList">
				<result name="toList">/index.jsp</result>
			</action>
			<action name="userToAdd" class="action.UserAction" method="toAdd">
				<result name="toAdd">/addUser.jsp</result>
			</action>
			<action name="userAdd" class="action.UserAction" method="add">
				<result name="toList">/index.jsp</result>
				<result name="input">/addUser.jsp</result>
			</action>
			<action name="userToUpdate" class="action.UserAction" method="toUpdate">
				<result name="toUpdate">/updateUser.jsp</result>
			</action>
			<action name="userUpdate" class="action.UserAction" method="update">
				<result name="toList">/index.jsp</result>
			</action>
			<action name="userDelete" class="action.UserAction" method="delete">
				<result name="toList">/index.jsp</result>
			</action>
			<action name="userToDetail" class="action.UserAction" method="toDetail">
				<result name="toDetail">/detailUser.jsp</result>
			</action>
		</package>
	</struts>
	//addUser.jsp
	<div align="center">
		<h3>添加用户信息</h3>
		<s:form action="userAdd" method="post">
			<table width="300" border="1" bordercolor="#99CCFF" bgcolor="#FFFFEE">
				<s:textfield name="user.name" label="姓名"/>
				<s:select label="性别" name="user.sex" list="sexs"/>
				<s:textfield name="user.age" label="年龄"/>
				<s:textfield name="user.telephone" label="电话"/>
				<s:textfield name="user.school" label="学校"/>
				<s:submit value="添加" align="center" />
			</table>
		</s:form>
	</div>
	//detailUser.jsp
	<div align="center">
		<s:debug></s:debug>
		<h3>显示用户详细信息</h3>
		<s:textfield name="user.id" label="ID号" disabled="true"/><br><br>
		<s:textfield name="user.name" label="姓名" disabled="true"/><br><br>
		<s:textfield name="user.sex" label="性别" disabled="true"/><br><br>
		<s:textfield name="user.age" label="年龄" disabled="true"/><br><br>
		<s:textfield name="user.telephone" label="电话" disabled="true"/><br><br>
		<s:textfield name="user.school" label="学校" disabled="true"/><br><br>
		<a href="userToList">返回</a>
	</div>
	//index.jsp
	<div align="center">
		<h3>用户信息列表</h3><a href="userToList">刷新</a>
		<table width="620">
			<tr>
				<td align="right"><a href="userToAdd"> 增加用户</a></td>
			</tr>
		</table>
		<table width="640" border="1" align="center" bordercolor="#99CCFF">
			<tr>
				<td>ID号</td>
				<td>姓名</td>
				<td>性别</td>
				<td>年龄</td>
				<td>电话</td>
				<td>学校</td>
				<td>删除</td>
				<td>修改</td>
			</tr>
			<s:iterator value="list">
			<tr>
				<td><s:property value="id"/> </td>
				<td>
				<a href="userToDetail?user.id=<s:property value='id'/>">
				<s:property value="name"/>
				</a> </td>
				<td><s:property value="sex"/> </td>
				<td><s:property value="age"/> </td>
				<td><s:property value="telephone"/> </td>
				<td><s:property value="school"/> </td>
				<td><a href="javascript:if(confirm('确定要删除吗?'))
				window.location.reload('userDelete?user.id=<s:property value='id'/>')">删除</a></td>
				<td><input type="button" name="Submit" value="修改" 
				onclick="javascript:location.replace('userToUpdate?user.id=<s:property value='id'/>')"/> </td>
			</tr>
			</s:iterator>
		</table>
	</div>
	//updateUser.jsp
	<s:form action="userUpdate" method="post">
		<table width="300" border="1" bordercolor="#99CCFF">
			<s:textfield name="user.id" label="ID号" disabled="true"></s:textfield>
			<s:textfield name="user.name" label="姓名"></s:textfield>
			<s:select label="性别" name="user.sex" list="sexs"></s:select>
			<s:textfield name="user.age" label="年龄"></s:textfield>
			<s:textfield name="user.telephone" label="电话"></s:textfield>
			<s:textfield name="user.school" label="学校"></s:textfield>
			<s:submit value="修改" align="center" ></s:submit>
		</table>
	</s:form>
	//sql
	/*
	Navicat MySQL Data Transfer

	Source Server         : localhost_3306
	Source Server Version : 50712
	Source Host           : localhost:3306
	Source Database       : user

	Target Server Type    : MYSQL
	Target Server Version : 50712
	File Encoding         : 65001

	Date: 2016-05-18 23:09:00
	*/

	SET FOREIGN_KEY_CHECKS=0;

	-- ----------------------------
	-- Table structure for `userinfo`
	-- ----------------------------
	DROP TABLE IF EXISTS `userinfo`;
	CREATE TABLE `userinfo` (
	  `id` int(5) NOT NULL AUTO_INCREMENT,
	  `name` varchar(10) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
	  `sex` varchar(2) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
	  `age` int(3) NOT NULL,
	  `telephone` varchar(15) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
	  `school` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
	  PRIMARY KEY (`id`)
	) ENGINE=InnoDB AUTO_INCREMENT=33 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- Records of userinfo
	-- ----------------------------
	INSERT INTO `userinfo` VALUES ('2', '李天', '男', '22', '13022369874', '南开大学');
	INSERT INTO `userinfo` VALUES ('3', '章然', '女', '22', '15896455286', '北京大学');
	INSERT INTO `userinfo` VALUES ('4', '李四', '男', '19', '18654356324', '清华大学');
	INSERT INTO `userinfo` VALUES ('6', '王五', '女', '24', '15626565234', '深圳大学');
	INSERT INTO `userinfo` VALUES ('7', '赵六', '男', '20', '14534445254', '兰州大学');
	INSERT INTO `userinfo` VALUES ('16', '猪八', '男', '23', '28292920', '南开大学');
	INSERT INTO `userinfo` VALUES ('17', '猪八', '男', '23', '28292920', '南开大学');
	INSERT INTO `userinfo` VALUES ('18', '猪八', '男', '23', '28292920', '南开大学');
	INSERT INTO `userinfo` VALUES ('19', '晓10', '男', '23', '2131231', '新疆大学');

//hibernate
	//hibernate-core-4.3.9.Final.jar:核心类库
	//antlr-2.7.7.jar:语言转换工具,实现HQL到SQL
	//dom4j-1.6.1.jar:是一个Java的XML API
	//javassist-3.18.1-GA.jar:开源分析,编辑,创建Java字节码的类库
	//hibernate-commons-annotations-4.0.5.Final.jar:反射代码,用于支持注解
	//hibernate-jpa-2.1-api-1.0.0.Final.jar:对JPA规范支持
	//jboss-logging-3.1.3.GA.jar:JBOSS日志框架
	//jboss-transaction-api_1.2_spec-1.0.0.Final.jar:指定事物,事物处理。分布式事物处理系统标准,java接口
//对象接口含义
	//(瞬时对象):持久化类的没有与Session相关联的实例
	//(持久化对象):带有持久化状态、具有业务功能的单线程对象
	//SessionFactory接口:生成Session工厂,负责创建Session对象,需要使用ConnectionProvider
	//Session接口:用于执行被持久化对象的CRUD操作,Session对象非线程安全
	//TransactionFactory接口:生成Transaction工厂
	//Transaction接口:用来指定原子操作单元范围对象。他通过抽象将应用底层具体的JDBC、JTA以及CORBA事务隔离开
	//ConnectionProvider:生成JDBC的工厂。他通过抽象将应用从底层的Datasource或DriverManager分离
//主键生成器策略
	//increment:对象标识符由Hibernate递增方式生成,如果有多个应用实例向同一张表插入数据时,会出现重复
	//identity:对象标识符由底层数据库的自增主键生成,要求数据库底层支持
	//sequence:对象标识符由底层数据库生成,要求支持序列
	//hilo:对象标识符由Hibernate按照高低位算法生成,默认选用hibernate_unique_key表next_hi,算法生成的标识符仅一个定的数据库中唯一
	//native:根据底层数据库对自动生成标识符的支持能力,选择identity、sequence或hilo适合跨数据库平台开发
	//assigned:对象标识符由应用程序产生,如果不指定<generator>节点,默认使用该生成器策略
//Hibernate对象3种状态,瞬时态、持久态,脱管态;
//持久态的对象也称PO,瞬时对象和脱管对象也称VO
//能使Hibernate对象由瞬时态或托管态转变为持久态的方法:
	//save():将对象由瞬时态转变为持久态
	//load()或get():获得的对象的状态处于持久态
	//find():获得的List集合中的对象状态处于持久态
	//update()、saveOrUpdate()和lock()方法:可将托管态对象转变为持久态
//能使Hibernate对象由持久态转变为瞬时态的方法
	//close():调用后Session的缓存会被清空,缓存中所有持久态对象状态都转变为托管态
	//evict():可将Session缓存中一个指定的持久态对象删除,使其转变为托管态对象
//hiberate初步
src
	entity
		Users.java
		Users.hbm.xml
	main
		HibernateSessionFactory.java
		TestAddUser.java
		TestDelete.java
		TestUpdate.java
		TestUser.java
	hibernate.cfg.xml
	//Users
	public class Users implements Serializable {
		private static final long serialVersionUID = 1L;
		private Integer id;
		private String loginName;
		private String loginPwd;
		private String name;
		private String address;
		private String phone;
		private String mail;
		//geter seter方法
	}
	//Users.hbm.xml
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-5-18 23:20:25 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.Users" table="users" >
			<id name="id" type="java.lang.Integer">
				<column name="Id" />
				<generator class="native" />
			</id>
			<property name="loginName" type="java.lang.String">
				<column name="LoginName" length="50" />
			</property>
			<property name="loginPwd" type="java.lang.String">
				<column name="LoginPwd" length="16" />
			</property>
			<property name="name" type="java.lang.String">
				<column name="Name" />
			</property>
			<property name="address" type="java.lang.String">
				<column name="Address" />
			</property>
			<property name="phone" type="java.lang.String">
				<column name="Phone" />
			</property>
			<property name="mail" type="java.lang.String">
				<column name="Mail" />
			</property>
		</class>
	</hibernate-mapping>
	//HibernateSessionFactory.java
	public class HibernateSessionFactory {
		private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
		private static final ThreadLocal<Session> sessionThreadLocal =
				new ThreadLocal<Session>();
		private static Configuration configuration = new Configuration();
		private static SessionFactory sessionFactory;
		private static String configFile = CONFIG_FILE_LOCATION;
		static{
			try {
				configuration.configure();
				ServiceRegistry buildServiceRegistry = new ServiceRegistryBuilder()
				.applySettings(configuration.getProperties()).buildServiceRegistry();
				sessionFactory = configuration.buildSessionFactory(buildServiceRegistry);
			} catch (Exception e) {
			}
		}
		private HibernateSessionFactory(){}
		private static void rebuildSessionFactory(){
			synchronized (sessionFactory) {
				try{
					configuration.configure(configFile);
					ServiceRegistry buildServiceRegistry = new ServiceRegistryBuilder().applySettings(configuration.getProperties())
					.buildServiceRegistry();
					SessionFactory buildSessionFactory = configuration.buildSessionFactory(buildServiceRegistry);
				
				}catch(Exception e){}
			}
		}
		public static Session getSession(){
			Session session = (Session)sessionThreadLocal.get();
			try{
				if(session == null || !session.isOpen()){
					if(sessionFactory == null){
						rebuildSessionFactory();
					}
				}
				session = (sessionFactory!=null)?sessionFactory.openSession():null;
				sessionThreadLocal.set(session);
			}catch(Exception e){}
			return session;
		}
		public static void closeSession(){
			Session session = (Session)sessionThreadLocal.get();
			sessionThreadLocal.set(null);
				try{
				if(session != null || session.isOpen()){
					session.close();
				}
				session = (sessionFactory!=null)?sessionFactory.openSession():null;
				sessionThreadLocal.set(session);
			}catch(Exception e){}
		}
		public static void setConfigFile(String configFile){
			HibernateSessionFactory.configFile = configFile;
			sessionFactory = null;
		}
		public static Configuration getConfiguration(){
			return configuration;
		}
	}
	//TestAddUser
	public class TestAddUser {
		public static void main(String[] args) {
			new TestAddUser().addUser();
		}

		private void addUser() {
			Users user = new Users();
			user.setLoginName("zhangsan");
			user.setLoginPwd("123456");
			user.setName("张三");
			user.setAddress("江苏南京");
			user.setPhone("123456789");
			user.setMail("123456@qq.com");
			Session session = HibernateSessionFactory.getSession();
			Transaction tx = null;
			try {
				tx= session.beginTransaction();
				session.save(user);
				tx.commit();
			} catch (Exception e) {
				if(tx!=null){
					tx.rollback();
				}
			}finally{
				HibernateSessionFactory.closeSession();
			}
		}
	}
	//TestDelete
	public class TestDelete {
		public static void main(String[] args) {
			new TestDelete().testDelete(3);
		}

		private void testDelete(int i) {
			Session session = HibernateSessionFactory.getSession();
			Transaction tx = null;
			Users user = (Users) session.get(Users.class, i);
			try {
				tx = session.beginTransaction();
				session.delete(user);
				tx.commit();
			} catch (Exception e) {
				if (tx != null) {
					tx.rollback();
				}
			} finally {
				HibernateSessionFactory.closeSession();
			}
		}
	}
	//TestUpdate
	public class TestUpdate {
		public static void main(String[] args) {
			new TestUpdate().testUpdate(3);
		}
		private void testUpdate(int i){
			Session session = HibernateSessionFactory.getSession();
			Transaction tx = null;
			Users user = (Users) session.get(Users.class,i);
			user.setLoginName("popopo");
			try {
				tx= session.beginTransaction();
				session.update(user);
				tx.commit();
			} catch (Exception e) {
				if(tx!=null){
					tx.rollback();
				}
			}finally{
				HibernateSessionFactory.closeSession();
			}
		}
	}
	//TestUser
	public class TestUser {
		@Test
		public void testGet(){
			new TestUser().getUserById(2);
		}
		
		@Test
		public void testLoad(){
			new TestUser().loadUserById(1);
		}
		
		private void loadUserById(int i) {
			Session session = HibernateSessionFactory.getSession();
			Users user = (Users) session.load(Users.class, i);
			System.out.println(user.getLoginName()+"住在"+user.getAddress());
			HibernateSessionFactory.closeSession();
		}

		private void getUserById(int i) {
			Session session = HibernateSessionFactory.getSession();
			Users user = (Users) session.get(Users.class, i);
			System.out.println(user.getLoginName()+"住在"+user.getAddress());
			HibernateSessionFactory.closeSession();
		}
	}
	//	hibernate.cfg.xml
	<?xml version="1.0" encoding="UTF-8"?>
	<!DOCTYPE hibernate-configuration PUBLIC
			"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
			"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
	<hibernate-configuration>
		<session-factory>
			<!-- 数据库基本信息 -->
			<property name="connection.username">root</property>
			<property name="connection.password">root</property>
			<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
			<property name="connection.url">jdbc:mysql:///bookshop?auseUnicode=true&amp;characterEncoding=utf8</property>
			<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
			<!-- 执行操作时是否在控制台打印SQL -->
			<property name="show_sql">true</property>
			<!-- 是否对SQL进行格式化 -->
			<property name="format_sql">true</property>
			<!-- 自动生成数据表策略 -->
			<property name="hbm2ddl.auto">update</property>
			
			<!-- 指定关联的hbm.xml文件 -->
			<mapping resource="entity/Users.hbm.xml"/>
		</session-factory>
	</hibernate-configuration>
	
	//注解
		//在cfg.xml中添加
		<!-- 指定关联的class文件 -->
		<mapping class="entity.Users"/>
		//在实体类中加入注解(注意persistence包下)
		@Entity
		@Table(name="users",catalog="bookshop")
		@Id
		@GeneratedValue
		@Column(name="Id", unique=true,nullable=false)
		//省略其他
	//注解含义
		//Entity:标识当前是实体BEAN,需要持久化
		//Table:实现数据表与持久化映射,catalog数据库名,name表名
		//Id:持久类的Id属性,与@GeneratedValue配合使用
		//GeneratedValue:指定ID表示生成器
		//Column:指定属性对应的数据库表中的字段,name字段名,unique指定是否唯一,nullable指定是否可为Null
	
//Hibernate的关系映射
	//懒加载:延迟加载需要等到访问时才加载指定对象,如果Session实例关闭之前没有加载关联对象,Session关闭后再访问时,
			//就会抛出LazyInitializationException(懒加载异常),需要在<many-to-one>设置lazy属性
	
	//单向多对一
	public class Books {
		public int Id;
		public String Title;
		public String Author;
		public Publishers publishers;
		public String PublisherDate;
		public String ISBN;
		public String WordsCount;
		public String UnitPrice;
		public String ContentDescription;
		//geter seter toString
	}
	public class Publishers {
		public int Id;
		public String Name;
		//geter、seter toString
	}
	//hbm.xml省略
	//注意在Books.hbm.xml添加多对一映射
	<many-to-one name="publishers" column="PUBLISHERID" class="entity.Publishers" 
        lazy="false" />
	//BaseHibernateDAO
	public class BaseHibernateDAO {
		protected void add(Object object){
			Transaction tran=null;
			Session session=HibernateSessionFactory.getSession();
			try{
				tran=session.beginTransaction();
				session.save(object);
				tran.commit();
			}catch (Exception e) {
				if(tran!=null){
					tran.rollback();
				}
				e.printStackTrace();
			}finally{
				HibernateSessionFactory.closeSession();
			}		
		}		
		protected Object get(Class cla,Serializable id){
			Object object=null;
			Session session=HibernateSessionFactory.getSession();
			try{
				object=session.get(cla, id);
			}catch (Exception e) {
				e.printStackTrace();
			}finally{
				HibernateSessionFactory.closeSession();
			}
			return object;
		}		
		protected void delete(Object object){
			Transaction tran=null;
			Session session=HibernateSessionFactory.getSession();
			try{
				tran=session.beginTransaction();
				session.delete(object);
				tran.commit();
			}catch (Exception e) {
				if(tran!=null){
					tran.rollback();
				}
				e.printStackTrace();
			}finally{
				HibernateSessionFactory.closeSession();
			}
		}		
		protected void update(Object object){
			Transaction tran=null;
			Session session=HibernateSessionFactory.getSession();
			try{
				tran=session.beginTransaction();
				session.update(object);
				tran.commit();
			}catch (Exception e) {
				if(tran!=null){
					tran.rollback();
				}
				e.printStackTrace();
			}finally{
				HibernateSessionFactory.closeSession();
			}
		}
		protected List search(Class cla,Object condition){
			Session session=null;
			List list=null;
			try {
				session=HibernateSessionFactory.getSession();		
				list=session.createCriteria(cla).add(Example.create(condition)).list();
			} catch (Exception e) {
				e.printStackTrace();
			} finally{
				HibernateSessionFactory.closeSession();
			}
			return list;	
		}
	}
	//TestManyToOne
	public class TestManyToOne extends BaseHibernateDAO  {
		public static void main(String[] args) {
			TestManyToOne testManyToOne = new TestManyToOne();
			testManyToOne.testManyToOne();
		}
		public void testManyToOne(){
			Books books = (Books)get(Books.class, 1);
			System.out.println(books.toString());
		}
	}
	
	//单向一对多
	//修改Publishers
	public class Publishers {
		public int Id;
		public String Name;
		public Set bks = new HashSet();
	//geter seter tostring
	}
	//修改Publishers.hbm.xml
	 <set name="bks" lazy="false">
        	<key column="PUBLISHERID"/>
        	<one-to-many class="entity.Books" />
    </set>
	//TestOneToMany
	public class TestOneToMany extends BaseHibernateDAO {
		public static void main(String[] args) {
			new TestOneToMany().testOneToMany();
		}
		public void testOneToMany(){
			Publishers publishers = (Publishers)get(Publishers.class, 1);
			System.out.println(publishers.toString());
			Iterator iterator = publishers.getBks().iterator();
			while (iterator.hasNext()) {
				Books books = (Books)iterator.next();
				System.out.println(books.toString());
			}
		}
	}
	
	//双向多对一(建议交给多的一方管理)
	//单向一对多和单向多对一,两者结合起来,形成了双向关联,双向多对一也称双向一对多
	//cascade属性值
	//all:所有情况下都进行级联操作
	//none:所有情况下不进行级联操作
	//save-update:save或者update时进行级联操作
	//delete:delete时进行级联操作
	public class Publishers {
		public int Id;
		public String Name;
		public Set bks = new HashSet();
		//geter、seter tostring
	}
	public class Books {
		public int Id;
		public String Title;
		public String Author;
		public Publishers publishers;
		public String PublisherDate;
		public String ISBN;
		public String WordsCount;
		public String UnitPrice;
		public String ContentDescription;
		//geter、seter tostring
	}
	//Books.hbm.xml
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-5-30 4:52:45 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.Books" table="books">
			<id name="Id" type="int">
				<column name="ID" />
				<generator class="native" />
			</id>
			<property name="Title" type="java.lang.String">
				<column name="TITLE" />
			</property>
			<property name="Author" type="java.lang.String">
				<column name="AUTHOR" />
			</property>
			<property name="PublisherDate" type="java.lang.String">
				<column name="PUBLISHERDATE" />
			</property>
			<property name="ISBN" type="java.lang.String">
				<column name="ISBN" />
			</property>
			<property name="WordsCount" type="java.lang.String">
				<column name="WORDSCOUNT" />
			</property>
			<property name="UnitPrice" type="java.lang.String">
				<column name="UNITPRICE" />
			</property>
			<property name="ContentDescription" type="java.lang.String">
				<column name="CONTENTDESCRIPTION" />
			</property>
			<many-to-one name="publishers" column="PUBLISHERID" class="entity.Publishers" 
			lazy="false" cascade="save-update" insert="true" update="true" not-null="true"/>
		</class>
	</hibernate-mapping>	
	//Publishers.hbm.xml
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-5-30 4:52:45 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.Publishers" table="publishers">
			<id name="Id" type="int">
				<column name="ID" />
				<generator class="native" />
			</id>
			<property name="Name" type="java.lang.String">
				<column name="NAME" />
			</property>
			<set name="bks" lazy="false" cascade="all" inverse="true">
				<key column="PUBLISHERID" not-null="true"/>
				<one-to-many class="entity.Books" />
			</set>
		</class>
	</hibernate-mapping>
	//BaseHibernateDAO
	public class BaseHibernateDAO {
		protected void add(Object object){
			Transaction tran=null;
			Session session=HibernateSessionFactory.getSession();
			try{
				tran=session.beginTransaction();
				session.save(object);
				tran.commit();
			}catch (Exception e) {
				if(tran!=null){
					tran.rollback();
				}
				e.printStackTrace();
			}finally{
				HibernateSessionFactory.closeSession();
			}		
		}		
		protected Object get(Class cla,Serializable id){
			Object object=null;
			Session session=HibernateSessionFactory.getSession();
			try{
				object=session.get(cla, id);
			}catch (Exception e) {
				e.printStackTrace();
			}finally{
				HibernateSessionFactory.closeSession();
			}
			return object;
		}		
		protected void delete(Object object){
			Transaction tran=null;
			Session session=HibernateSessionFactory.getSession();
			try{
				tran=session.beginTransaction();
				session.delete(object);
				tran.commit();
			}catch (Exception e) {
				if(tran!=null){
					tran.rollback();
				}
				e.printStackTrace();
			}finally{
				HibernateSessionFactory.closeSession();
			}
		}		
		protected void update(Object object){
			Transaction tran=null;
			Session session=HibernateSessionFactory.getSession();
			try{
				tran=session.beginTransaction();
				session.update(object);
				tran.commit();
			}catch (Exception e) {
				if(tran!=null){
					tran.rollback();
				}
				e.printStackTrace();
			}finally{
				HibernateSessionFactory.closeSession();
			}
		}
		protected List search(Class cla,Object condition){
			Session session=null;
			List list=null;
			try {
				session=HibernateSessionFactory.getSession();		
				list=session.createCriteria(cla).add(Example.create(condition)).list();
			} catch (Exception e) {
				e.printStackTrace();
			} finally{
				HibernateSessionFactory.closeSession();
			}
			return list;	
		}
	}
	//TestM2OAndO2M
	public class TestM2OAndO2M extends BaseHibernateDAO{
		@Test
		public void testAdd_4(){
			Publishers publishers = new Publishers();
			publishers.setName("高等教育出版社");
			Books books = new Books();
			books.setTitle("通信研究");
			books.setAuthor("王金龙");
			Books books2 = new Books();
			books2.setTitle("脉冲系统");
			books2.setAuthor("耿茂洋");
			books.setPublishers(publishers);
			books2.setPublishers(publishers);
			add(books);
			add(books2);
		}
		@Test
		//删除多的一方
		public void testDelete(){
			Books books = (Books)get(Books.class,6);
			delete(books);
		}
		@Test
		//删除一的一方
		//必须将以的一方cascade属性设置all
		public void testDelete_1(){
			Publishers publishers = (Publishers)get(Publishers.class, 13);
			delete(publishers);
		}
		@Test
		public void testUpdate(){
			Books books = (Books)get(Books.class, 1);
			Publishers publishers = (Publishers)get(Publishers.class, 1);
			Publishers publishers1 = (Publishers)get(Publishers.class, 3);
			publishers.getBks().remove(books);
			publishers1.getBks().add(books);
			books.setPublishers(publishers1);
			update(books);
		}
	}
	//hibernate.cfg.xml
	<?xml version="1.0" encoding="UTF-8"?>
	<!DOCTYPE hibernate-configuration PUBLIC
			"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
			"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
	<hibernate-configuration>
		<session-factory>
			<!-- 数据库基本信息 -->
			<property name="connection.username">root</property>
			<property name="connection.password">root</property>
			<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
			<property name="connection.url">jdbc:mysql:///bookshop?auseUnicode=true&amp;characterEncoding=utf8</property>
			<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
			<!-- 执行操作时是否在控制台打印SQL -->
			<property name="show_sql">true</property>
			<!-- 自动生成数据表策略 -->
			<property name="hbm2ddl.auto">update</property>
			
			<!-- 指定关联的hbm.xml文件 -->
			<mapping resource="entity/Books.hbm.xml"/>
			<mapping resource="entity/Publishers.hbm.xml"/>
		</session-factory>
	</hibernate-configuration>
	
	//双向一对一
	//基于外键
	public class Identitycard {
		private Integer id;
		private String cardNo;
		private People people;
		//geter、seter 
	}
	public class People {
		private Integer id;
		private String name;
		private String sex;
		private Integer age;
		private Identitycard identitycard;
		//geter seter
	}
	//Identitycard.hbm.xml
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-5-30 13:50:46 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.Identitycard" table="identitycard">
			<id name="id" type="java.lang.Integer">
				<column name="ID" />
				<generator class="native" />
			</id>
			<property name="cardNo" type="java.lang.String">
				<column name="CARDNO" />
			</property>
			<one-to-one name="people" class="entity.People" property-ref="identitycard"
			lazy="false"/>
		</class>
	</hibernate-mapping>
	//People.hbm.xml
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-5-30 13:50:46 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.People" table="people">
			<id name="id" type="java.lang.Integer">
				<column name="ID" />
				<generator class="native" />
			</id>
			<property name="name" type="java.lang.String">
				<column name="NAME" />
			</property>
			<property name="sex" type="java.lang.String">
				<column name="SEX" />
			</property>
			<property name="age" type="java.lang.Integer">
				<column name="AGE" />
			</property>
			<many-to-one name="identitycard" class="entity.Identitycard"
			column="CARDID" cascade="all" unique="true" lazy="false" />
		</class>
		</hibernate-mapping>
	//TestOne20neBasedFk
	public class TestOne20neBasedFk extends BaseHibernateDAO {
		@Test
		public void getPeopleById(){
			People people = (People)get(People.class, 1);
			System.out.println(people.getName()+"---"+people.getIdentitycard().getCardNo());
		}
		@Test
		public void getIdentityCardById(){
			Identitycard identitycard  = (Identitycard)get(Identitycard.class, 1);
			System.out.println(identitycard.getCardNo()+"---"
			+identitycard.getPeople().getName());
		}
		@Test
		public void addPeople(){
			People people = new People();
			Identitycard identitycard = new Identitycard();
			people.setName("TOM");
			people.setAge(30);
			people.setSex("男");
			people.setIdentitycard(identitycard);
			identitycard.setCardNo("456789");
			identitycard.setPeople(people);
			add(people);
		}
		@Test
		public void deletePeopleById(){
			People people = (People)get(People.class, 2);
			delete(people);
		}
	}
	//基于主键
	public class IdentitycardZj {
		private Integer id;
		private String cardNo;
		private PeopleZj peopleZj;
		//geter seter tostring
	}
	public class PeopleZj {
		private Integer id;
		private String name;
		private String sex;
		private Integer age;
		private IdentitycardZj identitycardZj;
		//geter seter tostring 
	}
	//IdentitycardZj.hbm.xml
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-5-31 11:53:22 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.IdentitycardZj" table="IDENTITYCARDZJ">
			<id name="id" type="java.lang.Integer">
				<column name="ID" />
				<generator class="native" />
			</id>
			<property name="cardNo" type="java.lang.String">
				<column name="CARDNO" />
			</property>
			<one-to-one name="peopleZj" class="entity.PeopleZj" lazy="false" cascade="all"/>
		</class>
	</hibernate-mapping>
	//PeopleZj.hbm.xml
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-5-31 11:53:22 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.PeopleZj" table="PEOPLEZJ">
			<id name="id" type="java.lang.Integer">
				<column name="ID" />
				<generator class="native"></generator>
			</id>
			<property name="name" type="java.lang.String">
				<column name="NAME" />
			</property>
			<property name="sex" type="java.lang.String">
				<column name="SEX" />
			</property>
			<property name="age" type="java.lang.Integer">
				<column name="AGE" />
			</property>
			<one-to-one name="identitycardZj" class="entity.IdentitycardZj"
			constrained="true" lazy="false"/>
		</class>
	</hibernate-mapping>
	//TestOne20neBasedPk
	public class TestOne20neBasedPk extends BaseHibernateDAO {
		@Test
		public void getPeopleZjById(){
			PeopleZj peoPleZj = (PeopleZj)get(PeopleZj.class, 1);
			System.out.println(peoPleZj.getName()+"---"
			+peoPleZj.getIdentitycardZj().getCardNo());
		}
		@Test
		public void addPeopleZj(){
			PeopleZj peopleZj = new PeopleZj();
			IdentitycardZj identitycardZj = new IdentitycardZj();
			identitycardZj.setCardNo("456789");
			peopleZj.setName("carry");
			peopleZj.setAge(30);
			peopleZj.setSex("男");
			peopleZj.setIdentitycardZj(identitycardZj);
			identitycardZj.setPeopleZj(peopleZj);
			add(identitycardZj);
		}
		@Test
		public void deleteIdentitycardZjById(){
			IdentitycardZj identitycardZj = (IdentitycardZj)get(IdentitycardZj.class, 1);
			delete(identitycardZj);
		}
	}
	
	//多对多
	public class Course {
		private Integer courseId;
		private String courseName;
		private Set students = new HashSet();
		//geter seter tostring
	}
	public class Student {
		private Integer studentId;
		private String studentName;
		private Set courses = new HashSet();
		//geter seter tostring
	}
	//Course.hbm.xml
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-5-31 16:27:20 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.Course" table="COURSE">
			<id name="courseId" type="java.lang.Integer">
				<column name="COURSEID" />
				<generator class="native" />
			</id>
			<property name="courseName" type="java.lang.String">
				<column name="COURSENAME" />
			</property>
			<set name="students" table="sc" inverse="true" lazy="false">
				<key>
					<column name="CID" not-null="true"/>
				</key>
				<many-to-many column="SID" class="entity.Student" />
			</set>
		</class>
	</hibernate-mapping>
	//Student.hbm.xml
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-5-31 16:27:20 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.Student" table="STUDENT">
			<id name="studentId" type="java.lang.Integer">
				<column name="STUDENTID" />
				<generator class="native" />
			</id>
			<property name="studentName" type="java.lang.String">
				<column name="STUDENTNAME" />
			</property>
			<set name="courses" table="sc" inverse="false" lazy="false" cascade="save-update">
				<key>
					<column name="SID" not-null="true"/>
				</key>
				<many-to-many column="CID" class="entity.Course"/>
			</set>
		</class>
	</hibernate-mapping>
	//TestManyToMany
	public class TestManyToMany extends BaseHibernateDAO{
		@Test
		public void testAdd_1(){
			Student s1 = new Student();
			s1.setStudentName("韦小宝");
			Student s2 = new Student();
			s2.setStudentName("令狐冲");
			Course c1 = new Course();
			c1.setCourseName("数据结构");
			Course c2 = new Course();
			c2.setCourseName("操作系统");
			Course c3 = new Course();
			c3.setCourseName("计算机组成原理");
			Course c4 = new Course();
			c4.setCourseName("离散数学");
			s1.getCourses().add(c1);
			s1.getCourses().add(c2);
			s2.getCourses().add(c1);
			s2.getCourses().add(c3);
			s2.getCourses().add(c4);
			add(s1);
			add(s2);
		}
		@Test
		public void testAdd_2(){
			Student s1 = new Student();
			s1.setStudentName("东方不败");
			Course c = (Course)get(Course.class, 10);
			s1.getCourses().add(c);
			add(s1);
		}
		@Test
		public void testAdd_3(){
			Student s1 = (Student)get(Student.class, 10);
			Student s2 = (Student)get(Student.class, 12);
			Course c1 = new Course();
			c1.setCourseName("编程原理");
			s1.getCourses().add(c1);
			s2.getCourses().add(c1);
			update(s1);
			update(s2);
		}
		@Test
		public void testDelete_1(){
			Student student = (Student)get(Student.class,12);
			Iterator courses = student.getCourses().iterator();
			while (courses.hasNext()) {
				Course course = (Course) courses.next();
				course.getStudents().remove(student);
			}
			delete(student);
		}
	}
	//注解
	//一对一双向
	//IdentitycardZj
	@Entity
	@Table(name = "identitycard_zj", catalog = "bookshop")
	public class IdentitycardZj implements java.io.Serializable {
		private Integer id;
		private String cardNo;
		private PeopleZj peopleZj;		
		public IdentitycardZj() {
		}
		public IdentitycardZj(String cardNo) {
			this.cardNo = cardNo;
		}
		@Id
		@GeneratedValue
		@Column(name = "Id", unique = true, nullable = false)
		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		@Column(name = "CardNo", length = 18)
		public String getCardNo() {
			return this.cardNo;
		}
		public void setCardNo(String cardNo) {
			this.cardNo = cardNo;
		}
		@OneToOne(cascade=CascadeType.ALL)
		@PrimaryKeyJoinColumn
		public PeopleZj getPeopleZj() {
			return peopleZj;
		}
		public void setPeopleZj(PeopleZj peopleZj) {
			this.peopleZj = peopleZj;
		}
	}
	//PeopleZj
	@Entity
	@Table(name = "people_zj", catalog = "bookshop")
	public class PeopleZj implements java.io.Serializable {
		private Integer id;
		private String name;
		private String sex;
		private Integer age;
		private IdentitycardZj identitycardZj;
		public PeopleZj() {
		}
		public PeopleZj(String name, String sex, Integer age) {
			this.name = name;
			this.sex = sex;
			this.age = age;
		}
		@GenericGenerator(name = "generator", strategy = "foreign",
				parameters=@Parameter(name="property",value="identitycardZj"))
		@Id
		@GeneratedValue(generator = "generator")
		@Column(name = "Id", unique = true, nullable = false)
		public Integer getId() {
			return this.id;
		}

		public void setId(Integer id) {
			this.id = id;
		}

		@Column(name = "Name", length = 10)
		public String getName() {
			return this.name;
		}
		public void setName(String name) {
			this.name = name;
		}
		@Column(name = "Sex", length = 4)
		public String getSex() {
			return this.sex;
		}
		public void setSex(String sex) {
			this.sex = sex;
		}
		@Column(name = "Age")
		public Integer getAge() {
			return this.age;
		}
		public void setAge(Integer age) {
			this.age = age;
		}
		@OneToOne(mappedBy="peopleZj",optional=false)
		public IdentitycardZj getIdentitycardZj() {
			return identitycardZj;
		}
		public void setIdentitycardZj(IdentitycardZj identitycardZj) {
			this.identitycardZj = identitycardZj;
		}
	}
	//多对多双向
	//Course
	@Entity
	@Table(name = "course", catalog = "bookshop")
	public class Course implements java.io.Serializable {
		private Integer courseId;
		private String courseName;
		private Set<Student> students=new HashSet<Student>();		
		public Course() {
		}
		public Course(String courseName) {
			this.courseName = courseName;
		}
		@Id
		@GeneratedValue
		@Column(name = "CourseId", unique = true, nullable = false)
		public Integer getCourseId() {
			return this.courseId;
		}
		public void setCourseId(Integer courseId) {
			this.courseId = courseId;
		}
		@Column(name = "CourseName", length = 16)
		public String getCourseName() {
			return this.courseName;
		}
		public void setCourseName(String courseName) {
			this.courseName = courseName;
		}
		@ManyToMany(mappedBy="courses",fetch=FetchType.EAGER)
		public Set<Student> getStudents() {
			return students;
		}
		public void setStudents(Set<Student> students) {
			this.students = students;
		}
	}
	//Student
	@Entity
	@Table(name = "student", catalog = "bookshop")
	public class Student implements java.io.Serializable {
		private Integer studentId;
		private String studentName;	
		private Set<Course> courses=new HashSet<Course>();	
		public Student() {
		}
		public Student(String studentName) {
			this.studentName = studentName;
		}
		@Id
		@GeneratedValue
		@Column(name = "StudentId", unique = true, nullable = false)
		public Integer getStudentId() {
			return this.studentId;
		}
		public void setStudentId(Integer studentId) {
			this.studentId = studentId;
		}
		@Column(name = "StudentName", length = 16)
		public String getStudentName() {
			return this.studentName;
		}
		public void setStudentName(String studentName) {
			this.studentName = studentName;
		}
		@ManyToMany(fetch=FetchType.EAGER)
		@Cascade(value={CascadeType.SAVE_UPDATE}) 
		@JoinTable(name="sc",
				joinColumns={@JoinColumn(name="Sid")},
				inverseJoinColumns={@JoinColumn(name="Cid")})
		public Set<Course> getCourses() {
			return courses;
		}
		public void setCourses(Set<Course> courses) {
			this.courses = courses;
		}
	}
	//多对一双向
	//Books
	@Entity
	@Table(name = "books", catalog = "bookshop")
	public class Books implements java.io.Serializable {
		private Integer id;
		private String title;
		private String author;	
		private Integer unitPrice;	
		private Publishers publishers;	
		@ManyToOne(fetch=FetchType.EAGER)
		@Cascade(value={CascadeType.SAVE_UPDATE}) 
		@JoinColumn(name="PublisherId")
		public Publishers getPublishers() {
			return publishers;
		}
		public void setPublishers(Publishers publishers) {
			this.publishers = publishers;
		}
		public Books() {
		}
		public Books(String title, String author, Integer publisherId) {
			this.title = title;
			this.author = author;		
		}
		public Books(String title, String author, Integer publisherId,
				Integer unitPrice) {
			this.title = title;
			this.author = author;		
			this.unitPrice = unitPrice;
		}
		@Id
		@GeneratedValue
		@Column(name = "Id", unique = true, nullable = false)
		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		@Column(name = "Title", nullable = false, length = 50)
		public String getTitle() {
			return this.title;
		}
		public void setTitle(String title) {
			this.title = title;
		}
		@Column(name = "Author", nullable = false, length = 16)
		public String getAuthor() {
			return this.author;
		}
		public void setAuthor(String author) {
			this.author = author;
		}
		@Column(name = "UnitPrice", precision = 8, scale = 0)
		public Integer getUnitPrice() {
			return this.unitPrice;
		}
		public void setUnitPrice(Integer unitPrice) {
			this.unitPrice = unitPrice;
		}
	}
	//Publishers
	@Entity
	@Table(name = "publishers", catalog = "bookshop")
	public class Publishers implements java.io.Serializable {
		private Integer id;
		private String name;
		private Set<Books> bks=new HashSet<Books>();
		@OneToMany(mappedBy="publishers",fetch=FetchType.EAGER)
		@Cascade(value={CascadeType.DELETE}) 
		public Set<Books> getBks() {
			return bks;
		}
		public void setBks(Set<Books> bks) {
			this.bks = bks;
		}
		public Publishers() {
		}
		public Publishers(String name) {
			this.name = name;
		}
		@Id
		@GeneratedValue
		@Column(name = "Id", unique = true, nullable = false)
		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		@Column(name = "Name", nullable = false, length = 16)
		public String getName() {
			return this.name;
		}
		public void setName(String name) {
			this.name = name;
		}
	}	
//hibernate检索方式
	//HQL:官方推荐的查询语言
	//QBC:Hibernate提供的接口
	//HQL查询与JDBC查询相比:
		//直接征地实体类和属性查询,不用写sql
		//查询结果是直接保存在LIST中的对象,不用再次封装
		//可以通过配置dialect属性,对不同数据库自动生成不同的用于执行的SQL语句
	//hibernate提供HQL最为广泛,主要功能
		//支持属性查询
		//支持参数查询
		//支持关联查询
		//支持分页查询
		//提供内置聚集函数
	//基本查询
	public class TestHQL {
		/*
		 * 1-8sql
		  CREATE TABLE `books` (
				  `BOOKID` int(11) NOT NULL AUTO_INCREMENT,
				  `BOOKNAME` varchar(255) DEFAULT NULL,
				  `BOOKAUTHOR` varchar(255) DEFAULT NULL,
				  `BOOKPRICE` varchar(255) DEFAULT NULL,
				  PRIMARY KEY (`BOOKID`)
				) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

				-- ----------------------------
				-- Records of books
				-- ----------------------------
				INSERT INTO `books` VALUES ('1', 'JAVA入门', 'TOM', '100');
				INSERT INTO `books` VALUES ('2', 'PHP入门', 'MARY', '120');
				INSERT INTO `books` VALUES ('3', 'Hibernate入门', 'TOM', '115');
				
			*实体类
			*public class Books {
				private Integer bookId;
				private String bookName;
				private String bookAuthor;
				private String bookprice;
				//seter geter 注意构造方法
				}
			*/
		
		//查询所有图书对象
		@Test
		public void testHql_1(){
			Session session = HibernateSessionFactory.getSession();
			String hql = "from Books";
			Query createQuery = session.createQuery(hql);
			List list = createQuery.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Books books = (Books) iterator.next();
				System.out.println(books.getBookName()+"-"+books.getBookAuthor()
						+"-"+books.getBookprice());
			}
		}
		//对查询结果进行排序
		@Test
		public void testHql_2(){
			Session session = HibernateSessionFactory.getSession();
			String hql = "from Books as b order by b.bookprice desc";
			Query createQuery = session.createQuery(hql);
			List list = createQuery.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Books books = (Books) iterator.next();
				System.out.println(books.getBookName()+"-"+books.getBookAuthor()
						+"-"+books.getBookprice());
			}
		}
		//检索图书对象的部分属性
		@Test
		public void testHql_3(){
			Session session = HibernateSessionFactory.getSession();
			String hql = "select b.bookName,b.bookAuthor from Books as b";
			Query createQuery = session.createQuery(hql);
			List list = createQuery.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Object[] object = (Object[]) iterator.next();
				System.out.println(object[0]+"-"+object[1]);
			}
		}
		//聚集函数
		@Test
		public void testHql_4(){
			Session session = HibernateSessionFactory.getSession();
			//统计所有书
			String hql = "select count(b) from Books as b";
			Query createQuery = session.createQuery(hql);
			Long count = (Long) createQuery.uniqueResult();
			//统计书的平均金额
			String hql1 = "select avg(b.bookprice) from Books as b";
			Query createQuery1 = session.createQuery(hql1);
			Double money = (Double) createQuery1.uniqueResult();
			//统计最贵和最便宜的图书
			String hql2 = "select min(b.bookprice),max(b.bookprice) from Books as b";
			Query createQuery2 = session.createQuery(hql2);
			Object[] price = (Object[]) createQuery2.uniqueResult();
			System.out.println("记录总数"+count.toString()+"平均金额"+money.toString()
					+"书价最低为"+price[0].toString()
					+"书价最高为"+price[1].toString());
		}
		//分组查询
		@Test
		public void testHql_5(){
			Session session = HibernateSessionFactory.getSession();
			String hql = "select b.bookAuthor,count(*) from Books as b group by "
					+ "b.bookAuthor";
			Query createQuery = session.createQuery(hql);
			List list = createQuery.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Object[] object = (Object[]) iterator.next();
				System.out.println("图书作者:"+object[0]+"  图书总数:"+object[1]);
			}
		}
		//动态实例查询
		@Test
		public void testHql_6(){
			Session session = HibernateSessionFactory.getSession();
			String hql = "select new Books(b.bookName,b.bookAuthor)  from Books as b ";
			Query createQuery = session.createQuery(hql);
			List list = createQuery.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Books books = (Books) iterator.next();
				System.out.println(books.getBookName()+"  "+books.getBookAuthor());
			}
		}
		//分页查询
		@Test
		public void testHql_7(){
			Session session = HibernateSessionFactory.getSession();
			//升序
			String hql = "from Books as b order by b.bookName asc";
			Query createQuery = session.createQuery(hql);
			//从第一个对象开始
			createQuery.setFirstResult(0);
			//从查询结果中一次返回3个对象
			createQuery.setMaxResults(3);
			//执行查询
			List list = createQuery.list();
			//遍历查询结果
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Books books = (Books) iterator.next();
				System.out.println(books.getBookName()+"  "
				+books.getBookAuthor()+"  "+books.getBookprice());
			}
		}
		/*public void testHql_7(int pageIndex,int pageSize){
			Session session = HibernateSessionFactory.getSession();
			//升序
			String hql = "from Books as b order by b.bookName asc";
			Query createQuery = session.createQuery(hql);
			int startIndex = (pageIndex-1)*pageSize;
			createQuery.setFirstResult(startIndex);
			createQuery.setMaxResults(pageSize);
			List list = createQuery.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Books books = (Books) iterator.next();
				System.out.println(books.getBookName()+"  "
				+books.getBookAuthor()+"  "+books.getBookprice());
			}
		}*/
		//条件查询
			/*按参数位置*/
		@Test
		public void testHql_8(){
			Session session = HibernateSessionFactory.getSession();
			String hql = "from Books books where books.bookName like ?";
			Query createQuery = session.createQuery(hql);
			createQuery.setString(0, "%JAVA%");
			List list = createQuery.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Books books = (Books) iterator.next();
				System.out.println(books.getBookName()+"  "+books.getBookAuthor());
			}
		}
		/*
		*setString:映射类型为字符串的参数赋值
		*setDate:映射类型为Date的参数赋值
		*setDouble:映射类型为double的参数赋值
		*setBoolean:映射类型为boolean的参数赋值
		*setInteger:映射类型为int的参数赋值
		*setTime:映射类型为Date的参数赋值
		*/
		/*
								testHql_10-testHql_18
		INSERT INTO `books` VALUES ('1', '(美)Stanley B。', 'C++ Primer中文版', '56', '2');
		INSERT INTO `books` VALUES ('2', '(美)瓦格纳 著', 'Effective C# 中', '45', '2');
		INSERT INTO `books` VALUES ('3', '(美)克尼汉', 'C程序设计语言', '30', '3');
		
		INSERT INTO `publishers` VALUES ('1', '清华大学出版社');
		INSERT INTO `publishers` VALUES ('2', '人民邮电出版社');
		INSERT INTO `publishers` VALUES ('3', '机械工业出版社');

		*/
		//Books
		@Entity
		@Table(name = "books", catalog = "bookshop")
		public class Books implements java.io.Serializable {
			private Integer id;
			private String title;
			private String author;	
			private Integer unitPrice;	
			private Publishers publishers;	
			@ManyToOne(fetch=FetchType.EAGER)
			@Cascade(value={CascadeType.SAVE_UPDATE}) 
			@JoinColumn(name="PublisherId")
			public Publishers getPublishers() {
				return publishers;
			}
			public void setPublishers(Publishers publishers) {
				this.publishers = publishers;
			}
			public Books() {
			}
			public Books(String title, String author, Integer publisherId) {
				this.title = title;
				this.author = author;		
			}
			public Books(String title, String author, Integer publisherId,
					Integer unitPrice) {
				this.title = title;
				this.author = author;		
				this.unitPrice = unitPrice;
			}
			@Id
			@GeneratedValue
			@Column(name = "Id", unique = true, nullable = false)
			public Integer getId() {
				return this.id;
			}
			public void setId(Integer id) {
				this.id = id;
			}
			@Column(name = "Title", nullable = false, length = 50)
			public String getTitle() {
				return this.title;
			}
			public void setTitle(String title) {
				this.title = title;
			}
			@Column(name = "Author", nullable = false, length = 16)
			public String getAuthor() {
				return this.author;
			}
			public void setAuthor(String author) {
				this.author = author;
			}
			@Column(name = "UnitPrice", precision = 8, scale = 0)
			public Integer getUnitPrice() {
				return this.unitPrice;
			}
			public void setUnitPrice(Integer unitPrice) {
				this.unitPrice = unitPrice;
			}
		}
		//Publishers
		@Entity
		@Table(name = "publishers", catalog = "bookshop")
		public class Publishers implements java.io.Serializable {
			private Integer id;
			private String name;
			private Set<Books> bks=new HashSet<Books>();
			@OneToMany(mappedBy="publishers",fetch=FetchType.EAGER)
			@Cascade(value={CascadeType.DELETE}) 
			public Set<Books> getBks() {
				return bks;
			}
			public void setBks(Set<Books> bks) {
				this.bks = bks;
			}
			public Publishers() {
			}
			public Publishers(String name) {
				this.name = name;
			}
			@Id
			@GeneratedValue
			@Column(name = "Id", unique = true, nullable = false)
			public Integer getId() {
				return this.id;
			}
			public void setId(Integer id) {
				this.id = id;
			}
			@Column(name = "Name", nullable = false, length = 16)
			public String getName() {
				return this.name;
			}
			public void setName(String name) {
				this.name = name;
			}
		}	
		
			//内连接
			@Test
			public void testHql_10(){
				Session session = HibernateSessionFactory.getSession();
				//String hql = "from Books b inner join b.publishers p where p.name='清华大学出版社'";
				String hql = "select b from Books b inner join b.publishers p where p.name='清华大学出版社'";
				Query createQuery = session.createQuery(hql);
				List list = createQuery.list();
				Iterator iterator = list.iterator();
				while (iterator.hasNext()) {
					Object[] obj = (Object[]) iterator.next();
					Books book = (Books)obj[0];
					Publishers publisher = (Publishers) obj[1];
					System.out.println("书名:"+book.getTitle()+"作者:"+book.getAuthor()
							+"单价:"+book.getUnitPrice()+"出版社:"+publisher.getName());
				}
			}
			//隐身内连接
			@Test
			public void testHql_11(){
				Session session = HibernateSessionFactory.getSession();
				String hql = "select b from Books b,Publishers p where"
						+ " b.publishers=p and p.name='清华大学出版社'";
				Query createQuery = session.createQuery(hql);
				List list = createQuery.list();
				Iterator iterator = list.iterator();
				while (iterator.hasNext()) {
					Books book = (Books) iterator.next();
					System.out.println("书名:"+book.getTitle()+"作者:"+book.getAuthor()
							+"单价:"+book.getUnitPrice());
				}
			}
			//左外连接
			@Test
			public void testHql_12(){
				Session session = HibernateSessionFactory.getSession();
				String hql = "from Books b left join b.publishers p where p.name='清华大学出版社'";
				Query createQuery = session.createQuery(hql);
				List list = createQuery.list();
				Iterator iterator = list.iterator();
				while (iterator.hasNext()) {
					Object[] obj = (Object[]) iterator.next();
					Books book = (Books)obj[0];
					Publishers publisher = (Publishers) obj[1];
					System.out.println("书名:"+book.getTitle()+"作者:"+book.getAuthor()
							+"单价:"+book.getUnitPrice()+"出版社:"+publisher.getName());
				}
			}
			//左外连接
			@Test
			public void testHql_13(){
				Session session = HibernateSessionFactory.getSession();
				String hql = "from Books b right join b.publishers p where p.name='清华大学出版社'";
				Query createQuery = session.createQuery(hql);
				List list = createQuery.list();
				Iterator iterator = list.iterator();
				while (iterator.hasNext()) {
					Object[] obj = (Object[]) iterator.next();
					Books book = (Books)obj[0];
					Publishers publisher = (Publishers) obj[1];
					System.out.println("书名:"+book.getTitle()+"作者:"+book.getAuthor()
							+"单价:"+book.getUnitPrice()+"出版社:"+publisher.getName());
				}
			}
			//交叉连接:相互之间毫无关系的对象
			@Test
			public void testHql_14(){
				Session session = HibernateSessionFactory.getSession();
				String hql = "from Books b,Publishers p where p.id=b.id";
				Query createQuery = session.createQuery(hql);
				List list = createQuery.list();
				Iterator iterator = list.iterator();
				while (iterator.hasNext()) {
					Object[] obj = (Object[]) iterator.next();
					Books book = (Books)obj[0];
					Publishers publisher = (Publishers) obj[1];
					System.out.println("书名:"+book.getTitle()+"作者:"+book.getAuthor()
							+"单价:"+book.getUnitPrice()+"出版社:"+publisher.getName());
				}
			}
			//相关子查询
			@Test
			public void testHql_15(){
				Session session = HibernateSessionFactory.getSession();
				String hql = "from Publishers p where (select count(*) from p.bks)>1";
				Query createQuery = session.createQuery(hql);
				List list = createQuery.list();
				Iterator iterator = list.iterator();
				while (iterator.hasNext()) {
					Publishers publisher = (Publishers) iterator.next();
					System.out.println("出版社:"+publisher.getName()+"   图书数量:"+publisher.getBks().size());
				}
			}
			//无关子查询
			@Test
			public void testHql_16(){
				Session session = HibernateSessionFactory.getSession();
				String hql = "from Books b where b.unitPrice<(select avg(b1.unitPrice) from Books b1)";
				Query createQuery = session.createQuery(hql);
				List list = createQuery.list();
				Iterator iterator = list.iterator();
				while (iterator.hasNext()) {
					Books book = (Books) iterator.next();
					System.out.println("书名:"+book.getTitle()+"  单价:"+book.getUnitPrice());
				}
			}
			//与子查询相关的关键字
			/*all:子查询语句返回的所有记录
			any:子查询语句返回的任意一条记录
			some:any关键字相同
			in:是否出现子查询返回的所有记录
			exists:子查询是否至少返回一条记录
			*/
			//exists关键字的子查询
			@Test
			public void testHql_17(){
				Session session = HibernateSessionFactory.getSession();
				String hql = "from Publishers p where exists(select b from p.bks b where b.unitPrice>55) ";
				Query createQuery = session.createQuery(hql);
				List list = createQuery.list();
				Iterator iterator = list.iterator();
				while (iterator.hasNext()) {
					Publishers publisher = (Publishers) iterator.next();
					System.out.println("出版社:"+publisher.getName());
				}
			}
			//in关键字的子查询
			@Test
			public void testHql_18(){
				Session session = HibernateSessionFactory.getSession();
				String hql = "from Publishers p where 2 in(select count(b) from p.bks b) ";
				Query createQuery = session.createQuery(hql);
				List list = createQuery.list();
				Iterator iterator = list.iterator();
				while (iterator.hasNext()) {
					Publishers publisher = (Publishers) iterator.next();
					System.out.println("出版社:"+publisher.getName());
				}
			}
		}
	//QBC
		//Restrictions类提供的方法
		//Restrictions.eq:等于
		//Restrictions.allEq:使用Map
		//Restrictions.gt:大于
		//Restrictions.ge:大于等于
		//Restrictions.lt:小于
		//Restrictions.le:小于等于
		//Restrictions.between:BETWEEN子句
		//Restrictions.like:LIKE子句
		//Restrictions.in:in子句
		//Restrictions.and:and关系
		//Restrictions.or:or关系
		//Restrictions.sqlRestriction:SQL限定查询
		//简单查询
		@Test
		public void testCriteria_1(){
			Session session = HibernateSessionFactory.getSession();
			Criteria createCriteria = session.createCriteria(Books.class);
			createCriteria.addOrder(Order.asc("id"));
			List list = createCriteria.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Books book = (Books) iterator.next();
				System.out.println("书名:"+book.getTitle()+" 作者:"+book.getAuthor()+" 单价:"+book.getUnitPrice());
			}
		}
		//分组查询
		@Test
		public void testCriteria_2(){
			Session session = HibernateSessionFactory.getSession();
			Criteria createCriteria = session.createCriteria(Books.class);
			ProjectionList projectionList = Projections.projectionList();
			projectionList.add(Projections.groupProperty("publishers"));
			projectionList.add(Projections.rowCount());
			projectionList.add(Projections.sum("unitPrice"));
			createCriteria.setProjection(projectionList);
			List list = createCriteria.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Object[] object = (Object[]) iterator.next();
				Publishers publisher = (Publishers)object[0];
				System.out.println("出版社:"+publisher.getName()+" 总数:"+object[1]+" 总和:"+object[2]);
			}
		}
		//内置聚集函数
		@Test
		public void testCriteria_3(){
			Session session = HibernateSessionFactory.getSession();
			Criteria createCriteria = session.createCriteria(Books.class);
			ProjectionList projectionList = Projections.projectionList();
			projectionList.add(Projections.sum("unitPrice"));
			projectionList.add(Projections.avg("unitPrice"));
			projectionList.add(Projections.max("unitPrice"));
			projectionList.add(Projections.min("unitPrice"));
			createCriteria.setProjection(projectionList);
			List list = createCriteria.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Object[] object = (Object[]) iterator.next();
				System.out.println("单价总和:"+object[0]+" 平均单价:"+object[1]+" 最大单价:"+object[2]+" 最小单价:"+object[3]);
			}
		}
		//组合查询
		@Test
		public void testCriteria_4(){
			Session session = HibernateSessionFactory.getSession();
			Books condition = new Books();
			condition.setTitle("C++");
			//condition.setAuthor("B");
			Criteria createCriteria = session.createCriteria(Books.class);
			if(condition!=null){
				if(condition.getTitle()!=null&&!condition.getTitle().equals("")){
					createCriteria.add(Restrictions.like("title", condition.getTitle(),
							MatchMode.ANYWHERE));
				}
				if(condition.getAuthor()!=null&&!condition.getAuthor().equals("")){
					createCriteria.add(Restrictions.like("author", condition.getAuthor(),
							MatchMode.ANYWHERE));
				}
			}
			List list = createCriteria.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Books book = (Books) iterator.next();
				System.out.println("书名:"+book.getTitle()+" 作者:"+book.getAuthor()+" 单价:"+book.getUnitPrice());
			}
		}
		//MatchMode包含的常量
			//MatchMode.ANYWHERE:模糊匹配
			//MatchMode.EXACT:精确匹配
			//MatchMode.START:某个字符开头匹配
			//MatchMode.END:某个字符结尾匹配
		//关联查询
		@Test
		public void testCriteria_5(){
			Session session = HibernateSessionFactory.getSession();
			List list = session.createCriteria(Books.class)
					.add(Restrictions.like("title","C",MatchMode.ANYWHERE))
					.createCriteria("publishers").add(Restrictions.like("name", "人民邮电出版社")).list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Books book = (Books) iterator.next();
				System.out.println("书名:"+book.getTitle()+" 作者:"+book.getAuthor()+" 单价:"+book.getUnitPrice());
			}
		}
		//分页查询
		@Test
		public void testCriteria_6(){
			Session session = HibernateSessionFactory.getSession();
			Criteria createCriteria = session.createCriteria(Books.class);
			createCriteria.setFirstResult(0);
			createCriteria.setMaxResults(4);
			List list = createCriteria.list();
			Iterator iterator = list.iterator();
			while (iterator.hasNext()) {
				Books book = (Books) iterator.next();
				System.out.println("书名:"+book.getTitle()+" 作者:"+book.getAuthor()+" 单价:"+book.getUnitPrice());
			}
		}
//Hibernate进阶
	//批量插入
	//批量插入
	@Test
	public void testBatchAddByCache(){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateSessionFactory.getSession();
			tx = session.beginTransaction();
			for(int i=0;i<100000;i++){
				Users user = new Users();
				user.setLoginName("u"+i);
				user.setLoginPwd("123456");
				session.save(user);
				if(i%1000==0){	//清理session缓存
					session.flush();
					session.clear();
				}
			}
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			session.close();
		}
	}
	//配置文件中加入
	<!-- 设置批量尺寸 -->
	<property name="hibernate.jdbc.batch_size">1000</property>
	<!-- 关闭二级缓存 -->
	<property name="hibernate.cache.use_second_level_cache">false</property>
	//绕过Hibernate直接调用JDBC API批量插入
	@Test
	public void testBatchAddByJDBC(){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateSessionFactory.getSession();
			tx = session.beginTransaction();
			//调用WORK对象的execute方法
			session.doWork(
					new Work(){
						public void execute(Connection connection)
						 throws SQLException{
							PreparedStatement ps = connection.prepareStatement(
									"insert into users(loginName,loginPwd) values(?,?)");
							for(int i=0;i<100000;i++){
								ps.setString(1, "u"+i);
								ps.setString(2, "123456");
								ps.addBatch();
							}
							ps.executeBatch();
						}
					});
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}
	}
	//使用hibernate直接进行批量更新
	@Test
	public void testBatchUpdateByCache(){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateSessionFactory.getSession();
			tx = session.beginTransaction();
			Query createQuery = session.createQuery("update Users set loginPwd='111111'");
			createQuery.executeUpdate();
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			session.close();
		}
	}
	//绕过Hibernate直接调用JDBC API批量更新
	@Test
	public void testBatchUpdateByJDBC(){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateSessionFactory.getSession();
			tx = session.beginTransaction();
			//调用WORK对象的execute方法
			session.doWork(
					new Work(){
						public void execute(Connection connection)
						 throws SQLException{
							Statement st = connection.createStatement();
							st.executeUpdate("update Users set loginPwd='222222'");
						}
					});
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}
	}
	//使用hibernate直接进行批量删除
	@Test
	public void testBatchDeleteByCache(){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateSessionFactory.getSession();
			tx = session.beginTransaction();
			Query createQuery = session.createQuery("delete Users where id>576051");
			createQuery.executeUpdate();
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}finally{
			session.close();
		}
	}
	//绕过Hibernate直接调用JDBC API批量删除
	@Test
	public void testBatchDeleteByJDBC(){
		Session session = null;
		Transaction tx = null;
		try {
			session = HibernateSessionFactory.getSession();
			tx = session.beginTransaction();
			//调用WORK对象的execute方法
			session.doWork(
					new Work(){
						public void execute(Connection connection)
						 throws SQLException{
							Statement st = connection.createStatement();
							st.executeUpdate("delete from Users where id > 0");
						}
					});
			tx.commit();
		} catch (Exception e) {
			e.printStackTrace();
			tx.rollback();
		}
	}
	//Hibernate事务
	//原子性 一致性 隔离性 持久性
	//5种并发问题
	//第一类丢失更新:同时操作一个数据,撤销一个事务,把其他事务已提交的更新数据覆盖,对其他事务来说造成数据丢失
	//第二类丢失更新:同时操作一个数据,事务A将修改结果成功提交后,对事务B已提交的修改结果进行覆盖,对事务B造成数据丢失
	//脏读:同时操作一个数据,事务A读到事务B未提交的更新数据,且对数据进行操作,如果事务B撤销更新后,事务A所操作的数据变成脏数据
	//不可重复读:同时操作一个数据,事务A对同一行数据重复读取两次,每次读取的结果不同。有可能第二次读取数据的时候原始数据被事务B更改,并成功提交
	//幻象读:同时操作一个数据,事务A执行两次查询,第二次查询结果比第一次查询多出一行,这是因为两次查询之间事务B插入了新数据造成的
	//4个事务隔离级别
	//序列化(8级):提供严格的事务隔离,隔离级别不允许事务并行执行,只允许一个接着一个执行。有效防止脏读,不可重复读和幻象读
	//可重复读取(4级):可以访问其他事务成功提交的新插入数据,不能访问成功修改数据,读数据的事务禁止写事务,写事务则禁止其他事务,有效防止不可重复读和脏读
	//读已提交数据(2级):可以访问其他事务成功提交的新插入数据,又可访问成功修改数据,读数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止
						//其他事务访问该数据。防止脏读
	//读未提交数据(1级):可以访问未提交新插入的数据,有可以访问未提交修改的数据,如果开始了写数据,则不允许另一个事务同时进行写操作,但可以读操作。
						//防止第一类丢失更新
	//推荐隔离级别设置2,虽然隔离级别会导致不可重复读、幻象读和第二类丢失更新这些并发问题,但是通过在应用程序中采用悲观锁或乐观锁来加以控制					
	//悲观锁:
	//Lock.NONE:如果缓存中存在对象,直接返回该对象的引用,否则通过select语句到数据库中加载该对象,这是锁的默认设置
	//LockMode.READ:不管是否存在对象,总是通过select语句到数据库中加载对象,如果映射文件中设置版本元素,就执行版本检查,比较是否与数据库中的对象版本一致
	//LookMode.UPGRADE:不管是否存在对象,总是通过select语句到数据库中加载对象,如果映射文件中设置版本元素,就执行版本检查,比较是否与数据库中的对象版本一致,
						//如果支持悲观锁,就执行select...for update语句,如果不知道,就执行select语句
	//LockMode.UPGRADE_NOWAIT:与LookMode.UPGRADE具有同样的功能,此外对ORACLE支持update nowait的数据库,执行select。。for update nowait语句,nowait表明如果
							//该select语句的事务不能立即获得悲观锁,那么不会等待其他事务释放锁,而是立刻抛出锁定异常
	//LockMode.WRITE:保持对象会自动使用这种锁定模式,仅供HIberenate内部使用,应用程序中不应该使用它
	//LockMode.FORCE:强制更新数据库中的对象的版本属性,从而表明当前事务已经更新这个对象
		//设定锁模式的方法有:
			//调用Session.load时指定锁定模式
			//调用Session.lock
			//调用Query.setLockMode
	//Account
	public class Account {
		private Integer Id;
		private String AccountNo;
		private String Balance;
	}
	//TransactionA
	public class TransactionA extends TimerTask {
		@Override
		public void run() {
			Transaction tx = null;
			Session session = null;
			try{
				session = HibernateSessionFactory.getSession();
				tx= session.beginTransaction();
				System.out.println("取款事务开始");
				Query createQuery = session.createQuery("from Account a where id=2");
				createQuery.setLockMode("a", LockMode.UPGRADE_NOWAIT);
				Account account = (Account) createQuery.uniqueResult();
				System.out.println("查询到存款余额"+account.getBalance());
				account.setBalance(Integer.parseInt(account.getBalance())-100+"");
				System.out.println("取出100元,存款余额改为:"+account.getBalance());
				session.update(account);
				tx.commit();
			}catch(Exception e){
				e.printStackTrace();
				tx.rollback();
			}finally{
				session.close();
			}
		}
	}
	//TransactionB
	public class TransactionB extends TimerTask {
		@Override
		public void run() {
			Transaction tx = null;
			Session session  = null;
			try{
				session = HibernateSessionFactory.getSession();
				tx = session.beginTransaction();
				System.out.println("转账事务开始");
				Query createQuery = session.createQuery("from Account a where id=2");
				createQuery.setLockMode("a", LockMode.UPGRADE_NOWAIT);
				Account account = (Account) createQuery.uniqueResult();
				createQuery.setLockMode("account", LockMode.UPGRADE_NOWAIT);
				System.out.println("查询到存款余额"+account.getBalance());
				account.setBalance(Integer.parseInt(account.getBalance())+100+"");
				System.out.println("汇入100元,存款余额改为:"+account.getBalance());
				session.update(account);
				tx.commit();
			}catch(Exception e){
				e.printStackTrace();
				tx.rollback();
			}finally{
				session.close();
			}
		}
	}
	//TestHibernateLock
	public class TestHibernateLock {
		public static void main(String[] args) {
			new TestHibernateLock().testPessimisticLocking();
		}
		//悲观锁,通过定时器启动事务A和事务B
		private void testPessimisticLocking(){
			Timer timer = new Timer();
			timer.schedule(new TransactionA(), 0);
			Timer timer2 = new Timer();
			timer2.schedule(new TransactionB(), 0);
		}
	}
	//乐观锁
	public class Account {
		private Integer Id;
		private String AccountNo;
		private String Balance;
		private Integer Version;
	} 
	//TransactionC
	public class TransactionC extends TimerTask {
		@Override
		public void run() {
			Transaction tx = null;
			Session session = null;
			try{
				session = HibernateSessionFactory.getSession();
				tx= session.beginTransaction();
				System.out.println("取款事务开始");
				Account a1 = (Account) session.get(Account.class, 1);
				System.out.println("查询到存款余额"+a1.getBalance());
				System.out.println("事务C中的ID为1的账号版本号为"+a1.getVersion());
				a1.setBalance(Integer.parseInt(a1.getBalance())-100+"");
				System.out.println("取出100元,存款余额改为:"+a1.getBalance());
				session.update(a1);
				tx.commit();
			}catch(Exception e){
				tx.rollback();
				System.out.println("【错误信息】"+e.getMessage());
				System.out.println("账户信息已被其他事务修改,本事务被撤销,请重新开始取款事务");
				Timer timer = new Timer();
				timer.schedule(new TransactionC(), 0);
			}finally{
				session.close();
			}
		}
	}
	//TransactionD
	public class TransactionD extends TimerTask {
		@Override
		public void run() {
			Transaction tx = null;
			Session session = null;
			try{
				session = HibernateSessionFactory.getSession();
				tx= session.beginTransaction();
				System.out.println("转账事务开始");
				Account a1 = (Account) session.get(Account.class, 1);
				System.out.println("查询到存款余额"+a1.getBalance());
				System.out.println("事务C中的ID为1的账号版本号为"+a1.getVersion());
				a1.setBalance(Integer.parseInt(a1.getBalance())+100+"");
				System.out.println("汇入100元,存款余额改为:"+a1.getBalance());
				session.update(a1);
				tx.commit();
			}catch(Exception e){
				tx.rollback();
				System.out.println("【错误信息】"+e.getMessage());
				System.out.println("账户信息已被其他事务修改,本事务被撤销,请重新开始取款事务");
				Timer timer = new Timer();
				timer.schedule(new TransactionD(), 0);
			}finally{
				session.close();
			}
		}
	}
	//TestHibernateLock
	public class TestHibernateLock {
		public static void main(String[] args) {
			new TestHibernateLock().testOptLocking();
		}
		//乐观锁,通过定时器启动事务A和事务B
		private void testOptLocking(){
			Timer timer = new Timer();
			timer.schedule(new TransactionC(), 0);
			Timer timer2 = new Timer();
			timer2.schedule(new TransactionD(), 0);
		}
	}
//Hibernate 缓存
	//事务范围:缓存只能被当前事务访问,事务结束,缓存的生命周期也结束了
	//进程范围:缓存被进程内的所有事务共享,进程结束,缓存的生命周期结束
	//集群范围:缓存被一个或多个计算机的进程共享
	
	//第一级缓存
			//get查询测试
			@Test
			public void testGet_1(){
				Session session = HibernateSessionFactory.getSession();
				Users user = (Users) session.get(Users.class, 1);
				System.out.println(user.getLoginName());
				Users user2 = (Users) session.get(Users.class, 1);
				System.out.println(user2.getLoginName());
				HibernateSessionFactory.closeSession();
			}
			//开启两个Session中发出两次get查询
			@Test
			public void testGet_2(){
				Session session1 = HibernateSessionFactory.getSession();
				Users user = (Users) session1.get(Users.class, 1);
				System.out.println(user.getLoginName());
				HibernateSessionFactory.closeSession();
				//第二个
				Session session2 = HibernateSessionFactory.getSession();
				Users user2 = (Users) session2.get(Users.class, 1);
				System.out.println(user2.getLoginName());
				HibernateSessionFactory.closeSession();
			}
			//iterate查询
			@Test
			public void testIterator1(){
				Session session1 = HibernateSessionFactory.getSession();
				Users user = (Users) session1.createQuery("from Users u where u.id=1")
						.iterate().next();
				System.out.println(user.getLoginName());
				Users user2 = (Users) session1.createQuery("from Users u where u.id=1")
						.iterate().next();
				System.out.println(user2.getLoginName());
				HibernateSessionFactory.closeSession();
			}
			//iterate查询属性测试
			@Test
			public void testIterator_2(){
				Session session = HibernateSessionFactory.getSession();
				String loginName1 = (String) session.createQuery("select u.loginName from Users u where u.id =1")
							.iterate().next();
				System.out.println(loginName1);
				String loginName2 = (String) session.createQuery("select u.loginName from Users u where u.id =1")
						.iterate().next();
				System.out.println(loginName2);
			}
			//在一个Session中先Save,在执行load查询
			@Test
			public void testSave_Load(){
				Session session = HibernateSessionFactory.getSession();
				Transaction beginTransaction = session.beginTransaction();
				Users users = new Users();
				users.setLoginName("新用户");
				Serializable id = session.save(users);
				beginTransaction.commit();
				Users users1 = (Users) session.load(Users.class, id);
				System.out.println(users.getLoginName());
				HibernateSessionFactory.closeSession();
				
			}
			//clear方法
			@Test
			public void testClear(){
				Session session = HibernateSessionFactory.getSession();
				Users users = (Users) session.load(Users.class, 1);
				System.out.println(users.getLoginName());
				session.clear();
				Users users2 = (Users) session.load(Users.class, 1);
				System.out.println(users2.getLoginName());
				HibernateSessionFactory.closeSession();
			}
	//Hibernate中的二级缓存
	//常用二级缓存插件包EHCache、OSCache、SwarmCache和JBossCache
	//Hibernate中使用EHCache配置
		//引入EHCache相关jar包 ehcache-core-2.4.3  hibernate-ehcache-4.3.9.Final slf4j-api-1.6.1
		//在src下创建EHCache配置文件ehcache.xml
		<ehcache>
			<diskStore path="java.io.tmpdir"/>
			<defaultCache
				maxElementsInMemory="10000"
				eternal="false"
				timeToIdleSeconds="120"
				timeToLiveSeconds="120"
				overflowToDisk="true"
				/>
			<cache name="sampleCache1"
				maxElementsInMemory="10000"
				eternal="false"
				timeToIdleSeconds="300"
				timeToLiveSeconds="600"
				overflowToDisk="true"
				/>
			<cache name="sampleCache2"
				maxElementsInMemory="1000"
				eternal="true"
				timeToIdleSeconds="0"
				timeToLiveSeconds="0"
				overflowToDisk="false"
				/> 
		</ehcache>
		//在Hibernate配置文件里启用EHCache(cfg.xml)
			<!-- 启用二级缓存 -->
			<property name="hibernate.cache.use_second_level_cache">true</property>
			<!-- 设置二级缓存插件EHCache的Provider类 -->
			<property name="hibernate.cache.region.factory_class">
				org.hibernate.cache.ehcache.EhCacheRegionFactory
			</property>
		//配置那些实体类需要二级缓存
			//方式一:在hbm.xml中加入<cache useage="read-write">标签
					//read-only 只读并发访问策略
					//read-write 读写型并发访问策略
					//nonstrict-read-write 表示非严格读写型并发访问策略
					//Ehcache插件不支持transaction事务型并发访问策略
			//方式二:(推荐)
				//在cfg.xml文件中使用<class-cache>元素
		//测试二级缓存
		@Test
		public void testGet(){
			Session session = HibernateSessionFactory.getSession();
			Users user = (Users) session.get(Users.class, 1);
			System.out.println(user.getLoginName());
			HibernateSessionFactory.closeSession();
			
			Session session2 = HibernateSessionFactory.getSession();
			Users user2 = (Users) session2.get(Users.class, 1);
			System.out.println(user2.getLoginName());
			HibernateSessionFactory.closeSession();
		}
	//查询缓存
		//1、<property name="hibernate.cache.use_query_cache">true</property>
		//2、在程序中添加query.setCacheable(true)
	//数据库连接池
		//在javax.naming的包中提供Context接口,该接口提供两种常用的方法
			//void bind(String name,Object object):该方法用于将名称绑定到对象,所有中间和目标上下文都存在
			//Object lookup(String name):该方法用于检索指定的名字绑定的对象
//Spring 
	//非侵入式:业务逻辑层是纯净的,不能出现与业务相关的代码
	//容器:提供容器的功能,可以管理对象的生命周期、对象与对象之间的依赖关系
	//IOC:控制反转
	//AOP:面向切面编程
	//spring-aop-3.2.2.RELEASE:面向切面支持,提供AOP实现
	//spring-asm-3.0.5.RELEASE:独立的asm.jar
	//spring-aspects-3.2.2.RELEASE:	对AspectJ整合
	//spring-beans-3.2.2.RELEASE:IOC依赖注入
	//spring-context-3.2.2.RELEASE:基础IOC功能上的扩展服务		
	//spring-core-3.2.2.RELEASE:核心工具包		
	//spring-expression-3.2.2.RELEASE:表达式语言		
	//spring-instrument-3.2.2.RELEASE:服务器代理接口
	//spring-jdbc-3.2.2.RELEASE:jdbc简单封装
	//spring-jms-3.2.2.RELEASE:JMS API使用而做的简单封装
	//spring-orm-3.2.2.RELEASE:ORM映射支持
	//spring-oxm-3.2.2.RELEASE:Object/xmi的映射支持	
	//spring-test-3.2.2.RELEASE:对JUnit等测试框架所做的简易封装		
	//spring-tx-3.2.2.RELEASE:为JDBC、Hibernate、JDO、JPA等提供一致的声明式和编程式事务管理
	//spring-web-3.2.2.RELEASE:SpringWEB工具包
	//spring-webmvc-3.2.2.RELEASE:SpringMVC核心包
	//spring-webmvc-portlet-3.2.2.RELEASE:SpringMVC增强
	//依赖注入
		//UserBiz
		public interface UserBiz {
			public boolean login(String username,String password);
		}
		//UserBizImpl.java
		public class UserBizImpl implements UserBiz {
			UserDao userDao;
			public void setUserDao(UserDao userDao) {
				this.userDao = userDao;
			}
			@Override
			public boolean login(String username, String password) {
				return userDao.login(username, password);
			}
		}	
		//UserDao
		public interface UserDao {
			public boolean login(String username,String password);
		}		
		//UserDaoImpl
		public class UserDaoImpl implements UserDao {
			@Override
			public boolean login(String username, String password) {
				if(username.equals("admin")&&password.equals("123123")){
					return true;
				}
				return false;
			}
		}		
		//Test
		public class Test {
			public static void main(String[] args) {
				ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
				UserBiz userBiz = (UserBiz) context.getBean("userBiz");
				boolean flag = userBiz.login("admin", "123123");
				if (flag) {
					System.out.println("登录成功");
				}else {
					System.out.println("登录失败");
				}
			}
		}		
		//applicationContext.xml
		<?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.xsd">
			<bean id="userDao" class="dao.UserDaoImpl"></bean>
			<bean id="userBiz" class="biz.UserBizImpl">
				<property name="userDao" ref="userDao"></property>	
			</bean>
		</beans>		
	//Bean工厂的ApplicationContext
		//基于ContextLoaderListener
		//基于ContextLoaderServlet
	//bean的作用域
		//singleton(单例模式):一个Bean对应一个对象实例
		//prototype(原型模式):一个Bean对应多个对象实例
		//request:一次HTTP请求,返回的该Bean同一个实例,不同用户请求,返回不同
		//session:在一次http session中,容器会返回该bean的同一个实例
		//global session:在一个全局的HTTP SESSION中容器会返回该Bean的同一个实例
//基于XML的Bean的装配
	//beans:整个配置文件的跟节点
	//bean:定义一个bean的实例化信息
	//constructor-arg:标记的子标记,用以传入构造参数进行实例化
	//property:bean标记的子标记,用于调用Bean实例中的Set方法完成属性的赋值,完成依赖注入
	//ref:作为property、constructor-arg等标记的子标记,其bean属性用于指定对Bean工厂中某个Bean实例的引用
	//value:作为property、constructor-arg等标记的子标记,用于指定一个常量值
	//list:用于封装List或数组类型属性的依赖注入
	//set:用于封装Set类型属性的依赖注入
	//map:用于封装Map类型属性的依赖注入
	//entry:通常作为map标记的子标记,用于设置键值对
	//Users
	public class Users {
		private String loginName;
		private String loginPwd;
		public String getLoginName() {
			return loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		public String getLoginPwd() {
			return loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
		public Users(String loginName, String loginPwd) {
			super();
			this.loginName = loginName;
			this.loginPwd = loginPwd;
		}
		public Users() {
			this.loginPwd = String.valueOf(new Random().nextInt(100000));
		}
	}
	//XmlBeanAssemble
	public class XmlBeanAssemble {
		List myList1;
		List myList2;
		Set mySet;
		Map myMap;
		public void init(){
			System.out.println("初始化方法init被调用");
		}
		public void destroy(){
			System.out.println("销毁方法被调用");
		}
		public void show(){
			System.out.println("原型模式, zhangsan两次获得密码分别是:");
			for(Object obj:myList1){
				System.out.println(((Users)obj).getLoginPwd());
			}
			System.out.println("单例模式, zhangsan两次获得密码分别是:");
			for(Object obj:myList2){
				System.out.println(((Users)obj).getLoginPwd() );
			}
			for(Object obj:mySet){
				if(obj instanceof Users){
					System.out.println(((Users)obj).getLoginName()+"正在学习框架");
				}else {
					System.out.println(obj+"\t");
				}
			}
			for(Object obj:myMap.keySet()){
				System.out.println(obj.toString()+":"+myMap.get(obj));
			}
		}
		public List getMyList1() {
			return myList1;
		}
		public void setMyList1(List myList1) {
			this.myList1 = myList1;
		}
		public List getMyList2() {
			return myList2;
		}
		public void setMyList2(List myList2) {
			this.myList2 = myList2;
		}
		public Set getMySet() {
			return mySet;
		}
		public void setMySet(Set mySet) {
			this.mySet = mySet;
		}
		public Map getMyMap() {
			return myMap;
		}
		public void setMyMap(Map myMap) {
			this.myMap = myMap;
		}
	}	
	//Test
	public class Test {
		public static void main(String[] args) {
			ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
			XmlBeanAssemble xba = (XmlBeanAssemble) ctx.getBean("xba");
			xba.show();
			((ClassPathXmlApplicationContext)ctx).destroy();
		}
	}	
	//applicationContext.xml
	<?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.xsd">
		<bean id="user1" class="shw.Users" scope="prototype">
			<property name="loginName" value="zhangsan"></property>
		</bean>
		<bean id="user2" class="shw.Users">
			<property name="loginName" value="zhangsan"></property>
		</bean>
		<bean id="user3" class="shw.Users">
			<constructor-arg index="0" value="lisi"></constructor-arg>
			<constructor-arg index="1" value="123456"></constructor-arg>
		</bean>
		<bean id="xba" class="shw.XmlBeanAssemble" init-method="init" destroy-method="destroy">
			<property name="myList1">
				<list>
					<ref bean="user1"/>
					<ref bean="user1"/>
				</list>
			</property>
			<property name="myList2">
				<list>
					<ref bean="user2"/>
					<ref bean="user2"/>
				</list>
			</property>
			<property name="mySet">
				<set>
					<ref bean="user3"/>
					<value>Struts 2</value>
					<value>Spring 3</value>
				</set>
			</property>	
			<property name="myMap">
				<map>
					<entry key="Struts 2">
						<value>支持MVC模式</value>
					</entry>
					<entry key="Spring 3">
						<value>充当组件粘合剂</value>
					</entry>
				</map>
			</property>
		</bean>
	</beans>	
//基于Annotation的Bean装配
	//Autowired:自动配置工作
	//Resource:自动配置工作
	//Qualfier:与Autowired配合使用
	//Test
	public class Test {
		public static void main(String[] args) {
			new Test().springDI();
		}
		@Autowired
		public void springDI() {
			ApplicationContext context = new ClassPathXmlApplicationContext(
					"applicationContext.xml");
			UserBiz userBiz = (UserBiz) context.getBean("userBiz");
			boolean flag = userBiz.login("admin", "123123");
			if (flag) {
				System.out.println("登录成功");
			} else {
				System.out.println("登录失败");
			}
		}
	}
	//UserBiz
	public interface UserBiz {
		public boolean login(String username, String password);
	}
	//UserBizImpl
	public class UserBizImpl implements UserBiz {
		@Autowired
		UserDao userDao;
		@Autowired
		public void setUserDao(UserDao userDao) {
			this.userDao = userDao;
		}
		@Override
		public boolean login(String username, String password) {
			return userDao.login(username, password);
		}
	}
	//UserDao
	public interface UserDao {
			public boolean login(String username, String password);
		}
		//
		public class UserDaoImpl implements UserDao {
		@Override
		public boolean login(String username, String password) {
			if (username.equals("admin") && password.equals("123123")) {
				return true;
			}
			return false;
		}
	}
	//UserDaoImpl
	public class UserDaoImpl implements UserDao {
		@Override
		public boolean login(String username, String password) {
			if (username.equals("admin") && password.equals("123123")) {
				return true;
			}
			return false;
		}
	}
	//applicationContext.xml
	<?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:context="http://www.springframework.org/schema/context"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
		<bean id="userDao" class="shw.UserDaoImpl"></bean>
		<bean id="userBiz" class="shw.UserBizImpl"></bean>
		<context:annotation-config></context:annotation-config>
	</beans>
//基于代理类proxyFactoryBean的AOP实现
	//target:代理对象
	//proxyInterfaces:代理所要实现的接口
	//interceptorNames:需要植入目标对象的Bean的列表
	//singleton:返回的代理是否是单实例
	//前置通知和后置通知
	//LogAdvice
	public class LogAdvice implements MethodBeforeAdvice,AfterReturningAdvice{
		@Override
		public void before(Method method, Object[] args, Object target)
				throws Throwable {
			String name = target.getClass().getName();
			String name2 = method.getName();
			System.out.println("前置通知"+name+"类的"+name2+"方法开始执行");
		}

		@Override
		public void afterReturning(Object returnValue, Method method, Object[] args,
				Object target) throws Throwable {
			String name = target.getClass().getName();
			String name2 = method.getName();
			System.out.println("后置通知"+name+"类的"+name2+"方法结束执行");
		}
		
		public void afterThrowing(Method method, Object[] args,	Object target,Throwable exeptionClass){
			String name = target.getClass().getName();
			String name2 = method.getName();
			System.out.println("异常通知"+name+"类的"+name2+"方法发生异常");
		}
	}
	//Test
	public class Test {
		public static void main(String[] args) {
			ApplicationContext context = new ClassPathXmlApplicationContext(
					"applicationContext.xml");
			UserBiz userBiz = (UserBiz) context.getBean("ub");
			userBiz.addUser("zhangsan","123");
			userBiz.delUser(1);
			throw new RuntimeException("这是特意抛出的异常信息");
		}
	}
	//UserBiz
	public interface UserBiz {
		public void addUser(String username,String password);
		public void delUser(int id);
	}
	//UserBizImpl
	public class UserBizImpl implements UserBiz {
		UserDAO userDAO;
		public void setUserDAO(UserDAO userDAO) {
			this.userDAO = userDAO;
		}
		@Override
		public void addUser(String username, String password) {
			userDAO.addUser(username, password);
		}
		@Override
		public void delUser(int id) {
			userDAO.delUser(id);
		}
	}
	//UserDAO
	public interface UserDAO {
		public void addUser(String username,String password);
		public void delUser(int id);
	}
	//UserDAOImpl
	public class UserDAOImpl implements UserDAO {
		@Override
		public void addUser(String username, String password) {
			System.out.println(username+"用户添加成功");
		}
		@Override
		public void delUser(int id) {
			System.out.println("编号为"+id+"的用户被删除");
		}
	}
	//applicationContext.xml
	<?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:context="http://www.springframework.org/schema/context"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
			http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd">
		<bean id="userDAO" class="shw.UserDAOImpl"></bean>
		<bean id="userBiz" class="shw.UserBizImpl">
			<property name="userDAO" ref="userDAO"></property>
		</bean>
		<bean id="logAdvice" class="shw.LogAdvice"></bean>
		<bean id="ub" class="org.springframework.aop.framework.ProxyFactoryBean">
			<property name="proxyInterfaces">
				<value>shw.UserBiz</value>
			</property>
			<property name="interceptorNames">
				<list>
					<value>logAdvice</value>
				</list>
			</property>
			<property name="target" ref="userBiz"></property>
		</bean>
	</beans>
//基于Schema的AOP实现
	//AllLogAdvice
	public class AllLogAdvice {
		private Logger logger=Logger.getLogger(AllLogAdvice.class);
		//此方法将作为前置通知
		public void myBeforeAdvice(JoinPoint jionpoint){
			//获取被调用的类名
			String targetClassName=jionpoint.getTarget().getClass().getName();
			//获取被调用的方法名
			String targetMethodName=jionpoint.getSignature().getName();
			//日志格式字符串
			String logInfoText="前置通知:"+targetClassName+"类的"+targetMethodName+"方法开始执行";
			//将日志信息写入配置的文件中
			logger.info(logInfoText);
		}
		
		//此方法将作为后置通知
		public void myAfterReturnAdvice(JoinPoint jionpoint){
			//获取被调用的类名
			String targetClassName=jionpoint.getTarget().getClass().getName();
			//获取被调用的方法名
			String targetMethodName=jionpoint.getSignature().getName();
			//日志格式字符串
			String logInfoText="后置通知:"+targetClassName+"类的"+targetMethodName+"方法开始执行";
			//将日志信息写入配置的文件中
			logger.info(logInfoText);
		}
		
		//此方法将作为异常通知
		public void myThrowingAdvice(JoinPoint jionpoint,Exception e){
			//获取被调用的类名
			String targetClassName=jionpoint.getTarget().getClass().getName();
			//获取被调用的方法名
			String targetMethodName=jionpoint.getSignature().getName();
			//日志格式字符串
			String logInfoText="异常通知:执行"+targetClassName+"类的"+targetMethodName+"方法时发生异常";
			//将日志信息写入配置的文件中
			logger.info(logInfoText);
		}
		
		//此方法将作为环绕通知
		public void myAroundAdvice(ProceedingJoinPoint jionpoint) throws Throwable{
			long beginTime=System.currentTimeMillis();
			jionpoint.proceed();		
			long endTime=System.currentTimeMillis();
			//获取被调用的方法名
			String targetMethodName=jionpoint.getSignature().getName();
			//日志格式字符串
			String logInfoText="环绕通知:"+targetMethodName+"方法调用前时间"+beginTime+"毫秒,"+
			"调用后时间"+endTime+"毫秒";
			//将日志信息写入配置的文件中
			logger.info(logInfoText);
		}

	}
	//applicationContext.xml
	<?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:p="http://www.springframework.org/schema/p"
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.1.xsd ">
		
		<!-- 配置创建UserDAOImpl的实例 -->
		<bean id="userDAO" class="com.shw.dao.UserDAOImpl">	 
		</bean>
		<!-- 配置创建UserBizImpl的实例 -->
		<bean id="userBiz" class="com.shw.biz.UserBizImpl">
			<!-- 依赖注入数据访问层组件 -->
			<property name="userDAO" ref="userDAO" />
		</bean>
		<!-- 定义日志通知,将日志切面交给Spring容器管理 -->
		<bean id="allLogAdvice" class="com.shw.aop.AllLogAdvice"></bean>	
		<!-- 进行aop配置 -->
		<aop:config>	
		  <!-- 配置日志切面 -->
		  <aop:aspect id="logaop" ref="allLogAdvice">	 	  
			<!-- 定义切入点,切入点采用正则表达式execution(* com.shw.biz.UserBiz.*(..)),
							   含义是对com.shw.biz.UserBiz中的所有方法,都进行拦截	 -->   
			<aop:pointcut id="logpointcut" expression="execution(* com.shw.biz.UserBiz.*(..))" />
			<!-- 将LogAdvice日志通知中的myBeforeAdvice方法指定为前置通知 -->
			<aop:before method="myBeforeAdvice" pointcut-ref="logpointcut"/>
			<!-- 将LogAdvice日志通知中的myAfterReturnAdvice方法指定为后置通知 -->
			<aop:after-returning method="myAfterReturnAdvice" pointcut-ref="logpointcut"/>
			<!-- 将LogAdvice日志通知中的方法指定为异常通知 -->
			<aop:after-throwing method="myThrowingAdvice" pointcut-ref="logpointcut" throwing="e" />
			<!-- 将LogAdvice日志通知中的方法指定为环绕通知 -->
			<aop:around method="myAroundAdvice" pointcut-ref="logpointcut"/>
		  </aop:aspect>
		</aop:config>
	</beans>
	//UserBiz
	public interface UserBiz {
		public void addUser(String username,String password);
		public void delUser(int id);
	}
	//UserBizImpl
	public class UserBizImpl implements UserBiz {
		UserDAO userDAO;
		public void setUserDAO(UserDAO userDAO) {
			this.userDAO = userDAO;
		}
		@Override
		public void addUser(String username, String password) {
			userDAO.addUser(username, password);
		}
		@Override
		public void delUser(int id) {
			userDAO.delUser(id);
		}
	}
	//UserDAO
	public interface UserDAO {
		public void addUser(String username,String password);
		public void delUser(int id);
	}
	//UserDAOImpl
	public class UserDAOImpl implements UserDAO {
		@Override
		public void addUser(String username, String password) {
			System.out.println(username+"用户添加成功");
		}
		@Override
		public void delUser(int id) {
			System.out.println("编号为"+id+"的用户被删除");
		}
	}
	//SchemaAOPTest
	public class SchemaAOPTest {
	public static void main(String[] args) {
			//加载applicationContext.xml配置
			ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
			//获取配置中的UserBizImpl实例
			UserBiz userBiz =(UserBiz)context.getBean("userBiz");	
			userBiz.addUser("zhangsan", "123");
			userBiz.delUser(1);
		}
	}
//基于@AspectJ注解的AOP实现
	//AspectJ:定义一个切面
	//Pointcut:定义一个切入点
	//Before:定义一个前置通知
	//AfterReturning:定义一个后置通知
	//AfterThrowing:定义一个异常通知
	//Around:定义一个环绕通知
	//
	//日志切面
	@Aspect
	public class AllLogAdviceByAnnotation {
		private Logger logger=Logger.getLogger(AllLogAdviceByAnnotation.class);
		@Pointcut("execution(* com.shw.biz.UserBiz.*(..))")
		//定义切入点名字
		private void allMethod(){}
		//定义前置通知
		@Before("allMethod()")
		public void myBeforeAdvice(JoinPoint jionpoint){
			//获取被调用的类名
			String targetClassName=jionpoint.getTarget().getClass().getName();
			//获取被调用的方法名
			String targetMethodName=jionpoint.getSignature().getName();
			//日志格式字符串		
			String logInfoText="前置通知:"+targetClassName+"类的"+targetMethodName+"方法开始执行";
			//将日志信息写入配置的文件中
			logger.info(logInfoText);
		}
		//定义后置通知
		@AfterReturning("allMethod()")
		public void myAfterReturnAdvice(JoinPoint jionpoint){
			//获取被调用的类名
			String targetClassName=jionpoint.getTarget().getClass().getName();
			//获取被调用的方法名
			String targetMethodName=jionpoint.getSignature().getName();
			//日志格式字符串
			String logInfoText="后置通知:"+targetClassName+"类的"+targetMethodName+"方法开始执行";
			//将日志信息写入配置的文件中
			logger.info(logInfoText);
		}
		//定义异常通知
		@AfterThrowing(pointcut="allMethod()",throwing="e")
		public void myThrowingAdvice(JoinPoint jionpoint,Exception e){
			//获取被调用的类名
			String targetClassName=jionpoint.getTarget().getClass().getName();
			//获取被调用的方法名
			String targetMethodName=jionpoint.getSignature().getName();
			//日志格式字符串
			String logInfoText="异常通知:执行"+targetClassName+"类的"+targetMethodName+"方法时发生异常";
			//将日志信息写入配置的文件中
			logger.info(logInfoText);
		}
		//定义环绕通知
		@Around("allMethod()")
		public void myAroundAdvice(ProceedingJoinPoint jionpoint) throws Throwable{
			long beginTime=System.currentTimeMillis();
			jionpoint.proceed();		
			long endTime=System.currentTimeMillis();
			//获取被调用的方法名
			String targetMethodName=jionpoint.getSignature().getName();
			//日志格式字符串
			String logInfoText="环绕通知:"+targetMethodName+"方法调用前时间"+beginTime+"毫秒,"+
			"调用后时间"+endTime+"毫秒";
			//将日志信息写入配置的文件中
			logger.info(logInfoText);
		}
	}
	//applicationContext.xml
	<?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:context="http://www.springframework.org/schema/context"
		xmlns:aop="http://www.springframework.org/schema/aop"
		xmlns:p="http://www.springframework.org/schema/p"
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 
		
		<!-- 配置创建UserDAOImpl的实例 -->
		<bean id="userDAO" class="com.shw.dao.UserDAOImpl">	 
		</bean>
		
		<!-- 配置创建UserBizImpl的实例 -->
		<bean id="userBiz" class="com.shw.biz.UserBizImpl">
			<!-- 依赖注入数据访问层组件 -->
			<property name="userDAO" ref="userDAO" />	
		</bean>
		
		<!-- 开启基于@AspectJ切面的注解处理器 -->
		<aop:aspectj-autoproxy />
		<!-- 将日志通知AllLogAdviceByAnnotation交给Spring容器管理 -->
		<bean class="com.shw.aop.AllLogAdviceByAnnotation" />
		
	</beans>
	//AnnotationAopTest
	public class AnnotationAopTest {
		public static void main(String[] args) {
			//加载applicationContext.xml配置
			ApplicationContext context=new ClassPathXmlApplicationContext("annotationAop.xml");
			//获取配置中的UserBizImpl实例
			UserBiz userBiz =(UserBiz)context.getBean("userBiz");	
			userBiz.addUser("zhangsan", "123");
			userBiz.delUser(1);
		}
	}
//Spring整合hiberante和struts2
	//目录结构
	src
		action
			UserManagerAction.java
		biz
			UserBiz.java
			UserBizImpl.java
		dao
			UserDAO.java
			UserDAOImpl.java
		entity
			Users.java
			Users.hbm.xml
		test
			TestSpringHibernate.java
		applicationContext.xml	
		struts.xml	
		WebContent
			META-INF
			WEB-INF
				lib
				web.xml
		error.jsp
		login.jsp
		success.jsp
	//UserManagerAction
	public class UserManagerAction extends ActionSupport {
		private String loginName;
		private String loginPwd;
		public String getLoginName() {
			return loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		public String getLoginPwd() {
			return loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
		UserBiz userBiz;	
		public void setUserBiz(UserBiz userBiz) {
			this.userBiz = userBiz;
		}
		public String execute() throws Exception {
			Users condition=new Users();
			condition.setLoginName(loginName);
			condition.setLoginPwd(loginPwd);		
			List list=userBiz.login(condition);
			if(list.size()>0){
				return "success"; 
			}else{
				return "error";   
			}		
		}
	}		
	//UserBiz
	public interface UserBiz {
		public List login(Users condition);
	}		
	//UserBizImpl.java		
	public class UserBizImpl implements UserBiz {
		UserDAO userDAO;	
		public void setUserDAO(UserDAO userDAO) {
			this.userDAO = userDAO;
		}
		@Override
		public List login(Users condition) {	
			return userDAO.search(condition);
		}
	}
	//UserDAO		
	public interface UserDAO {
		public List search(Users condition);
	}
	//UserDAOImpl		
	public class UserDAOImpl implements UserDAO {
		SessionFactory sessionFactory;
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		@Override
		public List search(Users condition) {
			List list=null;
			Session session=sessionFactory.getCurrentSession();
			Transaction tx=session.beginTransaction();
			try{
				Criteria c=session.createCriteria(Users.class);
				Example example=Example.create(condition);
				c.add(example);			
				list= c.list();	  
				tx.commit();      
			}catch(Exception e){
				tx.rollback();    
			}
			return list;
		}
	}
	//Users		
	public class Users implements java.io.Serializable {
		private Integer id;
		private String loginName;
		private String loginPwd;
		public Users() {
		}
		public Users(String loginName, String loginPwd, String name,
				String address, String phone, String mail) {
			this.loginName = loginName;
			this.loginPwd = loginPwd;
		}
		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public String getLoginName() {
			return this.loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		public String getLoginPwd() {
			return this.loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
	}
	//applicationContext.xml		
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-6-12 23:51:39 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.Users" table="USERS">
			<id name="id" type="java.lang.Integer">
				<column name="ID" />
				<generator class="native" />
			</id>
			<property name="loginName" type="java.lang.String">
				<column name="LOGINNAME" />
			</property>
			<property name="loginPwd" type="java.lang.String">
				<column name="LOGINPWD" />
			</property>
		</class>
	</hibernate-mapping>
	//struts.xml		
	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
	<struts>
		<!-- 设置Web应用的默认编码集为gbk -->
		<constant name="struts.i18n.encoding" value="gbk" />
		<package name="default" extends="struts-default">
		 <!-- 定义dolgon的Action,class属性使用Spring配置文件中 定义的相应的Bean实例名称-->
			<action name="doLogin" class="umAction">	
			<!-- 定义处理结果和资源之间的映射关系 -->
			<result name="error">error.jsp</result>
			<result name="success">success.jsp</result>
			</action>
		</package>	
	</struts>  
	//web.xml		
	<?xml version="1.0" encoding="UTF-8"?>
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
	id="WebApp_ID" version="3.0">
	  <!-- 指定以Listerner方式启动Spring -->
	  <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	  </listener>
	  <!-- 指定Spring配置文件的位置 -->
	  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	  </context-param>
	  <filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	  </filter>
	  <filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>*/
	  </filter-mapping>
	</web-app>
	//error.jsp		
	 <body>
    	登录失败!
	</body>
	//login.jsp			
	<body>
		<s:form action="doLogin.action">
			<table>
				<tr>
					<s:textfield name="loginName" label="用户名" />
				</tr>
				<tr>
					<s:textfield name="loginPwd" label="密码" />
				</tr>
				<tr>
					<s:submit value="确认" />
				</tr>
			</table>
		</s:form>
	</body>
	//success.jsp	
	<body>
           登录成功!
	</body>
//基于注解的spring整合struts和Hibernate		
	//目录结构
	src
		action
			UserManagerAction.java
		biz
			UserBiz.java
			UserBizImpl.java
		dao
			UserDAO.java
			UserDAOImpl.java
		entity
			Users.java
		applicationContext.xml	
		struts.xml	
		WebContent
			META-INF
			WEB-INF
				lib
				web.xml
		error.jsp
		login.jsp
		success.jsp		
	//UserManagerAction		
	@Controller @Scope("prototype")
	public class UserManagerAction extends ActionSupport {
		private String loginName;
		private String loginPwd;	
		@Resource
		UserBiz userBiz;	
		public void setUserBiz(UserBiz userBiz) {
			this.userBiz = userBiz;
		}
		@Action(value="/checkLogin",results={@Result(name="success",location="/success.jsp"),
				@Result(name="error",location="/error.jsp")})
		public String checkLogin() throws Exception {
			Users condition=new Users();
			condition.setLoginName(loginName);
			condition.setLoginPwd(loginPwd);		
			List list=userBiz.login(condition);
			if(list.size()>0){
				return "success"; 
			}else{
				return "error"; 
			}
		}
		public String getLoginName() {
			return loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		public String getLoginPwd() {
			return loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
	}
	//UserBiz.java		
	public interface UserBiz {
		public List login(Users condition);
	}
	//UserBizImpl.java		
	@Service("userBiz")
	public class UserBizImpl implements UserBiz {
		@Resource
		UserDAO userDAO;	
		public void setUserDAO(UserDAO userDAO) {
			this.userDAO = userDAO;
		}
		@Override
		public List login(Users condition) {
			return userDAO.search(condition);
		}
	}
	//UserDAO		
	public interface UserDAO {
		public List search(Users condition);
	}
	//UserDAOImpl		
	@Repository("userDAO")
	public class UserDAOImpl implements UserDAO {
		@Resource
		SessionFactory sessionFactory;
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		@Override	
		public List search(Users condition) {
			List list=null;
			Transaction tx=null;
			Session session=sessionFactory.getCurrentSession();
			try{
				tx=session.beginTransaction();
				Criteria c=session.createCriteria(Users.class);
				Example example=Example.create(condition);
				c.add(example);	
				list= c.list();
				tx.commit();
			}catch(Exception e)	{
				tx.rollback();
			}
			return list;
		}
	}
	//Users.java		
	@Entity
	@Table(name = "users", catalog = "java")
	public class Users implements java.io.Serializable {
		private Integer id;
		private String loginName;
		private String loginPwd;
		public Users() {
		}
		public Users(String loginName, String loginPwd, String name,
				String address, String phone, String mail) {
			this.loginName = loginName;
			this.loginPwd = loginPwd;
		}
		@Id
		@GeneratedValue
		@Column(name = "Id", unique = true, nullable = false)
		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		@Column(name = "LoginName", length = 50)
		public String getLoginName() {
			return this.loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		@Column(name = "LoginPwd", length = 16)
		public String getLoginPwd() {
			return this.loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
	}
	//applicationContext.xml		
	<?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:context="http://www.springframework.org/schema/context"
		xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx.xsd 
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.1.xsd">
		<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
			<!-- 指定连接数据库的JDBC驱动 -->
			<property name="driverClassName" value="com.mysql.jdbc.Driver">
			</property>
			<property name="url" value="jdbc:mysql:///java">
			</property>
			<property name="username" value="root"></property>
			<property name="password" value="123456"></property>
		</bean>
		<bean id="sessionFactory"
			class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
			<property name="dataSource">
				<ref bean="dataSource" />
			</property>
			<property name="hibernateProperties">
				<props>
					<prop key="hibernate.dialect">
						org.hibernate.dialect.MySQLDialect
					</prop>
					<prop key="hbm2ddl.auto">update</prop>
					<prop key="hibernate.current_session_context_class">
						thread
					</prop>
				</props>
			</property>
			<property name="annotatedClasses">
				<list>
					<value>entity.Users</value>
				</list>
			</property>
		</bean>
		<bean id="transactionManager"
			class="org.springframework.orm.hibernate4.HibernateTransactionManager">
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		<!-- 开启注解处理器 -->
		<context:annotation-config />
		<!-- 开启Spring的Bean自动扫描机制来检查与管理Bean实例 -->
		<context:component-scan base-package="*" />
		<tx:annotation-driven transaction-manager="transactionManager" />
	</beans>
	//struts.xml		
	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
	<struts>
		<constant name="struts.i18n.encoding" value="gbk"></constant>
	</struts>   
	//web.xml		
	<?xml version="1.0" encoding="UTF-8"?>
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
	id="WebApp_ID" version="3.0">
	  <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	  </listener>
	  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	  </context-param>
	  <filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	  </filter>
	  <filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>*/
	  </filter-mapping>
	</web-app>
	//error.jsp		
	<body>
		登录失败!
	</body>
	//login.jsp		
	<body>
	   <s:form action="checkLogin.action">
		 <table>
		   <tr>	       
			  <s:textfield name="loginName" label="用户名"  /> 
		   </tr>
		   <tr>
			 <s:textfield name="loginPwd" label="密码"  /> 
		   </tr>
		   <tr>
			 <s:submit value="确认"  /> 
		   </tr>	     
		 </table>
	   </s:form>    
	  </body>
	//success.jsp		
	<body>
			   登录成功!
	  </body>
//Spring3声明式事务管理
	//QEQUIRED:当前方法必须运行在一个事务中,如果一个现有的事务正在运行中,该方法运行在这个事务中,否则,开始一个新的事务
	//REQUIRESNEW:表示当前方法必须运行在自己的事务里
	//SUPPORTS:表示当前方法不需要事务处理环境,但是如果有一个事务正在运行的话,则这个方法也可以运行在这个事务中
	//MANDATORY:表示当前方法必须运行在一个事务上下文中,否则就抛出异常
	//NEVER:表示当前方法不应该运行在一个事务上下文中,否则就抛出异常
	//目录结构
	src
		action
			AccountManager.java
			UserManagerAction.java
		biz
			AccountBiz.java
			AccountBizImpl.java
			UserBiz.java
			UserBizImpl.java
		dao
			AccountDAO.java
			AccountDAOImpl.java
			UserDAO.java
			UserDAOImpl.java
		entity
			Account.java
			Users.java
			Account.hbm.xml
			Users.hbm.xml
		test
			TestSpringHibernate.java
		applicationContext.xml
		struts.xml
	WebContent
		WEB-INF
			web.xml
		error.jsp
		error1.jsp
		index.jsp
		login.jsp
		success.jsp	
		success1.jsp	
		transfer.jsp	
	//AccountManager.java
	public class AccountManager extends ActionSupport {
		//使用AccountBiz接口声明对象,并添加set方法用于依赖注入
		AccountBiz accountBiz;	
		public void setAccountBiz(AccountBiz accountBiz) {
			this.accountBiz = accountBiz;
		}
		//定义属性,用于封装表单数据
		private String ac1;
		private String ac2;
		private String amount;
		@Override
		public String execute() throws Exception {
			Account a1=null;
			Account a2=null;
			//获取账号ac1的账户对象,并更新对象中的账户余额属性		
			List list1=accountBiz.getAccountByAccountNo(ac1);
			if(list1.size()>0){
				a1=(Account) list1.get(0);
				a1.setBalance(new Long(a1.getBalance().longValue()-Long.parseLong(amount)) );	
			}			
			//获取账号ac2的账户对象,并更新对象中的账户余额属性		
			List list2=accountBiz.getAccountByAccountNo(ac2);
			if(list2.size()>0){
				a2=(Account) list2.get(0);
				a2.setBalance(new Long(a2.getBalance().longValue()+Long.parseLong(amount)) );
			}
			try {
				//执行转账操作
				accountBiz.transfer(a1, a2);
			} catch (Exception e) {
				// 转账失败
				return "error";
			}		
			//转账成功
			return "success";
		}
		public String getAc1() {
			return ac1;
		}
		public void setAc1(String ac1) {
			this.ac1 = ac1;
		}

		public String getAc2() {
			return ac2;
		}
		public void setAc2(String ac2) {
			this.ac2 = ac2;
		}
		public String getAmount() {
			return amount;
		}
		public void setAmount(String amount) {
			this.amount = amount;
		}	
	}
	//UserManagerAction.java
	public class UserManagerAction extends ActionSupport {
		//定义用于保存用户登录表单参数的两个属性
		private String loginName;
		private String loginPwd;
		public String getLoginName() {
			return loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		public String getLoginPwd() {
			return loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
		//使用UserBiz声明一个属性,并添加set方法用于依赖注入
		UserBiz userBiz;	
		public void setUserBiz(UserBiz userBiz) {
			this.userBiz = userBiz;
		}
		//重载execute方法用来处理登录请求
		public String execute() throws Exception {
			// TODO Auto-generated method stub
			Users condition=new Users();
			condition.setLoginName(loginName);
			condition.setLoginPwd(loginPwd);		
			List list=userBiz.login(condition);
			if(list.size()>0){
				//登录成功,转到success.jsp页面
				return "success"; 
			}else{
				//登录失败,转到error.jsp页面
				return "error";   
			}		
		}

	}
	//AccountBiz.java
	public interface AccountBiz {
		//根据账号获取账户对象
		public List getAccountByAccountNo(String accountNo);
		//转账
		public void transfer(Account a1,Account a2);
	}
	//AccountBizImpl.java
	//使用@Transactional注解实现事务管理
	@Transactional
	public class AccountBizImpl implements AccountBiz {
		//用AccountDAO接口声明对象,并添加set方法用于依赖注入
		AccountDAO accountDAO;
		public void setAccountDAO(AccountDAO accountDAO) {
			this.accountDAO = accountDAO;
		}
		@Override
		public List getAccountByAccountNo(String accountNo) {
			return accountDAO.getAccountByAccountNo(accountNo);
		}
		@Override
		public void transfer(Account a1, Account a2) {
			accountDAO.transfer(a1, a2);
		}
	}
	//UserBiz.java
	public interface UserBiz {
		public List login(Users condition);
	}
	//UserBizImpl.java
	//使用@Transactional注解实现事务管理
	@Transactional
	public class UserBizImpl implements UserBiz {
		//使用UserDAO接口声明对象,并添加set方法用于依赖注入
		UserDAO userDAO;	
		public void setUserDAO(UserDAO userDAO) {
			this.userDAO = userDAO;
		}
		@Override
		public List login(Users condition) {	
			return userDAO.search(condition);
		}
	}
	//AccountDAO.java
	public interface AccountDAO {
		//根据账号获取账户对象
		public List getAccountByAccountNo(String accountNo);
		//转账
		public void transfer(Account a1,Account a2);
	}
	//AccountDAOImpl.java
	public class AccountDAOImpl implements AccountDAO {
		//声明属性sessionFactory,用于接受LocalSessionFactoryBean类实例sessionFactory注入
		SessionFactory sessionFactory;
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		@Override
		public List getAccountByAccountNo(String accountNo) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Account.class);
			c.add(Restrictions.eq("accountNo", accountNo));
			return c.list();		
		}
		@Override
		public void transfer(Account a1, Account a2) {
			Session session=sessionFactory.getCurrentSession();
			session.update(a1);
			session.update(a2);
		}
	}
	//UserDAO.java
	public interface UserDAO {
		public List search(Users condition);
	}
	//UserDAOImpl.java
	public class UserDAOImpl implements UserDAO {
		//声明属性sessionFactory,用于接受LocalSessionFactoryBean类实例sessionFactory注入
		SessionFactory sessionFactory;
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		@Override
		public List search(Users condition) {
			List list=null;
			//通过sessionFactory获得Session
			Session session=sessionFactory.getCurrentSession();		
			//创建Criteria对象
			Criteria c=session.createCriteria(Users.class);
			//使用Example工具类创建示例对象
			Example example=Example.create(condition);
			//为Criteria对象指定示例对象example作为查询条件		
			c.add(example);			
			list= c.list();	  //执行查询,获得结果
			return list;
		}
	}
	//Account.java
	public class Account implements java.io.Serializable {
		private Integer id;
		private String accountNo;
		private Long balance;
		public Account() {
		}
		public Account(String accountNo, Long balance) {
			this.accountNo = accountNo;
			this.balance = balance;
		}
		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public String getAccountNo() {
			return this.accountNo;
		}
		public void setAccountNo(String accountNo) {
			this.accountNo = accountNo;
		}
		public Long getBalance() {
			return this.balance;
		}
		public void setBalance(Long balance) {
			this.balance = balance;
		}
	}
	//Users.java
	public class Users implements java.io.Serializable {
		private Integer id;
		private String loginName;
		private String loginPwd;
		public Users() {
		}
		public Users(String loginName, String loginPwd, String name,
				String address, String phone, String mail) {
			this.loginName = loginName;
			this.loginPwd = loginPwd;
		}
		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public String getLoginName() {
			return this.loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		public String getLoginPwd() {
			return this.loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
	}
	//Account.hbm.xml
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-6-13 14:50:55 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.Account" table="ACCOUNT">
			<id name="id" type="java.lang.Integer">
				<column name="ID" />
				<generator class="native" />
			</id>
			<property name="accountNo" type="java.lang.String">
				<column name="ACCOUNTNO" />
			</property>
			<property name="balance" type="java.lang.Long">
				<column name="BALANCE" />
			</property>
		</class>
	</hibernate-mapping>
	//Users.hbm.xml
	<?xml version="1.0"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
	<!-- Generated 2016-6-13 14:50:55 by Hibernate Tools 3.4.0.CR1 -->
	<hibernate-mapping>
		<class name="entity.Users" table="USERS">
			<id name="id" type="java.lang.Integer">
				<column name="ID" />
				<generator class="native" />
			</id>
			<property name="loginName" type="java.lang.String">
				<column name="LOGINNAME" />
			</property>
			<property name="loginPwd" type="java.lang.String">
				<column name="LOGINPWD" />
			</property>
		</class>
	</hibernate-mapping>
	//TestSpringHibernate.java
	public class TestSpringHibernate {
		public static void main(String[] args) {
			ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
			//获取配置中的实例
			UserBiz userBiz =(UserBiz)context.getBean("userBiz");
			Users conditon=new Users();
			conditon.setLoginName("admin");
			conditon.setLoginPwd("123456");
			List list=userBiz.login(conditon);
			if(list.size()>0){
				System.out.println("登陆成功");
			}else{
				System.out.println("登陆失败");
			}	
		}
	}
	//applicationContext.xml
	<?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:context="http://www.springframework.org/schema/context"
		xmlns:aop="http://www.springframework.org/schema/aop" 
		xmlns:p="http://www.springframework.org/schema/p"
		xmlns:tx="http://www.springframework.org/schema/tx" 
		xsi:schemaLocation="http://www.springframework.org/schema/beans 	
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.1.xsd  
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.1.xsd">

		<!-- 定义BasicDataSource数据源 -->
		<bean id="dataSource"
			class="com.mchange.v2.c3p0.ComboPooledDataSource">
			<!-- 指定连接数据库的JDBC驱动 -->
			<property name="driverClass"
				value="com.mysql.jdbc.Driver">
			</property>
			<!-- 指定数据库所用的url-->
			<property name="jdbcUrl"
				value="jdbc:mysql:java">
			</property>
			<!-- 指定连接数据库的用户名 -->
			<property name="user" value="root"></property>
			<!-- 指定连接数据库的密码 -->
			<property name="password" value="root"></property>
		</bean>
		<!-- 定义Hibernate的SessionFactory -->
		<bean id="sessionFactory"
			class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
			<!-- 将上面定义的数据源dataSource注入到LocalSessionFactoryBean类的sessionFactory属性  -->
			<property name="dataSource">
				<ref bean="dataSource" />
			</property>
			<!-- 设置Hibernate的相关属性 -->
			<property name="hibernateProperties">
				<props>
					<!-- 设置Hibernate的数据库方言 -->
					<prop key="hibernate.dialect">
						org.hibernate.dialect.MySQLInnoDBDialect
					</prop>
					<!-- 自动建表-->
					<prop key="hbm2ddl.auto">
						update
					</prop>
					<!-- 输出sQL -->
					<prop key="show_sql">
						true
					</prop>
				</props>
			</property>
			<property name="mappingResources">
				<list>
					<value>entity/Users.hbm.xml</value>
					<value>entity/Account.hbm.xml</value>
				</list>
			</property>
		</bean>
		<!-- 声明Hibernate事务管理器 -->
		<bean id="transactionManager"
			class="org.springframework.orm.hibernate4.HibernateTransactionManager">
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		<!-- 定义事务通知  -->
		<tx:advice id="txAdvice" transaction-manager="transactionManager">	 
		  <!-- 指定事务传播规则 -->
			<tx:attributes>           
			<!-- 对所有方法应用REQUIRED事务规则 -->
				<tx:method name="*" propagation="REQUIRED" ></tx:method>
			</tx:attributes>
		</tx:advice>
		<!-- 定义切面,并将事务通知和切面组合(定义哪些方法应用事务规则)-->
		<aop:config>   
			<!-- 对biz包下的所有类的所有方法都应用事务规则 -->
			<aop:pointcut id="bizMethods" expression="execution(* com.ssh2.biz.*.*(..))" />     
			<!-- 将事务通知和切面组合 -->
			<aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" />
		</aop:config>
		<!-- 开启注解处理器 -->
		<context:annotation-config />
		<!-- 基于@Transactional注解方式的事务管理 -->
		<tx:annotation-driven transaction-manager="transactionManager" />
		<!-- 定义UserDAOImpl类实例,并将已经创建LocalSessionFactoryBean的实例
		sessionFactory依赖注入给UserDAOImpl类中的sessionFactory属性 -->
		<bean id="userDAO" class="dao.UserDAOImpl">	
		  <property name="sessionFactory" ref="sessionFactory"/>
		</bean>
		<!-- 定义UserBizImpl类实例,并给UserBizImpl类中的userDAO注入值 -->
		<bean id="userBiz" class="biz.UserBizImpl">
			<property name="userDAO" ref="userDAO" />
		</bean>
		<!-- 部署Struts 2的负责用户管理的控制器UserManagerAction -->
		<bean id="umAction" class="action.UserManagerAction" scope="prototype">
		  <property name="userBiz" ref="userBiz" />
		</bean>
		<!-- 定义AccountDAOImpl类实例,并将已经创建LocalSessionFactoryBean的实例	 -->
		<bean id="accountDAO" class="dao.AccountDAOImpl">	
			<property name="sessionFactory" ref="sessionFactory"/>
		</bean>
		<!-- 定义AccountBizImpl类实例,并给AccountBizImpl类中的accountDAO属性注入值 -->
		<bean id="accountBiz" class="biz.AccountBizImpl">	
			<property name="accountDAO" ref="accountDAO" />
		</bean>
		<!-- 部署Struts 2的负责账户管理的控制器AccountManager,并给AccountManager类中的accountBiz属性注入值 -->
		<bean id="amAction" class="action.AccountManager" scope="">
			<property name="accountBiz" ref="accountBiz" />
		</bean>
	</beans>	
	//struts.xml
	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
	<struts>
		<!-- 设置Web应用的默认编码集为gbk -->
		<constant name="struts.i18n.encoding" value="gbk" />
		<package name="default" extends="struts-default">
			<!-- 定义dolgon的Action,class属性使用Spring配置文件中 定义的相应的Bean实例名称-->
			<action name="doLogin" class="umAction">	
				<!-- 定义处理结果和资源之间的映射关系 -->
				<result name="error">error.jsp</result>
				<result name="success">success.jsp</result>
			</action>		
			<!-- 定义doTransfer的Action,class属性使用Spring配置文件中定义的AccountManager类的Bean实例名称 -->
			<action name="doTransfer" class="amAction">	
				<!-- 定义处理结果和资源之间的映射关系 -->
				<result name="error">error1.jsp</result>
				<result name="success">success1.jsp</result>
			</action>
		</package>	
	</struts>    
	//web.xml
	<?xml version="1.0" encoding="UTF-8"?>
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
	  <!-- 指定以Listerner方式启动Spring -->
	  <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	  </listener>
	  <!-- 指定Spring配置文件的位置 -->
	  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	  </context-param>
	  <filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	  </filter>
	  <filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>*/
	  </filter-mapping>
	</web-app>
	//error.jsp
	<body>
			登录失败!
	  </body>
	//error1.jsp
	 <body>
		转账失败!
	  </body>
	//login.jsp
	<body>
		<s:form action="doLogin.action">
			<table>
				<tr>
					<s:textfield name="loginName" label="用户名" />
				</tr>
				<tr>
					<s:textfield name="loginPwd" label="密码" />
				</tr>
				<tr>
					<s:submit value="确认" />
				</tr>
			</table>
		</s:form>
	</body>
	//success.jsp	
	<body>
			   登录成功!
	  </body>
	//success1.jsp	
	 <body>
			转账成功!
	  </body>
	//transfer.jsp			
	<body>
		<s:form action="doTransfer.action">
			<table align="center">
				<tr>
					<s:textfield name="ac1" label="账户1" />
				</tr>
				<tr>
					<s:textfield name="ac2" label="账户2" />
				</tr>
				<tr>
					<s:textfield name="amount" label="转账金额" />
				</tr>
				<tr>
					<s:submit value="转账" />
				</tr>
			</table>
		</s:form>
	</body>
//Spring Web
	//目录结构
	src
		entity
			Users.java
		web
			LoginController.java
			RegController.java
			UserController.java
		applicationContext.xml
		views.properties	
	WebContent
		META-INF
		WEB-INF	
		lib	
			spring-servlet.xml	
			web.xml	
		login.jsp	
		register.jsp	
		show.jsp	
		success.jsp	
	//Users.java
	public class Users implements java.io.Serializable {
		private String userName;
		private String userPwd;
		private String regTime;	
		private String hobby;	
		public Users() {
			
		}
		public String getUserName() {
			return userName;
		}
		public void setUserName(String userName) {
			this.userName = userName;
		}
		public String getUserPwd() {
			return userPwd;
		}
		public void setUserPwd(String userPwd) {
			this.userPwd = userPwd;
		}
		public String getRegTime() {
			return regTime;
		}
		public void setRegTime(String regTime) {
			this.regTime = regTime;
		}
		public String getHobby() {
			return hobby;
		}
		public void setHobby(String hobby) {
			this.hobby = hobby;
		}	
	}
	//LoginController.java
	public class LoginController extends AbstractCommandController {
		@Override
		protected ModelAndView handle(HttpServletRequest request,
				HttpServletResponse response, Object command, BindException exception)
				throws Exception {
			//获取用户对象
			Users user=(Users)command; 
			//创建一个指定视图逻辑名的ModelAndView实例
			ModelAndView mav=new ModelAndView("success");	
			//给mav实例指定数据模型
			mav.addObject("user", user);
			//返回mav实例
			return mav;
		}
	}
	//RegController.java
	public class RegController extends SimpleFormController {
	@Override
	protected ModelAndView onSubmit(HttpServletRequest request,
			HttpServletResponse response, Object command, BindException errors)
			throws Exception {
		//获取用户对象
		Users user=(Users)command;		
		//创建一个指定视图逻辑名的ModelAndView实例
		ModelAndView mav=new ModelAndView("show");	
		//给mav实例指定数据模型
		mav.addObject("user", user);
		//返回mav实例
		return mav;
	}
	
	//进行数据格式转换
	@Override
	protected void initBinder(HttpServletRequest request,
				ServletRequestDataBinder binder) throws Exception {
			binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
		}
		//为注册表单中"爱好下拉列表"提供数据列表
		@Override
		protected Map referenceData(HttpServletRequest request) throws Exception {
			Map<String, Object> model=new HashMap<String, Object>();
			model.put("hobbyList", new String[]{"Swimming","Running"});
			return model;
		}
	}
	//UserController.java
	public class UserController extends MultiActionController {
	//处理登录请求
	public ModelAndView login(HttpServletRequest request,
			HttpServletResponse response, Users user)
			throws Exception {		
		//创建一个指定视图逻辑名的ModelAndView实例
		ModelAndView mav=new ModelAndView("success");	
		//给mav实例指定数据模型
		mav.addObject("user", user);
		//返回mav实例
		return mav;
	}
	//处理显示注册页面请求
	public ModelAndView toReg(HttpServletRequest request,
			HttpServletResponse response)
			throws Exception {
		Map<String, Object> model=new HashMap<String, Object>();
		model.put("hobbyList", new String[]{"Swimming","Running"});
		ModelAndView mav=new ModelAndView("register",model);		
		return mav;
	}	
	//处理注册请求
	public ModelAndView doReg(HttpServletRequest request,
				HttpServletResponse response, Users user)
				throws Exception {
			//创建一个指定视图逻辑名的ModelAndView实例
			ModelAndView mav=new ModelAndView("show");	
			//给mav实例指定数据模型
			mav.addObject("user", user);		
			return mav;		
		}
		//进行数据格式转换
		@Override
		protected void initBinder(HttpServletRequest request,
				ServletRequestDataBinder binder) throws Exception {
			binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
		}
	}
	//applicationContext.xml
	<?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:p="http://www.springframework.org/schema/p"
		xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
	</beans>
	//views.properties	
	success.(class)=org.springframework.web.servlet.view.JstlView 
	success.url=success.jsp
	//spring-servlet.xml	
	<?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:p="http://www.springframework.org/schema/p"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx.xsd" >
	   <!-- 定义控制器LoginController -->
	   <bean id="loginController" class="web.LoginController">
			<!--设置请求数据的封装类型,执行到该控制器时就会自动将数据封装成Users -->
			<property name="commandClass" value="entity.Users" />
		</bean>
		<!-- 定义控制器RegController -->
		<bean id="regController" class="web.RegController">
			<!--设置请求数据的封装类型,执行到该控制器时就会自动将数据封装成Users -->
			<property name="commandClass" value="entity.Users" />
			<!-- 指定表单录入页面 -->
			<property name="formView" value="register" />
			<!-- 指定注册成功页面 -->
			<property name="successView" value="show" />
		</bean>  
		<!-- 定义控制器UserController -->
		<bean id="userController" class="web.UserController">
			<property name="methodNameResolver" ref="methodNameResolver" />
		</bean>
		<!--配置UserController使用的方法对应策略ParameterMethodNameResolver,用于
						 解析请求中的特定参数的值,将该值作为方法名调用  -->
		<bean id="methodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
			<property name="paramName" value="method" />
		</bean>
		<!-- 配置处理器映射采用SimpleUrlHandlerMapping -->      
		<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" >
			  <!-- props底下的prop标签内填写的key都是符合转发条件的url值,之后跟的是bean的ID,  
									  如果输入的url值与key值中的url匹配,则执行对应beanID绑定的Controller -->        
			<property name="mappings">
				<props>
					<prop key="login.do">loginController</prop>
					<prop key="reg.do">regController</prop>
					<prop key="user.do">userController</prop>
				</props>
			</property>
		</bean>
		<!-- 配置视图解析器,使用InternalResourceViewResolver类作为视图解析器
			 Controller回传ModelAndView,DispatcherServlet将其交给ViewResolver解析 -->
		<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
			<!-- 属性prefix和suffix分别指定视图文件所在的路径和后缀 -->
			<property name="prefix" value="/" />
			<property name="suffix" value=".jsp" />
		</bean> 
		<!-- 
		<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
		<bean name="/lc.do" class="web.LoginController">
			<property name="commandClass" value="entity.Users" />
		</bean>   
		 -->
	   <!-- 
		<bean id="myViewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">  
			<property name="basename" value="views"/>  
		</bean>
		 -->
	</beans>
	//web.xml	
	<?xml version="1.0" encoding="UTF-8"?>
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
	  <welcome-file-list>
		<welcome-file>login.jsp</welcome-file>
	  </welcome-file-list>
	  <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	  </listener>
	  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	  </context-param>
	  <servlet>
		<servlet-name>spring</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	  </servlet>
	  <servlet-mapping>
		<servlet-name>spring</servlet-name>
		<url-pattern>*.do</url-pattern>
	  </servlet-mapping>  
	</web-app>
	//login.jsp	
	<body>
		<form action="user.do?method=login" method="post">
			用户名:<input type="text" name="userName" /> 密码:<input type="text"
				name="userPwd" /> <input type="submit" value="登录">
		</form>
	</body>
	//register.jsp	
	<body>
		<form action="user.do?method=doReg" method="post">
			<table>
				<tr>
					<td>用户名:</td>
					<td><input type="text" name="userName" />
					</td>
				</tr>
				<tr>
					<td>密码:</td>
					<td><input type="text" name="userPwd" />
					</td>
				</tr>
				<tr>
					<td>注册时间:</td>
					<td><input type="text" name="regTime" />
					</td>
				</tr>
				<tr>
					<td>爱好:</td>
					<td><select name="hobby">
							<c:forEach items="${hobbyList }" var="hobby">
								<option value=${hobby}>${hobby }</option>
							</c:forEach>
					</select></td>
				</tr>
				<tr>
					<td></td>
					<td><input type="submit" value="注册"></td>
				</tr>
			</table>
		</form>
	</body>
	//show.jsp	
	<body>
		您的注册信息如下: 用户名:${user.userName }
		<br> 密码:${user.userName }
		<br> 注册时间为: ${user.regTime }
		<br> 个人爱好:${user.hobby }
		<br>
	</body>
	//success.jsp			
	<body>
		欢迎您: ${user.userName }
	</body>
//基于注解的Spring MVC
	//目录结构
	src
		entity
			Users.java
		web
			FileUpload.java
			UserController.java
		applicationContext.xml
		mess_en_US.properties	
		mess_zh_CN.properties	
	WebContent		
		META-INF	
		WEB-INF	
			lib
			annomvc-servlet.xml
			web.xml
		login.jsp	
		register.jsp	
		result.jsp	
		show.jsp	
		success.jsp	
	//Users.java
	public class Users {
		private String userName;
		private String userPwd;
		private String regTime;	
		private String hobby;	
		public Users() {
			
		}
		public String getUserName() {
			return userName;
		}
		public void setUserName(String userName) {
			this.userName = userName;
		}
		public String getUserPwd() {
			return userPwd;
		}
		public void setUserPwd(String userPwd) {
			this.userPwd = userPwd;
		}
		public String getRegTime() {
			return regTime;
		}
		public void setRegTime(String regTime) {
			this.regTime = regTime;
		}
		public String getHobby() {
			return hobby;
		}
		public void setHobby(String hobby) {
			this.hobby = hobby;
		}
	}
	//FileUpload.java
	@Controller
	public class FileUpload {
		 @RequestMapping(value = "/upload")  	 
		 public String upload(@RequestParam(value="file", required=false) MultipartFile file, HttpServletRequest request, ModelMap model) {  
			 //服务器端upload文件夹物理路径
			 String path = request.getSession().getServletContext().getRealPath("upload"); 
			 //获取文件名
			 String fileName = file.getOriginalFilename();  
			 //实例化一个File对象,表示目标文件(含物理路径)
			 File targetFile = new File(path, fileName);  
			 if(!targetFile.exists()){  
				 targetFile.mkdirs();  
			 }
			 try {  
				 //将上传文件写到服务器上指定的文件
				 file.transferTo(targetFile);  
			 } catch (Exception e) {  
				 e.printStackTrace();  
			 }  
			 model.put("fileUrl", request.getContextPath()+"/upload/"+fileName);  
			 return "result";  
		 }  
	}
	//UserController.java
	@Controller
	@RequestMapping("/user")
	//将ModelMap中名为user的属性放到Session中,以便这个属性可以跨请求访问
	@SessionAttributes("user")
	public class UserController {
		//处理登录请求
		@RequestMapping(value="/login")
		public String login(Users user,ModelMap model){
			//将user对象以user为键放入到model中
			model.put("user", user);
			return "success";
		}
		//@RequestMapping(value="/toReg")
		//@RequestMapping(value="/reg",method=RequestMethod.GET)
		@RequestMapping(params="method=toReg")
		//获取"爱好"下拉列表数据,显示注册页面
		public String toReg(ModelMap model){
			model.put("hobbyList", new String[]{"Swimming","Running"});
			return "register";
		}
		//日期格式转换
		@InitBinder
		public void initBinder(WebDataBinder binder){
			binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
		}
		//处理注册请求
		//@RequestMapping(value="/doReg")	
		//@RequestMapping(value="/reg",method=RequestMethod.POST)	
		@RequestMapping(params="method=doReg")
		public String doReg(Users user, ModelMap model){	
			//将user对象以user为键放入到model中
			model.put("user", user);
			return "redirect:/show.jsp";
		}
	}
	//applicationContext.xml
	<?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:p="http://www.springframework.org/schema/p"
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
		<!-- 资源文件绑定器 -->         
		<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> 
			<property name="basename" value="mess" /> 
		</bean>
	</beans>
	//mess_en_US.properties	
	username=UserName
	password=Password
	//mess_zh_CN.properties
	username=\u7528\u6237\u540D
	password=\u5BC6\u7801
	//annomvc-servlet.xml
	<?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:p="http://www.springframework.org/schema/p"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xmlns:mvc="http://www.springframework.org/schema/mvc"
		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.1.xsd
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx.xsd
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.1.xsd
		http://www.springframework.org/schema/mvc
		http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd" >   
		<!-- 用来扫描该包内被@Repository、@Service和@Controller的注解类,然后注册到工厂中 -->
		<context:component-scan base-package="com.annotationspringmvc.web" />
		<!-- 配置视图解析器 -->
		<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
			<property name="prefix" value="/" />
			<property name="suffix" value=".jsp" />
		</bean>
		<!-- 支持上传文件 -->  
		<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
			<!-- 设置上传文件的最大尺寸为1MB -->  
			<property name="maxUploadSize">  
				<value>1048576</value>  
			</property> 
		</bean>
	</beans>
	//web.xml
	<?xml version="1.0" encoding="UTF-8"?>
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
	  <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	  </listener>
	  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	  </context-param>
	  <servlet>
		<servlet-name>annomvc</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	  </servlet>
	  <servlet-mapping>
		<servlet-name>annomvc</servlet-name>
		<url-pattern>*.do</url-pattern>
	  </servlet-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>gbk</param-value>   
		</init-param>   
	  </filter>   
	  <filter-mapping>   
		<filter-name>encodingFilter</filter-name>   
		<url-pattern>/*</url-pattern>  */ 
	  </filter-mapping>  
	</web-app>
	//login.jsp	
	<body>
		<form action="user/login.do" method="post">
			用户名 <input type="text" name="userName" /> 密码 <input type="text"
				name="userPwd" /> <input type="submit" value="登录">
		</form>
	</body>
	//register.jsp	
	<body>
		<form action="user.do?method=doReg" method="post">
			<table>
				<tr>
					<td>用户名:</td>
					<td><input type="text" name="userName" />
					</td>
				</tr>
				<tr>
					<td>密码:</td>
					<td><input type="text" name="userPwd" />
					</td>
				</tr>
				<tr>
					<td>注册时间:</td>
					<td><input type="text" name="regTime" />
					</td>
				</tr>
				<tr>
					<td>爱好:</td>
					<td><select name="hobby">
							<c:forEach items="${hobbyList }" var="hobby">
								<option value=${hobby}>${hobby }</option>
							</c:forEach>
					</select></td>
				</tr>
				<tr>
					<td></td>
					<td><input type="submit" value="注册"></td>
				</tr>
			</table>
		</form>
	</body>
	//result.jsp	
	<body>
		文件名:${fileUrl }
	</body>
	//show.jsp	
	<body>
		您的注册信息如下: 用户名:${user.userName }
		<br> 密码:${user.userName }
		<br> 注册时间为: ${user.regTime }
		<br> 个人爱好:${user.hobby }
		<br>
	</body>
	//success.jsp		
	<body>
		欢迎您: ${user.userName }
	</body>		
//新闻发布系统
	//目录结构
	src
		com.news
			action
				AdminAction.java
				NewsinfoAction.java
				TopicAction.java
			biz
				impl
					AdminBizImpl.java
					NewsinfoBizImpl.java
					TopicBizImpl.java
				AdminBiz.java
				NewsinfoBiz.java
				TopicBiz.java
			dao
				impl
					AdminDAOImpl.java
					NewsinfoDAOImpl.java
					TopicDAOImpl.java
				AdminDAO.java
				NewsinfoDAO.java
				TopicDAO.java
			entity
				Admin.java
				Newsinfo.java
				Pager.java
				Topic.java
				Admin.hbm.xml
				Newsinfo.hbm.xml
				Topic.hbm.xml
			applicationContext.xml
			struts.xml
		WebContent	
			CSS
				admin.css
				main.css
				read.css
			index-elements
				index_sidebar.jsp
				index_top.jsp
			newspages
				console_element
					left.html
					top.jsp
				admin.jsp
				news_add.jsp
				news_modify.jsp
				topic_add.jsp
				topic_list.jsp
				topic_modify.jsp
			WEB-INF
				web.xml
			index.jsp
			news_read.jsp
			sql
	//AdminAction.java
	public class AdminAction extends ActionSupport implements SessionAware {
		//定义用于保存用户登录表单参数的两个属性
		private String loginName;
		private String loginPwd;
		public String getLoginName() {
			return loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		public String getLoginPwd() {
			return loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
		//使用AdminBiz声明一个属性,并添加set方法用于依赖注入
		AdminBiz adminBiz;	
		
		public void setAdminBiz(AdminBiz adminBiz) {
			this.adminBiz = adminBiz;
		}
		//处理登录请求
		public String validateLogin() throws Exception {			
			Admin condition=new Admin();
			condition.setLoginName(loginName);
			condition.setLoginPwd(loginPwd);		
			List list=adminBiz.login(condition);
			if(list.size()>0){
				//将Admin对象存入Session
				session.put("admin", list.get(0));			
			}
			return "index"; 
		}
		//注销
		public String loginout() throws Exception {
			if(session.get("admin")!=null){
				session.remove("admin");    		
			}
			return "index";

		}
		Map<String, Object> session;
		@Override
		public void setSession(Map<String, Object> session) {
			this.session=session;			
		}
	}
	//NewsinfoAction.java
	public class NewsinfoAction extends ActionSupport implements RequestAware,SessionAware {
		/*Integer tid;	  //封装表单传递的主题编号
		public int getTid() {
			return tid;
		}
		public void setTid(int tid) {
			this.tid = tid;
		}*/
		int id;   //封装表单传递的新闻编号
		public int getId() {
			return id;
		}
		public void setId(int id) {
			this.id = id;
		}
		/*public String title;  //封装分页超链接传递来的新闻标题参数
		public String getTitle() {
			return title;
		}
		public void setTitle(String title) {
			this.title = title;
		}*/
		Newsinfo newsinfo; //封装表单参数
		public Newsinfo getNewsinfo() {
			return newsinfo;
		}
		public void setNewsinfo(Newsinfo newsinfo) {
			this.newsinfo = newsinfo;
		}
		//主题业务逻辑接口
		TopicBiz topicBiz;
		public void setTopicBiz(TopicBiz topicBiz) {
			this.topicBiz = topicBiz;
		}	
		//新闻业务逻辑接口
		NewsinfoBiz newsinfoBiz;
		public void setNewsinfoBiz(NewsinfoBiz newsinfoBiz) {
			this.newsinfoBiz = newsinfoBiz;
		}
		//分页实体类
		private Pager pager;
		public Pager getPager() {
			return pager;
		}
		public void setPager(Pager pager) {
			this.pager = pager;
		}
		Map<String, Object> request;
		@Override
		public void setRequest(Map<String, Object> request) {
			this.request=request;		
		}
		Map<String, Object> session;
		@Override
		public void setSession(Map<String, Object> session) {
			this.session=session;				
		}	
		//根据条件和页码获取新闻列表,再转到新闻浏览首页index.jsp
		public String index() throws Exception {
			int curPage=1;
			if(pager!=null)
				curPage=pager.getCurPage();
			List newsinfoList=null;
			if(newsinfo==null){
				//如何没有指定查询条件,获取指定页码的新闻列表
				newsinfoList=newsinfoBiz.getAllNewsinfoByPage(curPage,10);
				//再获得所有新闻总数,用来初始化分页类Pager对象
				pager=newsinfoBiz.getPagerOfAllNewsinfo(10);			
			}else{
				//如果指定了查询条件,根据条件获取指定页码的新闻列表
				newsinfoList=newsinfoBiz.getNewsinfoByConditionAndPage(newsinfo, curPage, 10);
				//再根据条件获得所属新闻总数,用来初始化分页类Pager对象
				pager=newsinfoBiz.getPagerOfNewsinfo(newsinfo,10);			
			}
			//设置Pager对象中的待显示页页码
			pager.setCurPage(curPage);
			//将待显示的当前页新闻列表存入request范围
			request.put("newsinfoList", newsinfoList);
			//获取所有主题
			List topicList=topicBiz.getAllTopics();
			//将主题列表存入request范围
			request.put("topicList", topicList);
			return "index";
		}
		//从国内新闻和国际新闻中各获取5条记录,再转到index_sidebar.jsp页面
		public String indexsidebar() throws Exception {	
			//获取5条国内新闻
			Newsinfo conditon =new Newsinfo();
			Topic topic =new Topic();
			topic.setId(1);
			conditon.setTopic(topic);		
			List domesticNewsList=newsinfoBiz.getNewsinfoByConditionAndPage(conditon, 1,5);
			//获取5条国际新闻
			topic.setId(2);
			conditon.setTopic(topic);
			List internationalNewsList=newsinfoBiz.getNewsinfoByConditionAndPage(conditon, 1,5);
			request.put("domesticNewsList", domesticNewsList);
			request.put("internationalNewsList", internationalNewsList);
			return "index_sidebar";
		}	
		//浏览新闻内容
		public String newsread() throws Exception {	
			//根据新闻编号获取新闻
			Newsinfo newsinfo=newsinfoBiz.getNewsinfoById(id);
			//将新闻存入request范围
			request.put("newsinfo", newsinfo);
			//获取5条国内新闻
			Newsinfo conditon =new Newsinfo();
			Topic topic =new Topic();
			topic.setId(1);
			conditon.setTopic(topic);
			List domesticNewsList=newsinfoBiz.getNewsinfoByConditionAndPage(conditon, 1,5);
			//获取5条国际新闻
			topic.setId(2);
			conditon.setTopic(topic);
			List internationalNewsList=newsinfoBiz.getNewsinfoByConditionAndPage(conditon, 1,5);
			request.put("domesticNewsList", domesticNewsList);
			request.put("internationalNewsList", internationalNewsList);
			//获取所有主题,并存入request范围
			List topicList=topicBiz.getAllTopics();
			request.put("topicList", topicList);
			//转到新闻内容浏览页
			return "news_read";
		}	
		//获取主题列表,再转到新闻添加页
		public String toNewsAdd() throws Exception {			
			List topicList=topicBiz.getAllTopics();
			request.put("topicList", topicList);
			return "news_add";
		}	
		//执行新闻添加
		public String doNewsAdd() throws Exception {
			//从session中获取Admin对象
			Admin admin=(Admin)session.get("admin");
			newsinfo.setAuthor(admin.getLoginName());
			newsinfo.setCreateDate(new Date());
			newsinfoBiz.addNews(newsinfo);
			return "admin";
		}
		//获取指定页的新闻列表,再转到新闻管理页
		public String admin() throws Exception {
			List newsinfoList=null;
			int curPage=1;
			if(pager!=null)
				curPage=pager.getCurPage();
			if(newsinfo==null){
				//如何没有指定查询条件,获取指定页码的新闻列表
				newsinfoList=newsinfoBiz.getAllNewsinfoByPage(curPage,10);
				//再获得所有新闻总数,用来初始化分页类Pager对象
				pager=newsinfoBiz.getPagerOfAllNewsinfo(10);
			}else{
				//如果指定了查询条件,根据条件获取指定页码的新闻列表
				newsinfoList=newsinfoBiz.getNewsinfoByConditionAndPage(newsinfo, curPage, 10);
				//再根据条件获得所属新闻总数,用来初始化分页类Pager对象
				pager=newsinfoBiz.getPagerOfNewsinfo(newsinfo,10);			
			}
			//设置Pager对象中的待显示页页码
			pager.setCurPage(curPage);
			//将待显示的当前页新闻列表存入request范围
			request.put("newsinfoList", newsinfoList);
			//获取所有主题
			List topicList=topicBiz.getAllTopics();
			//将主题列表存入request范围
			request.put("topicList", topicList);
			return "admin";
		}
		//执行新闻删除
		public String deleteNews() throws Exception {
			newsinfoBiz.deleteNews(id);
			return "admin";
		}
		//根据新闻编号获取新闻,并获取主题列表,再转到新闻修改页
		public String toNewsModify() throws Exception {
			//根据新闻编号获取新闻
			Newsinfo newsinfo=newsinfoBiz.getNewsinfoById(id);
			//将要修改的新闻存入request
			request.put("newsinfo", newsinfo);
			//获取主题列表
			List topicList=topicBiz.getAllTopics();
			//将主题列表存入request
			request.put("topicList", topicList);
			//转到新闻修改页
			return "news_modify";
		}
		//执行新闻修改
		public String doNewsModify() throws Exception {
			//从session中获取Admin对象
			Admin admin=(Admin)session.get("admin");
			newsinfo.setAuthor(admin.getLoginName());
			newsinfo.setCreateDate(new Date());
			newsinfoBiz.updateNews(newsinfo);
			return "admin";
		}
	}
	//TopicAction.java
	public class TopicAction extends ActionSupport implements RequestAware {
		TopicBiz topicBiz;
		public void setTopicBiz(TopicBiz topicBiz) {
			this.topicBiz = topicBiz;
		}	
		Map<String, Object> request;
		@Override
		public void setRequest(Map<String, Object> request) {
			this.request=request;		
		}
		Topic topic;	//封装表单参数
		public Topic getTopic() {
			return topic;
		}
		public void setTopic(Topic topic) {
			this.topic = topic;
		}
		//添加主题
		public String addtopic() throws Exception {
			topicBiz.addTopic(topic);
			return "admin";
		}
		//获取主题列表,再转到主题编辑页	
		public String topiclist() throws Exception {
			List topicList=topicBiz.getAllTopics();
			request.put("topicList", topicList);
			return "topic_list";
		}
		//删除主题
		public String deletetopic() throws Exception {
			topicBiz.deleteTopic(topic.getId());
			return "topiclist";
		}
		//根据主题编号获取主题,再转到主题修改页
		public String toTopicModify() throws Exception {
			Topic modifyTopic=topicBiz.getTopicById(topic.getId());
			request.put("modifyTopic", modifyTopic);
			return "topic_modify";
		}
		//执行主题修改
		public String doTopicModify() throws Exception {
			topicBiz.updateTopic(topic);
			return "topiclist";
		}
	}
	//AdminBizImpl.java
	public class AdminBizImpl implements AdminBiz {
		//使用AdminDAO接口声明属性adminDAO,并添加set方法用于依赖注入
		AdminDAO adminDAO;		
		public void setAdminDAO(AdminDAO adminDAO) {
			this.adminDAO = adminDAO;
		}
		@Override
		public List login(Admin condition) {		
			return adminDAO.search(condition);
		}
	}
	//NewsinfoBizImpl.java
	public class NewsinfoBizImpl implements NewsinfoBiz {
		NewsinfoDAO newsinfoDAO;		
		public void setNewsinfoDAO(NewsinfoDAO newsinfoDAO) {
			this.newsinfoDAO = newsinfoDAO;
		}
		//获取指定页码的新闻列表
		@Override
		public List getAllNewsinfoByPage(int page,int pageSize){
			return newsinfoDAO.getAllNewsinfoByPage(page,pageSize);
		}
		//获取所有新闻数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
		@Override
		public Pager getPagerOfAllNewsinfo(int pageSize) {
			int count= newsinfoDAO.getCountOfAllNewsinfo();
			//使用分页类Pager定义对象
			Pager pager=new Pager();
			//设置pager对象中的perPageRows属性,表示每页显示的记录数
			pager.setPerPageRows(pageSize);
			//设置pager对象中的rowCount属性,表示记录总数
			pager.setRowCount(count);
			//返回pager对象
			return pager;
		}	
		//根据主题编号、新闻标题等条件和指定页码获取新闻列表
		@Override
		public List getNewsinfoByConditionAndPage(Newsinfo condition,int page,int pageSize) {
			return newsinfoDAO.getNewsinfoByConditionAndPage(condition, page, pageSize);
		}
		//根据主题、新闻标题等条件获取新闻数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
		@Override
		public Pager getPagerOfNewsinfo(Newsinfo condition,int pageSize) {
			int count= newsinfoDAO.getCountOfNewsinfo(condition);
			//使用分页类Pager定义对象
			Pager pager=new Pager();
			//设置pager对象中的perPageRows属性,表示每页显示的记录数
			pager.setPerPageRows(pageSize);
			//设置pager对象中的rowCount属性,表示记录总数
			pager.setRowCount(count);
			//返回pager对象
			return pager;
		}
		//根据新闻编号获取新闻
		@Override
		public Newsinfo getNewsinfoById(int id) {
			return newsinfoDAO.getNewsinfoById(id);
		}
		//添加新闻
		@Override
		public void addNews(Newsinfo newsinfo) {
			newsinfoDAO.addNews(newsinfo);
		}
		//删除新闻
		@Override
		public void deleteNews(int id) {
			Newsinfo newsinfo=newsinfoDAO.getNewsinfoById(id);
			newsinfoDAO.deleteNewsinfo(newsinfo);		
		}
		//修改新闻
		@Override
		public void updateNews(Newsinfo newsinfo) {
			newsinfoDAO.updateNews(newsinfo);
		}
	}
	//TopicBizImpl.java
	public class TopicBizImpl implements TopicBiz {
		TopicDAO topicDAO;	
		public void setTopicDAO(TopicDAO topicDAO) {
			this.topicDAO = topicDAO;
		}
		//获取所有主题
		@Override
		public List getAllTopics() {		
			return topicDAO.getAllTopics();
		}
		//通过名称获取主题
		@Override
		public List getTopicByName(String name) {
			return topicDAO.getTopicByName(name);
		}
		//通过编号删除主题
		@Override
		public void deleteTopic(int id) {	
			Topic topic=topicDAO.getTopicById(id);
			topicDAO.deleteTopic(topic);
		}
		@Override
		public int countTopics() {
			// TODO Auto-generated method stub
			return 0;
		}
		//更改主题
		@Override
		public void updateTopic(Topic topic) {
			topicDAO.updateTopic(topic);
		}
		//添加主题
		@Override
		public void addTopic(Topic topic) {
			topicDAO.addTopic(topic);
		}
		//根据编号获取主题
		@Override
		public Topic getTopicById(int id) {
			return topicDAO.getTopicById(id);
		}
	}
	//AdminBiz.java
	public interface AdminBiz {
		public List login(Admin condition);
	}
	//NewsinfoBiz.java
	public interface NewsinfoBiz {
		//获取指定页码的新闻列表
		public List getAllNewsinfoByPage(int page,int pageSize);
		//获取所有新闻数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
		public Pager getPagerOfAllNewsinfo(int pageSize);	    
		//根据主题编号、新闻标题等条件和指定页码获取新闻列表
		public List getNewsinfoByConditionAndPage(Newsinfo condition,int page,int pageSize);   
		//根据主题、新闻标题等条件获取新闻数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
		public Pager getPagerOfNewsinfo(Newsinfo condition,int pageSize);	    
		//根据新闻编号获取新闻
		public Newsinfo getNewsinfoById(int id);
		//添加新闻
		public void addNews(Newsinfo newsinfo);
		//修改新闻
		public void updateNews(Newsinfo newsinfo);
		//删除新闻
		public void deleteNews(int id);    
	}
	//TopicBiz.java
	public interface TopicBiz {
		/*//获取所有一级标题
		public List getFirstTitle();
		//一级标题发布
		public void addFirstleveltitle(Firstleveltitle firstleveltitle);
		//删除指定编号的一级标题
		public void delFirstleveltitle(int id);*/
		//获取所有主题
		public List getAllTopics();
		//通过名称获取主题
		public List getTopicByName(String name);
		//通过编号删除主题
		public void deleteTopic(int id);	
		//返回主题数目
		public int countTopics();
		//更新主题
		public void updateTopic(Topic topic);
		//添加主题
		public void addTopic(Topic topic);
		//通过编号获取主题
		public Topic getTopicById(int id);	
	}
	//AdminDAOImpl.java
	public class AdminDAOImpl implements AdminDAO {
		SessionFactory sessionFactory;
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		@Override
		public List search(Admin condition) {
			List list=null;
			//通过sessionFactory获得Session
			Session session=sessionFactory.getCurrentSession();
			//创建Criteria对象
			Criteria c=session.createCriteria(Admin.class);
			//使用Example工具类创建示例对象
			Example example=Example.create(condition);
			//为Criteria对象指定示例对象example作为查询条件		
			c.add(example);			
			list= c.list();	  //执行查询,获得结果		
			return list;
		}
	}
	//NewsinfoDAOImpl.java
	public class NewsinfoDAOImpl implements NewsinfoDAO {
		SessionFactory sessionFactory;
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		//获取所有新闻列表
		@Override
		public List getAllNewsinfo() {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Newsinfo.class);
			return c.list();
		}
		//获取所有新闻数量
		@Override
		public Integer getCountOfAllNewsinfo() {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Newsinfo.class);
			return c.list().size();
		}
		//根据指定页码获取新闻列表
		@Override
		public List getAllNewsinfoByPage(int page,int pageSize) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Newsinfo.class);
			c.setFirstResult(pageSize*(page-1));
			c.setMaxResults(pageSize);
			c.addOrder(Order.desc("createDate"));
			return c.list();
		}
		//根据新闻编号获取新闻
		@Override
		public Newsinfo getNewsinfoById(int id) {
			Session session=sessionFactory.getCurrentSession();
			Newsinfo newsinfo=(Newsinfo)session.get(Newsinfo.class, id);
			return newsinfo;
		}
		//根据主题、新闻标题等条件获取所属新闻数量
		@Override
		public Integer getCountOfNewsinfo(Newsinfo condition){
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Newsinfo.class);
			if(condition!=null){
				if((condition.getTopic()!=null) && (condition.getTopic().getId()!=null))
					c.add(Restrictions.eq("topic.id", condition.getTopic().getId()));
				if((condition.getTitle()!=null) && !("".equals(condition.getTitle())))
					c.add(Restrictions.like("title", condition.getTitle(),MatchMode.ANYWHERE));
			}
			return c.list().size();
		}
		//根据主题编号、新闻标题等条件和指定页码获取新闻列表
		@Override
		public List getNewsinfoByConditionAndPage(Newsinfo condition,int page,int pageSize) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Newsinfo.class);
			if(condition!=null){
				if((condition.getTopic()!=null) && (condition.getTopic().getId()!=null))
					c.add(Restrictions.eq("topic.id", condition.getTopic().getId()));
				if((condition.getTitle()!=null) && !("".equals(condition.getTitle())))
					c.add(Restrictions.like("title", condition.getTitle(),MatchMode.ANYWHERE));
			}
			c.setFirstResult(pageSize*(page-1));
			c.setMaxResults(pageSize);
			c.addOrder(Order.desc("createDate"));
			return c.list();
		}
		//删除新闻
		@Override
		public void deleteNewsinfo(Newsinfo newsinfo) {
			Session session=sessionFactory.getCurrentSession();
			session.delete(newsinfo);
		}
		//添加新闻
		@Override
		public void addNews(Newsinfo newsinfo) {
			Session session=sessionFactory.getCurrentSession();
			session.saveOrUpdate(newsinfo);		
		}
		//修改新闻
		@Override
		public void updateNews(Newsinfo newsinfo) {
			Session session=sessionFactory.getCurrentSession();
			session.saveOrUpdate(newsinfo);			
		}
	}
	//TopicDAOImpl.java
	public class TopicDAOImpl implements TopicDAO {
		SessionFactory sessionFactory;
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		//获取所有主题
		@Override
		public List getAllTopics() {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Topic.class);
			return c.list();
		}
		//通过名称获取主题
		@Override
		public List getTopicByName(String name) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Topic.class);
			c.add(Restrictions.eq("name", name));
			return c.list();
		}
		//通过编号获取主题
		@Override
		public Topic getTopicById(int id) {
			Session session=sessionFactory.getCurrentSession();
			Topic topic=(Topic)session.get(Topic.class, id);
			return topic;
		}
		//删除主题
		@Override
		public void deleteTopic(Topic topic) {
			Session session=sessionFactory.getCurrentSession();
			session.delete(topic);
		}
		@Override
		public int countTopics() {
			// TODO Auto-generated method stub
			return 0;
		}
		//修改主题
		@Override
		public void updateTopic(Topic topic) {
			Session session=sessionFactory.getCurrentSession();
			session.saveOrUpdate(topic);
		}
		//添加主题
		@Override
		public void addTopic(Topic topic) {
			Session session=sessionFactory.getCurrentSession();
			session.saveOrUpdate(topic);
		}	
	}
	//AdminDAO.java
	public interface AdminDAO {
		public List search(Admin condition);
	}
	//NewsinfoDAO.java
	public interface NewsinfoDAO {		
		//添加新闻
		public void addNews(Newsinfo newsinfo);
		//更新新闻
		public void updateNews(Newsinfo newsinfo);
		//获取所有新闻列表
		public List getAllNewsinfo();
		//获取所有新闻数量
		public Integer getCountOfAllNewsinfo();	
		//根据指定页码获取新闻列表
		public List getAllNewsinfoByPage(int page,int pageSize);
		//根据新闻编号获取新闻
		public Newsinfo getNewsinfoById(int id);
		//根据主题、新闻标题等条件获取所属新闻数量
		public Integer getCountOfNewsinfo(Newsinfo condition);	
		//根据主题编号、新闻标题等条件和指定页码获取新闻列表
		public List getNewsinfoByConditionAndPage(Newsinfo conditon,int page,int pageSize);    
		//删除新闻对象
		public void deleteNewsinfo(Newsinfo newsinfo);	
	}
	//TopicDAO.java
	public interface TopicDAO {
		//获取所有主题
		public List getAllTopics();
		//通过名称获取主题
		public List getTopicByName(String name);
		//通过编号获取主题
		public Topic getTopicById(int id);	
		//删除主题
		public void deleteTopic(Topic topic);	
		//返回主题数目
		public int countTopics();
		//更新主题
		public void updateTopic(Topic topic);
		//添加主题
		public void addTopic(Topic topic);
	}
	//Admin.java
	public class Admin implements java.io.Serializable {
		private Integer id;
		private String loginName;
		private String loginPwd;
		public Admin() {
		}
		public Admin(String loginName, String loginPwd) {
			this.loginName = loginName;
			this.loginPwd = loginPwd;
		}
		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public String getLoginName() {
			return this.loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		public String getLoginPwd() {
			return this.loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
	}
	//Newsinfo.java
	public class Newsinfo implements java.io.Serializable {
		private Integer id;
		private Topic topic;
		private String title;
		private String author;
		private Date createDate;
		private String content;
		private String summary;
		public Newsinfo() {
		}
		public Newsinfo(Topic topic, String title, String author,
				Date createDate, String content, String summary) {
			this.topic = topic;
			this.title = title;
			this.author = author;
			this.createDate = createDate;
			this.content = content;
			this.summary = summary;
		}
		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public Topic getTopic() {
			return this.topic;
		}
		public void setTopic(Topic topic) {
			this.topic = topic;
		}
		public String getTitle() {
			return this.title;
		}
		public void setTitle(String title) {
			this.title = title;
		}
		public String getAuthor() {
			return this.author;
		}
		public void setAuthor(String author) {
			this.author = author;
		}
		public Date getCreateDate() {
			return this.createDate;
		}
		public void setCreateDate(Date createDate) {
			this.createDate = createDate;
		}
		public String getContent() {
			return this.content;
		}
		public void setContent(String content) {
			this.content = content;
		}
		public String getSummary() {
			return this.summary;
		}
		public void setSummary(String summary) {
			this.summary = summary;
		}
	}
	//Pager.java
	public class Pager {
		private int curPage;//待显示页
		private int perPageRows ;//每页显示的记录数  
		private int rowCount; //记录总数  
		private int pageCount; //总页数 	
		public int getCurPage() {
			return curPage;
		}
		public void setCurPage(int currentPage) {
			this.curPage = currentPage;
		}
		public int getPerPageRows() {
			return perPageRows;
		}
		public void setPerPageRows(int perPageRows) {
			this.perPageRows = perPageRows;
		}
		public int getRowCount() {
			return rowCount;
		}
		public void setRowCount(int rowCount) {
			this.rowCount = rowCount;
		}
		public int getPageCount() {
			return (rowCount+perPageRows-1)/perPageRows;
		}
	}
	//Topic.java
	public class Topic implements java.io.Serializable {
		private Integer id;
		private String name;
		private Set newsinfos = new HashSet(0);
		public Topic() {
		}
		public Topic(String name, Set newsinfos) {
			this.name = name;
			this.newsinfos = newsinfos;
		}
		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public String getName() {
			return this.name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public Set getNewsinfos() {
			return this.newsinfos;
		}
		public void setNewsinfos(Set newsinfos) {
			this.newsinfos = newsinfos;
		}
	}
	//Admin.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.news.entity.Admin" table="admin" catalog="news">
			<id name="id" type="java.lang.Integer">
				<column name="Id" />
				<generator class="native"></generator>
			</id>
			<property name="loginName" type="java.lang.String">
				<column name="LoginName" length="20" not-null="true" />
			</property>
			<property name="loginPwd" type="java.lang.String">
				<column name="LoginPwd" length="20" not-null="true" />
			</property>
		</class>
	</hibernate-mapping>
	//Newsinfo.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.news.entity.Newsinfo" table="newsinfo" catalog="news">
			<id name="id" type="java.lang.Integer">
				<column name="Id" />
				<generator class="native"></generator>
			</id>
			<many-to-one name="topic" class="com.news.entity.Topic" fetch="select" lazy="false">
				<column name="Tid" />
			</many-to-one>
			<property name="title" type="java.lang.String">
				<column name="Title" length="100" />
			</property>
			<property name="author" type="java.lang.String">
				<column name="Author" length="10" />
			</property>
			<property name="createDate" type="java.util.Date">
				<column name="CreateDate" length="19" />
			</property>
			<property name="content" type="java.lang.String">
				<column name="Content" length="1000" />
			</property>
			<property name="summary" type="java.lang.String">
				<column name="Summary" length="300" />
			</property>
		</class>
	</hibernate-mapping>
	//Topic.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.news.entity.Topic" table="topic" catalog="news">
			<id name="id" type="java.lang.Integer">
				<column name="Id" />
				<generator class="native"></generator>
			</id>
			<property name="name" type="java.lang.String">
				<column name="Name" length="10" />
			</property>
			<set name="newsinfos" inverse="true" lazy="false" cascade="delete">
				<key>
					<column name="Tid" />
				</key>
				<one-to-many class="com.news.entity.Newsinfo" />
			</set>
		</class>
	</hibernate-mapping>
	//applicationContext.xml
	<?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:p="http://www.springframework.org/schema/p"
		xmlns:tx="http://www.springframework.org/schema/tx"
		xsi:schemaLocation="http://www.springframework.org/schema/beans	
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.1.xsd	 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx.xsd">
		<bean id="dataSource"
			class="org.apache.commons.dbcp.BasicDataSource">
			<property name="driverClassName"
				value="com.mysql.jdbc.Driver" />
			<property name="url" value="jdbc:mysql://localhost:3306/news"></property>
			<property name="username" value="root"></property>
			<property name="password" value="root"></property>
		</bean>
		<bean id="sessionFactory"
			class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
			<property name="dataSource">
				<ref bean="dataSource" />
			</property>
			<property name="hibernateProperties">
				<props>
					<prop key="hibernate.dialect">
						org.hibernate.dialect.MySQLDialect
					</prop>
				</props>
			</property>
			<property name="mappingResources">
				<list>
				<value>com/news/entity/Admin.hbm.xml</value>
				<value>com/news/entity/Topic.hbm.xml</value>
				<value>com/news/entity/Newsinfo.hbm.xml</value></list>
			</property>
		</bean>
		<!--  定义事务通知    --> 
		<tx:advice id="txAdvice" transaction-manager="transactionManager">	 
		  <tx:attributes>	 
			<tx:method name="*" propagation="REQUIRED" /> 
		  </tx:attributes>
		</tx:advice>
		<!--定义切面,并将事务通知和切面组合(定义哪些方法应用事务规则) -->
		<aop:config>
			<!-- 对com.news.biz包下的所有类的所有方法都应用事务规则 -->
			<aop:pointcut id="bizMethods" expression="execution(* com.news.biz.*.*(..))" /> 
			<!--  将事务通知和切面组合   --> 
			<aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" /> 
		</aop:config>
		<!-- 声明Hibernate事务管理器 -->
		<bean id="transactionManager"
			class="org.springframework.orm.hibernate4.HibernateTransactionManager">
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		<tx:annotation-driven transaction-manager="transactionManager" />
		<!-- 定义TopicDAOImpl类-->
		<bean id="topicDAO" class="com.news.dao.impl.TopicDAOImpl">	  
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		<!-- 定义TopicBizImpl类,并为其属性topicDAO注入值-->
		<bean id="topicBiz" class="com.news.biz.impl.TopicBizImpl">	  
			<property name="topicDAO" ref="topicDAO" />
		</bean>
		<!-- 定义TopicAction,并为其属性topicBiz注入值 -->
		<bean name="topicAction" class="com.news.action.TopicAction" scope="prototype">	  
			<property name="topicBiz" ref="topicBiz" />
		</bean>
		<!-- 定义NewsinfoDAOImpl类-->
		<bean id="newsinfoDAO" class="com.news.dao.impl.NewsinfoDAOImpl">	  
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		<!-- 定义NewsinfoBizImpl类,并为其属性newsinfoDAO注入值-->
		<bean id="newsinfoBiz" class="com.news.biz.impl.NewsinfoBizImpl">	  
			<property name="newsinfoDAO" ref="newsinfoDAO" />
		</bean>
		<!-- 定义NewinfoAction,并为其中属性topicBiz和"newsinfoBiz"注入值 -->
		<bean name="newsinfoAction" class="com.news.action.NewsinfoAction" scope="prototype">	  
			<property name="topicBiz" ref="topicBiz" />
			<property name="newsinfoBiz" ref="newsinfoBiz" />
		</bean>
		<!-- 定义AdminDAOImpl类-->
		<bean id="adminDAO" class="com.news.dao.impl.AdminDAOImpl">	  
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		<!-- 定义AdminBizImpl类,并为其adminDAO属性注入值-->
		<bean id="adminBiz" class="com.news.biz.impl.AdminBizImpl">	  
			<property name="adminDAO" ref="adminDAO" />
		</bean>
		<!-- 定义AdminAction,并为其中属性AdminAction注入值 -->
		<bean name="adminAction" class="com.news.action.AdminAction" scope="prototype">
			<property name="adminBiz" ref="adminBiz" />
		</bean>
	</beans>
	//struts.xml
	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
	<struts>
		<constant name="struts.i18n.encoding" value="gbk"></constant>
		<!-- 定义一个名称为news的包,继承struts 2的默认包,指定命名空间为"/" -->
		<package name="news" namespace="/" extends="struts-default">  
			<!-- 为NewsinfoAction类中的indexsidebar()方法配置映射 -->
			<action name="indexsidebar" class="newsinfoAction" method="indexsidebar">
				<result name="index_sidebar">index-elements/index_sidebar.jsp</result>			
			</action>		
			<!-- 为NewsinfoAction类中的index方法配置映射 -->
			<action name="index" class="newsinfoAction" method="index">
				<result name="index">/index.jsp</result>			
			</action>	
			<!-- 为NewsinfoAction类中的newsread()方法配置映射,浏览新闻内容 -->
			<action name="newsread" class="newsinfoAction" method="newsread">
				<result name="news_read">/news_read.jsp</result>			
			</action>
			<!--为NewsinfoAction类中的toNewsAdd()方法配置映射,显示新闻添加页   -->
			<action name="toNewsAdd" class="newsinfoAction" method="toNewsAdd">
				<result name="news_add">newspages/news_add.jsp</result>			
			</action>
			<!-- 为NewsinfoAction类中的doNewsAdd()方法配置映射,执行新闻添加 -->
			<action name="doNewsAdd" class="newsinfoAction" method="doNewsAdd">
				<result name="admin" type="redirectAction">admin</result>			
			</action>
			<!-- 显示新闻管理页 -->
			<action name="admin" class="newsinfoAction" method="admin">
				<result name="admin">newspages/admin.jsp</result>			
			</action>
			<!--为NewsinfoAction类中的deleteNews()方法配置映射,执行新闻删除   -->
			<action name="deleteNews" class="newsinfoAction" method="deleteNews">
				<result name="admin" type="redirectAction">admin</result>			
			</action>		
			<!--为NewsinfoAction类中的toNewsModify()方法配置映射,显示新闻修改页   -->
			<action name="toNewsModify" class="newsinfoAction" method="toNewsModify">
				<result name="news_modify">newspages/news_modify.jsp</result>			
			</action>
			<!--为NewsinfoAction类中的doNewsModify()方法配置映射,执行新闻修改   -->
			<action name="doNewsModify" class="newsinfoAction" method="doNewsModify">
				<result name="admin" type="redirectAction">admin</result>			
			</action>
			<!--为TopicAction类中的addtopic()方法配置映射,添加主题   -->
			<action name="addtopic" class="topicAction" method="addtopic">
				<result name="admin" type="redirectAction">admin</result>			
			</action>
			<!--为TopicAction类中的topiclist()方法配置映射,显示主题编辑页   -->
			<action name="topiclist" class="topicAction" method="topiclist">
				<result name="topic_list">newspages/topic_list.jsp</result>			
			</action>
			<!--为TopicAction类中的deletetopic()方法配置映射,删除主题   -->
			<action name="deletetopic" class="topicAction" method="deletetopic">
				<result name="topiclist" type="redirectAction">topiclist</result>			
			</action>
			<!--为TopicAction类中的toTopicModify()方法配置映射,显示主题修改页   -->
			<action name="toTopicModify" class="topicAction" method="toTopicModify">
				<result name="topic_modify">newspages/topic_modify.jsp</result>			
			</action>
			<!--为TopicAction类中的doTopicModify()方法配置映射,执行主题修改请求   -->
			<action name="doTopicModify" class="topicAction" method="doTopicModify">
				<result name="topiclist" type="redirectAction">topiclist</result>			
			</action>
			<!-- 采用通配符为SecondleveltitleAction类的所有方法配置映射 -->
			<action name="*" class="adminAction" method="{1}">
				<result name="index" type="redirectAction">index</result>	
			</action>  
		</package>
	</struts>    			
	//admin.css
	@charset "GBK";
	/* CSS Document */
	*{ margin:0; padding:0;}
	body{ font:12px/20px Tahoma;}
	table{ border-collapse:collapse;}
	img{ border:0;}
	li{ list-style:none;}
	a{ color:#333; text-decoration:underline;}
	a:hover{ color:#f00; text-decoration:underline;}

	#header{ clear:both; margin:0 auto; margin-top:15px; width:947px; height:116px; border:1px solid #dfdfdf; background:url(../Images/topbg.gif) repeat-x;}
		#welcome{ padding:6px 0 0 10px; height:30px;}
		#nav{ clear:both; padding:0 10px;}
			#logo{ float:left; background:#f00;}
			#a_b01{ float:right; width:781px; margin:4px 0 0 0; background:#f00;}
			
	#admin_bar{ clear:both; width:947px; margin:14px auto 0; height:25px; background:url(../Images/admin_bar.gif) repeat-x; border:1px #d5d9da solid; border-top:0;}
		#status{ float:left; width:550px; padding:2px 0 0 20px;}
		#channel{ float:right; width:360px;}
			#channel li{ float:left; width:66px; height:22px; line-height:22px; text-align:center; background:url(../Images/channel_bg.gif) no-repeat; margin:0 3px;}
			#channel li a{ color:#2a3668; text-decoration:none;}
			#channel li a:hover{ color:#f60; text-decoration:underline;}
			#channel li#name{ background:none; width:auto;}
			
	#main{ clear:both; width:947px; height:100%; overflow:hidden; margin:14px auto 0;}
		#opt_list{ float:left; width:130px; padding:10px 0 0 14px;}
		#opt_area{ float:right; width:770px; margin:14px 0 0 0;}
			#opt_type{ height:28px; padding:4px 0 0 18px; margin:0 0 20px 0; font:600 14px/24px Arial; background:url(../Images/opt_name.gif) no-repeat;}
			#opt_area p{ margin:10px 0;}
			.opt_input{ margin-left:6px; border:1px solid #999; height:18px; line-height:18px; width:200px;}
			.opt_sub{ height:25px; background:url(../Images/opt_sub.gif) repeat-x; text-align:center; border:1px solid #ceced0; font:12px/25px Arial; padding:0 6px; letter-spacing:3px;}
			.classlist{ clear:both; margin-top:10px;}
				.classlist li{ position:relative; line-height:22px; background:url(../Images/arrow.gif) no-repeat 0 10px; padding:0 130px 0 8px;}
				.classlist li.space{ background:none; height:22px;}
				.classlist li span{ position:absolute; top:-1px; *top:-4px; right:16px;}
	#site_link{ clear:both; width:947px; margin:35px auto 0; background:#e3e3e3; border-top:2px #0c7eb2 solid; height:26px; line-height:28px; text-align:center;}
	#site_link a{ color:#000; text-decoration:none;}
	#site_link a:hover{ color:#f00; text-decoration:underline;}
	#site_link span{ margin:0 6px;}
			
		
	#friend{ clear:both; width:947px; height:140px; margin:0 auto;}
		.friend_t{ height:24px; border:1px solid #b3b7ba; background:url(../Images/friend_t.gif) repeat-x; padding:4px 0 0 10px;}
		.friend_list{ height:110px; overflow:hidden; background:url(../images/firend_bg.gif) repeat-x; border:1px solid #bfd0d5; border-top:0;}
		.friend_list ul{ margin:14px 10px 0;}
		.friend_list li{ float:left; margin-right:10px; white-space:nowrap;}

	#footer{ clear:both; width:947px; margin:14px auto 0; text-align:center;}
		#footer p{ font:14px/24px Arial; color:#999;}
		#footer p.copyright{ color:#333; margin-top:15px;}
	//main.css
	@charset "GBK";
	/* CSS Document */
	*{ margin:0; padding:0;}
	body{ font:12px/20px Tahoma;}
	table{ border-collapse:collapse;}
	img{ border:0;}
	li{ list-style:none;}

	a{ color:#335884; text-decoration:none;}
	a:hover{ color:#f00; text-decoration:underline;}

	#header{ clear:both; position:relative; margin:0 auto; margin-top:15px; width:947px; height:116px; border:1px solid #dfdfdf; background:url(../Images/topbg.gif) repeat-x;}
		#top_login{ padding:6px 0 0 10px;}
			.login_input{ height:19px; line-height:19px; width:118px; border:none; background:url(../Images/login_input.gif) no-repeat; margin:0 14px 0 6px;}
			.login_sub{ width:51px; height:19px; border:none; background:url(../Images/login_sub.gif) no-repeat;}
			.login_link{ text-decoration:underline; margin:0 6px;}
			#friend_logo{ position:absolute; top:6px; right:6px;}
			
		#nav{ clear:both;}
			#logo{ float:left; width:145px; margin:8px 0 0 12px;}
			
			#mainnav{ float:right; margin:10px 10px 0 0 ;}
			#mainnav ul{ clear:both;}
			#mainnav ul li{ float:left; margin:0 2px; padding-left:6px; background:url(../Images/nav_leftdot.gif) no-repeat 0 8px; line-height:24px;}
			#mainnav ul li a{ color:#333;}
			#mainnav ul li.leftLineTop{ background-image:url(../Images/nav_leftline.gif);}
			#mainnav ul li.headLi{ background:none;}
			
			
	#container{ clear:both; width:947px; height:100%; overflow:hidden; margin:14px auto 0;}
		.sidebar{ float:left; width:157px;}
			.sidebar h1{ clear:both;}
			.side_list{ height:250px; background:url(../Images/sidebarbg.gif) no-repeat; margin:2px 0 12px;}
		.main{ float:right; width:787px;}
			.class_type{ background:url(../Images/class_bg.gif) no-repeat right 8px; height:40px; padding:0 0 0 14px;}
			.content{ float:left; width:780px; border-right:1px solid #eff0f4; margin:16px 0 0 10px;}
				.class_date{ font:12px/20px Arial; border-bottom:1px solid #d4d6d9; margin-right:10px;}
					#class_month{ font-weight:600;}
					#class_month a{ margin:0 7px; *margin:0 5px;}
					#class_day{ line-height:30px;}
				.classlist{ clear:both; margin-top:10px;}
				.classlist li{ position:relative; line-height:22px; background:url(../Images/arrow.gif) no-repeat 0 10px; padding:0 130px 0 8px;}
				.classlist li.space{ background:none; height:22px;}
				.classlist li span{ position:absolute; top:-1px; *top:-4px; right:16px;}
			.picnews{ float:right; width:250px; text-align:center; margin:16px 0 0 0;}
			.picnews li{ margin-bottom:10px;}
			
		
	#friend{ clear:both; width:947px; height:140px; margin:0 auto;}
		.friend_t{ height:24px; border:1px solid #b3b7ba; background:url(../Images/friend_t.gif) repeat-x; padding:4px 0 0 10px;}
		.friend_list{ height:110px; overflow:hidden; background:url(../images/firend_bg.gif) repeat-x; border:1px solid #bfd0d5; border-top:0;}
		.friend_list ul{ margin:14px 10px 0;}
		.friend_list li{ float:left; margin-right:10px; white-space:nowrap;}

	#footer{ clear:both; width:947px; margin:14px auto 0; text-align:center;}
		#footer p{ font:14px/24px Arial; color:#999;}
		#footer p.copyright{ color:#333; margin-top:15px;}
	//read.css
	@charset "GBK";
	/* CSS Document */
	*{ margin:0; padding:0;}
	body{ font:12px/20px Tahoma;}
	table{ border-collapse:collapse;}
	img{ border:0;}
	li{ list-style:none;}

	a{ color:#335884; text-decoration:none;}
	a:hover{ color:#f00; text-decoration:underline;}

	#header{ clear:both; position:relative; margin:0 auto; margin-top:15px; width:947px; height:116px; border:1px solid #dfdfdf; background:url(../Images/topbg.gif) repeat-x;}
		#top_login{ padding:6px 0 0 10px;}
			.login_input{ height:19px; line-height:19px; width:118px; border:none; background:url(../Images/login_input.gif) no-repeat; margin:0 14px 0 6px;}
			.login_sub{ width:51px; height:19px; border:none; background:url(../Images/login_sub.gif) no-repeat;}
			.login_link{ text-decoration:underline; margin:0 6px;}
			#friend_logo{ position:absolute; top:6px; right:6px;}
			
		#nav{ clear:both;}
			#logo{ float:left; width:145px; margin:8px 0 0 12px;}
			
			#mainnav{ float:right; margin:10px 10px 0 0 ;}
			#mainnav ul{ clear:both;}
			#mainnav ul li{ float:left; margin:0 2px; padding-left:6px; background:url(../Images/nav_leftdot.gif) no-repeat 0 8px; line-height:24px;}
			#mainnav ul li a{ color:#333;}
			#mainnav ul li.leftLineTop{ background-image:url(../Images/nav_leftline.gif);}
			#mainnav ul li.headLi{ background:none;}
			
			
	#container{ clear:both; width:947px; height:100%; overflow:hidden; margin:14px auto 0;}
		.sidebar{ float:left; width:157px;}
			.sidebar h1{ clear:both;}
			.side_list{ height:250px; background:url(../Images/sidebarbg.gif) no-repeat; margin:2px 0 12px;}
		.main{ float:right; width:787px;}
			.class_type{ background:url(../Images/class_bg.gif) no-repeat right 8px; height:40px; padding:0 0 0 14px;}
			.content{ float:right; width:787px; border-right:1px solid #eff0f4; margin:16px 0 0 10px;}
				
				.classlist{ clear:both; margin-top:10px;}
				.classlist li{ position:relative; line-height:22px; background:url(../Images/arrow.gif) no-repeat 0 10px; padding:0 130px 0 8px;}
				.classlist li.space{ background:none; height:22px;}
				.classlist li span{ position:absolute; top:-1px; *top:-4px; right:16px;}
			
			
		
	#friend{ clear:both; width:947px; height:140px; margin:0 auto;}
		.friend_t{ height:24px; border:1px solid #b3b7ba; background:url(../Images/friend_t.gif) repeat-x; padding:4px 0 0 10px;}
		.friend_list{ height:110px; overflow:hidden; background:url(../images/firend_bg.gif) repeat-x; border:1px solid #bfd0d5; border-top:0;}
		.friend_list ul{ margin:14px 10px 0;}
		.friend_list li{ float:left; margin-right:10px; white-space:nowrap;}

	#footer{ clear:both; width:947px; margin:14px auto 0; text-align:center;}
		#footer p{ font:14px/24px Arial; color:#999;}
		#footer p.copyright{ color:#333; margin-top:15px;}
	//index_sidebar.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>
	<div class="sidebar">
		<h1>
			<img src="Images/title_1.gif" alt="国内新闻" />
		</h1>
		<div class="side_list">
			<ul>
				<!-- 循环显示5条国内新闻  -->
				<s:iterator id="domesticNews" value="#request.domesticNewsList">
					<li><a href='newsread?id=${domesticNews.id }'><b>
								${domesticNews.title }</b>
					</a></li>
					<br>
				</s:iterator>
			</ul>
		</div>
		<h1>
			<img src="Images/title_2.gif" alt="国际新闻" />
		</h1>
		<div class="side_list">
			<ul>
				<!-- 循环显示5条国际新闻  -->
				<s:iterator id="internationalNews"
					value="#request.internationalNewsList">
					<li><a href='newsread?id=${internationalNews.id }'><b>
								${internationalNews.title }</b>
					</a></li>
					<br>
				</s:iterator>
			</ul>
		</div>
	</div>
	//index_top.jsp
	<%@ page language="java" pageEncoding="gbk"%>
	<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>
	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
	<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
	<meta http-equiv="pragma" content="no-cache" />
	<meta http-equiv="cache-control" content="no-cache" />
	<title>新闻中国</title>

	<link href="CSS/main.css" rel="stylesheet" type="text/css" />
	<script language="javascript">
			function check(){
				var loginName = document.getElementById("loginName");
				var loginPwd = document.getElementById("loginPwd");
				if(loginName.value == ""){
					alert("用户名不能为空!请重新填入!");
					loginName.focus();	
					return false;
				}else if(loginPwd.value == ""){
					alert("密码不能为空!请重新填入!");
					loginPwd.focus();
					return false;
				}
				return true;
			}
			
			function focusOnLogin(){
				var loginPwd = document.getElementById("loginPwd");
				if( loginPwd != null )
					loginPwd.focus();	
			}
		</script>
	</head>
	<body onload="focusOnLogin()">
		<div id="header">
			<div id="top_login">
				<s:if test="#session.admin==null">
					<form action="validateLogin" method="post" onsubmit="return check()">
						<label>用户名</label> <input type="text" id="loginName"
							name="loginName" value="" class="login_input" /> <label>
							密&#160;&#160;码 </label> <input type="password" id="loginPwd"
							name="loginPwd" value="" class="login_input" /> <input
							type="submit" class="login_sub" value="登录" /> <label id="error">
						</label>
					</form>
				</s:if>
				<s:if test="#session.admin!=null">
			欢迎您 :<s:property value="#session.admin.loginName" />  &nbsp; &nbsp; &nbsp;<a
						href="/News/admin">登录控制台</a> &nbsp; <a href="loginout">退出</a>
				</s:if>
			</div>
			<div id="nav">
				<table>
					<tr>
						<td><div id="logo">
								<img src="Images/logo.jpg" alt="新闻" />
							</div>
						</td>
						<td><img src="Images/a_b01.gif" alt="" />
						</td>
					</tr>
				</table>
				<!--mainnav end-->
			</div>
		</div>
	</body>
	</html>
	//left.html
	<div id="opt_list">
	  <ul>
		<li><a href="/News/toNewsAdd">添加新闻</a></li>
		<li><a href="/News/admin">编辑新闻</a></li>
		<li><a href="newspages/topic_add.jsp">添加主题</a></li>
		<li><a href="/News/topiclist">编辑主题</a></li>
	  </ul>
	</div>
	//top.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
	<%@ taglib uri='/struts-tags' prefix='s' %>
	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
	<html>
	<meta http-equiv="pragma" content="no-cache" />
	<meta http-equiv="cache-control" content="no-cache" />
	<s:if test="#session.admin==null">
		<script type="text/javascript">
			alert("当前页面访问受限,请重新登录管理账户!");
			open("/News/index","_self");	
		</script>
	</s:if>

	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=GBK" />
	<title>新闻发布系统管理后台</title>
	<link href="/News/CSS/admin.css" rel="stylesheet" type="text/css" />
	<div id="header">
	  <div id="welcome">欢迎使用新闻管理系统!</div>
	  <div id="nav">
		<div id="logo"><img src="/News/Images/logo.jpg" alt="新闻中国" /></div>
		<div id="a_b01"><img src="/News/Images/a_b01.gif" alt="" /></div>
	  </div>
	</div>
	<div id="admin_bar">
	  <div id="status">Admin: 登录  &#160;&#160;&#160;&#160; <a href="/News/loginout">login out</a></div>
	  <div id="channel"> </div>
	</div>
	</head>
	<body>
	//admin.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>
	<jsp:include page="console_element/top.jsp" />
	<script language="javascript">
		function clickdel(){
			return confirm("删除请点击确认");
		}	
	</script>
	<div id="main">
		<jsp:include page="console_element/left.html" />
		<div id="opt_area">
			<s:form ation="admin" method="post" theme="simple">
						  主题:<s:select name="newsinfo.topic.id"
					list="#request.topicList" listKey="id" listValue="name"
					cssClass="opt_input" />
			 &nbsp;&nbsp; &nbsp;新闻标题:<s:textfield name="newsinfo.title" />
				<s:submit value="查询" />
			</s:form>
			<ul class="classlist">
				<s:iterator id="news" value="#request.newsinfoList">
					<li>${news.title}<span>
							作者:${news.author}&#160;&#160;&#160;&#160; <a
							href='toNewsModify?id=${news.id}'>修改</a> &#160;&#160;&#160;&#160;
							<a href='deleteNews?id=${news.id}' onclick='return clickdel()'>删除</a>
					</span></li>
				</s:iterator>
				<s:if test="pager.curPage>1">
					<p align="center">
						<a
							href='admin?pager.curPage=1&newsinfo.topic.id=${requestScope.newsinfo.topic.id}&newsinfo.title=${requestScope.newsinfo.title}'>首页</a>
						<a
							href='admin?pager.curPage=${pager.curPage-1 }&newsinfo.topic.id=${requestScope.newsinfo.topic.id}&newsinfo.title=${requestScope.newsinfo.title}'>上一页</a>
					</p>
				</s:if>

				<s:if test="pager.curPage < pager.pageCount">
					<p align="center">
						<a
							href='admin?pager.curPage=${pager.curPage+1}&newsinfo.topic.id=${requestScope.newsinfo.topic.id}&newsinfo.title=${requestScope.newsinfo.title}'>下一页</a>
						<a
							href='admin?pager.curPage=${pager.pageCount }&newsinfo.topic.id=${requestScope.newsinfo.topic.id}&newsinfo.title=${requestScope.newsinfo.title}'>尾页</a>
					</p>
				</s:if>
			</ul>
		</div>
	</div>
	//news_add.jsp
	<%@ page language="java" import="java.util.*,java.sql.*" pageEncoding="gbk"%>
	<%@ taglib uri='/struts-tags' prefix='s' %>
	<jsp:include page="console_element/top.jsp" />

	<script type="text/javascript">
		function check(){
			var title = document.getElementById("title");
			var author = document.getElementById("author");
			var summary = document.getElementById("summary");
			var content = document.getElementById("content");		
			if(title.value == ""){
				alert("标题不能为空!!");
				title.focus();
				return false;
			}else if(author.value == ""){
				alert("作者不能为空!!");
				author.focus();
				return false;
			}else if(summary.value == ""){
				alert("摘要不能为空!!");
				summary.focus();
				return false;
			}else if(content.value == ""){
				alert("内容不能为空!!");
				content.focus();
				return false;
			}		
			return true;
		}
	</script>
	<div id="main">
	  <jsp:include page="console_element/left.html" />
	  <div id="opt_area">
		<h1 id="opt_type"> 添加新闻: </h1>
		<s:form action="doNewsAdd" method="post" onsubmit="return check()">
		  <p>        
			<s:select name="newsinfo.topic.id" label="主题" list="#request.topicList" listKey="id" listValue="name" cssClass="opt_input" />
		  </p>
		  <p>
			<s:textfield label="标题" name="newsinfo.title" cssClass="opt_input"  />
		  </p>      
		  <p>
			<s:textarea label="摘要" name="newsinfo.summary" cols="40" rows="3" />
		  </p>
		  <p>
			 <s:textarea label="内容" name="newsinfo.content" cols="70" rows="10" />        
		  </p>   
		  <br>
		 <p>
			 <s:submit value="提交" cssClass="opt_sub" align="center" />  
		  </p> 
		</s:form>
	  </div>
	</div>
	//news_modify.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
	<%@ taglib uri='/struts-tags' prefix='s' %>
	<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
	<jsp:include page="console_element/top.jsp" />
	<script type="text/javascript">
		function check(){
			var title = document.getElementById("title");
			var author = document.getElementById("author");
			var summary = document.getElementById("summary");
			var content = document.getElementById("content");
			
			if(title.value == ""){
				alert("标题不能为空!!");
				title.focus();
				return false;
			}else if(author.value == ""){
				alert("作者不能为空!!");
				author.focus();
				return false;
			}else if(summary.value == ""){
				alert("摘要不能为空!!");
				summary.focus();
				return false;
			}else if(content.value == ""){
				alert("内容不能为空!!");
				content.focus();
				return false;
			}		
			return true;
		}
	</script>

	<div id="main">
	  <jsp:include page="console_element/left.html" />
	  <div id="opt_area">
		<h1 id="opt_type"> 修改新闻: </h1>
		<form action="/News/doNewsModify" method="post" onsubmit="return check()">
		  <s:hidden name="newsinfo.id" value="%{#request.newsinfo.id}" />
		  <p>        
			<s:select name="newsinfo.topic.id" label="主题" list="#request.topicList" listKey="id" listValue="name" value="%{#request.newsinfo.topic.id }" cssClass="opt_input" />
		  </p>
		  <p>
			<s:textfield label="标题" name="newsinfo.title" cssClass="opt_input" value="%{#request.newsinfo.title }"  />
		  </p>      
		  <p>
			<s:textarea label="摘要" name="newsinfo.summary" value="%{#request.newsinfo.summary }" cols="40" rows="3"  />
		  </p>
		  <p>
			 <s:textarea label="内容" name="newsinfo.content" value="%{#request.newsinfo.content }" cols="70" rows="10" />        
		  </p>   
		  <br>
		 <p>
			 <s:submit value="提交" cssClass="opt_sub" align="center" />  
		  </p> 
		</form>    
	  </div>
	</div>
	//topic_add.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<jsp:include page="console_element/top.jsp" />
	<%@ taglib uri='/struts-tags' prefix='s' %>
	<script type="text/javascript">
		function check(){
			var name = document.getElementById("name");

			if(name.value == ""){
				alert("请输入主题名称!!");
				name.focus();
				return false;
			}		
			return true;
		}
	</script>
	<div id="main">
	  <jsp:include page="console_element/left.html" />
	  <div id="opt_area">
		<h1 id="opt_type"> 添加主题: </h1>
		<s:form action="/addtopic" method="post" onsubmit="return check()">
		  <p>
			<s:textfield label="主题名称" id="name" name="topic.name" cssClass="opt_input" />
		  </p> 
		   
		  <p>
			<s:submit value="提交" cssClass="opt_sub" />
		  </p>     
		</s:form>
	  </div>
	</div>
	//topic_list.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
	<%@ taglib uri='/struts-tags' prefix='s' %>
	<jsp:include page="console_element/top.jsp" />
	<script language="javascript">
		function clickdel(){
			return confirm("删除后,主题下的文章也会删除,确认删除吗?");
		}	
	</script>

	<div id="main">
	  <jsp:include page="console_element/left.html" />
	  <div id="opt_area">
		<ul class="classlist">  
			<s:iterator id="topic" value="#request.topicList">
				<li> &#160;&#160;&#160;&#160; ${topic.name}&#160;&#160;&#160;&#160; <a href='toTopicModify?topic.id=${topic.id}'>修改</a> &#160;&#160;&#160;&#160; <a href='deletetopic?topic.id=${topic.id}'  onclick='return clickdel()'>删除</a> </li>
			</s:iterator>
			
		</ul>
	  </div>
	</div>
	//topic_modify.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<jsp:include page="console_element/top.jsp" />
	<%@ taglib uri='/struts-tags' prefix='s' %>
	<script type="text/javascript">
		function check(){
			var name = document.getElementById("name");

			if(name.value == ""){
				alert("请输入主题名称!!");
				name.focus();
				return false;
			}		
			return true;
		}
	</script>
	<div id="main">
	  <jsp:include page="console_element/left.html" />
	  <div id="opt_area">
		<h1 id="opt_type">修改主题: </h1>
		<s:form action="/doTopicModify" method="post" onsubmit="return check()">
		  <s:hidden name="topic.id" value="%{#request.modifyTopic.id}" />
		  <p>
			<s:textfield label="主题名称" id="name" name="topic.name" value="%{#request.modifyTopic.name }" cssClass="opt_input" />
		  </p> 
		   
		  <p>
			<s:submit value="提交" cssClass="opt_sub" />
		  </p>     
		</s:form>
	  </div>
	</div>
	//web.xml
	<?xml version="1.0" encoding="UTF-8"?>
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
	  <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	  </listener>
	  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	  </context-param>
	  <filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	  </filter>
	  <filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>*/
	  </filter-mapping>  
	</web-app>
	//index.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
	<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
	<%@ taglib uri='/struts-tags' prefix='s' %>
	<jsp:include page="index-elements/index_top.jsp" />
	<div id="container">
	<s:action name="indexsidebar" namespace="/" executeResult="true" />
	  <div class="main">
		<div class="class_type"> <img src="Images/class_type.gif" alt="新闻中心" /> </div>
		<div class="content">
		  <ul class="class_date">
			<li id='class_month'>    
			 <!-- 循环显示主题列表 -->  	
			 <s:iterator id="topic" value="#request.topicList">
				<a href="index?newsinfo.topic.id=${topic.id}"><b>${topic.name}</b></a>
			 </s:iterator>
		  </ul>
		  <ul class="classlist"> 
			<!-- 循环显示当前页新闻列表 -->     
			<s:iterator id="news" value="#request.newsinfoList">
				<li><a href="newsread?id=${news.id}"> ${news.title} </a>
				<span> ${newsinfo.createDate}</span></li>
			</s:iterator>     
			<br> <br>
			
			<!-- 分页超链接部分 -->
			<s:if test="pager.curPage>1">
				<p align="center">
					<a href='index?pager.curPage=1&newsinfo.topic.id=${requestScope.newsinfo.topic.id}'>首页</a>
					<a href='index?pager.curPage=${pager.curPage-1 }&newsinfo.topic.id=${requestScope.newsinfo.topic.id}'>上一页</a>
				</p>
			</s:if>		
			
			<s:if test="pager.curPage < pager.pageCount">
			  <p align="center">
				<a href='index?pager.curPage=${pager.curPage+1}&newsinfo.topic.id=${requestScope.newsinfo.topic.id}'>下一页</a>
				<a href='index?pager.curPage=${pager.pageCount }&newsinfo.topic.id=${requestScope.newsinfo.topic.id}'>尾页</a>
			  </p>
			</s:if>
		   </ul>
		</div>   
	  </div>
	</div>
	//news_read.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>
	<jsp:include page="index-elements/index_top.jsp" />
	<link href="CSS/read.css" rel="stylesheet" type="text/css" />
	<script type="text/javascript">
		function checkComment(){
			var cauthor = document.getElementById("cauthor");
			var content = document.getElementById("ccontent");
			if(cauthor.value == ""){
				alert("用户名不能为空!!");
				return false;
			}else if(content.value == ""){
				alert("评论内容不能为空!!");
				return false;
			}
			return true;
		}
	</script>
	<div id="container">
		<jsp:include page="index-elements/index_sidebar.jsp"></jsp:include>
		<div class="main">
			<div class="class_type">
				<img src="Images/class_type.gif" alt="新闻中心" />
			</div>
			<div class="content">
				<ul class="class_date">
					<li id='class_month'><s:iterator id="topic"
							value="#request.topicList">
							<a href="index?tid=${topic.id}"><b>${topic.name}</b>
							</a>
						</s:iterator>
				</ul>
				<ul class="classlist">
					<table width="80%" align="center">
						<tr width="100%">
							<td colspan="2" align="center">${newsinfo.title}</td>
						</tr>
						<tr>
							<td colspan="2"><hr /></td>
						</tr>
						<tr>
							<td align="center">作者:${newsinfo.author}&nbsp;&nbsp; 类型:<a
								href="index?tid=${newsinfo.topic.id}">${newsinfo.topic.name}</a>
								发布时间:${newsinfo.createDate}</td>
						</tr>
						<tr>
							<td align="left"><strong>摘要:${newsinfo.summary}</strong>
							</td>
						</tr>
						<tr>
							<td colspan="2" align="center"></td>
						</tr>
						<tr>
							<td colspan="2">${newsinfo.content}</td>
						</tr>
						<tr>
							<td colspan="2"><hr /></td>
						</tr>
					</table>
				</ul>
			</div>
		</div>
	</div>
	//sql
	CREATE TABLE `admin` (
	  `Id` int(4) NOT NULL AUTO_INCREMENT,
	  `LoginName` varchar(20) NOT NULL,
	  `LoginPwd` varchar(20) NOT NULL,
	  PRIMARY KEY (`Id`)
	) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

	INSERT INTO `admin` VALUES ('1', 'admin', '123456');

	CREATE TABLE `topic` (
	  `Id` int(4) NOT NULL AUTO_INCREMENT,
	  `Name` varchar(10) DEFAULT NULL,
	  PRIMARY KEY (`Id`)
	) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;


	INSERT INTO `topic` VALUES ('1', '国内新闻');
	INSERT INTO `topic` VALUES ('2', '国际新闻');
	INSERT INTO `topic` VALUES ('3', '娱乐新闻');
	INSERT INTO `topic` VALUES ('4', '科技新闻');
	INSERT INTO `topic` VALUES ('5', '社会新闻');


	CREATE TABLE `newsinfo` (
	  `Id` int(4) NOT NULL AUTO_INCREMENT,
	  `Title` varchar(100) DEFAULT NULL,
	  `Author` varchar(10) DEFAULT NULL,
	  `CreateDate` datetime DEFAULT NULL,
	  `Content` varchar(10000) DEFAULT NULL,
	  `Summary` varchar(500) DEFAULT NULL,
	  `Tid` int(4) DEFAULT NULL,
	  PRIMARY KEY (`Id`),
	  KEY `Tid` (`Tid`),
	  CONSTRAINT `newsinfo_ibfk_1` FOREIGN KEY (`Tid`) REFERENCES `topic` (`Id`)
	) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8;
//网上订餐系统
	//目录结构
	src
		com.restrant
			//action
				CartAction.java
				MealAction.java
				OrdersAction.java
				UserAction.java
			//biz
				//impl
					MealBizImpl.java
					MealSeriesBizImpl.java
					OrderDtsBizImpl.java
					OrdersBizImpl.java
					UserBizImpl.java
			MealBiz.java
			MealSeriesBiz.java
			OrderDtsBiz.java
			OrdersBiz.java
			UserBiz.java
			//dao
				//impl
					MealDAOImpl.java
					MealSeriesDAOImpl.java
					OrderDtsDAOImpl.java
					OrdersDAOImpl.java
					UserDAOImpl.java
			MealDAO.java		
			MealSeriesDAO.java		
			OrderDtsDAO.java
			OrdersDAO.java
			UserDAO.java		
			//entity
			Admin.java
			CartItemBean.java
			Meal.java
			Mealseries.java
			Orderdts.java
			Orders.java
			Pager.java
			Users.java
			Admin.hbm.xml
			Meal.hbm.xml
			Mealseries.hbm.xml
			Orderdts.hbm.xml
			Orders.hbm.xml
			Users.hbm.xml
			//filter
			AuthFilter.java
			//interceptor
			AuthorityInterceptor.java
		applicationContext.xml	
		struts.xml	
	css		
		styles.css	
	WEB-INF		
		web.xml
	addMeal.jsp		
	details.jsp		
	index.jsp		
	login.jsp		
	managemeal.jsp		
	manageorders.jsp		
	modifyMyInfo.jsp		
	myorders.jsp		
	myordersdetails.jsp		
	register.jsp		
	shopCart.jsp		
	show.jsp		
	updateMeal.jsp		
	//CartAction.java
	public class CartAction extends ActionSupport implements SessionAware {	
		//封装表单传递来的餐品编号mealId参数值
		private Integer mealId;
		public void setMealId(Integer mealId) {
			this.mealId = mealId;
		}	
		public Integer getMealId() {
			return mealId;
		}
		//封装表单传递来的餐品数量quantity参数值
		int quantity;	
		public int getQuantity() {
			return quantity;
		}
		public void setQuantity(int quantity) {
			this.quantity = quantity;
		}
		MealBiz mealBiz;
		public void setMealBiz(MealBiz mealBiz) {
			this.mealBiz = mealBiz;
		}
		MealSeriesBiz mealSeriesBiz;	
		public void setMealSeriesBiz(MealSeriesBiz mealSeriesBiz) {
			this.mealSeriesBiz = mealSeriesBiz;
		}
		Map<String, Object> session;
		@Override
		public void setSession(Map<String, Object> session) {
			this.session=session;
		}
		//将餐品添加到购物车
		public String addtoshopcart() throws Exception {
			//从session中取出购物车,放入Map对象cart中
			Map cart=(Map)session.get("cart");
			//获取当前要添加到购物车的菜品
			Meal meal=mealBiz.getMealByMealId(mealId);
			//如果购物车不存在,则创建购物车(实例化HashMap类),并存入session中
			if(cart==null){
				cart=new HashMap();
				session.put("cart", cart);
			}
			//如果存在购物车,则判断餐品是否在购物车中
			CartItemBean cartItem=(CartItemBean)cart.get(meal.getMealId());
			if(cartItem!=null){
				//如果餐品在购物车中,更新其数量
				cartItem.setQuantity(cartItem.getQuantity()+1);
			}else{
				//否则,创建一个条目到Map中
				cart.put(meal.getMealId(),new CartItemBean(meal,1));
			}
			//页面转到shopCart.jsp,显示购物车
			return "shopCart";
		}	
		
		//更改数量
		public String updateSelectedQuantity() throws Exception {
			//从session中取出购物车,放入Map对象cart中
			Map cart=(Map)session.get("cart");
			CartItemBean cartItem=(CartItemBean)cart.get(mealId);
			cartItem.setQuantity(quantity);
			return "shopCart";
		}
		
		//从购物车中移除指定编号订单
		public String deleteSelectedOrders() throws Exception {
			//从session中取出购物车,放入Map对象cart中
			Map cart=(Map)session.get("cart");
			cart.remove(mealId);
			return "shopCart";
		}	
		
		//清空购物车
		public String clearCart() throws Exception {
			//从session中取出购物车,放入Map对象cart中
			Map cart=(Map)session.get("cart");
			cart.clear();
			return "shopCart";
		}	
		
	}
	//MealAction.java
	public class MealAction extends ActionSupport implements RequestAware {
		
		//定义Meal类型属性,用于封装表单参数
		private Meal meal;	
		public Meal getMeal() {
			return meal;
		}
		public void setMeal(Meal meal) {
			this.meal = meal;
		}
		MealBiz mealBiz;
		public void setMealBiz(MealBiz mealBiz) {
			this.mealBiz = mealBiz;
		}
		MealSeriesBiz mealSeriesBiz;	
		public void setMealSeriesBiz(MealSeriesBiz mealSeriesBiz) {
			this.mealSeriesBiz = mealSeriesBiz;
		}
		//分页实体类
		private Pager pager;
		public Pager getPager() {
			return pager;
		}
		public void setPager(Pager pager) {
			this.pager = pager;
		}
		
		private File doc;                //封装上传文件的属性
		private String docFileName;      //封装上传文件的名称属性
		private String docContentType;   //封装上传文件的类型属性
		
		Map<String, Object> request;
		@Override
		public void setRequest(Map<String, Object> request) {
			this.request=request;		
		}
		
		//获取指定页码、符合查询条件的餐品列表,再转到餐品显示页show.jsp
		public String toShowMeal() throws Exception {		
			int curPage=1;
			if(pager!=null)
				curPage=pager.getCurPage();
			List mealList=null;		
			if(meal!=null){  
				//meal不为空,表示表单中输入了查询条件,此时将获取指定页码、符合查询条件的餐品列表
				mealList=mealBiz.getMealByCondition(meal, curPage);
				//统计符合查询条件的餐品数量,初始化分页类Pager对象,设置perPageRows和rowCount属性
				pager=mealBiz.getPagerOfMeal(meal);
				//将查询条件存入request范围,将作为分页超链接中的参数值
				if((meal.getMealseries()!=null) && (meal.getMealseries().getSeriesId()!=null))
					request.put("seriesId", new Integer(meal.getMealseries().getSeriesId()) );
				if((meal.getMealName()!=null) && !meal.getMealName().equals(""))
					request.put("mealName", meal.getMealName());
			}else{    
				//meal为空,表示没有指定查询条件,此时将获取指定页码的餐品列表
				mealList=mealBiz.getAllMeal(curPage);
				//获取所有菜品数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
				pager=mealBiz.getPagerOfMeal();
			}
			
			//设置Pager对象中的待显示页页码
			pager.setCurPage(curPage);
			//将查询获得的列表存入request范围
			request.put("mealList", mealList);
			//获取菜系列表,存入request范围
			List mealSeriesList=mealSeriesBiz.getMealSeries();
			request.put("mealSeriesList", mealSeriesList);		
			return "toShowMeal";
		}
		
		public String toShowDetails() throws Exception {		
			Meal aMeal=mealBiz.getMealByMealId(meal.getMealId());
			request.put("aMeal", aMeal);		
			return "toShowDetails";
		}
		
		//获取菜系列表,再转到添加餐品页addMeal.jsp
		public String toAddMeal() throws Exception {		
			List mealSeriesList=mealSeriesBiz.getMealSeries();
			request.put("mealSeriesList", mealSeriesList);	
			return "addMeal";
		}
		
		//上传餐品图片、添加餐品信息,再转到toShowMeal
		public String doAddMeal() throws Exception {
			if(docFileName!=null){     //判断是否选择了上传图片
				// 得到当前web工程下的upload目录的在本机的绝对路径,如果没有这个文件夹则会创建        
				String targetDirectory = ServletActionContext.getServletContext().getRealPath("/mealimages");          
				//重命名上传文件         
				String targetFileName = generateFileName(docFileName);          
				//在指定目录创建文件          
				File target = new File(targetDirectory, targetFileName);          
				//把要上传的文件copy过去         
				FileUtils.copyFile(doc, target); 		
				meal.setMealImage(targetFileName);
				mealBiz.addMeal(meal);
			}		
			return "toShowMeal";
		}
		
		//重命名上传文件    
		public String generateFileName(String fileName){          
			String formatDate = new SimpleDateFormat("yyMMddHHmmss").format(new Date());          
			int random = new Random().nextInt(10000);          
			int position = fileName.lastIndexOf(".");          
			String extension = fileName.substring(position);           
			return formatDate + random + extension;      
		}    
		
		
		//获取指定页码、符合查询条件的餐品列表,再转到菜品管理页managemeal.jsp
		public String toManageMeal() throws Exception {		
			int curPage=1;
			if(pager!=null)
				curPage=pager.getCurPage();
			List mealList=null;		
			if(meal!=null){
				mealList=mealBiz.getMealByCondition(meal, curPage);
				pager=mealBiz.getPagerOfMeal(meal);
				if((meal.getMealseries()!=null) && (meal.getMealseries().getSeriesId()!=null))
					request.put("seriesId", new Integer(meal.getMealseries().getSeriesId()) );
				if((meal.getMealName()!=null) && !meal.getMealName().equals(""))
					request.put("mealName", meal.getMealName());
			}else{
				mealList=mealBiz.getAllMeal(curPage);
				//获取所有菜品数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
				pager=mealBiz.getPagerOfMeal();
			}		
			//设置Pager对象中的待显示页页码
			pager.setCurPage(curPage);
			request.put("mealList", mealList);
			//获取菜系列表,存入request范围
			List mealSeriesList=mealSeriesBiz.getMealSeries();
			request.put("mealSeriesList", mealSeriesList);		
			return "managemeal";
		}
		
		//获取要修改的餐品对象,存入request范围,再转到餐品信息修改页
		public String toUpdateMeal() throws Exception {	
			//获取要修改的餐品对象,存入request范围
			Meal updatedMeal=mealBiz.getMealByMealId(meal.getMealId());
			request.put("updatedMeal", updatedMeal);		
			//获取菜系列表,存入request范围
			List mealSeriesList=mealSeriesBiz.getMealSeries();
			request.put("mealSeriesList", mealSeriesList);	
			return "updateMeal";
		}
		
		//执行餐品信息修改,再转到toShowMeal
		public String doUpdateMeal() throws Exception {	
			if(docFileName!=null){
				// 得到当前web工程下的upload目录的在本机的绝对路径,如果没有这个文件夹则会创建        
				String targetDirectory = ServletActionContext.getServletContext().getRealPath("/mealimages");          
				//重命名上传文件         
				String targetFileName = generateFileName(docFileName);          
				//在指定目录创建文件          
				File target = new File(targetDirectory, targetFileName);          
				//把要上传的文件copy过去         
				FileUtils.copyFile(doc, target); 		
				//修改餐品图片
				meal.setMealImage(targetFileName);
			}
			//更新餐品对象
			mealBiz.updateMeal(meal);
			return "toShowMeal";    	
		} 
		
		//处理删除餐品对象请求,再转到toManageMeal
		public String deleteMeal() throws Exception {	
			mealBiz.deleteMeal(meal.getMealId());
			return "toManageMeal";
		}
		
		
		public File getDoc() {
			return doc;
		}
		public void setDoc(File doc) {
			this.doc = doc;
		}
		public String getDocFileName() {
			return docFileName;
		}
		public void setDocFileName(String docFileName) {
			this.docFileName = docFileName;
		}
		public String getDocContentType() {
			return docContentType;
		}
		public void setDocContentType(String docContentType) {
			this.docContentType = docContentType;
		}

	}
	//OrdersAction.java
	public class OrdersAction extends ActionSupport implements RequestAware,SessionAware {
		OrdersBiz ordersBiz;	
		public void setOrdersBiz(OrdersBiz ordersBiz) {
			this.ordersBiz = ordersBiz;
		}
		
		OrderDtsBiz orderDtsBiz;
		public void setOrderDtsBiz(OrderDtsBiz orderDtsBiz) {
			this.orderDtsBiz = orderDtsBiz;
		}
		
		//封装“查看”超链接传递来的参数oid的值
		int oid;
		public int getOid() {
			return oid;
		}
		public void setOid(int oid) {
			this.oid = oid;
		}
		
		//封装manageorders.jsp页面中根据订单号和订单状态查询时传递来的参数值
		private Orders orders;
		public Orders getOrders() {
			return orders;
		}
		public void setOrders(Orders orders) {
			this.orders = orders;
		}
		
		//处理生成新订单请求
		public String addOrders() throws Exception {
			Orders orders=new Orders();
			orders.setOrderState("未处理");
			orders.setOrderTime(new Date());
			Users user=(Users)session.get("user");
			orders.setUsers(user);
			orders.setOrderPrice((Double)session.get("sumPrice"));
			Map cart=(HashMap)session.get("cart");	    
			Iterator iter = cart.keySet().iterator();
			while (iter.hasNext()) {
				Object key = iter.next();
				CartItemBean cartItem = (CartItemBean)cart.get(key);
				Orderdts orderDts=new Orderdts();
				orderDts.setMeal(cartItem.getMeal());
				orderDts.setMealCount(cartItem.getQuantity());
				orderDts.setMealPrice(cartItem.getMeal().getMealPrice());
				orderDts.setOrders(orders);
				orderDtsBiz.addOrderDts(orderDts);
			}
			session.remove("cart");
			return "show";
		}
		
		//分页实体类
		private Pager pager;
		public Pager getPager() {
			return pager;
		}
		public void setPager(Pager pager) {
			this.pager = pager;
		}

		//获取指定用户的订单列表,再转到我的订单页myorders.jsp
		public String toMyOrders() throws Exception {
			Users user=(Users)session.get("user");
			List myOrdersList=ordersBiz.getOrdersByUserId(user.getId());
			request.put("myOrdersList", myOrdersList);
			return "myorders";
		}
		
		//根据订单主表编号获取订单明细列表,再转到我的订单明细页myordersdetails.jsp
		public String toOrdersDetails() throws Exception {
			List ordersDtsList= orderDtsBiz.getOrderDtsByOid(oid);
			request.put("ordersDtsList", ordersDtsList);
			return "toOrdersDetails";
		}
		
		//删除指定编号的订单,再转到toMyOrders
		public String deleteOrders() throws Exception {		
			//调用业务方法从数据表中删除订单及明细
			ordersBiz.deleteOrdersByOid(oid);
			return "toMyOrders";
		}
		
		//获取所有订单列表,再转到订单处理页manageorders.jsp
		public String toManageOrders() throws Exception {
			int curPage=1;
			if(pager!=null)
				curPage=pager.getCurPage();
			List ordersList=null;		
			if(orders!=null){
				//指定查询条件,则获取满足条件、指定页的订单列表
				ordersList=ordersBiz.getOrdersByCondition(orders, curPage);
				pager=ordersBiz.getPagerOfOrders(orders);
				//将查询条件存入request范围,将作为分页超链接中的参数值
				if(orders.getOid()!=null)
					request.put("oid", orders.getOid());
				if((orders.getOrderState()!=null) && !orders.getOrderState().equals(""))
					request.put("orderState", orders.getOrderState());
			}else{
				//没有指定查询条件,获取指定页的订单列表
				ordersList=ordersBiz.getAllOrders(curPage);
				//获取所有菜品数量,用来初始化分页类Pager对象
				pager=ordersBiz.getPagerOfOrders();
			}		
			//设置Pager对象中的待显示页页码
			pager.setCurPage(curPage);
			//将订单列表存入request范围
			request.put("ordersList", ordersList);
			return "manageorders";
		}
		
		//处理订单,再转到toManageOrders
		public String handleOrders() throws Exception {		
			//调用业务方法从数据表中删除订单及明细
			Orders orders=ordersBiz.getOrdersByOid(oid);
			orders.setOrderState("已处理");
			ordersBiz.handleOrders(orders);
			return "toManageOrders";
		}
		

		Map<String, Object> session;
		@Override
		public void setSession(Map<String, Object> session) {
			this.session=session;		
		}

		Map<String, Object> request;
		@Override
		public void setRequest(Map<String, Object> request) {
			this.request=request;		
		}

	}
	//UserAction.java
	public class UserAction extends ActionSupport implements RequestAware,SessionAware {
		//用于封装登录页面登录用户类型(普通用户或Admin)
		private String type;	
		public String getType() {
			return type;
		}
		public void setType(String type) {
			this.type = type;
		}

		//定义用于保存用户登录表单参数的两个属性
		private String loginName;
		private String loginPwd;
		public String getLoginName() {
			return loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		public String getLoginPwd() {
			return loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
		
		//封装注册表单参数
		private  Users user;	
		public Users getUser() {
			return user;
		}
		public void setUser(Users user) {
			this.user = user;
		}

		UserBiz userBiz;	
		public void setUserBiz(UserBiz userBiz) {
			this.userBiz = userBiz;
		}
		
		//登录验证	
		public String validateLogin() throws Exception {
			List list;
			if("userlogin".equals(type)){       //用户登录验证
				Users condition=new Users();
				condition.setLoginName(loginName);
				condition.setLoginPwd(loginPwd);	
				list=userBiz.login(condition);
				if(list.size()>0){
					//将用户对象存入Session
					session.put("user", list.get(0));	
				}
			}
			if("adminlogin".equals(type)){        //Admin登录验证
				Admin condition=new Admin();
				condition.setLoginName(loginName);
				condition.setLoginPwd(loginPwd);	
				list=userBiz.login(condition);
				if(list.size()>0){
					//将用户对象存入Session
					session.put("admin", list.get(0));	
				}
			}
			//转到名为toShowMeal的Action
			return "toShowMeal"; 
		}
		
		//用户注册
		public String register() throws Exception {
			userBiz.addUsers(user);
			return "show";
		}
		
		//修改个人信息
		public String modifyUsers() throws Exception {
			userBiz.modifyUsers(user);
			return "show";
		}
		
		//用户注销
		public String logOut() throws Exception {
			if("userlogout".equals(type)){
				session.remove("user");
			}
			if("adminlogout".equals(type)){
				session.remove("admin");
			}
			return "show";
		}

		Map<String, Object> session;
		@Override
		public void setSession(Map<String, Object> session) {
			this.session=session;
		}
		
		Map<String, Object> request;
		@Override
		public void setRequest(Map<String, Object> request) {
			this.request=request;
		}

	}
	//MealBizImpl.java
	public class MealBizImpl implements MealBiz {

		MealDAO mealDAO;
		public void setMealDAO(MealDAO mealDAO) {
			this.mealDAO = mealDAO;
		}
		
		@Override
		public List getAllMeal(int page) {
			return mealDAO.getAllMeal(page);
		}
		
		@Override
		public Pager getPagerOfMeal() {
			int count= mealDAO.getCountOfAllMeal();
			//使用分页类Pager定义对象
			Pager pager=new Pager();
			//设置pager对象中的perPageRows属性,表示每页显示的记录数
			pager.setPerPageRows(6);
			//设置pager对象中的rowCount属性,表示记录总数
			pager.setRowCount(count);
			//返回pager对象
			return pager;
		}
		
		/*@Override
		public List getMealBySeries(int mealSeries, int page) {
			return mealDAO.getMealBySeries(mealSeries, page);
		}*/
		/*@Override
		public Pager getPagerOfMeal(int mealSeries) {
			int count= mealDAO.getCountOfMeal(mealSeries);
			//使用分页类Pager定义对象
			Pager pager=new Pager();
			//设置pager对象中的perPageRows属性,表示每页显示的记录数
			pager.setPerPageRows(6);
			//设置pager对象中的rowCount属性,表示记录总数
			pager.setRowCount(count);
			//返回pager对象
			return pager;
		}*/
		
		@Override
		public List getMealByCondition(Meal condition, int page) {		
			return mealDAO.getMealByCondition(condition, page);
		}
		
		//统计符合查询条件的餐品数量,初始化分页类Pager对象,设置perPageRows和rowCount属性
		@Override
		public Pager getPagerOfMeal(Meal condition) {
			int count= mealDAO.getCountOfMeal(condition);
			//使用分页类Pager定义对象
			Pager pager=new Pager();
			//设置pager对象中的perPageRows属性,表示每页显示的记录数
			pager.setPerPageRows(6);
			//设置pager对象中的rowCount属性,表示记录总数
			pager.setRowCount(count);
			//返回pager对象
			return pager;
		}
		
		@Override
		public Meal getMealByMealId(int mealId) {
			return mealDAO.getMealByMealId(mealId);
		}
		
		//添加餐品
		@Override
		public void addMeal(Meal meal) {
			mealDAO.addMeal(meal);		
		}
		
		//删除指定编号菜品
		@Override
		public void deleteMeal(int mealId) {		
			Meal meal=mealDAO.getMealByMealId(mealId);
			mealDAO.deleteMeal(meal);
		}

		//修改餐品
		@Override
		public void updateMeal(Meal meal) {
			mealDAO.updateMeal(meal);		
		}
	}
	//MealSeriesBizImpl.java
	public class MealSeriesBizImpl implements MealSeriesBiz {

		MealSeriesDAO mealSeriesDAO;
		
		public void setMealSeriesDAO(MealSeriesDAO mealSeriesDAO) {
			this.mealSeriesDAO = mealSeriesDAO;
		}

		@Override
		public List getMealSeries() {
			return mealSeriesDAO.getMealSeries();
		}

	}
	//OrderDtsBizImpl.java
	public class OrderDtsBizImpl implements OrderDtsBiz {
		OrderDtsDAO orderDtsDAO;	
		public void setOrderDtsDAO(OrderDtsDAO orderDtsDAO) {
			this.orderDtsDAO = orderDtsDAO;
		}
		//生成订单子表(订单明细)
		@Override
		public void addOrderDts(Orderdts dts) {
			orderDtsDAO.addOrderDts(dts);		
		}
		//根据订单主表编号获取订单明细列表
		@Override
		public List getOrderDtsByOid(int oid) {		
			return orderDtsDAO.getOrderDtsByOid(oid);
		}
	}
	//OrdersBizImpl.java
	public class OrdersBizImpl implements OrdersBiz {

		OrdersDAO ordersDAO;
		
		public void setOrdersDAO(OrdersDAO ordersDAO) {
			this.ordersDAO = ordersDAO;
		}
		
		//删除指定编号的订单
		@Override
		public void deleteOrdersByOid(int oid) {
			Orders orders=ordersDAO.getOrdersByOid(oid);	
			ordersDAO.deleteOrders(orders);
		}

		@Override
		public Orders getOrdersByOid(int oid) {
			return ordersDAO.getOrdersByOid(oid);
		}

		//获取指定用户的订单列表
		@Override
		public List getOrdersByUserId(int userId) {
			return ordersDAO.getOrdersByUserId(userId);
		}

		//处理订单
		@Override
		public void handleOrders(Orders orders) {
			ordersDAO.updateOrders(orders);
		}

		//获取指定页显示的订单列表
		@Override
		public List getAllOrders(int page) {
			return ordersDAO.getAllOrders(page);
		}
		
		//获取所有订单数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
		@Override
		public Pager getPagerOfOrders() {
			int count= ordersDAO.getCountOfAllOrders();
			//使用分页类Pager定义对象
			Pager pager=new Pager();
			//设置pager对象中的perPageRows属性,表示每页显示的记录数
			pager.setPerPageRows(6);
			//设置pager对象中的rowCount属性,表示记录总数
			pager.setRowCount(count);
			//返回pager对象
			return pager;
		}

		//获取满足条件、指定页显示的订单列表
		@Override
		public List getOrdersByCondition(Orders condition, int page) {
			return ordersDAO.getOrdersByCondition(condition, page);
		}

		//获取满足条件的订单数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
		@Override
		public Pager getPagerOfOrders(Orders condition) {
			int count= ordersDAO.getCountOfOrders(condition);
			//使用分页类Pager定义对象
			Pager pager=new Pager();
			//设置pager对象中的perPageRows属性,表示每页显示的记录数
			pager.setPerPageRows(6);
			//设置pager对象中的rowCount属性,表示记录总数
			pager.setRowCount(count);
			//返回pager对象
			return pager;
		}
		

	}
	//UserBizImpl.java
	public class UserBizImpl implements UserBiz {

		UserDAO userDAO;
		
		public void setUserDAO(UserDAO userDAO) {
			this.userDAO = userDAO;
		}

		@Override
		public List login(Users condition) {
			return userDAO.search(condition);
		}

		//添加用户
		@Override
		public void addUsers(Users users) {
			userDAO.addUsers(users);		
		}

		//Admin登录验证
		@Override
		public List login(Admin condition) {
			return userDAO.search(condition);
		}

		//修改个人信息
		@Override
		public void modifyUsers(Users users) {
			userDAO.modifyUsers(users);
		}
	}
	//MealBiz.java
	public interface MealBiz {
		//获取指定页显示的餐品列表
		public List getAllMeal(int page);
		//获取所有菜品数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
		public Pager getPagerOfMeal();	
		
		//获取指定菜系和指定页显示的餐品列表
		//public List getMealBySeries(int mealSeries,int page);
		
		//获取指定菜系的菜品数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
		//public Pager getPagerOfMeal(int mealSeries);
		
		//根据查询条件,获取指定页显示的餐品列表
		public List getMealByCondition(Meal condition,int page);
		
		//统计符合查询条件的餐品数量,初始化分页类Pager对象,设置perPageRows和rowCount属性
		public Pager getPagerOfMeal(Meal condition);
		
		//根据编号加载菜品
		public Meal getMealByMealId(int mealId);
		
		//添加餐品
		public void addMeal(Meal meal);
		
		//删除指定编号菜品
		public void deleteMeal(int mealId);
		
		//修改餐品
		public void updateMeal(Meal meal);
		
	}
	//MealSeriesBiz.java
	public interface MealSeriesBiz {
			//获取菜系列表
			public List getMealSeries();
		}
		//OrderDtsBiz.java
		public interface OrderDtsBiz {
		
		//生成订单子表(订单明细)
		public void addOrderDts(Orderdts dts);
		
		//根据订单主表编号获取订单明细列表
		public List getOrderDtsByOid(int oid);	

	}
	//OrdersBiz.java
	public interface OrdersBiz {
			
		//根据订单编号加载订单对象
		public Orders getOrdersByOid(int oid);
		
		//获取指定用户的订单列表
		public List getOrdersByUserId(int userId);
		
		//获取指定页显示的订单列表
		public List getAllOrders(int page);
		
		//获取所有订单数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
		public Pager getPagerOfOrders();	
		
		//获取满足条件、指定页显示的订单列表
		public List getOrdersByCondition(Orders condition,int page);
		
		//获取满足条件的订单数量,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
		public Pager getPagerOfOrders(Orders condition);
		
		//删除指定编号的订单
		public void deleteOrdersByOid(int oid);
		
		//处理订单
		public void handleOrders(Orders orders);	
		
	}
	//UserBiz.java
	public interface UserBiz {
		//用户登录验证
		public List login(Users condition);
		
		//添加用户
		public void addUsers(Users users);
		
		//Admin登录验证
		public List login(Admin condition);
		
		//修改个人信息
		public void modifyUsers(Users users);
	}
	//MealDAOImpl.java
	public class MealDAOImpl implements MealDAO {

		SessionFactory sessionFactory;
		
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}

		//获取指定页显示的餐品列表
		@Override
		public List getAllMeal(int page) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Meal.class);
			c.setFirstResult(6*(page-1));
			c.setMaxResults(6);
			return c.list();
		}

		//统计所有餐品总数
		@Override
		public Integer getCountOfAllMeal() {
			Integer count=null;
			try{
			Session session=sessionFactory.getCurrentSession();
			String hql="select count(s) from Meal s";
			Query query=session.createQuery(hql);
			count= Integer.parseInt(query.uniqueResult().toString()) ;
			}catch(Exception e){
				e.printStackTrace();
			}
			return count;
		}
		/*
		@Override
		public List getMealBySeries(int mealSeries, int page) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Meal.class);
			c.add(Restrictions.eq("mealseries.seriesId", mealSeries));
			c.setFirstResult(6*(page-1));
			c.setMaxResults(6);
			return c.list();
		}*/

		/*@Override
		public Integer getCountOfMeal(int mealSeries) {
			Integer count=null;
			try{
			Session session=sessionFactory.getCurrentSession();
			String hql="select count(s) from Meal s where mealseries.seriesId="+mealSeries;
			Query query=session.createQuery(hql);
			count= Integer.parseInt(query.uniqueResult().toString()) ;
			}catch(Exception e){
				e.printStackTrace();
			}
			return count;
		}*/

		@Override
		public List getMealByCondition(Meal condition, int page) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Meal.class);
			if(condition!=null){
				if(condition.getMealName()!=null && !condition.getMealName().equals("")){
					//按菜名进行筛选
					c.add(Restrictions.like("mealName", condition.getMealName(),MatchMode.ANYWHERE));
				}
				if((condition.getMealseries()!=null) && (condition.getMealseries().getSeriesId()!=null)){
					//按菜系进行筛选
					c.add(Restrictions.eq("mealseries.seriesId", condition.getMealseries().getSeriesId()));
				}
			}
			c.setFirstResult(6*(page-1));
			c.setMaxResults(6);
			return c.list();
		}

		@Override
		public Integer getCountOfMeal(Meal condition) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Meal.class);
			if(condition!=null){
				if(condition.getMealName()!=null && !condition.getMealName().equals("")){
					//按菜名进行筛选
					c.add(Restrictions.like("mealName", condition.getMealName(),MatchMode.ANYWHERE));
				}
				if((condition.getMealseries()!=null) && (condition.getMealseries().getSeriesId()!=null)){
					//按菜系进行筛选
					c.add(Restrictions.eq("mealseries.seriesId", condition.getMealseries().getSeriesId()));
				}
			}
			return c.list().size();
		}

		@Override
		public Meal getMealByMealId(int mealId) {
			Session session=sessionFactory.getCurrentSession();
			return (Meal)session.get(Meal.class, mealId);
		}

		//添加餐品
		@Override
		public void addMeal(Meal meal) {
			Session session=sessionFactory.getCurrentSession();
			session.save(meal);
		}

		//删除菜品
		@Override
		public void deleteMeal(Meal meal) {
			Session session=sessionFactory.getCurrentSession();
			session.delete(meal);
		}

		//修改餐品
		@Override
		public void updateMeal(Meal meal) {
			Session session=sessionFactory.getCurrentSession();
			session.update(meal);		
		}	
	}
	//MealSeriesDAOImpl.java
	public class MealSeriesDAOImpl implements MealSeriesDAO {

		SessionFactory sessionFactory;
		
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		@Override
		public List getMealSeries() {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Mealseries.class);
			return c.list();
		}

	}
	//OrderDtsDAOImpl.java
	public class OrderDtsDAOImpl implements OrderDtsDAO {

		SessionFactory sessionFactory;
		
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		
		//生成订单子表(订单明细)
		@Override
		public void addOrderDts(Orderdts dts) {		
			Session session=sessionFactory.getCurrentSession();
			session.saveOrUpdate(dts);
		}
		
		//根据订单主表编号获取订单明细列表
		@Override
		public List getOrderDtsByOid(int oid) {		
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Orderdts.class);
			c.add(Restrictions.eq("orders.oid", oid));
			return c.list();
		}

	}
	//OrdersDAOImpl.java
	public class OrdersDAOImpl implements OrdersDAO {

		SessionFactory sessionFactory;	
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}	

		//删除订单对象
		@Override
		public void deleteOrders(Orders orders) {
			Session session=sessionFactory.getCurrentSession();		
			session.delete(orders);
		}

		//根据订单编号加载订单对象
		@Override
		public Orders getOrdersByOid(int oid) {
			Session session=sessionFactory.getCurrentSession();
			return (Orders)session.get(Orders.class, oid);
		}

		//获取指定用户的订单列表
		@Override
		public List getOrdersByUserId(int userId) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Orders.class);
			c.add(Restrictions.eq("users.id", userId));		
			return c.list();
		}

		//更新订单对象
		@Override
		public void updateOrders(Orders orders) {
			Session session=sessionFactory.getCurrentSession();
			session.update(orders);
		}

		//获取所有订单
		@Override
		public List getAllOrders(int page) {		
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Orders.class);
			c.setFirstResult(6*(page-1));
			c.setMaxResults(6);
			return c.list();
		}
		
		//统计所有订单总数
		@Override
		public Integer getCountOfAllOrders() {
			Integer count=null;
			try{
			Session session=sessionFactory.getCurrentSession();
			String hql="select count(o) from Orders o";
			Query query=session.createQuery(hql);
			count= Integer.parseInt(query.uniqueResult().toString()) ;
			}catch(Exception e){
				e.printStackTrace();
			}
			return count;
		}
		
		
		//获取满足条件、指定页显示的订单列表
		@Override
		public List getOrdersByCondition(Orders condition, int page) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Orders.class);
			if(condition!=null){
				if((condition.getOid()!=null) && (condition.getOid()>0)){
					//按订单号进行筛选
					c.add(Restrictions.eq("oid", condition.getOid()));
				}
				if((condition.getOrderState()!=null) && !condition.getOrderState().equals("") && !condition.getOrderState().equals("全部")){
					//按订单状态进行筛选
					c.add(Restrictions.eq("orderState", condition.getOrderState()));
				}
			}
			c.setFirstResult(6*(page-1));
			c.setMaxResults(6);
			return c.list();
		}
		
		//统计满足条件的订单总数
		@Override
		public Integer getCountOfOrders(Orders condition) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Orders.class);
			if(condition!=null){
				if((condition.getOid()!=null) && (condition.getOid()>0)){
					//按订单号进行筛选
					c.add(Restrictions.eq("oid", condition.getOid()));
				}
				if((condition.getOrderState()!=null) && !condition.getOrderState().equals("") && !condition.getOrderState().equals("全部")){
					//按订单状态进行筛选
					c.add(Restrictions.eq("orderState", condition.getOrderState()));
				}
			}
			return c.list().size();
		}	
		
	}	
	//UserDAOImpl.java
	public class UserDAOImpl implements UserDAO {

		SessionFactory sessionFactory;	
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		
		@Override
		public List search(Users condition) {
			List list=null;
			//通过sessionFactory获得Session
			Session session=sessionFactory.getCurrentSession();
			//创建Criteria对象
			Criteria c=session.createCriteria(Users.class);
			//使用Example工具类创建示例对象
			Example example=Example.create(condition);
			//为Criteria对象指定示例对象example作为查询条件		
			c.add(example);			
			list= c.list();	  //执行查询,获得结果		
			return list;
		}

		//添加用户
		@Override
		public void addUsers(Users users) {
			Session session=sessionFactory.getCurrentSession();
			session.save(users);
		}

		//Admin登录验证
		@Override
		public List search(Admin condition) {
			List list=null;
			//通过sessionFactory获得Session
			Session session=sessionFactory.getCurrentSession();
			//创建Criteria对象
			Criteria c=session.createCriteria(Admin.class);
			//使用Example工具类创建示例对象
			Example example=Example.create(condition);
			//为Criteria对象指定示例对象example作为查询条件		
			c.add(example);			
			list= c.list();	  //执行查询,获得结果		
			return list;
		}

		//修改个人信息
		@Override
		public void modifyUsers(Users users) {
			Session session=sessionFactory.getCurrentSession();
			session.update(users);
		}

	}
	//MealDAO.java		
	public interface MealDAO {
		//获取指定页显示的菜品列表
		public List getAllMeal(int page);
		
		//统计所有餐品总数
		public Integer getCountOfAllMeal();
		
		//获取指定菜系和指定页显示的餐品列表
		//public List getMealBySeries(int mealSeries,int page);
		
		//统计指定菜系统的餐品总数
		//public Integer getCountOfMeal(int mealSeries);
		
		//根据查询条件,获取指定页显示的餐品列表
		public List getMealByCondition(Meal condition,int page);
		
		//统计符合查询条件的餐品总数
		public Integer getCountOfMeal(Meal condition);
		
		//根据编号加载菜品
		public Meal getMealByMealId(int mealId);
		
		//添加餐品
		public void addMeal(Meal meal);
		
		//删除餐品
		public void deleteMeal(Meal meal);
		
		//修改餐品对象
		public void updateMeal(Meal meal);
		
	}
	//MealSeriesDAO.java		
	public interface MealSeriesDAO {
			//获取菜系列表
			public List getMealSeries();
		}
		//OrderDtsDAO.java
		public interface OrderDtsDAO {
			//生成订单子表(订单明细)
			public void addOrderDts(Orderdts dts);
			
			//根据订单主表编号获取订单明细列表
			public List getOrderDtsByOid(int oid);
		}
		//OrdersDAO.java
		public interface OrdersDAO {
			
		//根据订单编号加载订单对象
		public Orders getOrdersByOid(int oid);
		
		//获取指定用户的订单列表
		public List getOrdersByUserId(int userId);
		
		//获取指定页显示的订单列表
		public List getAllOrders(int page);
		
		//统计所有订单总数
		public Integer getCountOfAllOrders();
		
		//获取符合条件、指定页显示的订单列表
		public List getOrdersByCondition(Orders condition,int page);
		
		//统计符合条件的订单总数
		public Integer getCountOfOrders(Orders condition);   
		
		
		//删除订单对象
		public void deleteOrders(Orders orders);
		
		//更新订单对象
		public void updateOrders(Orders orders);		
		
	}
	//UserDAO.java	
	public interface UserDAO {
		//用户登录验证
		public List search(Users condition);
		
		//添加用户
		public void addUsers(Users users);
		
		//Admin登录验证
		public List search(Admin condition);
		
		//修改个人信息
		public void modifyUsers(Users users);
	}
	//Admin.java
	public class Admin implements java.io.Serializable {
		private Integer id;
		private String loginName;
		private String loginPwd;
		public Admin() {
		}
		public Admin(String loginName, String loginPwd) {
			this.loginName = loginName;
			this.loginPwd = loginPwd;
		}

		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public String getLoginName() {
			return this.loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		public String getLoginPwd() {
			return this.loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
	}
	//CartItemBean.java
	public class CartItemBean implements Serializable {
		private Meal meal;
		private int quantity;	
		public Meal getMeal() {
			return meal;
		}
		public void setMeal(Meal meal) {
			this.meal = meal;
		}
		public int getQuantity() {
			return quantity;
		}
		public void setQuantity(int quantity) {
			this.quantity = quantity;
		}
		public CartItemBean(Meal meal, int quantity) {
			this.meal = meal;
			this.quantity = quantity;
		}	
	}
	//Meal.java
	public class Meal implements java.io.Serializable {
		private Integer mealId;
		private Mealseries mealseries;
		private String mealName;
		private String mealSummarize;
		private String mealDescription;
		private Double mealPrice;
		private String mealImage;
		private Set orderdtses = new HashSet(0);
		public Meal() {
		}
		public Meal(Mealseries mealseries, String mealName, String mealSummarize,
				String mealDescription, Double mealPrice, String mealImage,
				Set orderdtses) {
			this.mealseries = mealseries;
			this.mealName = mealName;
			this.mealSummarize = mealSummarize;
			this.mealDescription = mealDescription;
			this.mealPrice = mealPrice;
			this.mealImage = mealImage;
			this.orderdtses = orderdtses;
		}
		public Integer getMealId() {
			return this.mealId;
		}
		public void setMealId(Integer mealId) {
			this.mealId = mealId;
		}
		public Mealseries getMealseries() {
			return this.mealseries;
		}
		public void setMealseries(Mealseries mealseries) {
			this.mealseries = mealseries;
		}
		public String getMealName() {
			return this.mealName;
		}
		public void setMealName(String mealName) {
			this.mealName = mealName;
		}
		public String getMealSummarize() {
			return this.mealSummarize;
		}
		public void setMealSummarize(String mealSummarize) {
			this.mealSummarize = mealSummarize;
		}
		public String getMealDescription() {
			return this.mealDescription;
		}
		public void setMealDescription(String mealDescription) {
			this.mealDescription = mealDescription;
		}
		public Double getMealPrice() {
			return this.mealPrice;
		}
		public void setMealPrice(Double mealPrice) {
			this.mealPrice = mealPrice;
		}
		public String getMealImage() {
			return this.mealImage;
		}

		public void setMealImage(String mealImage) {
			this.mealImage = mealImage;
		}
		public Set getOrderdtses() {
			return this.orderdtses;
		}
		public void setOrderdtses(Set orderdtses) {
			this.orderdtses = orderdtses;
		}
	}
	//Mealseries.java
	public class Mealseries implements java.io.Serializable {
		private Integer seriesId;
		private String seriesName;
		private Set meals = new HashSet(0);
		public Mealseries() {
		}
		public Mealseries(String seriesName, Set meals) {
			this.seriesName = seriesName;
			this.meals = meals;
		}
		public Integer getSeriesId() {
			return this.seriesId;
		}
		public void setSeriesId(Integer seriesId) {
			this.seriesId = seriesId;
		}
		public String getSeriesName() {
			return this.seriesName;
		}
		public void setSeriesName(String seriesName) {
			this.seriesName = seriesName;
		}
		public Set getMeals() {
			return this.meals;
		}
		public void setMeals(Set meals) {
			this.meals = meals;
		}
	}
	//Orderdts.java
	public class Orderdts implements java.io.Serializable {
		private Integer odid;
		private Meal meal;
		private Orders orders;
		private Double mealPrice;
		private Integer mealCount;
		public Orderdts() {
		}
		public Orderdts(Meal meal, Orders orders, Double mealPrice,
				Integer mealCount) {
			this.meal = meal;
			this.orders = orders;
			this.mealPrice = mealPrice;
			this.mealCount = mealCount;
		}
		public Integer getOdid() {
			return this.odid;
		}
		public void setOdid(Integer odid) {
			this.odid = odid;
		}
		public Meal getMeal() {
			return this.meal;
		}
		public void setMeal(Meal meal) {
			this.meal = meal;
		}
		public Orders getOrders() {
			return this.orders;
		}
		public void setOrders(Orders orders) {
			this.orders = orders;
		}
		public Double getMealPrice() {
			return this.mealPrice;
		}
		public void setMealPrice(Double mealPrice) {
			this.mealPrice = mealPrice;
		}
		public Integer getMealCount() {
			return this.mealCount;
		}
		public void setMealCount(Integer mealCount) {
			this.mealCount = mealCount;
		}
	}
	//Orders.java
	public class Orders implements java.io.Serializable {
		private Integer oid;
		private Users users;
		private Date orderTime;
		private String orderState;
		private Double orderPrice;	
		private Set orderdtses = new HashSet(0);
		public Orders() {
		}
		public Orders(Users users, Date orderTime, String orderState,
				Set orderdtses, Double orderPrice) {
			this.users = users;
			this.orderTime = orderTime;
			this.orderState = orderState;
			this.orderdtses = orderdtses;
			this.orderPrice = orderPrice;
		}
		public Integer getOid() {
			return this.oid;
		}
		public void setOid(Integer oid) {
			this.oid = oid;
		}
		public Users getUsers() {
			return this.users;
		}
		public void setUsers(Users users) {
			this.users = users;
		}
		public Date getOrderTime() {
			return this.orderTime;
		}
		public void setOrderTime(Date orderTime) {
			this.orderTime = orderTime;
		}
		public String getOrderState() {
			return this.orderState;
		}
		public void setOrderState(String orderState) {
			this.orderState = orderState;
		}
		public Double getOrderPrice() {
			return orderPrice;
		}
		public void setOrderPrice(Double orderPrice) {
			this.orderPrice = orderPrice;
		}
		public Set getOrderdtses() {
			return this.orderdtses;
		}
		public void setOrderdtses(Set orderdtses) {
			this.orderdtses = orderdtses;
		}
	}
	//Pager.java
	public class Pager {
		private int curPage;//待显示页
		private int perPageRows ;//一页显示的记录数  
		private int rowCount; //记录总数  
		private int pageCount; //总页数 	
		public int getCurPage() {
			return curPage;
		}
		public void setCurPage(int currentPage) {
			this.curPage = currentPage;
		}
		public int getPerPageRows() {
			return perPageRows;
		}
		public void setPerPageRows(int perPageRows) {
			this.perPageRows = perPageRows;
		}
		public int getRowCount() {
			return rowCount;
		}
		public void setRowCount(int rowCount) {
			this.rowCount = rowCount;
		}
		public int getPageCount() {
			return (rowCount+perPageRows-1)/perPageRows;
		}
	}
	//Users.java
	public class Users implements java.io.Serializable {
		private Integer id;
		private String loginName;
		private String loginPwd;
		private String trueName;
		private String email;
		private String phone;
		private String address;
		private Set orderses = new HashSet(0);
		public Users() {
		}
		public Users(String loginName, String loginPwd, String trueName,
				String email, String phone, String address, Set orderses) {
			this.loginName = loginName;
			this.loginPwd = loginPwd;
			this.trueName = trueName;
			this.email = email;
			this.phone = phone;
			this.address = address;
			this.orderses = orderses;
		}
		public Integer getId() {
			return this.id;
		}
		public void setId(Integer id) {
			this.id = id;
		}
		public String getLoginName() {
			return this.loginName;
		}
		public void setLoginName(String loginName) {
			this.loginName = loginName;
		}
		public String getLoginPwd() {
			return loginPwd;
		}
		public void setLoginPwd(String loginPwd) {
			this.loginPwd = loginPwd;
		}
		public String getTrueName() {
			return this.trueName;
		}
		public void setTrueName(String trueName) {
			this.trueName = trueName;
		}
		public String getEmail() {
			return this.email;
		}
		public void setEmail(String email) {
			this.email = email;
		}
		public String getPhone() {
			return this.phone;
		}
		public void setPhone(String phone) {
			this.phone = phone;
		}	
		public String getAddress() {
			return address;
		}
		public void setAddress(String address) {
			this.address = address;
		}
		public Set getOrderses() {
			return this.orderses;
		}
		public void setOrderses(Set orderses) {
			this.orderses = orderses;
		}
	}
	//Admin.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.restrant.entity.Admin" table="admin" catalog="restrant">
			<id name="id" type="java.lang.Integer">
				<column name="Id" />
				<generator class="native"></generator>
			</id>
			<property name="loginName" type="java.lang.String">
				<column name="LoginName" length="20" />
			</property>
			<property name="loginPwd" type="java.lang.String">
				<column name="LoginPwd" length="20" />
			</property>
		</class>
	</hibernate-mapping>
	//Meal.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.restrant.entity.Meal" table="meal" catalog="restrant">
			<id name="mealId" type="java.lang.Integer">
				<column name="MealId" />
				<generator class="native"></generator>
			</id>
			<many-to-one name="mealseries" class="com.restrant.entity.Mealseries" fetch="select" lazy="false">
				<column name="MealSeriesId" />
			</many-to-one>
			<property name="mealName" type="java.lang.String">
				<column name="MealName" length="20" />
			</property>
			<property name="mealSummarize" type="java.lang.String">
				<column name="MealSummarize" length="250" />
			</property>
			<property name="mealDescription" type="java.lang.String">
				<column name="MealDescription" length="250" />
			</property>
			<property name="mealPrice" type="java.lang.Double">
				<column name="MealPrice" precision="8" />
			</property>
			<property name="mealImage" type="java.lang.String">
				<column name="MealImage" length="20" />
			</property>
			<set name="orderdtses" inverse="true" lazy="false" cascade="delete">
				<key>
					<column name="MealId" />
				</key>
				<one-to-many class="com.restrant.entity.Orderdts" />
			</set>
		</class>
	</hibernate-mapping>
	//Mealseries.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.restrant.entity.Mealseries" table="mealseries" catalog="restrant">
			<id name="seriesId" type="java.lang.Integer">
				<column name="SeriesId" />
				<generator class="native"></generator>
			</id>
			<property name="seriesName" type="java.lang.String">
				<column name="SeriesName" length="10" />
			</property>
			<set name="meals" inverse="true" lazy="false">
				<key>
					<column name="MealSeriesId" />
				</key>
				<one-to-many class="com.restrant.entity.Meal" />
			</set>
		</class>
	</hibernate-mapping>
	//Orderdts.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.restrant.entity.Orderdts" table="orderdts" catalog="restrant">
			<id name="odid" type="java.lang.Integer">
				<column name="ODID" />
				<generator class="native"></generator>
			</id>
			<many-to-one name="meal" class="com.restrant.entity.Meal" fetch="select" lazy="false">
				<column name="MealId" />
			</many-to-one>
			<many-to-one cascade="all" name="orders" class="com.restrant.entity.Orders" fetch="select" lazy="false">
				<column name="OID" />
			</many-to-one>
			<property name="mealPrice" type="java.lang.Double">
				<column name="MealPrice" precision="8" />
			</property>
			<property name="mealCount" type="java.lang.Integer">
				<column name="MealCount" />
			</property>
		</class>
	</hibernate-mapping>
	//Orders.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.restrant.entity.Orders" table="orders" catalog="restrant">
			<id name="oid" type="java.lang.Integer">
				<column name="OID" />
				<generator class="native"></generator>
			</id>
			<many-to-one name="users" class="com.restrant.entity.Users" fetch="select" lazy="false">
				<column name="UserId" />
			</many-to-one>
			<property name="orderTime" type="java.sql.Timestamp">
				<column name="OrderTime" length="19" />
			</property>
			<property name="orderState" type="java.lang.String">
				<column name="OrderState" length="20" />
			</property>
			<property name="orderPrice" type="java.lang.Double">
				<column name="OrderPrice" precision="8" />
			</property>
			<set name="orderdtses" cascade="all" inverse="true" lazy="false">
				<key>
					<column name="OID" />
				</key>
				<one-to-many class="com.restrant.entity.Orderdts" />
			</set>
		</class>
	</hibernate-mapping>
	//Users.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.restrant.entity.Users" table="users" catalog="restrant">
			<id name="id" type="java.lang.Integer">
				<column name="Id" />
				<generator class="native"></generator>
			</id>
			<property name="loginName" type="java.lang.String">
				<column name="LoginName" length="20" />
			</property>
			<property name="loginPwd" type="java.lang.String">
				<column name="LoginPwd" length="20" />
			</property>
			<property name="trueName" type="java.lang.String">
				<column name="TrueName" length="20" />
			</property>
			<property name="email" type="java.lang.String">
				<column name="Email" length="20" />
			</property>
			<property name="phone" type="java.lang.String">
				<column name="Phone" length="20" />
			</property>
			<property name="address" type="java.lang.String">
				<column name="Address" length="50" />
			</property>
			<set name="orderses" inverse="true" lazy="false">
				<key>
					<column name="UserId" />
				</key>
				<one-to-many class="com.restrant.entity.Orders" />
			</set>
		</class>
	</hibernate-mapping>
	//AuthFilter.java
	public class AuthFilter implements Filter {
		@Override
		public void destroy() {
			// TODO Auto-generated method stub
			
		}
		@Override
		public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
				FilterChain filterChain) throws IOException, ServletException {
			HttpServletRequest request=(HttpServletRequest)servletRequest;
			HttpServletResponse response=(HttpServletResponse)servletResponse;
			//获取根目录所对应的绝对路径
			String currentURL=request.getRequestURI();
			HttpSession session=request.getSession(false);
			//如果直接访问购物车shopCart页面则验证
			if(currentURL.indexOf("shopCart.jsp")>-1){
				//判断当前页是否是重定向以后的登录页面,如果是就不判断session
				if(session==null || session.getAttribute("user")==null){
					response.sendRedirect(request.getContextPath()+"/toShowMeal");
					return;
				}
			}
			//加入filter链继续向下执行
			filterChain.doFilter(request, response);
		}
		@Override
		public void init(FilterConfig arg0) throws ServletException {
		}
	}
	//AuthorityInterceptor.java
	public class AuthorityInterceptor extends AbstractInterceptor {
		@Override
		public String intercept(ActionInvocation invocation) throws Exception {
			// 取得请求的Action名
			String name = invocation.getInvocationContext().getName();
			if (name.equals("validateLogin")) {
				// 如果用户想登录,则使之通过
				return invocation.invoke();
			} else {
				// 取得Session
				ActionContext ac = invocation.getInvocationContext();
				Map session = (Map)ac.get(ServletActionContext.SESSION);
				if (session == null) {
					// 如果Session为空,则让用户登陆
					return "login";
				} else {
					Users user = (Users)session.get("user");
					if (user == null) {
						Admin admin=(Admin)session.get("admin");
						if(admin==null){
							// Session不为空,但Session中没有用户信息, 则让用户登陆
							return "login";
						}else{
							// 管理登陆,放行
							return invocation.invoke();
						}                	
						
					} else {
						// 用户登陆,放行
						return invocation.invoke();
					}
				}
			}
		}
	}
	//applicationContext.xml	
	<?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:p="http://www.springframework.org/schema/p"
		xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx.xsd" 
		xmlns:tx="http://www.springframework.org/schema/tx">
		<bean id="dataSource"
			class="org.apache.commons.dbcp.BasicDataSource">
			<property name="driverClassName"
				value="com.mysql.jdbc.Driver" />
			<property name="url"
				value="jdbc:mysql://localhost:3306/restrant">
			</property>
			<property name="username" value="root"></property>
			<property name="password" value="123456"></property>
		</bean>
		<bean id="sessionFactory"
			class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
			<property name="dataSource">
				<ref bean="dataSource" />
			</property>
			<property name="hibernateProperties">
				<props>
					<prop key="hibernate.dialect">
						org.hibernate.dialect.MySQLDialect
					</prop>
				</props>
			</property>
			<property name="mappingResources">
				<list>
					<value>com/restrant/entity/Mealseries.hbm.xml</value>
					<value>com/restrant/entity/Admin.hbm.xml</value>
					<value>com/restrant/entity/Meal.hbm.xml</value>
					<value>com/restrant/entity/Orders.hbm.xml</value>
					<value>com/restrant/entity/Users.hbm.xml</value>
					<value>com/restrant/entity/Orderdts.hbm.xml</value></list>
			</property>
		</bean>
		<!--  定义事务通知    --> 
		<tx:advice id="txAdvice" transaction-manager="transactionManager">	 
		  <tx:attributes>	 
			<tx:method name="*" propagation="REQUIRED" /> 
		  </tx:attributes>
		</tx:advice>
		
		<!--定义切面,并将事务通知和切面组合(定义哪些方法应用事务规则) -->
		<aop:config>
			<!-- 对com.restrant.biz包下的所有类的所有方法都应用事务规则 -->
			<aop:pointcut id="bizMethods" expression="execution(* com.restrant.biz.*.*(..))" /> 
			<!--  将事务通知和切面组合   --> 
			<aop:advisor advice-ref="txAdvice" pointcut-ref="bizMethods" /> 
		</aop:config>
		
		<bean id="transactionManager"
			class="org.springframework.orm.hibernate4.HibernateTransactionManager">
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		<tx:annotation-driven transaction-manager="transactionManager" />
		
		<!-- 定义MealDAOImpl类-->
		<bean id="mealDAO" class="com.restrant.dao.impl.MealDAOImpl">	  
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		<!-- 定义MealBizImpl类,并为其mealDAO属性注入值-->
		<bean id="mealBiz" class="com.restrant.biz.impl.MealBizImpl">	  
			<property name="mealDAO" ref="mealDAO" />
		</bean>
		<!-- 定义MealAction,并为其中属性mealBiz和mealSeriesBiz注入值 -->
		<bean name="mealAction" class="com.restrant.action.MealAction" scope="prototype">
			<property name="mealBiz" ref="mealBiz" />
			<property name="mealSeriesBiz" ref="mealSeriesBiz" />
		</bean>
		
		
		<!-- 定义MealSeriesDAOImpl类-->
		<bean id="mealSeriesDAO" class="com.restrant.dao.impl.MealSeriesDAOImpl">	  
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		<!-- 定义MealSeriesBizImpl类,并为其mealSeriesDAO属性注入值-->
		<bean id="mealSeriesBiz" class="com.restrant.biz.impl.MealSeriesBizImpl">	  
			<property name="mealSeriesDAO" ref="mealSeriesDAO" />
		</bean>

		<!-- 定义CartAction,并为其中属性mealBiz注入值 -->
		<bean name="cartAction" class="com.restrant.action.CartAction" scope="prototype">
			<property name="mealBiz" ref="mealBiz" />
		</bean>
		
		<bean id="ordersDAO" class="com.restrant.dao.impl.OrdersDAOImpl">	  
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		<bean id="ordersBiz" class="com.restrant.biz.impl.OrdersBizImpl">	  
			<property name="ordersDAO" ref="ordersDAO" />    	
		</bean>
		<bean name="ordersAction" class="com.restrant.action.OrdersAction" scope="prototype">
			<property name="ordersBiz" ref="ordersBiz" />
			<property name="orderDtsBiz" ref="orderDtsBiz" />
		</bean>
		
		<bean id="orderDtsDAO" class="com.restrant.dao.impl.OrderDtsDAOImpl">	  
			<property name="sessionFactory" ref="sessionFactory" />
		</bean> 
		<bean id="orderDtsBiz" class="com.restrant.biz.impl.OrderDtsBizImpl">	  
			<property name="orderDtsDAO" ref="orderDtsDAO" />
		</bean>
		
		<!-- 定义UserDAOImpl类-->
		<bean id="userDAO" class="com.restrant.dao.impl.UserDAOImpl">	  
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		<!-- 定义UserBizImpl类,并为其userDAO属性注入值-->
		<bean id="userBiz" class="com.restrant.biz.impl.UserBizImpl">	  
			<property name="userDAO" ref="userDAO" />
		</bean>
		<!-- 定义UserAction,并为其中属性userBiz注入值 -->
		<bean name="userAction" class="com.restrant.action.UserAction" scope="prototype">
			<property name="userBiz" ref="userBiz" />
		</bean>
	</beans>
	//struts.xml	
	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
	<struts>
		<constant name="struts.i18n.encoding" value="gbk"></constant>
		<!-- 定义一个名称为restrant的包,继承struts 2的默认包,指定命名空间为"/" -->
		<package name="restrant" namespace="/" extends="struts-default">
		
		   <!-- 配置拦截器AuthorityInterceptor -->
			<interceptors>
				<interceptor name="loginCheck" class="com.restrant.interceptor.AuthorityInterceptor" />
			</interceptors>
			<!-- 设置全局的返回值,返回首页 -->         
			<global-results>             
				<result name="login" type="redirectAction">/toShowMeal</result>         
			</global-results>     
			
			<!-- 为MealAction类中的toShowMeal方法配置映射 -->
			<action name="toShowMeal" class="mealAction" method="toShowMeal">
				<result name="toShowMeal">/show.jsp</result>			
			</action>
			
			<action name="toManageMeal" class="mealAction" method="toManageMeal">
				<result name="managemeal">/managemeal.jsp</result>		
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />			
			</action>
			
			<action name="toUpdateMeal" class="mealAction" method="toUpdateMeal">
				<result name="updateMeal">/updateMeal.jsp</result>		
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />			
			</action>
			
			<action name="doUpdateMeal" class="mealAction" method="doUpdateMeal">
				<result name="toShowMeal" type="redirectAction">toShowMeal</result>	
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />			
			</action>
			
			<!-- 为MealAction类中的toShowMeal方法配置映射 -->
			<action name="toShowDetails" class="mealAction" method="toShowDetails">
				<result name="toShowDetails">/details.jsp</result>	
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />				
			</action>
			
			<action name="toAddMeal" class="mealAction" method="toAddMeal">
				<result name="addMeal">/addMeal.jsp</result>	
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />				
			</action>
			
			<action name="doAddMeal" class="mealAction" method="doAddMeal">
				<result name="toShowMeal" type="redirectAction">toShowMeal</result>		
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />			
			</action>
			
			<action name="deleteMeal" class="mealAction" method="deleteMeal">
				<result name="toManageMeal" type="redirectAction">toManageMeal</result>		
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />			
			</action>		
			
			<action name="addtoshopcart" class="cartAction" method="addtoshopcart">
				<result name="shopCart">/shopCart.jsp</result>	
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />		
			</action>
			
			<action name="updateSelectedQuantity" class="cartAction" method="updateSelectedQuantity">
				<result name="shopCart">/shopCart.jsp</result>			
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />		
			</action>
			
			<action name="deleteSelectedOrders" class="cartAction" method="deleteSelectedOrders">
				<result name="shopCart">/shopCart.jsp</result>	
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />				
			</action>		
			
			<action name="clearCart" class="cartAction" method="clearCart">
				<result name="shopCart">/shopCart.jsp</result>	
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />				
			</action>
			
			<action name="addOrders" class="ordersAction" method="addOrders">
				<result name="show" type="redirectAction">toShowMeal</result>		
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />				
			</action>
			
			<action name="toOrdersDetails" class="ordersAction" method="toOrdersDetails">
				<result name="toOrdersDetails">/myordersdetails.jsp</result>	
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />				
			</action>		
			
			<action name="toMyOrders" class="ordersAction" method="toMyOrders">
				<result name="myorders">/myorders.jsp</result>	
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />			
			</action>
			
			<action name="deleteOrders" class="ordersAction" method="deleteOrders">
				<result name="toMyOrders" type="redirectAction">toMyOrders</result>		
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />		
			</action>	
			
			<action name="toManageOrders" class="ordersAction" method="toManageOrders">
				<result name="manageorders">/manageorders.jsp</result>	
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />			
			</action>
			
			<action name="handleOrders" class="ordersAction" method="handleOrders">
				<result name="toManageOrders" type="redirectAction">toManageOrders</result>		
				<interceptor-ref name="loginCheck" />	
				<interceptor-ref name="defaultStack" />	
			</action>
			
			<action name="validateLogin" class="userAction" method="validateLogin">
				<result name="toShowMeal" type="redirectAction">toShowMeal</result>
			</action>
			
			<action name="register" class="userAction" method="register">			
				<result name="show" type="redirectAction">toShowMeal</result>	
			</action>
			<action name="logOut" class="userAction" method="logOut">			
				<result name="show" type="redirectAction">toShowMeal</result>	
			</action>
			<action name="modifyUsers" class="userAction" method="modifyUsers">			
				<result name="show" type="redirectAction">toShowMeal</result>	
			</action>
		</package>
	</struts>    
	//styles.css	
	BODY {
		BACKGROUND-POSITION: center 50%;
		BACKGROUND-IMAGE: url()
	}

	HTML {
		TEXT-DECORATION: none
	}

	BODY {
		FONT-SIZE: 12px;
		COLOR: #000000;
		FONT-FAMILY: 宋体
	}

	TD {
		FONT-SIZE: 12px;
		COLOR: #000000;
		FONT-FAMILY: 宋体
	}

	TD {
		FONT-SIZE: 12px;
		COLOR: #000000
	}

	TR {
		FONT-SIZE: 12px;
		COLOR: #000000
	}

	A:link {
		FONT-SIZE: 12px;
		COLOR: #000000;
		TEXT-DECORATION: none
	}

	A:visited {
		FONT-SIZE: 12px;
		COLOR: #000000;
		TEXT-DECORATION: none
	}

	A:active {
		FONT-SIZE: 12px;
		COLOR: #000000;
		TEXT-DECORATION: none
	}

	A:hover {
		FONT-SIZE: 12px;
		COLOR: #000000;
		TEXT-DECORATION: none
	}

	A {
		FONT-SIZE: 12px;
		COLOR: #000000
	}

	.STYLE1 {
		color: #FF0000
	}

	.input {
		BORDER-RIGHT: #333333 1px solid;
		PADDING-RIGHT: 0px;
		BORDER-TOP: #333333 1px solid;
		PADDING-LEFT: 1px;
		FONT-SIZE: 1em;
		PADDING-BOTTOM: 2px;
		VERTICAL-ALIGN: middle;
		BORDER-LEFT: #333333 1px solid;
		PADDING-TOP: 2px;
		BORDER-BOTTOM: #333333 1px solid
		
	}
	//web.xml
	<?xml version="1.0" encoding="UTF-8"?>
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
	  <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	  </listener>
	  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	  </context-param>
	  <filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	  </filter>
	  <filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	  </filter-mapping>
	  
	  <filter>
		<filter-name>AuthFilter</filter-name>
		<filter-class>com.restrant.filter.AuthFilter</filter-class>
	  </filter>
	  <filter-mapping>
		<filter-name>AuthFilter</filter-name>
		<url-pattern>/*</url-pattern>*/
	  </filter-mapping>
	  
	</web-app>
	//addMeal.jsp		
	<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	<head>
	<title>添加餐品</title>
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	</head>

	<body>
		<table width="90%" height="170" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top" align="center">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" /> <br>
						<img src="images/003.gif" width="191" height="8">
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />
					<div style="background-image: url(images/004.gif)">&nbsp;</div>
					<div style="background-color: #FFCC99;" align="center">添加餐品</div> <br />
					<s:form action="doAddMeal" method="post"
						enctype="multipart/form-data">
						<table align="center">
							<s:textfield name="meal.mealName" label="菜名" />
							<s:select name="meal.mealseries.seriesId" label="菜系"
								list="#request.mealSeriesList" listKey="seriesId"
								listValue="seriesName" />
							<s:textfield name="meal.mealSummarize" label="摘要" />
							<s:textfield name="meal.mealDescription" label="介绍" />
							<s:textfield name="meal.mealPrice" label="价格" />
							<s:file name="doc" label="图片" />
							<s:submit value="确定" align="center" />
						</table>
					</s:form></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%> <br></td>
			</tr>
		</table>
	</body>
	</html>
	//details.jsp		
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>
	<html>
	<head>

	<title>餐品详细页面</title>
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	</head>

	<body>
		<table width="90%" height="629" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top" align="center">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" /> <br>
						<img src="images/003.gif" width="191" height="8">
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />
					<div style="background-image: url(images/004.gif)">&nbsp;</div>
					<div style="background-color: #FFCC99;" align="center">餐品详情</div> <br>
					<br />
					<table width="616" border="0" cellspacing="0" cellpadding="3">
						<tr>
							<td width="148"><img
								src="mealimages/${requestScope.aMeal.mealImage}" width="148"
								height="126" /></td>
							<td width="468" valign="top">${requestScope.aMeal.mealName }
								<br /> <span style="text-decoration: line-through; color: gray;">原价:人民币${requestScope.aMeal.mealPrice
									}元</span> <br /> 现价:人民币${requestScope.aMeal.mealPrice*0.9 }元 <br />
								${requestScope.aMeal.mealSummarize }</td>
						</tr>
						<tr>
							<td>编号:${requestScope.aMeal.mealId}</td>
							<td><a href="ShoppingCartServlet?type=add&mid="><img
									src="images/buy_cn.gif" border="0" width="60" height="20" />
							</a></td>
						</tr>
						<tr>
							<td colspan="2">
								<div align="center">详细资料</div></td>
						</tr>
						<tr>
							<td colspan="2">
								<hr /></td>
						</tr>
						<tr>
							<td colspan="2" align="center"><img
								src="mealimages/${requestScope.aMeal.mealImage}" width="228"
								height="169" /> <br /> <br />
								${requestScope.aMeal.mealDescription }</td>
						</tr>
					</table></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%></td>
			</tr>
		</table>
	</body>
	</html>
	//login.jsp		
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>
	<html>
	<head>
	<title>登录页面</title>
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	</head>
	<body>
		<table width="90%" height="629" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" />
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />

					<div style="background-image: url(images/004.gif)">&nbsp;</div>
					<div style="background-color: #FFCC99;" align="center">
						网上订餐系统用户请直接登录</div> <br> <br /> <s:if
						test="#parameters.role[0]=='user'">
						<form action="validateLogin?type=userlogin" method="post"
							name="ufrm">
							<table width="263" border="0" cellspacing="0" cellpadding="4"
								align="center">
								<tr>
									<td width="74">用户名:</td>
									<td width="189"><input type="text" name="loginName"
										style="width: 150;" /></td>
								</tr>
								<tr>
									<td>密 &nbsp;&nbsp;码:</td>
									<td><input type="password" name="loginPwd"
										style="width: 150;" /></td>
								</tr>
								<tr>
									<td>&nbsp;</td>
									<td><input type="submit" name="login" value="登 录" /></td>
								</tr>
							</table>
						</form>
					</s:if> <s:if test="#parameters.role[0]=='admin'">
						<form action="validateLogin?type=adminlogin" method="post"
							name="afrm">
							<table width="263" border="0" cellspacing="0" cellpadding="4"
								align="center">
								<tr>
									<td width="74">登录名:</td>
									<td width="189"><input type="text" name="loginName"
										style="width: 150;" /></td>
								</tr>
								<tr>
									<td>密 &nbsp;&nbsp;码:</td>
									<td><input type="password" name="loginPwd"
										style="width: 150;" /></td>
								</tr>
								<tr>
									<td>&nbsp;</td>
									<td><input type="submit" name="login" value="登 录" /></td>
								</tr>

								<tr>
									<td colspan="2"></td>
								</tr>

							</table>
						</form>
					</s:if></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%> <br> <br> <br></td>
			</tr>
		</table>
	</body>
	</html>
	//managemeal.jsp		
	<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	<head>

	<title>管理餐品</title>
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	</head>

	<body>
		<table width="95%" height="170" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top" align="center">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" /> <br>
						<img src="images/003.gif" width="191" height="8">
						<!-- 菜系循环开始 -->
						<s:iterator id="mealSeries" value="#request.mealSeriesList">
							<br>
							<a
								href="/Restrant/toManageMeal?meal.mealseries.seriesId=${mealSeries.seriesId}">${mealSeries.seriesName
								}</a>
							<br>
						</s:iterator>
						<!-- 菜系循环结束 -->
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />
					<div align="left">
						<s:form theme="simple" method="post" action="toManageMeal">
							<s:label value="输入菜名:" />
							<s:textfield name="meal.mealName" />
							<s:hidden name="meal.mealseries.seriesId"
								value="%{#request.seriesId}" />
							<s:submit value="查询" />

						</s:form>
					</div> <br />
					<div style="background-image: url(images/004.gif)">&nbsp;</div> <br>
				<br>
					<table width="75%" cellspacing="0" cellpadding="4" align="center"
						style="text-align: center; border: 1px #cccccc solid;">
						<tr style="background-color: #CCCCFF;">
							<td>菜系</td>
							<td>菜名</td>
							<td>摘要</td>
							<td>价格</td>
							<td>修改</td>
							<td>删除</td>
						</tr>
						<s:iterator id="mealItem" value="#request.mealList" status="st">
							<tr>
								<td><s:property value="mealseries.seriesName" /></td>
								<td><s:property value="mealName" /></td>
								<td><s:property value="mealSummarize" /></td>
								<td><s:property value="mealPrice" /></td>
								<td><a
									href="/Restrant/toUpdateMeal?meal.mealId=${mealItem.mealId}">修改</a>
								</td>
								<td><a
									href="/Restrant/deleteMeal?meal.mealId=${mealItem.mealId}">删除</a>
								</td>
							</tr>
						</s:iterator>

						<!-- 分页超链接开始 -->
						<table align="right">
							<tr>
								<td width="130"></td>
								<td width="80"><s:if test="pager.curPage>1">
										<A
											href='/Restrant/toManageMeal?pager.curPage=1&meal.mealseries.seriesId=${requestScope.seriesId}&meal.mealName=${requestScope.mealName}'>首页</A>&nbsp;&nbsp;
					<A
											href='/Restrant/toManageMeal?pager.curPage=${pager.curPage-1 }&meal.mealseries.seriesId=${requestScope.seriesId}&meal.mealName=${requestScope.mealName}'>上一页</A>
									</s:if></td>
								<td width="80"><s:if test="pager.curPage < pager.pageCount">
										<A
											href='/Restrant/toManageMeal?pager.curPage=${pager.curPage+1}&meal.mealseries.seriesId=${requestScope.seriesId}&meal.mealName=${requestScope.mealName}'>下一页</A>&nbsp;&nbsp;
					<A
											href='/Restrant/toManageMeal?pager.curPage=${pager.pageCount }&meal.mealseries.seriesId=${requestScope.seriesId}&meal.mealName=${requestScope.mealName}'>尾页</A>
									</s:if></td>
								<td>共${pager.rowCount}记录,共${pager.curPage}/${pager.pageCount}页&nbsp;&nbsp;

								</td>
							</tr>
						</table>

						<!-- 分页超链接结束-->
					</table></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%> <br></td>
			</tr>
		</table>
	</body>
	</html>
	//manageorders.jsp		
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>

	<html>
	<head>
	<title>订单处理</title>
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	</head>

	<body>
		<table width="90%" height="629" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top" align="center">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" /> <br>
						<img src="images/003.gif" width="191" height="8">
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />
					<div align="left">
						<s:form theme="simple" method="post" action="toManageOrders">
							<s:label value="订单号:" />
							<s:textfield name="orders.oid" />
							<s:label value="订单状态:" />
							<s:select list="#{'全部':'全部','未处理':'未处理','已处理':'已处理'}"
								name="orders.orderState" listKey="key" listValue="value" />
							<s:submit value="查询" />
						</s:form>
					</div>

					<div style="background-image: url(images/004.gif)">&nbsp;</div> <br />
					<img src="images/icon_order.gif" align="top" /> 订单列表 <br />
					<hr />
					<table align="center" width="95%" cellspacing="0" cellpadding="3"
						style="text-align: center; border: 1px #cccccc solid;">
						<tr style="background-color: #CCCCFF;">
							<td>订单编号</td>
							<td>订单时间</td>
							<td>订单状态</td>
							<td>总额</td>
							<td>处理</td>
						</tr>
						<s:set var="total" value="0" />
						<s:iterator id="orders" value="#request.ordersList">
							<tr style="background-color: #FFFFFF;">
								<td><s:property value="oid" /></td>
								<td><s:date name="orderTime" format="yyyy-MM-dd HH:mm:ss" />
								</td>
								<td><s:property value="orderState" /></td>
								<td><s:property value="orderPrice" /></td>
								<td><s:if test="#orders.orderState=='未处理'">
										<a href="/Restrant/handleOrders?oid=${oid}"><img
											src="images/handle.gif" width="12" height="12" />
										</a>
									</s:if></td>
							</tr>
						</s:iterator>

						<!-- 分页超链接开始 -->
						<table align="right">
							<tr>
								<td width="130"></td>
								<td width="80"><s:if test="pager.curPage>1">
										<A
											href='/Restrant/toManageOrders?pager.curPage=1&orders.oid=${requestScope.oid}&orders.orderState=${requestScope.orderState}'>首页</A>&nbsp;&nbsp;
					<A
											href='/Restrant/toManageOrders?pager.curPage=${pager.curPage-1 }&orders.oid=${requestScope.oid}&orders.orderState=${requestScope.orderState}'>上一页</A>
									</s:if></td>
								<td width="80"><s:if test="pager.curPage < pager.pageCount">
										<A
											href='/Restrant/toManageOrders?pager.curPage=${pager.curPage+1}&orders.oid=${requestScope.oid}&orders.orderState=${requestScope.orderState}'>下一页</A>&nbsp;&nbsp;
					<A
											href='/Restrant/toManageOrders?pager.curPage=${pager.pageCount }&orders.oid=${requestScope.oid}&orders.orderState=${requestScope.orderState}'>尾页</A>
									</s:if></td>
								<td>共${pager.rowCount}记录,共${pager.curPage}/${pager.pageCount}页&nbsp;&nbsp;

								</td>
							</tr>
						</table>

						<!-- 分页超链接结束-->

					</table> <br /></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%> <br> <br></td>
			</tr>
		</table>
	</body>
	</html>
	//modifyMyInfo.jsp		
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>
	<html>
	<head>
	<title>修改个人信息</title>
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	<script type="text/javascript">
				function usercheck(){
					if(document.ufrm.username.value.length==0){
						alert("请输入用户名");
						return false;
					}
					if(document.ufrm.userpwd.value.length==0){
						alert("请输入密码");
						return false;
					}
					return true;
				}
				function admincheck(){
					if(document.afrm.adminname.value.length==0){
						alert("请输入登录名");
						return false;
					}
					if(document.afrm.adminpwd.value.length==0){
						alert("请输入密码");
						return false;
					}
					return true;
				}
			</script>
	</head>

	<body>
		<table width="90%" height="629" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top" align="center">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" /> <br>
						<img src="images/003.gif" width="191" height="8">
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />

					<div style="background-image: url(images/004.gif)">&nbsp;</div>
					<form action="modifyUsers" method="post" name="frm"
						onsubmit="return check()">
						<table width="100%" cellspacing="0" cellpadding="3" align="center"
							style="text-align: center; border: 1px #cccccc solid;">
							<tr style="background-color: #CCCCFF;">
								<td colspan="2">用户个人信息</td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">登录名称:</td>
								<td align="left"><input type="hidden" name="user.id"
									style="width: 220px;" value="${sessionScope.user.id }" /> <input
									type="text" name="user.loginName" style="width: 220px;"
									value="${sessionScope.user.loginName }" /></td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">登录密码:</td>
								<td align="left"><input type="password" name="user.loginPwd"
									style="width: 220px;" value="${sessionScope.user.loginPwd }" />
								</td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">真实姓名:</td>
								<td align="left"><input type="text" name="user.trueName"
									style="width: 220px;" value="${sessionScope.user.trueName }" />
								</td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">电话号码:</td>
								<td align="left"><input type="text" name="user.phone"
									style="width: 220px;" value="${sessionScope.user.phone }" /></td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">电子邮件:</td>
								<td align="left"><input type="text" name="user.email"
									style="width: 220px;" value="${sessionScope.user.email }" /></td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">默认地址:</td>
								<td align="left"><input type="text" name="user.address"
									style="width: 220px;" value="${sessionScope.user.address }" />
								</td>
							</tr>
							<tr style="background-color: #CCCCFF;">
								<td colspan="2"><input type="submit" value="修改" /></td>
							</tr>
						</table>
					</form>
					</div></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%> <br> <br> <br></td>
			</tr>
		</table>
	</body>
	</html>
	//myorders.jsp		
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>

	<html>
	<head>
	<title>我的订单</title>
	<!-- 
			<link rel="stylesheet" type="text/css" href="CSS/styles.css">
			 -->
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	</head>

	<body>
		<table width="90%" height="629" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top" align="center">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" /> <br>
						<img src="images/003.gif" width="191" height="8">
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />
					<div style="background-image: url(images/004.gif)">&nbsp;</div> <br />
					<img src="images/icon_order.gif" align="top" /> 您的订单中有以下内容 <br />
					<hr />
					<table align="center" width="95%" cellspacing="0" cellpadding="3"
						style="text-align: center; border: 1px #cccccc solid;">
						<tr style="background-color: #CCCCFF;">
							<td>订单编号</td>
							<td>订单时间</td>
							<td>订单状态</td>
							<td>总额</td>
							<td>明细</td>
							<td>删除</td>
						</tr>
						<s:set var="total" value="0" />
						<s:iterator id="myOrders" value="#request.myOrdersList">
							<tr style="background-color: #FFFFFF;">
								<td><s:property value="oid" /></td>
								<td><s:date name="orderTime" format="yyyy-MM-dd HH:mm:ss" />
								</td>
								<td><s:property value="orderState" /></td>
								<td><s:property value="orderPrice" /></td>
								<td><a href="/Restrant/toOrdersDetails?oid=${oid }">查看</a></td>
								<td><s:if test="#myOrders.orderState=='未处理'">
										<a href="/Restrant/deleteOrders?oid=${ oid}">删除</a>
									</s:if></td>
							</tr>
							<s:set var="total" value="#total+orderPrice" />
						</s:iterator>
						<tr style="background-color: #CCCCFF;">
							<td>合计</td>
							<td>-</td>
							<td>-</td>

							<td>¥:<s:property value="#total" /></td>
							<td></td>
							<td></td>
						</tr>
					</table> <br /></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%> <br> <br></td>
			</tr>
		</table>
	</body>
	</html>
	//myordersdetails.jsp		
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>

	<html>
	<head>
	<title>我的订单明细</title>
	<!-- 
			<link rel="stylesheet" type="text/css" href="CSS/styles.css">
			 -->
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	</head>

	<body>
		<table width="90%" height="629" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top" align="center">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" /> <br>
						<img src="images/003.gif" width="191" height="8">
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />

					<div style="background-image: url(images/004.gif)">&nbsp;</div> <br />
					<img src="images/icon_order.gif" align="top" /> 订单明细 <br />
					<hr />
					<table align="center" width="95%" cellspacing="0" cellpadding="3"
						style="text-align: center; border: 1px #cccccc solid;">
						<tr style="background-color: #CCCCFF;">
							<td>明细编号</td>
							<td>菜名</td>
							<td>价格</td>
							<td>数量</td>
							<td>总额</td>
						</tr>
						<s:set var="count" value="0" />
						<s:iterator id="ordersDtsItem" value="#request.ordersDtsList">
							<tr style="background-color: #FFFFFF;">
								<td><s:property value="odid" /></td>
								<td><s:property value="meal.mealName" /></td>
								<td><s:property value="mealPrice" /></td>
								<td><s:property value="mealCount" /></td>
								<td><s:property value="mealPrice*mealCount" /></td>
							</tr>
							<s:set var="count" value="#count+mealPrice*mealCount" />
						</s:iterator>
						<tr style="background-color: #CCCCFF;">
							<td>合计</td>
							<td>-</td>
							<td>-</td>

							<td>-</td>
							<td>¥:<s:property value="#count" /></td>

						</tr>
					</table> <br /></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%> <br> <br></td>
			</tr>
		</table>
	</body>
	</html>
	//register.jsp		
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>
	<html>
	<head>
	<title>用户注册页面</title>
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	<script type="text/javascript">
				function usercheck(){
					if(document.ufrm.username.value.length==0){
						alert("请输入用户名");
						return false;
					}
					if(document.ufrm.userpwd.value.length==0){
						alert("请输入密码");
						return false;
					}
					return true;
				}
				function admincheck(){
					if(document.afrm.adminname.value.length==0){
						alert("请输入登录名");
						return false;
					}
					if(document.afrm.adminpwd.value.length==0){
						alert("请输入密码");
						return false;
					}
					return true;
				}
			</script>
	</head>

	<body>
		<table width="90%" height="629" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top" align="center">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" /> <br>
						<img src="images/003.gif" width="191" height="8">
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />

					<div style="background-image: url(images/004.gif)">&nbsp;</div>
					<form action="register" method="post" name="frm"
						onsubmit="return check()">
						<table width="100%" cellspacing="0" cellpadding="3" align="center"
							style="text-align: center; border: 1px #cccccc solid;">
							<tr style="background-color: #CCCCFF;">
								<td colspan="2">填写注册信息</td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">登录名称:</td>
								<td align="left"><input type="text" name="user.loginName"
									style="width: 220px;" /></td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">登录密码:</td>
								<td align="left"><input type="password" name="user.loginPwd"
									style="width: 220px;" /></td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">真实姓名:</td>
								<td align="left"><input type="text" name="user.trueName"
									style="width: 220px;" /></td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">电话号码:</td>
								<td align="left"><input type="text" name="user.phone"
									style="width: 220px;" /></td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">电子邮件:</td>
								<td align="left"><input type="text" name="user.email"
									style="width: 220px;" /></td>
							</tr>
							<tr>
								<td align="right" style="width: 320px;">默认地址:</td>
								<td align="left"><input type="text" name="user.address"
									style="width: 220px;" /></td>
							</tr>
							<tr style="background-color: #CCCCFF;">
								<td colspan="2"><input name="register" type="submit"
									id="register" value="注册" /></td>
							</tr>
						</table>
					</form>
					</div></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%> <br> <br> <br></td>
			</tr>
		</table>
	</body>
	</html>
	//shopCart.jsp		
	<%@ page language="java" import="java.util.*" pageEncoding="gbk"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>

	<html>
	<head>
	<title>购物车页面</title>
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	</head>

	<body>
		<table width="90%" height="629" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top" align="center">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" /> <br>
						<img src="images/003.gif" width="191" height="8">
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />
					<div style="background-image: url(images/004.gif)">&nbsp;</div> <br />
					<img src="images/zdkf.jpg" align="top" /> 您的购物车中有以下商品 <br />
					<hr />
					<table align="center" width="95%" cellspacing="0" cellpadding="3"
						style="text-align: center; border: 1px #cccccc solid;">
						<tr style="background-color: #CCCCFF;">
							<td>编号</td>
							<td>商品名称</td>
							<td>单价</td>
							<td>数量</td>
							<td>金额</td>
							<td>删除</td>
						</tr>
						<s:set var="sumPrice" value="0" />
						<s:iterator id="cartItem" value="#session.cart">
							<tr style="background-color: #FFFFFF;">
								<td><s:property value="value.meal.mealId" /></td>
								<td><s:property value="value.meal.mealName" /></td>
								<td>¥<s:property value="value.meal.mealPrice" /></td>
								<td><input type="text" value="${value.quantity}" size="10"
									onchange="window.location='updateSelectedQuantity?mealId=${value.meal.mealId}&quantity='+this.value;">
								</td>
								<td>¥<s:property value="value.quantity*value.meal.mealPrice" />
								</td>
								<td><a
									href="deleteSelectedOrders?mealId=${value.meal.mealId}">删除</a></td>
							</tr>
							<s:set var="sumPrice"
								value="#sumPrice+value.quantity*value.meal.mealPrice" />
						</s:iterator>
						<tr style="background-color: #CCCCFF;">
							<td>合计</td>
							<td>-</td>
							<td>-</td>
							<td>-</td>
							<td>¥:<s:property value="#sumPrice" /> <s:set
									var="sumPrice" value="#sumPrice" scope="session" /></td>
							<td>-</td>
						</tr>
					</table> <br />
					<table width="300" cellspacing="0" cellpadding="4" align="center"
						style="text-align: center; border: 1px #cccccc solid;">
						<tr style="background-color: #CCCCFF;">
							<td><a href="/Restrant/clearCart">清空购物车</a></td>
							<td><a href="/Restrant/toShowMeal">继续购物</a></td>
							<td><a href="/Restrant/addOrders">生成订单</a></td>
						</tr>
					</table></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%> <br></td>
			</tr>
		</table>
	</body>
	</html>
	//show.jsp		
	<%@ page language="java" import="java.util.*" pageEncoding="GBK"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	<head>

	<title>餐品列表显示</title>
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	</head>

	<body>
		<table width="95%" height="170" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top" align="center">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" /> <br>
						<img src="images/003.gif" width="191" height="8">
						<!-- 菜系循环开始 -->
						<s:iterator id="mealSeries" value="#request.mealSeriesList">
							<br>
							<a
								href="/Restrant/toShowMeal?meal.mealseries.seriesId=${mealSeries.seriesId}">${mealSeries.seriesName
								}</a>
							<br>
						</s:iterator>
						<!-- 菜系循环结束 -->
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />
					<div align="left">
						<s:form theme="simple" method="post" action="toShowMeal">
							<s:label value="输入菜名:" />
							<s:textfield name="meal.mealName" />
							<!-- 通过隐藏表单域保存用户选择过的菜系编号,可根据餐品名称和菜系组合查询 -->
							<s:hidden name="meal.mealseries.seriesId"
								value="%{#request.seriesId}" />
							<s:submit value="查询" />
						</s:form>
					</div> <br />
					<div style="background-image: url(images/004.gif)">&nbsp;</div>
					<div style="background-color: #FFCC99;" align="right">
						<a href="shopCart.jsp"><img src="images/lcart_cn.gif"
							width="97" height="30" border="0" /> </a>
					</div> <br />
					<table cellpadding="5" cellspacing="1" style="font-size: 12px;">
						<!-- 餐品循环开始 -->
						<s:iterator id="mealItem" value="#request.mealList" status="st">
							<s:if test="#st.getIndex()%3==0">
								<tr>
							</s:if>
							<td><a
								href="/Restrant/toShowDetails?meal.mealId=${mealItem.mealId}"><img
									src="mealimages/${mealItem.mealImage }" width="148" height="126"
									border="0" /> </a></td>
							<td>
								<div>
									${ mealItem.mealId} : ${ mealItem.mealName} <br /> <span
										style="text-decoration: line-through; color: gray;">原价:人民币${
										mealItem.mealPrice}元</span> <br /> 现价:人民币 ${ mealItem.mealPrice*0.9}
									元
								</div> <a href="/Restrant/toShowDetails?meal.mealId=${mealItem.mealId}"><img
									src="images/detail_cn.gif" border="0" width="60" height="20" />
							</a> <a href="/Restrant/addtoshopcart?mealId=${mealItem.mealId }"><img
									src="images/buy_cn.gif" border="0" width="60" height="20" />
							</a></td>
							<s:if test="#st.getIndex()%3==2">
								</tr>
							</s:if>
						</s:iterator>
						<!-- 餐品循环开始 -->

						<!-- 分页超链接开始 -->
						<table align="right">
							<tr>
								<td width="130"></td>
								<td width="80"><s:if test="pager.curPage>1">
										<A
											href='/Restrant/toShowMeal?pager.curPage=1&meal.mealseries.seriesId=${requestScope.seriesId}&meal.mealName=${requestScope.mealName}'>首页</A>&nbsp;&nbsp;
										<A
											href='/Restrant/toShowMeal?pager.curPage=${pager.curPage-1 }&meal.mealseries.seriesId=${requestScope.seriesId}&meal.mealName=${requestScope.mealName}'>上一页</A>
									</s:if></td>
								<td width="80"><s:if test="pager.curPage < pager.pageCount">
										<A
											href='/Restrant/toShowMeal?pager.curPage=${pager.curPage+1}&meal.mealseries.seriesId=${requestScope.seriesId}&meal.mealName=${requestScope.mealName}'>下一页</A>&nbsp;&nbsp;
										<A
											href='/Restrant/toShowMeal?pager.curPage=${pager.pageCount }&meal.mealseries.seriesId=${requestScope.seriesId}&meal.mealName=${requestScope.mealName}'>尾页</A>
									</s:if></td>
								<td>共${pager.rowCount}记录,共${pager.curPage}/${pager.pageCount}页&nbsp;&nbsp;

								</td>
							</tr>
						</table>
						<!-- 分页超链接结束-->

					</table></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%> <br></td>
			</tr>
		</table>
	</body>
	</html>
	//updateMeal.jsp			
	<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
	<%@ taglib uri='/struts-tags' prefix='s'%>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	<head>
	<title>修改餐品</title>
	<link rel="stylesheet" href="/Restrant/css/styles.css" type="text/css" />
	</head>

	<body>
		<table width="90%" height="170" border="0" cellpadding="0"
			cellspacing="0" align="center">
			<tr>
				<td width="200" height="101"><img src="images/jb_logo.jpg"
					width="64" height="32" /> <strong><span
						style="font-size: 20px;">网上订餐系统</span> </strong></td>
				<td width="640" style="padding-left: 40px;"></td>
			</tr>
			<tr>
				<td height="41" colspan="2"
					style="background-image: url(images/001.gif);" align="center">
					| <a href="/Restrant/toShowMeal">网站首页</a> | <s:if
						test="(#session.admin==null) && (#session.user==null)">
						<a href="register.jsp">用户注册</a> |
						<a href="login.jsp?role=user">用户登录</a> |
						<a href="login.jsp?role=admin">Admin登录</a> |
						</s:if> <s:if test="#session.user!=null">
						<a href="modifyMyInfo.jsp">修改个人信息</a> |
						<a href="shopCart.jsp">我的购物车</a> |
						<a href="/Restrant/toMyOrders">我的订单</a> |
						<a href="/Restrant/logOut?type=userlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.user.trueName }</font>
					</s:if> <s:if test="#session.admin!=null">
						<a href="/Restrant/toAddMeal">添加餐品</a> |
						<a href="/Restrant/toManageMeal">管理餐品</a> |
						<a href="/Restrant/toManageOrders">订单处理</a> |
						<a href="/Restrant/logOut?type=adminlogout">注销</a> &nbsp;&nbsp; &nbsp;&nbsp;
						<font style="color: red">欢迎您:${sessionScope.admin.loginName
							}</font>
					</s:if></td>
			</tr>
			<tr>
				<td valign="top" align="center">
					<p>
						<img src="images/left_top.jpg" width="215" height="100" /> <br>
						<img src="images/003.gif" width="191" height="8">
				</td>
				<td valign="top" width="80%"><img src="images/001.jpg"
					width="595" height="72" /> <br />
					<div style="background-image: url(images/004.gif)">&nbsp;</div>
					<div style="background-color: #FFCC99;" align="center">修改餐品</div> <br />
					<s:form action="doUpdateMeal" method="post"
						enctype="multipart/form-data">
						<table align="center">
							<s:hidden name="meal.mealId"
								value="%{#request.updatedMeal.mealId}" />
							<s:textfield name="meal.mealName" label="菜名"
								value="%{#request.updatedMeal.mealName}" />
							<s:select name="meal.mealseries.seriesId" label="菜系"
								value="%{#request.updatedMeal.mealseries.seriesId}"
								list="#request.mealSeriesList" listKey="seriesId"
								listValue="seriesName" />
							<s:textfield name="meal.mealSummarize" label="摘要"
								value="%{#request.updatedMeal.mealSummarize}" />
							<s:textfield name="meal.mealDescription" label="介绍"
								value="%{#request.updatedMeal.mealDescription}" />
							<s:textfield name="meal.mealPrice" label="价格"
								value="%{#request.updatedMeal.mealPrice}" />
							<s:hidden name="meal.mealImage"
								value="%{#request.updatedMeal.mealImage}" />
							<s:file name="doc" label="图片" />
							<s:submit value="确定" align="center" />
						</table>
					</s:form></td>
			</tr>
			<tr>
				<td colspan="2" align="center"><br>
					<hr width=100%> <br></td>
			</tr>
		</table>
	</body>
	</html>
	//sql
	DROP TABLE IF EXISTS `admin`;
	CREATE TABLE `admin` (
	  `Id` int(4) NOT NULL AUTO_INCREMENT,
	  `LoginName` varchar(20) DEFAULT NULL,
	  `LoginPwd` varchar(20) DEFAULT NULL,
	  PRIMARY KEY (`Id`)
	) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- Records of admin
	-- ----------------------------
	INSERT INTO `admin` VALUES ('1', 'admin', '123456');

	-- ----------------------------
	-- Table structure for `meal`
	-- ----------------------------
	DROP TABLE IF EXISTS `meal`;
	CREATE TABLE `meal` (
	  `MealId` int(4) NOT NULL AUTO_INCREMENT,
	  `MealSeriesId` int(4) DEFAULT NULL,
	  `MealName` varchar(20) DEFAULT NULL,
	  `MealSummarize` varchar(250) DEFAULT NULL,
	  `MealDescription` varchar(250) DEFAULT NULL,
	  `MealPrice` decimal(8,2) DEFAULT NULL,
	  `MealImage` varchar(20) DEFAULT NULL,
	  PRIMARY KEY (`MealId`),
	  KEY `MealSeriesId` (`MealSeriesId`),
	  CONSTRAINT `meal_ibfk_1` FOREIGN KEY (`MealSeriesId`) REFERENCES `mealseries` (`SeriesId`)
	) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- Records of meal
	-- ----------------------------
	INSERT INTO `meal` VALUES ('1', '1', '雪梨肉肘棒', '味鲜香甜咸,肘棒不腻', '味鲜香甜咸,肘棒不腻', '10.00', '01.jpg');
	INSERT INTO `meal` VALUES ('2', '1', '素锅烤鸭肉', '颜色鲜艳,酷似鸭肉,鲜香不腻。', '颜色鲜艳,酷似鸭肉,鲜香不腻。', '20.00', '02.jpg');
	INSERT INTO `meal` VALUES ('3', '1', '烤花肉揽桂鱼', '味道特鲜,白中泛红,佐以姜末、香醋,尤胜一等。', ' 烤花揽桂鱼,是运用孔府菜的传统独特工艺味,道特鲜,白中泛红,佐以姜末、香醋,尤胜一等。', '15.00', '03.jpg');
	INSERT INTO `meal` VALUES ('4', '1', '泰安肉三美豆腐', '汤汁乳白而鲜,豆腐软滑,白菜鲜嫩,清淡爽口。', '“泰安三美豆腐”是泰安风味名菜。泰安产的白菜、豆腐和泰山泉水,历来被誉为“泰安三美”。泰安白菜个儿大心实,质细无筋;泰安豆腐,浆细质纯,嫩而不老;泰山泉水,清甜爽口,杂质少', '8.00', '04.jpg');
	INSERT INTO `meal` VALUES ('5', '1', '落叶琵琶肉虾', '外型美观,鲜香味美。', ' 外型美观,鲜香味美。 ', '14.00', '05.jpg');
	INSERT INTO `meal` VALUES ('6', '1', '肉冬菜肉末', '味鲜香适口,下饭便菜。', '味鲜香适口,下饭便菜。', '12.00', '06.jpg');
	INSERT INTO `meal` VALUES ('7', '1', '糖醋红柿椒', '色红美,味鲜香。', '色红美,味鲜香。', '8.00', '07.jpg');
	INSERT INTO `meal` VALUES ('8', '2', '芹黄烧鱼条', '色泽金黄润亮,鱼肉鲜嫩味香。', '色泽金黄润亮,鱼肉鲜嫩味香。', '15.00', '08.jpg');
	INSERT INTO `meal` VALUES ('9', '2', '巴国玉米糕肉', '风味浓、口感奇、品种多', '风味浓、口感奇、品种多,信手拈来,皆为佳品。', '13.00', '09.jpg');
	INSERT INTO `meal` VALUES ('10', '2', '酥皮龙虾', '色泽黄绿相衬,协调雅致,外酥内嫩,鲜香爽口', '酥皮龙虾成菜配以西兰花和蒜薹花,使色泽更加丰富,口感多样,诱人食欲。', '20.00', '10.jpg');
	INSERT INTO `meal` VALUES ('11', '1', '香煎茄片', '色泽红亮,口感似鱼 ', '色泽红亮,口感似鱼 ', '9.00', '11.jpg');
	INSERT INTO `meal` VALUES ('12', '1', '金陵片皮鸭', '此菜深红明亮,皮脆,肉滑,分两次上桌,滋味各异', '此菜深红明亮,皮脆,肉滑,分两次上桌,滋味各异,原为江苏风味,传入广东有较长历史,在制法上已有不少变化,现已成为粤菜名品。', '10.00', '12.jpg');

	-- ----------------------------
	-- Table structure for `mealseries`
	-- ----------------------------
	DROP TABLE IF EXISTS `mealseries`;
	CREATE TABLE `mealseries` (
	  `SeriesId` int(4) NOT NULL AUTO_INCREMENT,
	  `SeriesName` varchar(10) DEFAULT NULL,
	  PRIMARY KEY (`SeriesId`)
	) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- Records of mealseries
	-- ----------------------------
	INSERT INTO `mealseries` VALUES ('1', '鲁菜');
	INSERT INTO `mealseries` VALUES ('2', '川菜');
	INSERT INTO `mealseries` VALUES ('3', '粤菜');
	INSERT INTO `mealseries` VALUES ('4', '苏菜');
	INSERT INTO `mealseries` VALUES ('5', '闽菜');
	INSERT INTO `mealseries` VALUES ('6', '浙菜');
	INSERT INTO `mealseries` VALUES ('7', '湘菜');
	INSERT INTO `mealseries` VALUES ('8', '徽菜');
	INSERT INTO `mealseries` VALUES ('9', '西餐');
	INSERT INTO `mealseries` VALUES ('10', '西点');
	INSERT INTO `mealseries` VALUES ('11', '药膳');
	INSERT INTO `mealseries` VALUES ('12', '私房菜');

	-- ----------------------------
	-- Table structure for `orderdts`
	-- ----------------------------
	DROP TABLE IF EXISTS `orderdts`;
	CREATE TABLE `orderdts` (
	  `ODID` int(4) NOT NULL AUTO_INCREMENT,
	  `OID` int(4) DEFAULT NULL,
	  `MealId` int(4) DEFAULT NULL,
	  `MealPrice` decimal(8,2) DEFAULT NULL,
	  `MealCount` int(4) DEFAULT NULL,
	  PRIMARY KEY (`ODID`),
	  KEY `OID` (`OID`),
	  KEY `MealId` (`MealId`),
	  CONSTRAINT `orderdts_ibfk_1` FOREIGN KEY (`OID`) REFERENCES `orders` (`OID`),
	  CONSTRAINT `orderdts_ibfk_2` FOREIGN KEY (`MealId`) REFERENCES `meal` (`MealId`)
	) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- Records of orderdts
	-- ----------------------------
	INSERT INTO `orderdts` VALUES ('18', '9', '1', '10.00', '1');
	INSERT INTO `orderdts` VALUES ('19', '9', '2', '20.00', '1');
	INSERT INTO `orderdts` VALUES ('20', '10', '1', '10.00', '2');
	INSERT INTO `orderdts` VALUES ('21', '10', '2', '20.00', '3');
	INSERT INTO `orderdts` VALUES ('22', '11', '2', '20.00', '2');
	INSERT INTO `orderdts` VALUES ('23', '11', '4', '8.00', '1');
	INSERT INTO `orderdts` VALUES ('24', '12', '2', '20.00', '3');
	INSERT INTO `orderdts` VALUES ('25', '12', '4', '8.00', '1');

	-- ----------------------------
	-- Table structure for `orders`
	-- ----------------------------
	DROP TABLE IF EXISTS `orders`;
	CREATE TABLE `orders` (
	  `OID` int(4) NOT NULL AUTO_INCREMENT,
	  `UserId` int(4) DEFAULT NULL,
	  `OrderTime` datetime DEFAULT NULL,
	  `OrderState` varchar(20) DEFAULT NULL,
	  `OrderPrice` decimal(8,2) DEFAULT NULL,
	  PRIMARY KEY (`OID`),
	  KEY `UserId` (`UserId`),
	  CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`UserId`) REFERENCES `users` (`Id`)
	) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- Records of orders
	-- ----------------------------
	INSERT INTO `orders` VALUES ('9', '1', '2014-05-04 16:07:44', '未处理', '30.00');
	INSERT INTO `orders` VALUES ('10', '1', '2014-05-04 18:54:17', '未处理', '80.00');
	INSERT INTO `orders` VALUES ('11', '1', '2014-05-05 17:30:16', '未处理', '48.00');
	INSERT INTO `orders` VALUES ('12', '2', '2014-05-05 17:52:48', '未处理', '68.00');

	-- ----------------------------
	-- Table structure for `users`
	-- ----------------------------
	DROP TABLE IF EXISTS `users`;
	CREATE TABLE `users` (
	  `Id` int(4) NOT NULL AUTO_INCREMENT,
	  `LoginName` varchar(20) DEFAULT NULL,
	  `LoginPwd` varchar(20) DEFAULT NULL,
	  `TrueName` varchar(20) DEFAULT NULL,
	  `Email` varchar(20) DEFAULT NULL,
	  `Phone` varchar(20) DEFAULT NULL,
	  `Address` varchar(50) DEFAULT NULL,
	  PRIMARY KEY (`Id`)
	) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- Records of users
	-- ----------------------------
	INSERT INTO `users` VALUES ('1', 'zhangsan', '123456', '张三', 'user@163.com', '13200000001', '江苏南京X区X小区X栋001');
	INSERT INTO `users` VALUES ('2', 'zs', 'zs', 'zs', 'zs', 'zs', 'zs');
	INSERT INTO `users` VALUES ('3', 'lisi', 'lisi', 'lisi', 'lisi', 'lisi', 'lisi');
	INSERT INTO `users` VALUES ('4', 'user', 'user', '', '', '', '');
//网上银行系统
	//目录结构
		src
			com.netbank
				action
					AdminAction.java
					FileAction.java
					PersoninfoAction.java
					Transaction.java
					UserAction.java
				biz
					impl
						PersoninfoBizImpl.java
						TransactionBizImpl.java
						UserBizImpl.java
					PersoninfoBiz.java
					TransactionBiz.java
					UserBiz.java
				dao
					impl
						PersoninfoDAOImpl.java
						TransactionDAOImpl.java
						UserDAOImpl.java
					PersoninfoDAO.java
					TransactionDAO.java
					UserDAO.java
				entity
					Account.java
					Admin.java
					Pager.java
					Password.java
					Personinfo.java
					Status.java
					TransactionLog.java
					TransactionType.java
					Account.hbm.xml
					Admin.hbm.xml
					Personinfo.hbm.xml
					Status.hbm.xml
					TransactionLog.hbm.xml
					TransactionType.hbm.xml
				applicationContext.xml	
				struts-file.xml	
				struts.xml	
			WebContent
				admin
					add.jsp
					changepwd.jsp
					left.jsp
					main.jsp
					manage.jsp
					users.jsp
				css	
					admin.css
				style	
					default.css
					style.css
				WEB-INF	
					web.xml
				changepwd.jsp
				checklogin.jsp
				deposit.jsp
				down.html
				header.jsp
				index.jsp
				information.jsp
				left.jsp
				login.jsp
				main.jsp
				message.jsp
				modify.jsp
				transactionlog.jsp
				transfer.jsp
				upload.jsp
				withdrawal.jsp
	//AdminAction.java
	public class AdminAction extends ActionSupport implements RequestAware,
			SessionAware {
		//定义通过@Resource注解注入的属性userBiz,可省略set方法
		@Resource private UserBiz userBiz;
		//定义通过@Resource注解注入的属性personinfoBiz,可省略set方法	
		@Resource private PersoninfoBiz personinfoBiz;
		Map<String, Object> request;
		public void setRequest(Map<String, Object> request) {
			this.request=request;
		}
		Map<String, Object> session;
		public void setSession(Map<String, Object> session) {
			this.session=session;
		}
		//定义Admin类型对象,用于封装Admin登录等页面的表单参数
		private Admin admin;		
		private Account account;	
		//定义Personinfo类型对象,用于封装页面表单参数
		private Personinfo personinfo;
		private Password pwd;
		//用来封装从"启用"、"冻结"和"删除"按钮传递来的参数
		private int id;
		private Status status;	
		/**
		 * 对登录页面进行验证,检查用户名和密码是否正确
		 */
		public void validateLogin(){
			//调用业务方法,根据username获取Admin
			Admin a=userBiz.getAdmin(admin.getUsername());
			if(a==null){
				this.addFieldError("username", "用户名不存在");
			}else{
				if(!admin.getPassword().equals(a.getPassword())){
					this.addFieldError("password", "密码不正确");
				}
				admin=a;
			}
		}	
		/**
		 * 登录
		 * @return
		 */
		public String login(){
			
			if(admin!=null){
				session.put("admin",admin);
				return "success";
			}
			return "login";
		}
		
		/**
		 * 查询账户
		 * @return
		 */
		public String listUsers(){
			//调用业务方法,根据账户状态获取个人信息,状态为0表示获取所有客户
			List users=personinfoBiz.searchPersoninfo(status);
			request.put("users",users);
			return "users";
			
		}
		
		//注销
		public String logout(){
			session.remove("admin");
			return "login";
		}
		
		/**
		 * 对开户页面进行校验,验证用户名是否已存在、一张身份证只能拥有一个账户
		 */
		public void validateKaihu(){
			if(userBiz.getAccount(account.getUsername())!=null){
				request.put("message", "用户名已存在");
			}
			//获取满足条件的个人信息,这里的条件为开户页面中填写的身份证号
			List list = personinfoBiz.searchPersoninfo(personinfo);
			//如果所填写的身份证号在个人信息中已存在,则提示错误信息
			if(list.size()>0){
				this.addFieldError("personinfo.cardid", "一张身份证只能拥有一个账户");
			}		
		}	
		//开户
		public String kaihu(){
			//调用业务方法,向账户表Account中添加账户
			userBiz.addAccount(account);
			//调用业务方法,向个人信息表personinfo添加个人信息
			account = userBiz.getAccount(account.getUsername());
			personinfo.setAccount(account);
			personinfoBiz.add(personinfo);
			request.put("message", "添加成功");
			return "message";		
		}
		
		/**
		 * 对修改密码页面进行验证
		 */
		public void validateChangepwd(){
			admin=(Admin)session.get("admin");
			if(!pwd.getOldpwd().equals(admin.getPassword())){
				this.addFieldError("pwd.oldpwd", "密码不正确");
			}
			if(!pwd.getNewpwd().equals(pwd.getConfirmpwd())){
				this.addFieldError("pwd.confirmpwd", "两次密码不一致");
			}
		}	
		//修改密码
		public String changepwd(){
			admin.setPassword(pwd.getNewpwd());
			if(userBiz.modifyAdmin(admin)){
				session.put("admin",admin);
				request.put("message", "密码修改成功!");
				return "message";
			}
			request.put("message", "密码修改失败!");
			return "message";
		}
		
		/**
		 * 删除账户
		 */	
		public String del(){
			//调用业务方法,删除账户,同时进行级联删除
			userBiz.delAccount(id);
			return "list";
		}
		/**
		 * 查询账户
		 */	
		public String search(){
			List users=personinfoBiz.searchPersoninfo(personinfo);
			request.put("users",users);
			return "users";
		}
		/**
		 * 启用账户
		 * @return
		 */
		public String enabled(){
			userBiz.enabled(id);
			return "list";
		}
		/**
		 * 冻结账户
		 * @return
		 */
		public String locking(){
			userBiz.locking(id);
			return "list";
		}	
		
		public int getId() {
			return id;
		}
		public void setId(int id) {
			this.id = id;
		}
		public Admin getAdmin() {
			return admin;
		}
		public void setAdmin(Admin admin) {
			this.admin = admin;
		}
		public Account getAccount() {
			return account;
		}
		public void setAccount(Account account) {
			this.account = account;
		}
		public Personinfo getPersoninfo() {
			return personinfo;
		}
		public void setPersoninfo(Personinfo personinfo) {
			this.personinfo = personinfo;
		}
		public Password getPwd() {
			return pwd;
		}
		public void setPwd(Password pwd) {
			this.pwd = pwd;
		}
		public Status getStatus() {
			return status;
		}
		public void setStatus(Status status) {
			this.status = status;
		}
	}
	//FileAction.java
	public class FileAction extends ActionSupport implements RequestAware,
			SessionAware{
		private Map<String, Object> request;
		private Map<String, Object> session;
		private String result;
		
		public String getResult() {
			return result;
		}


		String realPath=ServletActionContext.getServletContext().getRealPath("/upload");
		String contextPath=ServletActionContext.getServletContext().getContextPath();
		String contextName=ServletActionContext.getServletContext().getServletContextName();
		
		private File image;
		private String imageFileName;
		private Date date;
		
		
		public String addImages()throws IOException{
			if(image!=null){
			File file=new File(realPath);
			if(!file.exists())
				file.mkdirs();
			FileUtils.copyFile(image, new File(file,imageFileName));
			request.put("message", "文件上传成功!<br><a href='upload.jsp'  title='继续上传'>[继续上传]</a>");
			return "message";
			}
			request.put("message", "您没有上传文件!<br><a href='javascript: history.go(-1)' >[返回]</a>");
			//result="../upload.jsp";
			return "message";
		}


		public File getImage()  {
			
			return image;
		}

		public void setImage(File image) {
			this.image = image;
		}
		public String getImageFileName() {
			return imageFileName;
		}

		public void setImageFileName(String imageFileName) {
			this.imageFileName = imageFileName;
		}

		public Date getDate() {
			return date;
		}


		public void setDate(Date date) {
			this.date = date;
		}


		public void setRequest(Map<String, Object> request) {
			this.request=request;

		}

		public void setSession(Map<String, Object> session) {
			this.session=session;
		}


		public String getContextName() {
			return contextName;
		}


		public String getContextPath() {
			return contextPath;
		}


		public String getRealPath() {
			return realPath;
		}

	}
	//PersoninfoAction.java
	public class PersoninfoAction extends ActionSupport implements RequestAware,SessionAware {
		//定义通过@Resource注解注入的属性personinfoBiz,可省略set方法
		@Resource private PersoninfoBiz personinfoBiz;
		Map<String, Object> request;
		Map<String, Object> session;	
		private Personinfo personinfo;
		
		/**
		 * 修改个人信息
		 * @return
		 */
		public String modify(){
			//从session中获取保存的个人信息对象
			Personinfo per=(Personinfo) session.get("personinfo");
			//使用modify.jsp页面表单参数更新个人信息对象中的属性
			per.setAddress(personinfo.getAddress());
			per.setAge(personinfo.getAge());
			per.setCardid(personinfo.getCardid());
			per.setRealname(personinfo.getRealname());
			per.setSex(personinfo.getSex());
			per.setTelephone(personinfo.getTelephone());
			//将个人信息更新到数据库中
			if(personinfoBiz.modifyPersoninfo(per)){
				//更新成功后,将个人信息对象重新存入session保存
				session.put("personinfo",per);
				request.put("message", "修改成功!");
				return "message";
			}			
			request.put("message", "修改失败!");
			return "message";
		}
		
		/**
		 * 修改个人信息页面校验
		 */
		public void validateModify() {
			if("".equals(personinfo.getTelephone().trim())){
				personinfo.setTelephone("电话不详");
			}
			if(!(personinfo.getAge()>18&&personinfo.getAge()<100)){
				addFieldError("personinfo.age", "年龄不符");
			}
			if(!Pattern.compile("^\\d{17}(\\d|x)$").matcher(personinfo.getCardid().toString()).matches()){
				addFieldError("personinfo.cardId", "身份证格式不正确");
			}
			if(!"电话不详".equals(personinfo.getTelephone().trim())&&!Pattern.compile("^(?:1[358]\\d{9}|\\d{3,4}-\\d{8,9})$").matcher(personinfo.getTelephone()).matches()){
				addFieldError("personinfo.telephone", "电话格式不正确");
			}
		}
		
		public Personinfo getPersoninfo() {
			return personinfo;
		}
		public void setPersoninfo(Personinfo personinfo) {
			this.personinfo = personinfo;
		}
		
		public void setRequest(Map<String, Object> request) {
			this.request=request;

		}

		public void setSession(Map<String, Object> session) {
			this.session=session;

		}

	}
	//Transaction.java
	public class Transaction extends ActionSupport implements RequestAware,SessionAware {
		//使用UserBiz接口声明属性并添加set方法用于依赖注入
		private UserBiz userBiz;
		public void setUserBiz(UserBiz userBiz) {
			this.userBiz = userBiz;
		}
		
		//使用transactionBiz接口声明属性并添加set方法用于依赖注入
		private TransactionBiz transactionBiz;
		public void setTransactionBiz(TransactionBiz transactionBiz) {
			this.transactionBiz = transactionBiz;
		}	
		
		private Map<String, Object> request;
		public void setRequest(Map<String, Object> request) {
			this.request=request;
		}
		
		private Map<String, Object> session;
		public void setSession(Map<String, Object> session) {
			this.session=session;
			account=(Account)session.get("user");
		}
		
		//声明Account类型属性
		private Account account;
		
		//定义TransactionLog对象并添加get和set方法,用于封装页面表单参数
		private TransactionLog log;
		public TransactionLog getLog() {
			return log;
		}
		public void setLog(TransactionLog log) {
			this.log = log;
		}
		
		//分页实体类
		private Pager pager;
		public Pager getPager() {
			return pager;
		}
		public void setPager(Pager pager) {
			this.pager = pager;
		}
		
		/**
		 * 显示交易记录
		 * @return
		 */	
		public String list(){
			//获取待显示页页码
			int curPage=pager.getCurPage();
			//根据待显示页页码和账户对象获取交易记录
			List<TransactionLog> logs = transactionBiz.getLogs(account,curPage);		
			//获得账户的交易记录总数,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性
			pager=transactionBiz.getPagerOfLogs(account);
			//设置Pager对象中的待显示页页码
			pager.setCurPage(curPage);
			request.put("logs", logs);
			return "success";
		}
		
		/**
		 * 转账
		 * @return
		 */
		public String transfer(){
			//调用自定义方法isEnable判断账户是否冻结
			if(isEnable()){
				//使用执行isEnable方法从session中重新获取的账户对象,给交易信息对象log中关联的账户对象属性赋值
				log.setAccount(account);
				session.put("user", account);
				//调用业务方法,更新转账方和入账方的账户表Accout中的余额,并在交易信息表transaction_log中添加记录
				return isSuccess(transactionBiz.transfer(log));
			}
			return "message";		
		}
		
		/***
		 * 存款
		 * @return
		 */
		public String deposit(){
			//调用自定义方法isEnable判断账户是否冻结
			if(isEnable()){
				//使用执行isEnable方法从session中重新获取的账户对象,给交易信息对象log中关联的账户对象属性赋值
				log.setAccount(account);
				session.put("user", account);
				//调用业务方法,更新账户表Accout中的余额,并在交易信息表transaction_log中添加记录
				return isSuccess(transactionBiz.deposit(log));
			}
			return "message";
		}
		
		/**
		 * 取款
		 * @return
		 */
		public String withdrawal(){
			调用自定义方法isEnable判断账户是否冻结
			if(isEnable()){
				//使用执行isEnable方法从session中重新获取的账户对象,给交易信息对象log中关联的账户对象属性赋值
				log.setAccount(account);
				session.put("user", account);
				//调用业务方法,更新账户表Accout中的余额,并在交易信息表transaction_log中添加记录
				return isSuccess(transactionBiz.withdrawal(log));
			}
			return "message";
		}
		
		/**
		 * 判断账户是否冻结
		 * @return
		 */
		private boolean isEnable(){
			//从session中重新获取Account对象,该对象在登录成功时已保存到session中
			userBiz.reflush(account);
			if(account.getStatus().getName().equals("冻结")){
				request.put("message", "对不起!该账户也被冻结,无法进行相关操作<br>");
				return false;
			}
			return true;
		}
		
		//根据执行结果,显示操作成功或失败信息
		private String isSuccess(boolean flag){
				if(flag)
				{ 
					request.put("message","操作成功!");
					return "message";
				}
				request.put("message","操作失败!<a href='javascript:history.go(-1)'>返回</a>");
				return "message";
			
		}
		
		@Override
		public void validate() {
			super.validate();
		}
		
		/**
		 * 取款页面校验,用于判断账户余额是否充足
		 */
		public void validateWithdrawal(){
			//比较取款页面输入的金额与账户余额
			if(log.getTrMoney()>account.getBalance()){
				this.addFieldError("log.trMoney","您的账户余额不足!");
			}
		}
		
		/**
		 * 转账页面校验,判断是否给本人账户转账、入账账户是否存在及转账账户余额是否充足
		 */
		public void validateTransfer(){
			if(log.getOtherid().intValue()==account.getAccountid().intValue()){
				this.addFieldError("log.otherid","您不能转账给自己!");
			}
			if(userBiz.getAccount(log.getOtherid())==null){
				this.addFieldError("log.otherid","该账户不存在!");
			}
			if(log.getTrMoney()>account.getBalance()){
				this.addFieldError("log.trMoney","您的账户余额不足!");
			}
		}
		

		
		public TransactionBiz getTransactionBiz() {
			return transactionBiz;
		}	
		public UserBiz getUserBiz() {
			return userBiz;
		}

	}
	//UserAction.java
	public class UserAction extends ActionSupport implements RequestAware,SessionAware {
		//定义通过@Resource注解注入的属性userBiz,可省略set方法
		@Resource private UserBiz userBiz;
		Map<String, Object> request;
		Map<String, Object> session;
		//定义Account类型对象,用于封装登录表单参数
		private Account account;
		private Personinfo personinfo;
		private Password pwd;
		
		public String logout(){
			session.remove("user");
			session.remove("personinfo");
			return "login";
		}
		

		/**
		 * 执行页面客户登录请求
		 * @return
		 */
		public String login(){
			//根据关联关系,从账户对象中获取个人信息对象
			personinfo=(Personinfo) account.getPersoninfos().iterator().next();
			//将账户对象存入session
			session.put("user", account);
			//将该账户个人信息对象存入session
			session.put("personinfo",personinfo);
			//页面转发
			return "success";
		}
		
		/**
		 * 执行修改密码请求
		 * @return
		 */
		public String changepwd(){
				account.setPassword(pwd.getNewpwd());
				if(userBiz.modifyAccount(account)){
					session.put("user", account);
					request.put("message", "密码修改成功!");
					return "message";
				}
				request.put("message", "密码修改失败!");
				return "message";
			
		}
		
		/**
		 * 修改密码页面验证
		 */
		public void validateChangepwd(){
			account=(Account) session.get("user");
			if(!pwd.getOldpwd().equals(account.getPassword())){
				this.addFieldError("pwd.oldpwd", "密码不正确");
			}
			if(!pwd.getNewpwd().equals(pwd.getConfirmpwd())){
				this.addFieldError("pwd.confirmpwd", "两次密码不一致");
			}
		}
		
		/**
		 * 登录表单校验,并实现根据用户名获取账户对象
		 */
		public void validateLogin(){
			Account a = userBiz.getAccount(account.getUsername());
			if(a==null){
				this.addFieldError("username", "用户名不存在");
			}else{
				if(!account.getPassword().equals(a.getPassword())){
					this.addFieldError("password", "密码不正确");
				}
			}
			account=a;		
		}

		public Personinfo getPersoninfo() {
			return personinfo;
		}
		public void setPersoninfo(Personinfo personinfo) {
			this.personinfo = personinfo;
		}
		public Account getAccount() {
			return account;
		}
		public void setAccount(Account account) {
			this.account = account;
		}
		
		public Password getPwd() {
			return pwd;
		}

		public void setPwd(Password pwd) {
			this.pwd = pwd;
		}

		public void setRequest(Map<String, Object> request) {
			this.request=request;
		}

		public void setSession(Map<String, Object> session) {
			this.session=session;
		}

	}
	//PersoninfoBizImpl.java
	//使用@Transactional注解实现事务管理
	@Transactional
	public class PersoninfoBizImpl implements PersoninfoBiz {
		//使用PersoninfoDao接口定义对象,并添加set方法用于依赖注入
		PersoninfoDAO personinfoDao;
		public void setPersoninfoDao(PersoninfoDAO personinfoDao) {
			this.personinfoDao = personinfoDao;
		}
		//使用UserDao接口定义对象,并添加set方法用于依赖注入
		UserDAO userDao;
		public void setUserDao(UserDAO userDao) {
			this.userDao = userDao;
		}
		
		/**
		 * 修改个人信息
		 */
		public boolean modifyPersoninfo(Personinfo personinfo) {
			personinfoDao.modifyPersoninfo(personinfo);
			return true;
		}
		
		/**
		 * 添加个人信息
		 */
		public boolean add(Personinfo personinfo) {
			return personinfoDao.add(personinfo);
		}
		
		/**
		 * 查询个人信息
		 */
		public List getAllPersoninfo() {
			return personinfoDao.getAllPersoninfo();
		}
		
		/**
		 * 根据条件获取个人信息
		 */
		public List searchPersoninfo(Personinfo personinfo) {
			return personinfoDao.searchPersoninfo(personinfo);
		}
		
		/**
		 * 根据账户状态获取个人信息,状态为0表示获取所有客户
		 */
		public List searchPersoninfo(Status status)
		{
			List users =new ArrayList();
			if(status.getId()!=0){		
				//如果账户状态编号不为0,则根据编号获取相应客户记录
				status=userDao.getStatus(status.getId());
				users=personinfoDao.searchPersoninfo(status);
			}else{
				//如果账户状态编号等于0,则获取所有客户记录
				users= personinfoDao.getAllPersoninfo();
			}
			return users;
		}
	}
	//TransactionBizImpl.java
	//使用@Transactional注解实现事务管理
	@Transactional
	public class TransactionBizImpl implements TransactionBiz {
		//使用TransactionDao接口声明属性,并添加set方法用于依赖注入
		private TransactionDAO transactionDao;
		public void setTransactionDao(TransactionDAO transactionDao) {
			this.transactionDao = transactionDao;
		}
		
		//使用UserDao接口声明属性,并添加set方法用于依赖注入
		private UserDAO userDao;
		public void setUserDao(UserDAO userDao) {
			this.userDao = userDao;
		}
		
		/**
		 * 获取交易记录
		 */
		public List getLogs(Account account,int page) {		
			return transactionDao.getLogs(account,page);
		}
		
		/**
		 * 转账
		 */	
		@Transactional(propagation=Propagation.REQUIRED,isolation=Isolation.READ_COMMITTED)
		public boolean transfer(TransactionLog log) {
			//获取入账方账户对象
			Account other=userDao.getAccount(log.getOtherid());
			//获取转账方账户对象
			Account self=log.getAccount();
			if(other!=null){
				//修改转账方账户余额
				self.setBalance(log.getAccount().getBalance()-log.getTrMoney());
				//修改入账方账户余额
				other.setBalance(other.getBalance()+log.getTrMoney());
				//将转账方账户余额更新到数据表Account
				userDao.updateAccount(self);
				//将入账方账户余额更新到数据表Account
				userDao.updateAccount(other);
				//根据交易类型获取交易类型对象
				TransactionType type = transactionDao.getTransactionType("转账");
				log.setTransactionType(type);
				//向数据表transaction_log中添加交易记录
				return  transactionDao.addLog(log);
			}
			return false;		
		}
		
		/**
		 * 存款
		 */
		public boolean deposit(TransactionLog log) {
			//从交易信息对象log中取出账户对象
			Account self=log.getAccount();
			//将账户余额与存款金额相加
			self.setBalance(log.getAccount().getBalance()+log.getTrMoney());
			//更新账户表Account,修改账户余额
			userDao.updateAccount(self);
			//根据交易类型获取交易类型对象
			TransactionType type = transactionDao.getTransactionType("存款");
			log.setTransactionType(type);
			log.setOtherid(self.getAccountid());
			//向数据表transaction_log中添加交易记录
			return transactionDao.addLog(log);
		}
		
		/**
		 * 取款
		 */
		public boolean withdrawal(TransactionLog log){
			//从交易信息对象log中取出账户对象
			Account self=log.getAccount();
			//将账户余额与取款金额相减
			self.setBalance(log.getAccount().getBalance()-log.getTrMoney());
			//更新账户表Account,修改账户余额
			userDao.updateAccount(self);
			//根据交易类型获取交易类型对象
			TransactionType type = transactionDao.getTransactionType("取款");
			log.setTransactionType(type);
			log.setOtherid(self.getAccountid());
			//向数据表transaction_log中添加交易记录
			return transactionDao.addLog(log);
		}
		
		/**
		 * 获得账户的交易记录总数,用来初始化分页类Pager对象,
		 * 并设置其perPageRows和rowCount属性
		 */
		public Pager getPagerOfLogs(Account account) {
			//从数据表Transaction_Log中获取与账户相关的交易记录数
			int count=transactionDao.getCountOfLogs(account);
			//使用分页类Pager定义对象
			Pager pager=new Pager();
			//设置pager对象中的perPageRows属性,表示每页显示的记录数
			pager.setPerPageRows(10);
			//设置pager对象中的rowCount属性,表示记录总数
			pager.setRowCount(count);
			//返回pager对象
			return pager;
		}
		
		public TransactionDAO getTransactionDao() {
			return transactionDao;
		}
		
		public UserDAO getUserDao() {
			return userDao;
		}
		
	}
	//UserBizImpl.java
	//使用@Transactional注解实现事务管理
	@Transactional
	public class UserBizImpl implements UserBiz {
		//使用UserDao接口声明对象,并添加set方法,用于依赖注入
		UserDAO userDao;	
		public void setUserDao(UserDAO userDao) {
			this.userDao = userDao;
		}

		//修改账户	
		public boolean modifyAccount(Account account) {
			return userDao.updateAccount(account);
		}
		
		//根据账户ID获取账户
		@Transactional(readOnly=true)
		public Account getAccount(int accountid) {
			return userDao.getAccount(accountid);
		}
		
		//根据username获取账户
		public Account getAccount(String username) {
			return userDao.getAccount(username);
		}
		
		//根据username获取Admin
		public Admin getAdmin(String username) {
			return userDao.getAdmin(username);
		}
		
		//获得所有账户
		public List getAllAccounts() {
			return userDao.getAllAcconts();
		}
		
		//添加账户	
		public boolean addAccount(Account account) {
			Status status=userDao.getStatus("启用");
			account.setStatus(status);
			return userDao.addAccount(account);
		}
		
		//修改Admin
		public boolean modifyAdmin(Admin admin) {
			return userDao.modifyAdmin(admin);
		}
		/**
		 * 删除用户
		 */
		public boolean delAccount(int id) {
			//根据账户id获取账户
			Account account=userDao.getAccount(id);
			//删除账户对象,同时执行级联删除
			return userDao.delAccount(account);
		}
		/**
		 * 查询账户
		 */
		public Account searchAccounts(Account account) {
			return userDao.searchAccounts(account);
		}
		/**
		 * 获取状态
		 */
		public Status getStatus(String name) {
			return userDao.getStatus(name);
		}

		public Status getStatus(int id) {
			return userDao.getStatus(id);
		}
		
		/**
		 * 启用账户
		 */
		public void enabled(int id) {
			//根据账户编号获取账户对象
			Account account = userDao.getAccount(id);
			//修改账户对象的状态属性,设置为启用
			Status status = userDao.getStatus("启用");
			account.setStatus(status);
			//更新账户
			userDao.updateAccount(account);		
		}
		
		/**
		 * 冻结账户
		 */
		public void locking(int id) {
			//根据账户编号获取账户对象
			Account account = userDao.getAccount(id);
			//修改账户对象的状态属性,设置为冻结
			Status status = userDao.getStatus("冻结");		
			account.setStatus(status);
			//更新账户
			userDao.updateAccount(account);
			
		}

		public void reflush(Account account) {
			userDao.reflush(account);		
		}

	}
	//PersoninfoBiz.java
	public interface PersoninfoBiz {
		//修改个人信息
		public boolean modifyPersoninfo(Personinfo personinfo);
		
		//添加个人信息
		public boolean add(Personinfo personinfo);

		//获取全部个人信息
		public List getAllPersoninfo();
		
		//根据条件查询个人信息
		public List searchPersoninfo(Personinfo personinfo);
		
		//根据账户状态获取个人信息
		public List searchPersoninfo(Status status);
	}
	//TransactionBiz.java
	public interface TransactionBiz {

		//根据获取交易记录
		public List getLogs(Account account,int page);

		//转账
		public boolean transfer(TransactionLog log);
		
		//存款
		public boolean deposit(TransactionLog log);
		
		//取款
		public boolean withdrawal(TransactionLog log);	
		
		//获得账户的交易记录总数,用来初始化分页类Pager对象,并设置其perPageRows和rowCount属性	 
		public Pager getPagerOfLogs(Account account);
	}
	//UserBiz.java
	public interface UserBiz {

		/**
		 * 添加账户
		 * @param account
		 * @return
		 */
		public boolean addAccount(Account account);
		
		/**
		 * 删除账户
		 */
		public boolean delAccount(int id);

		/**
		 * 修改账户
		 * @param account
		 * @return
		 */
		public abstract boolean modifyAccount(Account account);
		
		
		/**
		 * 查询账户
		 */
		public Account searchAccounts(Account account);
		
		/**
		 * 根据账户id获取账户对象
		 * @param accountid
		 * @return
		 */
		@Transactional(readOnly = true)
		public Account getAccount(int accountid);
		
		//根据账户名称获取账户
		public Account getAccount(String username);
		
		public List getAllAccounts();
		/**
		 * 启用账户
		 */
		public void enabled(int id);
		/**
		 * 冻结账户
		 */
		public void locking(int id);
		
		//根据名称获取账户状态对象
		public Status getStatus(String name);
		
		public Status getStatus(int id);
		

		//修改Admin
		public boolean modifyAdmin(Admin admin);
		
		//根据username获取Admin
		public abstract Admin getAdmin(String username);

		public abstract void reflush(Account account);

	}
	//PersoninfoDAOImpl.java
	public class PersoninfoDAOImpl implements PersoninfoDAO {

		SessionFactory sessionFactory;	
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		/**
		 * 修改个人信息
		 */
		public void modifyPersoninfo(Personinfo personinfo) {
			Session session=sessionFactory.getCurrentSession();
			session.update(personinfo);		
		}

		/**
		 * 添加个人信息
		 */
		public boolean add(Personinfo personinfo) {
			Session session=sessionFactory.getCurrentSession();
			session.save(personinfo);
			return true;
		}
		
		/**
		 * 查询全部用户信息
		 */
		public List getAllPersoninfo() {
			Session session=sessionFactory.getCurrentSession();
			String hql="from Personinfo";		
			Query query = session.createQuery(hql);
			return query.list();
		}
		
		/**
		 * 根据账户状态获取用户信息
		 */
		public List searchPersoninfo(Status status) {
			Session session=sessionFactory.getCurrentSession();
			String hql="from Personinfo p where p.account.status.id="+status.getId();		
			Query query = session.createQuery(hql);
			return query.list();
		}		
		
		/**
		 * 根据条件查询个人信息
		 */
		public List searchPersoninfo(Personinfo personinfo) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Personinfo.class);
			if(personinfo.getRealname()!=null&&!"".equals(personinfo.getRealname())){
				if(personinfo.getCardid()!=null){
					c.add(Restrictions.or(Restrictions.eq("realname",personinfo.getRealname()),Restrictions.eq("cardid",personinfo.getCardid())));
				}else{
					c.add(Restrictions.like("realname",personinfo.getRealname(),MatchMode.ANYWHERE));
				}					
			}
			c.addOrder(Order.asc("id"));
			return c.list();
		}

	}
	//TransactionDAOImpl.java
	public class TransactionDAOImpl implements TransactionDAO{
		
		SessionFactory sessionFactory;	
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}
		
		/**
		 * 向数据表transaction_log中添加记录
		 */
		public boolean addLog(TransactionLog log) {
			Session session=sessionFactory.getCurrentSession();
			session.save(log);
			return true;
		}
		
		/**
		 * 获取交易记录
		 */
		public List getLogs(Account account,int page) {
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(TransactionLog.class);
			c.add(Restrictions.or(Restrictions.eq("account", account), Restrictions.eq("otherid", account.getAccountid())));
			c.addOrder(Order.desc("id"));
			c.setFirstResult(10*(page-1));
			c.setMaxResults(10);
			return c.list();
			
		}
		
		/**
		 * 根据交易类型名称获取交易类型对象
		 */
		public TransactionType getTransactionType(String name) {
			Session session=sessionFactory.getCurrentSession();
			String hql="from TransactionType t where t.name='"+name+"'";
			Query query=session.createQuery(hql);
			return (TransactionType) query.uniqueResult();		
		}
		
		/**
		 * 从数据表Transaction_Log中获取与账户相关的交易记录数
		 */
		public Integer getCountOfLogs(Account account){
			Session session=sessionFactory.getCurrentSession();
			String sql="select count(*) from Transaction_Log where (accountid="
				+account.getAccountid()+" or otherid="+account.getAccountid()+")";
			Query query=session.createSQLQuery(sql);
			Integer count= Integer.parseInt(query.uniqueResult().toString()) ;
			return count;
		}	
	}
	//UserDAOImpl.java
	public class UserDAOImpl implements UserDAO {
		
		SessionFactory sessionFactory;	
		public void setSessionFactory(SessionFactory sessionFactory) {
			this.sessionFactory = sessionFactory;
		}	

		//修改账户
		public boolean updateAccount(Account account) {
			Session session=sessionFactory.getCurrentSession();
			session.merge(account);
			return true;
		}

		//根据username获取Admin
		public Admin getAdmin(String username) {
			Session session=sessionFactory.getCurrentSession();
			String hql="from Admin as a where a.username='"+username+"'";		
			Query query = session.createQuery(hql);
			return (Admin) query.uniqueResult();
		}
		
		//修改Admin
		public boolean modifyAdmin(Admin admin) {
			Session session=sessionFactory.getCurrentSession();
			session.update(admin);
			return true;
		}
		
		
		//根据查询条件查询用户
		public Account searchAccounts(Account account){		
			Session session=sessionFactory.getCurrentSession();
			Criteria c=session.createCriteria(Account.class);
			if((account.getUsername()!=null) && !"".equals(account.getUsername())){
				c.add(Restrictions.like("username", account.getUsername(),MatchMode.ANYWHERE));
			}
			c.addOrder(Order.asc("accountid"));
			return (Account)c.list().get(0);
		}
		
		//根据账户ID获取账户对象
		public Account getAccount(int id){
			Session session=sessionFactory.getCurrentSession();
			return (Account) session.get(Account.class, id);
		}
		
		
		//根据username获取账户
		public Account getAccount(String username) {
			Session session=sessionFactory.getCurrentSession();		
			String hql="from Account where username='"+username+"'";
			Query query = session.createQuery(hql);
			return (Account) query.uniqueResult();
		}
		
		//获取所有账户
		public List getAllAcconts() {
			Session session=sessionFactory.getCurrentSession();
			String hql="from Account ";
			Query query = session.createQuery(hql);
			return query.list();
			
		}
		//添加账户
		public boolean addAccount(Account account) {
			Session session=sessionFactory.getCurrentSession();
			session.save(account);
			return true;
		}
		/**
		 * 删除账户
		 */
		public boolean delAccount(Account account) {
			Session session=sessionFactory.getCurrentSession();
			session.delete(account);
			return true;
		}
		
		/**
		 *根据名称获取状态
		 */
		public Status getStatus(String name) {
			Session session=sessionFactory.getCurrentSession();
			String hql="from Status as s where s.name='"+name+"'";		
			Query query = session.createQuery(hql);
			return (Status) query.uniqueResult();
		}

		public Status getStatus(int id) {
			Session session=sessionFactory.getCurrentSession();
			return (Status) session.get(Status.class, id);
		}
		
		//从session中重新获取对象account
		public void reflush(Account account){
			Session session=sessionFactory.getCurrentSession();
			session.refresh(account);
		}
	}
	//PersoninfoDAO.java
	public interface PersoninfoDAO {
		//修改个人信息
		public void modifyPersoninfo(Personinfo personinfo);
		
		//获取全部用户信息
		public List getAllPersoninfo();
		
		//添加个人信息
		public boolean add(Personinfo personinfo);

		//根据条件查询个人信息
		public List searchPersoninfo(Personinfo personinfo);
		
		//根据账户状态获取用户信息
		public List searchPersoninfo(Status status);
	}
	//TransactionDAO.java
	public interface TransactionDAO {

		//向数据表transaction_log中添加记录
		public boolean addLog(TransactionLog log);

		//获取交易记录
		public List getLogs(Account account,int page);
		
		//根据交易类型名称获取交易类型对象
		public TransactionType getTransactionType(String name);
		
		//获取交易记录数
		public Integer getCountOfLogs(Account account);
	}
	//UserDAO.java
	public interface UserDAO {

		//根据账户id获取账户对象
		public  Account getAccount(int accountid);
		
		//根据客户名获取客户对象
		public Account getAccount(String username);
		
		public List getAllAcconts();
		
		public Account searchAccounts(Account account);
		
		//修改账户
		public boolean updateAccount(Account account);
		
		//添加账户
		public boolean addAccount(Account account);
		
		//删除账户
		public boolean delAccount(Account account);
		

		public void reflush(Account account);
		
		//根据账户状态名称获取账户状态对象
		public Status getStatus(String name);
		
		public Status getStatus(int id);
		
		//根据username获取Admin
		public Admin getAdmin(String username);
		
		
		public boolean modifyAdmin(Admin admin);
	}
	//Account.java
	public class Account implements java.io.Serializable {

		// Fields

		private Integer accountid;
		private Status status;
		private String username;
		private String password;
		private Double balance;
		private Set transactionLogs = new HashSet(0);
		private Set personinfos = new HashSet(0);

		// Constructors

		/** default constructor */
		public Account() {
		}

		/** full constructor */
		public Account(Status status, String username, String password,
				Double balance, Set transactionLogs, Set personinfos) {
			this.status = status;
			this.username = username;
			this.password = password;
			this.balance = balance;
			this.transactionLogs = transactionLogs;
			this.personinfos = personinfos;
		}

		// Property accessors

		public Integer getAccountid() {
			return this.accountid;
		}

		public void setAccountid(Integer accountid) {
			this.accountid = accountid;
		}

		public Status getStatus() {
			return this.status;
		}

		public void setStatus(Status status) {
			this.status = status;
		}

		public String getUsername() {
			return this.username;
		}

		public void setUsername(String username) {
			this.username = username;
		}

		public String getPassword() {
			return this.password;
		}

		public void setPassword(String password) {
			this.password = password;
		}

		public Double getBalance() {
			return this.balance;
		}

		public void setBalance(Double balance) {
			this.balance = balance;
		}

		public Set getTransactionLogs() {
			return this.transactionLogs;
		}

		public void setTransactionLogs(Set transactionLogs) {
			this.transactionLogs = transactionLogs;
		}

		public Set getPersoninfos() {
			return this.personinfos;
		}

		public void setPersoninfos(Set personinfos) {
			this.personinfos = personinfos;
		}

	}
	//Admin.java
	public class Admin implements java.io.Serializable {

		// Fields

		private Integer id;
		private String username;
		private String password;

		// Constructors

		/** default constructor */
		public Admin() {
		}

		/** full constructor */
		public Admin(String username, String password) {
			this.username = username;
			this.password = password;
		}

		// Property accessors

		public Integer getId() {
			return this.id;
		}

		public void setId(Integer id) {
			this.id = id;
		}

		public String getUsername() {
			return this.username;
		}

		public void setUsername(String username) {
			this.username = username;
		}

		public String getPassword() {
			return this.password;
		}

		public void setPassword(String password) {
			this.password = password;
		}

	}
	//Pager.java
	public class Pager {
		private int curPage;//待显示页
		private int perPageRows ;//一页显示的记录数  
		private int rowCount; //记录总数  
		private int pageCount; //总页数 	
		public int getCurPage() {
			return curPage;
		}
		public void setCurPage(int currentPage) {
			this.curPage = currentPage;
		}
		public int getPerPageRows() {
			return perPageRows;
		}
		public void setPerPageRows(int perPageRows) {
			this.perPageRows = perPageRows;
		}
		public int getRowCount() {
			return rowCount;
		}
		public void setRowCount(int rowCount) {
			this.rowCount = rowCount;
		}
		public int getPageCount() {
			return (rowCount+perPageRows-1)/perPageRows;
		}
	}
	//Password.java
	public class Password {
		private String oldpwd;
		private String newpwd;
		public String getOldpwd() {
			return oldpwd;
		}
		public void setOldpwd(String oldpwd) {
			this.oldpwd = oldpwd;
		}
		public String getNewpwd() {
			return newpwd;
		}
		public void setNewpwd(String newpwd) {
			this.newpwd = newpwd;
		}
		public String getConfirmpwd() {
			return confirmpwd;
		}
		public void setConfirmpwd(String confirmpwd) {
			this.confirmpwd = confirmpwd;
		}
		private String confirmpwd;
	}
	//Personinfo.java
	public class Personinfo implements java.io.Serializable {

		// Fields

		private Integer id;
		private Account account;
		private String realname;
		private Integer age;
		private String sex;
		private Long cardid;
		private String address;
		private String telephone;

		// Constructors

		/** default constructor */
		public Personinfo() {
		}

		/** full constructor */
		public Personinfo(Account account, String realname, Integer age,
				String sex, Long cardid, String address, String telephone) {
			this.account = account;
			this.realname = realname;
			this.age = age;
			this.sex = sex;
			this.cardid = cardid;
			this.address = address;
			this.telephone = telephone;
		}

		// Property accessors

		public Integer getId() {
			return this.id;
		}

		public void setId(Integer id) {
			this.id = id;
		}

		public Account getAccount() {
			return this.account;
		}

		public void setAccount(Account account) {
			this.account = account;
		}

		public String getRealname() {
			return this.realname;
		}

		public void setRealname(String realname) {
			this.realname = realname;
		}

		public Integer getAge() {
			return this.age;
		}

		public void setAge(Integer age) {
			this.age = age;
		}

		public String getSex() {
			return this.sex;
		}

		public void setSex(String sex) {
			this.sex = sex;
		}

		public Long getCardid() {
			return this.cardid;
		}

		public void setCardid(Long cardid) {
			this.cardid = cardid;
		}

		public String getAddress() {
			return this.address;
		}

		public void setAddress(String address) {
			this.address = address;
		}

		public String getTelephone() {
			return this.telephone;
		}

		public void setTelephone(String telephone) {
			this.telephone = telephone;
		}

	}
	//Status.java
	public class Status implements java.io.Serializable {

		// Fields

		private Integer id;
		private String name;
		private Set accounts = new HashSet(0);

		// Constructors

		/** default constructor */
		public Status() {
		}

		/** full constructor */
		public Status(String name, Set accounts) {
			this.name = name;
			this.accounts = accounts;
		}

		// Property accessors

		public Integer getId() {
			return this.id;
		}

		public void setId(Integer id) {
			this.id = id;
		}

		public String getName() {
			return this.name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public Set getAccounts() {
			return this.accounts;
		}

		public void setAccounts(Set accounts) {
			this.accounts = accounts;
		}

	}
	//TransactionLog.java
	public class TransactionLog implements java.io.Serializable {

		// Fields

		private Integer id;
		private TransactionType transactionType;
		private Account account;
		private Integer otherid;
		private Double trMoney;
		private String datetime;

		// Constructors

		/** default constructor */
		public TransactionLog() {
		}

		/** full constructor */
		public TransactionLog(TransactionType transactionType, Account account,
				Integer otherid, Double trMoney, String datetime) {
			this.transactionType = transactionType;
			this.account = account;
			this.otherid = otherid;
			this.trMoney = trMoney;
			this.datetime = datetime;
		}

		// Property accessors

		public Integer getId() {
			return this.id;
		}

		public void setId(Integer id) {
			this.id = id;
		}

		public TransactionType getTransactionType() {
			return this.transactionType;
		}

		public void setTransactionType(TransactionType transactionType) {
			this.transactionType = transactionType;
		}

		public Account getAccount() {
			return this.account;
		}

		public void setAccount(Account account) {
			this.account = account;
		}

		public Integer getOtherid() {
			return this.otherid;
		}

		public void setOtherid(Integer otherid) {
			this.otherid = otherid;
		}

		public Double getTrMoney() {
			return this.trMoney;
		}

		public void setTrMoney(Double trMoney) {
			this.trMoney = trMoney;
		}

		public String getDatetime() {
			return this.datetime;
		}

		public void setDatetime(String datetime) {
			this.datetime = datetime;
		}

	}
	//TransactionType.java
	public class TransactionType implements java.io.Serializable {

		// Fields

		private Integer id;
		private String name;
		private Set transactionLogs = new HashSet(0);

		// Constructors

		/** default constructor */
		public TransactionType() {
		}

		/** full constructor */
		public TransactionType(String name, Set transactionLogs) {
			this.name = name;
			this.transactionLogs = transactionLogs;
		}

		// Property accessors

		public Integer getId() {
			return this.id;
		}

		public void setId(Integer id) {
			this.id = id;
		}

		public String getName() {
			return this.name;
		}

		public void setName(String name) {
			this.name = name;
		}

		public Set getTransactionLogs() {
			return this.transactionLogs;
		}

		public void setTransactionLogs(Set transactionLogs) {
			this.transactionLogs = transactionLogs;
		}

	}
	//Account.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.netbank.entity.Account" table="account" catalog="bank">
			<id name="accountid" type="java.lang.Integer">
				<column name="accountid" />
				<generator class="native"></generator>
			</id>
			<many-to-one name="status" class="com.netbank.entity.Status" fetch="select" lazy="false">
				<column name="status" />
			</many-to-one>
			<property name="username" type="java.lang.String">
				<column name="username" length="50" />
			</property>
			<property name="password" type="java.lang.String">
				<column name="password" length="50" />
			</property>
			<property name="balance" type="java.lang.Double">
				<column name="balance" precision="18" />
			</property>
			<set name="transactionLogs" inverse="true" lazy="false" cascade="delete">
				<key>
					<column name="accountid" />
				</key>
				<one-to-many class="com.netbank.entity.TransactionLog" />
			</set>
			<set name="personinfos" inverse="true" lazy="false" cascade="delete">
				<key>
					<column name="accountid" />
				</key>
				<one-to-many class="com.netbank.entity.Personinfo" />
			</set>
		</class>
	</hibernate-mapping>
	//Admin.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.netbank.entity.Admin" table="admin" catalog="bank">
			<id name="id" type="java.lang.Integer">
				<column name="id" />
				<generator class="native"></generator>
			</id>
			<property name="username" type="java.lang.String">
				<column name="username" length="50" />
			</property>
			<property name="password" type="java.lang.String">
				<column name="password" length="50" />
			</property>
		</class>
	</hibernate-mapping>
	//Personinfo.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.netbank.entity.Personinfo" table="personinfo" catalog="bank">
			<id name="id" type="java.lang.Integer">
				<column name="id" />
				<generator class="native"></generator>
			</id>
			<many-to-one name="account" class="com.netbank.entity.Account" fetch="select" lazy="false">
				<column name="accountid" />
			</many-to-one>
			<property name="realname" type="java.lang.String">
				<column name="realname" length="50" />
			</property>
			<property name="age" type="java.lang.Integer">
				<column name="age" />
			</property>
			<property name="sex" type="java.lang.String">
				<column name="sex" length="2" />
			</property>
			<property name="cardid" type="java.lang.Long">
				<column name="cardid" precision="18" scale="0" />
			</property>
			<property name="address" type="java.lang.String">
				<column name="address" length="50" />
			</property>
			<property name="telephone" type="java.lang.String">
				<column name="telephone" length="50" />
			</property>
		</class>
	</hibernate-mapping>
	//Status.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.netbank.entity.Status" table="status" catalog="bank">
			<id name="id" type="java.lang.Integer">
				<column name="id" />
				<generator class="native"></generator>
			</id>
			<property name="name" type="java.lang.String">
				<column name="name" length="20" />
			</property>
			<set name="accounts" inverse="true" lazy="false">
				<key>
					<column name="status" />
				</key>
				<one-to-many class="com.netbank.entity.Account" />
			</set>
		</class>
	</hibernate-mapping>	
	//TransactionLog.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.netbank.entity.TransactionLog" table="transaction_log" catalog="bank">
			<id name="id" type="java.lang.Integer">
				<column name="id" />
				<generator class="native"></generator>
			</id>
			<many-to-one name="transactionType" class="com.netbank.entity.TransactionType" fetch="select" lazy="false">
				<column name="ta_type" />
			</many-to-one>
			<many-to-one name="account" class="com.netbank.entity.Account" fetch="select" lazy="false">
				<column name="accountid" />
			</many-to-one>
			<property name="otherid" type="java.lang.Integer">
				<column name="otherid" />
			</property>
			<property name="trMoney" type="java.lang.Double">
				<column name="tr_money" precision="18" />
			</property>
			<property name="datetime" type="java.lang.String">
				<column name="datetime" length="50" />
			</property>
		</class>
	</hibernate-mapping>
	//TransactionType.hbm.xml
	<?xml version="1.0" encoding="utf-8"?>
	<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
	<hibernate-mapping>
		<class name="com.netbank.entity.TransactionType" table="transaction_type" catalog="bank">
			<id name="id" type="java.lang.Integer">
				<column name="id" />
				<generator class="native"></generator>
			</id>
			<property name="name" type="java.lang.String">
				<column name="name" length="50" />
			</property>
			<set name="transactionLogs" inverse="true" lazy="false">
				<key>
					<column name="ta_type" />
				</key>
				<one-to-many class="com.netbank.entity.TransactionLog" />
			</set>
		</class>
	</hibernate-mapping>
	//applicationContext.xml	
	<?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:p="http://www.springframework.org/schema/p"
		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.1.xsd
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.1.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx.xsd	
		http://www.springframework.org/schema/context
		http://www.springframework.org/schema/context/spring-context-3.1.xsd">

		<bean id="dataSource"
			class="org.apache.commons.dbcp.BasicDataSource">
			<property name="driverClassName"
				value="com.mysql.jdbc.Driver" />
			<property name="url" value="jdbc:mysql://localhost:3306/bank"></property>
			<property name="username" value="root"></property>
			<property name="password" value="123456"></property>
		</bean>
		<bean id="sessionFactory"
			class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
			<property name="dataSource">
				<ref bean="dataSource" />
			</property>
			<property name="hibernateProperties">
				<props>
					<prop key="hibernate.dialect">
						org.hibernate.dialect.MySQLDialect
					</prop>
				</props>
			</property>
			<property name="mappingResources">
				<list>
					<value>
						com/netbank/entity/TransactionType.hbm.xml
					</value>
					<value>com/netbank/entity/Account.hbm.xml</value>
					<value>com/netbank/entity/TransactionLog.hbm.xml</value>
					<value>com/netbank/entity/Personinfo.hbm.xml</value>
					<value>com/netbank/entity/Status.hbm.xml</value>
					<value>com/netbank/entity/Admin.hbm.xml</value></list>
			</property>
		</bean>
		<!--开启注解处理器  -->
		<context:annotation-config/>
	   
		<bean id="transactionManager"
			class="org.springframework.orm.hibernate4.HibernateTransactionManager">
			<property name="sessionFactory" ref="sessionFactory" />
		</bean>
		
		<!-- 基于@Transactional注解方式的事务管理 -->
		<tx:annotation-driven transaction-manager="transactionManager" />
		
		<!-- 定义UserDaoImpl,并给类中的sessionFactory属性注入值 -->
		<bean id="userDao" class="com.netbank.dao.impl.UserDAOImpl">
			<property name="sessionFactory" ref="sessionFactory"></property>
		</bean>
		
		<!-- 定义UserBizImpl,并给其属性userDao注入实例 -->
		<bean id="userBiz" class="com.netbank.biz.impl.UserBizImpl">
		   <property name="userDao" ref="userDao"></property>
		</bean>
		
		<!-- 定义PersoninfoDaoImpl,并给类中的sessionFactory属性注入值 -->
		<bean id="personinfoDao" class="com.netbank.dao.impl.PersoninfoDAOImpl">
			<property name="sessionFactory" ref="sessionFactory"></property>
		</bean>
		
		<!-- 定义PersoninfoBizImpl,并给其属性personinfoDao和userDao注入Bean实例 -->
		<bean id="personinfoBiz" class="com.netbank.biz.impl.PersoninfoBizImpl">
			<property name="personinfoDao" ref="personinfoDao"></property>
			<property name="userDao" ref="userDao"></property>
		</bean>
		
		<!-- 定义TransactionDaoImpl,并给类中的sessionFactory属性注入值 -->
		<bean id="transactionDao" class="com.netbank.dao.impl.TransactionDAOImpl">
			<property name="sessionFactory" ref="sessionFactory"></property>
		</bean>	
		
		<!-- 定义TransactionBizImpl,并给其属性transactionDao和userDao注入Bean实例 -->
		<bean id="transactionBiz" class="com.netbank.biz.impl.TransactionBizImpl">
			<property name="transactionDao" ref="transactionDao"></property>
			<property name="userDao" ref="userDao"></property>
		</bean>	
		
		<!-- 使用原型模式定义UserAction类,UserAction类的属性通过Annotation注解方式注入 -->
		<bean name="user" class="com.netbank.action.UserAction" scope="prototype"/>
		
		<bean name="file" class="com.netbank.action.FileAction" scope="prototype"/>
		
		<!-- 使用原型模式定义PersoninfoAction类,PersoninfoAction类的属性通过Annotation注解方式注入 -->
		<bean name="personinfo" class="com.netbank.action.PersoninfoAction" scope="prototype"/>
		
		<!-- 使用原型模式定义AdminAction类,AdminAction类的属性userBiz和personinfoBiz通过Annotation注解方式注入 -->
		<bean name="admin" class="com.netbank.action.AdminAction" scope="prototype" />
		
		
		<!-- 使用原型模式定义Transaction类,并给属性 userBiz和transactionBiz注入值-->
		<bean name="transaction" class="com.netbank.action.Transaction" scope="prototype">
			<property name="userBiz" ref="userBiz"></property>
			<property name="transactionBiz" ref="transactionBiz"></property>
		</bean>
		
	</beans>
	//struts-file.xml	
	<?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>   
		<package name="file" namespace="/file" extends="struts-default">    
			<interceptors>
					<interceptor name="role" class="com.netbank.interceptor.RoleInterceptor"/>
					<interceptor-stack name="roleStack">
						<interceptor-ref name="defaultStack"/>
						<interceptor-ref name="role"/>
					</interceptor-stack>
			</interceptors>
			<default-interceptor-ref name="roleStack"/>
			<default-action-ref name="file"/>
			<global-results>
				<result name="message">/message.jsp</result>
			</global-results>
			<action name="file" class="file" method="addImages">
			</action>
			<action name="file_*" class="file" method="{1}">
			</action>
		</package>	
	</struts>
	//struts.xml	
	<?xml version="1.0" encoding="UTF-8" ?>
	<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
	<struts>
		<constant name="struts.enable.DynamicMethodInvocation" value="true" />
		<constant name="struts.devMode" value="true" />
		<constant name="struts.i18n.encoding" value="UTF-8"/>
		<constant name="struts.objectFactory" value="spring"/>
		<constant name="struts.configuration.xml.reload" value="true"></constant>
		
	   <include file="struts-file.xml"/> 
	   <!-- <include file ="struts-default.xml" />     -->  
		
		 <!-- 定义一个名称为admin的包,继承struts 2的默认包,指定命名空间为"/admin" -->
		 <package name="admin" namespace="/admin" extends="struts-default">
			<!-- 使用通配符与动态值配置AdminAction -->
			<action name="*" class="admin" method="{1}">
				<result name="login">/login.jsp</result>
				<result name="users">/admin/users.jsp</result>
				<result name="add">/admin/add.jsp</result>
				<result name="input">/message.jsp</result>
				<result name="message">/message.jsp</result>
				<!-- 将请求重定向到别的Action,相当于重新发起一次请求,并携带请求参数 -->
				<result name="list" type="redirectAction">
					<param name="actionName">listUsers</param>
					<param name="status.id">${status.id}</param>
				</result>
				<!--  <interceptor-ref name="adminStack"/>-->
			</action>
			<!--  
			<action name="add" class="admin" method="add">
				<result name="input">/admin/add.jsp</result>
			</action>
			-->
			<!-- 为AdminAction类中login方法配置映射 -->
			<action name="login" class="admin" method="login">
				<result name="success" >manage.jsp</result>
				<result name="input">/login.jsp</result>
			</action>
		 </package>
		
		<!-- 定义一个名称为user的包,继承struts 2的默认包,指定命名空间为"/user" -->
		<package name="user" namespace="/user" extends="struts-default">
			<!-- 使用通配符实现动态方法调用 -->
			<action name="user_*" class="user" method="{1}">
				<result name="success">/index.jsp</result>
				<result name="login">/login.jsp</result>
				<result name="input">/login.jsp</result>
			</action>
			<!-- 为UserAction类中的changepwd方法配置映射 -->
			<action name="changepwd" class="user" method="changepwd">
				<result name="input">/changepwd.jsp</result>
				<result name="message">/message.jsp</result>
				<!--<interceptor-ref name="roleStack"/>-->
			</action>
		</package>
		
		
		<!-- 定义一个名称为transaction的包,继承struts 2的默认包,指定命名空间为"/transaction" -->
		<package name="transaction" namespace="/transaction" extends="struts-default">
			<!--<default-interceptor-ref name="roleStack"/>-->
			<!-- 为Transaction类中list方法配置映射 -->
			<action name="list" class="transaction" method="list">
				<result name="success">/transactionlog.jsp</result>
			</action>
			<!-- 为Transaction类中transfer方法配置映射 -->
			<action name="transfer" class="transaction" method="transfer">
				<result name="input">/transfer.jsp</result>
				<result name="message">/message.jsp</result>
			</action>
			<!-- 为Transaction类中deposit方法配置映射 -->
			<action name="deposit" class="transaction" method="deposit">
				<result name="input">/deposit.jsp</result>
				<result name="message">/message.jsp</result>
			</action>
			<!-- 为Transaction类中withdrawal方法配置映射 -->
			<action name="withdrawal" class="transaction" method="withdrawal">
			<result name="input">/withdrawal.jsp</result>
			<result name="message">/message.jsp</result>
			</action>
		</package>
		
		  <!-- 定义一个名称为info的包,继承struts 2的默认包,指定命名空间为"/info" -->
		  <package name="info" namespace="/info" extends="struts-default">
			<!--  <default-interceptor-ref name="roleStack"/>-->
			<!-- 使用通配符实现动态方法调用 -->
			<action name="info_*" class="personinfo" method="{1}">
				<result name="login">/login.jsp</result>
				<result name="input">/modify.jsp</result>
				<result name="message">/message.jsp</result>
				<!--<interceptor-ref name="roleStack"/>-->
			</action>
		</package>
	</struts>    
	//add.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<%@ taglib uri="/struts-tags" prefix="s"%>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	<head>
	<base href="<%=basePath%>">

	<title>My JSP 'modify.jsp' starting page</title>

	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<link rel="stylesheet" type="text/css" href="/netbank/style/style.css">
	<link rel="stylesheet" type="text/css" href="/netbank/style/default.css">

	<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		-->
	<script type="text/javascript">
		function check()
		{
		
			var isMobile=/^(?:13\d|15\d)\d{5}(\d{3}|\*{3})$/;   
			var isPhone=/^((0\d{2,3})-)?(\d{7,8})(-(\d{3,}))?$/; 
			var isCardid=/^\d{17}(\d|x)$/;
			var username=document.getElementById("username").value;
			var pwd=document.getElementById("pwd").value;
			var confirmpwd=document.getElementById("confirmpwd").value;
			var balance=document.getElementById("balance").value;
			var realname=document.getElementById("realname").value;
			var age=document.getElementById("age").value;
			var address=document.getElementById("address").value;
			var telephone=document.getElementById("telephone").value;
			var cardid=document.getElementById("cardid").value;
			
			
			document.getElementById("errorusername").innerHTML="";
			document.getElementById("errorpwd").innerHTML="";
			document.getElementById("errorconfirmpwd").innerHTML="";
			document.getElementById("errorbalance").innerHTML="";
			document.getElementById("errorrealname").innerHTML="";
			document.getElementById("errorage").innerHTML="";
			document.getElementById("erroraddress").innerHTML="";
			document.getElementById("errortelephone").innerHTML="";
			document.getElementById("errorcardid").innerHTML="";
			if(username=="")
			{
					document.getElementById("errorusername").innerHTML="请输入用户名";
					return false;
			}else if(pwd=="")
			{
					document.getElementById("errorpwd").innerHTML="请输入密码";
					return false;
			}else if(confirmpwd=="")
			{
					document.getElementById("errorconfirmpwd").innerHTML="请确认密码";
					return false;
			}else if(balance=="")
			{
					document.getElementById("errorbalance").innerHTML="请输入金额";
					return false;
			}else if(realname=="")
			{
					document.getElementById("errorrealname").innerHTML="请输入姓名";
					return false;
			}else if(address=="")
			{
					document.getElementById("erroraddress").innerHTML="请输入地址";
					return false;
			}else if(telephone=="")
			{
					document.getElementById("errortelephone").innerHTML="请输入电话";
					return false;
			}else if(cardid=="")
			{
					document.getElementById("errorcardid").innerHTML="请输入身份证号";
					return false;
			}else if(age=="")
			{
					document.getElementById("errorage").innerHTML="请输入年龄";
					return false;
			}else
			{
				if(pwd!=confirmpwd)
					{
						document.getElementById("errorconfirmpwd").innerHTML="两次密码不一致";
						return false;
					}
				if(!(balance.search(/^[\+\-]?\d+\.?\d*$/)==0))
				{
					
					document.getElementById("errorbalance").innerHTML="含有非法字符";
					return false;
				}else{
					if(parseFloat(balance)<10)
					{
							document.getElementById("errorbalance").innerHTML="开户金额不能少于10元";
							return false;
					}
				}
				if(!(age.search(/^[\+\-]?\d+\.?\d*$/)==0))
				{
					
					document.getElementById("errorage").innerHTML="含有非法字符";
					return false;
				}else{
					if(parseFloat(age)<18)
					{
							document.getElementById("errorage").innerHTML="未成年人不能开户";
							return false;
					}else if(parseFloat(age)>99)
					{
						document.getElementById("errorage").innerHTML="年龄输入有误,100岁以下";
							return false;
					}
				}
				if(!isPhone.test(telephone)&&!isMobile.test(telephone))
				{
					document.getElementById("errortelephone").innerHTML="电话格式不正确";
					return false;
				}
				if(!isCardid.test(cardid))
				{
					document.getElementById("errorcardid").innerHTML="身份证格式不正确";
					return false;
				}
				return true;
			}
			
			
			
		}
	</script>
	</head>

	<body>
		<form method="post" name="myform" action="/netbank/admin/kaihu"
			onsubmit="return check()">
			<div align="center">
				<table width="450" class="table">
					<tbody>
						<tr>
							<td width="100">用户名:</td>
							<td><input id="username" type="text" name="account.username" />
								<span id="errorusername" style="color: red;">${message}</span></td>
						</tr>
						<tr>
							<td>密码:</td>
							<td><input id="pwd" type="password" name="account.password" />
								<span id="errorpwd" style="color: red;"></span></td>
						</tr>
						<tr>
							<td>确认密码:</td>
							<td><input id="confirmpwd" type="password" /> <span
								id="errorconfirmpwd" style="color: red;"></span></td>
						</tr>
						<tr>
							<td>开户金额:</td>
							<td><input id="balance" type="text" name="account.balance" />
								<span id="errorbalance" style="color: red;"></span></td>
						</tr>
						<tr>
							<td>姓名:</td>
							<td><input type="text" id="realname"
								name="personinfo.realname" /> <span id="errorrealname"
								style="color: red;"></span></td>
						</tr>
						<tr>
							<td>年龄:</td>
							<td><input id="age" type="text" name="personinfo.age" "/> <span
								id="errorage" style="color: red;"></span></td>
						</tr>
						<tr>
							<td>性别:</td>
							<td><select name="personinfo.sex">
									<option value="男">男</option>
									<option value="女">女</option>
							</select>
							</td>
						</tr>
						<tr>
							<td>家庭地址:</td>
							<td><input id="address" type="text" name="personinfo.address" "/>
								<span id="erroraddress" style="color: red;"></span></td>
						</tr>
						<tr>
							<td>联系电话:</td>
							<td><input id="telephone" name="personinfo.telephone"
								value="${personinfo.telephone}" type="text" /> <font size="1">区号(3或4位)-电话(8或9位)</font>
								<span id="errortelephone" style="color: red;"></span></td>
						</tr>
						<tr>
							<td>证件号码:</td>
							<td><input id="cardid" type="text" name="personinfo.cardid"
								value="${personinfo.cardid}" /> <font size="1">15位或18位</font> <span
								id="errorcardid" style="color: red;"></span></td>
						</tr>
						<tr>
							<td></td>
							<td><input type="submit" value="提交" /> <br>
							</td>
						</tr>
					</tbody>
				</table>
				<div style="color: red;">
					<s:fielderror />
				</div>
			</div>
			<br>
		</form>
	</body>
	</html>
	//changepwd.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<%@ taglib uri="/struts-tags" prefix="s"%>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>


	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	<head>
	<base href="<%=basePath%>">

	<title>changepwd</title>

	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">

	<link rel="stylesheet" type="text/css" href="style/style.css">
	<link rel="stylesheet" type="text/css" href="style/default.css">
	<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		-->
	<script language="javascript">
		
		function check(){
		var oldpwd=document.getElementById("oldpwd").value;
		var newpwd=document.getElementById("newpwd").value;
		var confirmpwd=document.getElementById("confirmpwd").value;
			if(oldpwd!=""&&newpwd!=""&&confirmpwd!="")
			{
				if(newpwd!=confirmpwd)
				{
					document.getElementById("secondpwd").style.display="inline";
					return false;
					
				}
				return true;
			}
			else{
				alert("密码不能为空!");
				return false;
			}
		}
		
		
		
		
	</script>
	</head>

	<body>
		<form method="post" name="myform" action="admin/changepwd"
			onsubmit="return check()">
			<div align="center">
				<table width="400" border="0" class="table">
					<tbody>
						<tr>
							<td>&nbsp;当前密码:</td>
							<td><input type="password" name="pwd.oldpwd" id="oldpwd">
								<span style="color: red;">* <s:fielderror />
							</span></td>
						</tr>
						<tr>
							<td width="100">&nbsp;新密码:</td>
							<td><input type="password" name="pwd.newpwd" id="newpwd">
								<span style="color: red;">*</span></td>
						</tr>
						<tr>
							<td>&nbsp;确认密码:</td>
							<td><input type="password" name="pwd.confirmpwd"
								id="confirmpwd"> <span style="color: red;">*</span> <span
								style="color: red; display: none;" id="secondpwd">两次密码不一致</span>
							</td>
						</tr>
						<tr>
							<td>&nbsp;</td>
							<td>&nbsp;<input type="Submit" value="修改" /></td>
						</tr>
					</tbody>
				</table>

			</div>

		</form>
	</body>
	</html>
	//left.jsp
	<%@page contentType="text/html;charset=utf-8"
		import="java.sql.*,java.util.*"%>
	<%
	if(session.getAttribute("admin")!=null){
	//--------------------------------------logged------------------------------------------------------------------
		
	%>
	<html>
	<head>
	<link rel="stylesheet" type="text/css" href="../style/style.css">
	<link rel="stylesheet" type="text/css" href="../style/default.css">
	</head>
	<BODY leftmargin="20" topmargin="0" marginheight="0" marginwidth="0">


		<table cellpadding=0 cellspacing=0 width=200 align=center>

			<tr>
				<td height=25 align="center" bgcolor="#DBC2B0"><b>后台管理</b>
				</td>
			</tr>
			<tr>
				<td bgcolor="#F5EFE7">
					<table cellpadding=0 cellspacing=0 align=center width=200>
						<tr>
							<td height=20><a href=/netbank/admin/listUsers?status.id=0
								target=right>所有账户</a>
							</td>
						</tr>
						<tr>
							<td height=20><a href=/netbank/admin/listUsers?status.id=2
								target=right>已冻结账户</a>
							</td>
						</tr>
						<tr>
							<td height=20><a href=/netbank/admin/listUsers?status.id=1
								target=right>已启用账户</a>
							</td>
						</tr>
						<tr>
							<td height=20><a href=/netbank/admin/add.jsp target=right>开户</a>
							</td>
						</tr>
						<tr>
							<td height=20><a href=/netbank/admin/changepwd.jsp
								target=right>修改个人密码</a>
							</td>
						</tr>
						<tr>
							<td height=20><a href=/netbank/admin/logout target=_top>注销</a>
							</td>
						</tr>
					</table></td>
			</tr>
		</table>
		</td>
		</tr>
		</table>
		<%
	}
	else{//------------------------------------not logged-------------------------------------------------------
	response.sendRedirect("index.jsp");
	}
	%>
	//main.jsp
	<%@page contentType="text/html;charset=gb2312" import="java.sql.*,java.util.*"%>
	<%@page import="com.netbank.entity.Admin"%>

	<%
		if(session.getAttribute("admin")==null){
	%>
			<jsp:forward page="/login.jsp"></jsp:forward>
	<%
		}
	%>

	<style type=text/css>
	body  { background:#799AE1; margin:0px; font:9pt 宋体; }
	table  { border:0px; }
	td  { font:normal 12px 宋体; }
	img  { vertical-align:bottom; border:0px; }
	a  { font:normal 12px 宋体; color:#000000; text-decoration:none; }
	a:hover  { color:#428EFF;text-decoration:underline; }
	.sec_menu  { border-left:1px solid white; border-right:1px solid white; border-bottom:1px solid white; overflow:hidden; background:#D6DFF7; }
	.menu_title  { }
	.menu_title span  { position:relative; top:2px; left:8px; color:#215DC6; font-weight:bold; }
	.menu_title2  { }
	.menu_title2 span  { position:relative; top:2px; left:8px; color:#428EFF; font-weight:bold; }
	</style>
	<html>
	<head>

	<meta http-equiv="Content-Language" content="zh-cn">

	<title>无标题文档</title>
	<meta http-equiv="Content-Type" content="text/html; charset=gb2312">

	<base target="_blank">

	</head>
	<body bgcolor="#FFFFFF" text="#000000" style="background-color: #DBC2B0">
	<br>
	<div align="center">
	  <center>
	  <table style="WORD-BREAK: break-all; BORDER-COLLAPSE: collapse" cellSpacing="0" cellPadding="0" width="645" bgColor="#ffffff" border="0">
		<tr>
		  <td colSpan="3" width="645">
		  <div align="center">
			<table cellSpacing="0" cellPadding="0" width="96%" border="0">
			  <tr>
				<td>
				<p style="MARGIN-TOP: 20px; MARGIN-BOTTOM: 5px; MARGIN-LEFT: 50px; LINE-HEIGHT: 150%">
				<b><font color="#ed5f19">(欢迎使用管理系统)</font></b></p>
					  <p style="MARGIN-TOP: 20px; MARGIN-BOTTOM: 5px; MARGIN-LEFT: 50px; LINE-HEIGHT: 150%"> 
					   
					  <p style="MARGIN-TOP: 20px; MARGIN-BOTTOM: 5px; MARGIN-LEFT: 50px; LINE-HEIGHT: 150%"><br>
						-------------------------------------------------------- </p>
					  <p style="MARGIN-TOP: 5px; MARGIN-BOTTOM: 5px; MARGIN-LEFT: 50px; LINE-HEIGHT: 150%"> 
					  <p>&nbsp;</p>
					  <p style="MARGIN-TOP: 5px; MARGIN-BOTTOM: 5px; MARGIN-LEFT: 50px; LINE-HEIGHT: 150%"><br>
					 </td>
			  </tr>
			</table>
		  </div>
		  </td>
		</tr>
	  </table>
	  </center>
	</div>
	<br>
	</body>
	</html>
	//manage.jsp
	<%@page contentType="text/html;charset=utf-8" import="java.sql.*,java.util.*"%>
	<%
		if(session.getAttribute("admin")==null)
		{ 
	%>
			<jsp:forward page="/login.jsp"></jsp:forward>
	<%
		}
	%>
	<html>
	<head>
	<title>Admin页面</title>
	</head>
	  <frameset framespacing="0" border="false" cols="230,*" frameborder="0">
	  <frame name="left"  scrolling="no" marginwidth="0" marginheight="0" src="left.jsp">
	  <frame name="right" scrolling="yes" src="main.jsp">
	</frameset>

	<noframes>
	</noframes> 
	</html>
	//users.jsp
	<%@page contentType="text/html;charset=utf-8" import="java.util.*"%>
	<%@page import="com.netbank.entity.Admin"%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
	<%
	if(session.getAttribute("admin")==null)
	{
			response.sendRedirect("login.jsp");

	}
	%>
	<html><head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8"">
	<link rel="stylesheet" type="text/css" href="../style/style.css">
	<link rel="stylesheet" type="text/css" href="../style/default.css">
	</head>
	<body>
	<div align="center"><center>
	<!-- 查询用户表单部分 -->
	<Form action="/netbank/admin/search" method="POST">
	输入要查询用户的真实姓名:
	<input name="personinfo.realname"/>
	<input name="status.id" type="hidden" value="${status.id}">  
	&nbsp;&nbsp;&nbsp;<input type=submit value="提交" ></input>
	</FORM>
	<table width="100%" height="73" border="1" align="center" cellpadding="0" cellspacing="0" bordercolor="#999999" bgcolor="#999999">
			<!-- 用户信息显示表头部分 -->
			<tr>
			  <td  height="20" nowrap  bgcolor="#999999">
				<div align="center"><font color="#FFFFFF">序列</font></div></td>
			  <td nowrap bgcolor="#999999">
				<div align="center"><font color="#FFFFFF">账户</font></div>
			  </td>
			   <td nowrap bgcolor="#999999">
				<div align="center"><font color="#FFFFFF">用户名</font></div>
			  </td>
			  <td  nowrap bgcolor="#808080">
				<div align="center">
					<font color="#FFFFFF">账户余额</font>
				</div>
			   </td> 
			  <td  nowrap bgcolor="#808080">
				<div align="center">
					<font color="#FFFFFF">姓名</font>
				</div>
			   </td>                
			  <td  nowrap bgcolor="#808080">
				<div align="center"><font color="#FFFFFF">详细地址</font></div></td>
			  <td  nowrap  bgcolor="#999999">
				<div align="center"><font color="#FFFFFF">身份证号</font></div></td>
			  <td  nowrap  bgcolor="#808080">
				<div align="center"><font color="#FFFFFF">电话</font></div></td>
			  <td  nowrap  bgcolor="#808080">
				<div align="center">
					<font color="#FFFFFF">状态</font>
				</div>
			   </td>
			   <td  nowrap  bgcolor="#808080">
				<div align="center">
					<font color="#FFFFFF">操作</font>
				</div>
			   </td>       
			  <td nowrap  bgcolor="#999999">
				<div align="center"><font color="#FFFFFF">&nbsp;</font>
				</div>
			  </td>	 
			</tr>
		<!-- 循环显示用户信息部分 -->
		<s:iterator value="#request.users" status="status">
		  <tr bgcolor="#FFFFFF"> 
				  <td  height="20" valign="middle"> 
					<div id="noWrap" align="center">
					<s:property value="#status.count"/>
					</div></td>
				  <td valign="middle"> 
				  <div id="noWrap" align="center">
					<s:property value="account.accountid"/>
				  </div></td>
				  <td valign="middle"> 
				  <div id="noWrap" align="center">
					<s:property value="account.username"/>
				  </div></td>
				  <td  height="20" valign="middle"> 
					<div id="noWrap" align="center">
					 <s:property value="account.balance"/>
					</div>
				   </td>
				  <td  height="20" valign="middle"> 
					<div id="noWrap" align="center">
					 <s:property value="realname"/>
					</div>
				   </td>
				  <td valign="middle"> 
					<div id="noWrap" align="center">
						<s:property value="address"/>
					</div></td>
				  <td valign="middle"> 
					<div id="noWrap" align="center">
						<s:property value="cardid"/>
					</div></td>
				  <td valign="middle"> 
					<div id="noWrap" align="center">
						<s:property value="telephone"/>
					</div></td>
					<td valign="middle"> 
					<div id="noWrap" align="center">
						<s:property value="account.status.name"/>
					</div></td>
					<td>
					<div id="noWrap" align="center">
						<s:if test="account.status.name=='启用'">
						<input type="button" value="冻结" onclick="javascript:location.href='/netbank/admin/locking?id=${account.accountid}&status.id=${status.id}'">
						</s:if>
						<s:else>
							<input type="button" value="启用" onclick="javascript:location.href='/netbank/admin/enabled?id=${account.accountid}&status.id=${status.id}'">
						</s:else>
					</div></td>
				  <td valign="middle"> 
					<div id="noWrap" align="center"><A href="/netbank/admin/del?id=${account.accountid}&status.id=${status.id}">&nbsp;删除&nbsp;</a></div></td></tr>  
				  </s:iterator>
				<tr> 
				  <td height="20" colspan="14" valign="middle"> 
					</div></td>              
				</tr>
		</table>
		</center>
		</div>
		</body>
		</html>
	//admin.css
	BODY {
		MARGIN: 0px
	}
	P {
		MARGIN: 0px
	}
	BODY {
		COLOR: #000; BACKGROUND-COLOR: #fff
	}
	BODY {
		FONT-SIZE: 12px; LINE-HEIGHT: 150%; FONT-FAMILY: "Verdana", "Arial", "Helvetica", "sans-serif"
	}
	TABLE {
		FONT-SIZE: 12px; LINE-HEIGHT: 150%; FONT-FAMILY: "Verdana", "Arial", "Helvetica", "sans-serif"
	}
	INPUT {
		FONT-SIZE: 12px; FONT-FAMILY: "Verdana", "Arial", "Helvetica", "sans-serif"
	}
	SELECT {
		FONT-SIZE: 12px; FONT-FAMILY: "Verdana", "Arial", "Helvetica", "sans-serif"
	}
	TEXTAREA {
		FONT-SIZE: 12px; FONT-FAMILY: "Verdana", "Arial", "Helvetica", "sans-serif"
	}
	A:link {
		COLOR: #036; TEXT-DECORATION: none
	}
	A:visited {
		COLOR: #036; TEXT-DECORATION: none
	}
	A:hover {
		COLOR: #f60; TEXT-DECORATION: underline
	}
	A.menuChild:link {
		COLOR: #036; TEXT-DECORATION: none
	}
	A.menuChild:visited {
		COLOR: #036; TEXT-DECORATION: none
	}
	A.menuChild:hover {
		COLOR: #f60; TEXT-DECORATION: underline
	}
	A.menuParent:link {
		COLOR: #000; TEXT-DECORATION: none
	}
	A.menuParent:visited {
		COLOR: #000; TEXT-DECORATION: none
	}
	A.menuParent:hover {
		COLOR: #f60; TEXT-DECORATION: none
	}
	TABLE.position {
		WIDTH: 100%
	}
	TR.position {
		HEIGHT: 25px; BACKGROUND-COLOR: #f4f7fc
	}
	TD.position {
		BORDER-RIGHT: #adceff 1px solid; PADDING-LEFT: 20px; BORDER-BOTTOM: #adceff 1px solid
	}
	TABLE.listTable {
		WIDTH: 98%; BACKGROUND-COLOR: #b1ceee
	}
	TR.listHeaderTr {
		FONT-WEIGHT: bold; HEIGHT: 25px; BACKGROUND-COLOR: #ebf4fd; TEXT-ALIGN: center
	}
	TR.listTr {
		HEIGHT: 25px; BACKGROUND-COLOR: #fff; TEXT-ALIGN: center
	}
	TR.listAlternatingTr {
		HEIGHT: 25px; BACKGROUND-COLOR: #fffdf0; TEXT-ALIGN: center
	}
	TR.listFooterTr {
		HEIGHT: 30px; BACKGROUND-COLOR: #ebf4fd; TEXT-ALIGN: center
	}
	TABLE.editTable {
		WIDTH: 98%; BACKGROUND-COLOR: #b1ceee
	}
	TR.editHeaderTr {
		HEIGHT: 25px; BACKGROUND-COLOR: #ebf4fd
	}
	TD.editHeaderTd {
		PADDING-LEFT: 50px; FONT-WEIGHT: bold
	}
	TR.editTr {
		HEIGHT: 30px
	}
	TD.editLeftTd {
		WIDTH: 150px; BACKGROUND-COLOR: #fffdf0; TEXT-ALIGN: center
	}
	TD.editRightTd {
		PADDING-LEFT: 10px; BACKGROUND-COLOR: #fff
	}
	TR.editFooterTr {
		HEIGHT: 40px; BACKGROUND-COLOR: #ebf4fd
	}
	TD.editFooterTd {
		PADDING-LEFT: 150px
	}
	//default.css
	*{ list-style:none;}
	body { margin:10px 0 0 0; padding:0;font-family:Arial, Helvetica, sans-serif;list-style:none;}
	body,td,th,input,select,textarea{ color:#126191;font-size: 12px;}
	.nob{ font-weight:normal; }
	.table { border:#BCC7C3 1px solid; background:#F7F7F7;border-collapse:collapse;	padding: 5px 0 5px 0;
		overflow: auto;}
	.lmbt{ height:20px; float:left; color: #099; width:180px; float:left; margin:0; padding:0; line-height:15px; font-size:12px; font-weight:900;}
	.lmright { float:right;}
	.lmright a{ margin-right:20px;}

	.table td { border:#BCC7C3 1px solid;}
	.Attention { color:#FF0000;}
	.drop { font-size:12px;filter: dropshadow(color=#ffffff,offx=1,offy=1,positive=1);}
	a.mtitle:link,a.mtitle:visited{ color:#ae700f;font-size:14px; font-weight:bold;text-decoration: none;}
	a.mtitle:hover{text-decoration: none;}
	a:link,a:visited { color: #126191; text-decoration: none;}
	a:hover { color: #ae700f; text-decoration:none;}
	a.left:link,a.left:visited { color: #ae700f; text-decoration: none;}
	a.left:hover { color: #ae700f; text-decoration:underline; }
	.pagenavi { text-align:center;  font: 11px Arial, tahoma, sans-serif; padding-top: 20px; padding-bottom: 10px; margin: 0px; }
	.pagenavi a {border: 1px solid #BCC7C3; background: #FFFFFF; text-decoration: none; color:#C16012; display:inline-block; padding-left:6px; padding-right:6px; padding-top:2px; padding-bottom:2px}
	.pagenavi a:visited {border: 1px solid #BCC7C3; background: #FFFFFF; text-decoration: none; padding-left:6px; padding-right:6px; padding-top:2px; padding-bottom:2px}
	.pagenavi .break {border: medium none;  text-decoration: none; color:#C16012; background:;; padding-left:6px; padding-right:6px; padding-top:2px; padding-bottom:2px}
	.pagenavi .num {color:#C16012; font-size:12pt; padding-left:3px; padding-right:3px; padding-top:0; padding-bottom:0}
	.pagenavi .curr {padding: 2px 6px; border-color: #BCC7C3; font-weight: bold; font-size:12pt; background:transparent;}
	.pagenavi a:hover {color: #C16012; background: #eff7fd; text-decoration: none}
	.xingmu {FONT-WEIGHT: bolder;FONT-SIZE: 12px;COLOR: #0257A8;LINE-HEIGHT: 22px;FONT-FAMILY: Verdana, 新宋体;background-image: url(../Images/tobbg.gif);background-repeat: repeat;}
	.RefreshLen {BORDER: #BCC7C3 1px solid; MARGIN-top: 10px;MARGIN-BOTTOM: 5px; WIDTH: 400px; HEIGHT: 25px; TEXT-ALIGN: left}
	//style.css
	@charset "utf-8";
	body {
		padding: 0px;
		margin: 0px;
		font:normal 12px Tahoma, Geneva, Arial, sans-serif; 
		color:#555;
	}
	h1{ font:normal 18px arial; padding:0 0 6px 12px; color:#0a69a5; border-bottom:#ececec 1px solid; font-weight:900}

	*{
		padding: 0px;
		margin: 0px;
	}
	a{
		text-decoration:none;
		color:#555;
	}
	a:visited{
		outline:none;
	}
	a:hover{
		text-decoration:underline; 
	}

	#wrap {
		width:940px;
		padding: 0;
		margin:0 auto;
	}

	.clearfix:after {
		content:".";
		display:block;
		height:0;
		clear:both;
		visibility:hidden;
	}
	.clear {clear:both;}
	.w100{ width:100%;}
	.f_l{ float:left;}
	.f_r{ float:right;}

	li{ list-style-type:none;}
	img{ border:none;}

	/*--header--*/
	#header{ position:relative; width:940px; height:72px; background:#fff url(../images/top_shades.png) no-repeat 200px 0;}
	#header #logo{ position:absolute; top:19px; left:12px; width:188px; height:35px; display:block; }

	#header .searchWrapper{ position:absolute; top:21px; left:310px; width:292px; height:28px; padding:4px 0 0 12px; background:url(../images/search_bg.png) no-repeat 0 0;}
	#header .searchWrapper #searchBox{ width:236px; height:20px; padding:3px 0 0 0; border:none; color:#5e5e5e; background-color:transparent; vertical-align:middle;}
	#header .searchWrapper #searchBtn{ width:45px; height:22px; background:transparent; border:none; cursor:pointer; vertical-align:middle; outline:none;}

	#header #top_nav{ position:absolute; top:0; right:0; width:300px; height:26px;}
	#header #top_nav ul{ float:right;}
	#header #top_nav ul li{ float:left; display:block; height:26px; padding:4px 6px 0 17px; background:url(../images/top_nav_shades.gif) no-repeat 0 0;}
	#header #top_nav ul li.last{ padding-right:0px;}
	#header #top_nav ul li a, #header #top_nav ul li a:visited{ font-size:12px; text-decoration:none; color:#868686;}
	#header #top_nav ul li a:hover{ text-decoration:underline;}

	#header #top_userArea{ position:absolute; top:38px; right:0px; width:180px; height:20px;}
	#header #top_userArea ul{ float:right;width:180px;}
	#header #top_userArea ul li{ float:left; font-size:12px; }
	#header #top_userArea ul li a, #header #top_userArea ul li a:visited{ height:17px; display:inline-block; color:#808080; text-decoration:none;}
	#header #top_userArea ul li a:hover{ text-decoration:underline;}
	#header #top_userArea ul li .a_autentificare{ padding:1px 0 0 19px; margin-right:14px; background:url(../images/autentificare_icon.gif) no-repeat 0 0;}
	#header #top_userArea ul li .a_creaza_cont{ padding:1px 0 0 18px; background:url(../images/creaza_cont_icon.gif) no-repeat 0 0;}
	/*--end header--*/

	/*--nav--*/
	#nav{ width:940px; height:33px; background:#0972ad url(../images/nav_center.png) repeat-x 0 0;}
	#nav .nav_left_corner{ float:left; width:4px; height:33px; display:block; background:url(../images/nav_left_corner.png) no-repeat 0 0;}
	#nav .nav_right_corner{ float:right; width:4px; height:33px; display:block; background:url(../images/nav_right_corner.png) no-repeat 0 0;}
	#nav ul{ width:932px; height:33px; float:left;}
	#nav ul li{ float:left; height:33px; display:block; padding:0 1px 0 0; background:url(../images/nav_spacer.png) no-repeat right 0;}
	#nav ul li.last{ background-image:none;}
	#nav ul li.last a, #nav ul li.last a:visited{ padding-right:18px;}
	#nav ul li a, #nav ul li a:visited{ height:24px; display:inline-block; padding:9px 21px 0; text-decoration:none; font:bold 12px tahoma; color:#fff;}
	#nav ul li a:hover{ background:#0972ad url(../images/nav_hover.png) repeat-x 0 0;}
	#nav ul li a:active{ height:23px; padding-top:10px;}
	/*--end nav--*/

	/*--footer--*/
	#footer{ width:940px; font-size:12px; color:#999; float:left;}
	#footer .footer_row{ width:940px; height:22px; border-bottom:#e4e4e4 1px solid;}
	#footer .footer_row span{ float:left;}
	#footer .footer_row .footer_nav{ float:right;}
	#footer .footer_row .footer_nav li{ float:left; padding:0 8px 0 9px; border-right:#b7b7b7 1px solid;}
	#footer .footer_row .footer_nav li.last{ border:none; padding-right:0px;}
	#footer .footer_row .footer_nav li a, #footer .footer_row .footer_nav li a:visited{ text-decoration:none; color:#999;}
	#footer .footer_row .footer_nav li a:hover{ text-decoration:underline;}

	#footer .footer_row1{ padding-top:8px;}
	#footer .footer_row1 .copyright{ float:left;}
	#footer .footer_row1 .by{ float:right;}
	#footer .footer_row1 .by a{ width:71px; height:21px; margin-left:3px; display:inline-block; text-indent:-999999px;}

	/*--end footer--*/


	/*--center--*/
	#center {
		width: 100%;
		float:left;
		margin-top:10px;
	}

	/*--position--*/
	.position{ width:770px; height:31px; padding-bottom:10px; background:url(../images/position_bg.png) no-repeat 0 0;}
	.position ul{ float:left; width:550px; display:block; padding:9px 0 0 1px;}
	.position ul li{ float:left; display:block; height:17px; padding:0 9px 0 6px; font-size:12px; color:#777; background:url(../images/position_spacer.gif) no-repeat right 5px;}
	.position ul li.last{ background-image:none; color:#585858; padding-right:0px;}
	.position ul li a, .position ul li a:visited{ font-size:12px; color:#777; text-decoration:none;}
	.position ul li a:hover{ text-decoration:underline;}
	.position ul li .home_icon{ height:17px; display:inline-block; padding:1px 0 0 25px; margin-top:-1px; background:url(../images/home_icon.png) no-repeat 0 0;}

	.position .cartWrapper{ float:right; height:21px; padding: 9px 7px 0 12px; font-size:12px; color:#575757; background:url(../images/cart_spacer.gif) no-repeat 0 1px;}
	.position .cartWrapper a, .position .cartWrapper a:visited{ display:inline-block; padding-left:20px; font-size:12px; color:#777; text-decoration:none; background:url(../images/cart_icon.png) no-repeat 0 0;}
	.position .cartWrapper span{ padding-left:4px;}
	/*--end position--*/

	/*--banner--*/
	#banner{ width:770px; height:317px; padding-bottom:10px;}
	#banner #bannerTop{ position:relative; width:770px; height:274px; overflow:hidden; background:url(../images/banner_top_bg.png) no-repeat 0 0;}
	#banner #bannerTop ul{ position:absolute; width:2000em; height:274px;}
	#banner #bannerTop ul li{ float:left; width:770px; height:274px; display:block;}

	#banner .bannerBottom{ position:relative; width:770px; height:42px; background:url(../images/banner_bottom_bg.png) no-repeat 0 0;}

	#banner .bannerBottom .bannerThumbs{ padding-left:170px;}
	#banner .bannerBottom .bannerThumbs li{ float:left; width:35px; height:35px; padding:0 3px;}
	#banner .bannerBottom .bannerThumbs li a{ display:inline-block; width:35px; height:25px; padding-top:10px; cursor:pointer;}
	#banner .bannerBottom .bannerThumbs li img{ border:1px solid #CCC;}
	#banner .bannerBottom .bannerThumbs .current{ background:url(../images/banner_active.png) no-repeat center 0;}

	#banner .bannerBottom .bannerControls{ position:absolute; top:10px; right:4px; width:62px; height:56px;}
	#banner .bannerBottom .bannerControls li{ float:left; padding-right:4px;}
	#banner .bannerBottom .bannerControls li a{ width:25px; height:26px; display:block; text-indent:-999999px; cursor:pointer;}
	#banner .bannerBottom .bannerControls li a:active{ background-position:0 bottom;}
	#banner .bannerBottom .bannerControls li .backward{ background:url(../images/banner_prev.png) no-repeat 0 0;}
	#banner .bannerBottom .bannerControls li .forward{ background:url(../images/banner_next.png) no-repeat 0 0;}
	/*--end banner--*/


	.panelWrapper{ width:160px; padding-bottom:4px; margin-bottom:10px; background:url(../images/panel_bottom.png) no-repeat 0 bottom;}
	.panelWrapper .panelTop h4{ line-height:31px; text-indent:3px; color: #CCC}
	.panelWrapper .panelTop{ width:160px; height:31px; background:url(../images/panel_top.png) no-repeat 0 0;}
	.panelWrapper .panelBody{ width:160px; padding:4px 0 0 0; background:url(../images/panel_body.png) repeat-y 0 0;}
	.panelWrapper .panelBody .cr_wp li{ margin:0 10px; line-height:20px;}
	.panelWrapper .panelTop .cr_icon{ background:url(../images/cr_icon.png) no-repeat 135px 7px;}
	.panelWrapper .panelTop .email_icon{ background:url(../images/email_icon.png) no-repeat 135px 10px;}
	.panelWrapper .emailWrapper{ width:149px; padding:10px 0 8px 11px;}
	.panelWrapper .contactWrapper{ text-align:center; line-height:30px;}
	.panelWrapper .input_email{ width:130px; height:19px; padding:2px 4px 0; border:none; font-size:12px; color:#7c7c7c; background:url(../images/input_email.png) no-repeat 0 0; margin:0 10px;}
	.panelWrapper .btn_email{ clear:left; width:60px; height:19px; margin:6px 0 0 10px; outline:none; border:none; cursor:pointer; background:url(../images/btn_email.png) 0 0;}
	.panelWrapper .btn_email:hover{ background-position:0 bottom;}
	.panelWrapper .btn_email:active{ background-position:0 center;}

	ul.promoListing li{ width:90%; margin:0 auto; padding:14px 0 15px; display:block; text-align:center; border-bottom:#e3e3e3 1px solid;}
	ul.promoListing li.last{ border:none;}
	ul.promoListing li a, ul.promoListing li a:visited{display:inline-block; padding-top:2px; font:bold 12px tahoma; line-height:15px; text-decoration:none; color:#077fb9;}
	ul.promoListing li a:hover{ color:#f58120;}
	ul.promoListing li span{ display:block; padding-top:2px;color:#e77a1e; font-size:12px;}
	ul.promoListing li img{ width:140px;}
	ul.promoListing li span.redus{text-decoration: line-through; color: #868686;}
	.panelWrapper .panelTop .promo_icon{ background:url(../images/promo_icon.png) no-repeat 120px 10px;}

	.panelWrapper .panelTop .tw_icon{ background:url(../images/tw_icon.png) no-repeat 135px 9px;}

	/*--end right--*/

	/*--links--*/
	.links{ width:940px; height:72px; padding-bottom:20px; background:url(../images/links_bg.png) no-repeat 0 0;}
	.links li{ float:left; height:72px; display:block; padding:0 16px; background:url(../images/links_spacer.png) no-repeat left 1px;}
	.links li.last{ background-image:none;}
	.links li img{ vertical-align:middle; margin-top:20px;}

	/*--end links--*/

	/*listingBox*/
	.listingBox{ width:770px; padding-bottom:10px;}
	.listingBox_top{ width:770px; height:10px; font-size:0px; background:url(../images/listingBox_top.png) no-repeat 0 0;}
	.listingBox_body{ width:770px; padding:8px 0; background:url(../images/listingBox_body.png) repeat-y 0 0;}
	.listingBox_bottom{ width:770px; height:10px; font-size:0px; background:url(../images/listingBox_bottom.png) no-repeat 0 0;}

	 .prod_1{ float:left; width:384px; border-right:#ececec 1px solid;}
	 .prod_1 li,.prod_2 li{ font-weight:normal; line-height:20px;}
	 .prod_2{ float:right; width:384px;}

	 .prod_img{ float:left; width:180px; text-align:center;}
	 .prod_img a{ display:inline-block; width:150px; height:150px;}
	 .prod_img .flag_cadou{ position:absolute; margin-top:105px; height:34px; width:185px; display:block; text-indent:-99999px; background:url(../images/flag_cadou_s.png) no-repeat center 0;}
	*:first-child+html  .prod_img .flag_cadou{ width:150px;}
	 .prod_price{ height:25px; display:inline-block; background:url(../images/price_center.gif) repeat-x 0 0;}
	 .prod_price span{ height:25px; padding:0 0 0 10px; display:inline-block; background:url(../images/price_left_corner.gif) no-repeat 0 0;}
	 .prod_price span span{ padding:0 10px 0 0; color:#f58120; font:bold 21px arial; background:url(../images/price_right_corner.gif) no-repeat right 0;}
	 .prod_price span span em{ font:bold 14px arial; color:#343434;}

	 .prod_details{ float:right; width:197px;}
	 .prod_details h3{ padding-bottom:8px;}
	 .prod_details h3 a{ font:bold 12px tahoma; color:#0a69a5; text-decoration:none;}
	 .prod_details h3 a:hover{ color:#f58120;}
	 .prod_details .prod_specs{ width:194px; height:122px; display:block; overflow:hidden; font-size:12px; color:#555;}
	 .prod_details .prod_specs li{ display:block; padding-bottom:3px;}
	 .prod_details .prod_specs li span{ font-weight:bold;}

	 .prod_details .prod_controls{ padding:6px 0 0 0;}
	 .prod_details .prod_controls li{ float:left; padding-right:8px; line-height:18px;}
	 .prod_details .prod_controls li a{ height:20px; padding:5px 0 0 33px; display:inline-block; font-size:12px; text-decoration:none; color:#fff;}
	 .prod_details .prod_controls li a:hover{ text-decoration:underline;}
	 .prod_details .prod_controls li a:active{ height:19px; padding:6px 0 0 33px;}
	 .prod_details .prod_controls li .btn_detalii{ width:34px; background:#0977b1 url(../images/btn_detalii.png) no-repeat 0 0;}
	 .prod_details .prod_controls li .btn_adauga{ width:72px; background:#da691e url(../images/btn_adauga.png) no-repeat 0 0;}
	/*end listingBox*/

	.about{ text-indent:2em; margin:0 10px 10px 10px;line-height:20px;}
	.about h3 a{ color:#333}
	.about h3{ text-indent:90px; margin-bottom:5px; height:40px; line-height:35px;}
	.about img{ float:right;}
	.news{ margin:0 10px 10px 10px; }
	.news h3 { text-indent:90px; margin-bottom:5px;height:40px; line-height:35px;}
	.news ul{ list-style:none; }
	.news li{ background:url(../images/icon.gif) no-repeat left; padding-left:15px; line-height:20px;}
	.news li span{ float:right; color:#999}
	.pt{ margin:0 0 10px 10px;text-indent:90px; margin-bottom:5px; background:url(../images/title.png) no-repeat; height:40px; line-height:35px;}
	.pt a{ color: #333}

	/*--end primary--*/

	#secondary{ float:right; width:160px;}
	.panelWrapper{ width:160px; padding-bottom:4px; margin-bottom:10px; background:url(../images/panel_bottom.png) no-repeat 0 bottom;}
	.panelWrapper .panelTop{ width:160px; height:31px; background:url(../images/panel_top.png) no-repeat 0 0;}
	.panelWrapper .panelBody{ width:160px; padding:4px 0 0 0; background:url(../images/panel_body.png) repeat-y 0 0;}

	#secondary .panelDark{background:url(../images/panel_bottom_dark.png) no-repeat 0 bottom;}
	#secondary .panelDark .panelBody{ background:url(../images/panel_body_dark.png) repeat-y 0 0;}

	.panelWrapper .panelTop h4{ height:21px; padding:9px 0 0 10px; font:bold 12px tahoma; color:#868686;}
	.panelWrapper .panelTop h4 span{ height:20px; display:block;}
	.panelWrapper .panelTop h4 .cr_icon{ background:url(../images/cr_icon.png) no-repeat 125px 0;}
	.panelWrapper .panelTop h4 .newsletter_icon{ background:url(../images/newsletter_icon.png) no-repeat 126px 3px;}
	.panelWrapper .panelTop h4 .promo_icon{ background:url(../images/promo_icon.png) no-repeat 110px 2px;}
	.panelWrapper .panelTop h4 .tw_icon{ background:url(../images/tw_icon.png) no-repeat 127px 2px;}
	.panelWrapper .panelTop h4 .filter_icon{ background:url(../images/filter_icon.png) no-repeat 129px 1px;}
	.panelWrapper .panelTop h4 .info_icon{ background:url(../images/info_icon.png) no-repeat 129px 1px;}

	.panelWrapper .cr_wp{ padding:5px 0;}
	.panelWrapper .a_cr_icon, .panelWrapper .a_cr_icon:visited{ width:84px; height:50px; padding:1px 57px 0 12px; display:block; text-decoration:none; font-size:12px; line-height:14px; color:#868686; background:url(../images/clock_icon.png) no-repeat right 0;}
	.panelWrapper .a_cr_icon:hover{ color:#e77a1e; background-position:right bottom;}

	.panelWrapper .tw_wp{padding:5px 0 2px;}


	.panelWrapper .newsletterWrapper{ width:149px; padding:10px 0 8px 11px;}
	.panelWrapper .input_newsletter{ width:130px; height:19px; padding:2px 4px 0; border:none; font-size:12px; color:#7c7c7c; background:url(../images/input_newsletter.png) no-repeat 0 0;}
	.panelWrapper .btn_abonare{ clear:left; width:52px; height:19px; margin-top:6px; outline:none; border:none; cursor:pointer; background:url(../images/btn_abonare.png) 0 0;}
	.panelWrapper .btn_abonare:hover{ background-position:0 bottom;}
	.panelWrapper .btn_abonare:active{ background-position:0 center;}


	ul.promoListing li{ width:90%; margin:0 auto; padding:14px 0 15px; display:block; text-align:center; border-bottom:#e3e3e3 1px solid;}
	ul.promoListing li.last{ border:none;}
	ul.promoListing li a, ul.promoListing li a:visited{display:inline-block; padding-top:2px; font:bold 12px tahoma; line-height:15px; text-decoration:none; color:#077fb9;}
	ul.promoListing li a:hover{ color:#f58120;}
	ul.promoListing li span{ display:block; padding-top:2px;color:#e77a1e; font-size:12px;}
	ul.promoListing li span.redus{text-decoration: line-through; color: #868686;}
	/*--end secondary--*/
	#filters{ float:left; width:160px; padding-right:10px;}
	#filters .panelBody{ padding:0;}
	#filters .filterBox h3{ width:148px; height:17px; margin:0 auto; padding:4px 0 6px 10px; font:bold 12px tahoma; color:#6f6f6f; background:url(../images/filters_title.png) repeat-x 0 0;}
	#filters .filterBox h3 span{ font-weight:normal;}
	#filters .filterBox .ul_filters{ width:135px; padding:5px 10px 7px 12px; display:block;}
	#filters .filterBox .ul_filters li{   border-bottom:1px dashed #CCC; margin-bottom:7px; background-image:url(../images/icon.gif); background-repeat:no-repeat; background-position:left;  padding-bottom:3px; padding-left:10px;}
	#filters .filterBox .ul_filters .top1{ background-image:url(../images/top_1.gif);padding-left:20px;}
	#filters .filterBox .ul_filters .top2{ background-image:url(../images/top_2.gif);padding-left:20px;}
	#filters .filterBox .ul_filters .top3{ background-image:url(../images/top_3.gif);padding-left:20px;}
	#filters .filterBox .ul_filters .top4{ background-image:url(../images/top_4.gif);padding-left:20px;}
	#filters .filterBox .ul_filters .top5{ background-image:url(../images/top_5.gif);padding-left:20px;}
	#filters .filterBox .ul_filters .top6{ background-image:url(../images/top_6.gif);padding-left:20px;}
	#filters .filterBox .ul_filters .top7{ background-image:url(../images/top_7.gif);padding-left:20px;}
	#filters .filterBox .ul_filters .top8{ background-image:url(../images/top_8.gif);padding-left:20px;}
	#filters .filterBox .ul_filters .top9{ background-image:url(../images/top_9.gif);padding-left:20px;}
	#filters .filterBox .ul_filters .top10{ background-image:url(../images/top_10.gif);padding-left:20px;}
	#filters .filterBox .ul_filters li a, #filters .filterBox .ul_filters li a:visited{ font:normal 12px tahoma; color:#0481b7; text-decoration:none;}
	#filters .filterBox .ul_filters li a:hover{ text-decoration:underline; color:#E77A1E;}
	#filters .filterBox .ul_filters li.selected a{ font-weight:bold; color:#E77A1E;}
	#filters .filterBox select{ width:130px; height:19px; padding:1px 0 0 2px; margin:4px 0 18px 13px; font:normal 12px tahoma; color:#0481b7;}


	#primaryFiltered{ float:left;width:600px;}
	.filterControls{ width:600px; height:26px; padding-bottom:10px; font-size:12px; background:url(../images/filterControls_bg.png) no-repeat 0 0;}
	.filterControls a{ color:#999}
	.filterControls .back_next { float:right;  line-height:26px; color:#999}
	.filterControls .back_next li{ float:right; margin-right:15px;}
	.page{ float:left; width:87px; height:20px; padding:6px 0 0 10px; overflow:hidden;}
	.page span{ float:left; width:34px; height:13px; display:block; font-weight:bold; color:#777;}
	.page a{ float:left; font-size:5px; width:21px; height:12px; display:block; margin:1px 4px 0 0; text-indent:-999999px; overflow:hidden;}
	.page a:hover{ background-position:0 center;}
	.page a:active{ background-position:0 bottom;}
	.page a.active{ background-position:0 center;}
	.page .btn_ordonare_descendenta{ background:url(../images/btn_ordonare_descendenta.png) no-repeat 0 0;}
	.page .btn_ordonare_ascendenta{ background:url(../images/btn_ordonare_ascendenta.png) no-repeat 0 0;}

	.paginatorWrapper{ float:right; width:auto;  padding:0px 8px 0 0; line-height:25px; float:right; font-size:11px; color: #999}
	.paginatorWrapper span { width:auto; float: none; margin:0 2px; padding:0; color:#999}
	.paginatorWrapper a{ float:none;}
	.paginatorWrapper .curr{  padding:0 3px 2px 3px; background: #F90; color:#FFF}
	.filterProducts_listing .listingBox01{ position:relative; width:600px; height:auto; padding-bottom:10px;}
	.filterProducts_listing .listingBox01_top{ width:600px; height:10px; font-size:0px; background:url(../images/listingBox01_top.png) no-repeat 0 0;}
	.filterProducts_listing .listingBox01_body{ width:600px; height:auto; padding:8px 0; background:url(../images/listingBox01_body.png) repeat-y 0 0;}
	.filterProducts_listing .listingBox01_bottom{ width:600px; height:10px; font-size:0px; background:url(../images/listingBox01_bottom.png) no-repeat 0 0;}
	.filterProducts_listing .article{ margin:0 20px; line-height:35px; color:#666}
	.filterProducts_listing .article span { float:right; color:#CCC;}
	.filterProducts_listing .article li{ border-bottom:1px dashed #CCC; background:url(../images/list.png) left no-repeat; padding-left:20px;}
	.filterProducts_listing .prod_img01{ float:left; width:190px; height:auto; text-align:center;}

	/*.filterProducts_listing .listingBox01 .flag_promotie{ position:absolute; top:12px; right:15px; width:72px; height:19px; display:block; text-indent:-99999px; background:url(../images/flag_promotie_s.png) no-repeat 0 0;}*/

	.filterProducts_listing .prod_details01{ float:right; width:400px;}
	.filterProducts_listing .prod_details01 h3{ padding-bottom:8px;}
	.filterProducts_listing .prod_details01 h3 a{ font:bold 12px tahoma; color:#0a69a5; text-decoration:none;}
	.filterProducts_listing .prod_details01 h3 a:hover{ color:#f58120;}
	.filterProducts_listing .prod_details01 .prod_specs01{ width:260px; display:block; font-size:12px; color:#555; line-height:15px; color:#666;}
	.filterProducts_listing .prod_details01 .prod_specs01 li{ display:block; padding-bottom:3px;}
	.filterProducts_listing .prod_details01 .prod_specs01 li span{ font-weight:bold;}

	.filterProducts_listing .prod_details01 .btn_detalii, .filterProducts_listing .prod_details01 .btn_adauga:visited{ position:absolute; bottom:50px; right:0px; width:67px; height:20px; padding:5px 0 0 33px; display:inline-block; font-size:12px; text-decoration:none; color:#fff; background: url(../images/btn_detalii.png) no-repeat 0 0;}
	.filterProducts_listing .prod_details01 .btn_detalii:hover{ text-decoration:underline;}
	.filterProducts_listing .prod_details01 .btn_detalii:active{ height:19px; padding:6px 0 0 33px;}

	.filterProducts_listing .prod_price{ position:absolute; bottom:110px; right:15px; width:auto; height:25px; display:inline-block; background:url(../images/price_center.gif) repeat-x 0 0;}
	.filterProducts_listing .redus{ bottom:100px; }
	.filterProducts_listing .prod_price span{ height:25px; padding:0 0 0 10px; display:inline-block; background:url(../images/price_left_corner.gif) no-repeat 0 0;}
	.filterProducts_listing .prod_price span span{ padding:0 10px 0 0; color:#f58120; font:bold 21px arial; background:url(../images/price_right_corner.gif) no-repeat right 0;}
	.filterProducts_listing .prod_price span span em{ font:bold 14px arial; color:#343434;}

	.filterProducts_listing .prod_redus{ position:absolute; bottom:130px; right:15px; width:auto; height:25px; display:inline-block; background:url(../images/price_center.gif) repeat-x 0 0;}
	.filterProducts_listing .prod_redus span{ height:25px; padding:0 0 0 10px; display:inline-block; background:url(../images/price_left_corner.gif) no-repeat 0 0;}
	.filterProducts_listing .prod_redus span span{ padding:0 10px 0 0; color:#999999; text-decoration:line-through; font:bold 21px arial; background:url(../images/price_right_corner.gif) no-repeat right 0;}
	.filterProducts_listing .prod_redus span span em{ font:bold 14px arial; color:#999999;}


	.text{  line-height:25px; margin:0 10px; color:#666}



	.book { line-height:20px; text-align:left; width:770px}
	.book legend{ font-size:15px;}
	.book form{ margin:20px 0 0 50px;}
	.book .fy{ float:left; width:648px; text-align:right; }
	.book li{ border:1px #ccc solid; padding:10px;}
	.book .b2{ float:right; color:#999;}
	.book span{ float:none; margin:0}
	.book a{ float:none}


	.productMain_area{ width:760px;}
	.product_info{ width:760px; float:left; margin-bottom:20px;line-height:35px;}
	.product_info h1{ width:400px; padding-left:0; }
	.product_info span{ font-weight:900;}
	.product_info .product_view{ float:left; margin-left:30px;}
	.product_info .product_img{ float:left;}
	.product_info .product_img img{ width:300px;}
	.product_info .prod_price{ line-height:normal;}
	.product_content{width:765px; float:left; line-height:25px; color:#666;}
	.product_content h1{ margin-bottom:10px; padding:0; font-size:16px;}

	.hr_info { margin:0 10px 20px 10px; line-height:25px; height:50px;border:1px #CCC dotted; }
	.hr_info span{ font-weight:900; color:#39F}
	.hr_info li{ width:50%; float:left; text-indent:10px;}
	.hr_info .b{background-color: #E8E8E8;}
	//web.xml
	<?xml version="1.0" encoding="UTF-8"?>
	<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
	  <listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	  </listener>
	  <context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	  </context-param>
	  <filter>
		<filter-name>struts2</filter-name>
		<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
	  </filter>
	  <filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>*/
	  </filter-mapping>
	</web-app>
	//changepwd.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>


	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		
		<title>changepwd</title>
		
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">    
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		
		<link rel="stylesheet" type="text/css" href="style/style.css" >
		<link rel="stylesheet" type="text/css" href="style/default.css" >
		<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		-->
		<script language="javascript">
		
		function check(){
		var oldpwd=document.getElementById("oldpwd").value;
		var newpwd=document.getElementById("newpwd").value;
		var confirmpwd=document.getElementById("confirmpwd").value;
			if(oldpwd!=""&&newpwd!=""&&confirmpwd!="")
			{
				if(newpwd!=confirmpwd)
				{
					document.getElementById("secondpwd").style.display="inline";
					return false;
					
				}
				return true;
			}
			else{
				alert("密码不能为空!");
				return false;
			}
		}
	</script>
	  </head>  	
	  <body>
		<form  method="post" name="myform" action="user/changepwd" onsubmit="return check()">
			<div align="center">
			<table width="400" border="0" class="table">
				<tbody>
					<tr>
					<td>&nbsp;当前密码:</td>
					<td>
						<input type="password" name="pwd.oldpwd" id="oldpwd">
						<span style="color:red;">* <s:fielderror/></span>
					</td>
					</tr>
					<tr>
					<td width="100">&nbsp;新密码:</td>
					<td>
						<input type="password" name="pwd.newpwd" id="newpwd" >
						<span style="color:red;">*</span>
					</td></tr>
					<tr>
					<td>&nbsp;确认密码:</td>
					<td>
						<input type="password" name="pwd.confirmpwd" id="confirmpwd" >
						<span style="color:red;">*</span>
						<span style="color:red;display:none;" id="secondpwd">两次密码不一致</span>
					</td>
					</tr>
					<tr>
					<td>&nbsp;</td>
					<td>&nbsp;<input type="Submit" value="修改" /> </td>
					</tr>
				</tbody>
			</table>
				 
			</div> 
				
		</form>
	  </body>
	</html>
	//checklogin.jsp
	<%@page import="com.netbank.entity.Account"%>
	<%
		Account account=(Account)session.getAttribute("user");
		if(account==null){
			request.getRequestDispatcher("login.jsp").forward(request,response);
		}

	%>
	//deposit.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>


	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		
		<title>deposit</title>
		
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">    
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		
		<link rel="stylesheet" type="text/css" href="style/style.css" >
		<link rel="stylesheet" type="text/css" href="style/default.css" >
		<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		-->
		<script language="javascript" >
		
		
		
		function disptime(){
		var now=new Date();
		
		var year=now.getFullYear();
		var month=now.getMonth()+1;
		var date=now.getDate();
		var hour=now.getHours();
		var minute=now.getMinutes();
		var second =now.getSeconds();
			document.getElementById("datetime").value=year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
			//year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
			setTimeout("disptime()", 1000);
		}
		
		function deposit(){
			var money=document.getElementById("trMoney").value;
			if(money.length>0){
						
				if(!(money.search(/^[\+\-]?\d+\.?\d*$/)==0))
				{
					document.getElementById("errormoney").innerHTML="含有非法字符";
					return false;
				}else
				{
					if(parseFloat(money)==0)
					{
						document.getElementById("errormoney").innerHTML="金额必须大于0";
						return false;
					}
					return confirm("确认存款吗?");
				}
					
			}else {
				alert("金额不能为空!");
				return false;
					
			}
		}
		
		
	</script>
	  </head>
		
	  <body onload="disptime()">
		<form  method="post" name="myform" action="/netbank/transaction/deposit" onsubmit="return deposit()">
			<div align="center">
			<table width="400" border="0" class="table">
				<tbody>
					<tr>
					<td width="100">&nbsp;存款时间:</td>
					<td><input type="text" name="log.datetime" id="datetime"></td>
					</tr>
					<tr>
					<td>&nbsp;存款金额:</td>
					<td>
						<input type="text" name="log.trMoney" id="trMoney" value="${log.trMoney}">
						<span id="errormoney" style="color:red;"></span>
					</td>
					</tr>
					<tr>
					<td>&nbsp;</td>
					<td>&nbsp;<input type="Submit" value="存款" /> </td>
					</tr>
				</tbody>
			</table>
				<div style="color:red;"> 
				<s:fielderror /> 
				</div> 
			</div> 
		</form>
	  </body>
	</html>
	//down.html
	<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
	<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
	<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
	<style type="text/css">
	<!--
	body {
		margin-left: 0px;
		margin-top: 0px;
		margin-right: 0px;
		margin-bottom: 0px;
	}
	.STYLE1 {
		font-size: 12px;
		color: #147233;
	}
	-->
	</style></head>

	<body>
	<table width="100%" border="0" cellspacing="0" cellpadding="0">
	  <tr>
		<td height="23" background="images/main_25.gif"><table width="100%" border="0" cellspacing="0" cellpadding="0">
		  <tr>
			<td width="181" height="23" background="images/main_24.gif">&nbsp;</td>
			<td><div align="right" class="STYLE1">???????2007??08??15?? ??????</div></td>
			<td width="25"><img src="images/main_27.gif" width="25" height="23" /></td>
		  </tr>
		</table></td>
	  </tr>
	</table>
	</body>
	</html>
	//header.jsp
	<%@page contentType="text/html;charset=gb2312" import="java.sql.*,java.util.*"%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
	<HTML>
	<HEAD>
	<META http-equiv=Content-Type content="text/html; charset=gb2312">
	<LINK href="css/admin.css" type="text/css" rel="stylesheet">
	</HEAD>
	<BODY>
	<TABLE cellSpacing=0 cellPadding=0 width="100%" 
	background="images/header_bg.jpg" border=0>
	  <TR height=56>
		<TD width=260><IMG height=56 src="images/header_left.jpg" 
		width=260></TD>
		<TD style="FONT-WEIGHT: bold; COLOR: #fff; PADDING-TOP: 20px" 
		  align=middle>当前用户: <s:property value="#session.personinfo.realname"/>  &nbsp;&nbsp; </TD>
		<TD align=right width=268><IMG height=56 
		  src="images/header_right.jpg" width=268></TD></TR></TABLE>
	<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
	  <TR bgColor=#1c5db6 height=4>
		<TD></TD></TR></TABLE></BODY></HTML>
	//index.jsp
	<%@page contentType="text/html;charset=gb2312" import="java.sql.*,java.util.*"%>
	<%
		if(session.getAttribute("user")==null)
		{ 
	%>
			<jsp:forward page="login.jsp"></jsp:forward>
	<%
		}
	%>
	<html>
	<head>
	<title>网上银行</title>
	<LINK href="css/admin.css" type="text/css" rel="stylesheet">
	</head>
	<FRAMESET border=0 frameSpacing=0 rows="60, *" frameBorder=0>
	<FRAME name=header src="/netbank/header.jsp" frameBorder=0 noResize scrolling=no>
	<FRAMESET cols="170, *">
	<FRAME name=menu src="/netbank/left.jsp" frameBorder=0 noResize>
	<FRAME name=main src="/netbank/main.jsp" frameBorder=0 noResize scrolling=yes>
	</FRAMESET>
	</FRAMESET>
	<noframes>
	</noframes>
	</html>
	//information.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		
		<title>账户信息</title>
		
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">    
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<link rel="stylesheet" type="text/css" href="style/style.css">
		<link rel="stylesheet" type="text/css" href="style/default.css">
		<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		<%@ include file='checklogin.jsp' %>
		-->
		
	  </head>
	  
	  <body ><br>
	  <div  align="center">
			<table width="450" border="1" class="table">
				<tbody>
					<tr><td>账户:</td>
					<td>&nbsp;${user.accountid}</td></tr>
					<tr><td>姓名:</td>
					<td>&nbsp;${personinfo.realname}</td></tr>
					<tr>
					<td>年龄:</td>
					<td>&nbsp;${personinfo.age}</td></tr>
					<tr>
					<td>性别:</td>
					<td>&nbsp;${personinfo.sex}</td></tr> 
					<tr><td>家庭地址:</td>
					<td>&nbsp;${personinfo.address}</td></tr>
					<tr>
					<td>联系电话:</td>
					<td>&nbsp;${personinfo.telephone}</td></tr>
					<tr>
					<td>证件号码:</td>
					<td>&nbsp;${personinfo.cardid}</td></tr>
					<tr>
					<td>账户余额:</td>
					<td>${user.balance}<br></td></tr>
				</tbody>
			</table> 		
			</div>
	  </body>
	</html>
	//left.jsp
	<%@page contentType="text/html;charset=gb2312" import="java.sql.*,java.util.*"%>

	<%--
	if(session.getAttribute("user")!=null){
	//--------------------------------------logged------------------------------------------------------------------
		
	--%>
	<html>
	<head>
	<title>管理页面</title>
	<LINK href="css/admin.css" type="text/css" rel="stylesheet">
	</head>
	<BODY>
	<TABLE height="100%" cellSpacing=0 cellPadding=0 width=170 background=images/menu_bg.jpg border=0>
	  <TR>
		<TD vAlign=top align=middle>
		  <TABLE cellSpacing=0 cellPadding=0 width=150 border=0>        
			<TR height=22>
			  <TD style="PADDING-LEFT: 30px" background=images/menu_bt.jpg><A 
				class=menuParent onclick=expand(1) 
				href="javascript:void(0);">操作菜单</A></TD></TR>
			<TR height=4>
			  <TD></TD></TR></TABLE>
		  <TABLE id=child0 cellSpacing=0 cellPadding=0 width=150 border=0>        
			<TR height=20>
			  <TD align=middle width=30><IMG height=9 
				src="images/menu_icon.gif" width=9></TD>
			  <TD><A class=menuChild href="/netbank/deposit.jsp" target=main>存款</A></TD></TR>
			<TR height=20>
			  <TD align=middle width=30><IMG height=9 
				src="images/menu_icon.gif" width=9></TD>
			  <TD><A class=menuChild href="/netbank/withdrawal.jsp" target=main>取款</A></TD></TR>
			  <TR height=20>
			  <TD align=middle width=30><IMG height=9 
				src="images/menu_icon.gif" width=9></TD>
			  <TD><A class=menuChild href="/netbank/transfer.jsp" target=main>转账</A></TD></TR><TR height=20>
			  <TD align=middle width=30><IMG height=9 
				src="images/menu_icon.gif" width=9></TD>
			  <TD><A class=menuChild href="/netbank/transaction/list?pager.curPage=1" target=main>查询交易记录</A></TD></TR><TR height=20>
			  <TD align=middle width=30><IMG height=9 
				src="images/menu_icon.gif" width=9></TD>
			  <TD><A class=menuChild href="/netbank/information.jsp" target=main>查看信息</A></TD></TR><TR height=20>
			  <TD align=middle width=30><IMG height=9 
				src="images/menu_icon.gif" width=9></TD>
			  <TD><A class=menuChild href="/netbank/modify.jsp" target=main>修改个人信息</A></TD></TR><TR height=20>
			  <TD align=middle width=30><IMG height=9 
				src="images/menu_icon.gif" width=9></TD>
			  <TD><A class=menuChild href="/netbank/changepwd.jsp" target=main>修改密码</A></TD></TR><TR height=20>
			  <TD align=middle width=30><IMG height=9 
				src="images/menu_icon.gif" width=9></TD>
			  <TD><A class=menuChild href="/netbank/user/user_logout" target=main>注销</A></TD></TR>
		  </TABLE>
		</TD>
		<TD width=1 bgColor=#d1e6f7></TD>
	  </TR>    
	</TABLE>
	<%--
	}
	--%>
	//login.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
	<%@ taglib uri='/struts-tags' prefix='s' %>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		
		<title>login</title>
		
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">    
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<link rel="stylesheet" type="text/css" href="style/style.css" >
		<link rel="stylesheet" type="text/css" href="style/default.css" >
		<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		-->
	<script language="javascript" >
		function login(){
		
			var hidden=document.getElementById("hidden").value;
			if(document.getElementById("username"+hidden).value ==""){
				alert("用户名不能为空");
				return false;
			}else if(document.getElementById("password"+hidden).value ==""){
				alert("密码不能为空");
				return false;
			} else {
				return true;
			}
		}
		function adminlogin(){
		document.getElementById("username1").style.display="none";
		document.getElementById("password1").style.display="none";
		document.getElementById("username2").style.display="block";
		document.getElementById("password2").style.display="block";
		document.myform.action="admin/login"
		}
		
		function init(){
		document.getElementById("username1").style.display="block";
		document.getElementById("password1").style.display="block";
		document.getElementById("username2").style.display="none";
		document.getElementById("password2").style.display="none";
		document.myform.action="user/user_login";
		}
		function change(){
		
			var select=document.myform.type.value;
			if(select=="0")
			{
				var username2=document.getElementById("username2").value;
				var password2=document.getElementById("password2").value;
				init();
				document.getElementById("username1").value=username2;
				document.getElementById("password1").value=password2;
			}
			if(select=="1")
			{
				var username1=document.getElementById("username1").value;
				var password1=document.getElementById("password1").value;
				adminlogin();
				document.getElementById("username2").value=username1;
				document.getElementById("password2").value=password1;
			}
		}
	</script>
	  </head>
	  
	  <body onload="init()">
			<div align="center">
			<form method="post" name="myform" action="user/user_login" onsubmit="return login()">
				<table width="450" border="0" class="table">
					<tbody>
					<tr>
						<td colspan="2" align="center">
						</td>
						
					</tr>
					<tr>
					<td>&nbsp;用户名:</td>
					<td>&nbsp; 
						<input id="username1" type="text" name="account.username" >
						<input id="username2" type="text" name="admin.username" >
						
					</td>
					</tr>
					<tr>
					<td>&nbsp;密码:</td>
					<td>&nbsp; 
						<input id="password1" type="password" name="account.password">
						<input id="password2" type="password" name="admin.password">
						
					</td></tr>
					<tr>
					<td>
						&nbsp;用户类型:
					</td>
					<td>
						<select name="type" onchange="change()">
							<option value="0" selected>客户</option>
							<option value="1">Admin</option>
						</select>
					</td>
					</tr>
					<tr>
					<td>
						
					</td>
					<td>&nbsp; 
						<input type="submit" value="登录" id="login">
						<input type="hidden" id="hidden">
					</td></tr>
					</tbody>
				</table>
				<s:fielderror fieldName="username" cssStyle="color:red;"/>
				<s:fielderror fieldName="password" cssStyle="color:red;"/>
				
			</form> 
		</div>
	  </body>
	</html>
	//main.jsp
	<%@page import="java.text.SimpleDateFormat"%>
	<%@page import="java.util.Date"%>
	<%@page contentType="text/html;charset=gb2312" import="java.sql.*,java.util.*"%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
	<HTML>
	<HEAD>
	<META http-equiv=Content-Type content="text/html; charset=gb2312">
	<LINK href="css/admin.css" type="text/css" rel="stylesheet">
	</HEAD>
	<BODY>
	<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center border=0>
	  <TR height=28>
		<TD background=images/title_bg1.jpg>&nbsp;当前位置: </TD></TR>
	  <TR>
		<TD bgColor=#b1ceef height=1></TD></TR>
	  <TR height=20>
		<TD background=images/shadow_bg.jpg></TD></TR></TABLE>
	<TABLE cellSpacing=0 cellPadding=0 width="90%" align=center border=0>
	  <TR height=100>
		<TD align=middle width=100><IMG height=100 src="images/admin_p.gif" 
		  width=90></TD>
		<TD width=60>&nbsp;</TD>
		<TD>
		  <TABLE height=100 cellSpacing=0 cellPadding=0 width="100%" border=0>
			
			<TR>
			  <TD>当前时间:
			  <%  
				Date d=new Date();
				SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
				out.println(sdf.format(d));   
			  %> 
			  </TD></TR>
			<TR>
			  <TD style="FONT-WEIGHT: bold; FONT-SIZE: 16px"></TD></TR>
			<TR>
			  <TD>欢迎进入网上银行交易中心!</TD></TR></TABLE></TD></TR>
	  <TR>
		<TD colSpan=3 height=10></TD></TR></TABLE>

	</BODY></HTML>
	//message.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		
		<title>file upload success</title>
		
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">    
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		
		<link rel="stylesheet" type="text/css" href="">
		

	  </head>
	  
	  <body> 
		<div align="center">
			<s:fielderror cssStyle="color:red;"/>
			${message}<br>
			<!--上传时间:<s:date name="date"/><br>
						 realPath:${realPath}<br>
						contextPath:${contextPath}<br>
						contextName:${contextName}<br> -->
			
		</div>
	  </body>
	</html>
	//modify.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		
		<title>My JSP 'modify.jsp' starting page</title>
		
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">    
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<link rel="stylesheet" type="text/css" href="style/style.css">
		<link rel="stylesheet" type="text/css" href="style/default.css">

		<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		-->

	  </head>
	  
	  <body>
	  <form method="post" name="myform" action="/netbank/info/info_modify">
	  <div align="center">
		<table width="450" class="table">
			<tbody>
				<tr><td>姓名:</td>
				<td>&nbsp;<input type="text" name="personinfo.realname" value="${personinfo.realname}"/></td></tr>
				<tr>
				<td>年龄:</td>
				<td>&nbsp;<input type="text" name="personinfo.age" value="${personinfo.age}"/></td></tr>
				<tr>
				<td>性别:</td>
				<td>&nbsp;<select name="personinfo.sex" >
							<option value="男" >男</option>
							<option value="女" >女</option>
						</select></td></tr> 
				<tr><td>家庭地址:</td>
				<td>&nbsp;<input type="text" name="personinfo.address" value="${personinfo.address}"/></td></tr>
				<tr>
				<td>联系电话:</td>
				<td>&nbsp;<input type="text" name="personinfo.telephone" value="${personinfo.telephone}"/><font size="1" style="color:red;">区号(3或4位)-电话(8或9位)</font></td></tr>
				<tr>
				<td>证件号码:</td>
				<td>&nbsp;<input type="text" name="personinfo.cardid" value="${personinfo.cardid}"/><font size="1" style="color:red;">15位或18位</font></td></tr>
				<tr>
				<td>&nbsp;</td>
				<td><input type="submit" value="提交" /> <br></td></tr>
			</tbody>
			</table>
			<div style="color:red;"> 
			<s:fielderror /> 
			</div> 
			</div>
			<br>
	  </form>
		
	   </body>
	</html>
	//transactionlog.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		
		<title>账户信息</title>
		
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">    
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<link rel="stylesheet" type="text/css" href="style/style.css">
		<link rel="stylesheet" type="text/css" href="style/default.css">
		<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		<%@ include file='checklogin.jsp' %>
		-->
		
		<script type="text/javascript">
			function select(){
				var curPage=document.getElementById("curPage").value;
				location.href="/netbank/transaction/list?pager.curPage="+curPage;
			}
		</script>
		</head>
	  
	  <body ><br>
	  <div  align="center">       
		<table width="650" border="1" class="table">
			<tbody align="center">
				<!--标题部分  -->
				<tr>
				<td colspan="5" style="font-size: 20;">交易记录</td></tr>
				<tr ><td width="50">&nbsp;序号</td>
				<td width="80">&nbsp;对方账户</td>
				<td width="80">&nbsp;交易金额</td>
				<td width="80">&nbsp;交类类型</td>
				<td>&nbsp;交易日期</td></tr>
				<!--循环显示记录部分  -->
				<s:iterator value="#request.logs" status="status" >
				<tr>
				<td>&nbsp;<s:property value="#status.count"/></td>			
				<s:if test="otherid==#session.user.accountid&&transactionType.name!='取款'">
					<td>&nbsp;<s:property value="account.accountid"/></td>
					<td>&nbsp;<s:property value="trMoney"/></td>
				</s:if>
				<s:else>
					<td>&nbsp;<s:property value="otherid"/></td>
					<td>&nbsp;-<s:property value="trMoney"/></td>				
				</s:else>
				<td><s:property value="transactionType.name"/></td>
				<td>&nbsp;<s:property value="datetime"/></td></tr>
				</s:iterator>				
			</tbody>
		</table>
		<!-- 分页超链接部分 -->
		<table>
		  <tr >
			<td width="130"></td>
			<td width="80">
				<s:if test="pager.curPage>1">
					<A href='/netbank/transaction/list?pager.curPage=1'>首页</A>&nbsp;&nbsp;
					<A href='/netbank/transaction/list?pager.curPage=${pager.curPage-1 }'>上一页</A>
				</s:if>
			</td>
			<td width="80">
				<s:if test="pager.curPage < pager.pageCount">
					<A href='/netbank/transaction/list?pager.curPage=${pager.curPage+1}'>下一页</A>&nbsp;&nbsp;
					<A href='/netbank/transaction/list?pager.curPage=${pager.pageCount }'>尾页</A>
				</s:if>
			</td>
			<td>共${pager.curPage}/${pager.pageCount}页&nbsp;&nbsp;
				转至	<select onchange="select()" id="curPage">
				<s:iterator begin="1" end="pager.pageCount" status="status" >
					<s:if test="#status.count==pager.curPage">
						<option value="${status.count}" selected="selected">${status.count }</option>
					</s:if>
					<s:else>
						<option value="${status.count }">${status.count } </option>
					</s:else>
				</s:iterator>
			</select>页	
			</td>
		  </tr>
		</table>
		</div>
	  </body>
	</html>
	//transfer.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>


	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		
		<title>transfer</title>
		
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">    
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		
		<link rel="stylesheet" type="text/css" href="style/style.css" >
		<link rel="stylesheet" type="text/css" href="style/default.css" >
		<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		-->
		<script language="javascript" >
		
		function transfer(){
		var otherid=document.getElementById("otherid").value;
		var money=document.getElementById("trMoney").value;
			if(otherid!=""&&money!="")
			{
					if(!(otherid.search(/^[\+\-]?\d+\.?\d*$/)==0))
					{
						document.getElementById("errorotherid").innerHTML="含有非法字符";
						return false;
					}
					if(!(money.search(/^[\+\-]?\d+\.?\d*$/)==0))
					{
						document.getElementById("errormoney").innerHTML="含有非法字符";
						return false;
					}else
					{
						if(parseFloat(money)==0)
						{
							document.getElementById("errormoney").innerHTML="金额必须大于0";
							return false;
						}
						return confirm("确认转账吗?");
					}
			}
			else {
				alert("账户或金额不能为空!");
				return false;
				
			}
		}
		
		function disptime(){
		var now=new Date();
		
		var year=now.getFullYear();
		var month=now.getMonth()+1;
		var date=now.getDate();
		var hour=now.getHours();
		var minute=now.getMinutes();
		var second =now.getSeconds();
			document.getElementById("datetime").value=year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
			//year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
			setTimeout("disptime()", 1000);
		}
	</script>
	  </head>
		
	 <body onload="disptime()">
	<form  method="post" name="myform" action="/netbank/transaction/transfer" onsubmit="return transfer()">
		<div align="center">
		<table width="400" border="0" class="table">
			<tbody>
				<tr>
				<td>&nbsp;转账时间:</td>
				<td><input type="text" name="log.datetime" id="datetime"></td>
				</tr>
				<tr>
				<td width="100">&nbsp;对方账户:</td>
				<td>
					<input type="text" name="log.otherid" id="otherid" value="${log.otherid }">
					<span id="errorotherid" style="color:red;"></span>
				</td></tr>
				<tr>
				<td>&nbsp;转账金额:</td>
				<td>
					<input type="text" name="log.trMoney" id="trMoney" value="${log.trMoney}">
					<span id="errormoney" style="color:red;"></span>
				</td>						
				</tr>
				<tr>
				<td>&nbsp;</td>
				<td>&nbsp;<input type="Submit" value="转账" /> </td>
				</tr>
			</tbody>
		</table>
			<div style="color:red;"> 
			<s:fielderror /> 
			</div> 
		</div> 				
	</form>
	 </body>
	</html>
	//upload.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>

	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		
		<title>My JSP 'upload.jsp' starting page</title>
		
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">    
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		-->
	<script type="text/javascript">
		function disptime(){
		var now=new Date();
		
		var year=now.getFullYear();
		var month=now.getMonth()+1;
		var date=now.getDate();
		var hour=now.getHours();
		var minute=now.getMinutes();
		var second =now.getSeconds();
			document.myform.date.value=year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
			//year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
			setTimeout("disptime()", 1000);
		}
	</script>
	  </head>
	  
	  <body onload="disptime()">
		<%=basePath %>
	   <form name="myform" action="file/file_addImages" enctype="multipart/form-data" method="post">
		<input type="file" name="image">
		<input type="submit" value="upload"><br>
		<input type="text" name="date" >
	   </form> 
	</html>
	//withdrawal.jsp
	<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
	<%@ taglib uri="/struts-tags" prefix="s" %>
	<%
	String path = request.getContextPath();
	String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
	%>


	<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
	<html>
	  <head>
		<base href="<%=basePath%>">
		
		<title>withdrawal</title>
		
		<meta http-equiv="pragma" content="no-cache">
		<meta http-equiv="cache-control" content="no-cache">
		<meta http-equiv="expires" content="0">    
		<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
		<meta http-equiv="description" content="This is my page">
		
		<link rel="stylesheet" type="text/css" href="style/style.css" >
		<link rel="stylesheet" type="text/css" href="style/default.css" >
		<!--
		<link rel="stylesheet" type="text/css" href="styles.css">
		-->
		<script language="javascript" >
		
		
		
		function disptime(){
		var now=new Date();
		
		var year=now.getFullYear();
		var month=now.getMonth()+1;
		var date=now.getDate();
		var hour=now.getHours();
		var minute=now.getMinutes();
		var second =now.getSeconds();
			document.getElementById("datetime").value=year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
			//year+"-"+month+"-"+date+" "+hour+":"+minute+":"+second;
			setTimeout("disptime()", 1000);
		}
		
		function withdrawal(){
			var money=document.getElementById("trMoney").value;
			if(money.length>0){
						
				if(!(money.search(/^[\+\-]?\d+\.?\d*$/)==0))
				{
					document.getElementById("errormoney").innerHTML="含有非法字符";
					return false;
				}else
				{
					if(parseFloat(money)==0)
					{
						document.getElementById("errormoney").innerHTML="金额必须大于0";
						return false;
					}
					return confirm("确认取款吗?");
				}
					
			}else {
				alert("金额不能为空!");
				return false;
					
			}
		}
		
		
	</script>
	  </head>
		
	  <body onload="disptime()">
		<form  method="post" name="myform" action="/netbank/transaction/withdrawal" onsubmit="return withdrawal()">
			<div align="center">
			<table width="400" border="0" class="table">
				<tbody>
					<tr>
					<td width="100">&nbsp;取款时间:</td>
					<td><input type="text" name="log.datetime" id="datetime"></td>
					</tr>
					<tr>
					<td>&nbsp;取款金额:</td>
					<td>
						<input type="text" name="log.trMoney" id="trMoney" value="${log.trMoney}">
						<span id="errormoney" style="color:red;"></span>
					</td>
					</tr>
					<tr>
					<td>&nbsp;</td>
					<td>&nbsp;<input type="Submit" value="取款" /> </td>
					</tr>
				</tbody>
			</table>
				<div style="color:red;"> 
				<s:fielderror /> 
				</div> 
			</div> 				
		</form>
	  </body>
	</html>
	//sql
	CREATE TABLE `account` (
	  `accountid` int(4) NOT NULL AUTO_INCREMENT,
	  `username` varchar(50) DEFAULT NULL,
	  `password` varchar(50) DEFAULT NULL,
	  `balance` decimal(18,2) DEFAULT NULL,
	  `status` int(4) DEFAULT NULL,
	  PRIMARY KEY (`accountid`),
	  KEY `status` (`status`),
	  CONSTRAINT `account_ibfk_1` FOREIGN KEY (`status`) REFERENCES `status` (`id`)
	) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

	INSERT INTO `account` VALUES ('1', 'uuu', 'uuu', '1000.00', '1');
	INSERT INTO `account` VALUES ('2', 'ttt', 'ttt', '1000.00', '1');
	INSERT INTO `account` VALUES ('3', 'qqq', '1', '1000.00', '1');
	INSERT INTO `account` VALUES ('4', 'www', 'www', '1000.00', '1');
	INSERT INTO `account` VALUES ('5', 'eee', 'eee', '1000.00', '2');
	INSERT INTO `account` VALUES ('6', 'my', 'my', '1000.00', '1');
	INSERT INTO `account` VALUES ('7', 'sss', 'sss', '1000.00', '1');
	INSERT INTO `account` VALUES ('8', 'vvv', 'vvv', '1000.00', '1');
	INSERT INTO `account` VALUES ('9', 'xxx', 'xxx', '1000.00', '1');

	CREATE TABLE `admin` (
	  `id` int(4) NOT NULL AUTO_INCREMENT,
	  `username` varchar(50) DEFAULT NULL,
	  `password` varchar(50) DEFAULT NULL,
	  PRIMARY KEY (`id`)
	) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

	INSERT INTO `admin` VALUES ('1', 'admin', '123456');

	CREATE TABLE `personinfo` (
	  `id` int(4) NOT NULL AUTO_INCREMENT,
	  `accountid` int(4) DEFAULT NULL,
	  `realname` varchar(50) DEFAULT NULL,
	  `age` int(4) DEFAULT NULL,
	  `sex` varchar(2) DEFAULT NULL,
	  `cardid` decimal(18,0) DEFAULT NULL,
	  `address` varchar(50) DEFAULT NULL,
	  `telephone` varchar(50) DEFAULT NULL,
	  PRIMARY KEY (`id`),
	  KEY `accountid` (`accountid`),
	  CONSTRAINT `personinfo_ibfk_1` FOREIGN KEY (`accountid`) REFERENCES `account` 

	(`accountid`)
	) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;


	INSERT INTO `personinfo` VALUES ('1', '1', '王志国', '32', '男', '320542000000000001', '北

	京', '15810000001');
	INSERT INTO `personinfo` VALUES ('2', '2', '赵强', '43', '男', '320542000000000002', '湖北

	武汉', '15810000002');
	INSERT INTO `personinfo` VALUES ('3', '3', '薛梅', '26', '女', '312556000000000003', '江苏

	南京', '15320000003');
	INSERT INTO `personinfo` VALUES ('4', '4', 'www', '43', '女', '312556000000000004', '江苏', 

	'15320000004');
	INSERT INTO `personinfo` VALUES ('5', '5', 'eee', '34', '男', '312556000000000005', '湖北武

	汉', '15320000005');
	INSERT INTO `personinfo` VALUES ('6', '6', 'my', '35', '男', '312556000000000006', '北京', 

	'15320000006');
	INSERT INTO `personinfo` VALUES ('7', '7', 'sss', '56', '男', '312556000000000007', '北京', 

	'15320000007');
	INSERT INTO `personinfo` VALUES ('8', '8', 'vvv', '45', '女', '312556000000000008', '江苏无

	锡', '15320000008');
	INSERT INTO `personinfo` VALUES ('9', '9', 'xxx', '38', '男', '312556000000000009', '江苏无

	锡', '15320000009');

	CREATE TABLE `status` (
	  `id` int(4) NOT NULL AUTO_INCREMENT,
	  `name` varchar(20) DEFAULT NULL,
	  PRIMARY KEY (`id`)
	) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

	-- ----------------------------
	-- Records of status
	-- ----------------------------
	INSERT INTO `status` VALUES ('1', '启用');
	INSERT INTO `status` VALUES ('2', '冻结');


	CREATE TABLE `transaction_log` (
	  `id` int(4) NOT NULL AUTO_INCREMENT,
	  `accountid` int(4) DEFAULT NULL,
	  `otherid` int(4) DEFAULT NULL,
	  `tr_money` decimal(18,2) DEFAULT NULL,
	  `datetime` varchar(50) DEFAULT NULL,
	  `ta_type` int(4) DEFAULT NULL,
	  PRIMARY KEY (`id`),
	  KEY `accountid` (`accountid`),
	  KEY `ta_type` (`ta_type`),
	  CONSTRAINT `transaction_log_ibfk_1` FOREIGN KEY (`accountid`) REFERENCES `account` 

	(`accountid`),
	  CONSTRAINT `transaction_log_ibfk_2` FOREIGN KEY (`ta_type`) REFERENCES `transaction_type` 

	(`id`)
	) ENGINE=InnoDB DEFAULT CHARSET=utf8;


	CREATE TABLE `transaction_type` (
	  `id` int(4) NOT NULL AUTO_INCREMENT,
	  `name` varchar(50) DEFAULT NULL,
	  PRIMARY KEY (`id`)
	) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;


	INSERT INTO `transaction_type` VALUES ('1', '存款');
	INSERT INTO `transaction_type` VALUES ('2', '取款');
	INSERT INTO `transaction_type` VALUES ('3', '转账');
//系统下载地址:http://pan.baidu.com/s/1nv4GOgp

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值