Простейший способ: просто укажите ссылку на страницу JSP и передайте идентификатор строки в качестве параметра:
delete
И в delete.jsp
(я оставляю очевидную проверку параметров запроса / валидация в сторону) :
<% dao.delete(Long.valueOf(request.getParameter("id"))); %>
Это, однако, довольно плохая практика (это все еще было преуменьшением) и по двум причинам:
и
для действия удаления. Однако вы можете использовать CSS, чтобы стиль кнопки выглядел как ссылка. Редактировать ссылки, которые предварительно загружают элемент, чтобы предварительно заполнить форму редактирования, могут безопасно быть GET. <% %>
вещи) обескуражены. Вы должны использовать сервлет сервлета для контроля, препроцесса и постпроцессов HTTP-запросов. Поскольку вы не сообщили ни слова о сервлете в своем вопросе, я подозреваю, что вы уже используете сценарии для загрузки данных из БД и отображения их в таблице. Это также должно быть сделано сервлетом.
Вот пример основного примера, как это сделать. Я не знаю, что представляют данные таблицы, поэтому давайте возьмем 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-адресу (так, чтобы конечный пользователь был вынужден вызвать сервлет для этого).
Вот как сервлет примерно похож на (валидация опущена для краткости):
@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.
}
}
Вот как может выглядеть форма добавления / редактирования в /WEB-INF/product.jsp
:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
fn:escapeXml()
как раз там, чтобы предотвратить атаки XSS при повторном просмотре данных редактирования, он делает то же самое, что и
, только лучше подходит для использования в атрибутах.
Вот как product
сервлет может выглядеть следующим образом (опять-таки, для краткости для сокращения):
@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 .
См. Также:
Просто удалите расширение .py
, переименовав файл. Затем вы должны поместить следующую строку вверху вашего файла:
#!/usr/bin/env python
env
- это небольшая программа, которая настраивает среду так, чтобы выполнялся правильный интерпретатор python
.
Вы также должны сделать свой файл исполняемым с помощью команды
chmod a+x htswap
и скопировать его в / usr / local / bin
.
Первая строка файла должна быть
#!/usr/bin/env python
. Вы должны удалить расширение .py
и сделать файл исполняемым, используя
chmod ugo+x htswap
РЕДАКТИРОВАТЬ: Томас правильно указывает, что такие сценарии должны быть помещены в /usr/local/bin
, а не в /usr/bin
. Пожалуйста, проголосуйте за его ответ (возможно, за счет моего. Семь голосов (как мы говорим) за подобные вещи смешны)
добавить #! / Usr / bin / env python
в самый верх htswap.py
и переименовать htswap.py
на htswap
, затем выполните команду: chmod + x htswap
, чтобы сделать htswap исполняемым.
Я вижу в официальных руководствах по Python, http://docs.python.org/tutorial/index.html , что
#! /usr/bin/env python
используется только как ответы выше предлагают. Обратите внимание, что вы также можете использовать следующий
#!/usr/bin/python
. Это стиль, который вы увидите в сценариях оболочки, например сценариях bash. Например,
#!/bin/bash
Видя, что официальные мнения согласны с первым вариантом, это, вероятно, ваш лучший выбор. Последовательность кода - это то, к чему нужно стремиться!
Шебанг?
#!/usr/bin/env python
Поместите это в начало файла, и вы установите