Как сохранить объект ResourceBundle В сеансе java?

#java #session #serializable #resourcebundle #custom-tags

Вопрос:

У меня есть библиотека тегов для локализации, которая содержит 3 тега и один файл тегов:

SetLocale — установите выбранный язык для сеанса
SetBundle — набор тегов для сеанса, используя язык, который получен сеансом

 <?xml version="1.0" encoding="UTF-8"?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">

    <tlib-version>1.0</tlib-version>
    <short-name>myshortname</short-name>
    <uri>http://mycompany.com</uri>

    <tag>
        <name>setBundle</name>
        <tag-class>com.example.FinalProjectPM.web.handlers.BundleHandler</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>basename</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    <tag>
        <name>LValueParam</name>
        <tag-class>com.example.FinalProjectPM.web.handlers.LValueParamHandler</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>params</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>message</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
        <attribute>
            <name>checkParam</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
            <type>boolean</type>
        </attribute>
    </tag>
    <tag>
        <name>localeValue</name>
        <tag-class>com.example.FinalProjectPM.web.handlers.LocalValueHandler</tag-class>
        <body-content>empty</body-content>
        <attribute>
            <name>key</name>
            <required>true</required>
            <rtexprvalue>true</rtexprvalue>
        </attribute>
    </tag>
    <tag-file>
        <name>setLocale</name>
        <path>/WEB-INF/tags/setLocale.tag</path>
    </tag-file>
  
</taglib>
 

У меня есть файл тегов для настройки локали для сеанса

    <%@ tag import="java.util.Locale" %>
    <%@ tag language="java" body-content="empty" pageEncoding="utf-8" %>
    <%@ attribute name="name" required="true" rtexprvalue="true" type="java.lang.String" %>
    <%
    Locale locale = new Locale(name);
    session.setAttribute("tagLocale",locale);
    %>
 

Обработчик тегов для тега setBundle является :

 public class BundleHandler extends SimpleTagSupport {
    private String basename;

    public void setBasename(String basename) {
        this.basename = basename;
    }
    @Override
    public void doTag() {
        PageContext pageContext = (PageContext)getJspContext();
        HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
        HttpSession session = request.getSession();
        Locale gotLocale = (Locale)session.getAttribute("tagLocale");
        ResourceBundle bundle = ResourceBundle.getBundle(basename,gotLocale);
        session.setAttribute("Bundle",bundle);
    }
}
 

Как я могу хранить ResourceBundle в сеансе?Это работает, но IDE говорит мне, что ResourceBundle не реализует сериализуемость, поэтому мне нужно это сделать, но как?

Комментарии:

1. Вместо того, чтобы хранить весь набор ресурсов в сеансе, почему бы просто не сохранить языковой стандарт и/или имя набора ресурсов? Разве пакет ресурсов не доступен для всего веб-приложения?

2. @VGR Отличная идея, спасибо за ответ. Вы можете опубликовать свой ответ, чтобы я мог отметить ваш ответ как правильный

Ответ №1:

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

Веб-приложение имеет один и тот же путь к классу на протяжении всего срока службы, поэтому пакет ресурсов всегда будет доступен под этим именем.