随笔-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.blogjava.net/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.blogjava.net/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.blogjava.net/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.blogjava.net/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 紫蝶∏飛揚↗ 阅读(2114) 评论(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 | 紫蝶∏飛揚↗
错误你要帖出来,不然么样分析呢...  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: