JSF 1.2 से JSF 2.0 की ओर पलायन


136

मैं JSF 1.2 में लिखे गए एक बड़े ऐप के साथ काम कर रहा हूं । JSF 1.2 अब लगभग 6 साल पुराना है। मुझे JSF 2.0 में अपग्रेड करने की आवश्यकता है। यह कितना दर्दनाक होगा? मैंने देखा कि कस्टम टैग में कुछ विशेषताओं को बदल दिया गया है आदि।

जवाबों:


245

painfulness

JSF 1.2 से 2.0 को अपग्रेड करने की पीड़ा उस दृश्य तकनीक पर निर्भर करती है जिसका आप वर्तमान में उपयोग कर रहे हैं और जिसे आप उपयोग करना चाहते हैं।

  • JSP 2.x से JSP 2.x = लगभग कोई प्रयास नहीं।
  • फेसलेट्स 1.x से फेसलेट्स 2.0 = थोड़ा प्रयास।
  • JSP 2.x से फेसलेट्स 2.0 = बहुत प्रयास। यदि आपके पास भी कस्टम घटक हैं, तो इसे डबल करें।

बुनियादी बदलाव

दृश्य प्रौद्योगिकी स्विच के बावजूद, कम से कम निम्नलिखित कदम उठाए जाने चाहिए:

  • JSF 1.2 JAR की /WEB-INF/lib(यदि कोई हो) को हटा दें ।
  • JSF 2.0 JAR की ड्रॉप करें /WEB-INF/lib(यदि JSF 1.2 सर्वलेटक-सप्लाय किया गया, तो आप सर्व-स्तर के पुस्तकालयों से पहले वेबप लाइब्रेरी को लोड करने के लिए क्लास लोडिंग नीति को बदलना चाह सकते हैं, एप्लिकेशन सर्वरों में JSF2 क्लास लोडिंग मुद्दों को भी देखें )।
  • faces-config.xmlJSF 2.0 कल्पना का पालन करने के लिए रूट घोषणा को अपडेट करें ।

    <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_0.xsd"
        version="2.0">
    

    नोट: जब आप JSF 2.2 या नए का उपयोग कर रहे हैं, तो उपरोक्त XML स्निपेट के http://xmlns.jcp.orgबजाय नेमस्पेस डोमेन का उपयोग करें http://java.sun.com

  • सुनिश्चित करें कि web.xmlपहले से ही मूल घोषणा कम से कम सर्वलेट 2.5 का अनुपालन करती है । JSF 2.0 2.4 या उससे कम पर काम नहीं करेगा ( हालाँकि यह हैक करने योग्य है )।

    <web-app 
        xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
        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-app_2_5.xsd"
        id="YourWebappID"
        version="2.5">
    

    नोट: जब आप सर्वलेट 3.0 या नए का उपयोग कर रहे हैं, तो उपरोक्त XML स्निपेट के http://xmlns.jcp.orgबजाय नेमस्पेस डोमेन का उपयोग करें http://java.sun.com


JSP 2.x से JSP 2.x

यदि आप JSP 2.x का उपयोग कर रहे हैं और इसका उपयोग करते रहना चाहते हैं , तो आपको मूल रूप से कुछ और बदलने की आवश्यकता नहीं है।

धीरे-धीरे उन्नयन

यदि आप पहले से ही , जैसे के url-patternलिए एक प्रत्यय का उपयोग कर रहे FacesServletहैं *.jsf, तो यह जानना अच्छा है कि FacesServletइच्छाशक्ति पहले *.xhtmlफ़ाइल के लिए स्कैन करेगी और यदि यह मौजूद नहीं है, तो *.jspफ़ाइल के लिए स्कैन करें । यह आपको URL को बदलने के बिना पर्दे के पीछे धीरे-धीरे JSP से फेसलेट में बदलने के लिए कमरा प्रदान करता है।

लेकिन अगर आप एक उपसर्ग का उपयोग कर रहे हैं url-pattern, जैसे कि /faces/*और आप धीरे-धीरे JSP से फेसलेट्स में अपग्रेड करना चाहते हैं, तो आपको वास्तव में इसे बदलना होगा *.jsfऔर संभवतः मौजूदा JSP पृष्ठों के सभी लिंक भी।

आपको केवल यह ध्यान रखना होगा कि नया JSF 2.0 प्रदान किया गया निहितार्थ फ़ाइल की उपस्थिति के लिए स्कैन नहीं करता है, यह outcome.xhtmlवैसे भी जाएगा। इसलिए यदि आप इसमें से आना चाहते हैं या जाना चाहते हैं *.jsp, तो आपको अभी भी इसे JSF 1.x तरीके से व्यूइड में शामिल करना होगा।


फेसलेट्स 1.x से फेसलेट्स 2.0

यदि आप फेसलेट्स 1.x का उपयोग प्रौद्योगिकी के रूप में कर रहे हैं और JSF 2.0 आपूर्ति किए गए फेसलेट्स 2.0 का उपयोग करना चाहते हैं , तो आपको निम्नलिखित अतिरिक्त कदम करने की आवश्यकता है:

  • फेसलेट्स 1.x जार निकालें /WEB-INF/lib
  • फेसलेट्स को 1.x FaceletViewHandlerसे निकालें faces-config.xml
  • इसके बजाय FaceletViewHandlerविस्तार करने के लिए किसी भी कस्टम कार्यान्वयन को अपडेट करने की आवश्यकता है ViewHandlerWrapper
  • आवश्यक नहीं है, लेकिन केवल सफाई के लिए, किसी भी फेसलेट्स को हटा दें। 1. संबंधित <context-param>मान web.xmlजिसमें से फेसलेट्स 2.0 में पहले से ही डिफ़ॉल्ट हैं, जैसे के javax.faces.DEFAULT_SUFFIXमूल्य के साथ *.xhtml
  • फेसलेट 2.0 का अनुपालन करने के लिए मौजूदा फेसलेट टैगलिब एक्सएमएल की रूट घोषणा को अपडेट करें।

    <facelet-taglib 
        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-facelettaglibrary_2_0.xsd"
        version="2.0">
    

    नोट: जब आप JSF 2.2 या नए का उपयोग कर रहे हैं, तो उपरोक्त XML स्निपेट के http://xmlns.jcp.orgबजाय नेमस्पेस डोमेन का उपयोग करें http://java.sun.com

यह मूल रूप से होना चाहिए।


JSP 2.x से फेसलेट्स 2.0

यदि आप JSP 2.x को दृश्य तकनीक के रूप में उपयोग कर रहे हैं और आप तुरंत फेसलेट्स 2.0 में अपग्रेड करना चाहते हैं , तो साइट पर लाइव होने से पहले आपको बहुत सारे बदलाव करने होंगे। आप मूल रूप से यहाँ दृश्य तकनीक बदल रहे हैं।

मास्टर पेज बदलता है

प्रत्येक मास्टर पृष्ठ पर, आपको निम्नलिखित मूल JSP टेम्पलेट को बदलने की आवश्यकता है।

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<!DOCTYPE html>
<f:view>
    <html lang="en">
        <head>
            <title>JSP page</title>
        </head>
        <body>
            <h:outputText value="JSF components here." />
        </body>
    </html>
</f:view>

.. निम्नलिखित मूल फेसलेट्स टेम्पलेट में:

<!DOCTYPE html>
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>XHTML page</title>
    </h:head>
    <h:body>
        <h:outputText value="JSF components here." />
    </h:body>  
</html>

ध्यान दें: जब आप JSF 2.2 या नए का उपयोग कर रहे हों, तो उपरोक्त XHTML स्निपेट के http://xmlns.jcp.orgबजाय नेमस्पेस डोमेन का उपयोग करें http://java.sun.com

पृष्ठ परिवर्तन शामिल करें

यदि आपके मौजूदा JSP पेज अच्छी तरह से डिज़ाइन किए गए हैं, तो आपके पास स्क्रिप्ट कोड की कोई पंक्ति नहीं होनी चाहिए और आपके पास केवल <jsp:include>एकमात्र JSP-विशिष्ट टैग होना चाहिए । उनमें से किसी को बदलने की आवश्यकता है:

<jsp:include page="include.jsp" />

सेवा

<ui:include src="include.xhtml" />

मूल JSP में पृष्ठ का खाका शामिल है ।।

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="f" uri="http://java.sun.com/jsf/core"%>
<%@taglib prefix="h" uri="http://java.sun.com/jsf/html"%>
<f:subview id="include">
    <h:outputText value="JSF components here." />
</f:subview>

..शो में बदलकर निम्नलिखित मूल फेसलेट्स में शामिल किया जाना चाहिए:

<ui:composition
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:outputText value="JSF components here." />
</ui:composition>

ध्यान दें: जब आप JSF 2.2 या नए का उपयोग कर रहे हों, तो उपरोक्त XHTML स्निपेट के http://xmlns.jcp.orgबजाय नेमस्पेस डोमेन का उपयोग करें http://java.sun.com

कस्टम घटक बदलता है

आपको इस Mojarra माइग्रेशन गाइड में वर्णित JSP TLD फ़ाइलों को Facelets TLD फ़ाइलों में बदलने की आवश्यकता है ।


परिणाम

माइग्रेशन दृष्टिकोण के बावजूद, आप धीरे-धीरे faces-config.xmlनए JSF 2.0 एनोटेशन या CDI द्वारा समाप्त कर सकते हैं । किसी भी <managed-bean>द्वारा एनोटेट किया जा सकता है @ManagedBean:

@ManagedBean(name="managedBeanName")
@RequestScoped
public class SomeBean {}

इसके बाद @RequestScoped, वहाँ भी हैं @ViewScoped, @SessionScopedऔर @ApplicationScopedउपलब्ध हैं। यदि आप की nameविशेषता को छोड़ देते हैं @ManagedBean, तो यह 1 char के निचले स्तर के साथ classname के लिए डिफ़ॉल्ट होगा।

@ManagedBean
@RequestScoped
public class SomeBean {}

इस विशेष उदाहरण में, यह होगा #{someBean}

किसी का भी <managed-property>उपयोग करके एनोटेट किया जा सकता है @ManagedProperty:

@ManagedProperty("#{otherBean}")
private OtherBean otherBean;

किसी का भी <validator>उपयोग करके एनोटेट किया जा सकता है @FacesValidator:

@FacesValidator("someValidator")
public class SomeValidator implements Validator {}

किसी भी <converter>का उपयोग करके एनोटेट किया जा सकता है@FacesConverter

@FacesConverter("someConverter")
public class SomeConverter implements Converter {}

किसी भी <renderer>का उपयोग करके एनोटेट किया जा सकता है@FacesRenderer

@FacesRenderer(componentFamily="someComponentFamily", rendererType="someRendererType")
public class SomeRenderer extends Renderer {}

कोई भी <navigation-case>जो दोनों के रूप में एक्सएचटीएमएल पेज के फ़ाइल नाम का उपयोग करता है <from-outcome>और <to-view-id>इसे हटाया जा सकता है क्योंकि यह अंतर्निहित रूप से किया जाएगा। यह धीरे-धीरे लक्ष्य दृश्य के फ़ाइल नाम से मेल खाने के लिए सभी परिणाम मानों को बदलकर किया जा सकता है।

अंत में, किसी भी सत्र में सेम सेम, जिसे सत्र में एक ही टैब / विंडो में बाद के अनुरोधों में सेम डेटा को बनाए रखने के एकमात्र कारण के साथ रखा गया है, को बेहतर तरीके से चिह्नित किया जा सकता है @ViewScoped, क्योंकि एंड्यूसर खुलने पर इस तरह से सेम प्रभावित नहीं होगा विभिन्न टैब / विंडो में एक ही पृष्ठ।


घटक पुस्तकालयों

ध्यान दें कि मैं इस जवाब में प्राइमफेस / रिचफेसेस / आइसफेसेस जैसी किसी भी 3 पार्टी पोटेंशियल लाइब्रेरियों को नहीं लेता हूं, फिर एक विश्वसनीय उत्तर लिखना असंभव होगा क्योंकि यह मूल रूप से "यह निर्भर करता है" पर उबलता है। सामान्य तौर पर यह केवल अपने निर्देश के अनुसार, स्वयं-सत्यापित- JSF 2.0 संगत संस्करण में घटक लाइब्रेरी को अपग्रेड करने के लिए पर्याप्त है। सबसे अच्छा सिर्फ यूनिट टेस्ट लिखना है, उन्हें अपग्रेड से पहले और बाद में चलाएं और व्यक्तिगत रूप से किसी भी मुद्दे को ठीक करें।

यहाँ विशिष्ट घटक पुस्तकालय के प्रवास के संबंध में कम से कम कुछ उपयोगी लिंक दिए गए हैं:

PrimeFaces के पास PrimeFaces 1.x से 2.x के लिए माइग्रेशन गाइड नहीं है क्योंकि PrimeFaces 1.x के लिए पहले से ही फेसलेट्स 1.x की आवश्यकता है, इसलिए आपको बस फेसएक्स 1.x से 2.x माइग्रेशन चरणों का पालन करना होगा। हालाँकि, एक प्राइमफेस 2.x से 3.x (और उच्चतर) माइग्रेशन गाइड है, जो प्राइमफेस 1.x से 3.x (या उच्चतर) पर माइग्रेट करने पर भी लागू हो सकता है। टॉमहॉक का कोई माइग्रेशन गाइड भी नहीं है। मूल रूप से एकमात्र जिसे आपको बदलने की आवश्यकता है, वह JAR है और यदि आवश्यक हो तो सभी <t:saveState>अनुरोधों से छुटकारा पाने के लिए बीन के दृश्य को स्कूप किया गया।


@ मैनेज किया गया (नाम = "प्रबंधित नाम") @RestestScoped यह है :)
डैनियल सज़ाले

महान पोस्ट, मुझे बहुत मदद की। नोट करने के लिए कुछ: जब jsf 1.2 से jsf 2 पर जा रहे हैं तो आप लगभग निश्चित हो सकते हैं कि लोगों ने अमीरों से a4j का उपयोग किया है 3.3.x. मैंने jsf 2 के साथ मिलकर 3.3.3 रिचर्स का उपयोग करने का फैसला किया क्योंकि यह रिचफिशर्स 4.x में अपग्रेड करने के लिए एक औसत दर्जे के बदलाव की तरह लग रहा था। इसलिए मैं अपने गाइड किया था (सभी facelets चेहरे-config में संबंधित बातें पूर्ववत (हटा taglig एनोटेशन viewhandler सक्रिय), तो पीछा community.jboss.org/wiki/RichFaces333AndJSF20 और अंत में यह करने के लिए किया था stackoverflow.com/questions/85532/...
तोस्कान

बहुत बढ़िया जवाब। मेरे मामले में मुझे सत्यापन को हल javax.faces.VALIDATE_EMPTY_FIELDSकरने के falseलिए पैरामीटर भी सेट करना पड़ा । इसे भी देखें: stackoverflow.com/questions/6113935/…
जैस्पर डे व्रीस


1
@ चेक: मैंने लिंक को ठीक कर दिया है।
बालुसक

7

उल्लेख करने के लिए एक बात यह है कि अगर कोई JSF 1.2 के साथ JSTL का उपयोग कर रहा है, तो JSF2 में अपग्रेड करते समय आपको निम्न नामों को बदलना चाहिए:

http://java.sun.com/jstl/core

सेवा:

http://java.sun.com/jsp/jstl/core


2
नोट: यह केवल तभी लागू होता है जब आप फेसलेट्स 1.x से 2.x पर माइग्रेट कर रहे हों।
बालुस

और 2.2 और ऊपर के लिए, stackoverflow.com/questions/31068678/…
पढ़िए

6

JSF 2.0 में कई नई विशेषताएं और घटक हैं और मुझे नहीं लगता कि प्रवास दर्दनाक होगा। थ्रिल पार्टी लाइब्रेरियों का उपयोग करने में केवल आपको कठिन क्षेत्र मिलेगा। यदि आपका आवेदन रिचफेक्स जैसे पुस्तकालयों पर बहुत अधिक निर्भर है तो आपको समस्या का सामना करना पड़ेगा। रिचफेसेस 3 से सभी घटकों को रिचफेसेस 4 में नहीं रखा गया है।

यह JSF 2.0 के लिए JSF 1.2 एप्लिकेशन माइग्रेशन में भी मदद कर सकता है

यह भी जांचें कि जेएसएफ 2 में नया क्या है?


जब आप जेएसएफ 1.x के साथ रिचफेसेस का उपयोग करते हैं तो यह समान होता है- आप यह जानने के लिए सभी "दर्द" से गुजरते हैं कि जेएसएफ के साथ तीसरे पक्ष के घटकों को कैसे एकीकृत किया जाए। JSF 2.x के दृष्टिकोण में कोई अंतर नहीं है। यह प्रोग्रामिंग का "आनंद" है न? :)
चूंगपाम

4

web.xml

 Add the jars
    1. jsf-api-2.0.jar 
    2. jsf-impl.2.0.2.jar

चरण 1: बदलें 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"
            id="WebApp_ID" version="2.5">


    <servlet>
            <servlet-name>facesServlet</servlet-name>
            <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>

        <servlet-mapping>
            <servlet-name>facesServlet</servlet-name>
            <url-pattern>/faces/*</url-pattern>
        </servlet-mapping>
        <servlet-mapping>

            <servlet-name>facesServlet</servlet-name>
            <url-pattern>*.jsf</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>facesServlet</servlet-name>
            <url-pattern>*.faces</url-pattern>
        </servlet-mapping>

        <servlet-mapping>
            <servlet-name>facesServlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
        </servlet-mapping>

चरण 2: webmvc-config.xml

<!-- Handles requests mapped to the Spring Web Flow system -->
    <bean id="flowController" class="org.springframework.webflow.mvc.servlet.FlowController">
        <property name="flowExecutor" ref="flowExecutor" />
        <property name="ajaxHandler">
            <bean class="org.springframework.faces.webflow.JsfAjaxHandler" />
        </property>
</bean>

चरण 3: facess-config.xml

<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_0.xsd" version="2.0">

0

यदि आप अपाचे त्रिनिदाद का उपयोग कर रहे हैं तो आपको इसे संस्करण 2.0 में अपग्रेड करना होगा ताकि यह JSF 2.0 को सपोर्ट करे। हैकर के वल्लाह में अधिक जानकारी है ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.