我是网络编程的新手,我坚持设计一个简单的流程。
假设我有一个像
这样的简单对象public class Object1
{
private int ID;
private String text;
{ getters and setters etc}
}
我从我的DAO中获取了一堆(取决于DB中的记录号)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的参数信息进行模糊处理。这似乎是一个 更安全,但一些任性的用户仍然可以与之交流 创建哈希。
request.setAttribute("ID", object1.ID);
这样的小脚本,但我被告知在JSP页面中包含代码和逻辑是不对的。重复我的问题; 有没有办法以更简洁的方式做这样的事情?
或
我接近这个问题的方法是根本错误的,我应该考虑一个不同的设计。 (如果有任何提示)
答案 0 :(得分: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>
答案 1 :(得分:0)
您可以将这些值存储到会话中,然后可以在第二个jsp页面中使用
否则您可以使用request.setAttribute("name",value );