Зависимость параметров навигации JSF - PullRequest
0 голосов
/ 09 января 2012

Я пытаюсь реализовать этот простой пример в JSF: есть страница user.xhtml, доступ к которой можно получить с помощью параметра id (user.xhtml? Id = 3 / user.xhtml? Id= 12).В зависимости от идентификатора На странице должна отображаться информация о пользователе, у которого есть указанный идентификатор.

@ManagedBean
@RequestScoped
public class OverviewController extends BaseController{

private UserDetails details;

@PostConstruct
@SuppressWarnings("unused")
private void init(){
    Integer userId = getIntegerParam(Constants.PARAMETER_USER); //this brings the value of the user parameter as an Integer
    if (userId != null){
        UserService userService = new UserService();
        details = userService .getDetails(userId);
    }
}

//GET & SET

}

В файле xhtml у меня есть следующее:

<div>
    Name: #{overviewController.details.name}
    City: #{overviewController.details.city}
</div>

Ссылка, которая направляла управление здесь:

<h:link outcome = "user.xhtml" value = "details">
    <f:param name = "user" value = "2">
</h:link>

У меня сложилось впечатление, что при доступе к обзорному контроллеру через EL ManagedBean будет сконструирован, а в @PostConstruct details будет инициализирован.Но я не получаю никаких результатов, и обзор контроллера даже не создан.Я продолжаю свой вопрос и спрашиваю, как можно реализовать поиск по нескольким параметрам или сортировке?

Ответы [ 2 ]

1 голос
/ 09 января 2012

Что касается вашей конкретной проблемы, ваш @PostConstruct неправильно объявлен private вместо public.

Что касается вашего конкретного функционального требования, это не совсем правильный путь.Вам нужно <f:viewParam> на целевой странице, чтобы установить параметр запроса идентификатора пользователя как свойство UserDetails в компоненте поддержки.

user.xhtml

<f:metadata>
    <f:viewParam id="param_id" name="id" value="#{overviewController.details}"
        converter="userDetailsConverter" converterMessage="Bad request, unknown user"
        required="true" requiredMessage="Bad request, use a link from within the system"
    />
</f:metadata>
<h:message for="param_id" />

UserDetailsConverter

@FacesConverter("userDetailsConverter")
public class UserDetailsConverter implements Converter {

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        if (!(value instanceof UserDetails) || ((UserDetails) value).getId() == null) {
            return null;
        }

        return String.valueOf(((UserDetails) value).getId());
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        if (value == null || !value.matches("\\d+")) {
            return null;
        }

        UserDetails details = new UserService().getDetails(Integer.valueOf(value));

        if (details == null) {
            throw new ConverterException(new FacesMessage("Unknown user ID: " + value));
        }

        return details;
    }

}

OverviewController

private UserDetails details; // Getter+setter

См. Также:

0 голосов
/ 09 января 2012

Ну, я не знаю, как на самом деле работает ваш метод getIntegerParam, но я обычно реализую обработку параметров запроса следующим образом.

Редактировать : На самом деле я не уверен, будет ли init() действительно вызываться после установки свойства userId (я обычно вызывал его непосредственно из установщика), но, вероятно, следует @PostConstruct методы вызываются после внедрения зависимостей.

@ManagedBean
@RequestScoped
public class OverviewController extends BaseController {

    @ManagedProperty("#{param['userId']}")
    private String userId; // not sure if can automatically be parsed to Integer

    private UserDetails details;

    @PostConstruct
    private void init() {
        if (userId != null){
            UserService userService = new UserService();
            details = userService .getDetails(userId);
        }
    }

    // getter & setter for userId
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...