编写了一个框架:j2ee5 jsf1.2+spring2.0+hibernate3.0,采用oracle10g数据库,以tomcat5.5.35作为web容器,web.xml配置如下:
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<display-name>webItem</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<listener>
<listener-class>
org.apache.myfaces.webapp.StartupServletContextListener
</listener-class>
</listener>
</web-app>
可是点击index.jsp页面的按钮时,总是无法完成跳转,这个事情纠结了一个星期了,突然看见一篇文章说jsf1.2必须在tomcat6级以上版本上才能运行,所以把项目重新部署到 tomcat6.6.36上边,仍然是不能跳转,继续查阅资料,某些文章提到:tomcat的某些版本确实不稳定,不能完成jsf页面跳转,所以又换了几个tomcat6试试,结果终于在tomcat6.6.20能够进行跳转了。jdk用的是1.6;
但是跳转之后又有报错不能找到类com.sun.faces.taglib.jsf_core.ViewTag和javax.faces.application.ApplicationFactory,原因是这样的,项目中我采用的是myfaces实现,jsf实现方式有JSF参考实现(RI)和myfaces实现,两种方式都实现了jsf,且都具有javax.faces.application.ApplicationFactory这个类,所以产生了冲突,解决方法就是删掉jsf的参考实现jsf-api.jar和jsf-impl.jar;com.sun.faces.taglib.jsf_core.ViewTag本来是jsf-impl.jar里的类,现在删除了jsf-impl.jar自然会报找不到类,怎么解决呢?是这样的,com.sun.faces.taglib.jsf_core.ViewTag是默认的解读标签的类,在j2ee5的包中始终存在jsf-api.jar和jsf-impl.jar,即使你删除了项目中的jsf-api.jar和jsf-impl.jar也不够,现在我们还得把j2ee5里的这两个jar包也删除掉,步骤如下(我使用的是myeclipse10):windows--->preference--->MyEclipse--->java EnterPrise Project--->library sets--->j2ee5,删除掉jsf参考实现(RI),即jsf-api.jar和jsf-impl.jar,加入myfaces实现myfaces-api.jar和myfaces-impl.jar;为保险起见我还把myeclipse安装目录下的这两个jar包也替换掉了,都换成myfaces实现,路径是:C:\Program Files\MyEclipse\Common\plugins\com.genuitec.eclipse.j2eedt.core_10.0.0.me201110301321\data\libraryset\EE_5;删除掉web-inf下的class编译文件后,重新再编译一遍,ok 运行错误NoClassDefFoundError: com.sun.faces.taglib.jsf_core.ViewTag不再出现。记住:jsp页面引入标签的时候
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@taglib uri="http://myfaces.apache.org/tomahawk" prefix="t"%>
这个三个都必须引入,如果只引入前两个仍然会报NoClassDefFoundError: com.sun.faces.taglib.jsf_core.ViewTag。
项目中进行spring注入的时候,进行业务逻辑代码书写的时候,
java类
UserDaoImpl userdaoimpl;
public UserDaoImpl getUserdaoimpl() {
return userdaoimpl;
}
public void setUserdaoimpl(UserDaoImpl userdaoimpl) {
this.userdaoimpl = userdaoimpl;
}
applicationContext.xml
<bean id="userdaoimpl" class="com.test.service.UserDaoImpl">
<property name="userdao" ref="userdao"></property>
</bean>
傻呵呵的以为spring已经在我的业务类中注入了数据库操作对象直接就能拿着用呢,但是总是在报空指针异常,苦思冥想也不明白明明是spring已经注入过了,为什么就没有呢,查阅别人做的项目才发现,这些个注入对象都存在context中,你得自己去取,要不然,肯定是空的,因为业务逻辑类里头只是一个类的声明而已,还得写一个这样的类:public class managerService {
private static final ApplicationContext ctx = FacesContextUtils
.getWebApplicationContext(FacesContext.getCurrentInstance());
public static Object getBeanByname(String beanName) {
return ctx.getBean(beanName);
}
}
通过userdaoimpl=(UserDaoImpl)managerService.getBeanByname("userdaoimpl");才可以从文件中得到这个对象的。
我正在初步学习阶段,这篇文章,只是本人为了以后不忘记怎么处理此类问题而写的,希望各位大神多多批评指教!