java - Google मानचित्र पर मार्कर कैसे रखें




google-maps jsf-2 primefaces (2)

समस्या 1: मार्कर लगाए जाने के बाद, इसे फिर से नहीं रखा जा सकता है।

यह समस्या निम्न चीजों के कारण होती है:

  1. आपने नक्शा मॉडल ( MapBean ) MapBean वाले बीन की तुलना में एक अलग बीन ( NewOfferSupportController ) के अक्षांश और देशांतर को बाध्य किया है। आपको NewOfferSupportController बीन के लिए डिज़ाइन प्रारंभ बिंदु के रूप में प्राइमफेस शोकेस में MapBean उदाहरण का उपयोग करना चाहिए। यह मार्कर सेट स्टोर करता है। छुपा इनपुट उस बीन को इंगित करना चाहिए क्योंकि addMarker() विधि में उन मानों को जोड़ा जाएगा। शोकेस उदाहरण से आपको सिर्फ MapBean क्लास नाम का नाम बदलना होगा और #{mapBean} द्वारा दृश्य में #{mapBean} संदर्भों का नाम बदलना होगा।

  2. आपका NewOfferSupportController बीन अनुरोध किया गया है, जबकि इसे NewOfferSupportController देखना चाहिए।

    @ManagedBean
    @ViewScoped
    public class NewOfferSupportController implements Serializable {}
    

    जब तक आप अजाक्स द्वारा उसी फॉर्म के साथ बातचीत कर रहे हों तब तक स्कोप्ड बीन्स लाइव रहें। लेकिन प्रत्येक अनुरोध (और इस प्रकार हर अजाक्स अनुरोध पर भी!

समस्या 2: उसी रूप में जहां मानचित्र है वहां कुछ अन्य तत्व हैं जैसे टेक्स्ट फ़ील्ड। असल में फॉर्म बिल्कुल सबमिट नहीं किया जाता है (यह नक्शा जोड़ने से पहले नहीं हुआ था), नक्शा सत्यापन को बाधित क्यों कर रहा है?

यह मेरे लिए काम करता है। ऐसा संभवतः कारण है क्योंकि आपके NewOfferSupportController को दृश्य दायरे के बजाय अनुरोध दायरे में रखा गया है।

संक्षेप में, यहां वह कोड है जिसका मैंने अपने परीक्षण में उपयोग किया था:

राय:

<p:growl id="messages" showDetail="true" />  

<h:form>
    <p:gmap id="gmap" center="36.890257,30.707417" zoom="13" type="HYBRID" style="width:600px;height:400px"  
        model="#{mapBean.mapModel}" onPointClick="handlePointClick(event);" widgetVar="map" />
    <h:inputText value="#{mapBean.input}" required="true" />
    <p:commandButton value="submit" action="#{mapBean.submit}" update="messages" />
</h:form>

<p:dialog widgetVar="dlg" effect="FADE" effectDuration="0.5" close="false" fixedCenter="true">  
    <h:form prependId="false">  
        <h:panelGrid columns="2">  
            <h:outputLabel for="title" value="Title:" />  
            <p:inputText id="title" value="#{mapBean.title}" />  

            <f:facet name="footer">  
                <p:commandButton value="Add" actionListener="#{mapBean.addMarker}"   
                    update="messages" oncomplete="markerAddComplete()"/>  
                <p:commandButton value="Cancel" onclick="return cancel()"/>  
            </f:facet>
        </h:panelGrid>

        <h:inputHidden id="lat" value="#{mapBean.lat}" />  
        <h:inputHidden id="lng" value="#{mapBean.lng}" />
    </h:form>  
</p:dialog>  

(मैंने शोकेस उदाहरण में <script> कोड नहीं बदला है, बस इसे अपरिवर्तित जोड़ें)

सेम:

@ManagedBean
@ViewScoped
public class MapBean implements Serializable {  

    private MapModel mapModel;  
    private String title;  
    private double lat;  
    private double lng;  
    private String input;

    public MapBean() {  
        mapModel = new DefaultMapModel();  
    }  

    public void addMarker(ActionEvent actionEvent) {  
        mapModel.addOverlay(new Marker(new LatLng(lat, lng), title));  
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Marker Added", "Lat:" + lat + ", Lng:" + lng));  
    }  

    public void submit() {
        addMessage(new FacesMessage(FacesMessage.SEVERITY_INFO, "Form submitted", "Amount markers: " + mapModel.getMarkers().size() + ", Input: " + input));
    }

    public void addMessage(FacesMessage message) {  
        FacesContext.getCurrentInstance().addMessage(null, message);  
    }  

    // Getters+setters.
}

मैं primefaces से Google मानचित्र टूल का उपयोग करता primefaces । मैं चाहता हूं कि मेरा उपयोगकर्ता मानचित्र पर केवल एक मार्कर लगाने में सक्षम हो। निर्देशांक के मान एक प्रबंधित बीन चर में संग्रहीत किया जाना चाहिए।

मैं उसे कैसे कर सकता हूँ? देखें कि मैंने अब तक क्या किया है:

मैंने नक्शा बनाया:

    <f:view contentType="text/html">
            <p:gmap id="gmap" center="36.890257,30.707417" zoom="13" type="HYBRID"   
    style="width:600px;height:400px"  
    model="#{mapBean.emptyModel}"   
    onPointClick="handlePointClick(event);"   
    widgetVar="map" />  </f:view>

<p:dialog widgetVar="dlg" effect="FADE" effectDuration="0.5" close="false" fixedCenter="true">  
    <h:form prependId="false">  
        <h:panelGrid columns="2">  
            <h:outputLabel for="title" value="Title:" />  
            <p:inputText id="title" value="#{mapBean.title}" />  

            <f:facet name="footer">  
                <p:commandButton value="Add"   
                        actionListener="#{mapBean.addMarker}"   
                        update="messages"   
                        oncomplete="markerAddComplete()"/>  
                <p:commandButton value="Cancel" onclick="return cancel()"/>  
            </f:facet>  
        </h:panelGrid>  

        <h:inputHidden id="lat" value="#{newOfferSupportController.mapLocationX}" />  
        <h:inputHidden id="lng" value="#{newOfferSupportController.mapLocationY}" />  
    </h:form>  
</p:dialog>  

<script type="text/javascript">  
    var currentMarker = null;  

    function handlePointClick(event) {  
        if(currentMarker == null) {  
            document.getElementById('lat').value = event.latLng.lat();  
            document.getElementById('lng').value = event.latLng.lng();  

            currentMarker = new google.maps.Marker({  
                position:new google.maps.LatLng(event.latLng.lat(), event.latLng.lng())  
            });  

            map.addOverlay(currentMarker);  

            dlg.show();  
        }     
    }  

    function markerAddComplete() {  
        var title = document.getElementById('title');  
        currentMarker.setTitle(title.value);  
        title.value = "";  

        currentMarker = null;  
        dlg.hide();  
    }  

    function cancel() {  
        dlg.hide();  
        currentMarker.setMap(null);  
        currentMarker = null;  

        return false;  
    }  
</script>

मैंने उन चरों को भी सराहना की जो निर्देशांक धारण करेंगे:

@ManagedBean
@RequestScoped
public class NewOfferSupportController {

private float mapLocationX;
private float mapLocationY;

//Get & set methods

यह सब प्राइमफेस page रूप में काम करता है लेकिन मुझे 2 समस्याएं हैं:

समस्या 1: मार्कर लगाए जाने के बाद, इसे फिर से नहीं रखा जा सकता है।

समस्या 2: उसी रूप में जहां मानचित्र है वहां कुछ अन्य तत्व हैं जैसे टेक्स्ट फ़ील्ड। मैंने देखा कि सत्यापन तब नहीं होता है जब मैं उस फॉर्म में स्थित सबमिट बटन पर क्लिक करता हूं जहां नक्शा है, असल में फॉर्म बिल्कुल सबमिट नहीं होता है (यह नक्शा जोड़ने से पहले नहीं हुआ था), नक्शा बाधित क्यों है सत्यापन?


अनुरोध विधि getRequestDispatcher() का उपयोग एकल वेबपैप के भीतर स्थानीय सर्वलेट को संदर्भित करने के लिए किया जा सकता है।

सर्वलेट संदर्भ आधारित getRequestDispatcher() विधि SAME सर्वर पर तैनात अन्य वेब अनुप्रयोगों से संदर्भित सर्लेट का उपयोग कर सकते हैं।







java google-maps jsf-2 primefaces