Come passare l’articolo corrente al metodo Java facendo clic su un collegamento ipertestuale o un pulsante nella pagina JSP?

Ho una tabella HTML con le righe recuperate da un database visualizzato in quella tabella. Voglio che l’utente sia in grado di eliminare una riga facendo clic su un collegamento ipertestuale di eliminazione o un pulsante accanto a ciascuna riga.

Come faccio a richiamare una funzione JSP sulla pagina, quando l’utente fa clic su ognuno di quelli cancella i collegamenti ipertestuali o il pulsante, in modo da poter cancellare la voce di quella riga dal database? Che cosa dovrebbe esattamente il tag o per l’azione delete. Puoi comunque usare i CSS per modellare il pulsante in modo che assomigli a un link. Modifica i link che si limitano a precaricare l’elemento per precompilare il modulo di modifica in modo sicuro.

  • La logica aziendale ( funzioni come la si chiama) in un JSP che utilizza scriptlet (quelle < % %> %% < % %> cose) è scoraggiata. È necessario utilizzare un servlet per controllare le richieste HTTP di preprocesso e poscanvasborazione.

  • Dal momento che non hai detto nulla su un servlet nella tua domanda, sospetto che stai già usando gli scriptlet per caricare i dati dal DB e visualizzarli in una tabella. Questo dovrebbe essere fatto anche da un servlet.

    Ecco un semplice esempio di kickoff come fare tutto. Non ho idea di cosa rappresentino i dati della tabella, quindi lascia prendere come esempio.

     public class Product { private Long id; private String name; private String description; private BigDecimal price; // Add/generate public getters and setters. } 

    E poi il file JSP che usa JSTL (basta rilasciare jstl-1.2.jar in /WEB-INF/lib per installarlo) per visualizzare i prodotti in una tabella con un link di modifica e un pulsante di eliminazione in ogni riga:

     < %@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> < %@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> ... 
    edit
    add

    Denominalo products.jsp e mettilo nella cartella /WEB-INF modo che non sia direttamente accessibile dall’URL (in modo che l’utente finale sia costretto a chiamare il servlet per quello).

    Ecco come appare la servlet (convalida omessa per brevità):

     @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 { List products = 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. } } 

    Ecco come può apparire il modulo di aggiunta / modifica su /WEB-INF/product.jsp :

     < %@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> ... 



    Il file fn:escapeXml() è lì solo per prevenire gli attacchi XSS quando i dati di modifica vengono nuovamente visualizzati, fa esattamente lo stesso di , solo meglio adatto per l’utilizzo negli attributi.

    Ecco come può apparire il servlet del product (di nuovo, conversione / convalida omessa per brevità):

     @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. } } 

    Distribuiscilo ed eseguilo. Puoi aprire la tabella da http://example.com/contextname/products .

    Guarda anche:

    • La nostra pagina wiki di servlet (contiene anche un esempio di convalida)
    • doGet e doPost in Servlet
    • Mostra JDBC ResultSet in HTML nella pagina JSP usando pattern MVC e DAO