⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ejb3-1.txt

📁 Java大部分的基础知识,EJB3,EJB2,WEBSERVICE,SOAP,JMS,MQ,还有些面试题
💻 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 + -