*1)使用MyEclipse新建一个Web Project工程,名为Takeout1
如果使用Tomcat7.0,不能使用高版本的JDK
*1)右击项目名----MyEclipse----Add Struts Capabilities----选择Strtus2.x和/*----Finish
*1)右击项目名----Myeclipse----Add Spring Capabilities----如下图所示,选择红框的内容----Finish
*2)打开WebRoot----WEB-INF----web.xml----添加配置Spring配置文件的位置和加载器,代码如下
<context-param> <param-name>contextConfigLocation</param-name> <!-- 如果 applicationContext.xml放在src目录下使用此路径 --> <param-value>WEB-INF/classes/applicationContext.xml</param-value> <!-- 如果 applicationContext.xml放在WEB-INF目录下使用此路径(使用Eclipse时会创建在WEB-INF目录下)--> <!-- <param-value>WEB-INF/applicationContext.xml</param-value> --> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
*1)在MySQL的默认数据库test中创建user表并插入几条数据,用作登录,代码如下
use test; create table if not exists user( id int primary key auto_increment, name varchar(50) not null, password varchar(50) not null ); insert into user(name,password) values('user1','password1'); insert into user(name,password) values('user2','password2'); insert into user(name,password) values('user3','password3'); select * from user;*2)创建MySQL DB Driver
在DB Browser内右击空白处----New,按下图填写和选择,其中Add JARs----搜索并选择mysql-connector-java-5.1.26-bin.jar
mysql-connector-java-5.1.26-bin.jar可以在MySQL安装目录下找到..\MySQL\Connector J 5.1.26或者到官网下载
添加此DB Driver可以方便添加Hibernate特性和使用Hibernate反向工程创建POJO和DAO等
右击项目名----Myeclipse----Add Hibernate Capabilities----如下图所示,选择红框的内容----Next
Hibernate版本过高可能会出现问题,此处选择Hibernate3.3
Next----选择Spring configuration file----Next----选择Existing Spring configuration file(在添加Spring特性时已有此文件)
Next----如下图设置数据源连接细节----选择刚才创建的DB Driver(其它会自动填写)----填写密码
Next----去除Create SessionFactory class的勾选----Finish,此时可以部署到Tomcat并查看是否出错
*1)添加ExtJS SDK,可参考http://blog.csdn.net/u010520912/article/details/24329955
*ext-lang-zh_CN.js *此文件在locale文件夹(国际化文件)内,在中文环境下只需引入ext-lang-zh_CN.js
*bootstrap.js *根据路径自动调用适当的js文件,如选择调用ext-all.js或是ext-all-debug.js
*ext-all-dev.js *在发布的时候需要调用的extjs文件
*ext-all-debug.js *在调试的时候需要调用的extjs文件
*ext-all.js *在发布的时候需要调用的extjs文件
*resources *资源文件,如css和images
在WebRoot目录下新建extjs文件夹,复制bootstrap.js、ext-all-dev.js、ext-all-debug.js、ext-all.js 、resources到里面
再在extjs文件夹下新建locale文件夹,将ext-lang-zh_CN.js 复制到里面,如下图所示
本程序分为三层:应用层、Service层以及DAO层
其中,pojo为简单的JavaBean,与数据库的表相对应
action为应用层,用于响应用户操作,实例化Service层对象并调用其中的方法以返回有效数据
Service层则实例化Dao层的对象并调用其中的方法,而Dao层对象返回计算后的字符串,用于与数据库进行交互
程序是正向运行的,而编写程序的顺序是反向的,先编写与数据库对应的pojo,然后编写Dao层以执行有关数据库的操作
接着编写Service层,以操作DAO层的方法,并添加事务支持,最后编写action应用层,以响应用户操作
基于文章篇幅,代码里不再添加相应的注释
*2)使用Hibernate反向工程生成POJO,也可自己编写
在DB Browser中连接刚才创建的DB Driver,并展开test数据库的user表,右击打开Hibernate Reverse Engineering
如下图所示,选择红框的内容----Next----选择Hibernate types----Next---选中user表并在右边的框中设置Class Name为User----Finish
*3)编写idao,在src目录下的com.tms.idao包中新建一个名为IUserDao的类,代码如下
package com.tms.idao; import java.util.List; import com.tms.pojo.User; public interface IUserDao { public void createUser(User user); public List<User> listUser(); public boolean findUserByNameAndPassword(String name,String password); }
*4)编写dao,也可以使用Hbiernate反向工程自动生成
在src目录下的com.tms.dao包中新建一个名为UserDaoImpl的类,代码如下
package com.tms.dao; import java.util.List; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.tms.idao.IUserDao; import com.tms.pojo.User; public class UserDaoImpl extends HibernateDaoSupport implements IUserDao { public void createUser(User user) { this.getHibernateTemplate().persist(user); } public List<User> listUser() { return this.getHibernateTemplate().find("select user from User user"); } public boolean findUserByNameAndPassword(String name,String password) { List<User> userList = this.getHibernateTemplate().find("select user from User user where user.name =? and user.password =?",name,password); if (userList.size() > 0) { return true; } return false; } }
*5)编写iservice, 在src目录下的com.tms.iservice包中新建一个名为IUserService的类,代码如下
package com.tms.iservice; import java.util.List; import com.tms.pojo.User; public interface IUserService { public void createUser(User user); public List<User> listUser(); public boolean findUserByNameAndPassword(String name,String password); }*6)编写service,在src目录下的com.tms.service包中新建一个名为UserServiceImpl的类,代码如下
package com.tms.service; import java.util.List; import com.tms.idao.IUserDao; import com.tms.iservice.IUserService; import com.tms.pojo.User; public class UserServiceImpl implements IUserService { private IUserDao userDao; public void createUser(User user) { userDao.createUser(user); } public List<User> listUser() { return userDao.listUser(); } public boolean findUserByNameAndPassword(String name, String password) { return userDao.findUserByNameAndPassword(name, password); } public IUserDao getUserDao() { return userDao; } public void setUserDao(IUserDao userDao) { this.userDao = userDao; } }*7)编写action,在src目录下的com.tms.action包中新建一个名为LoginAction的类,代码如下
package com.tms.action; import java.util.*; import com.tms.iservice.IUserService; import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport { private static final long serialVersionUID = 1L; public Map<?, ?> responseJson; public String userName; public String userPassword; private IUserService userService; public Map<?, ?> getResponseJson() { return responseJson; } public void setResponseJson(Map<String, Object> responseJson) { this.responseJson = responseJson; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public String login() { boolean isLogin = userService.findUserByNameAndPassword(userName, userPassword); Map<String, Object> map = new HashMap<String, Object>(); map.put("success", isLogin); System.out.print(isLogin); this.setResponseJson(map); return SUCCESS; } public String tms() { return SUCCESS; } public IUserService getUserService() { return userService; } public void setUserService(IUserService userService) { this.userService = userService; } }*8)配置Struts.xml文件,在struts标签内添加如下代码
<constant name="struts.objectFactory" value="spring"/> <constant name="struts.devMode" value="true"/> <package name="login" extends="json-default"> <action name="tmslogin" class="loginAction" method="login"> <result type="json"> <param name="root">responseJson</param> </result> </action> </package> <package name="tms" extends="struts-default"> <action name="tmsmain" class="loginAction" method="tms"> <result name="success">WEB-INF/page/main.jsp</result> </action> </package>
*9)配置applicationContent.xml文件,在beans标签内添加如下代码
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource" /> </property> <property name="annotatedClasses"> <list> <value>com.tms.pojo.User</value> </list> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect"> org.hibernate.dialect.MySQLDialect </prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">false</prop> </props> </property> </bean> <bean id="userDao" class="com.tms.dao.UserDaoImpl"> <property name="sessionFactory" ref="sessionFactory"></property> </bean> <bean id="hibernateTransactionAttributeSource" class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource"> <property name="properties"> <props> <prop key="*">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <bean id="userService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager" ref="hibernateTransactionManager"></property> <property name="target"> <bean class="com.tms.service.UserServiceImpl"> <property name="userDao" ref="userDao"></property> </bean> </property> <property name="transactionAttributeSource" ref="hibernateTransactionAttributeSource"></property> </bean> <bean id="loginAction" scope="prototype" class="com.tms.action.LoginAction"> <property name="userService" ref="userService"></property> </bean>
page文件夹下的main.jsp文件用于登录成功后跳转
*2)编写index.jsp,打开index.jsp文件,添加如下代码
<html> <head> <base href="<%=basePath%>"> <title>登录</title> <!-- 新增的代码 --> <link rel="stylesheet" type="text/css" href="./extjs/resources/css/ext-all.css"> <script type="text/javascript" src="./extjs/bootstrap.js"></script> <script type="text/javascript" src="./extjs/locale/ext-lang-zh_CN.js"></script> <script type="text/javascript" src="app.js"></script> <!-- 新增的代码 --> </head> <body></body> </html>*3)编写app.js,打开app.js文件,添加如下代码
Ext.onReady(function(){ Ext.application({ name: 'TMS', appFolder: 'app', launch: function() { Ext.create('Ext.container.Viewport', { items: { xtype: 'loginView' } }); }, controllers: ['LoginController'] }); });*4)编写LoginController.js,打开LoginController.js文件,添加如下代码
Ext.define('TMS.controller.LoginController', { extend: 'Ext.app.Controller', views: ['LoginView'], init: function() { } });*5)编写LoginView.js,打开LoginView.js文件,添加如下代码
Ext.define('TMS.view.LoginView', { extend: 'Ext.form.Panel', alias : 'widget.loginView', height: 150, width: 320, id:'LoginView', layout: { type: 'absolute' }, bodyPadding: 10, title: '欢迎登录小熊外卖管理系统', initComponent: function() { Ext.applyIf(this, { style: { marginRight: 'auto', marginLeft: 'auto', marginTop: '200px', marginBottom: 'auto' }, items: [ { xtype: 'textfield', anchor: '100%', x: 50, y: 10, maxWidth: 200, fieldLabel: '账号', labelAlign: 'left', labelWidth: 40, name: 'userName' }, { xtype: 'textfield', anchor: '100%', x: 50, y: 40, maxWidth: 200, fieldLabel: '密码', labelAlign: 'left', labelWidth: 40, name: 'userPassword', inputType: 'password' }, { xtype: 'button', handler: function(button, event) { Ext.getCmp('LoginView').getForm().submit({ url:'tmslogin', method: 'post', waitMsg: "正在登录......", success: function(form, action) { var loginResult = action.result.success; if (loginResult === true) { window.location.href="tmsmain"; } }, failure: function(form, action) { switch (action.failureType) { case Ext.form.Action.CLIENT_INVALID: Ext.Msg.alert("登录失败", "提交的表单数据无效,请检查!"); break; case Ext.form.Action.CONNECT_FAILURE: Ext.Msg.alert("登录失败", "连接失败!"); break; case Ext.form.Action.SERVER_INVALID: Ext.Msg.alert("登录失败","账号或密码错误!"); break; } } }); }, x: 150, y: 80, id: 'loginButton', width: 60, text: '登录' }, { xtype: 'button', handler: function(button, event) { Ext.getCmp('LoginView').form.reset(); }, x: 220, y: 80, id: 'resetButton', width: 60, text: '重置' } ] }); this.callParent(arguments); } });
如果出现java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I错误,是包版本冲突问题,删除struts2的包即可
打开Window----Preferences----搜索struts----打开Struts2----Remove antlr-2.7.2.jar即可
如果出现Cannot locate the chosen ObjectFactory implementation: spring错误,要导入Struts2-Spring-plugin-2.2.1.jar
*2)注:此登录功能是使用ExtJS的MVC实现的,实际上并不需要,因为登录功能没有Model,可替换成以下代码
Ext.onReady(function () { Ext.QuickTips.init(); Ext.form.Field.prototype.msgTarget='side'; Ext.create("Ext.form.Panel", { title: '欢迎登录小熊外卖管理系统', frame: true, width: 320, height: 150, bodyPadding: 10, defaultType: 'textfield', renderTo: Ext.getBody(), defaults: { anchor: '100%', labelWidth: 40, labelAlign: 'left' }, style: { marginRight: 'auto', marginLeft: 'auto', marginTop: '200px', marginBottom: 'auto' }, items: [ { allowBlank: false, blankText : "账号不能为空", fieldLabel: '账号', maxWidth: 200, name: 'userName', emptyText: '请输入你的账户' }, { allowBlank: false, blankText : "密码不能为空", fieldLabel: '密码', maxWidth: 200, name: 'userPassword', emptyText: '请输入你的密码', inputType: 'password' } ], buttons: [ { text: '登录', handler: function(button, event) { this.up('form').getForm().submit({ url:'tmslogin', method: 'post', waitMsg: "正在登录......", success: function(form, action) { var loginResult = action.result.success; if (loginResult === true) { window.location.href="tmsmain"; } }, failure: function(form, action) { switch (action.failureType) { case Ext.form.Action.CLIENT_INVALID: Ext.Msg.alert("登录失败", "提交的表单数据无效,请检查!"); break; case Ext.form.Action.CONNECT_FAILURE: Ext.Msg.alert("登录失败", "连接失败!"); break; case Ext.form.Action.SERVER_INVALID: Ext.Msg.alert("登录失败","账号或密码错误!"); break; } } }); }, id: 'loginButton', width: 60 }, { text: '重置', handler: function(button, event) { this.up('form').getForm().reset(); }, id: 'resetButton', width: 60 } ] }); });