`
yanglei008
  • 浏览: 84879 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

<<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 属性,如下
<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 中如何处理,待续...

分享到:
评论

相关推荐

    Spring in action学习笔记

    &lt;bean id="greetingService" class="com.springinaction.chapter01.hello.GreetingServiceImpl"&gt; &lt;property name="greeting"&gt; &lt;value&gt;BuenosDias!&lt;/value&gt; &lt;/property&gt; &lt;/bean&gt; &lt;/beans&gt; ``` 通过以上示例,...

    《spring in action》中文第三版

    根据提供的信息,《Spring in Action》中文第三版的内容主要聚焦于Spring框架的应用与实践。Spring框架是Java平台上最受欢迎的企业级应用开发框架之一,它提供了一种简单的方式来管理对象及其依赖关系,简化了应用...

    spring in action 英文原版

    通过上述知识点的总结,我们可以看到《Spring in Action》这本书涵盖了Spring框架的核心概念、主要模块以及如何在实际项目中运用Spring来解决具体问题。对于希望深入学习Spring框架的开发者来说,这是一本不可或缺的...

    关于Spring学习总结

    为了深入学习Spring,你可以参考官方文档、在线教程、书籍,如《Spring in Action》等,以及参与开源社区,如Stack Overflow、GitHub等,积累实战经验。 总的来说,Spring框架是Java开发的强大工具,理解和掌握其...

    jsp大学教程代码

    &lt;load-on-startup&gt;2&lt;/load-on-startup&gt; &lt;/servlet&gt; &lt;!-- Standard ActionServlet Mapping --&gt; &lt;servlet-mapping&gt; &lt;servlet-name&gt;action&lt;/servlet-name&gt; &lt;url-pattern&gt;*.do&lt;/url-pattern&gt; &lt;/servlet-mapping...

    Spring In Action(Third Edition)

    ### Spring In Action(Third Edition) 关键知识点解析 #### 一、Spring框架核心模块与功能 **Spring In Action(Third Edition)** 这本书主要介绍了 **Spring 3.0** 的新特性和用法,同时也涵盖了 **Spring ...

    Manning Spring in Action 2nd Edition Aug.2007

    - **教程性质**:《Spring in Action 第二版》是一本优秀的教材,不仅详细介绍了Spring框架的使用方法,还融入了大量的软件设计思想和设计模式,让读者在学习技术的同时,也能提升自己的设计能力。 - **组织结构清晰...

    spring in action 第三版(英文)

    ### Spring in Action 第三版(实战)核心知识点解析 #### 一、书籍概述与评价 《Spring in Action》第三版是一本深入浅出地介绍Spring框架的书籍,由Craig Walls编写,Manning出版社出版。该书针对的是Spring 3.0...

    Spring in Action 3rd(2011).pdf

    标题《Spring in Action 3rd (2011)》所蕴含的知识点主要围绕着Spring框架的学习和使用,旨在教授开发者如何利用Spring框架来简化Java EE应用的开发。Spring框架的创建目的正是为了使得开发过程更加便捷高效,本书的...

    spring in action 中文版带书签第二部分

    根据提供的文件信息,“Spring in Action”中文版带书签第二部分,我们可以推断出这份资料主要涉及Spring框架的相关知识,并且是整个书籍的第二部分。接下来,我们将从以下几个方面进行详细的知识点归纳与阐述: ##...

    spring in action

    《Spring in Action》作为Spring框架的经典之作,被广泛誉为学习Spring的最佳资源之一。本书由Craig Walls编写,并得到了Ryan Breidenbach的支持,由Manning出版社出版。本书旨在帮助读者深入理解Spring框架的核心...

    spring in action 中文版带书签第三部分

    根据提供的文件信息,“Spring in Action”中文版带书签第三部分,可以推断出该部分内容主要涉及Spring框架的高级主题和技术细节。以下是基于标题、描述、标签以及部分内容中可能涵盖的关键知识点进行的详细阐述。 ...

    Spring in Action

    ### Spring in Action 知识点解析 ...总结而言,《Spring in Action》这本书不仅深入浅出地介绍了Spring框架的基本概念和原理,还提供了大量的实践案例,对于希望深入学习Spring框架的开发者来说是一本不可多得的好书。

Global site tag (gtag.js) - Google Analytics