[SEAM] 一年磨一剑: seam学习杂谈

netkiss.li 2009-10-19
http://hoyoba.com

我曾经加入过一些所谓的高级Seam论坛,但我看到的只是偏见,自以为是和误导。
Seam是有点难,但并非难得不可接近。学习的方法和顺序的混乱,也造成了入门的困难。

我最近一年来,做过3个seam的项目,从技术上来说,应该是可以说是略知一二了。

那么如何学习,理解seam呢?我想从我的经验来说,给出如下的建议:

1. 组件的生命周期是核心
   如果你不理解seam组件的生命周期,你就没有办法选择合适的组件来开发,尤其是在ejb的情况下,如何选择有状态,无状态的bean,是个难点。当然如果不考虑性能,你都使用有状态bean,就不会出现问题了,但事实上没人那么干的。不想多说,建议买一本《Ejb 3.0 中文版》注意封面是袋鼠图案的,国内出版的所谓入门经典,简直不堪入目

2. 熟悉jsf,和richfaces(或者icefaces等)
   jsf,如果你不开发自己的控件的话(比如利用richfaces),那么你完全可以把它当作struts tag libs来使用。

3. 搞清楚如何初始化页面:
   细粒度的框架,没有标准的入口,所以你可以采用@Factory, page.xml或者actionMethod来完成

4. 其他的兵来将挡,边做边查资料吧,满江红翻译的就不错。

5. 不要好高骛远
   常听人说:我要使用xxx高级特性,你他娘的连死活(生命周期)都搞不清楚
还搞什么高级?

http://hoyoba.com这个是我最近完成的一个实例,有兴趣,可以拿来参考一下。
Mrpublic 2009-10-20
頂一個,兄弟帮解个问题,怎么在后台方法中获取数据源的信息 如 用户与密码,uRl地址等,因为我用存储过程返回一个结果集,但在方法中 直接用
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@10.171.0.1:1521:XXXX"; 太不方便了要是数据源稍有改变就得改代码 。谢谢
netkiss.li 2009-10-20
刚好前段时间有个兄弟帮我写了段代码:
采用解析xml的方式来获取,连接信息,自己研究吧。

@Scope(ScopeType.APPLICATION)
@BypassInterceptors
@Name("catalogConfig")
@Startup
public class CatalogConfig extends ActionHome {

    private static final long serialVersionUID = -3426776881165378544L;

    private List<Catalog> catalogList;

    private List<String> catalogValueList;

    @Logger
    private Log log;

    @Create
    public void initCatalog() {
        catalogList = getCatalog();
        catalogValueList = loadCatalogList(catalogList);
    }

    public List<Catalog> getCatalogList() {
        return catalogList;
    }

    public void setCatalogList(List<Catalog> catalogList) {
        this.catalogList = catalogList;
    }

    public List<String> getCatalogValueList() {
        return catalogValueList;
    }

    public void setCatalogValueList(List<String> catalogValueList) {
        this.catalogValueList = catalogValueList;
    }

    private List<String> loadCatalogList(List<Catalog> catalogList) {

        List<String> list = new ArrayList<String>();
        for (Catalog c : catalogList) {
            list.add(c.getCatalogName());
        }

        return list;
    }

    private List<Catalog> getCatalog() {
        Document doc = getDoc();
        if (doc == null) {
            return null;
        }
        List<Catalog> catalogs = new ArrayList<Catalog>();

        int nodeCount = doc.getRootElement().nodeCount();
        Element root = doc.getRootElement();

        for (int i = 0; i < nodeCount; i++) {
            Node node = root.node(i);
            if (node instanceof Element) {
                Element e = (Element) node;
                if (e.getName().equals("persistence-unit")
                    && !e.attributeValue("name").equalsIgnoreCase("auditMonitor")) {
                    Catalog catalog = new Catalog();
                    catalog.setCatalogName(e.attributeValue("name"));

                    for (int j = 0; j < e.nodeCount(); j++) {
                        Node node1 = e.node(j);
                        if (node1 instanceof Element) {
                            Element e1 = (Element) node1;
                            if (e1.getName().equals("properties")) {
                                for (Element e2 : (List<Element>) e1.elements()) {
                                    if (e2.attributeValue("name").equals("hibernate.default_catalog")) {
                                        catalog.setDbName(e2.attributeValue("value"));
                                    } else if (e2.attributeValue("name").equals("hibernate.default_schema")) {
                                        catalog.setSchema(e2.attributeValue("value"));
                                    } else if (e2.attributeValue("name").equals(
                                        "jboss.entity.manager.factory.jndi.name")) {
                                        catalog.setFactoryJndiName(e2.attributeValue("value"));
                                    }
                                }
                            }

                        }
                    }

                    catalogs.add(catalog);
                }
            }
        }

        return catalogs;
    }

    private Document getDoc() {
        Document doc = null;
        try {
            String filePath = this.getClass().getResource("/").getPath() + "audit.jar/META-INF/persistence.xml";
            File file = new File(filePath);

            if (file.exists()) {
                FileInputStream in = new FileInputStream(file);
                SAXReader reader = new SAXReader();
                doc = reader.read(in);
            } else {
                log.info("The configuration file is not existed.");
            }
        } catch (Exception e) {
            log.error(e.getMessage());
        }

        return doc;
    }

}
Mrpublic 2009-10-20
謝謝先 有點長 慢慢看
q_wong 2009-10-20
樓主你好,小菜鳥請教個問題哈:
你這個網站是用的什麽服務器呢?
Jboss嗎?
那服務器是放在哪裡呢?
因為我之前查過一些資料,好像國內的域名空間提供主要是php和asp的,Java的很少吧,而且還都要貴一些,那用Java做web有什麽優勢呢?

還有,你這個網站是用seam做的嗎?那爲什麽url後綴都是.html,而不是.seam呢?
因為我接觸的seam工程一般使用的頁面是.xhtml,訪問時url地址里顯示是.seam 。
netkiss.li 2009-10-20
樓主你好,小菜鳥請教個問題哈:
你這個網站是用的什麽服務器呢?
Jboss嗎?
netkiss: jboss

那服務器是放在哪裡呢?
因為我之前查過一些資料,好像國內的域名空間提供主要是php和asp的,Java的很少吧,而且還都要貴一些,那用Java做web有什麽優勢呢?
netkiss: 凑份子买个刀片机,托管到机房,如果你不使用ejb的话,国内还是能找到合适的tomcat服务器的。
java做web的优势其实要看项目,java的协同性是最好的,无论是可维护性,健壮性都很好;接口复杂的项目,优势更是明显。一个人开发当然用你最熟悉的技术,那是最好了。

還有,你這個網站是用seam做的嗎?那爲什麽url後綴都是.html,而不是.seam呢?
因為我接觸的seam工程一般使用的頁面是.xhtml,訪問時url地址里顯示是.seam 。

netkiss: http://www.hoyoba.com这个站点的确使用seam做的,至于为什么看起来是html,这个使用到了seam的url重写,比如:
<rewrite pattern="/individual/download.html" />
这个主要是为了迷惑搜索引擎用的。
q_wong 2009-10-20
嗯  明白了 謝謝樓主 
Mrpublic 2009-10-21
呵呵,我用这个直接就搞定了 不需那么繁琐
HibernateSessionProxy proxy=(HibernateSessionProxy)this.getEntityManager().getDelegate();
Connection connection=proxy.connection();
jmzwcn 2009-10-21
www.ctask.com,也是用seam作的,有空可以参考参考...
netkiss.li 2009-10-21
这段代码本来是为多个数据源准备的,和繁琐业务相关,所以复杂了点
Global site tag (gtag.js) - Google Analytics