第十章的案例有个地方搞不明白,恳请帮忙,谢谢啊。注:这个项目可以正常运行,程序和布署都没问题。在第3版的第十章的案例,简单工作流系统中,登录这一步,有两个问题没搞明白,恳请解答一下,非常非常感谢
一、在LoginAction类中,有两个属性:private Manager manager、private Manager manager,在execute方法中,直接调用了manager.getName()、和vercode.equalsIgnoreCase()方法, 我想manager和vercode这时已经被自动装配了。但在spring的配置文件applicationContext.xml和daoContext.xml中,并没有找到id是manager的bean定义,我想请问一下,这个manager和vercode是何时、根据什么注入的?值的内容是从哪里来的?二、LoginAction有个继承来的属性:protected EmpManager mgr,和setter方法:public void setEmpManager(EmpManager mgr),这里的mgr也是自动装配注入进来的吗?这里自动装配好像不是根据名字mgr,而是根据类型EmpManager,我想请教一下,在哪里能找到根据类型进行自动装配的设置?如果不指定自动装配类型,spring是如何决定用name装配还是用type装配?恳请高手解答一下,这两个问题折磨了好几天了,谢谢哈

解决方案 »

  1.   

    Web.xml文件:<?xml version="1.0" encoding="GBK"?>
    <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/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <!-- 配置Spring配置文件的位置 -->
    <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml,
    /WEB-INF/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>index.jsp</welcome-file>
    </welcome-file-list>  <servlet>
        <servlet-name>AuthImg</servlet-name>
        <servlet-class>org.crazyit.hrsystem.web.AuthImg</servlet-class>
      </servlet>  <servlet-mapping>
        <servlet-name>AuthImg</servlet-name>
        <url-pattern>/WEB-INF/content/authImg.jsp</url-pattern>
      </servlet-mapping >

    </web-app>
    spring的配置文件:applicationContext.xml<?xml version="1.0" encoding="GBK"?>
    <!-- 指定Spring配置文件的Schema信息 -->
    <beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/aop 
    http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <!-- 定义数据源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://192.168.0.215:3306/hrSystem"
    p:user="root"
    p:password="518adrnd001"
    p:maxPoolSize="40"
    p:minPoolSize="1"
    p:initialPoolSize="1"
    p:maxIdleTime="20"/> <!-- 定义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/hrsystem/domain/Application.hbm.xml</value>
    <value>org/crazyit/hrsystem/domain/Attend.hbm.xml</value>
    <value>org/crazyit/hrsystem/domain/AttendType.hbm.xml</value>
    <value>org/crazyit/hrsystem/domain/CheckBack.hbm.xml</value>
    <value>org/crazyit/hrsystem/domain/Employee.hbm.xml</value>
    <value>org/crazyit/hrsystem/domain/Payment.hbm.xml</value>
    </list>
    </property>
    <!-- 定义Hibernate的SessionFactory的属性 -->
    <property name="hibernateProperties">
    <!-- 指定数据库方言、是否自动建表
    是否生成SQL语句等  -->
    <value>
    hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect
    hibernate.hbm2ddl.auto=update
    hibernate.show_sql=true
    hibernate.format_sql=true
    #开启二级缓存
    hibernate.cache.use_second_level_cache=true
    #设置二级缓存的提供者
    hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
    </value>
    </property>
    </bean> <!-- 配置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> <!-- 定义业务逻辑组件模板 -->
    <!-- 为之注入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"/><bean id="cronTriggerPay" 
    class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail">
    <!-- 使用嵌套Bean的方式来定义任务Bean -->
    <bean 
    class="org.springframework.scheduling.quartz.JobDetailBean">
    <!-- 指定任务Bean的实现类 -->
    <property name="jobClass"
    value="org.crazyit.hrsystem.schedule.PayJob"/>
    <!-- 为任务Bean注入属性 -->
    <property name="jobDataAsMap">
    <map>
    <entry key="empMgr" value-ref="empManager"/>
    </map>
    </property>
    </bean>
    </property>
    <!-- 指定Cron表达式:每月3日2时启动 -->
    <property name="cronExpression" value="0 0 2 3 * ? *"/>
    </bean><!-- 定义触发器来管理任务Bean -->
    <bean id="cronTriggerPunch" 
    class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail">
    <!-- 使用嵌套Bean的方式来定义任务Bean -->
    <bean
    class="org.springframework.scheduling.quartz.JobDetailBean">
    <!-- 指定任务Bean的实现类 -->
    <property name="jobClass" 
    value="org.crazyit.hrsystem.schedule.PunchJob"/>
    <!-- 为任务Bean注入属性 -->
    <property name="jobDataAsMap">
    <map>
    <entry key="empMgr" value-ref="empManager"/>
    </map>
    </property>
    </bean>
    </property>
    <!-- 指定Cron表达式:周一到周五7点、12点执行调度 -->
    <property name="cronExpression" 
    value="0 0 7,12 ? * MON-FRI"/>
    </bean>
    <!-- 执行实际的调度调度 -->
    <bean 
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
    <list>
    <ref local="cronTriggerPay"/>
    <ref local="cronTriggerPunch"/>
    </list>
    </property>
    </bean>
    </beans>
      

  2.   

    daoContext.xml<?xml version="1.0" encoding="GBK"?>
    <!-- 指定Spring配置文件的Schema信息 -->
    <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 id="employeeDao"
    class="org.crazyit.hrsystem.dao.impl.EmployeeDaoHibernate"
    parent="daoTemplate"/> <bean id="managerDao"
    class="org.crazyit.hrsystem.dao.impl.ManagerDaoHibernate"
    parent="daoTemplate"/> <bean id="attendDao"
    class="org.crazyit.hrsystem.dao.impl.AttendDaoHibernate"
    parent="daoTemplate"/> <bean id="attendTypeDao"
    class="org.crazyit.hrsystem.dao.impl.AttendTypeDaoHibernate"
    parent="daoTemplate"/> <bean id="appDao"
    class="org.crazyit.hrsystem.dao.impl.ApplicationDaoHibernate"
    parent="daoTemplate"/> <bean id="checkDao"
    class="org.crazyit.hrsystem.dao.impl.CheckBackDaoHibernate"
    parent="daoTemplate"/> <bean id="payDao"
    class="org.crazyit.hrsystem.dao.impl.PaymentDaoHibernate"
    parent="daoTemplate"/></beans>
    struts.xml文件:<?xml version="1.0" encoding="GBK"?>
    <!-- 指定Struts2配置文件的DTD信息 -->
    <!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN"
    "http://struts.apache.org/dtds/struts-2.1.7.dtd">
    <!-- Struts2配置文件的根元素 -->
    <struts>
    <!-- 配置了系列常量 -->
    <constant name="struts.custom.i18n.resources" value="resource"/>
    <constant name="struts.i18n.encoding" value="GBK"/>
    <constant name="struts.devMode" value="true"/>
    <package name="default" extends="struts-default">
    <interceptors>
    <!-- 配置普通员工角色的权限检查拦截器 -->
    <interceptor name="empAuth" class=
    "org.crazyit.hrsystem.action.authority.EmpAuthorityInterceptor"/>
    <!-- 配置经理角色的权限检查拦截器 -->
    <interceptor name="mgrAuth" class=
    "org.crazyit.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> <!-- 定义全局Result映射 -->
    <global-results>
    <!-- 定义sql、root两个异常对应的视图页 -->
    <result name="business">/WEB-INF/content/error.jsp</result>
    <result name="root">/WEB-INF/content/error.jsp</result>
    <!-- 定义login逻辑视图对应的视图资源 -->
    <result name="login">/WEB-INF/content/login.jsp</result>
    </global-results> <!-- 定义全局异常映射 -->
    <global-exception-mappings>
    <!-- 当Action中遇到HrException异常时,
    系统将转入name为business的结果中 -->
    <exception-mapping 
    exception="org.crazyit.hrsystem.exception.HrException"
    result="business"/>
    <!-- 当Action中遇到Exception异常时,
    系统将转入name为root的结果中 -->
    <exception-mapping exception="java.lang.Exception" 
    result="root"/>
    </global-exception-mappings><!--============================下面是员工角色的Action========================-->
    <!-- 定义处理登出请求的Action -->
    <action name="logout" 
    class="org.crazyit.hrsystem.action.LogoutAction">
    <result>/WEB-INF/content/main.jsp</result>
    </action>
    <!-- 定义处理登录系统的的Action -->
    <action name="processLogin"
    class="org.crazyit.hrsystem.action.LoginAction">
    <result name="input">/WEB-INF/content/login.jsp</result>
    <result name="mgr">/WEB-INF/content/manager/index.jsp</result>
    <result name="emp">/WEB-INF/content/employee/index.jsp</result>
    <result name="error">/WEB-INF/content/login.jsp</result>
    </action>
    <!-- 进入打卡 -->
    <action name="*Punch" 
    class="org.crazyit.hrsystem.action.PunchAction">
    <interceptor-ref name="empStack"/>
       <result>/WEB-INF/content/{1}/punch.jsp</result>
    </action> <!-- 处理上班打卡 -->
    <action name="*Come" method="come"
    class="org.crazyit.hrsystem.action.ProcessPunchAction">
    <interceptor-ref name="empStack"/>
    <result>/WEB-INF/content/{1}/index.jsp</result>
    </action>
    <!-- 处理下班打卡 -->
    <action name="*Leave"  method="leave"
    class="org.crazyit.hrsystem.action.ProcessPunchAction">
    <interceptor-ref name="empStack"/>
    <result>/WEB-INF/content/{1}/index.jsp</result>
         </action>

    <!-- 查看自己的非正常出勤 -->
    <action name="viewUnPunch" 
    class="org.crazyit.hrsystem.action.ViewUnAttendAction">
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="empAuth"/>
    <result>/WEB-INF/content/employee/viewUnAttend.jsp</result>
    </action> <!-- 进入异动申请 -->
    <action name="appChange" 
    class="org.crazyit.hrsystem.action.AppChangeAction">
    <interceptor-ref name="store">
    <param name="operationMode">RETRIEVE</param>
    </interceptor-ref>
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="empAuth"/>
    <result>/WEB-INF/content/employee/appChange.jsp</result>
    </action><!-- 提交异动申请 -->
    <action name="processApp"
    class="org.crazyit.hrsystem.action.ProcessAppAction">
    <interceptor-ref name="store">
    <param name="operationMode">STORE</param>
    </interceptor-ref>
    <interceptor-ref name="empStack"/>
    <result name="input" type="redirect">
    /appChange.action?attid=${attId}</result>
    <result>/WEB-INF/content/employee/index.jsp</result>
    </action> <!-- 查看本人工资的Action -->
    <action name="view*Salary"
    class="org.crazyit.hrsystem.action.ViewSalaryAction">
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="empAuth"/>
    <result>/WEB-INF/content/{1}/viewSalary.jsp</result>
     </action><!--============================下面是经理角色的Action========================-->
    <action name="viewDeptSal"
    class="org.crazyit.hrsystem.action.ViewDeptAction">
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="mgrAuth"/>
    <result>/WEB-INF/content/manager/viewDeptSal.jsp</result>
    </action> <!-- 经理查看员工 -->
    <action name="viewEmp"
    class="org.crazyit.hrsystem.action.ViewEmpAction">
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="mgrAuth"/>
    <result>/WEB-INF/content/manager/viewEmp.jsp</result>
    </action> <!-- 经理查看申请 -->
    <action name="viewApp"
    class="org.crazyit.hrsystem.action.ViewAppAction">
    <interceptor-ref name="basicStack"/>
    <interceptor-ref name="mgrAuth"/>
    <result>/WEB-INF/content/manager/viewApps.jsp</result>
    </action> <!-- 进入添加员工 -->
    <action name="addEmp">
    <interceptor-ref name="mgrStack"/>
    <result>/WEB-INF/content/manager/addEmp.jsp</result>
    </action> <!-- 经理增加员工 -->
    <action name="processAdd" 
    class="org.crazyit.hrsystem.action.AddEmpAction">
    <!-- 使用系统默认的拦截器栈 -->
    <interceptor-ref name="mgrStack"/>
    <!-- 使用防刷新的token拦截器 -->
    <interceptor-ref name="token"/>
    <!-- 定义重复提交转向的视图,该逻辑视图名必须是invalid.token -->
    <result name="invalid.token">/WEB-INF/content/manager/addEmp.jsp</result>
    <result name="input">/WEB-INF/content/manager/addEmp.jsp</result>
    <result name="failure">/WEB-INF/content/manager/addEmp.jsp</result>
    <result>/WEB-INF/content/manager/index.jsp</result>
    </action> <!-- 经理处理申请 -->
    <action name="check"
    class="org.crazyit.hrsystem.action.CheckAppAction">
    <interceptor-ref name="mgrStack"/>
    <result type="chain">viewApp</result>
    </action> <action name="*">
    <result>/WEB-INF/content/{1}.jsp</result>
    </action>
    </package>
    </struts>
      

  3.   

    登录页面文件:login.jsp<%@ page contentType="text/html; charset=gb2312" language="java" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <%@taglib prefix="s" uri="/struts-tags"%>
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=gb2312">
    <title>登录系统</title>
    <s:head/>
    </head>
    <body>
    <%@include file="header.jsp"%>
    <table width=780 align="center"
    background="${pageContext.request.contextPath}/images/bodybg.jpg">
    <tr >
    <td >
    请输入用户名和密码来登录<br />
    <s:if test="tip!=null">
    <div class="error">
    <s:property value="tip"/>
    </div>
    </s:if>
    <s:actionerror cssClass="error"/>
    <div align="center">
    <s:form action="processLogin">
    <s:textfield name="manager.name" label="用户名"/>
    <s:textfield name="manager.pass" label="密码"/>
    <s:textfield name="vercode" label="验证码"/>
    <tr><td colspan="2">
    <s:submit value="登录" theme="simple"/><s:reset theme="simple" value="重填"/>
    </td></tr>
    </s:form>
    </div>
    验证码:<img name="d" src="authImg">
    </td>
    </tr>
    </table>
    <%@include file="footer.jsp"%>
    </body>
    </html>处理登录的action:package org.crazyit.hrsystem.action;import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;import com.opensymphony.xwork2.*;
    import org.apache.struts2.interceptor.*;import org.crazyit.hrsystem.service.EmpManager;
    import org.crazyit.hrsystem.domain.*;
    import org.crazyit.hrsystem.exception.HrException;
    import org.crazyit.hrsystem.action.base.EmpBaseAction;
    import static org.crazyit.hrsystem.service.EmpManager.*;/**
     * Description:
     * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> 
     * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
     * <br/>This program is protected by copyright laws.
     * <br/>Program Name:
     * <br/>Date:
     * @author  Yeeku.H.Lee [email protected]
     * @version  1.0
     */
    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;
    //manager属性的setter和getter方法
    public void setManager(Manager manager)
    {
    this.manager = manager;
    }
    public Manager getManager()
    {
    return this.manager;
    } //vercode属性的setter和getter方法
    public void setVercode(String vercode)
    {
    this.vercode = vercode;
    }
    public String getVercode()
    {
    return this.vercode;
    } //tip属性的setter和getter方法
    public void setTip(String tip)
    {
    this.tip = tip;
    }
    public String getTip()
    {
    return this.tip;
    }
    //处理用户请求
    public String execute()
    throws Exception
    {
    //创建ActionContext实例
    ActionContext ctx = ActionContext.getContext();
    //获取HttpSession中的rand属性
    String ver2 = (String)ctx.getSession().get("rand");
    if (vercode.equalsIgnoreCase(ver2))
    {
    //调用业务逻辑方法来处理登录请求
    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);
    setTip("您已经成功登录系统");
    return MGR_RESULT;
    }
    //用户名和密码不匹配
    else
    {
    setTip("用户名/密码不匹配");
    return ERROR;
    }
    }
    //验证码不匹配
    else
    {
    setTip("验证码不匹配,请重新输入");
    return ERROR;
    }
    }
    }
    父类:EmpBaseAction
    package org.crazyit.hrsystem.action.base;import com.opensymphony.xwork2.ActionSupport;import org.crazyit.hrsystem.service.EmpManager;/**
     * Description:
     * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> 
     * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
     * <br/>This program is protected by copyright laws.
     * <br/>Program Name:
     * <br/>Date:
     * @author  Yeeku.H.Lee [email protected]
     * @version  1.0
     */
    public class EmpBaseAction
    extends ActionSupport
    {
    //依赖的业务逻辑组件
    protected EmpManager mgr;
    //依赖注入业务逻辑组件所必须的setter方法
    public void setEmpManager(EmpManager mgr)
    {
    this.mgr = mgr;
    }
    }
    LoginAction中用到的属性类:Managerpackage org.crazyit.hrsystem.domain;import java.io.Serializable;
    import java.util.*;/**
     * Description:
     * <br/>网站: <a href="http://www.crazyit.org">疯狂Java联盟</a> 
     * <br/>Copyright (C), 2001-2012, Yeeku.H.Lee
     * <br/>This program is protected by copyright laws.
     * <br/>Program Name:
     * <br/>Date:
     * @author  Yeeku.H.Lee [email protected]
     * @version  1.0
     */
    public class Manager
    extends Employee implements Serializable
    {
    private static final long serialVersionUID = 48L;
    //该经理管理的部门
    private String dept;
    //该经理对应的所有员工
    private Set<Employee> employees = new HashSet<Employee>();
    //该经理签署的所有批复
    private Set<CheckBack> checks = new HashSet<CheckBack>();
    //无参数的构造器
    public Manager()
    {
    }
    //初始化全部属性的构造器
    public Manager(String dept , Set<Employee> employees 
    , Set<CheckBack> checks)
    {
    this.dept = dept;
    this.employees = employees;
    this.checks = checks;
    } //dept属性的setter和getter方法
    public void setDept(String dept)
    {
    this.dept = dept;
    }
    public String getDept()
    {
    return this.dept;
    } //employees属性的setter和getter方法
    public void setEmployees(Set<Employee> employees)
    {
    this.employees = employees;
    }
    public Set<Employee> getEmployees()
    {
    return this.employees;
    } //checks属性的setter和getter方法
    public void setChecks(Set<CheckBack> checks)
    {
    this.checks = checks;
    }
    public Set<CheckBack> getChecks()
    {
    return this.checks;
    }
    }
      

  4.   

    还在阅读 疯狂Java 讲义,还买了疯狂 Ajax 还有此书,能发份此书代码给我吗? 我买了此书,却没有给我光盘,气死了
    我的Email:[email protected] 谢谢
      

  5.   

    哥们,代码压缩后还有300多M,留个qq发给你
      

  6.   

    我最近也在看这本书,内容很好,可惜光盘破裂了,哥们,能不能发一份光盘里面的东西给我,非常感谢!
    我的 e-mail:[email protected] QQ:904263803
      

  7.   

    楼主,求教育。    LoginAction有个继承来的属性:protected EmpManager mgr,和setter方法:public void setEmpManager(EmpManager mgr),这里的mgr也是自动装配注入进来的吗?这里自动装配好像不是根据名字mgr,而是根据类型EmpManager,我想请教一下,在哪里能找到根据类型进行自动装配的设置?如果不指定自动装配类型,spring是如何决定用name装配还是用type装配?