OA_interview

来源:互联网 发布:九校联盟 知乎 编辑:程序博客网 时间:2024/05/02 02:19

实现DAO层

public class Application implements Serializable {private static final long serialVersionUID = 48L;private Integer id;private String reason;private boolean result;private CheckBack check;private AttendType type;private Attend attend;public Application(){}public Application(Integer id , String reason , boolean result , Attend attend , AttendType type , CheckBack check){this.id = id;this.reason = reason;this.result = result;this.attend = attend;this.type = type;this.check = check;}public Integer getId() {return id;}。。。。。。}
public class Attend implements Serializable {private static final long serialVersionUID = 48L;private Integer id;private String dutyDay;//打卡时间private Date punchTime;//代表本次打卡是否为上班打卡private boolean isCome;private Employee employee;private AttendType type;public Attend(){}public Attend(Integer id , String dutyDay ,Date punchTime , boolean isCome ,AttendType type , Employee employee){this.id = id;this.dutyDay = dutyDay;this.punchTime = punchTime;this.isCome = isCome;this.type = type;this.employee = employee;}public Integer getId() {return id;}。。。。。。public boolean equals(Object obj){if (this == obj){return true;}if (obj != null &&obj.getClass() == Attend.class){Attend attend = (Attend)obj;return getEmployee().equals(attend.getEmployee())&& getDutyDay().equals(attend.getDutyDay())&& getIsCome() == attend.getIsCome();}return false;}public int hashCode (){if (getIsCome()){return dutyDay.hashCode() + 29 * employee.hashCode() + 1;}return dutyDay.hashCode() + 29 * employee.hashCode();}}

public class AttendType implements Serializable {private Integer id;private String name;//此类出勤对应的罚款private double amerce;public AttendType(){}public AttendType(Integer id , String name , double amerce){this.id = id;this.name = name;this.amerce = amerce;}public Integer getId() {return id;}。。。。。。}

public class Employee implements Serializable {private static final long serialVersionUID = 48L;private Integer id;private String name;private String pass;private double salary;private Manager manager;private Set<Payment> payments=new HashSet<Payment>();private Set<Attend> attends=new HashSet<Attend>();public Employee(){}public Employee(Integer id , String name , String pass , double salary , Manager manager , Set<Attend> attends , Set<Payment> payments){this.id = id;this.name = name;this.pass = pass;this.salary = salary;this.manager = manager;this.attends = attends;this.payments = payments;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}。。。。。。public boolean equals(Object obj){if(this==obj){return true;}if(obj!=null && obj.getClass()==Employee.class){Employee employee=(Employee)obj;return this.getName().equals(employee.getName())&& this.getPass().equals(employee.getPass());}return false;}public int hashCode(){return name.hashCode()+ pass.hashCode() * 17;}}

对于1-N关系,映射成双向关联,并由N的一端控制关联关系。例如:

Attend.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!-- Hibernate映射文件的根元素 --><hibernate-mapping package="org.crazyit.hrsystem.domain"><classname="Attend"table="attend_table"><cache usage="read-only"/><idname="id" type="integer" column="attend_id"><generator class="identity"/></id><property name="dutyDay" column="duty_day"type="string" not-null="true" length="50"/><property name="punchTime" column="punch_time"type="java.util.Date" /><property name="isCome" column="is_come"type="boolean" not-null="true"/><many-to-one name="type" column="type_id" class="AttendType" not-null="true" lazy="false"/><many-to-one name="employee" column="emp_id" class="Employee" not-null="true" lazy="false"/></class></hibernate-mapping>
AttendType.hbm.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!-- Hibernate映射文件的根元素 --><hibernate-mapping package="org.crazyit.hrsystem.domain"><class name="AttendType" table="type_table"><cache usage="read-only"/><!-- 映射标识属性 --><idname="id" type="integer" column="type_id"><generator class="identity"/></id><property name="name" column="type_name"type="string" not-null="true" length="50"/><property name="amerce" column="amerce_amount"type="double" not-null="true" /></class></hibernate-mapping>
Employee.hbm.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><!-- Hibernate映射文件的根元素 --><hibernate-mapping package="org.crazyit.hrsystem.domain"><class name="Employee" table="emp_table"discriminator-value="1"><cache usage="read-only"/><idname="id" type="integer" column="emp_id"><generator class="identity"/></id><discriminator column="emp_type" type="int"></discriminator><!-- 映射普通属性 --><property name="name" column="emp_name"type="string"not-null="true" length="50" unique="true"/><property name="pass" column="emp_pass"type="string"not-null="true" length="50"/><property name="salary" column="emp_salary" type="double"not-null="true" /><many-to-one name="manager" column="mgr_id"class="Manager" lazy="false"/><set name="attends" inverse="true"><key column="emp_id" /><one-to-many class="Attend"/></set><set name="payments" inverse="true"><key column="emp_id" /><one-to-many class="Payment"/></set><subclass name="Manager" discriminator-value="2"><property name="dept" column="dept_name"type="string" length="50"/><set name="employees" inverse="true"><key column="mgr_id" /><one-to-many class="Employee"/></set><set name="checks" inverse="true"><key column="mgr_id" /><one-to-many class="CheckBack"/></set></subclass></class></hibernate-mapping>

对于不同的持久层技术,Spring的DAO提供一个DAO模板,Spring为Hibernate提供的支持类是HibernateDaoSupport.

DAO定义了DAO组件应该实现的方法,使逻辑组件与DAO组件低耦合。


例如:DAO接口ApplicationDao

public interface ApplicationDao {public Application get(Integer id);public Integer save(Application application);public void update(Application application);public void delete(Application application);public void delete(Integer id);public List<Application> findAll();public List<Application> findByEmp(Employee empl);}
Spring为Hibernate提供的DAO基类是HibernateDaoSupport,只需要传人SessionFactory引用,即可得到HibernateTemplate实例,改实例具有强大的功能。

为了增加分页查询方法,实际应用扩展了HibernateDaoSupport,为YeekuHibernateDaoSupport,

public class YeekuHibernateDaoSupport extends HibernateDaoSupport {/** * 使用hql语句进行分页查询 * @param hql 需要查询的hql语句 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */public List findByPage(final String hql, final int offset, final int pageSize){//通过一个HibernateCallback对象来执行查询List list = getHibernateTemplate().executeFind(new HibernateCallback(){//实现HibernateCallback接口必须实现的方法public Object doInHibernate(Session session)throws HibernateException, SQLException{//执行Hibernate分页查询List result = session.createQuery(hql).setFirstResult(offset).setMaxResults(pageSize).list();return result;}});return list;}/** * 使用hql语句进行分页查询 * @param hql 需要查询的hql语句 * @param value 如果hql有一个参数需要传入,value就是传入hql语句的参数 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */public List findByPage(final String hql , final Object value ,final int offset, final int pageSize){//通过一个HibernateCallback对象来执行查询List list = getHibernateTemplate().executeFind(new HibernateCallback(){//实现HibernateCallback接口必须实现的方法public Object doInHibernate(Session session)throws HibernateException, SQLException{//执行Hibernate分页查询List result = session.createQuery(hql)//为hql语句传入参数.setParameter(0, value) .setFirstResult(offset).setMaxResults(pageSize).list();return result;}});return list;}/** * 使用hql语句进行分页查询 * @param hql 需要查询的hql语句 * @param values 如果hql有多个个参数需要传入,values就是传入hql的参数数组 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */public List findByPage(final String hql, final Object[] values,final int offset, final int pageSize){//通过一个HibernateCallback对象来执行查询List list = getHibernateTemplate().executeFind(new HibernateCallback(){//实现HibernateCallback接口必须实现的方法public Object doInHibernate(Session session)throws HibernateException, SQLException{//执行Hibernate分页查询Query query = (Query) session.createQuery(hql);//为hql语句传入参数for (int i = 0 ; i < values.length ; i++){query.setParameter( i, values[i]);}List result = ((org.hibernate.Query) query.setFirstResult(offset).setMaxResults(pageSize)).list();return result;}});return list;}}

实际应用中,DAO实现类都要继承HibernateDaoSupport(YeekuHibernateDaoSupport),并实现相应的DAO接口;而业务组件类则面向接口编程。

例如ApplicationDaoHibernate.java

public class ApplicationDaoHibernate extends YeekuHibernateDaoSupport implementsApplicationDao {@Overridepublic Application get(Integer id) {// TODO Auto-generated method stubreturn this.getHibernateTemplate().get(Application.class, id);}@Overridepublic Integer save(Application application) {// TODO Auto-generated method stubreturn (Integer)this.getHibernateTemplate().save(application);}@Overridepublic void update(Application application) {// TODO Auto-generated method stubthis.getHibernateTemplate().update(application);}@Overridepublic void delete(Application application) {// TODO Auto-generated method stubthis.getHibernateTemplate().delete(application);}@Overridepublic void delete(Integer id) {// TODO Auto-generated method stubthis.getHibernateTemplate().delete(get(id));}@Overridepublic List<Application> findAll() {// TODO Auto-generated method stubreturn (List<Application>)this.getHibernateTemplate().find("from Application");}@Overridepublic List<Application> findByEmp(Employee empl) {// TODO Auto-generated method stubreturn (List<Application>)this.getHibernateTemplate().find("from Application as a where a.attend.employee=?",empl);}}

部署DAO层:

Spring容器为DAO运行注入所需的SessionFactory.

ApplicationContext.xml

配置数据源:

<!-- 定义数据源Bean,使用C3P0数据源实现 --><!-- 设置连接数据库的驱动、URL、用户名、密码连接池最大连接数、最小连接数、初始连接数等参数 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"destroy-method="close"p:driverClass="com.mysql.jdbc.Driver"p:jdbcUrl="jdbc:mysql://localhost:3306/hrSystem"p:user="root"p:password="111111"p:maxPoolSize="40"p:minPoolSize="1"p:initialPoolSize="1"p:maxIdleTime="20"/>

配置SessionFactory Bean

<!-- 定义Hibernate的SessionFactory --><!-- 依赖注入数据源,注入正是上面定义的dataSource --><bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"p:dataSource-ref="dataSource"><!-- mappingResouces属性用来列出全部映射文件 --><property name="mappingResources"><list><!-- 以下用来列出Hibernate映射文件 --><value>org/crazyit/app/hrsystem/domain/Application.hbm.xml</value><value>org/crazyit/app/hrsystem/domain/Attend.hbm.xml</value><value>org/crazyit/app/hrsystem/domain/AttendType.hbm.xml</value><value>org/crazyit/app/hrsystem/domain/CheckBack.hbm.xml</value><value>org/crazyit/app/hrsystem/domain/Employee.hbm.xml</value><value>org/crazyit/app/hrsystem/domain/Payment.hbm.xml</value></list></property><!-- 定义Hibernate的SessionFactory的属性 --><property name="hibernateProperties"><!-- 指定数据库方言、是否自动建表是否生成SQL语句等 --><value>hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialecthibernate.hbm2ddl.auto=updatehibernate.show_sql=truehibernate.format_sql=true#开启二级缓存hibernate.cache.use_second_level_cache=true#设置二级缓存的提供者hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider</value></property></bean>
配置DAO组件,daoContext.xml

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- 配置DAO组件的模板 --><bean id="daoTemplate" abstract="true" lazy-init="true" p:sessionFactory-ref="sessionFactory"></bean><bean id="employeeDao"class="org.crazyit.app.hrsystem.dao.impl.EmployeeDaoHibernate"parent="daoTemplate"/><bean id="managerDao"class="org.crazyit.app.hrsystem.dao.impl.ManagerDaoHibernate"parent="daoTemplate"/><bean id="attendDao"class="org.crazyit.app.hrsystem.dao.impl.AttendDaoHibernate"parent="daoTemplate"/><bean id="attendTypeDao"class="org.crazyit.app.hrsystem.dao.impl.AttendTypeDaoHibernate"parent="daoTemplate"/><bean id="appDao"class="org.crazyit.app.hrsystem.dao.impl.ApplicationDaoHibernate"parent="daoTemplate"/><bean id="checkDao"class="org.crazyit.app.hrsystem.dao.impl.CheckBackDaoHibernate"parent="daoTemplate"/><bean id="payDao"class="org.crazyit.app.hrsystem.dao.impl.PaymentDaoHibernate"parent="daoTemplate"/></beans>

首先配置DAO组件模板,为该模板注入SessionFactory;DAO组件继承该模板,因此DAO组件也注入了SessionFactory.
实现Service层


public interface MgrManager {/** * 根据经理返回该部门的没有批复的申请 * @param mgr 经理名 * @return 该部门的全部申请 */List<AppBean> getAppsByMgr(String mgr)throws HrException;/** * 处理申请 * @param appid 申请ID * @param mgrName 经理名字 * @param result 是否通过 */void check(int appid, String mgrName, boolean result);/** * 根据经理返回该部门的全部员工 * @param mgr 经理名 * @return 经理的全部下属 */List<EmpBean> getEmpsByMgr(String mgr)throws HrException;/** * 新增员工 * @param emp 新增的员工 * @param mgr 员工所属的经理 */void addEmp(Employee emp , String mgr)throws HrException;/** * 根据经理返回所有的部门上个月工资 * @param mgr 新增的员工名 * @return 部门上个月工资 */List<SalaryBean> getSalaryByMgr(String mgr)throws HrException;}

public class MgrManagerImpl implements MgrManager {private ApplicationDao appDao;private AttendDao attendDao;private AttendTypeDao typeDao;private CheckBackDao checkDao;private EmployeeDao empDao;private ManagerDao mgrDao;private PaymentDao payDao;public ApplicationDao getAppDao() {return appDao;}public void setAppDao(ApplicationDao appDao) {this.appDao = appDao;}public AttendDao getAttendDao() {return attendDao;}public void setAttendDao(AttendDao attendDao) {this.attendDao = attendDao;}public AttendTypeDao getTypeDao() {return typeDao;}public void setTypeDao(AttendTypeDao typeDao) {this.typeDao = typeDao;}public CheckBackDao getCheckDao() {return checkDao;}public void setCheckDao(CheckBackDao checkDao) {this.checkDao = checkDao;}public EmployeeDao getEmpDao() {return empDao;}public void setEmpDao(EmployeeDao empDao) {this.empDao = empDao;}public ManagerDao getMgrDao() {return mgrDao;}public void setMgrDao(ManagerDao mgrDao) {this.mgrDao = mgrDao;}public PaymentDao getPayDao() {return payDao;}public void setPayDao(PaymentDao payDao) {this.payDao = payDao;}/** * 根据经理返回该部门的没有批复的申请 * @param mgr 经理名 * @return 该部门的全部申请 */@Overridepublic List<AppBean> getAppsByMgr(String mgr) throws HrException {// TODO Auto-generated method stubManager m=mgrDao.findByName(mgr);if(m==null){throw new HrException("您是经理吗?或你还未登录?");}//查询该经理对应的全部员工List<Employee> emps=this.empDao.findByMgr(m);if(emps==null || emps.size()<1){throw new HrException("您的部门没有员工");}//封装VO集List<AppBean> result=new ArrayList<AppBean>();for(Employee e:emps){List<Application> apps=appDao.findByEmp(e);if(apps!=null && apps.size()>1){for(Application app:apps){//只选择还未处理的申请if(app.getResult()==false){Attend attend=app.getAttend();result.add(new AppBean(app.getId(),e.getName(),attend.getType().getName(),app.getType().getName(),app.getReason()));}}}}return result;}/** * 处理申请 * @param appid 申请ID * @param mgrName 经理名字 * @param result 是否通过 */@Overridepublic void check(int appid, String mgrName, boolean result) {// TODO Auto-generated method stubApplication app=appDao.get(appid);CheckBack check=new CheckBack();check.setApp(app);//同意通过申请if(result){//设置通过申请check.setResult(true);//修改申请为已经批复app.setResult(true);appDao.save(app);//为真时,还需要修改出勤的类型Attend attend=app.getAttend();attend.setType(app.getType());attendDao.update(attend);}else{//没有通过申请check.setResult(false);app.setResult(true);appDao.save(app);}//保存申请批复checkDao.save(check);}/*** 根据经理返回该部门的全部员工* @param mgr 经理名* @return 经理的全部下属*/@Overridepublic List<EmpBean> getEmpsByMgr(String mgr) throws HrException {// TODO Auto-generated method stubManager m=mgrDao.findByName(mgr);if(m==null){throw new HrException("您是经理吗?或你还未登录?");}//查询该经理对应的全部员工List<Employee> emps=empDao.findByMgr(m);//部门依然没有员工if (emps == null || emps.size() < 1){throw new HrException("您的部门没有员工");}//封装VO集List<EmpBean> result =new ArrayList<EmpBean>();for (Employee e : emps){result.add(new EmpBean(e.getName(),e.getPass(),e.getSalary()));}return result;}/** * 新增员工 * @param emp 新增的员工 * @param mgr 员工所属的经理 */@Overridepublic void addEmp(Employee emp, String mgr) throws HrException {// TODO Auto-generated method stubManager m = mgrDao.findByName(mgr);if (m == null){throw new HrException("新增员工的业务异常");}emp.setManager(m);empDao.save(emp);}/** * 根据经理返回所有的部门上个月工资 * @param mgr 新增的员工名 * @return 部门上个月工资 */@Overridepublic List<SalaryBean> getSalaryByMgr(String mgr) throws HrException {// TODO Auto-generated method stubManager m = mgrDao.findByName(mgr);if (m == null){throw new HrException("您是经理吗?或你还未登录?");}//查询该经理对应的全部员工List<Employee> emps = empDao.findByMgr(m);//部门依然没有员工if (emps == null || emps.size() < 1){throw new HrException("您的部门没有员工");}Calendar c = Calendar.getInstance();c.add(Calendar.MONTH , -1);SimpleDateFormat sdf = new  SimpleDateFormat("yyyy-MM");String payMonth = sdf.format(c.getTime());List<SalaryBean> result = new ArrayList<SalaryBean>();//遍历本部门每个员工for (Employee e : emps){Payment p = payDao.findByMonthAndEmp(payMonth , e);if (p != null){result.add(new SalaryBean(e.getName() , p.getAmount()));}}return result;}}

事务管理

applicationContext.xml

<!-- 配置Hibernate的局部事务管理器,使用HibernateTransactionManager类 --><!-- 该类实现PlatformTransactionManager接口,是针对Hibernate的特定实现--><!-- 并注入SessionFactory的引用 --><bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"p:sessionFactory-ref="sessionFactory"/><!-- 配置事务增强处理Bean,指定事务管理器 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><!-- 用于配置详细的事务语义 --><tx:attributes><!-- 所有以'get'开头的方法是read-only的 --><tx:method name="get*" read-only="true"/><!-- 其他方法使用默认的事务设置 --><tx:method name="*"/></tx:attributes></tx:advice><aop:config><!-- 配置一个切入点,匹配empManager和mgrManager两个Bean的所有方法的执行 --><aop:pointcut id="leePointcut"expression="bean(empManager)||bean(mgrManager)"/><!-- 指定在leePointcut切入点应用txAdvice事务增强处理 --><aop:advisor advice-ref="txAdvice" pointcut-ref="leePointcut"/></aop:config>
<aop:advisor />用于配置自动代理。

部署业务逻辑组件:

<!-- 定义业务逻辑组件模板 --><!-- 为之注入DAO组件 --><bean id="managerTemplate" abstract="true" lazy-init="true"p:appDao-ref="appDao"p:attendDao-ref="attendDao"p:typeDao-ref="attendTypeDao"p:checkDao-ref="checkDao"p:empDao-ref="employeeDao"p:mgrDao-ref="managerDao"p:payDao-ref="payDao"/><!-- 定义两个业务逻辑组件,继承业务逻辑组件的模板 --><bean id="empManager"class="org.crazyit.hrsystem.service.impl.EmpManagerImpl"parent="managerTemplate"/><bean id="mgrManager"class="org.crazyit.hrsystem.service.impl.MgrManagerImpl"parent="managerTemplate"/>

Spring容器管理各组件间的依赖关系,把依赖关系从代码中抽离,放在配置文件中进行管理,很好的实现组件之间的解耦。

实现Web层

web.xml 配置Struts2

<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"><!-- 配置Spring配置文件的位置 --><context-param><param-name>contextConfigLocation</param-name><param-value>/HRSystem/applicationContext.xml,/HRSystem/daoContext.xml</param-value></context-param><!-- 使用ContextLoaderListener初始化Spring容器 --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 定义Struts 2的核心Filter --><filter><filter-name>struts2</filter-name><filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class></filter><!-- 让Struts 2的核心Filter拦截所有请求 --><filter-mapping><filter-name>struts2</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 定义Web应用的首页 --><welcome-file-list><welcome-file>/content/index.jsp</welcome-file></welcome-file-list></web-app>

两个Action基类:

public class EmpBaseActionextends ActionSupport{//依赖的业务逻辑组件protected EmpManager mgr;//依赖注入业务逻辑组件所必须的setter方法public void setEmpManager(EmpManager mgr){this.mgr = mgr;}}

public class MgrBaseAction extends ActionSupport{protected MgrManager mgr;public void setMgrManager(MgrManager mgr){this.mgr = mgr;}}



loginAction.java

public class LoginAction extends EmpBaseAction {    //定义一个常量作为员工登录成功的Result名private final String EMP_RESULT = "emp";//定义一个常量作为经理登录成功的Result名private final String MGR_RESULT = "mgr";//封装请求参数private Manager manager;//登录的验证码private String vercode;//处理登录后的提示信息private String tip;public Manager getManager() {return manager;}public void setManager(Manager manager) {this.manager = manager;}public String getVercode() {return vercode;}public void setVercode(String vercode) {this.vercode = vercode;}public String getTip() {return tip;}public void setTip(String tip) {this.tip = tip;}public String execute() throws Exception{ActionContext ctx=ActionContext.getContext();int result=mgr.validLogin(getManager());//登录结果为普通员工   if(result==LOGIN_EMP){   ctx.getSession().put(WebConstant.USER , manager.getName());   ctx.getSession().put(WebConstant.LEVEL,WebConstant.EMP_LEVEL);   setTip("您已经成功登录系统");return EMP_RESULT;}    //登录结果为经理   else if (result == LOGIN_MGR){ctx.getSession().put(WebConstant.USER, manager.getName());ctx.getSession().put(WebConstant.LEVEL, WebConstant.MGR_LEVEL);return MGR_RESULT;}//用户名和密码不匹配else{setTip("用户名/密码不匹配");return ERROR;}}}

struts.xml

<!-- 定义处理登录系统的的Action --><action name="processLogin"class="org.crazyit.app.hrsystem.action.LoginAction"><result name="input">/content/login.jsp</result><result name="mgr">/content/manager/index.jsp</result><result name="emp">/content/employee/index.jsp</result><result name="error">/content/login.jsp</result></action>

校验规则文件LoginAction_validation.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.3//EN""http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd"><validators><field name="manager.name"><field-validator type="requiredstring"><message>用户名必填!</message></field-validator><field-validator type="regex"><param name="expression"><![CDATA[(\w{4,25})]]></param><message>您输入的用户名只能是字母和数字,且长度必须在4到25之间</message></field-validator></field><field name="manager.pass"><field-validator type="requiredstring"><message>密码必填!</message></field-validator><field-validator type="regex"><param name="expression"><![CDATA[(\w{4,25})]]></param><message>您输入的密码只能是字母和数字,且长度必须在4到25之间</message></field-validator></field><field name="vercode"><field-validator type="requiredstring"><message>验证码必填!</message></field-validator><field-validator type="regex"><param name="expression"><![CDATA[(\w{6,6})]]></param><message>您输入的验证码只能是字母和数字,且长度必须在6位</message></field-validator></field></validators>

public class PunchAction extends EmpBaseAction {//封装处理结果的punchIsValid属性private int punchIsValid;public int getPunchIsValid() {return punchIsValid;}public void setPunchIsValid(int punchIsValid) {this.punchIsValid = punchIsValid;}public String execute()throws Exception{//创建ActionContext实例ActionContext ctx = ActionContext.getContext();//获取HttpSession中的user属性String user = (String)ctx.getSession().get(WebConstant.USER);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化当前时间String dutyDay=sdf.format(new Date());//调用业务逻辑方法处理用户请求int result=mgr.validPunch(user, dutyDay);this.setPunchIsValid(result);return "success";}}

<!-- 进入打卡 --><action name="*Punch" class="org.crazyit.app.hrsystem.action.PunchAction"><interceptor-ref name="empStack"/>   <result>/content/{1}/punch.jsp</result></action>

。。。。。

使用拦截器完成权限管理:

import org.crazyit.app.hrsystem.action.WebConstant;import com.opensymphony.xwork2.*;import com.opensymphony.xwork2.interceptor.*;public class EmpAuthorityInterceptor extends AbstractInterceptor {@Overridepublic String intercept(ActionInvocation invocation) throws Exception {// TODO Auto-generated method stub       //创建ActionContext实例ActionContext ctx = ActionContext.getContext();//获取HttpSession中的level属性String level = (String)ctx.getSession().get(WebConstant.LEVEL);//如果level不为null,且level为emp或mgrif (level != null && (level.equals(WebConstant.EMP_LEVEL) || level.equals(WebConstant.MGR_LEVEL))){return invocation.invoke();}else{return Action.LOGIN;}}}
如果HttpSession里的level不为null,且level为emp或mgr,放行。

public class MgrAuthorityInterceptor extends AbstractInterceptor {@Overridepublic String intercept(ActionInvocation invocation) throws Exception {// TODO Auto-generated method stub        //创建ActionContext实例ActionContext ctx = ActionContext.getContext();//获取HttpSession中的level属性String level = (String)ctx.getSession().get(WebConstant.LEVEL);//如果level不为null,且level为mgrif ( level != null && level.equals(WebConstant.MGR_LEVEL)){return invocation.invoke();}else{return Action.LOGIN;}}}

 <interceptors><!-- 配置普通员工角色的权限检查拦截器 --><interceptor name="empAuth"class="org.crazyit.app.hrsystem.action.authority.EmpAuthorityInterceptor"/><!-- 配置经理角色的权限检查拦截器 --><interceptor name="mgrAuth"class="org.crazyit.app.hrsystem.action.authority.MgrAuthorityInterceptor"/><!-- 配置普通员工的默认的拦截器栈 --><interceptor-stack name="empStack"><interceptor-ref name="defaultStack"/><interceptor-ref name="empAuth"/></interceptor-stack><!-- 配置经理的默认的拦截器栈 --><interceptor-stack name="mgrStack"><interceptor-ref name="defaultStack"/><interceptor-ref name="mgrAuth"/></interceptor-stack></interceptors>






原创粉丝点击