Liferay: Как вызвать сервлет со страницы JSP - PullRequest
3 голосов
/ 12 декабря 2011

Это мой первый портлет.Я не получаю значения в моем сервлете.Пожалуйста, смотрите программу.Внутри моего пользовательского метода Java класса doView() портлета я показываю страницу JSP

public void doView(RenderRequest renderRequest, RenderResponse renderResponse)
throws IOException, PortletException {            
    include(viewJSP, renderRequest, renderResponse);
}

На странице view.jsp я обращаюсь к сервлету для получения значений:

<form action="formServlet" method="post">
    <h1>Please Login</h1>
    Login:    <input type="text" name="login"><br>
    Password: <input type="password" name="password"><br>
    <input type=submit value="Login">
</form>

Внутри web.xml файла:

<servlet>
    <servlet-name>formServlet</servlet-name>
    <servlet-class>FormServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>formServlet</servlet-name>
    <url-pattern>formServlet</url-pattern>
</servlet-mapping>

Внутри моего сервлета

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {  
    String name = (String)request.getParameter("login");
    System.out.println("The Name is "+name);    
}

Но я не знаю, почему сервлет не вызывается.

Ответы [ 2 ]

9 голосов
/ 13 декабря 2011

ПРИМЕЧАНИЕ : Это ответ на несколько сложный вопрос. Если вы пытаетесь изучить основы создания портлетов, я разместил лучший ответ в другом вопросе.


Вы отправляете форму, используя метод POST , но ваш сервлет просто реализует doGet(), который обслуживает метод GET. Вы должны либо отправить свою форму, используя GET, либо внедрить метод doPost() (что было бы предпочтительнее в других ситуациях).

Кроме того, перед символом <url-pattern> необходимо ставить косую черту, если это абсолютный шаблон. То есть должно быть

<url-pattern>/formServlet</url-pattern>

вместо

<url-pattern>formServlet</url-pattern>

Тем не менее, забудь сервлеты сейчас!

Вы делаете это одним из худших способов . Это действительно плохая идея написать портлет, который вызывает сервлет. После долгого времени работы с Liferay я могу представить себе ситуации, в которых это будет более или менее разумно, но его здесь нет и не будет в большинстве случаев.

Итак, что вы должны делать? Вы должны отправить свою форму на URL-адрес действия . Для этого сначала включите тег тега portlet в JSP:

<%@ taglib uri="http://java.sun.com/portlet" prefix="portlet" %>

Теперь замените action вашей формы на <portlet:actionURL />. Этот тег будет заменен специальным URL, созданным порталом. Кроме того, предшествует каждому входному имени с тегом <portlet:namespace />; ваш <input type="text" name="login"> должен стать <input type="text" name="<portlet:namespace />login"> тогда. Этот тег будет заменен строкой, которая связана только с вашим портлетом; поскольку на странице может быть много портлетов, каждый вход должен указывать, из какого портлета он поступает. Это конечный результат:

<form action="<portlet:actionURL />" method="post">
    <h1>Please Login</h1>
    Login:    <input type="text" name="<portlet:namespace />login"><br>
    Password: <input type="password" name="<portlet:namespace />password"><br>
    <input type=submit value="Login">
</form>

Теперь вы собираетесь отправлять свои данные правильно - но как получить отправленные данные? Разумеется, использовать сервлет не обязательно! Вместо этого добавьте в свой пользовательский класс портлета метод с именем processAction(). Этот метод должен вернуть void и получить два параметра времени javax.portlet.ActionRequest и javax.portlet.ActionResponse. Это пример пустого processAction():

public void processAction(ActionRequest request, ActionResponse response) {
    // Nothing to be done for now.
}

Когда запрос на URL-адрес действия (такой как сгенерированный <portlet:actionURL />) отправляется на сервер, он сначала обрабатывается методом processAction(), а затем doView(). Поэтому код, который вы бы написали в своем сервлете , должен быть помещен в ваш processAction(). Результат должен быть тогда:

public void processAction(ActionRequest request, ActionResponse response) {
    String name = (String)request.getParameter("login");
    System.out.println("The Name is "+name);
}

Попробуйте, и вы увидите, что это будет хорошо работать.

2 голосов
/ 13 декабря 2011

гггг - вот ответ на ваш комментарий:

На странице JSP вам необходимо добавить следующее для каждого из действий, которые вы хотите выполнить с помощью этого портлета:

<portlet:actionURL var="addUserURL">
<portlet:param name="<%= ActionRequest.ACTION_NAME %>" value="addUser" />
</portlet:actionURL>

<form method="post" action="<%= addUserURL %>">

Тогда в вашем портлете com.test.Greeting у вас будет для каждого из них:

public void addUser (ActionRequest actionRequest, ActionResponse actionResponse) {}

Это отвечает на ваш вопрос?

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

...