韩日一区二区,蜜桃视频在线观看视频,日本午夜一区http://www.aygfsteel.com/phyeas/我是程序員?我是程序員!zh-cnTue, 17 Jun 2025 15:39:46 GMTTue, 17 Jun 2025 15:39:46 GMT60JAVA之理解break label;http://www.aygfsteel.com/phyeas/archive/2009/03/19/260787.htmlphyeasphyeasThu, 19 Mar 2009 07:07:00 GMThttp://www.aygfsteel.com/phyeas/archive/2009/03/19/260787.htmlhttp://www.aygfsteel.com/phyeas/comments/260787.htmlhttp://www.aygfsteel.com/phyeas/archive/2009/03/19/260787.html#Feedback0http://www.aygfsteel.com/phyeas/comments/commentRss/260787.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/260787.htmlint x = 8;
        label: 
switch (x) {
        
case 1:
            System.out.println(
"X == 1");
            
break;
        
case 2:
        
case 3:
        
case 4:
            System.out.println(
"X is 2 or 3 or 4");
            
break;
        
case 0:
            System.out.println(
"X<1");
            
break;
        
case 5:
            System.out.println(
"x>4");
            
break;
        
default:
            x 
= x > 4 ? 5 : 0;
            
break label;
        }

        System.out.println(x);
以上代碼將會輸出什么?
當然是輸出一個"5"了。
但是等等,程序中有一個 break label;有什么用呢,不是跳到label的位置嗎。當然不是了!
為了解釋這個,我們需要了解這個label的作用,這個label其實是定義一個有名稱代碼段,而在該程序中label指定的代碼段就是switch,所以break label;其實就是跳出這個代碼段的意思。


phyeas 2009-03-19 15:07 發表評論
]]>
文本比較算法的實現2http://www.aygfsteel.com/phyeas/archive/2009/02/15/254743.htmlphyeasphyeasSun, 15 Feb 2009 05:22:00 GMThttp://www.aygfsteel.com/phyeas/archive/2009/02/15/254743.htmlhttp://www.aygfsteel.com/phyeas/comments/254743.htmlhttp://www.aygfsteel.com/phyeas/archive/2009/02/15/254743.html#Feedback3http://www.aygfsteel.com/phyeas/comments/commentRss/254743.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/254743.html 今天又將算法看了一遍,終于理解其精髓
下面是主要的實現代碼,獻丑了
首先是初始化一個boolean數組,存放各個字符是否匹配的:
    public static boolean[][] getCompareBooleanArray(String source,
            String compareTo) {
        
boolean[][] comps;
        
if (compareTo == null || source == null) {
            
throw new IllegalArgumentException("必須設置完兩個文本后再進行初始化");
        }
        comps 
= new boolean[compareTo.length()][source.length()];
        
for (int i = 0; i < compareTo.length(); i++) {
            
for (int j = 0; j < source.length(); j++) {
                comps[i][j] 
= compareTo.charAt(i) == source.charAt(j);
                
// System.out.print(comps[i][j] + "\t");
            }
            
// System.out.println();
        }
        
return comps;
    }
這個實現基本上沒什么說的,就這樣

接著是一個根據這個boolean數組初始化一個int矩陣的函數,這個函數就對應尋找最大匹配路徑的函數
    public static int[][] getSetpPathArr(boolean[][] barr) {
        
int[][] iarr = new int[barr.length][barr[0].length];
        
for (int i = barr.length - 1; i >= 0; i--) {
            
for (int j = barr[i].length - 1; j >= 0; j--) {
                
int v_i_j = barr[i][j] ? 1 : 0;
                
int n_i_1_j_1 = i + 1 >= iarr.length || j + 1 >= iarr[i].length ? 0
                        : iarr[i 
+ 1][j + 1];
                
int n_i_1_j = i + 1 >= iarr.length ? 0 : iarr[i + 1][j];
                
int n_i_j_1 = j + 1 >= iarr[i].length ? 0 : iarr[i][j + 1];
                
int v_n_1_1 = v_i_j + n_i_1_j_1;
                iarr[i][j] 
= v_n_1_1 > n_i_1_j ? v_n_1_1 > n_i_j_1 ? v_n_1_1
                        : n_i_j_1 : n_i_1_j 
> n_i_j_1 ? n_i_1_j : n_i_j_1;
            }
        }
        
return iarr;
    }
根據算法的解釋,從下往上,從右向左計算每個格子

對應尋找最優路徑的函數,也是初始化一個int[][]
    public static int[][] getMinSetpArr(int[][] miarr, boolean[][] barr) {
        
int[][] iarr = new int[miarr.length][miarr[0].length];
        
for (int i = iarr.length - 1; i >= 0; i--) {
            
for (int j = iarr[i].length - 1; j >= 0; j--) {
                
if (barr[i][j]) {
                    iarr[i][j] 
= getV(iarr, i + 1, j + 1+ 1;
                } 
else if (getV(miarr, i, j + 1>= getV(miarr, i + 1, j)) {
                    iarr[i][j] 
= getV(iarr, i, j + 1);
                } 
else {
                    iarr[i][j] 
= getV(iarr, i + 1, j) + 1;
                }
            }
        }
        
return iarr;
    }
這樣就相應對應了算法中講的那三個矩陣。
當然了,上面有調用到一個叫getV的方法,方法很簡單
    private static int getV(int[][] arr, int i, int j) {
        
if (i >= arr.length || j >= arr[i].length) {
            
return 0;
        }
        
return arr[i][j];
    }
分別初始化完這三個數組后對結果進行計算。
boolean[][] barr = getCompareBooleanArray(source, compareTo);
        
int[][] miarr = getSetpPathArr(barr);
        
int[][] diarr = getMinSetpArr(miarr, barr);
先找出從頂點出發,下一步該走的那幾個點:
List<Point> points = new ArrayList<Point>();
        
int maxJ = -1;
        
for (int i = 0; i < barr.length; i++) {
            
int tempMaxJ = -1;
            
for (int j = 0; j < barr[i].length; j++) {
                
if (j > maxJ && maxJ != -1) {
                    
break;
                }
                
if (barr[i][j]) {
                    
if (tempMaxJ == -1) {
                        tempMaxJ 
= j;
                    }
                    points.add(
new Point(i, j));
                }
            }
            
if (tempMaxJ != -1) {
                maxJ 
= tempMaxJ;
            }
        }
找出可能的最大最優匹配路徑,這個可能會有幾條路徑,核心代碼:
int max = 0;
        
int minSetp = -1;
        
for (Point point : points) {
            
if (miarr[point.getX()][point.getY()] > max) {
                max 
= miarr[point.getX()][point.getY()];
            }
        }
        
for (Point point : points) {
            
if (minSetp == -1) {
                minSetp 
= diarr[point.getX()][point.getY()];
            } 
else if (miarr[point.getX()][point.getY()] >= max
                    
&& diarr[point.getX()][point.getY()] < minSetp) {
                minSetp 
= diarr[point.getX()][point.getY()];
            }
        }
        List
<Point> willRemove = new ArrayList<Point>();
        
for (Point point : points) {
            
if (miarr[point.getX()][point.getY()] < max
                    
|| diarr[point.getX()][point.getY()] > minSetp) {
                willRemove.add(point);
            }
        }
        points.removeAll(willRemove);
        willRemove.clear();
找到這里,最大匹配并且最優匹配的路徑就找到了
下面就是要計算差異了,基本和我上次寫的計算差異的方法差不多
List<TextDiff> diffs = new ArrayList<TextDiff>();
        
if (points.size() >= 1) {
            Point startPoint 
= points.get(0);
            points.clear();

            
if (startPoint.getX() != 0) {
                diffs.add(
new TextDiff(TextDiff.TYPE_INSERTED, 0, startPoint
                        .getX()));
            }
            
if (startPoint.getY() != 0) {
                diffs.add(
new TextDiff(TextDiff.TYPE_DELETED, 0, startPoint
                        .getY()));
            }
            Point next 
= getNext(startPoint, miarr, diarr, barr);
            
while (next != null) {
                
if (!barr[startPoint.getX()][startPoint.getY()]) {
                    startPoint 
= new Point(startPoint.getX() + 1, startPoint
                            .getY() 
+ 1);
                }
                
if (startPoint.getX() != next.getX() - 1
                        
|| startPoint.getY() != next.getY() - 1) {
                    diffs.add(
new TextDiff(TextDiff.TYPE_INSERTED, startPoint
                            .getX(), next.getX() 
- startPoint.getX()));

                    diffs.add(
new TextDiff(TextDiff.TYPE_DELETED, startPoint
                            .getY(), next.getY() 
- startPoint.getY()));
                }
                startPoint 
= next;
                next 
= getNext(startPoint, miarr, diarr, barr);
            }
            
if (startPoint.getX() != barr.length) {
                diffs.add(
new TextDiff(TextDiff.TYPE_INSERTED, startPoint
                        .getX(), barr.length 
- startPoint.getX()));
            }
            
if (startPoint.getY() != barr[0].length) {
                diffs.add(
new TextDiff(TextDiff.TYPE_DELETED,
                        startPoint.getY(), barr[
0].length - startPoint.getY()));
            }
        }

大功告成。。。。。
源碼:http://www.aygfsteel.com/Files/phyeas/src.zip

phyeas 2009-02-15 13:22 發表評論
]]>
文本比較算法的實現http://www.aygfsteel.com/phyeas/archive/2009/01/10/250807.htmlphyeasphyeasSat, 10 Jan 2009 06:17:00 GMThttp://www.aygfsteel.com/phyeas/archive/2009/01/10/250807.htmlhttp://www.aygfsteel.com/phyeas/comments/250807.htmlhttp://www.aygfsteel.com/phyeas/archive/2009/01/10/250807.html#Feedback1http://www.aygfsteel.com/phyeas/comments/commentRss/250807.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/250807.html
前兩天看了一個文本比較的算法,算法的思路我就不多說了,主要說下我的實現。算法參考:
           文本比較算法剖析(1)-如何確定最大匹配率
           文本比較算法剖析(2)-如何確定最優匹配路徑
我的實現步驟是:
1、計算出所有可行的路徑
如下圖中,N(l,r)所在的位置如果該位置匹配,則肯定要走A區。在掃描A區所有的可行路徑,可行路徑的標準是下一個可行并且匹配的點,在這一步先不考慮不普配的點。

關鍵代碼 :
public List<CharPoint> getNextPoints(boolean[][] comps, CharPoint p) {
        
if (comps == null || p == null)
            
throw new IllegalArgumentException("參數不能為空。");
        
int maxY = 0;
        List
<CharPoint> cps = new ArrayList<CharPoint>();
        
for (int i = p.getX() + 1; i < comps.length; i++) {
            
if (maxY == 0 && p.getX() + 1 == i) {
                maxY 
= comps[i].length - 1;
            }
            
int maxJ = maxY;
            
boolean bo = false;
            
for (int j = p.getY() + 1; j <= maxJ; j++) {
                
if (comps[i][j]) {
                    
if (!bo) {
                        bo 
= true;
                        maxY 
= j;
                    }
                    CharPoint cp 
= new CharPoint(i, j);
                    cp.setFromPoint(p);
                    cps.add(cp);
                }
            }
        }
        
return cps;
    }

2、計算出最大匹配的路徑
獲得所有可行的路徑后再對所有路徑的節點數進行判斷,節點最多的則是最大匹配路徑。但有可能有幾個最大匹配路徑。
關鍵代碼:
for (CharPoint cp : map.keySet()) {
            
// System.out.println(map.get(cp));
            if (map.get(cp) == max) {
                cps.add(cp);
            }
        }
        
for (CharPoint cp : cps) {
            cp 
= TextComparerUtil.copyCharPoint(cp);
            
while (cp.getFromPoint() != null) {
                cp.getFromPoint().setNext(cp);
                cp 
= cp.getFromPoint();
            }
            cps2.add(cp);
        }
在計算完最大匹配路徑后在對路徑進行補充。使路徑完整
關鍵代碼:
public static List<CharPoint> applySetpBySetpPath(boolean[][] comps,
            List
<CharPoint> cps) {
        
for (CharPoint cp : cps) {
            CharPoint next 
= cp.getNext();
            applySetpPath(comps, cp, next);
        }
        
return cps;
    }

    
private static void applySetpPath(boolean[][] comps, CharPoint cp,
            CharPoint next) {
        
while (next != null) {
            
if (cp.getX() >= 0 && cp.getY() >= 0
                    
&& cp.getX() + 1 < comps.length
                    
&& cp.getY() + 1 < comps[cp.getX()].length
                    
&& comps[cp.getX()][cp.getY()]) {
                cp.setNext(
new CharPoint(cp.getX() + 1, cp.getY() + 1));
                cp 
= cp.getNext();
            }
            
for (int i = cp.getX() + 1; i <= next.getX(); i++) {
                cp.setNext(
new CharPoint(i, cp.getY()));
                cp 
= cp.getNext();
            }
            
for (int i = cp.getY() + 1; i <= next.getY(); i++) {
                cp.setNext(
new CharPoint(cp.getX(), i));
                cp 
= cp.getNext();
            }
            next 
= next.getNext();
        }
    }

    
public static CharPoint applyToEnd(boolean[][] comps, CharPoint cp) {
        
while (cp.getNext() != null) {
            cp 
= cp.getNext();
        }
        CharPoint next 
= new CharPoint(comps.length - 1, comps[0].length - 1);
        applySetpPath(comps, cp, next);
        
return cp;
    }

3、計算最優路徑
計算最優路徑的方法很簡單,按照作者的算法的介紹,計算最優路徑的方法就是最后匹配的節點離root(0,0)點最近的那條路徑

4、計算差異
計算差異也很簡單,就不介紹了,直接上代碼
TextDiff diffdel = null;
        TextDiff diffins 
= null;
        
while (root != null) {
            
if (root.getNext() != null) {
                CharPoint next 
= root.getNext();
                
if (root.getX() == next.getX() && root.getY() != next.getY()) {
                    
if (diffdel == null) {
                        
int start = root.getY();
                        
if (comps[root.getX()][root.getY()]) {
                            start 
= next.getY();
                        }
                        diffdel 
= new TextDiff(TextDiff.TYPE_DELETED, start, 0);
                    }
                    diffdel.setDiffLength(diffdel.getDiffLength() 
+ 1);
                }
                
if (root.getY() == next.getY() && root.getX() != next.getX()) {
                    
if (diffins == null) {
                        
int start = root.getX();
                        
if (comps[root.getX()][root.getY()]) {
                            start 
= next.getX();
                        }
                        diffins 
= new TextDiff(TextDiff.TYPE_INSERTED, start, 0);
                    }
                    diffins.setDiffLength(diffins.getDiffLength() 
+ 1);
                }
                
if (root.getX() < comps.length
                        
&& root.getY() < comps[root.getX()].length
                        
&& comps[next.getX()][next.getY()]) {
                    
if (diffdel != null && diffdel.getDiffLength() != 0) {
                        diffs.add(diffdel);
                    }
                    
if (diffins != null && diffins.getDiffLength() != 0) {
                        diffs.add(diffins);
                    }
                    diffdel 
= null;
                    diffins 
= null;
                }
            }
            root 
= root.getNext();
            
if (root != null && root.getNext() == null) {
                
if (diffdel != null && diffdel.getDiffLength() != 0) {
                    diffs.add(diffdel);
                }
                
if (diffins != null && diffins.getDiffLength() != 0) {
                    diffs.add(diffins);
                }
            }
        }

(代碼有BUG。。。。暫停下載)
順便提前祝各位新春快樂,新年吉祥,和家安康



phyeas 2009-01-10 14:17 發表評論
]]>
Seam新手實戰(4):外鍵http://www.aygfsteel.com/phyeas/articles/248165.htmlphyeasphyeasWed, 24 Dec 2008 15:02:00 GMThttp://www.aygfsteel.com/phyeas/articles/248165.htmlhttp://www.aygfsteel.com/phyeas/comments/248165.htmlhttp://www.aygfsteel.com/phyeas/articles/248165.html#Feedback4http://www.aygfsteel.com/phyeas/comments/commentRss/248165.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/248165.html

一個圖書管理系統中的兩個對象:Book(書籍),BookType(書籍類型)。Book和BookType之間是多對一關系。

說到主從表的關聯關系,自然而然地想起的一種實現方式就是選擇框,比如在Book的編輯界面是使用一個類型的下拉選擇框,選擇一個類型,然后保存。于是就有下例代碼:
<h:selectOneMenu id="type" value="#{bookHome.instance.bookType.typeId}">
                    
<f:selectItems value="#{bookTypeList.typeSelectItems}" />
</h:selectOneMenu>
這段代碼的作者(我)原本的想法是讓這個下拉框與bookHome.instance里的bookType.typeId幫定。比如當前的book類型id是1,修改后將book類型的id改為2,更新到數據庫。但是很不幸。這段代碼并不能執行預期的行為,或者說它還附加了其他行為。即Seam已經覺察到了在這個book中的類型的一個屬性(主鍵值)已經改變了。于是,試圖更新這個類型。但是JPA的規范中是不允許更改主鍵的,這就引起了一個錯誤。不信可以試下哦,呵呵。(以上描述我已經盡可能說清楚我的想法,但可能還是不怎么清楚,希望大家看不懂的說說哪里看不懂,我好改正)。我想說的是,不要直接幫定到外鍵,而是現幫定到一個臨時變量,比如在bookHome中多寫一個變量:
public class BookHome extends EntityHome<Book>{
private Long typeId;
//..getter setter
}
然后將下拉框邦定到這個變量上,比如:

<h:selectOneMenu id="type" value="#{bookHome.typeId}">
                    
<f:selectItems value="#{bookTypeList.typeSelectItems}" />
</h:selectOneMenu>
。然后在重載的persist或者update方法中寫上:
BookType newType = getEntityManager().find(BookType.class, typeId);
instance.setType(newType);
return super.persist();
就完成了。我叫它“轉移邦定”,呵呵

Seam的解決方案:
其實Seam有另一種解決方案。比如如果你是自動生成代碼的方式,在BookEdit.xhtml中就會看到這樣的代碼:
<div class="association" id="bookTypeParent">
    
        
<h:outputText value="There is no bookType associated with this book." 
                   rendered
="#{bookHome.instance.bookType == null}"/>
        
        
<rich:dataTable var="bookType" 
                   value
="#{bookHome.instance.bookType}" 
                rendered
="#{bookHome.instance.bookType != null}"
              rowClasses
="rvgRowOne,rvgRowTwo"
                      id
="bookTypeTable">
            
<h:column>
                
<f:facet name="header">typeId</f:facet>
                #{bookType.typeId}
            
</h:column>
            
<h:column>
                
<f:facet name="header">bookType typeId</f:facet>
                #{bookType.bookType.typeId}
            
</h:column>
            
<h:column>
                
<f:facet name="header">typeName</f:facet>
                #{bookType.typeName}
            
</h:column>
            
<h:column>
                
<f:facet name="header">action</f:facet>
                
<s:link view="/BookType.xhtml" 
                         id
="viewbookType" 
                      value
="View" 
                propagation
="none">
                    
<f:param name="bookTypeTypeId" 
                           value
="#{bookType.typeId}"/>
                
</s:link>
            
</h:column>
        
</rich:dataTable>

        
<div class="actionButtons">
            
<s:button value="Select bookType"
                       view
="/BookTypeList.xhtml">
                
<f:param name="from" value="BookEdit"/>
            
</s:button>
        
</div>
        
    
</div>
點擊“Select bookType”頁面就自動跳轉到BookTypeList頁面,列出所有的類型,每個類型后面都有一個select連接,點擊這個連接就可選中這個類型。然后回到BookEdit.xhtml。很Seam很強大吧,呵呵。其實為何這樣能完成一個選擇都是在BookEdit.page.xml里配置的。配置大概如下:
   <begin-conversation join="true"/>
   
   
<action execute="#{bookHome.wire}"/>
   
   
<param name="bookFrom"/>
   
<param name="bookBookId" value="#{bookHome.bookBookId}"/>
   
<param name="bookTypeFrom"/>
   
<param name="bookTypeTypeId" value="#{bookTypeHome.bookTypeTypeId}"/>
 <begin-conversation join="true"/>  :開始一個conversation(我暫稱之為“頁面流”),如果已存在,就加入。而不重新創建。
<action execute="#{bookHome.wire}"/>  :一最重要的這個。如果沒有執行這個方法這段跳轉就沒有任何效果了。,先來看下這個方法是怎么寫的吧:

public void wire() {
        getInstance();
//獲取instance,放在這里是為了加在instance
        BookType bookType = bookTypeHome.getDefinedInstance();//獲取類型。
        if (bookType != null) {//如果選擇的類型不為null
            getInstance().setBookType(bookType);//設置書籍類型
        }
    }

那bookTypeHome從哪來的呢?天上掉下的?呵呵,當然不是。就在BookHome的上部分:
@In(create = true)
    BookTypeHome bookTypeHome;

前面我說過了。這個@In就是拿來做雙向注入的。bookTypeHome是要注入的組件名稱。
其他的都是參數了,沒啥好解釋的。
但為什么在BookTypeList頁面點select,怎么就會自動跳轉到BookEdit.xhtml呢?奧秘就在這段代碼里(BookTypeList.xhtml):
<s:link view="/#{empty from ? 'BookType' : from}.xhtml" 
                   value
="Select" 
                      id
="bookType">
                
<f:param name="bookTypeTypeId" 
                        value
="#{bookType.typeId}"/>
            
</s:link>
從BookEdit里傳來一個from。
<s:button value="Select bookType"
                       view
="/BookTypeList.xhtml">
                
<f:param name="from" value="BookEdit"/>
            
</s:button>
就告訴了BookTypeList,是從BookEdit里來的,點Select的時候就不要去其他地方了。直接回去。

好了,今天到這,困了,上面講的不明白的歡迎email或qq聯系我。。




phyeas 2008-12-24 23:02 發表評論
]]>
Seam新手實戰(3):entitieshttp://www.aygfsteel.com/phyeas/articles/247416.htmlphyeasphyeasFri, 19 Dec 2008 15:51:00 GMThttp://www.aygfsteel.com/phyeas/articles/247416.htmlhttp://www.aygfsteel.com/phyeas/comments/247416.htmlhttp://www.aygfsteel.com/phyeas/articles/247416.html#Feedback2http://www.aygfsteel.com/phyeas/comments/commentRss/247416.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/247416.html
在Seam中你有兩種方式創建你的實體對象,一是從數據庫生成,二是自己創建,再由seam幫你將對應的數據表建起來。從應用的角度來說,兩種方式沒有啥區別,但從開發的角度講,推薦使用生成的方式。因為這樣可以剩下很多敲代碼的時間。呵呵。好戲放后面,讓我們先看自己創建entity的過程。

前提是你的工程已經創建完畢(如何創建過程請看本系列《1》)。

一般實體類都放在src/model下。便于辨別那些是業務對象,哪些是數據對象(關于Seam的分層網上很多地方有說,這里就不說了)。在src/model文件夾上右鍵-》new->Seam Entity。就可以看到如下界面:

這里就只需要填寫名稱即可。解釋一下它們的意思:
                                                    Seam Project:即屬于那個工程
                                                    Seam entity class name:即這個類的名稱
                                                    Package name:屬于那個包的
                                                    Master page name:這個會自動生成的家伙是說你的列表頁面和業務動作處理(action)的名稱
                                                    Page name:這個也會自動生成,是指明細頁面的名稱和業務動作處理的名稱(兩個是相同名稱的)

隨便起個名字,點Finish,可能需要等待一段時間,這是因為Seam自動創建了一個xhtml頁面,正在試圖打開。打開這個東西需要一點時間
創建成功后。在你所選的包下就會多一個類。里面只有三個屬性:id,version,name。以我創建的User類為例:

@Entity
public class User implements Serializable {
    
    
//seam-gen attributes (you should probably edit these)
    private Long id;
    
private Integer version;
    
private String name;
    
    
//add additional entity attributes
    
    
//seam-gen attribute getters/setters with annotations (you probably should edit)
        
    @Id @GeneratedValue
    
public Long getId() {
         
return id;
    }

    
public void setId(Long id) {
         
this.id = id;
    }
    
    @Version
    
public Integer getVersion() {
         
return version;
    }

    
private void setVersion(Integer version) {
         
this.version = version;
    }       
    
    @Length(max
=20)
    
public String getName() {
         
return name;
    }

    
public void setName(String name) {
         
this.name = name;
    }       
}

這個類實現自Serializable是因為這個類需要被序列化,當遇到特殊情況時可以起寫作用。先解釋下這些注解吧。
@Entity:標注這是一個實體對象 這是JPA的標記。表明即是類名,當然,你也可以讓這兩個東西不是對應關系,在@Entity下加個@Table注解即可。比如
       @Entity
       @Table(name = "BookType", catalog = "test")

@Id 主鍵標識,為了確保對象的唯一性,建議每個entity都加一個主鍵,否則你就等著出錯吧。呵呵
@GeneratedValue  表示主鍵值為自動生成值
@Version  這個是jpa的樂觀鎖機制。有興趣了解樂觀鎖及悲觀鎖的可以看hibernate的資料,篇幅太長,這里就不介紹了。
@Length(max=20)  限制長度為最大20,這個在作驗證時有用。
恩。這個實體類就這么簡單。呵呵,你還需要其他字段就再加上去吧。。
其實到這個,整個CRUD的頁面和處理方法都寫好了。這時只要將項目部署到服務器,然后訪問列表頁面即可。忘了說了,我這里生成的頁面是userList.xhtml和user.xhtml。工程名為SeamTest。所以我要訪問http://localhost:8080/SeamTest/userList.seam,一個增刪改查就出來了哦。還有比這更快的嗎。呵呵,現在要在頁面上添加東西就照葫蘆畫瓢。Ctrl+C and Ctrl+v就出來了。如果頁面不符合規則,再調也可以,這里簡單說下seam的幫定機制,還是已我的user為例:

<h:inputText id="name" required="true"
                             value
="#{userHome.instance.name}"/>
seam 的幫定機制是根據value進行的。也就是說,無論你的id寫的是什么。這個文本框的東西最終都要賦值到name上。這就是seam的邦定機制。這樣邦定會有一個問題。等以后介紹,現在先接著看

生成entities。用數據庫表生成entities就更簡單了。在src/model文件夾上右鍵,然后選擇new->Seam Generate entities。會彈出這樣的窗口:
不用修改什么選項,直接finish就可以了。這樣entity就會生成了,就連頁面什么的都生成了。增刪改查也寫好了。呵呵,你就做下微調就可以了。這里需要注意的是,你剛剛通過Seam創建的表也被當作普通表生成到你的應用程序里。這樣如果你使用的是linux平臺,就會多一個UserList.xhtml(剛才那個是userList.xhtml)。如果是windows平臺不知道會怎么樣哦(windows文件名不分大小寫)。

可能的錯誤:有幾個網友跟我說他們生成entities時發生了錯誤。錯誤大意是找不到模板或session包。這個是由于使用的版本太新造成的。JBoss Tools3.0僅支持Seam2.0,不要使用2.1哦。過寫時候我把那個錯誤信息貼上來,供大家參考。

大概就這些了。有什么問題歡迎討論。



phyeas 2008-12-19 23:51 發表評論
]]>
Seam新手實戰(2):自動生成的代碼2-xhtml文件http://www.aygfsteel.com/phyeas/articles/246311.htmlphyeasphyeasMon, 15 Dec 2008 01:15:00 GMThttp://www.aygfsteel.com/phyeas/articles/246311.htmlhttp://www.aygfsteel.com/phyeas/comments/246311.htmlhttp://www.aygfsteel.com/phyeas/articles/246311.html#Feedback2http://www.aygfsteel.com/phyeas/comments/commentRss/246311.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/246311.html   首先看home.xhtml。

  1. <ui:composition xmlns="http://www.w3.org/1999/xhtml"
  2.                 xmlns:s="http://jboss.com/products/seam/taglib"
  3.                 xmlns:ui="http://java.sun.com/jsf/facelets"
  4.                 xmlns:f="http://java.sun.com/jsf/core"
  5.                 xmlns:h="http://java.sun.com/jsf/html"
  6.                 xmlns:rich="http://richfaces.org/rich"
  7.                 template="layout/template.xhtml">
  8. </ui:composition>

ui:composition元素:UI組件,使用這個元素做根元素表示這個頁面并不是一個完整的頁面,而是需要一個template頁面作為摸版的內容頁面。

        xmlns:根元素命名空間。就是那些不帶前綴標簽比如<div>

         xmlns:s:Seam元素的命名空間。

        template:摸版頁面

摸版頁面:

  1. <html xmlns="http://www.w3.org/1999/xhtml"
  2.       xmlns:ui="http://java.sun.com/jsf/facelets"
  3.       xmlns:h="http://java.sun.com/jsf/html"
  4.       xmlns:f="http://java.sun.com/jsf/core"
  5.       xmlns:s="http://jboss.com/products/seam/taglib">
  6. <head>
  7.     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  8.     <title>SeamTest</title>
  9.     <link href="stylesheet/theme.css" rel="stylesheet" type="text/css" />
  10. </head>
  11. <body>
  12.     <ui:include src="menu.xhtml">
  13.         <ui:param name="projectName" value="SeamTest"/>
  14.     </ui:include>
  15.     <div class="body">
  16.         <ui:insert name="body"/>
  17.     </div>
  18.     <div class="footer">
  19.         Powered by <a href="http://jboss.com/products/seam">Seam</a>.
  20.         Generated by seam-gen.
  21.     </div>
  22. </body>
  23. </html>

ui:include:與<jsp:include>差不多。但這里沒有引入jsp命名空間。所以使用<ui:include>。

<ui:insert/>:這個是一個template頁面。這個標簽表示插入一個名為body的內容塊。在內容頁面--home.xhtml--與此對應的是:<ui:define name="body"></ui:define>。在Seam-gen生成的頁面中幾乎所有的頁面都將template指向template.xhtml。還有另一種使用摸板的方式。比如layout/edit.xhtml。

  1. <ui:composition  xmlns="http://www.w3.org/1999/xhtml"
  2.                  xmlns:ui="http://java.sun.com/jsf/facelets"
  3.                  xmlns:h="http://java.sun.com/jsf/html"
  4.                  xmlns:f="http://java.sun.com/jsf/core"
  5.                  xmlns:s="http://jboss.com/products/seam/taglib">
  6.     <div class="prop">
  7.         <s:label styleClass="name #{invalid?'errors':''}">
  8.             <ui:insert name="label"/>
  9.             <s:span styleClass="required" rendered="#{required}">*</s:span>
  10.         </s:label>
  11.         <span class="value #{invalid?'errors':''}">
  12.             <s:validateAll>
  13.                 <ui:insert/>
  14.             </s:validateAll>
  15.         </span>
  16.         <span class="error">
  17.             <h:graphicImage value="/img/error.gif" rendered="#{invalid}" styleClass="errors"/>
  18.             <s:message styleClass="errors"/>
  19.         </span>
  20.     </div>
  21. </ui:composition>

 

這里依然是使用<ui:insert />作為內容頁面的插入塊。這里有兩塊<ui:insert />第一塊是有name屬性的,第二塊則是沒有name屬性的。如果沒有name屬性,表示在插入塊中沒有放在<ui:defind/》里的東西都放在沒有name的插入塊中。。。比如

  1.             <s:decorate id="nameDecoration" template="layout/edit.xhtml">
  2.                 <ui:define name="label">Name</ui:define>
  3.                 <h:inputText id="name" required="true"
  4.                              value="#{bookHome.instance.name}"/>
  5.             </s:decorate>

 

這里<ui:defind name="label">這就是定義那個有名字的插入塊。而接下來的<h:inputText ... />則是放在了下面沒有名字的<ui:insert />中。上面的代碼也展示了使用摸板的另一種方式。使用<s:decorate/>使用摸板塊,摸板頁面的根需要是一個<ui:composition>元素。s:decorate是一個seam元素。必須在seam的管理的頁面中使用。

其他:

     jsf中的form是不需要action的。比如<h:form id="login">

    標簽的rendered屬性表示在什么情況下顯示。html標簽沒有rendered屬性,比如div標簽沒有rendered。

其他的jsf標簽我們可以通過學習jsf學習。因為jsf標簽,richFaces標簽,faceslet標簽太多了。這里就不一一介紹了。。。。大家有什么好的資料也麻煩告訴我哦。



phyeas 2008-12-15 09:15 發表評論
]]>
Seam新手實戰(2):自動生成的代碼http://www.aygfsteel.com/phyeas/articles/244853.htmlphyeasphyeasTue, 09 Dec 2008 04:03:00 GMThttp://www.aygfsteel.com/phyeas/articles/244853.htmlhttp://www.aygfsteel.com/phyeas/comments/244853.htmlhttp://www.aygfsteel.com/phyeas/articles/244853.html#Feedback0http://www.aygfsteel.com/phyeas/comments/commentRss/244853.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/244853.html  創建工程后會生成一大堆代碼。基本上都是配置文件。而在做 Seam 開發的過程中是不需要整天修改配置文件的。最多寫寫pages.xml或者faces-config.xml。Seam生成的文件夾如下面的結構:

其中。build文件夾存放的是Ant編譯后的東西。
            resources文件夾里就一個文件。XXXX-ds.xml。是用于存放數據源(DataSource)配置文件的。
            src:
                        src下有兩個文件夾:action和modal。即存放頁面動作與領域模型。
                        在modal中有個META-INF文件夾,JPA的配置文件persistence.xml就存放在這個文件夾里。
                        在Modal文件夾里還有幾個值得注意的文件。
                        比如messages_en.properties和security.drl。messages_en.properties是存放系統消息的。
                        如果想讓Seam的系統消息顯示中文就需要翻譯這個文件。而security.drl則是定義安全規則的。
                        在action文件夾中。有一個包:org\domain\SeamTest\session。其中Authenticator.java會自動生成。用于做登陸驗證的。在這里簡單介紹下,先看代碼:
                        
@Name("authenticator")
public class Authenticator
{
    @Logger Log log;
    
    @In Identity identity;
   
    
public boolean authenticate()
    
{
        log.info(
"authenticating #0", identity.getUsername());
        
//write your authentication logic here,
        
//return true if the authentication was
        
//successful, false otherwise
        identity.addRole("admin");
        
return true;
    }

}

         @Name 是用于定義Seam組件。這樣定義的Seam組件可用于雙向注入和其他頁面操作。如果你沒有這個注釋。則表示這個并不是Seam組件,所以也起了一個標識Seam組件的目的。在這里Seam組件被命名為"authenticator",在頁面上要調用這個組件的authenticate方法需要這樣寫:#{authenticator.authenticate}
        @Logger用于注入日志組件
        @In        用于雙向注入。在注入時Seam會尋找當前容器中與該變量名相符的組件。當然了。也可以注入變量名不同的組件。需要指定組件名稱,例如:@In("ident")。這樣的意思就是在容器中尋找名為"ident"的組件將其注入到該類中。(Seam的作用域比較復雜,本篇暫不介紹)
        接下來便是authenticate方法,這個方法中其實最重要的是后面兩句。log.info(....)的意思即保存日志信息,最后那句意思即通過驗證。如果驗證的用戶名密碼不符合則return false;來表示拒絕登陸。比較復雜的是identity.addRole。這個方法是為當前用戶添加一個角色。單如果該方法最終返回false。那么這些添加的角色將不保存。
         那么。如何讓Seam知道當用戶登陸時調用這個方法驗證呢?在/WebContent/WEB-INF/components.xml中有這樣一段配置:
   <security:identity authenticate-method="#{authenticator.authenticate}"
                           security-rules
="#{securityRules}"
                              remember-me
="true"/>
其中authenticate-method即驗證的方法。是以組件形式調用。還有一個security-rules屬性則是安全規則。在哪里配置的?就在上面。
   <drools:rule-base name="securityRules">
       
<drools:rule-files><value>/security.drl</value></drools:rule-files>
   
</drools:rule-base>

這就是剛剛說的那個文件。
既然說到components.xml,那我們就來看下這個文件里還有些什么東西。
 <core:init debug="true" jndi-pattern="@jndiPattern@"/>
這段代碼是定義jndi查找規則的。@jndiPattern@的定義是在/src/modal/components.properties里的這樣一段配置:
#
#Fri Dec 
05 10:37:03 CST 2008
jndiPattern
=\#{ejbName}/local
embeddedEjb
=false
這段配置的意思是開啟jndi查找規則是ejb組件名稱/local。即使用本地EJB組件。而非遠程EJB組件
   <core:manager concurrent-request-timeout="500" 
                 conversation-timeout
="120000" 
                 conversation-id-parameter
="cid"
                 parent-conversation-id-parameter
="pid"/>
conversation-timeout  conversation(頁面流)過期時間。我將conversation稱為頁面流可能不太合適。可以根據你的理解去稱呼它。它是一段頁面流轉的過程定義。Seam中定義了一conversation作用域
conversation-id-parameter用于定義conversation的reuqest parameter name。即因為用戶現在在哪個頁面流中需要瀏覽器回傳一個參數才知道。
parent-conversation-id-parameter。conversation允許定義子頁面流。這個屬性定義瀏覽器回傳父conversation的參數名
   <persistence:managed-persistence-context name="entityManager"
                                     auto-create
="true"
                          entity-manager-factory
="#{SeamTestEntityManagerFactory}"/>
這個就是jpa的entityManager組件的定義了。在Seam組件中使用@In("entityManager")將會自動注入這個組件
   <event type="org.jboss.seam.security.notLoggedIn">
       
<action execute="#{redirect.captureCurrentView}"/>
   
</event>
   
<event type="org.jboss.seam.security.loginSuccessful">
       
<action execute="#{redirect.returnToCapturedView}"/>
   
</event>
這個是對于登陸用的。當客戶訪問一個頁面需要登陸。但用戶又沒有登陸。這時會轉到一個登陸頁面。登陸完畢后又轉會用戶要進入的頁面。如果有這樣的需求就要加上這兩句配置。不過Seam已經自動生成了
其他:默認生成的 face-config.xml里沒有支持中文。可以加入
    <application>
        
<view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
        
<locale-config>
            
<default-locale>en</default-locale>
            
<supported-locale>bg</supported-locale>
            
<supported-locale>de</supported-locale>
            
<supported-locale>en</supported-locale>
            
<supported-locale>fr</supported-locale>
            
<supported-locale>tr</supported-locale>
        
</locale-config>
    
</application>
代碼:
<supported-locale>zh_CN</supported-locale>


phyeas 2008-12-09 12:03 發表評論
]]>
Seam新手實戰(1):環境搭建http://www.aygfsteel.com/phyeas/articles/244502.htmlphyeasphyeasFri, 05 Dec 2008 03:21:00 GMThttp://www.aygfsteel.com/phyeas/articles/244502.htmlhttp://www.aygfsteel.com/phyeas/comments/244502.htmlhttp://www.aygfsteel.com/phyeas/articles/244502.html#Feedback2http://www.aygfsteel.com/phyeas/comments/commentRss/244502.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/244502.html  首先說下我使用的環境:JDK1.6,JBOSS4.2,JBOSS TOOLS 3.0,Eclipse with wtp3.4,JBOSS SEAM2.0
Eclipse下載地址:http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-jee-ganymede-SR1-win32.zip
JBOSS Tools下載地址:http://www.jboss.org/tools/download/index.html
其他JBOSS的東西都可以在這找到:http://www.jboss.org/download/
下載完畢后配置環境:
   JDK:這個網上大把。不說了
   Eclipse:這個就不用說了,直接解壓就可以用。
  JBossTools:如果你的環境和我的一樣,那就在dropins下新建一個文件夾。然后將解壓后的features和 plugins文件夾拷貝到里面,這樣JBoss Tools就安裝好了 。安裝完后啟動Eclipse。將視圖轉到Seam視圖下。
                                                  
   配置Seam:下載JBoss Seam后隨便解壓到一個位置。然后在Eclipse中選擇菜單:Windows->Preferences。在左邊的樹中選擇JBoss Tools->Web->Seam。在右邊會出現一個表格和一個add按鈕。點Add跳出一個窗口。點Browser選擇你剛剛解壓出來的Seam的路徑。點finish就配置好了。
  配置JBoos Server:配置JBOSS服務器。還是選擇Windows->Preferences。在左邊的樹中選擇Server->runtime Environments。add->選擇Jboss AS解壓路徑。finish。還有。。。。在工具欄中有個這個圖標。點旁邊的下拉框。選擇New Server。選擇路徑,下一步時會讓你填用戶名密碼,初始用戶名和密碼都是admin。
OK,配置好了

試下先。
將視圖轉到Seam視圖下。不會的就先看前面。然后再 File -> New -> Seam Project

需要選的地方是Configureation。默認是1.2的。選擇2.0

然后Next -> Next  -> Next -> Next到配置數據庫連接的位置
 選擇 new 一個。進入配置界面。我現在用的是sqlserver。以下以sqlserver為例:

選擇要配置的數據庫類型后填寫Name;然后Next
配置驅動,New一個 

配置Jar List后就FINISH了。

然后后面的步驟就簡單了。直接可以finish。這樣會新建兩個工程。一個是主工程。一個是測試用的。
JBoss Tools已經幫你部署到了你選擇的Jboos服務器里。
現在直接運行JBoss就OK了。如果你配置了Jboos Server。在工具欄中有個這樣的東西第一個是運行Jboss服務器,第二個是用Debug模式運行,第三個是停止。直接點綠色的箭頭。啟動時可能會報一個錯誤:java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC][SQLServer]對象名 'information_schema.system_sequences' 無效。這是因為Seam啟動時需要這個東西。單數據庫里卻沒有。。不要以為information_schema是庫名,而system_sequences是表名哦。因為就算你在數據庫里建了這樣一個庫和表也是沒用的。解決辦法是修改src/module/META-INF/下的persistence.xml。將里面的hibernate.hbm2ddl.auto設置為create-update。讓seam自己去創建對象。但又不自動刪除。不能用create-drop。因為如果用create-drop在服務器關閉時Seam會自動將它刪除。下次重新創建。而這也會秧及你的數據表。。。只要用create-update啟動一次即可。也可以只create,后面每次就可以用update了。其實可以不換成只update。用create-update也挺好。因為如果數據庫中存在該數據表。Seam就不會再重新create
如果數據庫中的表與將要創建的表結構一致。Seam就不會更新表結構
重新啟動服務器。

啟動完畢后訪問http://localhost:8080/SeamTest/home.seam
如果出現如下頁面就說明所有配置都已完成。讓我們開始Seam吧。


phyeas 2008-12-05 11:21 發表評論
]]>
[轉]Seam &lt;s:fileUpload&gt;標簽的用法http://www.aygfsteel.com/phyeas/archive/2008/11/30/243547.htmlphyeasphyeasSun, 30 Nov 2008 07:43:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/11/30/243547.htmlhttp://www.aygfsteel.com/phyeas/comments/243547.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/11/30/243547.html#Feedback0http://www.aygfsteel.com/phyeas/comments/commentRss/243547.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/243547.html 渲染一個文件上載控件。這個控件必須通過在form中使用 multipart/form-data 的編碼類型,例如:

<h:form enctype="multipart/form-data">

對于多部分請求,也必須在 web.xml 中配置Seam Multipart Servlet過濾器:

<filter>

<filter-name>Seam Filter</filter-name>

<filter-class>org.jboss.seam.servlet.SeamFilter</filter-class>

</filter>



<filter-mapping>

<filter-name>Seam Filter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

配置

下列多部分請求的配置選項可以在 components.xml 中進行配置:

  • createTempFiles — 如果這個選擇設置為true,上載好的文件就流向一個臨時文件,而不是流向內存。

  • maxRequestSize — 允許上載文件的最大字節數。

下面是一個例子:

<component class="org.jboss.seam.web.MultipartFilter">

<property name="createTempFiles">true</property>

<property name="maxRequestSize">1000000</property>

</component>

屬性

  • data — 這個值綁定接收二進制文件數據。 接收域應該聲明為一個 byte[] 或者 InputStream (必要)。

  • contentType — 這個值綁定接收文件的內容類型(可選)。

  • fileName — 這個值綁定接收的文件名(可選)。

  • fileSize — 這個值綁定接收的文件大小(可選)。

  • accept — 可以接受的一個以逗號分隔的內容類型列表,可能瀏覽器不支持。 例如 "images/png,images/jpg""images/"

  • style — 控件的樣式,即CSS之類的

  • styleClass — 控件的樣式類

用法

<s:fileUpload id="picture" data="#{register.picture}"

accept="image/png"

contentType="#{register.pictureContentType}" />



轉自:http://docs.jboss.org/seam/2.0.0.GA/reference/zh/html/controls.html



phyeas 2008-11-30 15:43 發表評論
]]>
jpa實現表自連http://www.aygfsteel.com/phyeas/archive/2008/11/30/243545.htmlphyeasphyeasSun, 30 Nov 2008 07:34:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/11/30/243545.htmlhttp://www.aygfsteel.com/phyeas/comments/243545.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/11/30/243545.html#Feedback0http://www.aygfsteel.com/phyeas/comments/commentRss/243545.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/243545.html
public class BookType  {
    
private Long id;
    
private String name;
    
    
private BookType parent;
        
//getter && setter
}
但如果這個是一個JPA類就出問題了。因為parent沒有寫注釋。在jpa自動創建表是會認為這是一個字節類型的。所以還應該為parent些上一個注釋。既然是自連。應該寫@OneToOne
這里就要注意了。OneToOne不能寫其他屬性,比如不能這樣寫
@OneToOne(targetClass=BookType.class)
這樣的話在系統自動生成數據表時會報錯。也不能加 @JoinColumn。唯一的辦法就是只要@OneToOne。其他什么都不寫。這樣就不會報錯了。
代碼如下:
public class BookType  {
    
private Long id;
    
private String name;
    
    @OneToOne
    
private BookType parent;
        
//getter && setter
}

另外:如果想不讓某個屬性不被轉換成數據庫字段。需要在此屬性的getter方法上加@Transient注釋。比如BookType的fullName屬性。
例子:
    /**
     * 獲取包括父節點名稱的全部路徑
     * 
@return
     
*/
    @Transient
    
public String getFullName(){
        StringBuffer buffer
=new StringBuffer("");
        
if(parent!=null){
            buffer.append(parent.getFullName());
            buffer.append(
"-");
        }
        buffer.append(name);
        
return buffer.toString();
    }


phyeas 2008-11-30 15:34 發表評論
]]>
Ubuntu8下構建jdk6+Tomcat+eclipse+MySQL環境http://www.aygfsteel.com/phyeas/archive/2008/11/09/239502.htmlphyeasphyeasSun, 09 Nov 2008 03:51:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/11/09/239502.htmlhttp://www.aygfsteel.com/phyeas/comments/239502.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/11/09/239502.html#Feedback0http://www.aygfsteel.com/phyeas/comments/commentRss/239502.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/239502.html 未安裝JDK的時候在命令行輸入javac將得到如下提示:

程序 'javac' 已包含在以下軟件包中:
 * java-gcj-compat-dev
 * openjdk-6-jdk
 * gcj-4.2
 * kaffe
 * ecj
 * jikes-sun
 * jikes-sablevm
 * j2sdk1.4
 * jikes-classpath
 * jikes-gij
 * gcj-4.1
 * sun-java5-jdk
 * jikes-kaffe
 * sun-java6-jdk
試試:sudo apt-get install <選定的軟件包>
bash: javac:找不到命令

。按照提示。輸入sudo apt-get install openjdk-6-jdk,在問是否繼續時輸入y。等下載安裝完畢之后javac命令便可以用了。也可以選擇其他的JDK比如sun-java6-jdk,命令sudo apt-get install sun-jdk6-jdk,其實都是一樣的。選擇合適你的即可。

Tomcat:下載一個Tomcat的版本。將其解壓到你的任意文件夾內即可。
測試:用戶abc。解壓路徑用戶文件夾下apache-tomcat-6.0.18/
啟動命令行。默認啟動命令行路徑是用戶文件夾所在路徑。
在命令行輸入:./apache-tomcat-6.0.18/bin/startup.sh
如果配置成功將出現Using CATALINA_BASE:
/home/abc/apache-tomcat-6.0.18
Using CATALINA_HOME:   /home/abc/apache-tomcat-6.0.18
Using CATALINA_TMPDIR: /home/abc/apache-tomcat-6.0.18/temp
Using JRE_HOME:       /usr
啟動瀏覽器,輸入http://localhost:8080/就可以看到可愛的貓了

Eclipse:Eclipse的安裝也可通過apt-get install執行。命令:sudo apt-get install eclipse。但個人建議還是自己下載的好。eclipse不需安裝。解壓即可運行。給出一個下載地址:
http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-jee-ganymede-SR1-linux-gtk.tar.gz
這是帶有wtp的。當然,也可以下不帶wtp的。地址在http://www.eclipse.org/downloads/
選擇一個合適的下下來。解壓到任意文件夾。
測試:雙擊eclipse文件夾內的eclipse文件。即可啟動Eclipse。

MySQL:MySQL推薦使用apt-get install安裝,命令為:
sudo apt-get install mysql-server-5.0
這是服務端的。還有客戶端。命令可想而知是sudo apt-get install mysql-client-5.0
mysql圖形界面查詢工具:sudo apt-get install mysql-query-browser
mysql圖形管理器:sudo apt-get install mysql-admin



phyeas 2008-11-09 11:51 發表評論
]]>
Seam獲取requesthttp://www.aygfsteel.com/phyeas/archive/2008/11/02/238137.htmlphyeasphyeasSat, 01 Nov 2008 17:16:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/11/02/238137.htmlhttp://www.aygfsteel.com/phyeas/comments/238137.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/11/02/238137.html#Feedback0http://www.aygfsteel.com/phyeas/comments/commentRss/238137.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/238137.html 主要方式有:通過org.jboss.web.ServletContexts.getRequest()
                :通過FaceContext.instance().getEx...Context().getRequest()
但第一種方式不知道為什么返回null。所以只好采用第二種方式



phyeas 2008-11-02 01:16 發表評論
]]>
EL表達式中的字符串與數字相加http://www.aygfsteel.com/phyeas/archive/2008/10/18/235238.htmlphyeasphyeasSat, 18 Oct 2008 15:01:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/10/18/235238.htmlhttp://www.aygfsteel.com/phyeas/comments/235238.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/10/18/235238.html#Feedback1http://www.aygfsteel.com/phyeas/comments/commentRss/235238.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/235238.html 當某字符串的值為null或""使。在EL中都會返回0
在Tomcat6.0.x中:
只有當字符串值為null時才返回0

這就導致了表達式  ${someValue + 5} 在someValue的值為""時在兩個服務器上的表現不一樣
在Tomcat6.0中會報錯,而在Tomcat5.0.x中則不會。

本人猜測應該是實行的規范不一樣導致的。在Tomcat5.0.x中實行的是Java EE1.4的規范,Tomcat6.0.x中則是Java EE1.5
所以在使用 "+" 運算符時必先清楚運算符兩邊的值



phyeas 2008-10-18 23:01 發表評論
]]>
在Ubuntu8.0下裝好JBossTools2.0后出現無法打開xhtml文件的情況http://www.aygfsteel.com/phyeas/archive/2008/10/12/233918.htmlphyeasphyeasSun, 12 Oct 2008 15:12:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/10/12/233918.htmlhttp://www.aygfsteel.com/phyeas/comments/233918.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/10/12/233918.html#Feedback0http://www.aygfsteel.com/phyeas/comments/commentRss/233918.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/233918.html......eclipse/plugins/org.mozilla.xulrunner.gtk.linux.x86_1.8.1.3-20070904/xulrunner/libjavaxpcomglue.so: libstdc++.so.5: cannot open shared object file: No such file or directory
解決辦法:sudo apt-get install libstdc++5

參考資料:http://reyjexter.blogspot.com/2008/04/jboss-tools-on-ubuntu-804.html


phyeas 2008-10-12 23:12 發表評論
]]>
一般的數據管理系統中是否有“真正的對象”?http://www.aygfsteel.com/phyeas/archive/2008/10/05/232428.htmlphyeasphyeasSat, 04 Oct 2008 16:56:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/10/05/232428.htmlhttp://www.aygfsteel.com/phyeas/comments/232428.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/10/05/232428.html#Feedback0http://www.aygfsteel.com/phyeas/comments/commentRss/232428.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/232428.html
一般在面向對象的描述中,對象被描述為有屬性有行為的
   我在用JAVA語言寫程序。但我覺得大多數時候對象總被置之一邊。我所寫的大部分都是在寫如何處理請求。處理過程,返回結果。這是明顯的面向過程。要說最 能體現我在用面向對象的語言的就是偶爾使用一下繼承,使用一下多態,來完成復雜一點的過程。僅此而已。面向對象的設計被拋到一邊。

   在一般的數據管理系統中(我所見過的)都是以數據庫為中心。然后對數據庫表進行增刪改查操作。就是所謂的CRUD。在這樣的系統中。幾乎所有的操作都是圍繞數據展開。比如一個BBS。最簡單的就是設計一個板塊表,一個用戶表,一個帖子表,一個回帖表。這樣看來系統中應存在四種對象:板塊,帖子,回帖,用戶。而這些對象有屬性。但有行為嗎?帖子,有什么行為呢?更新?自己更新自己?自己保存自己?這些在現實中看來都好像不是帖子本身應具有的行為。

   再從編碼來看。一般的編碼應該需要一個DAO來執行數據庫操作。但這個DAO是一個”真正的對象“嗎。不盡然。因為DAO本身沒有什么屬性可言的。當然了。因為它是無狀態的。它是用來進行數據庫操作的。雖然被稱為數據訪問對象。但其實并不是真正意義上的對象。只是一個過程。對。只是一個在與數據庫交互時不可避免的一個過程。

  而系統中是否真的有真正的對象。是個問題。 現在有了Hibernate,有了Spring。各個層次分工更加明確。在實體類中是沒有行為的。成了純粹的數據對象。人們通過寫那些寫了上百遍的業務代碼去實現功能。每天都在作增刪改查。。不厭其煩。。。每天寫的代碼都類似。。不能說不是個問題。。。可能只是個人感覺。。
 
  再說說剛剛BBS的例子。要真要說這個例子中有對象。我覺得應該是用戶。用戶該有行為。也有屬性。用戶可以操作其他對象。比如:
public class User{
    
private String userName;
    
//..其他屬性
    
    
public void 更新自己的帖子(帖子對象){
       
//..作更新
    }
}

這就是本系統的唯一對象了嗎?
各位看官。你們的系統都是怎么設計的?



phyeas 2008-10-05 00:56 發表評論
]]>
開源消息平臺的構想(初始階段)http://www.aygfsteel.com/phyeas/archive/2008/09/13/228814.htmlphyeasphyeasSat, 13 Sep 2008 15:55:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/09/13/228814.htmlhttp://www.aygfsteel.com/phyeas/comments/228814.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/09/13/228814.html#Feedback6http://www.aygfsteel.com/phyeas/comments/commentRss/228814.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/228814.html 今天坐車的時候突然想起。其實我們可以做這樣的東西。統一標準的開源的消息平臺。作成可支持插件的。那么開發人員就可以自己開發自己需要的插件。也可以共享出來。
再不如。需要一個遠程任務調度的插件。發送遠程命令使遠程機器執行一系列的操作。可以用插件的方式完成開發。這樣就可以不依賴于官方的實現。
我們可以開發一個開源的內核出來。就跟Linux一樣。開發內核。然后讓發行商開發出發行版本。或者內部使用版本。省去很多開發人員的麻煩。
希望大家多提提意見。這個計劃也是今天才想到的。很不成熟。各位看官別只顧著看阿



phyeas 2008-09-13 23:55 發表評論
]]>
NetBeans安裝Facelet插件失敗的原因及解決方案http://www.aygfsteel.com/phyeas/archive/2008/09/05/227328.htmlphyeasphyeasFri, 05 Sep 2008 13:52:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/09/05/227328.htmlhttp://www.aygfsteel.com/phyeas/comments/227328.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/09/05/227328.html#Feedback0http://www.aygfsteel.com/phyeas/comments/commentRss/227328.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/227328.html Missing required modules for Plugin Facelets Support:
JSP Parser [module org.netbeans.modules.web.jspparser/3 = 200805300101]
對付這種錯誤。我一般的做法就上網找資料。沒想到baidu上啥也查不到。于是抓住最后一根救命稻草。上Google。原來baidu查不到的原因是因為都所E文的資料。英文我一看就想睡覺。更別說正經地看上一會了。可是這次沒辦法。。查到一些資料。給下連接。http://blogs.sun.com/poting/entry/build_and_install_facelets_support
, http://jj-blogger.blogspot.com/2008/03/netbeans-61-beta.html?showComment=1217485920000#c2560067507997452663
在這兩個地方找到了解決方案。翻譯就免了。寫下主要的解決步驟給像我這樣一看英文就想睡覺的。。
首先下載下來的Facelet插件是一個zip文件。里面包含了Facelet Library,Facelet Support,等。我就不一一列舉了。一共四個nbm文件,其中安裝不上的所那個org-netbeans-modules-web-frameworks-facelets.nbm,這個就所Facelet Support的插件文件。也就這個文件里的內容需要修改。首先。說下。該文件其實是個解壓文件(好像地球人都知道了。呵呵),把里面的info/info.xml提取出來。搜索 "jspparser" ,它后面跟著日期。將日期該為"200807041025",然后。再從nbm文件里的netbeans/modules/提取到一個jar文件。再從jar文件中提取META-INF/MANIFEST.MF。將里面的"jspparser"跟著的日期也改成一樣的。最后將改動的文件都打包回去。安裝。大功告成。有啥不明白的以上面兩個網址的內容為準。本人英文不是很好。關于Facelet使用就要自己查拉。歡迎各位交流

補充:(竟然沒說原因。呵呵。發的時候忘記了),發生這個錯誤的原因是因為NetBeans6.0升級后。jspparser的模塊升級了。日期被改了。但是Facelet插件中依賴的插件卻沒有改。所以會導致該錯誤。其實這個改動對Facelet應該是沒影響的。 Over


phyeas 2008-09-05 21:52 發表評論
]]>
EJB3轉換錯誤(Cannot case to...)http://www.aygfsteel.com/phyeas/archive/2008/09/04/227031.htmlphyeasphyeasThu, 04 Sep 2008 10:09:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/09/04/227031.htmlhttp://www.aygfsteel.com/phyeas/comments/227031.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/09/04/227031.html#Feedback0http://www.aygfsteel.com/phyeas/comments/commentRss/227031.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/227031.html
InitialContext ctx = new InitialContext();
LocalInterface bean=(LocalInterface)ctx.lookup("bean/local");
//..執行調用
Localnterface是隨便起的。代表本地接口。根據EJB3教程上說的。在同一JVM上調用,創建InitialContext時可不用傳如Properties。檢查了N遍也不知道哪錯。于是。很無奈地復制原先的測試程序過來。竟然成功了。靠。程序如下:
Properties prop=new Properties();
prop.put(Context.PROVIDER_URL,"localhost");
InitialContext ctx 
= new InitialContext(prop);
LocalInterface bean
=(LocalInterface)ctx.lookup("bean/local");
//..執行調用
這讓我想到了傳于不傳Properties的區別。原來如果不傳Properties。它會去讀取服務器上一個叫jndi.properties的文件。該文件默認所沒有java.naming.provider.url的定義的。于是我在該文件內定義了java.naming.provider.url=localhost。第一段代碼可以運行了。
不過還是有問題。不知道如果不定義的話默認是什么。為什么默認的不行。不得而知。沒有幫助文檔。各位有資料的話請告訴我阿。


phyeas 2008-09-04 18:09 發表評論
]]>
裝了openSUSE11.0http://www.aygfsteel.com/phyeas/archive/2008/09/03/226540.htmlphyeasphyeasTue, 02 Sep 2008 17:06:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/09/03/226540.htmlhttp://www.aygfsteel.com/phyeas/comments/226540.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/09/03/226540.html#Feedback0http://www.aygfsteel.com/phyeas/comments/commentRss/226540.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/226540.html
裝完系統后遇到的第一個問題是上不了網。這可郁悶了。回想系統還是Windows時的情景。在Windows下我的網卡也要驅動才能用。并且驅動裝起來還很麻煩。于是懷疑所不是驅動的問題。插上個獨立網卡。能上網了。想上網找驅動。可是沒找到。郁悶

第二個問題就是啟動不了Eclipse3.4。郁悶。又上網查了一下。沒人能說這是怎么回事。換了個版本,Eclipse3.3。啟動成功。看來所Eclipse 的 Bug了。齊活。收工



phyeas 2008-09-03 01:06 發表評論
]]>
JAVA語音聊天程序 - 服務器的設計(二)http://www.aygfsteel.com/phyeas/archive/2008/08/15/222334.htmlphyeasphyeasFri, 15 Aug 2008 12:38:00 GMThttp://www.aygfsteel.com/phyeas/archive/2008/08/15/222334.htmlhttp://www.aygfsteel.com/phyeas/comments/222334.htmlhttp://www.aygfsteel.com/phyeas/archive/2008/08/15/222334.html#Feedback2http://www.aygfsteel.com/phyeas/comments/commentRss/222334.htmlhttp://www.aygfsteel.com/phyeas/services/trackbacks/222334.html 比如:
new byte[] { Byte.MIN_VALUE, Byte.MAX_VALUE, 0x010x01 };
表示加入一個ID未0x01的組。
廢話不多說。附上程序。

http://www.aygfsteel.com/Files/phyeas/Server.rar

內附測試。



phyeas 2008-08-15 20:38 發表評論
]]>
主站蜘蛛池模板: 平乡县| 姜堰市| 柘城县| 博乐市| 琼结县| 米林县| 蓬莱市| 阿瓦提县| 容城县| 长春市| 泸州市| 峨眉山市| 肥西县| 谷城县| 邵阳县| 咸丰县| 泸州市| 枝江市| 罗江县| 连城县| 百色市| 大余县| 巴彦淖尔市| 山阳县| 澄城县| 张家界市| 都昌县| 南皮县| 甘孜县| 休宁县| 宜川县| 十堰市| 左云县| 渝北区| 陇西县| 安庆市| 禹州市| 筠连县| 大名县| 财经| 敖汉旗|