我有一个HTML表,其中包含从该表中显示的数据库中提取的行.我希望用户能够通过单击每行之外的删除超链接或按钮来删除行.
当用户点击每个删除超链接或按钮时,如何在页面上调用JSP函数,以便我可以从数据库中删除该行的条目?or
标签究竟应该调用JSP函数到底是什么?
请注意,我需要调用JSP函数,而不是JavaScript函数.
最简单的方法:只需让链接指向JSP页面并将行ID作为参数传递:
delete
并在delete.jsp
(我将明显的请求参数检查/验证放在一边):
<% dao.delete(Long.valueOf(request.getParameter("id"))); %>
然而,这是一个非常糟糕的做法(这仍然是轻描淡写),原因有两个:
修改服务器端数据的HTTP请求不应由GET完成,而应由POST完成.链接是隐式GET.想象一下,当像googlebot这样的网络抓取工具尝试关注所有删除链接时会发生什么.您应该使用a 和a
来执行删除操作.但是,您可以使用CSS将按钮设置为看起来像链接.编辑只是预加载项目以预编辑编辑表单的链接可以安全地获取.
把业务逻辑(功能使用的JSP,你称呼它)小脚本(这些<% %>
东西)气馁.您应该使用Servlet来控制,预处理和后处理HTTP请求.
由于您在问题中没有说出任何关于servlet的消息,我怀疑您已经在使用scriptlet从数据库加载数据并将其显示在表中.这也应该由servlet完成.
这是一个如何做到这一切的基本启动示例.我不知道表数据代表什么,所以我们Product
举一个例子.
public class Product { private Long id; private String name; private String description; private BigDecimal price; // Add/generate public getters and setters. }
然后它使用JSP文件JSTL(刚落,JSTL-1.2.jar中/WEB-INF/lib
进行安装)来显示产品与编辑联系,并在每一行中删除按钮的表:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> ...
products.jsp
将其命名并将其放在/WEB-INF
文件夹中,以便URL不能直接访问它(以便最终用户强制为此调用servlet).
以下是servlet的粗略外观(为简洁省略了验证):
@WebServlet("/products") public class ProductsServlet extends HttpServlet { private ProductDAO productDAO; // EJB, plain DAO, etc. @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Listproducts = productDAO.list(); request.setAttribute("products", products); // Will be available as ${products} in JSP. request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String delete = request.getParameter("delete"); if (delete != null) { // Is the delete button pressed? productDAO.delete(Long.valueOf(delete)); } response.sendRedirect(request.getContextPath() + "/products"); // Refresh page with table. } }
以下是添加/编辑表单的/WEB-INF/product.jsp
外观:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> ...
该fn:escapeXml()
是只是为了防止XSS攻击时,编辑数据再次显示,它完全一样的
,只有更好的适用于attribtues使用.
以下是product
servlet的外观(同样,为简洁省略了转换/验证):
@WebServlet("/product") public class ProductServlet extends HttpServlet { private ProductDAO productDAO; // EJB, plain DAO, etc. @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String edit = request.getParameter("edit"); if (edit != null) { // Is the edit link clicked? Product product = productDAO.find(Long.valueOf(delete)); request.setAttribute("product", product); // Will be available as ${product} in JSP. } request.getRequestDispatcher("/WEB-INF/product.jsp").forward(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String save = request.getParameter("save"); if (save != null) { // Is the save button pressed? (note: if empty then no product ID was supplied, which means that it's "add product". Product product = (save.isEmpty()) ? new Product() : productDAO.find(Long.valueOf(save)); product.setName(request.getParameter("name")); product.setDescription(request.getParameter("description")); product.setPrice(new BigDecimal(request.getParameter("price"))); productDAO.save(product); } response.sendRedirect(request.getContextPath() + "/products"); // Go to page with table. } }
部署并运行它.您可以通过http://example.com/contextname/products打开该表格.
也可以看看:
我们的servlets wiki页面(还包含一个验证示例)
Servlet中的doGet和doPost
使用MVC和DAO模式在JSP页面中以HTML格式显示JDBC ResultSet