Я надеюсь, что смогу объяснить это правильно. Я разрабатываю портлет для Liferay с помощью Spring. Это система с доской для записей. Так что у меня есть представление (Jsp), которое показывает детали определенной записи в буфер обмена, учитывая его идентификатор. Кроме того, есть ссылка, которая идет на AddCommentController для добавления нового комментария к записи в доске, на которой в данный момент просматривает пользователь. AddCommentController расширяет SimpleFormController в Spring и имеет также прикрепленный к нему валидатор:
<bean id="addCommentController" class="com.lifepin.controllers.AddCommentController" parent="lifePinControllerTemplate">
<property name="formView" value="addComment" />
<property name="successView" value="viewEntryDetail" />
<property name="validator" ref="commentValidator"/>
</bean>
Валидатор действительно прост и выглядит следующим образом:
public class CommentValidator implements Validator {
public boolean supports(Class clazz) {
return clazz.equals(Comment.class);
}
public void validate(Object obj, Errors validationError) {
ValidationUtils.rejectIfEmptyOrWhitespace(validationError, "content", "err.content.empty", "This value is required");
}
}
Теперь представление, где пользователь может ввести свой комментарий, имеет две кнопки: Сохранить и отменить. Вот два генератора для соответствующих URL.
<portlet:actionURL var="actionUrl">
<portlet:param name="action" value="addComment"/>
<portlet:param name="pinboardEntryId" value="${param.pinboardEntryId}"/>
</portlet:actionURL>
<portlet:renderURL var="cancelUrl">
<portlet:param name="action" value="viewPinboardEntry"/>
<portlet:param name="pinboardEntryId" value="${param.pinboardEntryId}"/>
</portlet:renderURL>
В onSubmitAction AddCommentController я считываю параметр (см. 1-й actionURL выше) и передаю его в ActionResponse s.t. в подробном представлении записи в буфер обмена я могу снова загрузить запись и отобразить ее.
public class AddCommentController extends SimpleFormController{
...
@Override
protected void onSubmitAction(ActionRequest request, ActionResponse response, Object command, BindException bindException)
throws Exception {
long pinboardEntryId = PortletRequestUtils.getLongParameter(request, ParameterNameConstants.PINBOARDENTRY_ID, -1);
...
}
...
}
Это все работает нормально, кроме случаев, когда возникает ошибка проверки. В этом случае я теряю параметр «pinboardEntryId» из URL, и у меня нет никакого способа прочитать этот параметр в CommentValidator, чтобы снова передать его в ответ, поскольку у меня нет PortletRequest или ответа.
Пока я решил эту проблему, сохранив идентификатор сеанса и получив его оттуда. Однако я хотел спросить, есть ли у кого-то из вас альтернативное решение без использования сеанса. Я совершенно уверен, что есть один.
Спасибо,
Juri