Как передавать данные из сервлета в JSP без формы на загрузку страницы JSP [дубликат]

Если вы не хотите использовать какой-либо объект, вы можете использовать setattr() внутри вашего текущего модуля:

import sys
current_module = module = sys.modules[__name__]  # i.e the "file" where your code is written
setattr(current_module, 'variable_name', 15)  # 15 is the value you assign to the var
print(variable_name)  # >>> 15, created from a string
6
задан BalusC 28 June 2015 в 08:03
поделиться

4 ответа

Вы можете использовать метод doGet() сервлета для предварительной обработки запроса и пересылки запроса в JSP. Затем просто укажите URL-адрес сервлета вместо URL-адреса JSP в ссылках и адресной строке браузера.

Например,

@WebServlet("/products")
public class ProductsServlet extends HttpServlet {

    @EJB
    private ProductService productService;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Product> products = productService.list();
        request.setAttribute("products", products);
        request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response);
    }

}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<table>
    <c:forEach items="${products}" var="product">
        <tr>
            <td>${product.name}</td>
            <td>${product.description}</td>
            <td>${product.price}</td>
        </tr>
    </c:forEach>
</table>

Обратите внимание, что файл JSP помещается внутри папки /WEB-INF чтобы запретить пользователям напрямую обращаться к нему без вызова сервлета.

Также обратите внимание, что @WebServlet доступен только с сервлета 3.0 (Tomcat 7 и т. д.), см. также аннотацию @WebServlet с Tomcat 7 . Если вы не можете обновить или когда вам по какой-то причине нужно использовать web.xml, который несовместим с Servlet 3.0, вам необходимо вручную зарегистрировать сервлет старомодным способом в web.xml, как показано ниже, вместо используя аннотацию:

<servlet>
    <servlet-name>productsServlet</servlet-name>
    <servlet-class>com.example.ProductsServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>productsServlet</servlet-name>
    <url-pattern>/products</url-pattern>
</servlet-mapping>

После правильной регистрации сервлета по аннотации или XML теперь вы можете открыть его с помощью http: // localhost: 8080 / context / products , где /context - это путь развертывания контекста webapp, а /products - шаблон URL сервлета. Если у вас есть какой-либо HTML <form> внутри него, просто поставьте POST на текущий URL-адрес, например <form method="post">, и добавьте doPost() к тому же самому сервлету для выполнения задания постобработки , Продолжите приведенные ниже ссылки для более конкретных примеров.

См. Также

8
ответ дан Community 20 August 2018 в 17:11
поделиться
  • 1
    Вопрос заключается в вызове Servlet из JSP. Вы ответили за вызов JSP из сервлета. – YoK 28 August 2010 в 17:29
  • 2
    ... что является обычной практикой для функционального требования, которое имел в виду ОП. – BalusC 28 August 2010 в 17:44
  • 3
    как вы можете быть настолько уверены в том, что думал OP? – Ladlestein 28 August 2010 в 17:54
  • 4
    "без использования HTML-формы & quot; , поэтому он хочет предварительно обработать запрос вместо последующей обработки. – BalusC 28 August 2010 в 21:13

Если вы хотите вызвать конкретный метод сервлета, чем использовать язык выражений. Например, вы можете сделать что-то вроде:

Servlet

ForexTest forexObject = new ForexTest();
request.setAttribute("forex", forexObject);

JSP

<body bgcolor="#D2E9FF">
Current date : ${forex.rate}
</body>
0
ответ дан Rachel 20 August 2018 в 17:11
поделиться
  • 1
    Обратите внимание: ваш ответ немного вводит в заблуждение, это подразумевает, что ForexTest должен быть сервлетом, но он вовсе не обязательно должен быть сервлетом вообще. Обычный подход заключается в том, что он является джавабеем и что эти get методы должны вызывать только для доступа к свойствам, а не для выполнения бизнес-логики. – BalusC 14 October 2010 в 12:15

Конечно, вы можете просто включить его в свой action в form. Но вам нужно написать правильные doPost или doGet для обработки запроса!

0
ответ дан Truong Ha 20 August 2018 в 17:11
поделиться

Вам нужно будет использовать методы RequestDispatcher's forward / include в зависимости от вашего требования для достижения того же.

В JSP вам нужно использовать следующие теги:

jsp: include :

Элемент позволяет включать либо статический, либо динамический файл в JSP-файле. Результаты включения статических и динамических файлов совершенно разные. Если файл является статическим, его содержимое включено в вызывающий JSP-файл. Если файл является динамическим, он действует на запрос и отправляет обратно результат, который включен в страницу JSP. Когда действие включения завершено, контейнер JSP продолжает обрабатывать оставшуюся часть JSP-файла.

, например

<jsp:include page="/HandlerServlet" flush="true">  

jsp: forward :

Элемент перенаправляет объект запроса, содержащий информацию запроса клиента из одного JSP-файла в другой файл. Целевой файл может быть HTML-файлом, другим JSP-файлом или сервлетом, если он находится в том же контексте приложения, что и JSP-файл пересылки. Строки в исходном JSP-файле после элемента не обрабатываются.

, например

<jsp:forward page="/servlet/ServletCallingJsp" />

Проверьте расширенный пример JSP: JSP-Servlet Communication:

http://www.oracle.com/technology/sample_code/tech/java/jsps/ojsp/jspservlet.html

7
ответ дан YoK 20 August 2018 в 17:11
поделиться
Другие вопросы по тегам:

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