Chinaunix首页 | 论坛 | 博客
  • 博客访问: 330737
  • 博文数量: 76
  • 博客积分: 8291
  • 博客等级: 中将
  • 技术积分: 1540
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-22 10:13
文章分类

全部博文(76)

文章存档

2009年(1)

2008年(75)

我的朋友

分类: Java

2008-03-17 10:17:45

facade模式:就是中关村攒机者的角色,他负责与多个零件供销商交互并将这些零件组装起来交给最终客户。
struts与spring集成的两种方式:
第 一种是在struts的Action的execute方法中调用spring的applicationContext去获得Manager对象,这里的 Action自身没有用到spring的思想,Action无法作为Spring中的JavaBean进行配置,相应代码如下:
      ServletContext application = this.getServlet().getServletContext();
      WebApplicationContext wapp = (WebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(application);
     //WebApplicationContext wapp = (WebApplicationContext)application.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
     StudentManager studentManager = (StudentManager)wapp.getBean("studentManager");
  另外,spring为集成struts而提供了一个ContextLoaderPlugIn插件,其作用在于:创建一个 ApplicationContext对象,并将这个对象存储在ServletContext中,以后在ActionSupport中就可以调用 getWebApplicationContext来获得这个ApplicationContext对象了,这并没有让我感觉有多大的好处,示例代码如 下:
    Enumeration e = application.getAttributeNames();
    while(e.hasMoreElements())
    {
        String attributeName = (String)e.nextElement();
        String objClassName = application.getAttribute(attributeName).getClass().getName();
        try
        {
           response.getWriter().println(attributeName + ":" + objClassName + "
");
        }catch(Exception ex){}
    }
    StudentManager studentManager = this.getWebApplicationContext().getBean("studentManager"));

第 二种是将struts的Action作为spring的一个JavaBean进行配置,在Action里面只需要定义一个Manager变量和相应的 setter/getter方法,就可以通过spring为其注入一个Manager对象。这种方式太复杂,很牵强,个人觉得没有什么实际意义,建议大家 不必花费时间去学习。

spring与hibernate整合的原理:
class MyController extend simpleformcontroller
{
 public MyController()
 {
  setCommandClass(Studnet.class);
 }
}
首先回忆使用hibernate的步骤:
1.创建和配置Configuration对象,配置Congiuration对象可以通过hibernate.properties或hiberate.cfg.xml文件,也可以完全采用如下的编程方式:
      configuration = new Configuration()
      configuration.addClass(Student.class)
             //.addFile("Student.hbm.xml")
             //.addResource("/Student.hbm.xml")
             .setProperty("show_sql","true");
2.由configuration创建出SessionFactory对象:            
    SessionFactory sf = configuration.buildSessionFactory();
3.通过SessionFactory获得session对象,然后进行CRUD操作:
    Session session = sf.openSession();
    session.save()\delete\update\load\
    session.close();
使用spring集成hibernate的第一步就是借助spring的配置创建出SessionFactory对象

 
  
   true
  
 

 

在LocalSessionFactoryBean 内部完全采用编程方式来配置configuration对象,而不再通过hibernate.properties或hiberate.cfg.xml配 置文件,带着大家查看了LocalSessionFactoryBean的源代码。
有了SessionFactory,我们接着就可以通过spring将这个SessionFactory注入到DAO类中,配置如下:

 
  
 


相应的调用程序代码示意如下:
class StudentDAO
{
 sessionFactroy;
 void setSessionFactory(sessionFactory)
 {
  this.sessionFactory = sessionFactory;
 }
 insert(User user)
 {
  sessionFactory.openSession();//累
  session.save(user);
  session.close();//累
 }
}
我 们还有自己openSession和getSession,这是不是很累呢?为此,spring又提供了一个配置类hibernateTemplate, 它可以帮助我们去openSession和closeSession,这个配置类能够openSession,显然它一定要有 SessionFactory的引用。

 
  
 


遵循spring的IOC思想,我们接着还要将HibernateTemplate注入到DAO类中,配置如下:

 
  
 

class StudentDAO
{
 hibernateTemplate;
 void sethibernateTemplate(hibernateTemplate)
 {
  this.hibernateTemplate = hibernateTemplate;
 }
 insert(User user)
 {
  hibernateTemplate.save(user);//我们不再openSession和closeSession,不是很爽吗?
 }
}

另 外,spring还提供了一个HibernateSuport类,它可以通过注入的SessionFactory返回一个 HibernateTemplate,我们的DAO类继承这个HibernateSupport,也可以获得HibernateTemplate对象进行 CRUD操作,配置及示意代码如下:

 
  
 


class StudentDAO extends HibernateSuport
{
 /*hibernateTemplate;
 void gethibernateTemplate()
 {
  return hibernateTemplate;
 }
 sessionFactroy;
 void setSessionFactory(sessionFactory)
 {
  this.sessionFactory = sessionFactory;
  hibernateTemplate = new HibernateTemplate(sessionFactory);
 }*/
 
 
 insert(User user)
 {

  getHibernateTemplate().save(user);
 }
}

 

最后由王泽佑提问引出spring mvc的注册绑定的详细讲解:
在spring帮助文档中搜索editor,可以看到有关注册绑定的信息,CustomDateEditor是没有被自动注册的,需要用户在initBinder方法内部调用,示例代码如下:
protected void initBinder(
        HttpServletRequest request,
        ServletRequestDataBinder binder)
        throws ServletException {
        binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy/MM/dd"),true));
    }
一种替换的方式及registerCustomEditor底层的实现内幕:
调用BaseCommandController.setPropertyEditorRegistrars()方法,显然这可以作为controller的属性进行配置。
class MyPropertyEditorRegistrar
{
 void registerCustomEditors(PropertyEditorRegistry registry)
 {
  reguistry.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());
 }
}

关于Date数据校验的问题:通过在struts帮助文挡的Validator帮助页面中搜索validate,是可以搜索到DateValidator的配置帮助的。

如 果注册了DateEditor,数据成功转换成Date类型的字段,那么随后的的Validator框架就没必要对这个Date字段进行校验了,因为 Validator是对已装配到Bean中的字符串类型的字段进行校验,而数据都已经成功装配进了Date字段中,哪还有校验的必要。框架把数据装配到 formbean里面,Validator从Formbean里面拿数据进行校验。



 
  cn.itcast.Student
 

上面的配置信息相当于下面的一段代码,这其中就涉及到了属性绑定的问题,要把字符串"cn.itcast.Student"转换成Class对象。
Class clazz = Class.forName("cn.itcast.Student");
setCommandClass(clazz);

小记:通过spring配置文件中的元素的resource属性可以导入更多的配置文件,实现信息分散配置的目的。

阅读(538) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~