İpucu

JSF 2.3 ve Tomcat 9 ile Web Projesi Yaratmak

Burada Eclipse, JSF 2.3 ve Tomcat 9 kullanarak bir web projesi yaratıyoruz ve çalıştırıyoruz. Öncelikle JSF 2.3 için gereken bağımlıklar eklenmelidir. JSF 2.3 artık CDI gerekmesinden dolayı CDI apisi ve onun implemantasyonu olan Weld eklenmelidir :
<dependency>
	<groupId>javax.servlet</groupId>
	<artifactId>javax.servlet-api</artifactId>
	<version>4.0.0</version>
</dependency>
<dependency>
	<groupId>javax.faces</groupId>
	<artifactId>javax.faces-api</artifactId>
	<version>2.3</version>
</dependency>
<dependency>
	<groupId>org.glassfish</groupId>
	<artifactId>javax.faces</artifactId>
	<version>2.3.9</version>
</dependency>
<dependency>
	<groupId>javax.enterprise</groupId>
	<artifactId>cdi-api</artifactId>
	<version>1.2</version>
</dependency>
<dependency>
	<groupId>org.jboss.weld.servlet</groupId>
	<artifactId>weld-servlet</artifactId>
	<version>2.4.8.Final</version>
</dependency>
Ardından CDI için WEB-INF için beans.xml eklenir :
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_2_0.xsd"
	bean-discovery-mode="all" version="2.0">
</beans>
Ardından Tomcat 9 için META-INF altında context.xml eklenir :
<Context>
   <Resource name="BeanManager" 
      auth="Container"
      type="javax.enterprise.inject.spi.BeanManager"
      factory="org.jboss.weld.resources.ManagerObjectFactory"/>
</Context>
web.xml'e aşağıdaki eklenir :
<listener>
	<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
</listener>
<resource-env-ref>
	<resource-env-ref-name>BeanManager</resource-env-ref-name>
	<resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
</resource-env-ref>
web.xml'in son hali şu şekilde olmalı :
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>JSF2_3Test</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.xhtml</welcome-file> 
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.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>*.xhtml</url-pattern>
  </servlet-mapping>
  
	<listener>
		<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
	</listener>
	<resource-env-ref>
		<resource-env-ref-name>BeanManager</resource-env-ref-name>
		<resource-env-ref-type>javax.enterprise.inject.spi.BeanManager</resource-env-ref-type>
	</resource-env-ref>
	  
</web-app>
Artık ortam hazır demektir. En basit olarak aşağıdaki gibi bir index.xhtml sayfası yapalım :
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
   <head>
      <meta charset="ISO-8859-9"/>
      <title>Merhaba JSF 2.3</title>
   </head>
   <body>   
   		<h:outputText value="Merhaba JSF 2.3"></h:outputText>   
   </body>
</html>
Artık bu projeyi Tomcat 9'da çalıştırabiliriz. Bu projeyi çalıştırdığınızda aşağıdaki gibi hatalar alabilirsiniz :
Caused by: javax.faces.FacesException: Unable to find CDI BeanManager
	at com.sun.faces.application.ApplicationImpl.isJsf23(ApplicationImpl.java:2714)
	at com.sun.faces.application.ApplicationImpl.addELResolver(ApplicationImpl.java:549)
	at javax.faces.application.ApplicationWrapper.addELResolver(ApplicationWrapper.java:611)
	at org.jboss.weld.environment.servlet.jsf.WeldApplication.(WeldApplication.java:72)
	at org.jboss.weld.environment.servlet.jsf.WeldApplicationFactory.getApplication(WeldApplicationFactory.java:46)
	at com.sun.faces.application.InjectionApplicationFactory.getApplication(InjectionApplicationFactory.java:88)
	at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:153)
	at com.sun.faces.lifecycle.ClientWindowFactoryImpl.(ClientWindowFactoryImpl.java:63)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at java.lang.Class.newInstance(Class.java:442)
	at javax.faces.FactoryFinderInstance.getImplGivenPreviousImpl(FactoryFinderInstance.java:391)
	at javax.faces.FactoryFinderInstance.getImplementationInstance(FactoryFinderInstance.java:255)
	at javax.faces.FactoryFinderInstance.getFactory(FactoryFinderInstance.java:529)
	at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:292)
	at com.sun.faces.config.processor.FactoryConfigProcessor.verifyFactoriesExist(FactoryConfigProcessor.java:354)
	... 33 more
java.lang.IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory. 
	at javax.faces.FactoryFinderInstance.getFactory(FactoryFinderInstance.java:541)
	at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:292)
	at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:152)
	at com.sun.faces.config.ConfigureListener.contextDestroyed(ConfigureListener.java:367)
	at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4722)
	at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5395)
	at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:257)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:187)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
	at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:841)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384)
	at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
	at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134)
	at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909)
	at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardService.startInternal(StandardService.java:421)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930)
	at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
	at org.apache.catalina.startup.Catalina.start(Catalina.java:738)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:342)
	at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:473)
Bu durumda aşağıdaki gibi bir bean eklemek gerekir :
package com.fibiler.jsf2_3.hello;
import javax.faces.annotation.FacesConfig;
import javax.faces.annotation.FacesConfig.Version;
@FacesConfig(version = Version.JSF_2_3)
public class ConfigurationBean {
}
Bunu eklendikten sonra tomcat 9'u çalıştırırsanız hata gelmeyecektir. Hatanız sebebi projenizde bir bean olmamasıdır. Yukarıdaki ConfigurationBean'i eklemek yerine aşağıdaki gibi bir bean yapıp onu kullanalım:
import javax.inject.Named;
@Named
public class HelloBean {
	
	private String message="Merhaba JSF 2.3";
	
	public String getMessage() {
		return message;
	}
	public void setMessage(String message) {
		this.message = message;
	}
}
Sayfa şu şekilde olacak :
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html">
   <head>
      <meta charset="ISO-8859-9"/>
      <title>Merhaba JSF 2.3</title>
   </head>
   <body>   
   		<h:outputText value="#{helloBean.message}"></h:outputText>   
   </body>
</html>
Artık proje hata vermeyecektir. .
zafer.teker , 10.07.2020

Bu Sayfayı Paylaş:

Fibiler Üyelerinin Yorumları


Tüm üyeler içeriklere yorum ekleyerek katkıda bulunabilir : Yorum Gir

Misafir Yorumları




Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir