2016-05-22 2 views
-1

Я использую Java (JSP и сервлеты), но застрял. Из моих исследований я считаю, что я, возможно, потребуется объект сеансового уровняПростая проблема с JSP/сервлетом с объектом доступа

Пользователь завершает форму JSP, прессы представить, и это POST классу NewServlet.

Внутри NewServlet объект NewFileThing создается, где хранится эта информация.

@WebServlet(urlPatterns = {"/NewServlet"}) 
    public class NewServlet extends HttpServlet { 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

    // Stuff happens here... 
String nameOfUser = request.getParameter("name"); 

    NewFileThing fi = NewFileThing(); 
    fi.addName(name); 

    response.sendRedirect("nextForm"); 
    } 
    } 

Затем пользователь перенаправляется на следующийForm.jsp. Когда они заполняют эту форму, они отправляются в FinalServlet.

@WebServlet("/FinalServlet") 
@MultipartConfig 
public class FinalServlet extends HttpServlet { 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 

// TODO how can I access object fi (NewFileThing) from here? 
fi.getName(); <--- Error, or if I make new object it's NULL... 
} 
} 

Вопрос: В FinalServlet, как я могу получить тот же объект NewFileThing я создал ранее (один экземпляр)? Я не хочу создавать новую!

Благодарим вас!

ответ

0

Да, одним из способов является сохранение этого объекта в сеансе.

В NewServlet

NewFileThing fi = NewFileThing(); 
fi.addName(name); 

// get the session 
HttpSession session = request.getSession(); 
session.setAttribute("NewFileThing", fi); 

В FinalServlet

// get the session 
HttpSession session = request.getSession(); 

// get object from session 
NewFileThing fi = (NewFileThing) session.getAttribute("NewFileThing"); 

// Make sure it is on the session 
if (fi != null) 
{ 
    String name = fi.getName(); 
} 
+0

Есть ли ограничение на размер того, что может быть помещено в HttpSession? – user5623335

+0

Это действительно зависит от ресурсов памяти сервера. Вы можете определенно сохранить там хорошую сумму, но я бы не стал слишком сумасшедшим. Вы также должны учитывать, сколько одновременных пользователей будет. Постарайтесь сохранить сессию как можно меньше. Если вам нужно хранить более крупные объекты, посмотрите другие формы постоянного хранилища (например, файлы, таблицы базы данных и т. Д.). –

+0

java.lang.IllegalArgumentException: setAttribute: несериализуемый атрибут с именем fi. Я имею решение googled, но не понимаю: вы можете сделать объект сериализуемым, используя сериализуемую реализацию List и убедиться, что объекты в списке также сериализуемы. – user5623335

0

Если это простой веб-приложение, то «да», хранить объект в HttpSession.

Если это более сложный WebApp, то вы можете сохранить объект в HttpSession, но вы должны быть «умнее» о том, как вы это делаете. Или, подумайте о том, чтобы использовать постоянное хранилище.

+0

Какой тип постоянного хранилища, как база данных? Я думаю, что в моем случае HttpSession будет в порядке, так как это просто имя, адрес и т. Д. – user5623335

+0

Общее постоянное хранилище - это база данных. Подумайте о чем-то вроде корзины покупок. – hooknc

0

response.sendRedirect() не будет хранить ваши данные запроса. Вы должны использовать класс RequestDispatcher. Существует несколько способов передачи данных в нескольких классах. Вы можете поместить его в область страницы, область запроса, область действия сеанса или область приложения в соответствии с вашими потребностями. В области страницы ваши данные объекта сохраняются только на одной странице. В области запроса ваш объект сохранит до следующей следующей страницы. В области сеанса ваш объект будет сохраняться на нескольких страницах в одном и том же приложении в то же время сеанса. В области приложения ваш объект может также участвовать в нескольких приложениях.

Наиболее часто используемые области - запрос и сеанс.

Session необходимо использовать с особой осторожностью он может messup с другой сессии, если не используется.

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

В первом объекте сервлет положить в сессии

NewFileThing fi = NewFileThing(); 
fi.addName(name); 

// get the session 
HttpSession session = request.getSession(); 
session.setAttribute("NewFileThing", fi); 

Используйте его, где вы хотите // получить сеанс HttpSession сессии = запрос.getSession(); // получить объект из сеанса NewFileThing fi = (NewFileThing) session.getAttribute ("NewFileThing");

// Make sure it is on the session 
if (fi != null) 
{ 
    String name = fi.getName(); 
} 
Смежные вопросы