Rails флеш-сообщения в Java - PullRequest
       14

Rails флеш-сообщения в Java

6 голосов
/ 07 апреля 2009

Какой лучший способ получить Rails-подобные флеш-сообщения, такие как «Обновление успешно» http://api.rubyonrails.org/classes/ActionController/Flash.html) в мире Java? Я использую Spring MVC.

Ответы [ 5 ]

6 голосов
/ 26 января 2010

Я сделал именно это в Spring MVC с сессионной областью bean.

public class FlashImpl implements Flash, Serializable{

private static final long serialVersionUID = 1L;

private static final String ERROR = "error";
private static final String WARNING = "warning";
private static final String NOTICE = "notice";

private String message;
private String klass;

public void message(String klass, String message) {
    this.klass = klass;
    this.message = message;
}

public void notice(String message) {
    this.message(NOTICE, message);
}

public void warning(String message) {
    this.message(WARNING, message);
}

public void error(String message) {
    this.message(ERROR, message);
}

public boolean isEmptyMessage() {
    return message == null;
}

public void clear() {
    this.message = null;
    this.klass = null;
}

public String getMessage() {
    String msg = message;
    this.clear();
    return msg;
}

public void setMessage(String message) {
    this.message = message;
}

public String getKlass() {
    return klass;
}

public void setKlass(String klass) {
    this.klass = klass;
}}

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

Я предполагаю, что для запроса будет только один тип сообщения !. Если вы не хотите этого, вы можете создать хэш-карту, как уже предлагалось.

Я внедряю этот bean-компонент в мои контроллеры (на самом деле я внедряю его в базовый контроллер, унаследованный всеми остальными).

В вашем JSP вы должны добавить такой код:

<c:if test="${!flash.emptyMessage}" >
    <div class="${flash.klass}">${fn:escapeXml(flash.message)}</div>
</c:if>
5 голосов
/ 07 апреля 2009

Я бы порекомендовал реализовать это в виде HashTable для всего сеанса с привязкой строковых ключей к пользовательским объектам FlashItem. FlashItem будет просто содержать сохраняемый вами объект или строку, а также логическое значение, возможно, называемое IsNew, которое должно быть установлено в true, когда вы вставляете новый элемент в HashTable.

На каждой загрузке страницы вы затем выполняете итерацию HashTable, устанавливаете для любых элементов IsNew = true значение false и удаляете все элементы, для которых IsNew уже имеет значение false. Это должно дать вам возможность работать с флеш-функцией Rails.

4 голосов
/ 18 октября 2011

Это было добавлено в Spring MVC 3.1.RC1:

3.1.15. Атрибуты Flash и атрибуты перенаправления

Атрибуты Flash теперь можно сохранять во FlashMap и сохранять в сеансе HTTP, чтобы выдержать перенаправление. Для обзора общей поддержки атрибутов flash в Spring MVC см. Раздел 16.6, «Использование атрибутов flash» .

В аннотированных контроллерах метод @RequestMapping может добавлять флэш-атрибуты путем объявления аргумента метода типа RedirectAttributes. Этот аргумент метода теперь также можно использовать для получения точного контроля над атрибутами, используемыми в сценарии перенаправления. Подробнее см. Раздел 16.3.3.10, «Задание атрибутов перенаправления и прошивки» .

(выпуск JIRA: SPR-6464 )

2 голосов
/ 08 августа 2011

Я использовал пример Маноло Сантоса с Spring MVC следующим образом:

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


@Component
public class Flash {

    private static final String INFO = "info";
    private static final String SUCCESS = "success";
    private static final String ERROR = "error";
    private static final String WARNING = "warning";
    private static final String NOTICE = "notice";

    private final Map msgs = new HashMap();

    private boolean isKept;   // keep msg for one more request (when the controller method redirects to another)

    private void message(String severity, String message) {
        msgs.put(message, severity);
    }

    public void info(String message) {
        this.message(INFO, message);
    }

    public void success(String message) {
        this.message(SUCCESS, message);
    }

    public void notice(String message) {
        this.message(NOTICE, message);
    }

    public void warning(String message) {
        this.message(WARNING, message);
    }

    public void error(String message) {
        this.message(ERROR, message);
    }

    public boolean isEmptyMessage() {
        return msgs.isEmpty();
    }

    public void clear() {
        msgs.clear();
        isKept = false;
    }

    public Map getMessage() {
        return msgs;
    }

    public boolean isKept() {
        return isKept;
    }

    public void keep() {
        isKept = true;
    }

    public void unKeep() {
        isKept = false;
    }
}

Используйте перехватчик, чтобы добавить флэш-сообщение к объекту модели.


public class FlashMessageInterceptor extends HandlerInterceptorAdapter {

    @Resource
    Flash flash;

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        if (!flash.isKept()) {
            modelAndView.addObject("flash", flash);
        }
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        if (flash.isKept()) {
            flash.unKeep();
        }
        else {
            flash.clear();
        }
    }
}

В вашем контроллере, если у вас есть метод, который перенаправляет на другой метод, вы можете просто сказать; flush.keep (), чтобы отображалось флэш-сообщение.


@Controller
public class ComputerCampLove {

    @Resource
    private Flash flash;

    @RequestMapping(method = RequestMethod.GET)
    public String takeMeToAnotherPlace(Model model) {

        flash.info("Fa-fa-fa!");
        flash.keep();

        return "redirect:somewhere";
    }
}
0 голосов
/ 07 апреля 2009

Если вы не вложили огромный объем работы в свое весеннее Java-приложение, вы можете посмотреть на бегущие рельсы на jruby. Прелесть запуска jRuby на Rails в том, что вы можете смешивать и сочетать рубиновые гемы и java-библиотеки.

Если вы уже вложили достаточное количество работы в свое приложение, то это скорее всего не вариант.

...