2009-06-10 8 views
10

मैं अपने कॉलेज प्रोजेक्ट के लिए जेएसपी, जेएसटीएल और जेएसएफ के साथ आवेदन पर काम कर रहा हूं, ऐसा कहा जा रहा है, मैं भी जेएसएफ के लिए बहुत नया हूं।जेएसएफ से रीडायरेक्ट?

सबकुछ अब तक बढ़ रहा है। हालांकि, मुझे लगता है कि प्रबंधित बीन से पृष्ठ पर डायनामिक पैरामीटर के साथ रीडायरेक्ट करने का तरीका पता लग रहा है। उदाहरण के लिए article.jsp?article_id=2

क्या कोई मुझे बता सकता है कि यह कैसे किया जाता है?

javax.servlet.ServletException: #{postComment.postClick}: javax.faces.FacesException: javax.servlet.ServletException: javax.faces.component.UIViewRoot cannot be cast to com.sun.faces.application.StateManagerImpl$TreeNode 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:256) 

मैं

response.sendRedirect("faces/article.jsp2?article_id=" + articleId); 
      return; 

उपयोग करने के लिए कोशिश कर रहा लेकिन फिर से एक त्रुटि हो रही है:

मैं

FacesContext.getCurrentInstance().getExternalContext().dispatch("faces/article.jsp2?article_id=" + articleId); 

तरह somethinng का उपयोग लेकिन त्रुटि मिलती है की कोशिश कर रहा।

javax.servlet.ServletException: Cannot forward after response has been committed 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:256) 

किसी कृपया मुझे बता सकते मैं कैसे कामयाब जावा सेम से अनुप्रेषित जब JSF के साथ काम करते हैं?

भाई मेरा कोड है (शायद उसके साथ कुछ गलत है और यही कारण है कि रीडायरेक्ट काम नहीं कर रहा है)।

HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
     HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 

     String articleId = request.getSession().getAttribute("article_id").toString(); 
     //String articleId = request.getParameter("article_id"); 
     String authorName = request.getSession().getAttribute("user_name").toString(); 

     java.util.Calendar calendar = java.util.Calendar.getInstance(); 
     String commentDate = String.valueOf(calendar.get(java.util.Calendar.DAY_OF_MONTH)) + "."; 
     commentDate += String.valueOf(calendar.get(java.util.Calendar.MONTH)) + "."; 
     commentDate += String.valueOf(calendar.get(java.util.Calendar.YEAR)); 

     ArrayList error = new ArrayList(); 

     if(commentName.contains("<")) 
     { 
      error.add("Comment name contains illegal characters"); 
     } 

     if(commentBody.isEmpty() && commentBody.contains("<script")) 
     { 
      error.add("Your message body contains illegal characters"); 
     } 

     if(error.size() > 0) 
     { 
      request.getSession().setAttribute("error", error); 
      error.clear(); 
      FacesContext.getCurrentInstance().getExternalContext().dispatch("article.jsp2?article_id=" + articleId); 
     } 
     else 
     { 
      Comment comment = new Comment(); 
      comment.setCommentAuthor(authorName); 
      comment.setCommentBody(commentBody); 
      comment.setCommentDate(commentDate); 
      comment.setCommentName(commentName); 
      comment.setArticleId(articleId); 

      DisplayArticleIO addComment = new DisplayArticleIO(); 
      addComment.postComment(comment); 
//   FacesContext.getCurrentInstance().getExternalContext().dispatch("faces/article.jsp2?article_id=" + articleId); 
      response.sendRedirect("faces/article.jsp2?article_id=" + articleId); 
      return; 
     } 

अग्रिम धन्यवाद।

उत्तर

1

असल में, प्रतिक्रिया.sendRedirect() पर कॉल करने से पहले कुछ क्लाइंट को आउटपुट भेज रहा है। एक बार ब्राउज़र में कुछ भेजा गया है, तो आप उन्हें किसी अन्य स्थान पर रीडायरेक्ट या अग्रेषित नहीं कर सकते हैं।

सामान्यतः, किसी भी परिदृश्य जिसके परिणामस्वरूप रीडायरेक्ट या अग्रेषण हो सकता है, अनुरोध के संदर्भ में जितनी जल्दी संभव हो सके उसे पुनर्निर्देशित करने के लिए ग्राहक को कोई डेटा भेजने से पहले होता है। क्या आप इस कोड को दृश्य में टैग के माध्यम से कॉल करने जैसा कुछ कर रहे हैं?

2

आप एक ही स्थान पर प्रेषण का उपयोग क्यों कर रहे हैं और दूसरे में रीडायरेक्ट कर रहे हैं? यह समस्या का स्रोत नहीं है - प्रतिक्रिया भेजने के बाद वापस नहीं लौटना, हालांकि, है।

  • आप आप यह चाहते के रूप में टिप्पणी की तारीख वापस जाने के लिए DateFormat उपयोग कर सकते हैं (यह ज्यादा क्लीनर हो जाएगा): अन्य तो है कि, यदि आप कोई आपत्ति नहीं है, मैं कुछ अनुकूल सुझाव हैं।
  • यदि त्रुटियों में ऐरेलिस्ट में केवल स्ट्रिंग्स हैं, तो जेनेरिक (ArrayList<String>) का उपयोग करें।
  • त्रुटियों के साथ आप क्या कर रहे हैं?
  • commentName का आपका स्वच्छता बहुत खतरनाक है। आपको ब्लैकलिस्टिंग के बजाय श्वेतसूची का उपयोग करना चाहिए - परिभाषित करें कि आप किसी टिप्पणी में क्या स्वीकार करना चाहते हैं और बाकी सब कुछ अवरुद्ध करें। अभी कोई व्यक्ति <img> टैग को एक कुकी चोरी पृष्ठ पर इंगित करने वाले स्रोत के साथ सम्मिलित कर सकता है जिसके परिणामस्वरूप सत्र अपहरण होगा।
  • रीडायरेक्ट में प्रेषण बदलने के बाद इसे नीचे एक रिटर्न जोड़ें (आपको हमेशा यह करना चाहिए।ऐसा करने से आप अभी जो देख रहे हैं, उसके परिणामस्वरूप आप कहीं और प्रतिक्रिया भेज चुके हैं, लेकिन जब से आप वापस नहीं आये हैं तो आप उस स्थान पर पहुंच गए हैं जहां आप एक और भेजने की कोशिश कर रहे हैं)।
+0

आप कुछ बहुत अच्छा सुझाव सूचीबद्ध। बहुत बहुत धन्यवाद, निश्चित रूप से इसमें देखेंगे। – Dmitris

+0

आपका स्वागत है: पी – laginimaineb

23

यदि कोई एक ही समस्या में भाग लेगा।

क्या मेरी समस्या हल है कि:

FacesContext.getCurrentInstance().getExternalContext().redirect("article.jsp?article_id=" + articleId); 
+13

स्पष्टीकरण: यह जेएसएफ को निर्देश देने के लिए 'HttpServletResponse # sendRedirect()' के बाद 'FacesContext # प्रतिक्रिया पूर्ण()' को स्पष्ट रूप से कॉल करता है कि उसे प्रतिक्रिया प्रस्तुत करने की आवश्यकता नहीं है। दूसरे शब्दों में, 'प्रतिक्रिया.sendRedirect()' लाइन के बाद 'FacesContext.getCurrentInstance()। प्रतिक्रिया पूर्ण()' को कॉल करने के लिए एक और (अधिक बेकार) समाधान होता। – BalusC

1
FacesContext.getCurrentInstance().getExternalContext().redirect("http://www.myUrl.com"); 

रेने

+4

हाय, ओपी द्वारा पहले से ही इसका उत्तर दिया गया है :) – BalusC