【转】<<Spring in Action>> 学习总结(2)(数据源配置)

61. 对于 JndiObjectFactoryBean 查找 jndi  资源未提及,如何设置 jndiEnvironment 属性,如果是在J2EE容器中运行,没什么问题,只是以单独应用程序运行就会错,如下在容器外运行需要加上 jndiEnvironment 配置,指定实现类,及URL等 

 <property name="jndiEnvironment">
      <props>
          <prop key="java.naming.factory.initial">
              org.apache.naming.java.javaURLContextFactory
          </prop>
          <prop key="java.naming.factory.url.pkgs">
              org.apache.naming
          </prop>
      </props>
  </property>



62.发送电子邮件配置 SimpleMailMessage 时也未说明,如果 SMTP 发送前需要验证该如何配置。需加上 mail.smtp.auth属性为 true,和验证时用户名和密码,Spring 验证时是通过 getTransport("smtp").connect(host,user,passwd) 来验证的。 
   

<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">true</prop>
            </props>
        </property>
        <property name="host">
            <value>mail.2911.net</value>
        </property>
        <property name="username">
            <value>unmi</value>
        </property>
        <property name="password">
            <value>unmi1234</value>
        </property>
    </bean>


这样取到mailSender后,就能调用它的send(SimpleMailMessage msg)发送邮件,自动进行密码验证。Spring也还是不够完美,可以配置 JavaMailSenderImpl 的 session 属性,但却无法应用上 session.getProperties() 中的许多项配置。Spring中能配置 SimpleMailMessage,然后再配合 Velocity 的邮件内容模板,确实很方便 


63. 搭配Spring的ScheduledTimerTask和jdk的TimerTask,再配置TimerFactoryBean就会自动启动定时器了,这种方式可配置的参数太少了,只能设置从现在开始隔多久(delay)以什么频度(period)执行某个任务 

64. 更高级的定时器用 Quartz 来调度,这个工具以前单独使用过,可像Unix的cron那般灵活配置。在MyEclipse中使用Quartz时需要引入 Spring 1.2 Misc Libraries 所包含的包(含quartz-1.5.2.jar) 

65. 94,96,97,104这几页中配置<value ref=""/>要写成<ref bean=""/>才对 

66. 从前往后的被包容关系是:JobClass->JobDetailBean->Trigger->TimerFactoryBean, 有两种Trigger,分别是 SimpleTriggerBean 和 CronTriggerBean。SimpleTriggerBeanScheduledTimerTask基本等价,Quartz的威力全部体现在 CronTriggerBean 上的,可灵活的配置它的cronExpression属性控制排程,最后需配置 SchedulerFactoryBean (它和TimerFactoryBean是基本等价) 来启动定时器 

67. MethodInvokingTimerTaskFactoryBean+ScheduledTimerTask+TimerFactoryBean 可定时调用某个类(或对象)的某个方法,这个类只需要是一个普通Java类,被调度的方法不能有参数 

68. MethodInvokingJobDetailFactoryBean+SimpleTriggerBean(或CronTriggerBean)+SchedulerFactoryBean 定时调用某个类(或对象)的某个方法,这个类只需要是一个普通Java类,被调度的方法不能有参数 

69. 书中并未描述 0/10 每10个单位触发执行的配置形式,需注意 */? 的使用,定义好 CronExpression 后需好好测试真正形为 

70. Spring 调用 JMS 发送消息的用法先搁一下,在SOA/MQ 的大环境下一定派得上用场的 

Spring mvc 

71. Spring 的 MVC 和 Struts 的 MVC 基本一致 
    Spring 的控制流程是:请求->DispatcherServlet->从 HandlerMapping 中查询到处理该请求的 Controller-> Controller 的 handleRequest 方法调用业务方法,最后返回 ModelAndView (ModelAndView告诉了 DispatcherServlet 转向到哪个视图) 
    Struts 的控制流程是:请求->ActionServlet->从 ActionMapping 中查询到处理该请求的 Controller (Action类)->Action 的execute 方法调用业务方法,最后返回 ActionForward (ActionForward告诉了 ActionServlet 该转向到哪个视图) 
72. Spring 的 DispatcherServlet 和 Struts 的 ActionServlet 的配置方式是一样的,都是作为一个自启动的 Servlet 配置到 web.xml 中。Spring 的 url-pattern 的配置惯例是 *.htm,而 Struts 通常是配置成 *.do 或 *.action,它暴露了 web 使用的技术。 


73. Spring 中配置了 
    

 <servlet-mapping>
        <servlet-name>unmi</servlet-name>
        <url-pattern>*.html</url-pattern>
    </servlet-mapping>


后,在初始化相应的 DispatcherServlet 时会自动加载 unmi-servlet.xml 文件,它是一个普通的 Spring Bean 配置文件,也是由 WebApplicationContext 加载。其他的 Bean 配置文件需要像通常的做法由 ContextLoaderListener 或 ContextLoaderServlet 来加载。 

73. Struts 1.2? 后开始可以在 struts-cnfig.xml 中给 Action 注入简单属性,而 Spring 配置 controll 时可以注入所有类型属性 

74. 在 unmi-servlet.xml 中配置的下面这段代码,Spring 将对请求 URL 是 "/home.html" 结尾的分派给 HomeController 处理,DispatcherServlet 使用的默认处理器映射是 BeanNameUrlHandlerMapping 

 <bean name="/home.html" class="com.unmi.HomeController">
    <property name="greeting"><value>Welcome to Spring Training</value></property>
</bean>



75. Spring 最简单的视图解析器是 InternalResourceViewResoler,如在 unmi-servlet.xml 有下配置 
 

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResoler">
   <property name="prefix"><value>/WEB-INF/jsp/</value></proeprty>
   <property name="surfix"><value>.jsp/</value></proeprty>
</bean>


那么,当 HomeController 中 返回 return new ModelAndView("home"); 时将会解析成由视图 /WEB-INF/jsp/home.jsp 来展示 

76. 有三种类型的请求映射控制器,实现的是 HandlerMapping 接口 
    BeanNameUrlHandlerMapping -- 根据控制器的名字将控制器映射到 URL 
    SimpleUrlHandlerMapping -- 用上下文配置文件中定义的属性集合将控制器映射到 URL 
    CommonsPathMapHandlerMapping -- 使用控制器代码中的元数据将控制器映射到 URL 
    DispatcherServlet 缺省映射处理器是 BeanNameUrlHandlerMapping,它将表现层 URL 和控制器名字绑定起来了, Spring 不建议使用这个映射处理器,建议用 SimpleUrlHandlerMapping。可是我觉得用 BeanNameUrlHandlerMapping 挺方便的啊 

77. 使用 SimpleUrlHandlerMapping 的配置,需要将系统中用到的 URL 一一逻列出来 
 

<bean id="simpleUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/listCourse.html">listCoursesController</prop>
            <prop key="/register.htm">registerStudentController</prop>
        </props>
    </peroperty>
</bean>



78. 使用 CommonsPathMapHandlerMapping 需要为 Controller 类注解上 PathMap 属性为一个 URL 

79. 可用同时配置多映射处理器,通过配置它们实现的 Ordered 接口的 order 属性,DispatcherServlet 按顺序采用哪个映射处理器(责任链模式) 

80. Spring 提供了丰富的控制器层次,方便根据实际需求选择实现或继承那一种控制器 

81. 继承 AbstractController 要覆盖的方法是 handleRequestInternal(request,response); 
new ModelAndView("counrseList","courses",courses) 第一个参数是 view 的逻辑名,第二第三个参数是传递给 view 的名称/数值对 

82. 当控制器需要根据参数执行工作时,应该继承 AbstractCommandController,你的 Controller 中需要覆盖 handle 方法,并且需要在构造函数中指定命令类,如 
   

public MyController(){
        setCommandClass(MyCommand.class);
    }


在使用 Command 对象与 Struts 中是一样的,在 handle 方法中用 MyCommand myCommand = (MyCommand)command,不同的就是 Struts 的 FormBean 是作为 execute 方法存在,而 Spring 的 command 是作为成员存在。 
命令对象只是一个 POJO,功能相当于 Struts 的 Action,能匹配接受请求中的参数,它不需要在 Spring 的配置文件中配置。留下一个疑问:要是 AbstractCommandController 能在 Spring 的配置文件中注入可能要好些,相当于 Struts 的 Action 的 FormBean 也是在 struts-config.xml 配置给 Action 的 
自己试了一下,可以通过配置给 commandClass 一个全限类名字符串注册 class 属性,Spring 提供了相应的属性编辑器 
       

<property name="commandClass">
            <value>com.unmi.MyCommand</value>
        </property>



83. AbstractFormController 有一个子类 SimpleFormController,它声明了两个属性 formView 和 successView,分别对应了在处理请求出现异常和正常时对应的 View 的逻辑名,这两个属性需要在配置文件中给配上,在你的 SimpleFormController 类中覆盖 void doSubmitAction(Object command) throws Exception 将会使用到它们,注意这个方法没有返回值的。你也可以覆盖 ModelAndView onSubmit(Ojbect command),向 View 中传递数据,return new ModelAndView(getSuccessView(),"student",student); 像 AbstractCommandController 一样,需要在构造函数中指定 Command 类,可是看那两个submit 方法,command 再一次通过参数传入到方法,真的有些多此一举 

84. 验证表单输入, 你的验证类必须实现 org.springframework.validation.Validator 接口,supports()方法帮助判断验证器是否适用于指定类,在 validate(Object command, Errors errors) 用 Errors 驳回任何非法数据,如 
   

ValidationUtils.rejectIfEmpty(errors, "login", "required.login" "Login is required");
    if(!new Perl5util().match(PHONE_REGEXP,phone){
        errors.reject("invalide.phone","Phone number is invalid");
    }


最后,你需要把验证类注入给你的 CommandController 的 validator 属性 
 

  <property name="validator">
        <bean class="com.unmi.MyValidator"/>
    </property>



validate 方法会在 AbstractCommandController.handleRequestInternal(request,response)调用,SimpleFormController.onSubmit() 会在调用 doSubmitAction() 之后,把 errors 传递给 View。以后要搞清楚错误信息要如何显示出来 

85. Spring 提供了 AbstractWizardFormController 来简化跨越多个页面处理表单的工作 (向导式页面表单),这是 Struts 所没有的功能。您只需要覆盖 processFinish(request,response,command,errors)方法,在最后一个页面提交后将会被调用处理收集的数据,向导中的页面流程配置到 AbstractWizardFormController 的 pages 属性,如下 

扫描二维码关注公众号,回复: 558918 查看本文章
<bean id="feedbackController" class="com.unmi.FeedbackWizardController">
    <property name="pages">
        <list>
            <value>general</value> <!-- 填写一般性问题 -->
            <value>instructor</value>  <!-- 填写导师绩效的问题 -->
            <value>course</value>  <!-- 填写课程内容和教材问题 -->
            <value>facilities</value>  <!-- 填写质量问题 -->
        </list>
    </property>
</bean>



怎么分布显示向导每一步的页,以及 Controller 中如何处理,待续... 


转自:http://cache.baiducontent.com/c?m=9d78d513d99b1df903bac8690c66933d5909dc3c6b8b96013894cd47c9221d03506790a63a694358869b2b3c03ad434bea876d34604877a09bbfd91782a6c27672dd3a34731d804511&p=8f71cd15d9c241ec0be296391708&newp=8b2a9715d9c241f734adcd121b5992695803ed603bd3d2&user=baidu&fm=sc&query=jndienvironment&qid=&p1=1

猜你喜欢

转载自mib168.iteye.com/blog/2009668
今日推荐