Python пишет сценарий в/usr/bin

Простейший способ: просто укажите ссылку на страницу JSP и передайте идентификатор строки в качестве параметра:

delete

И в delete.jsp (я оставляю очевидную проверку параметров запроса / валидация в сторону) :

<% dao.delete(Long.valueOf(request.getParameter("id"))); %>

Это, однако, довольно плохая практика (это все еще было преуменьшением) и по двум причинам:

  1. Запросы HTTP, которые изменяют данные на стороне сервера, не должны выполняться с помощью GET , а через POST . Ссылки - это неявное GET. Представьте, что произойдет, если веб-искатель, такой как googlebot, попытается выполнить все ссылки удаления. Вы должны использовать
    и
  2. Помещение бизнес-логики (функции , как вы ее называете) в JSP с использованием scriptlets (те <% %> вещи) обескуражены. Вы должны использовать сервлет сервлета для контроля, препроцесса и постпроцессов 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" %>
...

    
            
edit
add

]

Назовите его 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 .

См. Также:

17
задан Michiel Buddingh 22 July 2009 в 20:30
поделиться

5 ответов

Просто удалите расширение .py , переименовав файл. Затем вы должны поместить следующую строку вверху вашего файла:

#!/usr/bin/env python

env - это небольшая программа, которая настраивает среду так, чтобы выполнялся правильный интерпретатор python .

Вы также должны сделать свой файл исполняемым с помощью команды

chmod a+x htswap

и скопировать его в / usr / local / bin .

38
ответ дан 30 November 2019 в 10:36
поделиться

Первая строка файла должна быть

#!/usr/bin/env python

. Вы должны удалить расширение .py и сделать файл исполняемым, используя

chmod ugo+x htswap

РЕДАКТИРОВАТЬ: Томас правильно указывает, что такие сценарии должны быть помещены в /usr/local/bin, а не в /usr/bin. Пожалуйста, проголосуйте за его ответ (возможно, за счет моего. Семь голосов (как мы говорим) за подобные вещи смешны)

12
ответ дан 30 November 2019 в 10:36
поделиться

добавить #! / Usr / bin / env python в самый верх htswap.py и переименовать htswap.py на htswap , затем выполните команду: chmod + x htswap , чтобы сделать htswap исполняемым.

1
ответ дан 30 November 2019 в 10:36
поделиться

Я вижу в официальных руководствах по Python, http://docs.python.org/tutorial/index.html , что

#! /usr/bin/env python

используется только как ответы выше предлагают. Обратите внимание, что вы также можете использовать следующий

#!/usr/bin/python

. Это стиль, который вы увидите в сценариях оболочки, например сценариях bash. Например,

#!/bin/bash

Видя, что официальные мнения согласны с первым вариантом, это, вероятно, ваш лучший выбор. Последовательность кода - это то, к чему нужно стремиться!

-1
ответ дан 30 November 2019 в 10:36
поделиться

Шебанг?

#!/usr/bin/env python

Поместите это в начало файла, и вы установите

2
ответ дан 30 November 2019 в 10:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: