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

原创粉丝点击