Spring ve Primefaces
Daha önceki yazılarımda JSF ile nasıl uygulama geliştirmeye başlanılacağını anltmıştım. Bu yazı da ise konuyu bir seviye daha ileriye taşıyıp Primefaces ve Spring kullanarak nasıl JSF uygulamaları geliştirilebileceğini anlatacağım.
BildiÄŸiniz üzere Primefaces yerli üretim, JSF bileÅŸenleri kütüphanesi. JSF’ın size saÄŸladığı bileÅŸenler ne yazık ki uygulama geliÅŸtirmek için yeterli deÄŸil. Bu sebepten JSF kullanan bir çok firma beraberinde bir de bileÅŸen kütüphanesi kullanıyor. Bu zamana kadar çalıştığım yerlerde eÄŸer JSF kullanılıyorsa beraberinde Richfaces kullanılıyordu. Fakat richfaces, Primefaces gibi hızlı geliÅŸmiyor ve daha önceki yazılarımda bahsettiÄŸim gibi Jquery ve Internet Explorer gibi sorunları mevcut. Bundan dolayı eÄŸer yeni bir projeye baÅŸlayacaksanız ya da yeni yeni JSF’e geçiÅŸ yapıyorsanız ve illa da JSF yazacağım diyorsanız bileÅŸen kütüphanesi olarak mutlaka Primefaces kullanın. BaÅŸtan belirteyim, JSF Enterprise uygulama geliÅŸtirirken bir çok durumda bize kolaylık saÄŸlasa da yine de diÄŸer alternatifleri deÄŸerlendirmenizi öneririm. Rest backend’i olan bir AngularJS uygulaması çok daha fazla iÅŸinize yarayabilir. Yine de eÄŸer JSF kullanıyorsanız Prime en iyi alternatif olarak karşımıza çıkıyor. Zaten infoq sitesinde yayınlanan bir makalede de, Primefaces’ın ne kadar önde olduÄŸunu görebiliriz.
Projenin Olusturulması
Primefaces’ı biraz anlattıktan sonra artık uygulamamızı geliÅŸtirmeye baÅŸlayabiliriz. Basit bir uygulama yapacağız. Uygulamamız sadece bir nesnenin kaydedilmesi ve kaydedilen nesnelerin gösterilmesi üzerine olacak. Primefaces Showcase‘inde olduÄŸu gibi biz de Araba(Car) nesnesi üzerinden gideceÄŸiz. Spring tarafında bir araba servisi yazıp (ICarService) ön tarafta Primefaces bileÅŸenlerini kullanarak arabaları listeleyeceÄŸiz.
Projemizi Eclipse ortamında, Maven kullanarak geliştireceğiz. Geliştirdiğimiz uygulama herhangibir servlet container üzerinde çalışabilir durumda olacak. Fakat biz işimizi kolaylaştırmak için maven üzerinden jetty kullanacağız. JDK 1.7, JSF 2.2 ve Primefaces 5.0 kullanacağız.
Maven
Projeden kısaca bahsettiğimize göre Maven ile projeyi oluşturmaya başlayabiliriz. Maven ile, maven-archetype-webapp archetpye’ını kullanarak projemizi oluşturuyoruz. Benim örneği yaparken kullandığım diğer bilgiler aşağıdaki gibidir.
- Group Id: com.bahadirakin
- Artifact Id:spring-prime
Projemiz oluştuğuna göre, projemizin bağımlılılarını ekleyebilir ve nasıl build olacağını belirleyebiliriz. Bunun için spring-prime klasörünün altındaki pom.xml dosyasını aşağıdaki şekilde değiştiriyoruz.
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.bahadirakin</groupId> <artifactId>spring-prime</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>spring-prime</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.java.version>1.7</project.java.version> <!-- Versions --> <slf4j.version>1.7.5</slf4j.version> <spring.version>4.0.5.RELEASE</spring.version> <jsf.version>2.2.7</jsf.version> <prime.version>5.0</prime.version> </properties> <build> <finalName>spring-prime</finalName> <plugins> <!-- Compiler --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>${project.java.version}</source> <target>${project.java.version}</target> </configuration> </plugin> <!-- Eclipse Plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-eclipse-plugin</artifactId> <version>2.9</version> <configuration> <downloadJavadocs>true</downloadJavadocs> <downloadSources>true</downloadSources> <additionalConfig> <file> <name>.settings/org.eclipse.core.resources.prefs</name> <content><![CDATA[eclipse.preferences.version=1${line.separator}encoding/<project>=${project.build.sourceEncoding}${line.separator}]]></content> </file> </additionalConfig> </configuration> </plugin> <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>9.2.1.v20140609</version> </plugin> </plugins> </build> <dependencies> <!-- LOGGING DEPENDENCIES --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-ext</artifactId> <version>${slf4j.version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.0.13</version> </dependency> <!-- Spring Dependencies --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>${spring.version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>${spring.version}</version> </dependency> <!-- Primefaces Dependencies --> <dependency> <groupId>org.primefaces</groupId> <artifactId>primefaces</artifactId> <version>${prime.version}</version> </dependency> <!-- JSF 2 --> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-api</artifactId> <version>{jsf.version}</version> </dependency> <dependency> <groupId>com.sun.faces</groupId> <artifactId>jsf-impl</artifactId> <version>${jsf.version}</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <!-- Other dependencies --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>javax.servlet.jsp-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>javax.el</groupId> <artifactId>javax.el-api</artifactId> <version>2.2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.glassfish.web</groupId> <artifactId>javax.el</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>javax.servlet.jsp.jstl</groupId> <artifactId>jstl-api</artifactId> <version>1.2</version> <scope>provided</scope> </dependency> <!-- Test Engine Dependencies --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> </dependencies> </project> |
Ayarların Yapılması
Tüm bağımlılıklarımızı eklemiş olduk. Şimdi ise src/main/webapp/WEB-INF dosyasının altındaki web.xml dosyasının içeriğini aşağıdaki gibi değiştirelim.
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="spring-prime" version="2.5"> <display-name>spring-prime</display-name> <!-- Context params --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:applicationContext.xml</param-value> </context-param> <context-param> <param-name>javax.faces.PROJECT_STAGE</param-name> <param-value>Development</param-value> </context-param> <context-param> <param-name>javax.faces.DEFAULT_SUFFIX</param-name> <param-value>.xhtml</param-value> </context-param> <!-- Listeners --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> <listener> <listener-class>com.sun.faces.config.ConfigureListener</listener-class> </listener> <!-- Servlets --> <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> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.xhtml</welcome-file> </welcome-file-list> </web-app> |
Burada hem Spring tanımlamalarını hemde JSF tanımlamalarını yapmış olduk. Åžimdi JSF’ın son ayarlarını yapalım. Bunun için src/main/webapp/WEB-INF dosyasının altına faces-config.xml dosyasını oluÅŸturuyoruz ve içeriÄŸini aÅŸağıdaki gibi yapıyoruz.
faces-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?xml version="1.0" encoding="UTF-8"?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd" version="2.1"> <application> <el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver> <locale-config> <default-locale>tr</default-locale> <supported-locale>tr</supported-locale> </locale-config> <action-listener>org.primefaces.application.DialogActionListener</action-listener> <navigation-handler>org.primefaces.application.DialogNavigationHandler</navigation-handler> <view-handler>org.primefaces.application.DialogViewHandler</view-handler> </application> <factory> <exception-handler-factory>org.primefaces.application.exceptionhandler.PrimeExceptionHandlerFactory</exception-handler-factory> </factory> </faces-config> |
Bu dosyada dikkat etmeniz gereken kıssımlar;
- EÄŸer spring ve JSF’i birlikte kullanacaksanız, JSF kısmında da Spring’in el-resolver’ını kullanmanız yerinde olacaktır. El-resolver bildiÄŸiniz gibi xhtml sayfalarında da kullanılan #{myObj.attribute} ÅŸeklindeki yazımları yorumlayan kısımdır.
- Prime faces ile ilgil iolarak verilen exception-handler, action-listener, navigation-handler vs. hepsi opsiyoneldir. Fakat geliÅŸtirme sırasında ve sonrasında iÅŸinizi kolaylaÅŸtıracaktır. ÖrneÄŸin primefaces’ın exception handler’ını kullandığınızda hataları daha detaylı görürsünüz. Tabi kendi projenizde kendi handler’ınızı yazmanızda fayda vardır.
Spring Servislerinin Tanımlanması
Ayarlarımızı yaptığımıza göre Spring tarafında servis katmanızımızı ve modelimizi yazabiliriz. Hem web.xml içerisinde belirttiğimiz applicationContext.xml dosyamızı da daha yaratmadık. Bu sırada o dosyayıda yaratacağız. Öncelikle bahsettiğimiz Car modelimizi yaratalım. Bunun için src/main/java klasörünün altına com.bahadirakin.model paketini yaratıyoruz. Daha sonra bu paketin altına Car sınıfımızı yaratıyoruz.
Car.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | package com.bahadirakin.model; import java.io.Serializable; public class Car implements Serializable { private static final long serialVersionUID = 1L; public String id; public String brand; public int year; public String color; public int price; public Car() { } public Car(String id, String brand, int year, String color, int price) { super(); this.id = id; this.brand = brand; this.year = year; this.color = color; this.price = price; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public int getYear() { return year; } public void setYear(int year) { this.year = year; } public String getColor() { return color; } public void setColor(String color) { this.color = color; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((brand == null) ? 0 : brand.hashCode()); result = prime * result + ((color == null) ? 0 : color.hashCode()); result = prime * result + ((id == null) ? 0 : id.hashCode()); result = prime * result + price; result = prime * result + year; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Car other = (Car) obj; if (brand == null) { if (other.brand != null) return false; } else if (!brand.equals(other.brand)) return false; if (color == null) { if (other.color != null) return false; } else if (!color.equals(other.color)) return false; if (id == null) { if (other.id != null) return false; } else if (!id.equals(other.id)) return false; if (price != other.price) return false; if (year != other.year) return false; return true; } @Override public String toString() { return "Car [id=" + id + ", brand=" + brand + ", year=" + year + ", color=" + color + ", price=" + price + "]"; } } |
Bu klasik bir model nesnesi. EÄŸer arka tarafta JPA kullanıyor olsaydık, bu mdel DAO’larımız üzerinden veritabanına kaydedilecekti. Fakat biz örneÄŸimizi basitleÅŸtirmek adına sadece Servis katmanımızı yazacağız. Servis katmanımız rastgele bu nesnelerden üretip bize dönüş yapacak.
Servis katmanımız için öncelikle arayüzümüzü belirleyeceÄŸiz. Bunun için yine src/main/java klasörünün altına com.bahadirakin.service paketini oluÅŸturuyoruz. Daha sonra bu paketin altına ICarService.java interface’ini yaratıp içeriÄŸini aÅŸağıdaki gibi yapıyoruz.
ICarService.java
1 2 3 4 5 6 7 8 9 10 11 12 | package com.bahadirakin.service; import java.util.List; import com.bahadirakin.model.Car; public interface ICarService { List<Car> getAllCars(); void saveCar(final Car car); } |
Arayüzümüzü belirlediÄŸimize göre ÅŸimdi servisimizin implementasyonunu yazabiliriz. Az önce de bahsettiÄŸim gibi bu servisi destekleyen bir DAO katmanımız olmayacak. Onun yerine PrimeFaces showcase’inde yapıldığı gibi rastgele arabalar üreteceÄŸiz. Bunun için yine com.bahadirakin.service paketinin içerisine RandomCarService sınıfını oluÅŸturuyoruz ve içeriÄŸini aÅŸağıdaki gibi yapıyoruz.
RandomCarService.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | package com.bahadirakin.service; import java.util.ArrayList; import java.util.List; import java.util.UUID; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.bahadirakin.model.Car; public class RandomCarService implements ICarService { private static final Logger logger = LoggerFactory .getLogger(RandomCarService.class); private static final int RANDOM_LIST_SIZE = 25; private static final String[] COLORS = new String[] { "Black", "White", "Green", "Red", "Blue", "Orange", "Silver", "Yellow", "Brown", "Maroon" }; private static final String[] BRANDS = new String[] { "BMW", "Mercedes", "Volvo", "Audi", "Renault", "Fiat", "Volkswagen", "Honda", "Jaguar", "Ford" }; private List<Car> savedCars; public RandomCarService() { savedCars = new ArrayList<>(); } @Override public List<Car> getAllCars() { final List<Car> list = new ArrayList<Car>(); list.addAll(savedCars); for (int i = 0; i < RANDOM_LIST_SIZE; i++) { list.add(new Car(getRandomId(), getRandomBrand(), getRandomYear(), getRandomColor(), getRandomPrice())); } logger.info("Returning all the cars with size {}", list.size()); return list; } @Override public void saveCar(Car car) { car.setId(getRandomId()); savedCars.add(car); logger.info("Car is saved: {}", car); } private String getRandomId() { return UUID.randomUUID().toString().substring(0, 8); } private int getRandomYear() { return (int) (Math.random() * 50 + 1960); } private String getRandomColor() { return COLORS[(int) (Math.random() * COLORS.length)]; } private String getRandomBrand() { return BRANDS[(int) (Math.random() * BRANDS.length)]; } private int getRandomPrice() { return (int) (Math.random() * 100000); } } |
Servislerimizi oluşturduğumuza göre şimdi applicationContext.xml dosyasını oluşturup, Spring içerisinde servisimizi tanımlayabiliriz. Bunun için src/main/resources klasörünün içerisine applicationContext.xml dosyasını oluşturuyoruz ve içeriğini aşağıdaki gibi yapıyoruz.
applicationContext.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd "> <context:component-scan base-package="com.bahadirakin.webapp" /> <bean id="randomCarService" name="randomCarService" class="com.bahadirakin.service.RandomCarService" scope="singleton" /> </beans> |
Burada dikkat etmeniz gereken noktalar ise;
- RandomCarService sınıfımız xml içerisinde Bean olarak tanımlandı. Scope’u singleton olarak belirlendi. Bu da bu servis sınıfının Application boyunca bir sefer yaratılacağı anlamına geliyor.
- Ek olarak JSF tarafında oluÅŸturacağımız Bean’leri ManagedBean ÅŸeklinde deÄŸil de Spring’in Component’i ÅŸeklinde oluÅŸturacağız. Bunun için Spring’e hangi paketi kontrol etmesi gerektiÄŸini belirtiyoruz.
JSF
Bu zamana kadar spring tarafında servislerimizi oluÅŸturduk, spring’e hangi paketi taraması gerektiÄŸini söyledik, modelimizi oluÅŸturduk ve geri kalan tüm ayarlarımızı yaptık. Fakat web sayfası namına hiç birÅŸey yapmadık. Bu kısımda ise oluÅŸturduÄŸumuz servisleri kullanan bir sayfa ve bunu destekleyen bir bean yazacağız.
İşe Bean kısmını yazmakla başlayalım. Yazımızın başında da belirttiğimiz gibi tek sayfalık bir uygulama olacak. Basitçe bir Car nesnesi oluşturup kaydedeceğiz ve kaydeddiğimiz arabaları listeleyeceğiz. Önceden kayıtlı arabalarımız varmış gibi yapmak içinde rastgele araba üreten bir servis yazdık. Bunun için src/main/java klasörünün altına com.bahadirakin.webapp paketini oluşturuyoruz. Daha sonra bu paketin altına CarBean sınıfını oluşturuyoruz.
CarBean.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | package com.bahadirakin.webapp; import java.io.Serializable; import java.util.List; import javax.annotation.PostConstruct; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; import com.bahadirakin.model.Car; import com.bahadirakin.service.ICarService; @Component @Scope("request") public class CarBean implements Serializable { private static final long serialVersionUID = 1L; private static final Logger logger = LoggerFactory.getLogger(CarBean.class); @Autowired private ICarService carService; private Car car; private List<Car> cars; public CarBean() { super(); } @PostConstruct public void init() { this.car = new Car(); this.cars = carService.getAllCars(); } public void save() { logger.info("new car is going to be saved: {} ", this.car); this.carService.saveCar(car); this.init(); } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } public ICarService getCarService() { return carService; } public void setCarService(ICarService carService) { this.carService = carService; } public List<Car> getCars() { return cars; } public void setCars(List<Car> cars) { this.cars = cars; } } |
Burada dikkat etmeniz gereken kısım ise applicationContext.xml dosyası içerisinde com.bahadirakin.webapp paketinin taranacağını belirttiğimizden Autowired ve Component annotasyonlarımız başarılı bir şekilde çalışmaktadır.
Şimdi ise bu sınıfta yapılan işlemleri destekleyecek XHTML sayfasını oluşturalım. Bunun için src/main/webapp klasörünün altına index.xhtml sayfasını oluşturuyoruz.
index.xhtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui"> <h:head> </h:head> <h:body> <h:form prependId="false" id="carInputForm"> <h:panelGrid columns="2"> <h:outputLabel value="Brand: " /> <p:inputText value="#{carBean.car.brand}" /> <h:outputLabel value="Year: " /> <p:inputText value="#{carBean.car.year}" /> <h:outputLabel value="Color: " /> <p:inputText value="#{carBean.car.color}" /> <h:outputLabel value="Price: " /> <p:inputText value="#{carBean.car.price}" /> <p:commandButton value="Save" action="#{carBean.save}" partialSubmit="true" process="carInputForm" update="carInputForm,carList" /> </h:panelGrid> <p:dataTable id="carList" var="car" value="#{carBean.cars}"> <p:column headerText="Id"> <h:outputText value="#{car.id}" /> </p:column> <p:column headerText="Year"> <h:outputText value="#{car.year}" /> </p:column> <p:column headerText="Brand"> <h:outputText value="#{car.brand}" /> </p:column> <p:column headerText="Color"> <h:outputText value="#{car.color}" /> </p:column> <p:column headerText="Price"> <h:outputText value="#{car.price}" /> </p:column> </p:dataTable> </h:form> </h:body> </html> |
Son
Şimdi ise projemizin ana dizinine gelip mvn clean install jetty:run komutu ile projemizi çalıştırıyoruz. Eğer herşey düzgün şekilde ayarlandıysa http://localhost:8080 adresinden index sayfamıza erişebiliyor olmamız lazım.  Projenin kaynak kodlarına aşağıdaki adresten erişebilirsiniz.
Enf of Line