request.getSession () имеет значение null - PullRequest
0 голосов
/ 06 февраля 2012

Буду признателен, если кто-нибудь поможет мне со следующей проблемой. У меня есть отчет о яшме, который я заполняю PrintingBean, и все хорошо. В тот момент, когда я нажимал на кнопку предварительного просмотра печати (открывая апплет), мое приложение выдает исключение нулевого указателя по адресу:

if (bean.getPrintingDataList() != null && !bean.getPrintingDataList().isEmpty())

Кажется, что это делает новую сессию (но я не вижу этого на графическом интерфейсе, все хорошо). Мой manageBean - это SessionScoped. Это весь мой метод:

private void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    JasperPrint jasperPrint = null;

    try {
        PrintingBean bean = (PrintingBean) request.getSession().getAttribute("printMB");
        if (bean.getPrintingDataList() != null && !bean.getPrintingDataList().isEmpty()) {
            jasperPrint = printManager.print(bean.getPrintingDataList());
        }
    } catch (Exception ex) {
        Logger.getLogger(JasperPrintServlet.class.getName()).log(Level.SEVERE, null, ex);
    }
    if (jasperPrint != null) {
        response.setContentType("application/octet-stream");
        ServletOutputStream ouputStream = response.getOutputStream();

        ObjectOutputStream oos = new ObjectOutputStream(ouputStream);
        oos.writeObject(jasperPrint);
        oos.flush();
        oos.close();

        ouputStream.flush();
        ouputStream.close();
    }
}

Ответы [ 2 ]

1 голос
/ 07 февраля 2012

Сеанс поддерживается файлом cookie с именем JSESSIONID.Обычно этот файл cookie устанавливается сервером в начале сеанса, и этот файл cookie возвращается от клиента к серверу при каждом последующем отдельном HTTP-запросе в течение сеанса.Клиент (веб-браузер) делает все это прозрачно.Смотрите также Как работают сервлеты?Создание экземпляров, сеансы, общие переменные и многопоточность .

В апплете вам нужно симулировать то же, что и веб-браузер.Когда апплет подключается к сервлету и ему необходим доступ к тому же сеансу, что и к странице, которая обслуживает апплет, вам следует убедиться, что вы добавляете тот же cookie сеанса в тот же HTTP-запрос, который был отправлен апплетом.

Самое простое - передать идентификатор сеанса в качестве параметра апплету:

<param name="JSESSIONID" value="#{session.id}">

(примечание: я предполагаю, что вы используете Facelets в качестве технологии просмотра, если выЕсли вы использовали JSP, то вместо этого вы должны использовать ${pageContext.session.id})

Чтобы вы могли соответственно установить необходимый файл cookie сеанса в апплете:

String jSessionID = getParameter("JSESSIONID");
URL servletURL = new URL(getCodeBase(), "yourServletURL");
URLConnection connection = servletURL.openConnection();
connection.setRequestProperty("Cookie", "JSESSIONID=" + jSessionID);
// ...

Это должно дать вамтот же сеанс обратно в сервлете на request.getSession().

0 голосов
/ 07 февраля 2012

Если есть запрос, то должен быть сеанс.Я думаю, .getAttribute("printMB") является нулевым.Вы должны проверить, прежде чем бросить его на PrintingBean.

...