HRMS(转帖)

各种开源框架环境及下载:

ExtJS:2.X http://extjs.com/

DWR:2.X http://directwebremoting.org/dwr/download

JSON:JSON可以到http://www.json.org/查看详细内容,这里使用json-lib http://json-lib.sourceforge.net/

Spring:2.x http://springframework.org/

Hibernate:3.x  http://www.hibernate.org/ 需要hibernate core 和annotations 包。

我们采用的开发工具是Eclipse3.4(或MyEclipse7.0)+SqlServer 2000。准备就绪,现在就开始吧!

先执行数据库脚本,完成数据库的设计:

CREATE DATABASE hrproject

go

USE hrproject;

go

CREATE TABLE person (

  id int NOT NULL identity(1,1),

  name varchar(200) default NULL,

  age varchar(20) default '0',

  unitName varchar(200) default NULL,

  address varchar(200) default NULL,

  telephone varchar(20) default NULL,

  gender varchar(20) default NULL,

  PRIMARY KEY  (id)

)

go

CREATE TABLE unit (

  id int NOT NULL identity(1,1),

  name varchar(200) NOT NULL,

  description varchar(200) default NULL,

  parentId int default NULL,

  PRIMARY KEY  (id)

)

go

CREATE TABLE userInfo (

  id int NOT NULL identity(1,1),

  userName varchar(200) default NULL,

  passWord varchar(200) default NULL,

  isValid int default NULL,

  PRIMARY KEY  (id)

)

INSERT INTO person (name, age, unitName, address, telephone, gender) VALUES

  ('许亮','30','交通部','武汉市武昌区华中电脑数码城','13234534431','男')

INSERT INTO person (name, age, unitName, address, telephone, gender) VALUES

  ('张飞','41','交通部','武汉市武昌区华中电脑数码城','13321136431','男')

INSERT INTO person (name, age, unitName, address, telephone, gender) VALUES

  ('关羽','53','税务部','武汉市武昌区华中电脑数码城','13831115753','男')

INSERT INTO person (name, age, unitName, address, telephone, gender) VALUES

  ('貂蝉','32','人事部','武汉市武昌区华中电脑数码城','13631115753','女')

COMMIT;

INSERT INTO unit ( name, description, parentId) VALUES

  ('交通部','管交通的',0)

INSERT INTO unit ( name, description, parentId) VALUES

  ('税务部','管税务的',1)

INSERT INTO unit ( name, description, parentId) VALUES

  ('人事部','管人的',1);

COMMIT;

INSERT INTO userInfo (userName, passWord, isValid) VALUES

  ('leno','123',1);

COMMIT;

select * from person

好了,在sqlserver 2000的查询分析器里面执行成功后,数据库的设计就告一段落。我们再来看看WEB应用程序的核心配置文件:web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

       http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

       <welcome-file-list>

              <welcome-file>logon.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>

                     /WEB-INF/classes/applicationContext.xml

              </param-value>

       </context-param>

       <servlet>

              <servlet-name>Dispatcher</servlet-name>

              <servlet-class>

                     org.springframework.web.servlet.DispatcherServlet

              </servlet-class>

              <init-param>

                     <param-name>contextConfigLocation</param-name>

                     <param-value>

                            /WEB-INF/classes/applicationContext.xml

                     </param-value>

              </init-param>

              <load-on-startup>1</load-on-startup>

       </servlet>

       <servlet-mapping>

              <servlet-name>Dispatcher</servlet-name>

              <url-pattern>*.hr</url-pattern>

       </servlet-mapping>

       <servlet>

              <servlet-name>dwr-invoker</servlet-name>

              <servlet-class>

                     org.directwebremoting.servlet.DwrServlet

              </servlet-class>

              <init-param>

                     <param-name>debug</param-name>

                     <param-value>true</param-value>

              </init-param>

              <init-param>

                     <param-name>classes</param-name>

                     <param-value>java.lang.Object</param-value>

              </init-param>

              <load-on-startup>2</load-on-startup>

       </servlet>

       <servlet-mapping>

              <servlet-name>dwr-invoker</servlet-name>

              <url-pattern>/dwr/*</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>UTF-8</param-value>

              </init-param>

       </filter>

       <filter-mapping>

              <filter-name>encodingFilter</filter-name>

              <url-pattern>/*</url-pattern>

       </filter-mapping>

</web-app>

我们在上面主要配置了Spring MVC的核心DispatcherServlet和DWR的服务器端核心DwrServlet,为我们后续使用做准备。(接着可以利用MyEclipse开发工具增加对hibernate和spring框架的支持),你用Eclipse也没关系。下面是Hibernate框架的核心配置文件:

<?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>

              <!-- configure datasource -->

              <property name="connection.driver_class">

                     com.microsoft.jdbc.sqlserver.SQLServerDriver

              </property>

              <property name="connection.url">

                     jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=hrproject;SelectMethod=cursor

              </property>

              <property name="connection.username">sa</property>

              <property name="connection.password">123</property>

              <property name="hibernate.connection.pool_size">20</property>

              <property name="hibernate.c3p0.min_size">1</property>

              <property name="hibernate.c3p0.max_size">20</property>

              <property name="hibernate.c3p0.timeout">1800</property>

              <property name="hibernate.c3p0.max_statements">50</property>

              <!-- configure fetch_depth -->

              <property name="hibernate.max.fetch_depth">5</property>

              <!-- configure dialect -->

              <property name="dialect">

                     org.hibernate.dialect.SQLServerDialect

              </property>

              <!--auto generate datatable-->

              <!-- <property name="hibernate.hbm2ddl.auto">create</property> -->

              <!-- configure show_sql -->

              <property name="hibernate.show_sql">true</property>

              <!-- configure transactionFactory -->

              <property name="hibernate.transaction.factory_class">

                     org.hibernate.transaction.JDBCTransactionFactory

              </property>

              <mapping class="org.leno.hr.Person" />

              <mapping class="org.leno.hr.User" />

              <mapping class="org.leno.hr.Unit" />

       </session-factory>

</hibernate-configuration>

上面主要配置了数据源,hibernate的各项属性,以及实体类的映射!里面用到了3个实体类如下:

1. User.java

package org.leno.hr;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import static javax.persistence.GenerationType.IDENTITY;

import javax.persistence.Id;

import javax.persistence.Table;

/**

 * User entity.

 *

 * @author MyEclipse Persistence Tools

 */

@Entity

@Table(name = "userInfo", schema = "dbo", catalog = "hrproject")

public class User implements java.io.Serializable {

       // Fields

       /**

        *

        */

       private static final long serialVersionUID = 2348712504535787456L;

       private Integer id;

       private String userName;

       private String passWord;

       private Integer isValid;

       // Constructors

       /** default constructor */

       public User() {

       }

       /** full constructor */

       public User(String userName, String passWord, Integer isValid) {

              this.userName = userName;

              this.passWord = passWord;

              this.isValid = isValid;

       }

       // Property accessors

       @Id

       @GeneratedValue(strategy = IDENTITY)

       @Column(name = "id", unique = true, nullable = false)

       public Integer getId() {

              return this.id;

       }

       public void setId(Integer id) {

              this.id = id;

       }

       @Column(name = "userName", length = 200)

       public String getUserName() {

              return this.userName;

       }

       public void setUserName(String userName) {

              this.userName = userName;

       }

       @Column(name = "passWord", length = 200)

       public String getPassWord() {

              return this.passWord;

       }

       public void setPassWord(String passWord) {

              this.passWord = passWord;

       }

       @Column(name = "isValid")

       public Integer getIsValid() {

              return this.isValid;

       }

       public void setIsValid(Integer isValid) {

              this.isValid = isValid;

       }

}

2. Person.java

package org.leno.hr;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import static javax.persistence.GenerationType.IDENTITY;

import javax.persistence.Id;

import javax.persistence.Table;

/**

 * Person entity.

 *

 * @author MyEclipse Persistence Tools

 */

@Entity

@Table(name = "person", schema = "dbo", catalog = "hrproject")

public class Person implements java.io.Serializable {

       // Fields

       /**

        *

        */

       private static final long serialVersionUID = 31884724861871585L;

       private Integer id;

       private String name;

       private String age;

       private String unitName;

       private String address;

       private String telephone;

       private String gender;

       // Constructors

       /** default constructor */

       public Person() {

       }

       /** full constructor */

       public Person(String name, String age, String unitName, String address,

                     String telephone, String gender) {

              this.name = name;

              this.age = age;

              this.unitName = unitName;

              this.address = address;

              this.telephone = telephone;

              this.gender = gender;

       }

       // Property accessors

       @Id

       @GeneratedValue(strategy = IDENTITY)

       @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 = 200)

       public String getName() {

              return this.name;

       }

       public void setName(String name) {

              this.name = name;

       }

       @Column(name = "age", length = 20)

       public String getAge() {

              return this.age;

       }

       public void setAge(String age) {

              this.age = age;

       }

       @Column(name = "unitName", length = 200)

       public String getUnitName() {

              return this.unitName;

       }

       public void setUnitName(String unitName) {

              this.unitName = unitName;

       }

       @Column(name = "address", length = 200)

       public String getAddress() {

              return this.address;

       }

       public void setAddress(String address) {

              this.address = address;

       }

       @Column(name = "telephone", length = 20)

       public String getTelephone() {

              return this.telephone;

       }

       public void setTelephone(String telephone) {

              this.telephone = telephone;

       }

       @Column(name = "gender", length = 20)

       public String getGender() {

              return this.gender;

       }

       public void setGender(String gender) {

              this.gender = gender;

       }

}

3. Unit.java

package org.leno.hr;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import static javax.persistence.GenerationType.IDENTITY;

import javax.persistence.Id;

import javax.persistence.Table;

/**

 * Unit entity.

 *

 * @author MyEclipse Persistence Tools

 */

@Entity

@Table(name = "unit", schema = "dbo", catalog = "hrproject")

public class Unit implements java.io.Serializable {

       // Fields

       /**

        *

        */

       private static final long serialVersionUID = -1267061245966981171L;

       private Integer id;

       private String name;

       private String description;

       private Integer parentId;

       // Constructors

       /** default constructor */

       public Unit() {

       }

       /** minimal constructor */

       public Unit(String name) {

              this.name = name;

       }

       /** full constructor */

       public Unit(String name, String description, Integer parentId) {

              this.name = name;

              this.description = description;

              this.parentId = parentId;

       }

       // Property accessors

       @Id

       @GeneratedValue(strategy = IDENTITY)

       @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 = 200)

       public String getName() {

              return this.name;

       }

       public void setName(String name) {

              this.name = name;

       }

       @Column(name = "description", length = 200)

       public String getDescription() {

              return this.description;

       }

       public void setDescription(String description) {

              this.description = description;

       }

       @Column(name = "parentId")

       public Integer getParentId() {

              return this.parentId;

       }

       public void setParentId(Integer parentId) {

              this.parentId = parentId;

       }

}

       大家可能已经注意到,我们这里并没有编写类和表的XML映射文件,而是在具体的实体类中用注解的方式说明它们的映射关系。所以我们才需要用到Hibernate的元数据注解包。下面是Spring框架的核心配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

       <!-- Hibernate SessionFactory配置  -->

       <bean id="sessionFactory"

              class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">

              <property name="configLocation">

                     <value>classpath:hibernate.cfg.xml</value>

              </property>

       </bean>

       <!-- Hibernate 事务管理  -->

       <bean id="transactionManager"

              class="org.springframework.orm.hibernate3.HibernateTransactionManager">

              <property name="sessionFactory" ref="sessionFactory" />

       </bean>

       <bean id="baseTransactionProxy"

              class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"

              abstract="true">

              <property name="transactionManager" ref="transactionManager" />

              <property name="transactionAttributes">

                     <props>

                            <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>

                            <prop key="persist*">

                                   PROPAGATION_REQUIRED,-Exception

                            </prop>

                            <prop key="remove*">

                                   PROPAGATION_REQUIRED,-Exception

                            </prop>

                            <prop key="insert*">PROPAGATION_REQUIRED</prop>

                            <prop key="save">PROPAGATION_REQUIRED</prop>

                            <prop key="update*">PROPAGATION_REQUIRED</prop>

                            <prop key="edit*">PROPAGATION_REQUIRED</prop>

                            <prop key="del*">PROPAGATION_REQUIRED</prop>

                            <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

                            <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>

                            <prop key="disPlay*">PROPAGATION_REQUIRES_NEW</prop>

                     </props>

              </property>

       </bean>

       <!-- DAO Objects -->

       <bean id="logonDAO" class="org.leno.hr.dao.LogonDAO"

              lazy-init="true" singleton="true">

       </bean>

       <bean id="unitDAO" class="org.leno.hr.dao.UnitDAO" lazy-init="true"

              singleton="true">

       </bean>

       <bean id="personDAO" class="org.leno.hr.dao.PersonDAO"

              lazy-init="true" singleton="true">

       </bean>

       <!-- Service Objects -->

       <bean id="logonService" parent="baseTransactionProxy">

              <property name="target">

                     <bean class="org.leno.hr.service.LogonService">

                            <property name="logonDAO">

                                   <bean class="org.leno.hr.dao.LogonDAO">

                                          <property name="sessionFactory"

                                                 ref="sessionFactory" />

                                   </bean>

                            </property>

                     </bean>

              </property>

       </bean>

       <bean id="unitService" parent="baseTransactionProxy">

              <property name="target">

                     <bean class="org.leno.hr.service.UnitService">

                            <property name="unitDAO">

                                   <bean class="org.leno.hr.dao.UnitDAO">

                                          <property name="sessionFactory"

                                                 ref="sessionFactory" />

                                   </bean>

                            </property>

                     </bean>

              </property>

       </bean>

       <bean id="personService" parent="baseTransactionProxy">

              <property name="target">

                     <bean class="org.leno.hr.service.PersonService">

                            <property name="personDAO">

                                   <bean class="org.leno.hr.dao.PersonDAO">

                                          <property name="sessionFactory"

                                                 ref="sessionFactory" />

                                   </bean>

                            </property>

                     </bean>

              </property>

       </bean>

       <!-- 后端控制器 -->

       <bean id="logonController"

              class="org.leno.hr.controller.LogonController" lazy-init="true"

              singleton="true">

              <property name="logonService">

                     <ref bean="logonService" />

              </property>

       </bean>

       <bean id="unitController"

              class="org.leno.hr.controller.UnitController" lazy-init="true"

              singleton="true">

              <property name="unitService">

                     <ref bean="unitService" />

              </property>

       </bean>

       <bean id="personController"

              class="org.leno.hr.controller.PersonController" lazy-init="true"

              singleton="true">

              <property name="personService">

                     <ref bean="personService" />

              </property>

       </bean>

       <!-- URL Mapping Configurations 路径映射器 -->

       <bean id="urlMapping"

              class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">

              <property name="mappings">

                     <props>

                            <!-- logon mapping -->

                            <prop key="/logon.hr">logonController</prop>

                            <prop key="/unit.hr">unitController</prop>

                            <prop key="/person.hr">personController</prop>

                     </props>

              </property>

       </bean>

       <!-- 视图控制器 -->

       <bean id="viewResolver"

              class="org.springframework.web.servlet.view.InternalResourceViewResolver">

              <property name="viewClass">

                     <value>org.springframework.web.servlet.view.JstlView</value>

              </property>

              <property name="prefix">

                     <value>/</value>

              </property>

              <property name="suffix">

                     <value>.jsp</value>

              </property>

       </bean>

       <bean id="beanNameViewResolver"

              class="org.springframework.web.servlet.view.BeanNameViewResolver">

              <property name="order">

                     <value>1</value>

              </property>

       </bean>

</beans>

在这里,hibernate.cfg.xml和applicationContext.xml默认都要放在我们应用的/src目录下。在applicationContext.xml中,我们配置了很多bean以及它们的相互关联。如果大家对Spring的配置文件以及它的MVC运行流程不太熟悉,请参阅拙作:http://blog.csdn.net/lenotang/archive/2008/06/18/2562348.aspx ,里面有详细的介绍。下面是DWR框架的核心配置文件dwr.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE dwr PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 2.0//EN" "http://www.getahead.ltd.uk/dwr/dwr20.dtd">

<dwr>

       <allow>

              <!-- At here, you will find that i just use dwr technology in query and remove.-->

              <convert converter="bean" match="org.leno.hr.Unit" />

              <convert converter="bean" match="org.leno.hr.User" />

              <convert converter="bean" match="org.leno.hr.Person" />

              <create creator="spring" javascript="unitController">

                     <param name="beanName" value="unitController" />

                     <include method="getRecords" />

                     <include method="removeRecords" />

              </create>

              <create creator="spring" javascript="userController">

                     <param name="beanName" value="logonController" />

                     <include method="getRecords" />

                     <include method="removeRecords" />

              </create>

              <create creator="spring" javascript="personController">

                     <param name="beanName" value="personController" />

                     <include method="getRecords" />

                     <include method="removeRecords" />

              </create>

       </allow>

</dwr>

主要是<create>和<convert>两个节点大家要熟悉。通俗地讲,远程Bean会被created,参数会被converted。所以,前者是可以在客户端使用的js,后者是数据传递过程中作为参数的bean.

接下来我们看看我们 WEB应用的JAVA代码,首先是各个模块的DAO,它们充分利用了Spring对Hibernate的支持:

package org.leno.hr.dao;

import java.util.ArrayList;

import java.util.List;

import org.hibernate.Session;

import org.leno.hr.User;

import org.springframework.orm.hibernate3.HibernateCallback;

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

public class LogonDAO extends HibernateDaoSupport {

       public int removeRecords(final ArrayList<String> ids) throws Exception {

              if (ids == null || ids.size() == 0) {

                     return -1;

              }

              getHibernateTemplate().execute(new HibernateCallback() {

                     public Object doInHibernate(Session session) {

                            for (int i = 0; i < ids.size(); i++) {

                                   session.createQuery(

                                                 "delete from userInfo o where o.id=" + ids.get(i))

                                                 .executeUpdate();

                            }

                            return 1;

                     }

              });

              return 1;

       }

       @SuppressWarnings("unchecked")

       public List<User> getRecords() throws Exception {

              return getHibernateTemplate().loadAll(User.class);

       }

       @SuppressWarnings("unchecked")

       public List<User> getUserList(String userName, String passWord)

                     throws Exception {

              List<User> results = getHibernateTemplate().find(

                            "from User u where u.userName='" + userName

                                          + "' and u.passWord='" + passWord + "'");

              return results;

       }

       public int insertUser(User user) throws Exception {

              getHibernateTemplate().persist(user);

              return 1;

       }

       public int updateUser(User user) throws Exception {

              getHibernateTemplate().merge(user);

              return 1;

       }

}

package org.leno.hr.dao;

import java.util.ArrayList;

import java.util.List;

import org.hibernate.Session;

import org.leno.hr.Person;

import org.springframework.orm.hibernate3.HibernateCallback;

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

public class PersonDAO extends HibernateDaoSupport {

       public int removeRecords(final ArrayList<String> ids) throws Exception {

              if (ids == null || ids.size() == 0) {

                     return -1;

              }

              return (Integer) getHibernateTemplate().execute(

                            new HibernateCallback() {

                                   public Object doInHibernate(Session session) {

                                          for (int i = 0; i < ids.size(); i++) {

                                                 session.createQuery(

                                                               "delete from Person o where o.id="

                                                                             + ids.get(i)).executeUpdate();

                                          }

                                          return 1;

                                   }

                            });

       }

       @SuppressWarnings("unchecked")

       public List<Person> getRecords(final int page, final int pageSize)

                     throws Exception {

              return (List<Person>) getHibernateTemplate().execute(

                            new HibernateCallback() {

                                   public Object doInHibernate(final Session session) {

                                          return session.createQuery("from Person")

                                                        .setFirstResult(page).setMaxResults(pageSize)

                                                        .list();

                                   }

                            });

       }

       public int insertPerson(Person person) throws Exception {

              getHibernateTemplate().saveOrUpdate(person);

              return 1;

       }

       public int updatePerson(Person person) throws Exception {

              getHibernateTemplate().saveOrUpdate(person);

              return 1;

       }

       public int getTotalNums() {

              long count = (Long) getHibernateTemplate().execute(

                            new HibernateCallback() {

                                   public Object doInHibernate(final Session session) {

                                          return (Long) session.createQuery(

                                                        "select count(*) from Person").uniqueResult();

                                   }

                            });

              return (int) count;

       }

}

package org.leno.hr.dao;

import java.util.ArrayList;

import java.util.List;

import org.hibernate.Session;

import org.leno.hr.Unit;

import org.springframework.orm.hibernate3.HibernateCallback;

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

public class UnitDAO extends HibernateDaoSupport {

       public int removeRecords(final ArrayList<String> ids) throws Exception {

              if (ids == null || ids.size() == 0) {

                     return -1;

              }

              getHibernateTemplate().execute(new HibernateCallback() {

                     public Object doInHibernate(Session session) {

                            for (int i = 0; i < ids.size(); i++) {

                                   session.createQuery(

                                                 "delete from Unit o where o.id=" + ids.get(i))

                                                 .executeUpdate();

                            }

                            return 1;

                     }

              });

              return 1;

       }

       @SuppressWarnings("unchecked")

       public List<Unit> getRecords() throws Exception {

              return getHibernateTemplate().loadAll(Unit.class);

       }

       public int insertUnit(Unit unit) throws Exception {

              getHibernateTemplate().saveOrUpdate(unit);

              return 1;

       }

       public int updateUnit(Unit unit) throws Exception {

              getHibernateTemplate().saveOrUpdate(unit);

              return 1;

       }

}

上面各个模块的DAO都大同小异了,接下来是Service,只是简单调用DAO做事,并且利用了Spring的声明式事务管理:

package org.leno.hr.service;

import java.util.ArrayList;

import java.util.List;

import org.leno.hr.User;

import org.leno.hr.dao.LogonDAO;

public class LogonService {

       private LogonDAO logonDAO;

       public LogonDAO getLogonDAO() {

              return logonDAO;

       }

       public void setLogonDAO(LogonDAO logonDAO) {

              this.logonDAO = logonDAO;

       }

       public int removeRecords(ArrayList<String> ids) throws Exception {

              return logonDAO.removeRecords(ids);

       }

       public List<User> getRecords() throws Exception {

              return logonDAO.getRecords();

       }

       public List<User> getUserList(String userName, String passWord)

                     throws Exception {

              return logonDAO.getUserList(userName, passWord);

       }

       public int insertUser(User user) throws Exception {

              return logonDAO.insertUser(user);

       }

       public int updateUser(User user) throws Exception {

              return logonDAO.updateUser(user);

       }

}

package org.leno.hr.service;

import java.util.ArrayList;

import java.util.List;

import org.leno.hr.Person;

import org.leno.hr.dao.PersonDAO;

public class PersonService {

       private PersonDAO personDAO;

       public PersonDAO getPersonDAO() {

              return personDAO;

       }

       public void setPersonDAO(PersonDAO personDAO) {

              this.personDAO = personDAO;

       }

       public int removeRecords(ArrayList<String> ids) throws Exception {

              return personDAO.removeRecords(ids);

       }

       public List<Person> getRecords(int page, int pageSize) throws Exception {

              return personDAO.getRecords(page, pageSize);

       }

       public int insertPerson(Person person) throws Exception {

              return personDAO.insertPerson(person);

       }

       public int updatePerson(Person person) throws Exception {

              return personDAO.updatePerson(person);

       }

       public int getTotalNums() {

              return personDAO.getTotalNums();

       }

}

package org.leno.hr.service;

import java.util.ArrayList;

import java.util.List;

import org.leno.hr.Unit;

import org.leno.hr.dao.UnitDAO;

public class UnitService  {

       private UnitDAO unitDAO;

       public int removeRecords(ArrayList<String> ids) throws Exception {

              return unitDAO.removeRecords(ids);

       }

       public List<Unit> getRecords() throws Exception {

              return unitDAO.getRecords();

       }

      

       public UnitDAO getUnitDAO() {

              return unitDAO;

       }

       public void setUnitDAO(UnitDAO unitDAO) {

              this.unitDAO = unitDAO;

       }

       public int insertUnit(Unit unit) throws Exception {

              return unitDAO.insertUnit(unit);

       }

       public int updateUnit(Unit unit) throws Exception{

              return unitDAO.updateUnit(unit);

       }

      

}

最后是我们各模块的Spring核心控制类:

package org.leno.hr.controller;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.leno.hr.User;

import org.leno.hr.service.LogonService;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.Controller;

public class LogonController implements Controller {

       private LogonService logonService;

       public LogonService getLogonService() {

              return logonService;

       }

       public void setLogonService(LogonService logonService) {

              this.logonService = logonService;

       }

       public ModelAndView handleRequest(HttpServletRequest request,

                     HttpServletResponse response) throws Exception {

              String isUserManagerOperation = request

                            .getParameter("isUserManagerOperation");

              String userName = request.getParameter("userName");

              String passWord = request.getParameter("passWord");

              if (isUserManagerOperation == null) {

                     response.setContentType("text/html; charset=UTF-8");

                     PrintWriter pw = response.getWriter();

                     if (userName == null || passWord == null || userName.equals("")

                                   || passWord.equals("")) {

                            pw.print("用户名或者密码不能为空!");

                     } else if (userName.indexOf(" ") != -1

                                   || passWord.indexOf(" ") != -1) {

                            pw.print("输入无效!");

                     }

                     List<User> results = logonService.getUserList(userName, passWord);

                     if (results.size() == 1) {

                            User user = (User) results.get(0);

                            if (user.getIsValid() != 1) {

                                   pw.print("该用户已被锁�?!");

                            } else {

                                   request.getSession().setAttribute("user", user);

                                   pw.print("success");

                            }

                     } else {

                            pw.print("用户名或者密码不正确!");

                     }

              } else {

                     String id = request.getParameter("id");

                     String isValid = request.getParameter("isValid");

                     int count;

                     response.setContentType("text/html; charset=UTF-8");

                     PrintWriter pw = response.getWriter();

                     User user = new User(userName, passWord, Integer.parseInt(isValid));

                     if (id == null && userName != null) {

                            count = logonService.insertUser(user);

                            if (count == 1) {

                                   pw.print(count);

                            } else {

                                   pw.print("error");

                            }

                     } else if (id != null && userName != null) {

                            user.setId(Integer.parseInt(id));

                            count = logonService.updateUser(user);

                            if (count == 1) {

                                   pw.print(count);

                            } else {

                                   pw.print("error");

                            }

                     }

              }

              return null;

       }

       public int removeRecords(ArrayList<String> ids) throws Exception {

              return logonService.removeRecords(ids);

       }

       public List<User> getRecords() throws Exception {

              return logonService.getRecords();

       }

}

package org.leno.hr.controller;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONArray;

import net.sf.json.JSONObject;

import org.leno.hr.Person;

import org.leno.hr.service.PersonService;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.Controller;

public class PersonController implements Controller {

       private PersonService personService = null;

       public int removeRecords(ArrayList<String> ids) throws Exception {

              return personService.removeRecords(ids);

       }

       public PersonService getPersonService() {

              return personService;

       }

       public void setPersonService(PersonService personService) {

              this.personService = personService;

       }

       public ModelAndView handleRequest(HttpServletRequest request,

                     HttpServletResponse response) throws Exception {

              String action = request.getParameter("action");

              if (action != null) {

                     response.setCharacterEncoding("utf-8");

                     //分页实现

                     String start = request.getParameter("start");

                     String limit = request.getParameter("limit");

                     int index = Integer.parseInt(start);

                     int pageSize = Integer.parseInt(limit);

                     List<Person> list = personService.getRecords(index, pageSize);

                     JSONObject json = new JSONObject();

                     json.put("totalProperty", personService.getTotalNums());

                     JSONArray arr = JSONArray.fromObject(list);

                     json.put("root", arr);

                     System.out.println(json);

                     response.getWriter().print(json);

                     return null;

              }

              String id = request.getParameter("id");

              String name = request.getParameter("name");

              String age = request.getParameter("age");

              String unitName = request.getParameter("unitName");

              String address = request.getParameter("address");

              String telephone = request.getParameter("telephone");

              String gender = request.getParameter("gender");

              int count;

              response.setContentType("text/html; charset=UTF-8");

              PrintWriter pw = response.getWriter();

              Person person = new Person(name, age, unitName, address, telephone,

                            gender);

              if (id == null && name != null) {

                     count = personService.insertPerson(person);

                     if (count == 1) {

                            pw.print(count);

                     } else {

                            pw.print("error");

                     }

              } else if (id != null && name != null) {

                     person.setId(Integer.parseInt(id));

                     count = personService.updatePerson(person);

                     if (count == 1) {

                            pw.print(count);

                     } else {

                            pw.print("error");

                     }

              }

              return null;

       }

}

package org.leno.hr.controller;

import java.io.PrintWriter;

import java.util.ArrayList;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.leno.hr.Unit;

import org.leno.hr.service.UnitService;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.mvc.Controller;

public class UnitController implements Controller {

       private UnitService unitService = null;

       public UnitService getUnitService() {

              return unitService;

       }

       public void setUnitService(UnitService unitService) {

              this.unitService = unitService;

       }

       public int removeRecords(ArrayList<String> ids) throws Exception {

              return unitService.removeRecords(ids);

       }

       public List<Unit> getRecords() throws Exception {

              return unitService.getRecords();

       }

       public ModelAndView handleRequest(HttpServletRequest request,

                     HttpServletResponse response) throws Exception {

              String id = request.getParameter("id");

              String name = request.getParameter("name");

              String description = request.getParameter("description");

              String parentId = request.getParameter("parentId");

              int count;

              response.setContentType("text/html; charset=UTF-8");

              PrintWriter pw = response.getWriter();

              Unit unit = new Unit(name, description, Integer.parseInt(parentId));

              if (id == null && name != null) {

                     count = unitService.insertUnit(unit);

                     if (count == 1) {

                            pw.print(count);

                     } else {

                            pw.print("error");

                     }

              } else if (id != null && name != null) {

                     unit.setId(Integer.parseInt(id));

                     count = unitService.updateUnit(unit);

                     if (count == 1) {

                            pw.print(count);

                     } else {

                            pw.print("error");

                     }

              }

              return null;

       }

}

       上面的JAVA代码并不晦涩,熟悉SSH的同志扫一下就清楚了。现在我们的配置文件以及服务器端JAVA代码都做好了,大家可以前后串起来理解一下,下一篇文章我们就开始进行页面设计。

现在我们就来看看我们的页面设计部分。首先是登陆页面logon.jsp:

<%@ page language="java" pageEncoding="utf-8"%>

<html>

       <head>

              <title>HR Manager Project</title>

              <meta http-equiv="pragma" content="no-cache">

              <meta http-equiv="cache-control" content="no-cache">

              <link rel="stylesheet" type="text/css" href="resources/css/ext-all.css" />

              <link rel="stylesheet" type="text/css" href="resources/css/common.css" />

              <script type="text/javascript" src="resources/js/ext-base.js"></script>

              <script type="text/javascript" src="resources/js/ext-all.js"></script>

              <script type="text/javascript">

                     Ext.onReady(function(){

                            Ext.get("logon").on("click", function(){

                                   if(Ext.getDom("userName").value==""){

                                          Ext.MessageBox.alert('提示', '请输入用户名!',function(){

                                                 Ext.get("userName").focus();

                                          });

                                          return;

                                   }

                                   if(Ext.getDom("passWord").value==""){

                                          Ext.MessageBox.alert('提示', '请输入密码!',function(){

                                                 Ext.get("passWord").focus();

                                          });

                                          return;

                                   }

                                  

                                   var msg = Ext.get('msg');

                                   msg.load({

                                          url: 'logon.hr',

                                          params: 'userName='+Ext.getDom("userName").value+'&passWord='+Ext.getDom("passWord").value,

                                          text: '正在登陆...',

                                          callback: function(oElement) {

                                                 if(oElement.dom.innerHTML=="success"){

                                                        oElement.dom.innerHTML="<font color='green'>验证成功,,请稍候...</font>";

                                                        window.setTimeout("window.location='index.jsp'", 200);

                                                 }

                           }

                                   });

                                   msg.show();

                         });

                        

                         Ext.get("close").on("click",function(){

                         Ext.MessageBox.confirm('提示', '你确定要退出系统么?', function(button){

                                 if(button=='yes'){

                                        window.close();

                                 }

                         });

                         });

                        

                     });

              </script>

       </head>

       <body class="logon-body">

              <table class="logon-body-table">

                     <tr class="logon-body-table-tr">

                            <td class="logon-body-table-tr-td">

                                   <div class="logon-body-table-tr-td-div">

                                          <div class="logon-body-table-tr-td-div-div">

                                                 用户名&nbsp;:&nbsp;

                                                 <input type="text" id="userName" size="20" />

                                          </div>

                                          <div class="logon-body-table-tr-td-div-div">

                                                 密 码&nbsp;:&nbsp;

                                                 <input type="password" id="passWord" size="22" />

                                          </div>

                                          <div align="right" class="logon-body-table-tr-td-div-div">

                                                 <button id="logon">

                                                        登 陆

                                                 </button>

                                                 &nbsp;&nbsp;&nbsp;&nbsp;

                                                 <button id="close">

                                                        关 闭

                                                 </button>

                                                 &nbsp;&nbsp;&nbsp;&nbsp;

                                          </div>

                                          <div id="msg" align="right"

                                                 class="logon-body-table-tr-td-div-message">

                                          </div>

                                   </div>

                            </td>

                     </tr>

              </table>

       </body>

</html>

下面是主页面index.jsp,主要用ExtJs构建,登陆成功后就可以进入,主要分为3个模块,员工管理,机构管理和用户管理。在员工管理里面,我们实现了对员工的CRUD并且分页显示员工信息:

<%@ page language="java" pageEncoding="utf-8"%>

<html>

       <head>

              <title>HR Manager</title>

              <meta http-equiv="pragma" content="no-cache">

              <meta http-equiv="cache-control" content="no-cache">

              <link rel="stylesheet" type="text/css" href="resources/css/ext-all.css" />

              <link rel="stylesheet" type="text/css" href="resources/css/common.css" />

              <script type="text/javascript" src="resources/js/ext-base.js"></script>

              <script type="text/javascript" src="resources/js/ext-all.js"></script>

              <style type="text/css">

.x-panel-body p {

       margin: 5px;

}

.x-column-layout-ct .x-panel {

       margin-bottom: 5px;

}

.x-column-layout-ct .x-panel-dd-spacer {

       margin-bottom: 5px;

}

.user {

       background-image: url(resources/icons/user.gif) !important;

}

.unit {

       background-image: url(resources/icons/application_view_list.png)

              !important;

}

.settings {

       background-image: url(resources/icons/cog.png) !important;

}

.tabs {

       background-image: url(resources/icons/tabs.gif ) !important;

}

.munuList {

       list-style: square;

       padding-left: 30px;

       margin-top: 10px;

       color: #000000;

       font-size: 12px;

       text-decoration: underline;

       cursor: hand;

}

#main-panel td {

       padding: 5px;

}

</style>

       </head>

       <body>

              <script type="text/javascript">

                  //create main tabpanel

                  var contentPanel=new Ext.TabPanel({

               id:"tabPanel",

                   region:'center',

                   deferredRender:false,

                   activeTab:0,

                   iconCls: 'tabs',

                   items:[{

                       contentEl:'center',

                       title: '主页',

                       autoScroll:true

                   }]

                });

           Ext.onReady(function(){

                     Ext.state.Manager.setProvider(new Ext.state.CookieProvider());

                    

                    

                     //init main page framework

                     var viewport = new Ext.Viewport({

                          layout:'border',

                          items:[{

                                    region: 'north',

                                    html: '<img src="resources/images/head.jpg" >',

                                     split:true,

                           height: 90,

                    minSize: 100,

                    maxSize: 200,

                    collapsible: true,

                    title:'HR Manager Project',

                    margin:'0 0 0 0'

                                    //border: false,

                                    //layout:"absolute"

                                },{

                              region:'west',

                              id:'west-panel',

                              title:'菜单栏',

                              split:true,

                              width: 200,

                              minSize: 175,

                              maxSize: 400,

                              collapsible: true,

                              margins:'0 0 5 5',

                              cmargins:'0 5 5 5',

                              layout:'accordion',

                              layoutConfig:{

                                  animate:true

                              },

                              items: [{

                                  title:'人员管理',

                                  html: Ext.getDom('userMenus').innerHTML,

                                  autoScroll:true,

                                  border:false,

                                  iconCls:'user'

                              },{

                                  title:'机构管理',

                                  html: Ext.getDom('unitMenus').innerHTML,

                                  border:false,

                                  autoScroll:true,

                                  iconCls:'unit'

                              },{

                                  title:'系统设置',

                                  html: Ext.getDom('settingMenus').innerHTML,

                                  border:false,

                                  autoScroll:true,

                                  iconCls:'settings'

                              }]

                          },contentPanel]

                      });

                     

                      //init main page tables

                      var panel = new Ext.Panel({

                       id:'main-panel',

                       baseCls:'x-plain',

                       renderTo: Ext.get("center"),

                       layout:'table',

                       layoutConfig: {columns:2},

                       defaults: {frame:true, width:395, height: 300},

                       items:[{

                           title:'公告信息',

                           colspan:2,

                           collapsible:true,

                           width:800,

                           contentEl:'afficheDiv'

                       },{

                           title:'人事信息',

                           contentEl:'personDiv'

                          

                       },{

                           title:'机构信息',

                           contentEl:'unitDiv'

                       }]

                   });

                      //clear temp elements.

                         Ext.getDom("menus").innerHTML="";

                  });

                  //定义菜单导航函数  

function onClickMenuItem(node)

{

var n = contentPanel.getComponent(node.id);

if (!n) { ////判断是否已经打开该面板

n = contentPanel.add({

'id':node.id,

'title':node.innerHTML,

closable:true,

autoLoad:{url:'tabFrame.jsp?url='+node.href, callback: this.initSearch, scope: this, scripts:true} //通过autoLoad属性载入目标页,如果要用到脚本,必须加上scripts属性

});

}

contentPanel.setActiveTab(n);

}           

              </script>

              <div id="menus">

                     <div id="userMenus">

                            <ul class="munuList">

                                   <li>

                                          <span id="person" href="person/default.jsp"

                                                 onclick="onClickMenuItem(this)">人员信息</span>

                                   </li>

                            </ul>

                     </div>

                     <div id="unitMenus">

                            <ul class="munuList">

                                   <li>

                                          <span id="unit" href="unit/default.jsp"

                                                 onclick="onClickMenuItem(this)">机构信息</span>

                                   </li>

                            </ul>

                     </div>

                     <div id="settingMenus">

                            <ul class="munuList">

                                   <li>

                                          <span id="userManager" href="system/default.jsp"

                                                 onclick="onClickMenuItem(this)">用户管理</span>

                                   </li>

                            </ul>

                     </div>

              </div>

              <div id="center">

              </div>

              <div id="afficheDiv">

                     <p>

                            尊敬的

                            <font color=green><B>${user.userName}</B> </font> 用户,欢迎您使用人力资源管理系统.

                     </p>

                     <p>

                            添加公告信息...

                     </p>

              </div>

              <div id="personDiv">

                     <p>

                            添加人事信息...

                     </p>

              </div>

              <div id="unitDiv">

                     <p>

                            添加机构信息...

                     </p>

              </div>

       </body>

</html>

上面是我们整个应用的主要视图界面,当我们增加一个模块的操作时,只是在主显示区增加一个面板,里面会自动加载tabFrame.jsp:

<%@ page language="java" pageEncoding="utf-8"%>

<IFRAME SRC="<%=request.getParameter("url")%>" width="100%" height="100%" frameborder="0"></IFRAME>

大家看到,里面只有一个公共的浮动框架,用来容纳真正的页面资源。以person为例,当点击左边菜单栏里的人员管理,真正出现在右边选项面板上的页面资源是person/default.jsp:

<%@ page language="java"  pageEncoding="utf-8"%>

<html>

       <head>

              <title>HR Manager Project - base on SSH Framework</title>

              <meta http-equiv="pragma" content="no-cache">

              <meta http-equiv="cache-control" content="no-cache">

              <link rel="stylesheet" type="text/css" href="../resources/css/ext-all.css" />

             

              <script type="text/javascript" src="../dwr/engine.js"></script>

              <script type="text/javascript" src="../dwr/util.js"></script>

              <script type="text/javascript" src="../dwr/interface/personController.js"></script>

              <script type="text/javascript" src="../dwr/interface/unitController.js"></script>

             

              <script type="text/javascript" src="../resources/js/ext-base.js"></script>

              <script type="text/javascript" src="../resources/js/ext-all.js"></script>

              <script type="text/javascript" src="../resources/js/person_init.js"></script>

             

              <style type="text/css">

                     body {

                   margin:5px;

                   font-size:12px;

               }

                     body .x-panel {

                   margin:5px;

               }

                     body .x-panel {

                   margin-bottom:20px;

               }

               .icon-grid {

                   background-image:url(../resources/icons/grid.png) !important;

               }

               #button-grid .x-panel-body {

                   border:1px solid #99bbe8;

                   border-top:0 none;

               }

               .add {

                   background-image:url(../resources/icons/add.gif) !important;

               }

               .option {

                   background-image:url(../resources/icons/plugin.gif) !important;

               }

               .remove {

                   background-image:url(../resources/icons/delete.gif) !important;

               }

               .save {

                   background-image:url(../resources/icons/save.gif) !important;

               }

              </style>

             

              <script type="text/javascript">

              </script>

       </head>

       <body>

              <div id="add-window" class="x-hidden">

                  <div class="x-window-header">添加人员信息</div>

                  <div id="content"></div>

              </div>

       </body>

</html>

里面用到很多js,其中有DWR和ExtJS两个Ajax库的。还有我们自己写的整个模块的核心js文件为/resources/js/person_init.js,在这里提醒下大家,所有的文件引用一定要注意路径。person_init.js完整代码如下:

var ds;

var grid;

var form;

var win;

Ext.onReady(function() {

                     // get All unit Name for comboBox.

                     unitController.getRecords(function(data) {

                                          if (data != null) {

                                                 var list = [];

                                                 for (var i = 0; i < data.length; i++) {

                                                        list[i] = [data[i].name, data[i].name,

                                                                      data[i].description];

                                                 }

                                                 Ext.grid.unitComboBoxItems = list;

                                                 initData();

                                          }

                                   });

              });

function initData() {

       ds = new Ext.data.Store({

                            // proxy: new Ext.data.MemoryProxy(jsondata),

                            proxy : new Ext.data.HttpProxy({

                                                 url : '../person.hr?action=list'

                                          }),

                            reader : new Ext.data.JsonReader({

                                                 totalProperty : 'totalProperty',

                                                 root : 'root'

                                          }, [{

                                                               name : 'id'

                                                        }, {

                                                               name : 'name'

                                                        }, {

                                                               name : 'age'

                                                        }, {

                                                               name : 'gender'

                                                        }, {

                                                               name : 'unitName'

                                                        }, {

                                                               name : 'telephone'

                                                        }, {

                                                               name : 'address'

                                                        }])

                     });

       ds.load({

                            params : {

                                   start : 0,

                                   limit : 10

                            }

                     });

       initGrid();

}

function getInsertForm() {

       if(!form){

             

form = new Ext.FormPanel({

                            labelWidth : 75,

                            url : '../person.hr',

                            frame : true,

                            bodyStyle : 'padding:5px 5px 0',

                            width : 340,

                            defaults : {

                                   width : 230

                            },

                            defaultType : 'textfield',

                            standardSubmit : true,

                            items : [{

                                                 fieldLabel : '姓名',

                                                 name : 'name',

                                                 allowBlank : false

                                          }, {

                                                 fieldLabel : '年龄',

                                                 name : 'age'

                                          }, new Ext.form.ComboBox({

                                                               fieldLabel : '性别',

                                                               hiddenName : 'gender',

                                                               store : new Ext.data.SimpleStore({

                                                                                    fields : ['abbr', 'state'],

                                                                                    data : [['男', '男'], ['女', '女']]

                                                                             }),

                                                               valueField : 'abbr',

                                                               displayField : 'state',

                                                               mode : 'local',

                                                               triggerAction : 'all',

                                                               emptyText : '请选择一个性别',

                                                               forceSelection : true,

                                                               selectOnFocus : true,

                                                               editable : false

                                                        }), new Ext.form.ComboBox({

                                                               fieldLabel : '机构名称',

                                                               hiddenName : 'unitName',

                                                               store : new Ext.data.SimpleStore({

                                                                                    fields : ['abbr', 'state'],

                                                                                    data : Ext.grid.unitComboBoxItems

                                                                             }),

                                                               valueField : 'abbr',

                                                               displayField : 'state',

                                                               typeAhead : true,

                                                               mode : 'local',

                                                               triggerAction : 'all',

                                                               emptyText : '请选择一个单位名',

                                                               selectOnFocus : true,

                                                               editable : false

                                                        }), {

                                                 fieldLabel : '电话',

                                                 name : 'telephone'

                                          }, {

                                                 fieldLabel : '地址',

                                                 name : 'address'

                                          }]

                     });

       }

       return form;

}

function getUpdateForm() {

       win.title = '编辑员工信息';

       if(!form){

       form =  new Ext.FormPanel({

                            labelWidth : 75,

                            url : '../person.hr',

                            frame : true,

                            bodyStyle : 'padding:5px 5px 0',

                            width : 340,

                            defaults : {

                                   width : 230

                            },

                            defaultType : 'textfield',

                            standardSubmit : true,

                            items : [{

                                                 fieldLabel : 'id',

                                                 name : 'id',

                                                 readOnly : true

                                          }, {

                                                 fieldLabel : '姓名',

                                                 name : 'name',

                                                 allowBlank : false

                                          }, {

                                                 fieldLabel : '年龄',

                                                 name : 'age'

                                          }, new Ext.form.ComboBox({

                                                               fieldLabel : '性别',

                                                               hiddenName : 'gender',

                                                               store : new Ext.data.SimpleStore({

                                                                                    fields : ['abbr', 'state'],

                                                                                    data : [['男', '男'],

                                                                                                  ['女', '女']]

                                                                             }),

                                                               valueField : 'abbr',

                                                               displayField : 'state',

                                                               typeAhead : true,

                                                               mode : 'local',

                                                               triggerAction : 'all',

                                                               emptyText : '请选择性别',

                                                               forceSelection : true,

                                                               selectOnFocus : true,

                                                               editable : false

                                                        }), new Ext.form.ComboBox({

                                                               fieldLabel : '机构名称',

                                                               hiddenName : 'unitName',

                                                               store : new Ext.data.SimpleStore({

                                                                                    fields : ['abbr', 'state'],

                                                                                    data : Ext.grid.unitComboBoxItems

                                                                             }),

                                                               valueField : 'abbr',

                                                               displayField : 'state',

                                                               typeAhead : true,

                                                               mode : 'local',

                                                               triggerAction : 'all',

                                                               emptyText : '请选择机构.',

                                                               selectOnFocus : true,

                                                               editable : false

                                                        }), {

                                                 fieldLabel : '电话',

                                                 name : 'telephone'

                                          }, {

                                                 fieldLabel : '地址',

                                                 name : 'address'

                                          }]

                     });

       }

       return form;

}

function initGrid() {

       Ext.QuickTips.init();

       var xg = Ext.grid;

       // //////////////////////////////////////////////////////////////////////////////////////

       // form

       // //////////////////////////////////////////////////////////////////////////////////////

       if (!form) {

              form = getInsertForm();

       }

       // //////////////////////////////////////////////////////////////////////////////////////

       // win

       // //////////////////////////////////////////////////////////////////////////////////////

       if (!win) {

              win = new Ext.Window({

                                   el : 'add-window',

                                   layout : 'fit',

                                   width : 380,

                                   height : 280,

                                   closeAction : 'hide',

                                   plain : true,

                                   items : form,

                                   buttons : [{

                                          text : '保存',

                                          handler : function() {

                                                 form.getForm().submit({

                                                        failure : function(retForm, retAction) {

                                                               if (retAction.result

                                                                             && retAction.result == '1') {

                                                                      Ext.MessageBox.alert('提示', '保存数据成功!');

                                                                      win.hide();

                                                                      grid.destroy();

                                                                      initData();

                                                               } else if (retAction.result

                                                                             && retAction.result == 'error') {

                                                                      Ext.MessageBox.alert('提示', '保存数据失败!');

                                                               } else {

                                                                      Ext.MessageBox.alert('提示', '保存数据出错!');

                                                               }

                                                        },

                                                        waitMsg : '保存数据...'

                                                 });

                                          }

                                   }, {

                                          text : '清空',

                                          handler : function() {

                                                 form.getForm().reset();

                                          }

                                   }, {

                                          text : '关闭',

                                          handler : function() {

                                                 win.hide();

                                          }

                                   }]

                            });

       }

       // ////////////////////////////////////////////////////////////////////////////////

       // Grid

       // //////////////////////////////////////////////////////////////////////////////////////

       var sm = new xg.CheckboxSelectionModel();

       grid = new xg.GridPanel({

              id : 'button-grid',

              ds : ds,

              cm : new xg.ColumnModel([sm, {

                                   id : 'id',

                                   header : "员工号",

                                   width : 30,

                                   sortable : true,

                                   dataIndex : 'id'

                            }, {

                                   header : "姓名",

                                   width : 40,

                                   sortable : true,

                                   dataIndex : 'name'

                            }, {

                                   header : "年龄",

                                   width : 10,

                                   sortable : true,

                                   dataIndex : 'age'

                            }, {

                                   header : "性别",

                                   width : 10,

                                   sortable : true,

                                   dataIndex : 'gender'

                            }, {

                                   header : "所属机构",

                                   width : 40,

                                   sortable : true,

                                   dataIndex : 'unitName'

                            }, {

                                   header : "联系电话",

                                   width : 20,

                                   sortable : true,

                                   dataIndex : 'telephone'

                            }, {

                                   header : "家庭地址",

                                   width : 50,

                                   sortable : true,

                                   dataIndex : 'address'

                            }]),

              sm : sm,

              stripeRows : true,

              viewConfig : {

                     forceFit : true

              },

              // inline toolbars

              tbar : [{

                                   text : '添加',

                                   tooltip : '添加一条人员信息',

                                   iconCls : 'add',

                                   onClick : function() {

                                          // update form to insert form

                                          form = getInsertForm();

                                          var items = new Ext.util.MixedCollection();

                                          items.add("form", form);

                                          win.items = items;

                                          win.show(this);

                                          form.getForm().reset();

                                   }

                            }, '-', {

                                   text : '修改',

                                   tooltip : '修改一条人员信息',

                                   iconCls : 'option',

                                   onClick : function() {

                                          if (sm.getCount() == 1) {

                                                 // update form to insert form

                                                 form = getUpdateForm();

                                                 var items = new Ext.util.MixedCollection();

                                                 items.add("form", form);

                                                 win.items = items;

                                                 win.show(this);

                                                 form.getForm().reset();

                                                 form.getForm().loadRecord(sm.getSelected());

                                          } else {

                                                 Ext.MessageBox.alert('提示', '请选择一条记录!');

                                          }

                                   }

                            }, '-', {

                                   text : '删除',

                                   tooltip : '删除选择的人员信息',

                                   iconCls : 'remove',

                                   onClick : function() {

                                          if (sm.hasSelection()) {

                                                 Ext.MessageBox.confirm('提示', '你确定要删除这些人员么?',

                                                               function(button) {

                                                                      if (button == 'yes') {

                                                                             var list = sm.getSelections();

                                                                             var rList = [];

                                                                             for (var i = 0; i < list.length; i++) {

                                                                                    rList[i] = list[i].data["id"];

                                                                             }

                                                                             personController.removeRecords(

                                                                                           rList, function(data) {

                                                                                                  if (data > 0) {

                                                                                                         Ext.MessageBox

                                                                                                                       .alert(

                                                                                                                                     '提示',

                                                                                                                                     "删除"

                                                                                                                                                   + data

                                                                                                                                                   + '条数据成功!');

                                                                                                         grid.destroy();

                                                                                                         initData();

                                                                                                  } else {

                                                                                                         Ext.MessageBox

                                                                                                                       .alert(

                                                                                                                                     '提示',

                                                                                                                                     "删除数据失败!");

                                                                                                  }

                                                                                           });

                                                                      }

                                                               });

                                          } else {

                                                 Ext.MessageBox.alert('提示', "请至少选择一条记录!");

                                          }

                                   }

                            }],

              bbar : new Ext.PagingToolbar({

                                   pageSize : 10,

                                   store : ds,

                                   displayInfo : true,

                                   displayMsg : '显示第 {0} 条到 {1} 条记录,一共 {2} 条',

                                   emptyMsg : "没有记录"

                            }),

              width : 815,

              autoHeight : true,

              // frame:true,

              title : '人员信息列表',

              iconCls : 'icon-grid',

              renderTo : document.body

       });

};

       上面是我们整个ExtJS应用的关键代码,它构建了窗口,表单,表格,分页栏等主要ExtJS的组件,指明了页面加载后需要动态获取的数据,为表单和按钮动态添加了异步访问服务器的事件。这里的代码希望大家好好研读。还有两个模块的JSP和JS文件和上面人员管理模块雷同,我这里就不列出来了。大家理解了之后可以自己试着写一下。这样,我们整个HRMS应用就已经构建完毕。下一篇文章我们来做一个总结。

简单总结一下吧。我们这个小项目涉及到ExtJS, JSON, DWR,Spring还有Hibernate这些大部件知识,每一块要学精通都不是朝夕之功。我们分别来看一下这些框架技术:

1.         ExtJS是一个很不错的Ajax框架,可以用来开发带有华丽外观的RIA(富客户端)的Ajax应用,使得我们的B/S应用更加具有活力及生命力。由于它是一个用javascript编写,与后台技术无关的前端Ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。要使用ExtJS,那么首先要得到ExtJS库文件,该框架是开源的,可以直接从官方网站下载,网址http://extjs.com/download,大家可以认真学习下它自带的例子。在我们前面的项目中,我们就是用ExtJS组件来产生如此让人惊艳的页面效果的,有兴趣的朋友可以深入学习下。

2.         JSON是JS里面的原生格式,它是一种非常简单实用的数据传输格式。一个名字:一个值这样的名-值对就是一个JSON元素(注意,这里的值可以是string,number,array,boolean,object或null类型),多个JSON元素用“,”分隔用{}括起来就是一个JSON对象,多个JSON对象用“,”分隔用[]括起来又可以组成一个JSON数组。所以,它可以用非常简洁易懂的方式表示一些很复杂的数据,现在使用的非常广泛。在我们前面的项目中,我们为了实现员工数据分页的功能,采用了JSON做为数据传输的格式。我们看到ExtJS对这种格式提供了良好的支持。

3.         DWR是一个可以允许你去创建AJAX WEB站点的JAVA开源库。它可以让你在Web浏览器端的Javascript代码调用Web服务器上的Java代码,就像是Java代码就在浏览器中一样。 DWR包含2个主要部分:

a)        一个运行在服务器端的Java Servlet,它处理请求并且向浏览器返回响应。

b)        运行在浏览器端的JavaScript,它发送请求而且还能动态更新网页。

在我们前面的项目中,删除员工,机构,用户的操作和获取全部的机构信息都是使用DWR集成Spring完成的。其它的操作我们借用了ExtJS内置的AJAX支持来实现。

4.         Spring是一个开源的轻量级的基于IOC和AOP的容器框架。它被称为Java EE的春天,目标是推进编码最佳实践,充当系统的黏合剂,让我们可以“专心做事”。内容有IOC容器,AOP实现(声明式事务), DAO/ORM支持,MVC的实现,Web集成等。在我们前面的项目中,我们使用了Spring的MVC框架来接收用户请求和完成对用户的响应,利用它提供的IOC容器来管理Controller,Service和DAO这些对象以及她们之间的关系,利用它的声明式事务来优美地实现事务处理,并且还和后面的Hibernate框架很好地集成在一起。

5.         Hibernate是一个优秀的持久化框架。它可以让开发人员用OOP的思想去操纵数据,极大地简化了数据库的访问操作,屏蔽了数据库之间的差异性,它是全球ORM产品的事实上的标准。在我们前面的项目中,我们使用Hibernate来完成具体的CRUD的工作以及数据库的访问细节,并且使用了元数据的注解来完成对象和关系的映射,这样就不用再编写繁琐的XML映射文件。所以我们可以看到,Spring和Hibernate都是非常优秀的框架,具有很高的学习和实用价值,希望大家能多多关注。

OK,大家在跑这个应用的时候一定要注意导入所有正确并且必需的JAR包,而且注意所有配置文件的存放路径。给大家推荐的一种做法就是将每个框架技术都在一个工程中测试可用之后再加入我们的应用,也就是让大家先搭建好完整的应用环境。如果大家在做这个小应用的时候遇到任何问题,或者有任何好的建议,欢迎大家给我留言。祝大家学习愉快,每天进步!

猜你喜欢

转载自zhengshaoxin.iteye.com/blog/1161121