JSP: setProperty для бина не работает должным образом - PullRequest
1 голос
/ 02 декабря 2009

Привет! У меня проблема с заданным тегом свойства. У меня есть jsp, который я включаю в веб-центр в качестве портлета.

<jsp:useBean id="pathEditor" class="backing.bean.AppletBean" scope="page"/>

<jsp:getProperty name="pathEditor" property="username" />
${pageContext.request.remoteUser}
<jsp:setProperty name="pathEditor" property="username" value="${pageContext.request.remoteUser}"/>
<jsp:getProperty name="pathEditor"  property="username" />

Я делаю вход в систему из двух разных браузеров с одного и того же т / х. значение имени пользователя в first приходит корректно, в то время как второй логин печатает ${pageContext.request.remoteUser} правильное, но <jsp:getProperty name="pathEditor" property="username" /> печатает предыдущего вошедшего в систему пользователя. Создается впечатление, что setProperty вообще не вызывается. Может ли кто-нибудь предположить, что здесь может быть не так. Я использую два разных браузера и не использую статическую переменную. Я держу оба браузера открытыми для этого теста. это может быть из-за того, как портлеты обрабатываются в веб-центре. если я объявляю область действия bean-компонента как страницу, это не правильный путь для обеспечения безопасности потока. что я могу сделать, чтобы сделать это потокобезопасным? Я сделал переменные свойства бина изменчивыми, но это не приносит пользы. или это возможно, что я уничтожаю боб после использования? Как я могу уничтожить боб?

так что, если я включу это - <% @ page isThreadSafe = "false"%> в jsp, это должно работать. но это тоже не работает.

Edit # После отладки кода я увидел это необычное поведение. Я поместил System.out.println в свой bean-компонент, чтобы узнать, какое значение исходит от jsp. хотя $ {pageContext.request.remoteUser} печатает новое значение - jsp: setProperty name = "pathEditor" property = "username" value = "$ {pageContext.request.remoteUser}" /> передает старое значение в мой метод установки бинов. Я не могу этого понять. Пожалуйста, помогите.

1 Ответ

2 голосов
/ 02 декабря 2009

Насколько отличаются два браузера? Различные вкладки / окна / экземпляры одного и того же браузера делают все будут совместно использовать один и тот же сеанс. Лучше тестировать, используя браузеры разных марок, например один Firefox и другой IE, Safari, Chrome или Opera.

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

Редактировать # 1: как ответ на собственное редактирование: код просто не безопасен для потоков. Несомненно, на каком-то уровне есть переменная экземпляра static или сервлета (in), непосредственно содержащая информацию. Трудно указать точную строку кода на этом расстоянии. Просто запустите отладчик и отладьте код, или опубликуйте SSCCE здесь, или попросите местного эксперта проверить ваш код.

Редактирование # 2: безопасность потоков в jsp / servlets не имеет ничего общего с использованием синхронизированных / volatile / и т.д. Все дело в написании правильного кода. Переменная static НЕ является потокобезопасной. Все, что объявлено в методе doXXX () сервлета, является потокобезопасным, а снаружи - НЕ. Такого рода вещи. Имейте в виду: один HTTP-запрос учитывает один поток. За время жизни приложения существует только один экземпляр сервлета.

Пример: * * тысяча двадцать-пять

public class MyBean { 
    private static String property1; // Certainly NOT threadsafe, there is only 1 of it during application's lifetime.
    private String property2; // Threadsafety depends on class which is holding the Bean instance.
}

и

public class MyServlet extends HttpServlet {
    private static Bean bean1 = new Bean(); // Certainly NOT threadsafe, there is only 1 of it during application's lifetime.
    private Bean bean2 = new Bean(); // This also NOT, because there's only 1 servlet in application's lifetime which is shared among all requests.

    protected void doSomething(request, response) {
        Bean bean3 = new Bean(); // Declared threadlocal, thus certainly threadsafe.
        request.setAttribute("bean", bean3); // 1 request = 1 thread, thus threadsafe.
        request.getSession().setAttribute("bean", bean3); // Session is shared among requests/threads from same client, thus NOT threadsafe.
        getServletContext().setAttribute("bean", bean3); // Context is shared among all sessions from different clients, thus certainly NOT threadsafe.
    }
}

Область страницы в JSP определенно является поточно-ориентированной. Ваша проблема лежит на более высоких уровнях. Моя ставка на переменную static где-то.

...