Java蜘蛛人 欢迎大家

欢迎大家 来到我的blog , 如果我身边的朋友 有什么不懂可以直接来问我 我会细心的帮助你的. 如果网络上的朋友有什么不懂的 可以加我Java蜘蛛人 QQ48187537
posts - 54, comments - 192, trackbacks - 0, articles - 1

     摘要: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  <head>  <html&g...  阅读全文

posted @ 2008-03-13 19:54 Java蜘蛛人 --郑成桥 阅读(950) | 评论 (1)编辑 收藏

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns
="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">



<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="messages"></property>

 
</bean>

</beans>
import java.util.Date;
import java.util.Locale;

import org.springframework.context.ApplicationContext;
import org.springframework.context.MessageSource;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestBean {
    
    
public static void main(String[] args) {
        
        ApplicationContext context
=null;
        
        context
=new ClassPathXmlApplicationContext("guojihua.xml");
        Object[] a
=new Object[]{"郑成桥",new Date()};
    System.out.println(context.getMessage(
"user", a,Locale.SIMPLIFIED_CHINESE));
        
    }

}


上面Object[] 里面的user 是国际化里的配置的
user=\u6B22\u8FCE{0},\u7684\u5230\u6765\u73B0\u5728\u662F{1}

如果看不懂 ,  就直接加我的 QQ 问吧...

posted @ 2008-03-05 18:09 Java蜘蛛人 --郑成桥 阅读(1333) | 评论 (1)编辑 收藏

Demo1.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ page import="java.awt.*" %>
<%@ page import="java.awt.image.*" %>
<%@ page import="javax.imageio.*" %>
<%!
    Color getRanColor(
int fc,int bc)
    {
        Random random
=new Random();
        
if(fc>255) fc=255;
        
if(bc>255) bc=255;
        
int r=fc+random.nextInt(bc-fc);
        
int g=fc+random.nextInt(bc-fc);
        
int b=fc+random.nextInt(bc-fc);
        
return new Color(r,g,b);
    }

%>
<%
  response
.setHeader("Pragma","No-cache");
  response
.setHeader("Cache-Control","no-che");
  response
.setDateHeader("Expires",0);
  
int width=60;
  
int height=20;
  BufferedImage image
=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
  Graphics g 
=image.getGraphics();
  Random  random
=new Random();
  g
.setColor(getRanColor(200,250));
  g
.fillRect(0,0,width,height);
  g
.setFont(new Font("Times New Roman",Font.PLAIN,18));
  g
.setColor(getRanColor(160,200));
 
      
for(int i=0;i<155;i++)
      {
          
int x=random.nextInt(width);
          
int y=random.nextInt(height);
          
int xl=random.nextInt(12);
          
int yl=random.nextInt(12);
          g
.drawLine(x,y,x+xl,y+yl);
      }
      String 
sRand="";
      
for(int i=0;i<4;i++)
      {
          String 
rand=String.valueOf(random.nextInt(10));
          
sRand+=rand;
          g
.setColor(new Color(20+random.nextInt(110),40+random.nextInt(110),60+random.nextInt(110)));
          g
.drawString(rand,13*i+6,16);
      }
   session
.setAttribute("rand",sRand);
   g
.dispose();
   ImageIO
.write(image,"JPEG",response.getOutputStream()); 
%>





Demo.jsp

<%@ page language="java" pageEncoding="gbk"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html:html lang="true">
  
<head>
    
<html:base />
    
    
<title>Demo.jsp</title>

    
<meta http-equiv="pragma" content="no-cache">
    
<meta http-equiv="cache-control" content="no-cache">
    
<meta http-equiv="expires" content="0">    
    
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    
<meta http-equiv="description" content="This is my page">
    
<!--
    
<link rel="stylesheet" type="text/css" href="styles.css">
    
-->

  
</head>
  
  
<body>&nbsp; 
  
<form action="Demo2.jsp">
   
<input type="text" name="asd" >     <img  border="0" src="Demo1.jsp" >
   
<br>
   
<input  type="submit" name="b" value="点击" >
   
</form>
  
</body>
</html:html>


Demo2.jsp

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  
<head>
    
    
<title>My JSP 'Demo2.jsp' starting page</title>
    
 

  
</head>
  
  
<body>
   
<%
  String input
= request.getParameter("asd");
  String 
rand=(String)request.getSession().getAttribute("rand");
  
if(input.equals(rand))
  {
    
  }
  
else
  {
   
%>
   
<jsp:forward page="Demo.jsp" ></jsp:forward>
   
<%
  }
  
%>
    
    
    asdasd
  
</body>
</html>

posted @ 2008-02-24 12:59 Java蜘蛛人 --郑成桥 阅读(656) | 评论 (0)编辑 收藏

  <%
 
  SmartUpload su=new SmartUpload();  //JspSmart 下载上传
  su.initialize(pageContext);   //下载初始化
  su.setContentDisposition(null); //禁止浏览器自动打开
  su.downloadFile("F:\\work\\HibernateDemo25\\a\\1.JPG"); //下载的文件
   %>

posted @ 2008-02-24 08:26 Java蜘蛛人 --郑成桥 阅读(175) | 评论 (0)编辑 收藏

失误
悲观锁.
Acc acc=(Acc)session.get(Acc.class,new Long(1),LockMode.UPGRADE);   假如这个事物开始了 其他的失误不能访问的, 知道这个事物提交之后 然后再解锁
乐观锁
在建表时候 增加一个 version interger
然后再Acc.hbm.xml里
id  后面 添加
<version  name="version" column="VERSION"  />

注意 例子中 捕获StaleObjectStateException  这个异常
例子 

package com.zcq.dao2;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StaleObjectStateException;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;

 

public class Test extends Thread {
    public Test()
    {
        
    }
    
    private String tran;
    
    Configuration config
=new Configuration().configure();
    SessionFactory factory
=config.buildSessionFactory();
    Session     session
=factory.openSession();
   
    
    public Test(String tran)
    {
        this
.tran=tran;
    }
    
    
    
@Override
    public void run() {
        try {
             
if(tran.equals("tran"))
                 show();
             
else
                 show1();
            
        } catch (Exception e) {
            e
.printStackTrace();
            
// TODO: handle exception
        }
    
    }
    public void show()throws Exception
    { 
        Transaction tx
=null;
        try {
        
    
            tx
= session.beginTransaction();
            Thread
.sleep(500);
            
            Accounts accounts
=(Accounts)session.get(Accounts.class,new Long(1));
            Thread
.sleep(500);
            
            accounts
.setBalance(accounts.getBalance()+100);
            tx
.commit();
            Thread
.sleep(500);
                
        } catch (StaleObjectStateException e) {
            
if(tx!=null)
            {
              tx
.rollback();
            }
            e
.printStackTrace();
            
System.out.println("帐户被其他的事物修改.本事务撤销. 稍后在试..!");
        }
    }
    
    public void show1()throws Exception
    {
        Transaction tran
=null;
         try {
             tran
= session.beginTransaction();
             Thread
.sleep(500);
             Accounts accounts
=(Accounts)session.get(Accounts.class,new Long(1));
             
             Thread
.sleep(500);
             accounts
.setBalance(accounts.getBalance()-100);
             tran
.commit();
             Thread
.sleep(500);
        } catch (StaleObjectStateException e) {
            
if(tran!=null)
            {
                tran
.rollback();
            }
            e
.printStackTrace();
            
System.out.println("帐户被其他的事物修改.本事务撤销. 稍后在试..! show1");
            
// TODO: handle exception
        }
        
        
        
    }
    public void asd()
    {
        session
.beginTransaction();
        Accounts accounts
=new Accounts();
        accounts
.setName("zcq");
        accounts
.setBalance(1000.00);
        session
.save(accounts);
        
        session
.beginTransaction().commit();
    }
    
    public void closeSession()
    
    {
        
if(session!=null)
        {
            session
.close();
            session
=null;
        }
    }
    
    
    public static void main(String[] args) {
        
        Test aa
=new Test();
         
        
        Thread show
=new Test("tran");
        Thread show1
=new Test("tran2");
        
        show
.start();
        
        show1
.start();
        
        
       aa
.closeSession();
        
    }
}

posted @ 2008-02-06 04:07 Java蜘蛛人 --郑成桥 阅读(1159) | 评论 (3)编辑 收藏

public class Test extends Thread {
 
 private String tran;
 
 
 public Test(String tran)
 {
  this.tran=tran;
 }
 
 
 @Override
 public void run() {
  try {
    if(tran.equals("tran"))
     show();
    else
     show1();
   
  } catch (Exception e) {
   e.printStackTrace();
   // TODO: handle exception
  }
 
 }
 public void show()throws Exception
 {
  
  for(int i=100;i>0;i--)
  {
  System.out.println("show        "+i);
   if(i==50)
    Thread.sleep(200);
   
  }
 }
 
 public void show1()throws Exception
 {
  for(int i=100;i>0;i--)
  {
  System.out.println("show1       "+i);
   if(i==50)
    Thread.sleep(200);
  }
 }
 
 public static void main(String[] args) {
  
  Thread show=new Test("tran");
  Thread show1=new Test("tran2");
  
  show.start();
  
  show1.start();
  
 }
}

posted @ 2008-02-06 02:11 Java蜘蛛人 --郑成桥 阅读(269) | 评论 (0)编辑 收藏

dynamic-insert="true" 如果插入的值不为空 他才会把他列入插入语句中  (作用:节约资源)


<hibernate-mapping package="mypack"> <class>元素中定义的类来自mypack包

 

<property name="sex" access="field"/> 不会直接调用age的set,get方法. 避免get,set方法里的逻辑值.

 


<class name="xxx.xxx" table="xxxx" select-before-update=true> 如果设置成true  如果不经常修改java 对象的属性 就设为true   当对象没有被修改的时候 他不会执行update 语句  select-before-update=true 可以避免update 盲目的触发一个触发器

 

saveOrUpdate 如果是临时对象就用save  如果是游离对象才建议用saveOrUpdate 如果传递进来的是持久化状态  就直接返回
他会自动判断是游离状态还是临时状态  如果oid=null version=null等.那就是临时状态.

 

hibernate与触发器 协同工作 ..  假如save 一个数据 会触发一个触发器 那就会导致 session缓存的内容和数据库的内容不协调(不一样)
 解决方法 : 在save后 调用flush()清除缓存 然后调用refresh() 重新到数据库当中加载刚才被保存的xxxx对象
select-before-update=true 可以避免update 盲目的触发一个触发器

<set batch-size="3">  批量查询  3句查询语句 一起初始化..

映射 一对多的关联

需要在 xxx.hbm.xml里添加

<many-to-one
name="customer"  //用户表的实例
columb="CUSTOMER_ID"
class="mypack.Customer"
cascade="save-update"  保存或者更新customer的临时对象
not-null="true"
/>

  //建立用户表和订单表外键的映射

//例子在HibernateDemo16:

映射一对多双向自身关系

  //创建食物类.对象
  Categories foodCategory=new Categories(null,"food",new HashSet());
  //创建水果类.对象
  Categories fruitCategory=new Categories(null,"fruit",new HashSet());
  //创建蔬菜类 对象
  Categories vegetableCategory=new Categories(null,"vegetable",new HashSet());
  //创建苹果 对象
  Categories appleCategory=new Categories(null,"apple",new HashSet());
  //创建橘子对象
  Categories orangeCategory=new Categories(null,"Orange",new HashSet());
  //创建西红柿 对象
  Categories tomatoCategory=new Categories(null,"tomato",new HashSet());
  
  
  //建立食物类.和水果类的关系
     foodCategory.getCategorieses().add(fruitCategory);
     fruitCategory.setCategories(foodCategory);
    
     //建立食物跟蔬菜关系
     foodCategory.getCategorieses().add(vegetableCategory);
     vegetableCategory.setCategories(foodCategory);
    
     //建立水果和苹果的关系
     fruitCategory.getCategorieses().add(appleCategory);
     appleCategory.setCategories(fruitCategory);
    
     //建立水果和橘子的关系
     fruitCategory.getCategorieses().add(orangeCategory);
     orangeCategory.setCategories(fruitCategory);
    
     //建立西红柿跟水果的关系
     fruitCategory.getCategorieses().add(tomatoCategory);
     tomatoCategory.setCategories(fruitCategory);
    
    //建立蔬菜和西红柿的关系
     tomatoCategory.setCategories(vegetableCategory);
     vegetableCategory.getCategorieses().add(tomatoCategory);
    
     fruitCategory.getCategorieses().remove(tomatoCategory);
    
       Session session=HBF.getSession();
       session.save(foodCategory);
       session.beginTransaction().commit();
       session.close();

 

 

 


//例子在HibernateDemo14:

  //双向修改
  Pp pp1=new Pp();
  pp1.setPname("aaaaaa");
  pp1.setCid(new Long(27));
  Catelog cla=new Catelog();
  cla.setCname("bbbbb");
  cla.setId(new Long(16));
     pp1.setCatelog(cla);

 


  
//单项修改
//  Catelog cla=new Catelog();
//  cla.setCname("1111111111");
//  cla.setId(new Long(16));
//   dao.session.saveOrUpdate(cla);
  
     CPDAO dao=new CPDAO();
      dao.session.update(pp1);
     dao.session.beginTransaction().commit();
     dao.closeSession();

 

 

//例子在HibernateDemo14:
查询:
  String sql="from Catelog c where c.id=2";
     Query q=dao.session.createQuery(sql);
    
     Catelog cla=  (Catelog)q.uniqueResult();
    
      Set<Pp> set= cla.getPps();
     
     Iterator<Pp> it = set.iterator();
     while(it.hasNext())
     {
      Pp p=it.next();
      System.out.println(p.getPname()+"   "+p.getCid());
     }

 

     
//例子在HibernateDemo14:

 //从表查询
     String sql="from Pp p where p.catelog.id=16";
     Query q=dao.session.createQuery(sql);
    
     List<Pp> list = q.list();
    
    for(Iterator<Pp> it = list.iterator();it.hasNext();)
    {
     Pp p=it.next();
     System.out.println(p.getCatelog().getCname()+"     "+p.getPname());
    }
    
     dao.session.close();
 }

 


HQL 查询

 public List QueryName(String name)
 {
  return session.createQuery("from Ord as c where Ord_number=:sname")
 .setString("sname",name).list(); 
 }

  然后  List  list=dao.QueryName("b");


QBC 查询
 //创建一个Criteria 对象  然后把Ord 加载进去
    Criteria criteria=dao.session.createCriteria(Ord.class);
    Criterion criterion1=Expression.like("ord_number","T%");
   
   
    criteria.add(criterion1);
   
    List result=criteria.list();
      

QBE  查询

 

      Ord entity=new Ord();
      entity.setOrdNumber("Linda_Ord001");
    Criteria criteria=dao.session.createCriteria(Ord.class);
   
    Criterion criterion=Example.create(entity);
   
    criteria.add(criterion);
   
    List result=criteria.list();

 

HQL 排序
 Query q=dao.session.createQuery("from Ord as o order by ord_number");

posted @ 2008-01-27 02:46 Java蜘蛛人 --郑成桥 阅读(336) | 评论 (0)编辑 收藏

 刚做出来的 struts 入门视频 非常适合新人

struts 视频

有什么问题尽管加我的QQ48187537 
 最近 会更具大家要求录制更多的视频

posted @ 2008-01-19 17:39 Java蜘蛛人 --郑成桥 阅读(568) | 评论 (5)编辑 收藏

     摘要: 面试必备基础题目(虽然不一定常用, 仅用于面试, 面试就是把人搞的都不会然后砍价, 当然您可以讲我可以查资料完成, 但是面试的时候就是没道理的, 起码我是经常看到这些题). 如何把一段逗号分割的字符串转换成一个数组? request.getAttribute() 和 request.getParameter() 有何区别? response.sendRedirect() 和 forward(...  阅读全文

posted @ 2008-01-13 02:52 Java蜘蛛人 --郑成桥 阅读(1999) | 评论 (0)编辑 收藏

我目前的项目前端使用的是jsf+seam的架构,目前项目已经进入尾声,我想把一些心得体会给大家说说,以便大家在使用jsf的时候,少走弯路。

1.异常处理问题:请为jsf加入seam框架,看看Seam - 无缝集成JSF,共三部分,里面告诉了你怎么在servlet容器下配合spring使用seam,seam不是一定要在ejb3和jboss下才可以使用。因为单独使用jsf的话她的异常处理功能很简陋,跟踪不到你想看的地方,对于开发很不方便,你只有打开日志才能看到问题所在,而seam在加入phase-listener以后,对jsf不同的生命周期都进行了功能增强,即使不使用seam任何的功能,她也能毫无保留的输出所有的异常栈。

2.css问题:如果你想在你的项目中使用jsf,css太重要了,很多刚开始使用jsf的人都不是很习惯jsf基于块结构开发页面,因为jsf让你注意的是展现的内容,而不是展现的样式,这是完全符合w3开发html的初衷,大家使用<table><tr><td>来做页面展现布局,其实是错误已久的方法,如果在jsf中能了解如何使用css进行布局,jsf不适合复杂页面设计这句话就不攻自破了。

3.细心的使用dataTable组件,数据列表是最常用的页面组件,但是我毫不留情的说jsf的dataTable组件的实现简直太滥了,它就是jsf开发一大祸根。没有很方便的解决特定行样式显示的问题,没有解决回退按钮风险问题,没有dataScroll和dataTable组件进行数据库分页的优雅办法,数据提交的幻影问题,我的开发很多时间用在了dataTable的和其他组件块融合上面。不过jsf1.2通过统一el,加入了对jstl的foreach标记的支持,我虽然还没有使用,但是我认为这有可能成为数据列表开发的一个有力补充。

4.建议把jsf的模型bean和后台的业务bean合二为一,这样可以在前端提交页面与模型绑定的同时,完成业务bean的数据封装,并且交由服务层处理一气呵成。这样做有个好处,就是我们会想方设法通过各种手段在第一时间就完成模型bean对业务bean的封装,消除服务层对dto的依赖。这样是可行的,因为jsf的页面绑定机制提供了很好的帮助。

5.请考虑多的使用convert组件,比如列表页面有个radio块,提交radio值就是一个int数值,然后在展现逻辑去恢复这个radio值对应的业务模型,这样增加了展现逻辑处理页面数据的负担,而且不好管理,如果把这个工作放在自定义的convert中,让convert在页面上显示int数值,在提交上寻找对象,那么页面和服务层就屏蔽了这样的工作,看到的都是对象的进出。

6.我使用了myfaces一个自己的组件<t:updateListener>,就是跨页面专递参数,非常好用,刚使用jsf的朋友,可以看到跳转的下一个页面用它怎么做,但是建议传递模型对象,不要传递数值,你使用jsf就是因为她是基于对象考虑页面设计的。

7.小心使用session来处理jsf,jsf过多的使用了session,但是我可以肯定一点,展现层一定是需要基于状态的方式来做的,这样可以简化开发,无状态的方式会带来更多的无序代码。不是每个人都是高手。可以考虑使用seam的conversation来处理,她的长会话特别适合业务编辑,默认的短会话会填补jsf有时容易丢失的短期数据。

8.调试jsf的问题:有时你使用jsf想知道你的数据在哪个阶段变化了,你不会把jsf代码加入到自己的工程中来调试把,请加入自定义的phaseListener,继承phaseListener这个接口,你可以在把你的程序设置在任何阶段跳出来进行调试。

9.分页的问题:在google搜一下,有个http://www.blogjava.net/steady/archive/2005/12/30/26013.aspx提供了分页的方式,我就在使用,这是目前最可能的方式了把,呵呵,不过要注意她使dataTable的values直接使用了dataModel,她与seam的@dataModel是不兼容的,所以不能使用seam的@dataModel功能,需要使用get方式了。

10.如果想使用ajax4jsf等ajax框架,你需要使用facelet,让页面成为标准的xhtml,记好了,不要写了一大堆才发现这个问题。

11.如果你在dataTable列表页面使用了radio的话,你还想在列表上做一些link操作,一定要在操作上加入immediate=true,否则在没有选择radio的情况下她是不会让你过去的。并且列表中要使用selectOneRadio,如果使用checkbox就要使用selectBooleanCheckbox.组件。

12.对于doGet的方式请使用seam的<s:link>组件,<%=request.getContextPath() %>问题,提交引起的书签问题都迎刃而解。

13.如果你导入了其他页面,而没有使用facelet的话,那么导入的那个页面就要完全符合jsf组件的渲染方式,混合html会解析不出来。反过来在主页面应该尽量多使用jsf标记与html混合的方式,这样可以使开发变得简单,尽管有时候jsf会很丢丑,你试试每个html组件都有个render属性就知道了。jsf1.2已经把混合的html作为一个output组件来输出,可以和jsf组件兼容,是件好事。对于混合html这种方式,我想说你关注的是jsf组件和模型的关系,而不一定页面都得是jsf组件标记。

14.不要相信jsf运行的速度慢,jsf虽然在树形组件处理上,每一个阶段都经历了递归遍历,但是要相信jsf依然很快,我现在的系统很快,如果你使用后很慢那是项目产生了问题,而不是框架的产生了问题。

15.相信jsf一定是下一代表现层的王者,这很重要。

就这么多把,jsf的能多经验,我还在摸索当中,有机会还会和大家交流
fangshun1980@hotmail.com
引用:
http://www.blogjava.net/fangshun/archive/2007/10/20/154469.html
前一段时间我写过一篇共享我在项目中使用jsf的一些经验,主要是概要的提出了一些jsf使用上的建议,这次我想在文章里主要是把seam在jsf中的使用经验提一下,能让更多的人了解seam的实际应用和优势。
    1.seam配置时要注意的地方:
    (1)faces-config.xml里面要加入一个seam的阶段监听:
    
<lifecycle>
<phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener>
<!-- <phase-listener>com.future.egov.jsf.ext.event.DebugPhaseListener</phase-listener> -->
</lifecycle>

     seam动起来的条件就是从这里发起的,seam通过这个监听器对jsf的各个阶段进行必要的增强以及植入自己的CONVERSATION生命周期,对于这个监听器的具体细节工作,我还需要更多时间研究,仍在了解中!
      (2) 一定要在工程类路径的根下放置一个seam.properties文件,你可以设置为空内容,主要是引导seam在初始化的时候加载这个路径下所有标注为seam组件的对象(通过@Name注释),http://www.ibm.com/developerworks/cn/java/j-seam1/  seam无缝集成jsf给我了提示!
      (3)web.xml下最小配置是加入seam监听器
        

<listener>
          <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
    </listener>
       在容器加载工程的时候,初始化seam框架。
      以上三处的配置,你就可以在任何容器中使用seam了!更多的配置大家可以找参考了解吧,我目前在项目中就使用了以上配置。其他配置主要是在seam对ajax,ejb3的支持上,不过seam很新,什么事都会发生!
   2.常用的注释:(所有被seam定义的领域对象都可以认为是seam组件)
     (1)@Name(XXX),需要在你的领域类上定义,定义了seam组件的名称,对于jsf来说就是backing-bean,也就是说你不用在faces-config中配置managedbean了!

      (2)@Scope(ScopeType.XXX),可以在你的领域类上定义,表示这个被定义的seam组件在什么上下文中,jsf中主要包括page,event,session,application,conversation这些Scope。我在项目中主要使用event,session,conversation。event就是把组件放入了request中,session同理,conversation是seam独创的声命周期,conversation短声命周期类似request,但是会保存一些jsf容易在请求中丢失的数据(jsf只是保存组件,不保存组件渲染的数据,除非是EditableValueHolder组件,有时候需要通过myfaces的save组件和updateActionListener组件来恢复这些数据),具体保存细节,需要看使用的情况,我有这样一个经验:当定义成event上下文,在页面的一次请求中,有些数据请求时还在,但是到渲染时就不见了,常见在dataTable组件,myfaces的commandNavigation组件,但是换成conversation上下文,这些数据在渲染时又找回来了。但是对于跨度比较大层面,我还是推荐使用myfaces提供的保持机制,我一般使用updateActionListener,而save组件在seam1.2.1的环境下会出错。如果再有更大跨度,就可以使用conversation上下文的长会话了。

       (3)@Begin(join=true),@End(beforeRedirect=true),当触发了带有@Begin标记的方法,conversation的长会话就这样开始了,主要是为了长时间使用已经加载到conversation域中的对象或者属性(如果定义了conversation但并没有加载的可不算):join=true就是告诉你会话中有同名值时继续赋值,还有一个注释参数ifOutcome=XXX,就是看你的方法返回的字符串是否和ifOutcome定义的字符串相匹配,如果匹配就开始长会话。当在长会话期间执行到某个方法带有@End标记那么这个长会话就会结束,这样防止了内存泄漏问题,我认为这是一个权衡的结果,也许用户真的会点击那个带有结束标记方法的按钮。beforeRedirect为真就会在结束时清掉conversation上下文所有的信息,如果beforeRedirect=false,conversation只是变成短会话,在结束后的那次请求中还可以使用conversation中的数据,一般会用在messages提示这个应用场景中使用,但是如果要返回数据列表有时就需要清空所有数据,防止数据列表还会重现长会话开始前的情况。

       (4)In(value=XXX,rquest=false,ScopeType=XXX),Out(value=XXX,rquest=false,ScopeType=XXX) seam把它定义为双射。In是最常用的标注,你可以使用In导入一个jsf的EL变量来获取jsf模型,例如我要获取spring的业务bean,而且业务bean已经定义成backing bean,利用spring与jsf集成的方法:
       

<!-- Managed Beans for options.jsp -->
    <application>
        <variable-resolver>
            org.springframework.web.jsf.DelegatingVariableResolver
        </variable-resolver>
        <locale-config>
            <default-locale>gbk</default-locale>
        </locale-config>
        <message-bundle>resources/MessageBundle</message-bundle>
        <!--  <view-handler>com.icesoft.faces.facelets.D2DFaceletViewHandler
        </view-handler>        -->
    </application>

     在seam组件中这样声明:
@In(value="#{userService}", request=false)
private UserService userService;

这个示例为seam组件注入了由spring管理的用户服务对象,它的value是从jsf EL变量中获取,request=false在告诉seam,如果当前的值没有找到,那么设置为空,否者当出现没有找到的情况,seam会抛出空异常。
@Out属性主要是把处理过的属性值会由seam重新再付给上下文也就是Out中所定义的ScopeType上下文,我认为虽然是seam的一个特点,但是在我的应用中不多,主要是注入而非双射!如果它真的能在短期Conversation中有所作用来代替Myfaces的数据保持机制,我想会好些,我目前只是在长Conversation有所应用。

[email=3.@Factory]3[/email] [email=.@Factory].@Factory[/email],@DataModelSelection,@DataModel,它们主要来代替数据列表的使用,主要是减少了代码量,Factory是在请求值阶段就对需要实例化的对象进行创建,DataModelSelection定义的属性,可以透明的抓取数据列表选择的单行数据,DataModel属性减少了不必要的get,set。然而我在实际的使用中由于很多不定的情况,大部分的使用上又回到jsf标准的get方式。 这种开发方式我认为seam的目的是想屏蔽与页面不必要的关系细节,让开发只需要重视真正的业务,是一个标准的面向对象式结构,当jsf的体系结构的不断优化,类似这种开发方式我想会越来越有用。
[email=4.@RequestParameter]4. @RequestParameter[/email]是个很有用的注释,它自动把当前属性和页面同名的request提交值绑定在一起,虽然这样使用违背了jsf所追求的面向对象化,http透明化,但是实际开发中会后很多意想不到的情况,有时候在集成式页面这样的做法会很有用,当你的页面中不仅仅有jsf标签就清楚了!

seam的其他方面问题我会抽空整理一下,seam目前也是在不断更新当中,明年出台的webBeans规范的前身就是seam,其实我更关注的是seam在整个j2ee体系中的角色,它到底是想替代struts的application?还是想替代spring的manager?也许有更多的想法!

posted @ 2008-01-05 00:27 Java蜘蛛人 --郑成桥 阅读(1572) | 评论 (0)编辑 收藏

仅列出标题
共6页: 上一页 1 2 3 4 5 6 下一页