📄 ejb3-1.txt
字号:
ejb3.0所用的技术:
rmi:远程方法调用
客户端可以直接调用服务端的相关方法
jndi:相当于dns,是类的一个别名可以更好的记忆。
连接池:
事先有n个连接,可以直接取,用完了还可以放回去。
JBOSS安装:
java -jar jboss-4.0.4.GA-Patch1-installer.jar
在windows的环境加入一个环境变量JBOSS_HOME
JBOSS_HOME=C:\jboss404
如果在安装时是
ejb3_clusered:集群
default
直接运行run.bat,就可以启动jboss
如果是all
在dos下,run -c all
JBOSS的目录
C:\jboss-404\bin:运行目录
C:\jboss-404\client:客户端需要的类包
C:\jboss-404\docs\examples\jca:连接池的模板文件
C:\jboss-404\server\default\DEPLOY:所有JAR ERA WAR包的部署目录
C:\jboss-4.0.4.GA\server\default\lib:部署文件的包库
C:\jboss-404\server\default\work:可以看到JSP页面的源代码
C:\jboss-404\docs\dtd:所有的JBOSS所有的DTD文件
C:\jboss-404\server\default:默认的运行目录,在安装时确定(ALL DEFAULT MINI)
配置数据源连接池的过程
将MSSQL中的三个类包拷到C:\jboss-404\server\default\lib目录下
将C:\jboss-404\docs\examples\jca模板目录中的MSSQL-DS.XML拷到C:\jboss-404\server\default\DEPLOY目录下
修改C:\jboss-404\server\default\DEPLOY中的内容指定到对应的数据库及用户名和密码
建立EJB3.0实体BEAN的过程
在SRC下建立一个META-INF目录
在META-INF中加入一个persistence.xml文件,内容如下,文件名必须是persistence.xml
<persistence>
<persistence-unit name="foshanshop">
<jta-data-source>java:/MSSQLDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
</persistence>
将build.xml拷到工程的根目录下。
ant的作用:
编译
打包
jar:ejb class
ear:jar+war(ejb+struts)
war:web处理,jsp、action、actionForm
部署:
发部到服务器上
文件目录的创建、删除、复制
加载模板
window-->preferences-->java-->Editor-->Templates
导入
写代码
将eclipse的编译环境变为jdb5.0,java compiler
持久化核心类
--持久化类
@Entity
@Table(name = "Customer")
public class myEntity
{
@id
public Integer getCustomerID()
{
}
}
--持久化代码
EntityManager em
merge --修改
remove --删除
find(Class,Object) --查找
Query query=em.createQuery("select c from Customer c where c.customerName=?1 and c.pwd=?2");
query.setParameter(1,customer.getCustomerName);
List list=query.getResultList();
业务层
一个接口,一个类
//接口
public interface IFacade
{
public void insert() throws Exception
}
//实现类
@Stateless //当前是一个无状态的sessionBean
@Remote ({IFacade.class}) //其远程接口是IFacade
public Class Facade implements IFacade
{
@PersistenceContext
protected EntityManager em;
public void insert() throws Exception
{
em.persist();
}
}
如何得到上下文环境(jndi.config)
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming
jndi:java naming directory interface(dsn)
rmi:远程方法调用
客户端可以直接访问服务器的方法。
访问过程:
上下文件环境
在properties中加入一个地址localhost:1099
在properties中加入一个工厂org.jnp.interfaces.NamingContextFactory
Properties p=new Properties();
p.load(Class.getReasouseAsStream(jndi.config));
Context context=new InitContext(p)
通过lookup得到远程接口
IFacade facade=(IFacade)context.lookUp("Facade/remote");
ejb3.0:
SesssionBean:
stateless:无状态(1..n客)
只要一个接口一个类
stateful:有状态(1..1)
EntityBean:(cmp)
持久化
ejb3.0与ejb2.0之间的比较:
所有的配置没有xml文件,使用注释的原元素来说明,jdk1.5。
ejb2.0要有两个接口一个类,与框架的耦合度太高,ejb3.0是pojo:
提高开发效率,调试
提高了测试,对于实体bean还是要发部到容器中进行处理。
ejb3.0在jboss中使用hibernate技术作为实体bean,去除ejb2.0所具有缺点。
ejb3.0的实体bean可以处在:自由、持久、游离,可以直接返回一个pojo
ejb2.0离不开容器,实体只能返回一个远程或本地接口,要进行传送要dto,dto是不符合面向对象的思想。
pojo:pure old java object
dto:data translate object(get set)
ejb3.0与spring的比较
ejb3.0:
pojo:部分的依赖于容器
减少了xml文件,使用注释的元素来说明,jdk1.5
与容器紧密的整合有一起,所在执行效率上较高(事务、日志)
所有服务是容器提供的,如果想减去一些不用的服务,只能调整容器。
spring:
pojo:完全不依赖于容器,测试
一切都是xml文件,配置复杂
在容器之上,所在效率低一些
在容器之上,选择不同的服务(安全、事务、分布式)。
cascade 的值只能是:
无:不需要级联
one表可以不加many,但many要加one,主要来控制主外键
one表通过add对象加入的内容,在many不用设置。
CascadeType.PERSIST(级联新建)
CascadeType.REMOVE(级联删除)
CascadeType.REFRESH(级联刷新)
CascadeType.MERGE(级联更新)
CascadeType.ALL(所有的都可以)
onetomany
mappedBy="customer":代表是双向,如要关联,将其作为另一个对象的属性。
fetch:延时:默认是lazy
FetchType.EAGER:瞬时
FetchType.LAZY。
@OrderBy(value = "buyID ASC")注释指明加载buy 时按buyID 的升序排序
manytoone:
@ManyToOne注释有四个属性:targetEntity、cascade、fetch 和optional
optional=true:buy所有,customer匹配
@JoinColumn(name = "customer_name")注释指定buy映射表的customer_name列作为外键与Customer映射表的主键列
关联。
onetoone:实际上是onetomany的一个变种,不同的是many的
@JoinColumn(unique="true"),可以变成的one-to-one
使用方法一onetomany一样。
mappedBy="person":代表是双向,如要关联,将其作为另一个对象的属性,其是one表。
one用onetoone
many用Manytoone @JoinColumn(unique="true")
manytomany:
两个表之间的关系是many的时候,根据一个表主键可以直接取出另一个表的所有内容
实现基理:
有一个中间表即关系集,实现多与多的关系。
被控方:
@ManyToMany(mappedBy = "students")
主控方:
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "teacherstudent",
joinColumns = {@JoinColumn(name = "teacher_ID", referencedColumnName = "teacherID")},
inverseJoinColumns = {@JoinColumn(name = "student_ID", referencedColumnName =
"studentID")})
复合主键:
作一个主键类,有一个默认的构造函数,要序列化,包括多个属性,
这个类的实现equals及hashCode方法。
要有一个注释:@Embeddable,可以声明其列
主键类整体作为主表的一个属性,进行相关的操作。
在关联的时候的处理:
有复合主键的是one,有另一个many表的外键指向one表的主键,要如下:
@JoinColumns
({
@JoinColumn(name="first_name", referencedColumnName = "firstName", nullable=false),
@JoinColumn(name="last_name", referencedColumnName = "lastName", nullable=false)
})
消息驱动bean:异步。(Message Driver Bean)
jms:(java message server)
概念:
消息驱动Bean(MDB)是设计用来专门处理基于消息请求的组件。
一个MDB类必须实现MessageListener 接口。
当容器检测到bean守候的队列一条消息时,
就调用onMessage()方法,将消息作为参数传入。
MDB在OnMessage()中决定如何处理该消息。
你可以用注释来配置MDB 监听哪一条队列。
当MDB 部署时,容器将会用到其中的注释信息。
使用的时间:
当一个业务执行的时间很长,
而执行结果无需实时向用户反馈时,
很适合使用消息驱动Bean
种类:
注释信息:
@MessageDriven(activationConfig =
{
@ActivationConfigProperty(propertyName="destinationType",
propertyValue="javax.jms.Queue"),
@ActivationConfigProperty(propertyName="destination",
propertyValue="queue/foshanshop")
})
@ActivationConfigProperty注释配置消息的各种属性
destinationType属性指定消息的类型,
topics:(javax.jms.Topic)
Topics 可以有多个客户端。
用topic 发布允许一对多,或多对多通讯通道。
消息的产生者被叫做publisher,
消息接受者叫做subscriber。
Queue(javax.jms.Queue) 仅仅允许一个消息传送给一个客户。
一个发送者将消息放入消息队列,
接受者从队列中抽取并得到消息,
消息就会在队列中消失。
destination属性用作指定消息路径,消息驱动Bean在发布时,
如果路径不存在,容器会自动创建该路径,当容
器关闭时该路径会自动被删除。
实现:
public myMessage implements MessageListener
{
public void onMessage(Message mess)
{
}
}
客户端连接:
Properties p=new Properties();
p.load(Client.class.getResourceAsStream("link.properties"));
//得到上下文环境
Context context=new InitialContext(p);
//得到服务的消息驱动bean的引用
Queue que=(Queue)context.lookup("queue/foshanshop");
//得到消息连接工厂
QueueConnectionFactory factory=(QueueConnectionFactory)context.lookup("ConnectionFactory");
//产生一个连接
QueueConnection queueConnection=factory.createQueueConnection();
//产生一个session
QueueSession session=(QueueSession)queueConnection.createSession(false,QueueSession.AUTO_ACKNOWLEDGE);
//产生一个消息
TextMessage message=session.createTextMessage("hello 张三");
//产生一个发送者,以消息引用为参数
QueueSender sender=session.createSender(que);
//发送消息
sender.send(message);
session.close();
拦截器:在执行某一个类的方法前被拦截处理
实现过程:
实现一个拦截器
public class Inteceptor
{
@AroundInvoke
public Object XXXXX(InvocationContext ctx) throws Exception
{
long start=System.currentTimeMillis();
try
{
return ctx.proceed();
}
catch (Exception e)
{
e.printStackTrace();
throw e;
}
finally
{
}
}
}
在被拦截的类中进行说明
@Interceptors({Inteceptor.class})
pojo:
pure old java object
pure old java inteface
dto:data trans object
vo:value object
po:persistent object
bo:business object
生命周期:
ejb2.0是固定的方法,必须实现,即使方法内部是空的。
ejb3.0方法名可以随心定义,只有的注释说明就可以。
@Init:初始化
@PostConstruct:实例化被调用的构造方法
@PreDestroy:在删除前被调用
@PrePassivate:钝化前被调用
@PostActivate:激活前被调用
@Remove:移除前被调用,同时告诉服务器删除对象
依赖注入:
通过注释可以将一个bean注入到另一个bean中,注入有两种方式。
1、根据jndi名
@EJB (mappedName="HelloWorldBean/remote")
2、根所类名,没有包名。
@EJB (beanName="TestTime")
3、可以在set方法前或属性方法前写注释注入
可以注入任意一个
@Resource (mappedName="java:/MSSQLDS")
web service:web服务
作用:
实现跨平台、跨协议、跨系统、跨语言(java->c#)
粗粒度的处理
协议:
tcp/ip-->http-->soap(simple object access protocal)
传输的介质:
xml
角色:
服务提供商(业主)
代理商(中介)
客户端(买方)
ejb:
rmi:远程方法调用,java与java之间
rmi:粗粒度的处理
wsdl:web service description language
在jboss中实现web service过程
写一引普通的类
加入一些说明注释
@WebService(name = "HelloWorld",
targetNamespace = "http://com.foshanshop.ws", serviceName = "HelloWorldService")
@SOAPBinding(style = SOAPBinding.Style.RPC)
1. name
Web 服务的名字,WSDL中wsdl:portType元素的name属性和它保持一致,默认是Java 类或者接口的名字。
2. serviceName
Web 服务的服务名,WSDL 中wsdl:service元素的name属性和它保持一致,默认是Java 类的名字+”Service” 。
3. targetNamespace
WSDL文件所使用的namespace,该Web 服务中所产生的其他XML文档同样采用这个作为namespace 。
@SOAPBinding()表示这个服务可以映射到一个SOAP消息中。Style用于指定SOAP消息请求和回应的编码方式。
@WebMethod 这个注释放在需要被发布成Web 服务的方法前面。
4、在web.xml将提供服务的类指定为servlet
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>aa.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
客户端的调用过程:
需要用如下内容生成一个xml文件及客户端类
加入一个xml文件
在ant中加入如下内容:
<target name="generate-sources" description="生成客户端代码及映射文件">
<taskdef name="wstools" classname="org.jboss.ws.tools.ant.wstools">
<classpath refid="build.classpath" />
</taskdef>
<wstools dest="${app.dir}/src" config="${src.dir}/wstools-config.xml" />
</target>
通过客户端与服务器交互。
URL hellourl=new URL("http://lab5:8080/webservice/hello?wsdl");
String namespace="http://com.foshanshop.ws";
URL mappingUrl=Client.class.getClassLoader().getResource("jaxrpc-mapping.xml");
//service工厂
ServiceFactoryImpl sfi=new ServiceFactoryImpl();
//得到服务名,前缀加真正的名称
QName qname=new QName(namespace,"HelloWorldService");
//得到具体的服务
Service service=sfi.createService(hellourl,qname,mappingUrl);
//得到一个远程接口
HelloWorld hw=(HelloWorld)service.getPort(HelloWorld.class);
hw.hello("zhang sai");
开发过程:
可行性报告
之前:
整理ant
整理cvs目录
定下来写那些文档,谁什么时候提交
需求
use-case图
需求说明书
界面原型
类图(ooa):业务相关的对象模型
概要设计
e-r图:对象的模型的进一步持久。
类图的细化:进一步的细化,加入各种模式及框架
详细设计
时序图
细化类图
要的编码规范
实现
测试
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -