Java蜘蛛人 歡迎大家

          歡迎大家 來到我的blog , 如果我身邊的朋友 有什么不懂可以直接來問我 我會(huì)細(xì)心的幫助你的. 如果網(wǎng)絡(luò)上的朋友有什么不懂的 可以加我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蜘蛛人 --鄭成橋 閱讀(955) | 評(píng)論 (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蜘蛛人 --鄭成橋 閱讀(1339) | 評(píng)論 (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="點(diǎn)擊" >
             
          </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蜘蛛人 --鄭成橋 閱讀(660) | 評(píng)論 (0)編輯 收藏

            <%
           
            SmartUpload su=new SmartUpload();  //JspSmart 下載上傳
            su.initialize(pageContext);   //下載初始化
            su.setContentDisposition(null); //禁止瀏覽器自動(dòng)打開
            su.downloadFile("F:\\work\\HibernateDemo25\\a\\1.JPG"); //下載的文件
             %>

          posted @ 2008-02-24 08:26 Java蜘蛛人 --鄭成橋 閱讀(178) | 評(píng)論 (0)編輯 收藏

          失誤
          悲觀鎖.
          Acc acc=(Acc)session.get(Acc.class,new Long(1),LockMode.UPGRADE);   假如這個(gè)事物開始了 其他的失誤不能訪問的, 知道這個(gè)事物提交之后 然后再解鎖
          樂觀鎖
          在建表時(shí)候 增加一個(gè) version interger
          然后再Acc.hbm.xml里
          id  后面 添加
          <version  name="version" column="VERSION"  />

          注意 例子中 捕獲StaleObjectStateException  這個(gè)異常
          例子 

          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("帳戶被其他的事物修改.本事務(wù)撤銷. 稍后在試..!");
                  }
              }
              
              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("帳戶被其他的事物修改.本事務(wù)撤銷. 稍后在試..! 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蜘蛛人 --鄭成橋 閱讀(1169) | 評(píng)論 (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蜘蛛人 --鄭成橋 閱讀(273) | 評(píng)論 (0)編輯 收藏

          dynamic-insert="true" 如果插入的值不為空 他才會(huì)把他列入插入語句中  (作用:節(jié)約資源)


          <hibernate-mapping package="mypack"> <class>元素中定義的類來自mypack包

           

          <property name="sex" access="field"/> 不會(huì)直接調(diào)用age的set,get方法. 避免get,set方法里的邏輯值.

           


          <class name="xxx.xxx" table="xxxx" select-before-update=true> 如果設(shè)置成true  如果不經(jīng)常修改java 對(duì)象的屬性 就設(shè)為true   當(dāng)對(duì)象沒有被修改的時(shí)候 他不會(huì)執(zhí)行update 語句  select-before-update=true 可以避免update 盲目的觸發(fā)一個(gè)觸發(fā)器

           

          saveOrUpdate 如果是臨時(shí)對(duì)象就用save  如果是游離對(duì)象才建議用saveOrUpdate 如果傳遞進(jìn)來的是持久化狀態(tài)  就直接返回
          他會(huì)自動(dòng)判斷是游離狀態(tài)還是臨時(shí)狀態(tài)  如果oid=null version=null等.那就是臨時(shí)狀態(tài).

           

          hibernate與觸發(fā)器 協(xié)同工作 ..  假如save 一個(gè)數(shù)據(jù) 會(huì)觸發(fā)一個(gè)觸發(fā)器 那就會(huì)導(dǎo)致 session緩存的內(nèi)容和數(shù)據(jù)庫的內(nèi)容不協(xié)調(diào)(不一樣)
           解決方法 : 在save后 調(diào)用flush()清除緩存 然后調(diào)用refresh() 重新到數(shù)據(jù)庫當(dāng)中加載剛才被保存的xxxx對(duì)象
          select-before-update=true 可以避免update 盲目的觸發(fā)一個(gè)觸發(fā)器

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

          映射 一對(duì)多的關(guān)聯(lián)

          需要在 xxx.hbm.xml里添加

          <many-to-one
          name="customer"  //用戶表的實(shí)例
          columb="CUSTOMER_ID"
          class="mypack.Customer"
          cascade="save-update"  保存或者更新customer的臨時(shí)對(duì)象
          not-null="true"
          />

            //建立用戶表和訂單表外鍵的映射

          //例子在HibernateDemo16:

          映射一對(duì)多雙向自身關(guān)系

            //創(chuàng)建食物類.對(duì)象
            Categories foodCategory=new Categories(null,"food",new HashSet());
            //創(chuàng)建水果類.對(duì)象
            Categories fruitCategory=new Categories(null,"fruit",new HashSet());
            //創(chuàng)建蔬菜類 對(duì)象
            Categories vegetableCategory=new Categories(null,"vegetable",new HashSet());
            //創(chuàng)建蘋果 對(duì)象
            Categories appleCategory=new Categories(null,"apple",new HashSet());
            //創(chuàng)建橘子對(duì)象
            Categories orangeCategory=new Categories(null,"Orange",new HashSet());
            //創(chuàng)建西紅柿 對(duì)象
            Categories tomatoCategory=new Categories(null,"tomato",new HashSet());
            
            
            //建立食物類.和水果類的關(guān)系
               foodCategory.getCategorieses().add(fruitCategory);
               fruitCategory.setCategories(foodCategory);
              
               //建立食物跟蔬菜關(guān)系
               foodCategory.getCategorieses().add(vegetableCategory);
               vegetableCategory.setCategories(foodCategory);
              
               //建立水果和蘋果的關(guān)系
               fruitCategory.getCategorieses().add(appleCategory);
               appleCategory.setCategories(fruitCategory);
              
               //建立水果和橘子的關(guān)系
               fruitCategory.getCategorieses().add(orangeCategory);
               orangeCategory.setCategories(fruitCategory);
              
               //建立西紅柿跟水果的關(guān)系
               fruitCategory.getCategorieses().add(tomatoCategory);
               tomatoCategory.setCategories(fruitCategory);
              
              //建立蔬菜和西紅柿的關(guān)系
               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);

           


            
          //單項(xiàng)修改
          //  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 查詢
           //創(chuàng)建一個(gè)Criteria 對(duì)象  然后把Ord 加載進(jìn)去
              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蜘蛛人 --鄭成橋 閱讀(340) | 評(píng)論 (0)編輯 收藏

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

          struts 視頻

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

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

               摘要: 面試必備基礎(chǔ)題目(雖然不一定常用, 僅用于面試, 面試就是把人搞的都不會(huì)然后砍價(jià), 當(dāng)然您可以講我可以查資料完成, 但是面試的時(shí)候就是沒道理的, 起碼我是經(jīng)常看到這些題). 如何把一段逗號(hào)分割的字符串轉(zhuǎn)換成一個(gè)數(shù)組? request.getAttribute() 和 request.getParameter() 有何區(qū)別? response.sendRedirect() 和 forward(...  閱讀全文

          posted @ 2008-01-13 02:52 Java蜘蛛人 --鄭成橋 閱讀(2005) | 評(píng)論 (0)編輯 收藏

          我目前的項(xiàng)目前端使用的是jsf+seam的架構(gòu),目前項(xiàng)目已經(jīng)進(jìn)入尾聲,我想把一些心得體會(huì)給大家說說,以便大家在使用jsf的時(shí)候,少走彎路。

          1.異常處理問題:請(qǐng)為jsf加入seam框架,看看Seam - 無縫集成JSF,共三部分,里面告訴了你怎么在servlet容器下配合spring使用seam,seam不是一定要在ejb3和jboss下才可以使用。因?yàn)閱为?dú)使用jsf的話她的異常處理功能很簡(jiǎn)陋,跟蹤不到你想看的地方,對(duì)于開發(fā)很不方便,你只有打開日志才能看到問題所在,而seam在加入phase-listener以后,對(duì)jsf不同的生命周期都進(jìn)行了功能增強(qiáng),即使不使用seam任何的功能,她也能毫無保留的輸出所有的異常棧。

          2.css問題:如果你想在你的項(xiàng)目中使用jsf,css太重要了,很多剛開始使用jsf的人都不是很習(xí)慣jsf基于塊結(jié)構(gòu)開發(fā)頁面,因?yàn)閖sf讓你注意的是展現(xiàn)的內(nèi)容,而不是展現(xiàn)的樣式,這是完全符合w3開發(fā)html的初衷,大家使用<table><tr><td>來做頁面展現(xiàn)布局,其實(shí)是錯(cuò)誤已久的方法,如果在jsf中能了解如何使用css進(jìn)行布局,jsf不適合復(fù)雜頁面設(shè)計(jì)這句話就不攻自破了。

          3.細(xì)心的使用dataTable組件,數(shù)據(jù)列表是最常用的頁面組件,但是我毫不留情的說jsf的dataTable組件的實(shí)現(xiàn)簡(jiǎn)直太濫了,它就是jsf開發(fā)一大禍根。沒有很方便的解決特定行樣式顯示的問題,沒有解決回退按鈕風(fēng)險(xiǎn)問題,沒有dataScroll和dataTable組件進(jìn)行數(shù)據(jù)庫分頁的優(yōu)雅辦法,數(shù)據(jù)提交的幻影問題,我的開發(fā)很多時(shí)間用在了dataTable的和其他組件塊融合上面。不過jsf1.2通過統(tǒng)一el,加入了對(duì)jstl的foreach標(biāo)記的支持,我雖然還沒有使用,但是我認(rèn)為這有可能成為數(shù)據(jù)列表開發(fā)的一個(gè)有力補(bǔ)充。

          4.建議把jsf的模型bean和后臺(tái)的業(yè)務(wù)bean合二為一,這樣可以在前端提交頁面與模型綁定的同時(shí),完成業(yè)務(wù)bean的數(shù)據(jù)封裝,并且交由服務(wù)層處理一氣呵成。這樣做有個(gè)好處,就是我們會(huì)想方設(shè)法通過各種手段在第一時(shí)間就完成模型bean對(duì)業(yè)務(wù)bean的封裝,消除服務(wù)層對(duì)dto的依賴。這樣是可行的,因?yàn)閖sf的頁面綁定機(jī)制提供了很好的幫助。

          5.請(qǐng)考慮多的使用convert組件,比如列表頁面有個(gè)radio塊,提交radio值就是一個(gè)int數(shù)值,然后在展現(xiàn)邏輯去恢復(fù)這個(gè)radio值對(duì)應(yīng)的業(yè)務(wù)模型,這樣增加了展現(xiàn)邏輯處理頁面數(shù)據(jù)的負(fù)擔(dān),而且不好管理,如果把這個(gè)工作放在自定義的convert中,讓convert在頁面上顯示int數(shù)值,在提交上尋找對(duì)象,那么頁面和服務(wù)層就屏蔽了這樣的工作,看到的都是對(duì)象的進(jìn)出。

          6.我使用了myfaces一個(gè)自己的組件<t:updateListener>,就是跨頁面專遞參數(shù),非常好用,剛使用jsf的朋友,可以看到跳轉(zhuǎn)的下一個(gè)頁面用它怎么做,但是建議傳遞模型對(duì)象,不要傳遞數(shù)值,你使用jsf就是因?yàn)樗腔趯?duì)象考慮頁面設(shè)計(jì)的。

          7.小心使用session來處理jsf,jsf過多的使用了session,但是我可以肯定一點(diǎn),展現(xiàn)層一定是需要基于狀態(tài)的方式來做的,這樣可以簡(jiǎn)化開發(fā),無狀態(tài)的方式會(huì)帶來更多的無序代碼。不是每個(gè)人都是高手。可以考慮使用seam的conversation來處理,她的長會(huì)話特別適合業(yè)務(wù)編輯,默認(rèn)的短會(huì)話會(huì)填補(bǔ)jsf有時(shí)容易丟失的短期數(shù)據(jù)。

          8.調(diào)試jsf的問題:有時(shí)你使用jsf想知道你的數(shù)據(jù)在哪個(gè)階段變化了,你不會(huì)把jsf代碼加入到自己的工程中來調(diào)試把,請(qǐng)加入自定義的phaseListener,繼承phaseListener這個(gè)接口,你可以在把你的程序設(shè)置在任何階段跳出來進(jìn)行調(diào)試。

          9.分頁的問題:在google搜一下,有個(gè)http://www.aygfsteel.com/steady/archive/2005/12/30/26013.aspx提供了分頁的方式,我就在使用,這是目前最可能的方式了把,呵呵,不過要注意她使dataTable的values直接使用了dataModel,她與seam的@dataModel是不兼容的,所以不能使用seam的@dataModel功能,需要使用get方式了。

          10.如果想使用ajax4jsf等ajax框架,你需要使用facelet,讓頁面成為標(biāo)準(zhǔn)的xhtml,記好了,不要寫了一大堆才發(fā)現(xiàn)這個(gè)問題。

          11.如果你在dataTable列表頁面使用了radio的話,你還想在列表上做一些link操作,一定要在操作上加入immediate=true,否則在沒有選擇radio的情況下她是不會(huì)讓你過去的。并且列表中要使用selectOneRadio,如果使用checkbox就要使用selectBooleanCheckbox.組件。

          12.對(duì)于doGet的方式請(qǐng)使用seam的<s:link>組件,<%=request.getContextPath() %>問題,提交引起的書簽問題都迎刃而解。

          13.如果你導(dǎo)入了其他頁面,而沒有使用facelet的話,那么導(dǎo)入的那個(gè)頁面就要完全符合jsf組件的渲染方式,混合html會(huì)解析不出來。反過來在主頁面應(yīng)該盡量多使用jsf標(biāo)記與html混合的方式,這樣可以使開發(fā)變得簡(jiǎn)單,盡管有時(shí)候jsf會(huì)很丟丑,你試試每個(gè)html組件都有個(gè)render屬性就知道了。jsf1.2已經(jīng)把混合的html作為一個(gè)output組件來輸出,可以和jsf組件兼容,是件好事。對(duì)于混合html這種方式,我想說你關(guān)注的是jsf組件和模型的關(guān)系,而不一定頁面都得是jsf組件標(biāo)記。

          14.不要相信jsf運(yùn)行的速度慢,jsf雖然在樹形組件處理上,每一個(gè)階段都經(jīng)歷了遞歸遍歷,但是要相信jsf依然很快,我現(xiàn)在的系統(tǒng)很快,如果你使用后很慢那是項(xiàng)目產(chǎn)生了問題,而不是框架的產(chǎn)生了問題。

          15.相信jsf一定是下一代表現(xiàn)層的王者,這很重要。

          就這么多把,jsf的能多經(jīng)驗(yàn),我還在摸索當(dāng)中,有機(jī)會(huì)還會(huì)和大家交流
          fangshun1980@hotmail.com
          引用:
          http://www.aygfsteel.com/fangshun/archive/2007/10/20/154469.html
          前一段時(shí)間我寫過一篇共享我在項(xiàng)目中使用jsf的一些經(jīng)驗(yàn),主要是概要的提出了一些jsf使用上的建議,這次我想在文章里主要是把seam在jsf中的使用經(jīng)驗(yàn)提一下,能讓更多的人了解seam的實(shí)際應(yīng)用和優(yōu)勢(shì)。
              1.seam配置時(shí)要注意的地方:
              (1)faces-config.xml里面要加入一個(gè)seam的階段監(jiān)聽:
              
          <lifecycle>
          <phase-listener>org.jboss.seam.jsf.SeamPhaseListener</phase-listener>
          <!-- <phase-listener>com.future.egov.jsf.ext.event.DebugPhaseListener</phase-listener> -->
          </lifecycle>

               seam動(dòng)起來的條件就是從這里發(fā)起的,seam通過這個(gè)監(jiān)聽器對(duì)jsf的各個(gè)階段進(jìn)行必要的增強(qiáng)以及植入自己的CONVERSATION生命周期,對(duì)于這個(gè)監(jiān)聽器的具體細(xì)節(jié)工作,我還需要更多時(shí)間研究,仍在了解中!
                (2) 一定要在工程類路徑的根下放置一個(gè)seam.properties文件,你可以設(shè)置為空內(nèi)容,主要是引導(dǎo)seam在初始化的時(shí)候加載這個(gè)路徑下所有標(biāo)注為seam組件的對(duì)象(通過@Name注釋),http://www.ibm.com/developerworks/cn/java/j-seam1/  seam無縫集成jsf給我了提示!
                (3)web.xml下最小配置是加入seam監(jiān)聽器
                  

          <listener>
                    <listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
              </listener>
                 在容器加載工程的時(shí)候,初始化seam框架。
                以上三處的配置,你就可以在任何容器中使用seam了!更多的配置大家可以找參考了解吧,我目前在項(xiàng)目中就使用了以上配置。其他配置主要是在seam對(duì)ajax,ejb3的支持上,不過seam很新,什么事都會(huì)發(fā)生!
             2.常用的注釋:(所有被seam定義的領(lǐng)域?qū)ο蠖伎梢哉J(rèn)為是seam組件)
               (1)@Name(XXX),需要在你的領(lǐng)域類上定義,定義了seam組件的名稱,對(duì)于jsf來說就是backing-bean,也就是說你不用在faces-config中配置managedbean了!

                (2)@Scope(ScopeType.XXX),可以在你的領(lǐng)域類上定義,表示這個(gè)被定義的seam組件在什么上下文中,jsf中主要包括page,event,session,application,conversation這些Scope。我在項(xiàng)目中主要使用event,session,conversation。event就是把組件放入了request中,session同理,conversation是seam獨(dú)創(chuàng)的聲命周期,conversation短聲命周期類似request,但是會(huì)保存一些jsf容易在請(qǐng)求中丟失的數(shù)據(jù)(jsf只是保存組件,不保存組件渲染的數(shù)據(jù),除非是EditableValueHolder組件,有時(shí)候需要通過myfaces的save組件和updateActionListener組件來恢復(fù)這些數(shù)據(jù)),具體保存細(xì)節(jié),需要看使用的情況,我有這樣一個(gè)經(jīng)驗(yàn):當(dāng)定義成event上下文,在頁面的一次請(qǐng)求中,有些數(shù)據(jù)請(qǐng)求時(shí)還在,但是到渲染時(shí)就不見了,常見在dataTable組件,myfaces的commandNavigation組件,但是換成conversation上下文,這些數(shù)據(jù)在渲染時(shí)又找回來了。但是對(duì)于跨度比較大層面,我還是推薦使用myfaces提供的保持機(jī)制,我一般使用updateActionListener,而save組件在seam1.2.1的環(huán)境下會(huì)出錯(cuò)。如果再有更大跨度,就可以使用conversation上下文的長會(huì)話了。

                 (3)@Begin(join=true),@End(beforeRedirect=true),當(dāng)觸發(fā)了帶有@Begin標(biāo)記的方法,conversation的長會(huì)話就這樣開始了,主要是為了長時(shí)間使用已經(jīng)加載到conversation域中的對(duì)象或者屬性(如果定義了conversation但并沒有加載的可不算):join=true就是告訴你會(huì)話中有同名值時(shí)繼續(xù)賦值,還有一個(gè)注釋參數(shù)ifOutcome=XXX,就是看你的方法返回的字符串是否和ifOutcome定義的字符串相匹配,如果匹配就開始長會(huì)話。當(dāng)在長會(huì)話期間執(zhí)行到某個(gè)方法帶有@End標(biāo)記那么這個(gè)長會(huì)話就會(huì)結(jié)束,這樣防止了內(nèi)存泄漏問題,我認(rèn)為這是一個(gè)權(quán)衡的結(jié)果,也許用戶真的會(huì)點(diǎn)擊那個(gè)帶有結(jié)束標(biāo)記方法的按鈕。beforeRedirect為真就會(huì)在結(jié)束時(shí)清掉conversation上下文所有的信息,如果beforeRedirect=false,conversation只是變成短會(huì)話,在結(jié)束后的那次請(qǐng)求中還可以使用conversation中的數(shù)據(jù),一般會(huì)用在messages提示這個(gè)應(yīng)用場(chǎng)景中使用,但是如果要返回?cái)?shù)據(jù)列表有時(shí)就需要清空所有數(shù)據(jù),防止數(shù)據(jù)列表還會(huì)重現(xiàn)長會(huì)話開始前的情況。

                 (4)In(value=XXX,rquest=false,ScopeType=XXX),Out(value=XXX,rquest=false,ScopeType=XXX) seam把它定義為雙射。In是最常用的標(biāo)注,你可以使用In導(dǎo)入一個(gè)jsf的EL變量來獲取jsf模型,例如我要獲取spring的業(yè)務(wù)bean,而且業(yè)務(wù)bean已經(jīng)定義成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;

          這個(gè)示例為seam組件注入了由spring管理的用戶服務(wù)對(duì)象,它的value是從jsf EL變量中獲取,request=false在告訴seam,如果當(dāng)前的值沒有找到,那么設(shè)置為空,否者當(dāng)出現(xiàn)沒有找到的情況,seam會(huì)拋出空異常。
          @Out屬性主要是把處理過的屬性值會(huì)由seam重新再付給上下文也就是Out中所定義的ScopeType上下文,我認(rèn)為雖然是seam的一個(gè)特點(diǎn),但是在我的應(yīng)用中不多,主要是注入而非雙射!如果它真的能在短期Conversation中有所作用來代替Myfaces的數(shù)據(jù)保持機(jī)制,我想會(huì)好些,我目前只是在長Conversation有所應(yīng)用。

          [email=3.@Factory]3[/email] [email=.@Factory].@Factory[/email],@DataModelSelection,@DataModel,它們主要來代替數(shù)據(jù)列表的使用,主要是減少了代碼量,F(xiàn)actory是在請(qǐng)求值階段就對(duì)需要實(shí)例化的對(duì)象進(jìn)行創(chuàng)建,DataModelSelection定義的屬性,可以透明的抓取數(shù)據(jù)列表選擇的單行數(shù)據(jù),DataModel屬性減少了不必要的get,set。然而我在實(shí)際的使用中由于很多不定的情況,大部分的使用上又回到j(luò)sf標(biāo)準(zhǔn)的get方式。 這種開發(fā)方式我認(rèn)為seam的目的是想屏蔽與頁面不必要的關(guān)系細(xì)節(jié),讓開發(fā)只需要重視真正的業(yè)務(wù),是一個(gè)標(biāo)準(zhǔn)的面向?qū)ο笫浇Y(jié)構(gòu),當(dāng)jsf的體系結(jié)構(gòu)的不斷優(yōu)化,類似這種開發(fā)方式我想會(huì)越來越有用。
          [email=4.@RequestParameter]4. @RequestParameter[/email]是個(gè)很有用的注釋,它自動(dòng)把當(dāng)前屬性和頁面同名的request提交值綁定在一起,雖然這樣使用違背了jsf所追求的面向?qū)ο蠡琱ttp透明化,但是實(shí)際開發(fā)中會(huì)后很多意想不到的情況,有時(shí)候在集成式頁面這樣的做法會(huì)很有用,當(dāng)你的頁面中不僅僅有jsf標(biāo)簽就清楚了!

          seam的其他方面問題我會(huì)抽空整理一下,seam目前也是在不斷更新當(dāng)中,明年出臺(tái)的webBeans規(guī)范的前身就是seam,其實(shí)我更關(guān)注的是seam在整個(gè)j2ee體系中的角色,它到底是想替代struts的application?還是想替代spring的manager?也許有更多的想法!

          posted @ 2008-01-05 00:27 Java蜘蛛人 --鄭成橋 閱讀(1576) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共6頁: 上一頁 1 2 3 4 5 6 下一頁 
          主站蜘蛛池模板: 天台县| 桐城市| 米易县| 永济市| 潼关县| 陆良县| 六枝特区| 耿马| 民和| 天气| 湟源县| 镇巴县| 邹城市| 东山县| 吕梁市| 东安县| 行唐县| 平度市| 德江县| 准格尔旗| 鄂州市| 舟曲县| 北宁市| 金门县| 彰化县| 高雄县| 阿巴嘎旗| 河池市| 德钦县| 金堂县| 攀枝花市| 常州市| 新晃| 岳普湖县| 买车| 西安市| 安化县| 政和县| 元朗区| 孟连| 太康县|