<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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蜘蛛人 --鄭成橋 閱讀(952) | 評論 (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蜘蛛人 --鄭成橋 閱讀(1336) | 評論 (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蜘蛛人 --鄭成橋 閱讀(658) | 評論 (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蜘蛛人 --鄭成橋 閱讀(177) | 評論 (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蜘蛛人 --鄭成橋 閱讀(1167) | 評論 (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蜘蛛人 --鄭成橋 閱讀(271) | 評論 (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蜘蛛人 --鄭成橋 閱讀(339) | 評論 (0)編輯 收藏

     剛做出來的 struts 入門視頻 非常適合新人

    struts 視頻

    有什么問題盡管加我的QQ48187537 
     最近 會更具大家要求錄制更多的視頻

    posted @ 2008-01-19 17:39 Java蜘蛛人 --鄭成橋 閱讀(571) | 評論 (5)編輯 收藏

         摘要: 面試必備基礎題目(雖然不一定常用, 僅用于面試, 面試就是把人搞的都不會然后砍價, 當然您可以講我可以查資料完成, 但是面試的時候就是沒道理的, 起碼我是經??吹竭@些題). 如何把一段逗號分割的字符串轉換成一個數組? request.getAttribute() 和 request.getParameter() 有何區別? response.sendRedirect() 和 forward(...  閱讀全文

    posted @ 2008-01-13 02:52 Java蜘蛛人 --鄭成橋 閱讀(2003) | 評論 (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://m.tkk7.com/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://m.tkk7.com/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蜘蛛人 --鄭成橋 閱讀(1574) | 評論 (0)編輯 收藏

    僅列出標題
    共6頁: 上一頁 1 2 3 4 5 6 下一頁 
    主站蜘蛛池模板: 亚洲精品中文字幕乱码三区| 国产亚洲精品免费视频播放| 亚洲五月激情综合图片区| 免费一级一片一毛片| 无码中文在线二区免费| 猫咪免费人成网站在线观看| 三上悠亚在线观看免费| 美女无遮挡免费视频网站| 亚洲欧美国产欧美色欲| 亚洲国产精品成人综合久久久| 亚洲va中文字幕无码久久不卡| 亚洲国产香蕉人人爽成AV片久久 | 麻豆成人精品国产免费| 免费在线视频你懂的| 久久伊人免费视频| 国产免费阿v精品视频网址| 一级特黄aaa大片免费看| 羞羞视频免费网站入口| 亚洲人成网站18禁止| 亚洲小说图区综合在线| 久久亚洲精品专区蓝色区| 亚洲春色另类小说| 亚洲精品在线网站| 亚洲精品免费在线视频| 亚洲视频国产视频| 亚洲噜噜噜噜噜影院在线播放| 亚洲色欲或者高潮影院| 亚洲日韩乱码久久久久久| 亚洲午夜国产精品| 亚洲视频无码高清在线| 77777亚洲午夜久久多喷| 亚洲а∨天堂久久精品9966| 国产亚洲中文日本不卡二区| 久久亚洲精品国产精品婷婷| jiz zz在亚洲| 亚洲第一成年免费网站| 免费播放美女一级毛片| 一个人免费观看视频在线中文| 国产免费久久精品丫丫| 久久精品国产影库免费看| 日韩人妻无码精品久久免费一|