利用stateful session bean 完成一个简单的购物车
1、建立ejbProject将要完成的业务抽象到远程接口中CartRemote:
package net.hnspi.ejb;
import java.util.Map;
import javax.ejb.Remote;
@Remote
public interface CartRemote {
public ShopItem addCart(ShopItem si) ;
public Map<ShopItem,Integer> itemInCart() ;
}
2、远程接口的实现类CartBean:
package net.hnspi.ejb;
import java.util.HashMap;
import java.util.Map;
import javax.ejb.Stateful;
@Stateful
public class CartBean implements CartRemote {
public CartBean(){}
//private Map<ShopItem,Integer> items = new HashMap<ShopItem,Integer>() ;
private Map<ShopItem,Integer> items ;
@Override
public ShopItem addCart(ShopItem si) {
if(itemInCart()==null){
items = new HashMap<ShopItem,Integer>() ;
}
int temp = 0 ;
if(items.containsKey(si)){
temp = items.get(si) ;
items.put(si, ++temp) ;
}else{
items.put(si, 1) ;
}
return si;
}
@Override
public Map<ShopItem,Integer> itemInCart() {
return this.items;
}
}
3、商品的pojo类ShopItem:
package net.hnspi.ejb;
import java.io.Serializable;
public class ShopItem implements Serializable{
private static final long serialVersionUID = 1L;
private int id ;
private String name ;
private double price ;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
/**
* 复写equals约定名称相同就为同一件商品
*/
@Override
public boolean equals(Object obj) {
if(this==obj){
return true ;
}
if(!(obj instanceof ShopItem)){
return false ;
}
ShopItem s = (ShopItem)obj ;
if(this.name.equals(s.name)){
return true ;
}else{
return false ;
}
}
@Override
public int hashCode() {
return this.name.hashCode()+5 ;
}
}
4、建立要访问ejb组件的web项目,在项目建立一个区的同一个ejb代理对象的工具类ContextManager:
package net.hnspi.util;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import net.hnspi.ejb.CartRemote;
public class ContextManager {
/*
public static void main(String[] args) {
Context cxt = getJbossContext() ;
CartRemote cr = null;
try {
cr = (CartRemote)cxt.lookup("Shop/CartBean/remote");
} catch (NamingException e) {
e.printStackTrace();
}
System.out.println(cr);
}
*/
private static CartRemote cr ;
public static Context getJbossContext(){
Properties pro = new Properties() ;
pro.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory") ;
pro.put(Context.PROVIDER_URL, "localhost:1099") ;
Context cxt = null;
try {
cxt = new InitialContext(pro);
} catch (NamingException e) {
e.printStackTrace();
}
return cxt ;
}
public static CartRemote getInstance(){
if(cr==null){
try {
cr = (CartRemote)getJbossContext().lookup("Shop/CartBean/remote");
} catch (NamingException e) {
e.printStackTrace();
}
}
return cr ;
}
}
5、对请求购买的商品进行处理的servlet ShopServlet:
package net.hnspi.servlet;
import java.io.IOException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.hnspi.ejb.CartRemote;
import net.hnspi.ejb.ShopItem;
import net.hnspi.util.ContextManager;
public class ShopServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response) ;
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
CartRemote cr = ContextManager.getInstance() ;
ShopItem si = null ;
String[] items = request.getParameterValues("item") ;
for(String s : items){
si = new ShopItem() ;
si.setName(s) ;
cr.addCart(si) ;
}
Map<ShopItem,Integer> map = cr.itemInCart();
request.setAttribute("items", map) ;
request.getRequestDispatcher("display.jsp").forward(request, response) ;
}
}//不要忘了在web.xml中进行servlet的配置
6、进行商品购买的jsp页面shopitem_list.jsp
<?xml version="1.0" encoding="UTF-8" ?>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>shopItem_list</title>
</head>
<body>
<fieldset>
<legend>商品列表</legend>
<form action="shopServlet.do">
<input type="checkbox" name="item" value="struts" />Struts<br />
<input type="checkbox" name="item" value="hibernate" />Hibernate<br />
<input type="checkbox" name="item" value="spring" />Spring<br />
<input type="submit" value="提交" />
</form>
</fieldset>
</body>
</html>
7、进行商品显示的页面display.jsp
<?xml version="1.0" encoding="UTF-8" ?>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*,net.hnspi.ejb.*" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<base href="<%=basePath%>" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>title</title>
</head>
<body>
<%
Map<ShopItem,Integer> items = (Map<ShopItem,Integer>)request.getAttribute("items") ;
for(Map.Entry<ShopItem,Integer> me : items.entrySet()){
%>
商品名称:<%=me.getKey().getName() %>----数量:<%=me.getValue() %><br />
<%
}
%>
</body>
</html>
学习书籍:经典java ee企业应用实战
分享到:
相关推荐
综上所述,《ejb学习笔记》涵盖了从EJB的基本概念、不同类型的Bean,到其部署、配置以及与企业信息系统集成的各种细节。对于希望深入了解并掌握EJB3开发技术的开发者而言,这些知识点构成了不可或缺的基础。
### 基于Weblogic的EJB学习笔记详解 #### EJB基础知识概览 ##### 1. 无状态会话Bean (Stateless Session Bean) 无状态会话Bean是一种不保存客户端会话状态的EJB组件。这意味着每个客户端的请求都不依赖于前一个...
WebLogic EJB学习笔记主要涵盖了企业级Java Bean(Enterprise JavaBeans,简称EJB)在Oracle WebLogic Server中的应用和管理。EJB是Java EE(Java Platform, Enterprise Edition)平台的核心组件,用于构建可扩展、...
### EJB学习笔记8:深入理解事务处理机制 #### 一、事务的背景知识 **事务**是指一系列操作,这些操作作为一个不可分割的工作单元来执行,即要么全部完成,要么完全不执行。事务的主要特性包括: - **原子性...
**EJB3.0 学习笔记** EJB(Enterprise JavaBeans)是Java EE平台中的核心组件,用于构建可扩展的、安全的、事务处理的分布式应用程序。EJB3.0是EJB的一个重大更新,引入了许多改进,使得开发过程更为简化,降低了...
- **会话bean(Session Beans)**:提供业务逻辑,可以分为有状态(Stateful)和无状态(Stateless)。有状态bean能记住客户端的交互历史,而无状态bean对每个请求都独立处理。 - **消息驱动bean(Message-Driven ...
它们不对应于持久化的数据库对象,而是用于处理用户的交互和业务流程,可以是无状态的(Stateless Session Bean)或有状态的(Stateful Session Bean)。 6. **Notes.doc**:可能是指IBM Lotus Notes,一种协作软件...
会话bean主要用于业务逻辑处理,可以分为有状态会话bean(Stateful Session Beans)和无状态会话bean(Stateless Session Beans)。前者能够跟踪用户会话状态,而后者不保存会话状态,适用于处理无关联的请求。 ...
2. **会话Bean**:会话Bean分为无状态会话Bean(Stateless Session Beans)和有状态会话Bean(Stateful Session Beans)。无状态会话Bean不保存客户端状态,适合执行无关联的业务操作;有状态会话Bean则可以保持与...
- 提供的教程如“EJB学习笔记.docx”、“精通EJB3.0.pdf”等,通常涵盖了EJB的基本概念、组件使用、部署配置以及最佳实践。 9. **源码分析**: - “EJB3.0实例教程(含源码).rar”提供了实际项目源码,帮助读者...
在"学习EJB3基础知识笔记"中,我们将深入探讨EJB3的主要特性和使用方法。 1. **注解驱动的编程模型**: EJB3引入了注解,极大地减少了XML配置文件的使用。通过在实体类、接口或实现类上添加注解,如`@Entity`、`@...
本笔记代码主要涵盖了EJB3的一些核心特性,包括定时任务(timer)、会话bean(session)、实体bean(entity)、拦截器(interceptor)、领域模型(domain)、客户端(client)、事务管理(transaction)、消息传递...
5. **简化会话bean(Session Beans)**:EJB 3.0区分了无状态会话bean(`@Stateless`)和有状态会话bean(`@Stateful`),无状态bean适用于简单的请求-响应模式,而有状态bean则能保持客户端会话的上下文。...