1

我是网络编程的新手,我坚持设计一个简单的流程。

假设我有一个简单的对象,例如,

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

  { getters and setters etc}
}

我从我的 DAO 中得到一堆(取决于 DB 中的记录号)List<Object1>,并在页面上循环打印它们,让我们调用它jspPage1。我还有另一个页面,jspPage2它与Object1.ID

我想要的是:

创建某种连接,这样,当用户单击或选择一个对象时,所选对象的 ID (on 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 的参数信息。这似乎更安全一些,但一些任性的用户仍然可以与创建的哈希混合。

  • 我可以编写一些类似的 scriptlet,request.setAttribute("ID", object1.ID);但有人告诉我,在 JSP 页面中包含代码和逻辑是错误的做法。

所以重复我的问题;有没有办法以更整洁的方式做这样的事情?

或者

我解决这个问题的方法是根本错误的,我应该考虑不同的设计。(如果有任何提示)

4

2 回答 2

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>

然后在 web.xml 中注册一个名为 CheckIdServlet 的 servlet

<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>
于 2013-05-15T20:19:09.600 回答
0

您可以将这些值存储到会话中,然后您可以在第二个 jsp 页面中使用

否则你可以使用 request.setAttribute("name",value );

于 2013-05-15T08:36:47.110 回答