隨筆-9  評論-168  文章-266  trackbacks-0
          <h:outputText value="主題:#{index.appinfo.maxdocsum} value里不能加入HTML代碼但可以加入EL" />

          序.畫流程圖.
          一.創建數據庫.
          注:
          1.數據庫中設計INT(java.lang.Interger),  VARCHAR(N)(java.lang.String),  DATE(java.lang.Date)
          2.1:N的情況下, 數據庫中設計外鍵(N方)和集合(一方).
          2.hibernate 返向工程.

          二.添加JSF, Spring, Hibernate 庫引用.
          Spring 添加如下:



          三. 為spring 配置 web.xml 和 faces-config.xml .
          (1)web.xml
           <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/applicationContext.xml</param-value>
           </context-param>

          (2)web.xml
          <listener>
                 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
          </listener>              //Servlet API 2.3以后
          或:
           <servlet>
            <servlet-name>context</servlet-name>
            <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
           </servlet>


          (3)faces-config.xml
          <application>
          <variable-resolver>org.springframework.web.jsf.DelegatingVariableResolver</variable-resolver>
          </application>

          (4)設置過濾器,解決亂碼問題
          詳見:http://www.aygfsteel.com/algz/articles/201833.html 第二條

          以上配置完成后.JSF就可以訪問SPRING管理的BEAN.

          四.spring+hiberante集成時,asm-2.2.3.jar與asm.jar沖突:
          org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V  
          ...
          Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V

          正確的解決方法:
          是到項目的發布文件夾\WEB-INF\lib下刪除asm-2.2.3.jar,不能用MyEclipse里刪除.因為他在發布時仍沒刪除.

          五.創建進行分類的包.
          com.dao(數據訪問層), com.service(業務層), com.web(表示層)

          六.創建類.(完成MODEL層設計).   
             
          *****************************(也可以利用MyEclipse反向ORM功能自動產生,但應注意自動配置引起的"類完全名"的錯誤)*******************

            (一)數據訪問層(DAO)開發: 

                   Spring 配置文件(附加) 
                     (1)配置數據源          <bean id="dataSource" ...>      //Myeclipse Hibernate自動反轉工具自動配置
                     (2)配置會話工廠     <bean id="sessionFactory" ...>  //Myeclipse Hibernate自動反轉工具自動配置
                     (3)配置事務管理器  <bean id="transactionManager" ...>
                     (4)配置事務代理      www.aygfsteel.com/algz/articles/163236.html
                     (5)數據訪問層Bean作為屬性注入業務層Property中. (注:不要用NEW創建數據訪問層對象,否則得不到ServletContext而報錯.)
          例:
          /**數據訪問層Bean(Myeclipse Hibernate自動反轉工具配置)*/
           <bean id="userDao" class="com.data.dao.impl.UserDaoImpl">
            <property name="sessionFactory">
             <ref local="sessionFactory" />
            </property>
           </bean>

           /**業務層Bean(Myeclipse Spring配置文檔中可以配置,但需先定義好相關類)*/
           <bean id="userService" class="com.model.service.impl.UserServiceImpl">
            <property name="userDao">
             <ref bean="userDao" />
            </property>
           </bean>

                  1. 創建 數據訪問層接口:    必須創建,詳見:http://www.aygfsteel.com/algz/articles/262893.html
                      public interface 數據訪問層接口 {   //在類已存在的情況下,添加其接口:Refactor(重構)->Extract Interfaces提取接口
                          public String add...();
                          public String save...();
                            ......                                            //update, delete, load
                      }

                  2 .創建數據訪問層實現類    //ORM反向功能自動配置
                      public class 數據訪問層實現類 extends HibernateDaoSupport implements 數據訪問層接口 {
                      ......                                          //getHibernateTemplate().save(user)
                      }
                       在實現類的方法(throw DataAccessException)中封裝 getHibernateTemplate().save(user) 等Spring已封裝的持久化方法.(注:如果使用Hibernate API 要用try{...}catch{...}自行處理導常.)         

                  3.注意事項: could not initialize proxy - no Session 異常,  可能是沒有聯表查詢.詳見: http://www.aygfsteel.com/algz/articles/191835.html


          *****************************(也可以利用MyEclipse反向ORM功能自動產生)***********************************

             (二)業務邏輯層(Service)開發:
                   1.創建業務邏輯層接口
          package com.service;
          import com.dao.CheckDAO;
          public interface ICheckService {
              public abstract CheckDAO getCheckDAO();
              public abstract void setCheckDAO(CheckDAO checkDAO);
              public abstract String searchCheck();
          }

                   2.創建業務邏輯層實現類 
                       public class 業務邏輯層實現類 implements 業務邏輯層接口.
                       在實現類中. 引用的數據訪問層對象實例采用DI的設值方式注入
                                             在業務邏輯方法(throw DataAccessException)中,使用數據訪問層對象實例來訪問數據庫.  
          package com.service;
          import java.util.List;
          import org.json.simple.JSONArray;
          import org.json.simple.JSONObject;
          import com.dao.Check;
          import com.dao.CheckDAO;
          import com.dao.ICheckDAO;

          public class CheckService implements ICheckService {
          private CheckDAO checkDAO;

          public CheckDAO getCheckDAO() {
           return checkDAO;
          }

          public void setCheckDAO(CheckDAO checkDAO) {
           this.checkDAO = checkDAO;
          }

          public String searchCheck(){
           List<Check> l=checkDAO.findAll();
           JSONArray ja=new JSONArray();
           JSONObject jo=new JSONObject();
          for(Check c:l){
          //  jo.put("department", c.getDepartment());
          //  jo.put("checkid", c.getCheckid());
          //  jo.put("nam", c.getNam());
          //  jo.put("num", c.getNum());
          //  jo.put("ondutytime", c.getOndutytime());
          //  jo.put("offdutytime", c.getOffdutytime1());
          //  jo.put("registerdate", c.getRegisterdate());
          //  jo.put("overtime", c.getOvertime());
          //  ja.add(jo.clone());
          //  jo.clear();
           }
            return "";
          }

          }

                   3.數據訪問層Bean作為屬性注入業務邏輯層實現類Property中. (注:不要用NEW創建數據訪問層對象,否則得不到ServletContext而報錯.)
          例:
          /**數據訪問層Bean(Hibernate自動反轉工具自動配置)*/
           <bean id="userDao" class="com.data.dao.impl.UserDaoImpl">
            <property name="sessionFactory">
             <ref local="sessionFactory" />
            </property>
           </bean>

           /**業務邏輯層Bean(Spring配置文檔中手動配置,但需先定義好相關類)*/
           <bean id="userService" class="com.model.service.impl.UserServiceImpl">
            <property name="userDao">
             <ref bean="userDao" />
            </property>
           </bean>

             (三).表示層開發

                 (1)在 faces-config.xml 中配置托管BEAN
          .(實現控制層層設計)
                     業務層bean作為屬性注入CONTROL層中.


          package com.web;

          import com.service.ICheckService;

          public class SearchAll {
           private ICheckService searchService;
           private String searchData;

           public SearchAll() {
           }

           public ICheckService getSearchService() {
            return searchService;
           }

           public void setSearchService(ICheckService searchService) {
            this.searchService = searchService;
           }

           public String getSearchData() {
            searchData = searchService.searchCheck();
            return searchData;
           }

           public void setSearchData(String searchData) {
            this.searchData = searchData;
           }
          }


           <managed-bean>
              <managed-bean-name>userBean</managed-bean-name>
              <managed-bean-class>com.web.SearchAll</managed-bean-class>
              <managed-bean-scope>session</managed-bean-scope>
              <managed-property>
                 <property-name>searchService</property-name>
                    <value> #{userService}</value>    //直接引用spring定義的bean
              </managed-property>
              <managed-property>
                 <property-name>searchData</property-name>    //頁面中 userBean.name訪問屬性的數據
                    <value>123</value>                                      //屬性默認值
              </managed-property>
           </managed-bean>


                  (2)Bean訪問客戶端傳來的參數值
                      HttpServletRequest request=(HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
                      String s=request.getParameter("webnam");


          七.頁面設計.(實現VIEW層設計) 

          index.faces:(共二行)
          <%@ page language="java" pageEncoding="UTF-8"%>     //解決EXTJS 接收數據中有中文出現"?????"等亂碼
           ${searchAll.searchData}                                                    //解決JS接收數據.Ext.store({url:index.faces,...})


              頁面中訪問Bean的二種方法
              方法一:直接在.faces頁面中使用${userBean.property} (推薦)  //property:get/set methord
                   注,不能使用${userBean.method}

              <f:view>        //JSF標簽必須放在里面
                      名稱1: ${userBean.searchData}                              //正確
                             //#{userBean.searchData}                           //報錯
                      名稱2: <h:inputText value="#{userBean.searchData}"/>      //正確
                              //<h:inputText value="${userBean.searchData}"/>      //報錯
                              //<input value="#{userBean.searchData}"/>               //報錯
                       名稱3: <input value="${userBean.searchData}"/>               //正確,而且仍然可以使用JSF的ManagedBean
              </f:view>
          JSF表達式#{...}只能用在JSF標簽里,JSP表達式${...}也只能用JSP頁面里.
          JSP EL的語法格式:${...} 不能放在<%...%>中. 

               方法二: 在.JSP頁面中,直接獲取業務層定義的BEAN
          <%@ page import="javax.servlet.ServletContext" %>
          <%@ page import="org.springframework.context.ApplicationContext" %>
          <%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %>

          <%
          //獲取ApplicationContext對象
          ServletContext   servletContext   =   request.getSession().getServletContext();          
          ApplicationContext   ac   =   WebApplicationContextUtils.getWebApplicationContext(servletContext);

          //獲取ApplicationContext.xml文件中定義的BEAN
          userServiceps=(userService)ac.getBean("userService");

          八.導出war
                File->Export->J2EE->WAR file

          posted on 2008-04-01 14:48 紫蝶∏飛揚↗ 閱讀(2130) 評論(2)  編輯  收藏 所屬分類: JSFSpringHibernate重點

          評論:
          # re: webapps JSF+Spring+Hibernate項目開發流程 2009-04-17 05:22 | 情義
          請問一下樓主的開發環境是什么,我用myeclipse6.0整合 jsf spring hibernate時出現很多錯誤,刪除了樓主所說的有沖突的包也不行  回復  更多評論
            
          # re: webapps JSF+Spring+Hibernate項目開發流程 2009-04-17 14:50 | 紫蝶∏飛揚↗
          錯誤你要帖出來,不然么樣分析呢...  回復  更多評論
            
          主站蜘蛛池模板: 肥西县| 大洼县| 太和县| 盐城市| 固阳县| 榆中县| 莱阳市| 柯坪县| 云霄县| 刚察县| 舒兰市| 昌邑市| 清河县| 井冈山市| 临高县| 鄯善县| 天峻县| 海城市| 静安区| 阿拉善盟| 田东县| 颍上县| 华亭县| 安宁市| 涟源市| 建瓯市| 西乌| 怀集县| 雷波县| 永新县| 文山县| 会昌县| 大关县| 苏尼特左旗| 元氏县| 鄄城县| 惠来县| 山阴县| 通榆县| 新巴尔虎右旗| 商丘市|