2011-03-24 14 views
17

मैं एक PHP डेवलपर रहा हूं लेकिन हाल ही में Google App Engine (Java) का उपयोग करके कुछ प्रोजेक्ट पर काम करने की आवश्यकता है। PHP में मैं कुछ इस तरह (MVC मॉडल की अवधि में) कर सकते हैं:जावा सर्वलेट से जेएसपी तक डेटा पास करें?

// controllers/accounts.php 
$accounts = getAccounts(); 
include "../views/accounts.php"; 

// views/accounts.php 
print_r($accounts); 

मैं गूगल एप इंजन जावा के कुछ डेमो सर्वलेट और JSP का उपयोग करके पर एक नज़र डालें। क्या वे क्या कर रहे हैं यह है:

// In AccountsServlet.java 
public class AccountsServlet extends HttpServlet { 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    String action = req.getParameter("accountid"); 
    // do something 
    // REDIRECT to an JSP page, manually passing QUERYSTRING along. 
    resp.sendRedirect("/namedcounter.jsp?name=" + req.getParameter("name")); 
    } 
} 
मूल रूप से जावा मामले में यह 2 अलग HTTP अनुरोध (दूसरा एक स्वचालित रूप से मजबूर किया जा रहा) है में

, है ना? तो जेएसपी फ़ाइल में मैं सर्वलेट में गणना किए गए डेटा का उपयोग नहीं कर सकता।

क्या कोई तरीका है कि मैं इसे PHP तरीके के समान कर सकता हूं?

+0

रिकार्ड के लिए:

Account[] accounts = AccountManager.getAccountList(); request.setAttribute("accountList", accounts); RequestDispatcher rd = req.getRequestDispatcher(nextJSPurl); rd.forward(req, resp); 

JSP में, हम अनुरोध से विशेषता प्राप्त कर सकते हैं। एक और दोस्त ने मुझे जेएसपी से छुटकारा पाने का सुझाव दिया। जावा सर्वलेट और बंद के साथ जाने के http://code.google.com/closure/ – huy

उत्तर

30

आप डेटा अनुरोध दायरे में सर्वलेट में लिया गया स्थापित करने के लिए इतना है कि डेटा JSP

में उपलब्ध है आप अपने सर्वलेट्स में लाइन निम्नलिखित होगा की आवश्यकता होगी।

List<Account> accounts = getAccounts(); 
request.setAttribute("accountList",accounts); 

तो JSP आप यह डेटा की तरह

नीचे
${accountList} 

मैं अनुरोध का प्रयोग करेंगे अभिव्यक्ति भाषा डिस्पैच का उपयोग कर sendRedirect के रूप में

RequestDispatcher rd = sc.getRequestDispatcher(url); 
    rd.forward(req, res); 

इस प्रकार आप उपयोग कर सकते हैं का उपयोग कर सकते बजाय RequestDispatcher तो आप इन मानों को request या session ऑब्जेक्ट में स्टोर कर सकते हैं और अन्य जेएसपी में जा सकते हैं।

क्या request.sendRedirect का उपयोग करने का कोई विशिष्ट उद्देश्य है? यदि RequestDispatcher का उपयोग नहीं करते हैं।

See this link for more details

public class AccountServlet extends HttpServlet { 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    List<Account> accounts = getAccountListFromSomewhere(); 

    String url="..."; //relative url for display jsp page 
    ServletContext sc = getServletContext(); 
    RequestDispatcher rd = sc.getRequestDispatcher(url); 

    request.setAttribute("accountList", accounts); 
    rd.forward(request, response); 
    } 
} 
+3

भी getServletContext() getRequestDispatcher (यूआरएल) .forward (अनुरोध, प्रतिक्रिया)। – tomasb

2
import javax.servlet.http.*; 

public class AccountsServlet extends HttpServlet { 

    public void doGet (HttpServletRequest request, HttpServletResponse response) { 

     try { 
      // Set the attribute and Forward to hello.jsp 
      request.setAttribute ("somename", "someValue"); // to save your temporary calculations. 
      getServletConfig().getServletContext().getRequestDispatcher("/namedcounter.jsp?name=" + req.getParameter("name")).forward(request, response); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 

} 

ऊपर कोड सर्वलेट में 2 अलग अनुरोध नहीं बनाएगा। यह आगे बढ़ेगा, मूल अनुरोध से सभी डेटा भी बनाए रखेगा।

request.setAttribute ("somename", "someValue"); // to save your temporary calculations. 
2

यह आपके प्रश्न की मेरी समझ है - आप सर्वलेट में गणना किए गए डेटा के साथ एक नए जेएसपी पेज को रीडायरेक्ट या प्रेषित करना चाहते हैं, है ना? ऐसा करने के लिए आपको अनुरोध भेजने से पहले अनुरोध विशेषताओं को सेट करने की आवश्यकता है।

आप HttpServletRequest वस्तु (req.setAttribute("attribute name", "attribute value")) का उपयोग कर गुण सेट कर सकते हैं। विशेषता मान कोई जावा ऑब्जेक्ट हो सकता है।

आप req.getAttribute("attribute name") से मान प्राप्त कर सकते हैं। उपयोगकर्ता को एट्रिब्यूट() फ़ंक्शन के दौरान ऑब्जेक्ट को कास्ट करने की आवश्यकता होगी। AccountBean की तरह कुछ -

8

आप क्या करना चाहते क्या पहला है getAccounts से जानकारी का प्रतिनिधित्व करने के लिए एक वस्तु को परिभाषित()।

फिर अपने सर्वलेट्स doPost या doGet समारोह में, अपने AccountBean वस्तु को भरने के लिए अनुरोध की जानकारी का उपयोग करें।

फिर आप setAttribute विधि का उपयोग कर AccountBean वस्तु या तो अनुरोध, सत्र, या सर्वलेट संदर्भ में संग्रहीत करते हैं और JSP पेज को अनुरोध अग्रेषित कर सकते हैं।

अपने jsp पेज में AccountBean डेटा और टैग का उपयोग निकाला जाता है।

protected void doPost(HttpServletRequest req, HttpServletResponse resp) { 

    // get data from request querystring 
    String accountId = req.getParameter("accountid"); 

    // populate your object with it (you might want to check it's not null) 
    AccountBean accountBean = new AccountBean(accountId); 

    // store data in session 
    HttpSession session = req.getSession(); 
    session.setAttribute("accountBean", accountBean); 

    // forward the request (not redirect) 
    RequestDispatcher dispatcher = req.getRequestDispatcher("account.jsp"); 
    dispatcher.forward(req, resp); 
} 

फिर अपने JSP पेज खाते की जानकारी प्रदर्शित करने के लिए निम्नलिखित होंगे::

<jsp:useBean id="accountBean" type="myBeans.AccountBean" /> 
Your account is <jsp:getProperty name="accountBean" property="status" /> 
+0

मुझे लगता है कि यह सबसे अच्छा समाधान है .. जावा बीन्स का उपयोग ऊपर दिए गए तरीकों से क्लीनर है। – AJed

1

आप जावा सेम के अंदर डेटा सेट कर सकते हैं और

यहाँ अपने सर्वलेट का एक उदाहरण हो सकता है jsp पेज पर नियंत्रण होने पर आसानी से उस डेटा को jsp पेज पर एक्सेस करें। सेटर्स का उपयोग कर जावा बीन्स में तारीख सेट करें उन डेटा को जेएसपी पेज पर एक्सेस करके उस बीन को जेएसपी में शामिल करें।

<%@page contentType="text/html"%> 
<jsp:useBean id="man" class="beans.Person"/> 
<jsp:setProperty name="man" property="*"/>  
First Name: <jsp:getProperty name="man" property="firstName"/> 

इस तरह आप अपनी बीन कक्षा के कई गुणों तक पहुंच सकते हैं।

5

क्या अभिव्यक्ति लैंग का उपयोग कर के बारे में ऊपर उल्लेख किया है इसके अलावा, आप भी अनुरोध के माध्यम से ही गुण पारित कर सकते हैं। सर्वलेट के doGet में(), हम जैसे कुछ लिखें:

<% 
    Account[] accounts= (Account[])request.getAttribute("accountList"); 

     if (accounts.length>0) {  
     for (Account account: accounts) {    
       %> 
       <blockquote>account name: <%= account.getName() %></blockquote> 
       <% 
      } 
     } 
%> 
संबंधित मुद्दे