Я учусь использовать playframework
, написав код для реализации webstore
для продажи товаров. Я реализовал область Admin
, используя модули crud
и secure
. Теперь я хочу создать shopping cart
, в который пользователь может добавлять элементы и переходить к оформлению заказа.
Мои знания об электронной торговле минимальны, но я просмотрел несколько учебников, в которых реализованы тележки для покупок и некоторые функции интернет-магазина с использованием servlets
. В книгах тележка использовалась для хранения Set
из CartItem
s, каждый из которых содержал экземпляры Product
и quantity
. После того, как пользователь добавил товары в корзину, корзина была сохранена в user session
.
Таким образом, каждый раз, когда пользователь переходил на страницу сведений о корзине, он показывал все добавленные товары. Только когда сеанс был очищен (либо из-за тайм-аута сеанса, определенного на сервере, либо при размещении заказа), CartItem
были удалены из ShoppingCart
.
Думаю, я могу использовать Cache в playframework, чтобы сделать это. После добавления CartItem в экземпляр ShoppingCart. Я могу
shopcart.add(mycartItem);
Cache.set(session.getId(), shopcart);
..
А позже, на другой странице, я могу получить корзину и ее содержимое, обработать их и очистить корзину.
ShopCart cart = Cache.get(session.getId(),ShopCart.class);
Set<CartItem> items = cart.getCartItems();
processOrder(items,userinfo);
...
cart.clearItems();
Правильный ли это способ сделать это? Если я думаю, неверно, пожалуйста, помогите мне предложениями.
2 ответа
Неправильный. Извините за такую резкость, но то, что вы делаете, может ужасно провалиться.
Игра - это ничто и без гражданства. Все соответствующие данные ДОЛЖНЫ храниться в базе данных. Это означает, что вы должны сохранять данные корзины покупок, когда пользователь добавляет новый элемент, и удалять их после завершения транзакции.
Почему нельзя использовать кеш? Поскольку кеш непостоянен, и элементы в нем могут быть удалены без предварительного предупреждения. Это означает, что в любой момент ваш кеш может вернуть null (элемент не найден), и вы получите исключение NullPointerException в своем коде, и ваш пользователь потерял корзину.
Кэш нужен только для повышения производительности, но нельзя ожидать, что он всегда будет иметь все необходимые элементы.
Вы должны превратить вашу ShopCart в объект (если он не один) и добавить к нему что-то вроде этого:
public static ShopCart findCart(String sessionId){
ShopCart sc = Cache.get(session.getId(),ShopCart.class);
if(sc == null){
sc = ShopCart.findCurrentUserCart(); //implement to find the cart of the current user
Cache.set(sessionId,sc);
}
return sc;
}
Затем используйте этот метод для извлечения корзины перед обработкой.
У меня нет большого опыта работы с Play! но я думаю, что это здорово. Ваша идея должна работать нормально. Я бы добавил тайм-аут для кешированного объекта корзины, как показано ниже:
Cache.set(session.getId(), shopcart, "30mn");
Приведенный выше код кэширует корзину на 30 минут.
Обратите внимание, что Cache.get может возвращать null, поэтому ваш код для обработки должен измениться на:
ShopCart cart = Cache.get(session.getId(),ShopCart.class);
if (cart != null) {
Set<CartItem> items = cart.getCartItems();
processOrder(items,userinfo);
cart.clearItems();
} else {
// maybe show expired session warning?
}
Также вам, вероятно, следует удалить объект корзины из кеша после успешного вызова processOrder (...).
Cache.delete(session.getId());
Надеюсь это поможет.
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].