2013-05-15 89 views
1

我是網絡編程的新手,我堅持設計一個簡單的流程。在兩個JSP頁面之間傳遞參數

比方說,我有一個簡單的物體,像,

public class Object1 
{ 
    private int ID; 
    private String text; 

    { getters and setters etc} 
} 

我收到了一堆從我的DAO爲List<Object1>這些(取決於數據庫的記錄號),並將其打印在一個循環中一個頁面上,我們稱之爲jspPage1。我有另一頁,jspPage2,這確實與Object1.ID

東西我想是:

建立某種聯繫,例如,當用戶點擊或選擇對象時,所選對象的ID(上jspPage1)將被髮送到jspPage2

我到目前爲止的想法;

  • 與ID信息重定向,例如創建超鏈接:

    <c:forEach items="${objects}" var="object1"> 
         <tr> 
          <td><a href="/jspPage2?id=${object1.ID}">${object1.text} </a></td> 
         </tr> 
        </c:forEach> 
    

    這臭壞,任何人都可以用地址欄篡改並更改ID 值。

  • 我可以混淆選項#1上的參數信息。這似乎更安全一些,但一些有意的用戶仍然可以與創建的哈希混合使用。

  • 我可以編寫一些scriptlets,如request.setAttribute("ID", object1.ID);,但我被告知在JSP頁面中包含代碼和邏輯是一件錯誤的事情。

所以重複我的問題; 有沒有辦法像這樣以一種更好的方式做事?

是我接近這個問題的方法是根本錯誤的,我應該考慮不同的設計。 (如果是這樣的,任何提示)

回答

1

的一種方式使用MVC方法。用戶點擊URL後,您可以讓servlet驗證對象ID是否有效。換句話說,servlet將包含所有的邏輯。所以,在jspPage1

<c:forEach items="${objects}" var="object1"> 
    <tr> 
     <td><a href=" 
       <c:url value='/checkId' > 
        <c:param name='id'value ='${object1.ID}' /> 
       </c:url> 
       ">${object1.text}</a> 
    </tr> 
</c:forEach> 

然後你註冊了一個名爲CheckIdServlet的servlet在web.xml中

<servlet> 
    <servlet-name>checkId</servlet-name> 
    <servlet-class>CheckIdServlet</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>checkId</servlet-name> 
    <url-pattern>/checkId</url-pattern> 
</servlet-mapping> 

既然你傳遞參數的URL所有你需要做的是優先使用doGet(.. 。)方法

public class CheckIdServlet extends HttpServlet { 

@Override 
protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
    //do your id checking to make sure it's a number or if id value is actually in the database 
    //if either condition not met, you could redirect back to jsppage 1 or however you want to do 
    //handle 
    response.sendRedirect("/jsppage1.jsp"); 

    //or if id is valid 
    RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/jsppage2.jsp"); 
    dispatcher.forward(request, response); 

    //Keep in mind this is pseudocode so make sure to add your if conditions above 

} 

最後,在jsppage2你只需顯示你的對象ID

<h1>${param.id}</h1> 
+0

公開傳遞參數,但在控制器中檢查有效性。是的,我認爲這可能是最好的方法。謝謝。 – JuniorDev

0

您可以將這些值存儲到會話,然後就可以在第二jsp頁面

以其它方式使用,你可以使用我能想到的是request.setAttribute("name",value);

+0

爲了存儲在會話的價值觀,我必須寫在jsp頁面右邊一個scriptlet? (因爲我不知道用戶會選擇什麼)。如果是這樣,我已經考慮過這種方法,並不喜歡它。見選項#3 – JuniorDev