JSF和Struts2同时运行在tomcat6.0中?
来源:互联网 发布:公司代理记账软件 编辑:程序博客网 时间:2024/06/06 02:25
这篇文章其实我不知道该放在哪个分类中,但由于最近看了JSF,所以就姑且把它放在JSF篇中吧。
本文除了解决我刚发现的问题之外还会提供一个简单的JSF登录程序和一个Struts2简单图书增删改的程序,希望对大家能够有所帮助!
JSF和Struts2作为一个作为sun主导的javaee的标准,一个作为开源社区最新最引人注意的框架,却是让人都想感受一下他们的威力。
这里废话不多说了,谈谈我今天的发现吧。
之前我曾经做过一些Struts2的例子,并且运行的非常好,从不出错。
后来又接触了JSF,这个框架曾经让我头疼了许久,因为第一个例子就调试了N久啊,最后发现了一个小秘密。
在JSF所需的jar文件主要有四个,分别是 jsf-api.jar,jstl.jar,standart.jar,以及引发我混乱的jsf-impl.jar:
在一个JSF应用中,他的web-inf/lib下存放的是我刚才列举的四个jar文件以及一些commons组件,当然tomcat的lib目录下没有变化啦!但是在我调程序的时候页面总是报错,无法显示,起初我还以为是tomcat的问题,但是检查后却发现与其无关,后来我就JSF所需要的jar文件一个一个的向tomcat的lib中添加并且调试,最终发现是jsf-impl.jar在作怪,如果这个文件不放在tomcat的lib目录下JSF就会出错如下:
type Exception report
message
description The server encountered an internal error () that prevented it from fulfilling this request.
exception
javax.servlet.ServletException: Servlet.init() for servlet Faces Servlet threw exceptionorg.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)java.lang.Thread.run(Thread.java:595)
root cause
java.lang.NullPointerExceptionjavax.faces.webapp.FacesServlet.init(FacesServlet.java:144)org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)java.lang.Thread.run(Thread.java:595)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.10 logs.
当它被放到tomcat的lib目录下的时候 ,页面就 可以正常显示了。具体原因我正在考证之中,发现后会继续向大家解释。
上面说得是JSF,下面说一下我的Struts2例子吧:
当我把一个能够正常运行的Struts2例子放入到上面所说的JSF工作环境中时,无法运行,提示该页无法找到,当我把那个jsf-impl.jar:从tomcat的lib目录中删除后,奇迹出现了,struts2的例子可以运行了!!!
所以我得出的结论就是JSF和Struts2运行环境很难同意,还有待进一步研究啊!
下面将我的JSF源码奉上:
这是一个超级简单的登录验证程序:
项目名字LoginJSF:
LoginJSF/index.jsp
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>qiudawei115</title>
</head>
<body>
<f:view locale="zh_CN">
<h:form id="loginForm">
<h:message for="userNameInput"></h:message>
<h:outputText value="#{userBean.errMessage}"></h:outputText>
<p>
<h:outputLabel for="userNameInput" >
<h:outputText id="userNameLabel" value="用户名:"></h:outputText>
</h:outputLabel>
<h:inputText id="userNameInput" value="#{userBean.userName}" required="true"></h:inputText>
</p>
<p>
<h:outputLabel for="passwordInput">
<h:outputText id="passwordLabel" value="密码:"></h:outputText>
</h:outputLabel>
<h:inputSecret id="passwordInput" value="#{userBean.password}" required="true"></h:inputSecret>
</p>
<h:commandButton id="submitButton" value="提交" action="#{userBean.checkValue}"></h:commandButton>
</h:form>
</f:view>
</body>
</html>
LoginJSF/src/qiudawei115/UserBean.java
package qiudawei115;
public class UserBean {
private String userName;
private String password;
private String errMessage;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getErrMessage() {
return errMessage;
}
public void setErrMessage(String errMessage) {
this.errMessage = errMessage;
}
public String checkValue(){
if(userName.trim().equals("qiudawei")&&password.trim().equals("851120")){
//验证成功,用户名改为大写
userName=userName.toUpperCase();
return "success";
}else{
//验证失败,设置错误信息
errMessage="用户名或者密码错误,请重新输入!";
return "failure";
}
}
}
LoginJSF/WEB-INF/web.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<display-name>JSF in Action - Hello, World!</display-name>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>/faces/index.jsp</welcome-file>
</welcome-file-list>
</web-app>
LoginJSF/WEB-INF/faces-config.xml
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
<navigation-rule>
<from-view-id>/index.jsp</from-view-id>
<navigation-case>
<from-action>#{userBean.checkValue}</from-action>
<from-outcome>success</from-outcome>
<to-view-id>/welcome.jsp</to-view-id>
</navigation-case>
<navigation-case>
<from-action>#{userBean.checkValue}</from-action>
<from-outcome>failure</from-outcome>
<to-view-id>/index.jsp</to-view-id>
</navigation-case>
</navigation-rule>
<managed-bean>
<managed-bean-name>userBean</managed-bean-name>
<managed-bean-class>qiudawei115.UserBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
</faces-config>
LoginJSF/welcome.jsp
<%@ page language="java" contentType="text/html; charset=gbk"
pageEncoding="gbk"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>qiudawei115</title>
</head>
<body>
<f:view>
<h:outputLabel for="outputUserName">
<h:outputText id="outputLabel" value="#{userBean.userName}"></h:outputText>
</h:outputLabel>
</f:view>
</body>
</html>
LoginJSF/WEB-INF/classes/qiudawei115/message_zh_CN.properties
#--基本信息--
userName=用户名:
password=密码:
submit=提交
errMessage=用户名或者密码错误,请重新输入!
LoginJSF/WEB-INF/lib目录下存放jar文件,主要有jsf-api.jar,jstl.jar,standart.jar,jsf-impl.jar,commons-beanutils.jar,commons-collections.jar,commons-digester.jar,commons-logging.jar,不要忘记了好了这样就部署了一个简单的JSF登录程序了。如果无法运行不要忘记了把jsf-impl.jar添加到tomcat的llib目录中,然后重启tomcat,在浏览器输入http://localhost:8080/LoginJSF/faces/index.jsp就可以看大登录界面了输入qiudawei,851120后会转到welcome.jsp页面,显示QIUDAWEI,J就算是成功了。
到此为止
另外还有一个Struts2简单图书增删改的程序由于时间问题我就不写了,如果有需要的可以和我联系qiuyin_1985@126.com
- JSF和Struts2同时运行在tomcat6.0中?
- 在Struts2应用中使用JSF插件
- Jbpm运行在Tomcat6.0出现问题
- JSF 2.0检验总结之:同一个JBOSS 5.1.0 jsf 2.0(for primefaces) +JSF 1.2 同时运行的总结
- 在SSH jdk6.0 Tomcat6.0环境中使用CXF 运行时报错
- 在Eclipse中运行Tomcat6源代码,保证正确的classpath
- 在Eclipse中运行Tomcat6源代码,保证正确的classpath
- struts2和servlet可同时运行的方法
- Myeclipse7.0+tomcat6+jsf+Hibernate3.2配置
- TOMCAT6.0安装运行
- Tomcat6.0安装、运行
- 关于在VC++6.0中同时有多个main()文件时如何实现执行编译和运行
- 在虚拟机中安装tomcat6.0
- windows7下同时启动tomcat6和tomcat7
- TOMCAT6.0 问题解决汇总(struts2相关) ——不断更新中
- Tomcat中如何运行JSF
- 配置连接池---tomcat6.0 和 在java代码中书写连接池
- 如何保证同时只有一个程序在系统中运行
- 内表使用方法总结之一----定义
- 不要忧虑
- Spring Rich Client Databinding !?
- SQL学习笔记
- 具有打印功能的 Listview 类(C#)
- JSF和Struts2同时运行在tomcat6.0中?
- 什么是RSS?
- log4j配置问题,xml格式的
- Java 和 C#中的线程比较
- Form使用内表作为参数的方法
- log4j详细配置说明(转载)
- 每个.Net开发人员应该下载的十种必备工具
- SqlDataAdapter简单介绍
- SqlHelper For Visual C++