2012-10-04 19 views
6

मैं एक index.jsp पृष्ठ जहाँ मैं एक रूप जहाँ उपयोगकर्ता है कि डेटाबेस में संग्रहीत हो जाता है एक नियंत्रक सर्वलेट का उपयोग कर कुछ डेटा में प्रवेश करती है है है।रीफ्रेश करते समय डुप्लिकेट प्रविष्टियों को कैसे रोकें?

मैं डेटाबेस में डेटा दर्ज करने के बाद कि फार्म के साथ एक ही पृष्ठ (index.jsp) प्रदर्शित करना चाहते हैं। साथ ही, मैं डेटाबेस में दर्ज की गई सभी प्रविष्टियों को प्रदर्शित करना चाहता हूं।

मैंने forward()RequestDispatcher विधि का उपयोग करने का प्रयास किया। यह ठीक काम करता है (जिसका अर्थ है कि मैं उसी फॉर्म को फिर से प्रदर्शित करने में सक्षम हूं और जेएसटीएल का उपयोग कर उस उपयोगकर्ता द्वारा दर्ज किए गए सभी डेटा को भी प्रदर्शित कर सकता हूं)।

लेकिन जब भी उपयोगकर्ता Refresh or F5 बटन दबाता है तो समस्या तब होती है जब सभी पिछले डेटा डेटाबेस में भी प्रवेश करते हैं और जैसा कि मैं सभी डेटा प्रदर्शित कर रहा हूं, और वह डुप्लिकेट प्रविष्टियां भी आती हैं।

मैंने पोस्ट-रेडियरेक्ट-जीईटी पैटर्न का उपयोग करने के बारे में सोचा, लेकिन समस्या तब होती है जब मैं रीडायरेक्ट करता हूं, मुझे जेएसटीएल का उपयोग करके उन डेटा को प्रदर्शित नहीं किया जाता है।

मैं इसे कैसे कर सकता हूं?

उत्तर

9

मैं का उपयोग कर के बारे में सोचा (और तुम अब names सूची मेरा पहला जवाब में पहले शुरू की जरूरत है) पैटर्न बाद अनुप्रेषित-प्राप्त लेकिन समस्या यह है कि जब मैं अनुप्रेषित मैं उन डेटा प्रदर्शित करने के लिए नहीं मिलता है जेएसटीएल का उपयोग करना

अपनी वांछित जानकारी नई GET अनुरोध में प्रदर्शित करना चाहते हैं की पहचान करने के साथ एक अनुरोध पैरामीटर भेजें।

// ... 
Long id = dataService.save(data); 
// ... 
response.sendRedirect(request.getContextPath() + "/index?editId=" + id); 

और फिर servlet जिनमें से /index

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    Long editId = Long.valueOf(request.getParameter("editId")); // Handle nullcheck yourself. 
    Data editData = dataService.find(editId); 
    request.setAttribute("editData", editData); // For the edit form. 
    List<Data> allData = dataService.list(); 
    request.setAttribute("allData", allData); // For the table/list of all data. 
    request.getRequestDispatcher("/index.jsp").forward(request, response); 
} 
+0

धन्यवाद बैलस मुझे लगता है कि यह एक अच्छा समाधान है, मैं निश्चित रूप से यह कोशिश करूँगा और आपको बता दूंगा। – Abubakkar

+0

यह पूरी तरह से काम करता है! – Abubakkar

+0

आपका स्वागत है। – BalusC

5

मैं पृष्ठ के लिए एक अदृश्य आईडी जोड़ना होगा। यदि डेटा डेटाबेस (आईडी = अज्ञात) के लिए नया है, तो आईडी डालें और बनाएं और आईडी के साथ पृष्ठ अपडेट करें। इस तरह आप जानते हैं कि यह एक आईडी है! = अज्ञात, और आपको कोई सम्मिलित करने की आवश्यकता नहीं है। और अगर डेटा नहीं बदला है, तो आप भी एक अद्यतन करने के लिए नहीं है ...

+0

क्या आप कृपया बेहतर तरीके से इंगित कर सकते हैं या सुझाव दे सकते हैं – Abubakkar

+0

मुझे डर है, मुझे servlets के साथ अनुभव नहीं है। मैंने जो लिखा वह एक सामान्य परिदृश्य था जिसे मैं सादे पुराने जावा और डेटाबेस का उपयोग कर सामना कर रहा हूं। मुझे लगता है कि आप उस दृष्टिकोण को अपना सकते हैं। मैं जो नहीं बता सकता वह यह है कि अगर सर्वलेट तकनीक में आपके लिए यह कुछ अंतर्निहित सुविधा है। – Fildor

+1

फिल्डर का सुझाव यह करने का तरीका है। एक छिपे हुए क्षेत्र में पृष्ठ में अपने रिकॉर्ड की डेटाबेस आईडी शामिल करें। यदि उपयोगकर्ता ने डेटा जमा नहीं किया है, तो यह -1 या 0 होना चाहिए। जब ​​आप डेटा डालने के अनुरोध को संसाधित करते हैं तो नई डाली गई पंक्ति का डेटाबेस आईडी प्राप्त करें और अगली बार पृष्ठ में शामिल करें। यदि उपयोगकर्ता फॉर्म सबमिट करता है तो विवरण अपडेट करने के लिए आईडी का उपयोग करें, जो वे उम्मीद करेंगे। बीटीडब्ल्यू, एक पोस्ट का उपयोग अपने फॉर्म में प्राप्त न करें - उपयोगकर्ता को तब सतर्क किया जाएगा कि डेटा रीफ्रेश होने पर पुनः सबमिट किया जाएगा। –

0

यहाँ सरल समाधान

<%@page import="java.util.*"%> 
<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 

<%! 
//This List is just for demonstration purposes 
List<String> names = new ArrayList<String>(); 
%> 
<% 
if(request.getParameter("name")!=null){ 
    names.add(request.getParameter("name")); 
    session.setAttribute("nameList", names); 
    //Here you put your database insert code 

    //Whenever the code execution reaches this line , 
    //then it means that you have a new page submission 
    //and not a refresh or f5 case 

    response.sendRedirect("index.jsp"); 
} 
%> 

<!DOCTYPE html> 
<html> 
    <head> 
    </head> 
    <body> 
     <form action="index.jsp" method="post"> 
      <input type="text" id="name" name="name"/> 
     </form> 
     <p> 
      <table> 
       <c:forEach items="${nameList}" var="element">  
        <tr> 
         <td>Name: <c:out value="${element}"/> </td> 
        </tr> 
       </c:forEach> 
      </table> 
     </p> 
    </body> 
</html> 

चाल response.sendRedirect("index.jsp"); के साथ निहित है। यह null सभी अनुरोध पैरामीटर बनाता है। एक f5 या refresh मारा जाता है, तो if कभी नहीं मार डाला जाता है। यदि सामान्य सबमिट मामला है, तो if निष्पादित किया गया है और आप response.sendRedirect("index.jsp"); पर कॉल करते हैं।

सारांश में, तुम सब वास्तव में क्या करने की जरूरत है:

1) if(request.getParameter("name")!=null)

2 की जाँच करें) यदि उपरोक्त तो डेटाबेस कर सच है सम्मिलित करता

3) यदि उपरोक्त तो सच है response.sendRedirect("index.jsp");

अद्यतन

if(request.getParameter("name")!=null){ 
    DbUtility.addNameToDb(request.getParameter("name")); 
    ArrayList<String> currentList = DbUtility.getAllNamesFromDb(); 
    session.setAttribute("nameList", currentList); 
    response.sendRedirect("index.jsp"); 
} 

आपको इन 2 विधियों को लागू करना होगा। addNameToDb(String) आपके डेटाबेस में insert बनाएगा। और getAllNamesFromDb() एक ArrayList<String> ऑब्जेक्ट लौटाएगा जो आपके डेटाबेस से प्रविष्टियों पर प्रदर्शित होगा।

+0

आपके उत्तर के लिए हाय धन्यवाद, लेकिन मैं डेटाबेस में प्रविष्टियां भी जोड़ना चाहता हूं। मैं क्या करना चाहता हूं मान लीजिए कि मैंने डेटाबेस में फॉर्म का उपयोग करके 1 प्रविष्टि बनाई है, तो मेरी सभी प्रविष्टियां (मान लें कि प्राथमिक कुंजी है) होना चाहिए मैंने उसी फॉर्म के नीचे प्रदर्शित किया जो मैंने उपयोग किया था। यह अभी के लिए ठीक दिख रहा है लेकिन जब मैं ताज़ा करता हूं तो मुझे डुप्लिकेट प्रविष्टियां भी मिलती हैं। – Abubakkar

+0

तर्क पर मेरा अद्यतन देखें – MaVRoSCy

+0

मैं इसे आज़माउंगा लेकिन मैं अपने डेटा को संग्रहीत करने के लिए 'सत्र' स्कोप का उपयोग नहीं करना चाहता हूं, इसे 'अनुरोध' दायरे में होना आवश्यक है। – Abubakkar

0

मुझे लगता है कि PRGP (पोस्ट रीडायरेक्ट पैटर्न जाओ) एक URL पैटर्न पर मैप किया गया है में इस बात के लिए जाने का रास्ता है। यदि आप स्प्रिंग वेब फ्लो का उपयोग कर रहे हैं तो इसमें एक फ्लैशस्कोप है जहां आप पोस्ट-गेट-रीडायरेक्शन के बाद उस डेटा को रख सकते हैं जिसे आप बनाए रखना चाहते हैं। आप इस दृष्टिकोण का उपयोग कर सिर्फ एक संपादन आईडी से अधिक रख सकते हैं।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^