去看PetStore的例子。最好的教材,里面包含了各种设计模式。及优良的架构。
解决方案 »
- struts+spring+MyEclipse 找不到Action类
- 多对多,如何实现排序
- javaEE 对jstl的兼容性
- 请问:为什么程序老提示com.inprise出错?com包里面为什么没有了inprise?
- weblogic 小问题
- 解析STRUTS-CONFIG.XML遇到困难 (急啊!)
- 带新人学J2EE,有想法者请进.只带新人.有浓厚兴趣的.没分散了哦
- 怯怯的问个j2ee 安装的问题
- 删除功能实现问题
- 求一个基于ssh的完整的登录-修改密码的系统?要求Mysql数据库的
- 在entity中当某种操作发生异常时,rollback事务(容器管理)。是这样编写么。如下:
- 我在配置j2ee时出现的问题!
[email protected]
谢谢,给我一份!
thank you..
[email protected]
谢谢了
[email protected]
一.Enterprise Beans
在EJB(Enterprise Java Beans)中定义了两种不同类别的Enterprise Bean :
*会话 Bean (Session Bean)
*实体Bean (Entity Bean)
1. 会话 Bean (Session Bean)
会话 Bean 是调用它的客户端代码要完成的工作。当客户端与服务器建立联系,那么一个会话 Bean 就建立起来了。根据会话 Bean 的状态不同有分为:
状态会话 Bean (Stateful Session Bean)
无状态会话 Bean (Stateless Session Bean)
1.1 状态会话 Bean (Stateful Session Bean)
当客户机和服务器建立连接之后,状态会话 Bean (Stateful Session Bean) 将一直在客户机和服务器之间保持着用户的某个状态。例如:用户使用银行的ATM时,经过验证之后,用户可以连续执行多次操作,在这个过程当中,用户的合法状态将一直被保留,直到她将信用卡取出,结束这次操作。这时,状态会话 Bean (Stateful Session Bean) 也就被销毁。
1.2无状态会话 Bean (Stateless Session Bean)
当客户机和服务器建立连接之后,无状态会话 Bean (Stateless Session Bean)处理单一的用户请求或商务过程。无状态会话 Bean (Stateless Session Bean)不需要从以前的请求中提取任何状态。例如,用户的用户密码确认。用户输入密码后,发送请求。组件返回真或假来确认用户,一旦过程完成,无状态会话 Bean (Stateless Session Bean) 也宣告结束。
2. 实体Bean (Entity Bean)
实体Bean (Entity Bean)只是数据模型,它不包括商务逻辑。实体Bean (Entity Bean)可以将关系/对象数据库的数据映射到内存中供其它组件使用。实体Bean (Entity Bean)是一直存在的,而且具有很高的容错性能。实体Bean (Entity Bean)能供允许多用户同时访问。
二. 会话 Bean (Session Bean)
Ejb的执行过程是被放在一个EJB容器中进行的,所以客户端不会直接调用我们写好的Enterprise Bean ,而是调用EJB容器生成的一个EJBObject (EJB对象)来实现。那么,我们在编写服务器端的Enterprise Bean 时,就要考虑这点。既然客户端不能直接访问,就由EJBObject来代劳,所以在编写服务器端时,就要编写服务器端的一个接口(Remote)用来与客户机联系,实力化EJBObject。要生成EJBObject 就要调有Home 接口,来建立这个实力。
图一
以下是会话 Bean 的代码分析:
A.Enterprise Bean 类:sailorsy.class
1.setSessionContext(SessionContext ctx)方法
它是EJB容器和Enterprise Bean互相作用的关口。
import java.rmi.*;
import javax.ejb.*;
public class sailorsy implements SessionBean{
private SessionContext ctx=null;
public voic setSessionContext(SessionContext ctx){
this.ctx=ctx;
}//setSessionContext
}//class sailorsy
2.ejbCreate(…)方法
它可以初始化Enterprise Bean ,可以定义不同的ejbCreate(…)方法,每个方法所带的参数不同。但是,必许要存在至少一种。
import java.rmi.*;
import javax.ejb.*;
public class sailorsy implements SessionBean{
private SessionContext ctx=null;
public voic setSessionContext(SessionContext ctx){
this.ctx=ctx;
}//setSessionContext
public void ejbCreate() {
}//ejbCreate
}//class sailorsy
3.ejbPassivate()方法
如果初始化的Enterprise Bean 过多,EJB容器将其中的一些挂起(passivate),释放他们所占用的空间。
import java.rmi.*;
import javax.ejb.*;
public class sailorsy implements SessionBean{
private SessionContext ctx=null;public voic setSessionContext(SessionContext ctx){
this.ctx=ctx;
}//setSessionContext public void ejbCreate() {
}//ejbCreate
public void ejbPassivate() {
}//ejbPassivate}//class sailorsy
4.ejbActivate()方法
和ejbPassivate正好相反,它将被挂起的Bean从新调回。
import java.rmi.*;
import javax.ejb.*;
public class sailorsy implements SessionBean{
private SessionContext ctx=null;public voic setSessionContext(SessionContext ctx){
this.ctx=ctx;
}//setSessionContext public void ejbCreate() {
}//ejbCreate
public void ejbPassivate() {
}//ejbPassivate
public void ejbActivate() {
}//ejbActivate}//class sailorsy
5.ejbRemove()方法
它可以清除EJB容器中的Bean。
import java.rmi.*;
import javax.ejb.*;
public class sailorsy implements SessionBean{
private SessionContext ctx=null;public voic setSessionContext(SessionContext ctx){
this.ctx=ctx;
}//setSessionContext public void ejbCreate() {
}//ejbCreate public void ejbPassivate() {
}//ejbPassivate
public void ejbActivate() {
}//ejbActivate public void ejbRemove() {
}//ejbRemove
public String showname(){
return "Hello,my name is sailorsy";
}//自己的商务方法
}//class sailorsy
以上这些是EJB必需的回调方法,我们可以在里面加入自己的方法,加入自己的商务逻辑。
B.Home 接口: sailorsyHome
import java.rmi.*;
import javax.ejb.*;public interface sailorsyHome extends EJBHome {
public sailorsyRemote create() throws RemoteException, CreateException;
}
Remote接口:sailorsyRemote
import java.rmi.*;
import javax.ejb.*;public interface sailorsyRemote extends EJBObject {
public java.lang.String showname() throws RemoteException;
}
三.调用会话 Bean:sailorsyTestClient1
import javax.naming.*;
import javax.ejb.*;
import javax.rmi.PortableRemoteObject;
import java.rmi.*;public class sailorsyTestClient1 {
private sailorsyHome sailorsyHomeObject = null; //Construct the EJB test client
public sailorsyTestClient1() {
try {
//以下是客户端使用JNDI定位Home对象。
Context ctx = new InitialContext(); //look up jndi name
Object ref = ctx.lookup("sailorsy"); //cast to Home interface
sailorsyHomeObject = (sailorsyHome) PortableRemoteObject.narrow(ref, sailorsyHome.class); }
catch(Exception e) {
e.printStackTrace();
}
} //----------------------------------------------------------------------------
// Utility Methods
//---------------------------------------------------------------------------- public sailorsyHome getHome() {
return sailorsyHomeObject;
}
//Main method public static void main(String[] args) throws Exception{
sailorsyTestClient1 client = new sailorsyTestClient1();
sailorsyRemote sr=client.getHome() .create() ;
String s=sr.showname() ;
System.out.print(s);
// Use the getHome() method of the client object to call Home interface
// methods that will return a Remote interface reference. Then
// use that Remote interface reference to access the EJB.
}
}
以上的EJB在win2000+jbuilder5/jbuilder6+BAS4.5经过测试。 图二
以下是整个EJB的执行过程:
客户端通过JNDI检索Home对象的引用;
JNDI返回Home对象的引用;
请求创建一个新的EJB对象;
创建EJB对象;
返回EJB对象;
调用商务方法;
调用Enterprise Bean.
By huihoo.com顾志凌([email protected])注:框架可以用Word菜单中的 “视图/文档结构图” 看到
J2EE模式
Value Object(值对象) 用于把数据从某个对象/层传递到其他对象/层的任意Java对象。
通常不包含任何业务方法。
也许设计有公共属性,或者提供可以获取属性值的get方法。
JSP
1.JSP的基础知识
__
_____ | directive (指令)
| |-- scripting (脚本)
JSP -------| |__ action (动作)
|
|_____Template data :除JSP语法外,JSP引擎不能解读的东西
1)在JSP中使用的directive(指令)主要有三个:
a) page指令
b) include指令
c) taglib指令在JSP的任何地方,以任何顺序,一个页面可以包含任意数量的page指令 2)Scripting(脚本)包括三种类型
a) <%!declaraction %>
b) <% scriptlet %>
c) <%= expression %>3)action(动作)
标准的动作类型有:
a) <jsp:useBean>
b) <jsp:setProperty>
d) <jsp:getProperty>
e) <jsp:param>
f) <jsp:include>
g) <jsp:forward>
h) <jsp:plugin>1. 注释: <% -----jsp comment-------%>
<! -----html comment-------%>2. <%@ page session = “true” import =”java.util.*” %>
session可以不赋值,默认为true,如果session=”false”,则在JSP页面中,隐含的变量session就不能使用。3. 请求控制器结构(Request Controller)
也被称之为JSP Model 2 Architecture
这种途径涉及到使用一个Servlet或一个JSP作为一个应用程序或一组页面的入口点。为创建可维护的JSP系统,Request Controller是最有用的方式之一。不是JSP,而是Java类才是放置控制逻辑的正确的地方。请求控制器的命名模式为: xxxController.jsp
请求控制器类的命名模式为: xxxRequestController2.JSP中的JavaBean
JSP三种bean的类型
1) 页面bean
2) 会话bean
3) 应用bean大多数的系统会使用一个会话bean来保持状态,而对每一个页面使用一个页面bean 来对复杂的数据进行表示。页面bean是一个模型,而JSP是一个视图。3.Custom tagbean是信息的携带者,
而tag更适用于处理信息。标记库包含一个标记库描述符(TLD)和用于实现Custom tag的Java类
在翻译阶段,JSP容器将使用TLD来验证页面中的所有的tag是否都被正确的使用。
标记处理程序只是一个简单的适配器,而真正的逻辑是在另一个类中实现的,标记处理程序只是提供了一个供其他的可复用的类的JSP接口
Servlet
1.ServletConfig
 一个ServletConfig对象是servlet container在servlet initialization的时候传递给servlet的。ServletConfig包涵 ServletContext 和 一些 Name/Value pair (来自于deployment descriptor) ServletContext接口封装了Web应用程序的上下文概念。2.会话跟踪
1) Session
 当一个Client请求多个Servlets时,一个session可以被多个servlet共享。 通常情况下,如果server detect到browser支持cookie,那么URL就不会重写。
2) cookie
 在Java Servlet中,如果你光 Cookie cookie = new Cookie(name,value)
那么当用户退出Browser时,cookie会被删除掉,而不会被存储在客户端的硬盘上。如果要存储 cookie,需加一句 cookie.setMaxAge(200) cookie是跟某一个server相关的,运行在同一个server上的servlet共享一个cookie.3) URL Rewriting
在使用URL Rewriting来维护Session ID的时候,每一次HTTP请求都需要EncodeURL()
典型的用在两个地方
1) out.print(“form action=\” ”);
out.print(response.encodeURL(“sessionExample”));
out.print(“form action=\” ”);
out.print(“method = GET>”);
2) out.print(“<p><a href=\” ”);
out.print(response.encodeURL(“SessionExample?database=foo&datavalue=bar”));
out.println(“\” >URL encoded </a>”);3.SingleThreadModel
默认的,每一个servlet definition in a container只有一个servlet class的实例。
只有实现了SingleThreadModel,container才会让servlet有多个实例。Servlet specification上建议,不要使用synchronized,而使用SingleThreadModel。SingleThreadModel(没有方法)
保证servlet在同一时刻只处理一个客户的请求。
SingleThreadModel是耗费资源的,特别是当有大量的请求发送给Servlet时,SingleThreadModel的作用是使包容器以同步时钟的方式调用service方法。
这等同于在servlet的service()方法种使用synchronized.Single Thread Model一般使用在需要响应一个heavy request的时候,比如是一个需要和数据库打交道的连接。
2. 在重载Servlet地init( )方法后,一定要记得调用super.init( );3. the client通过发送一个blank line表示它已经结束request
而the server通过关闭the socket来表示response已结束了。4. 一个Http Servlet可以送三种东西给Client
1) a single status code
2) any number of http headers
3) a response body5. Servlet之间信息共享的一个最简单的方法就是
System.getProperties().put(“key”,”value”);6. Post和Get
Post:将form内各字段名称和内容放置在html header内传送给server
Get: ?之后的查询字符串要使用URLEncode,经过URLEncode后,这个字符串不再带有空格,以后将在server上恢复所带有的空格。
Get是Web上最经常使用的一种请求方法,每个超链接都使用这种方法。7. Web.xml就是Web Applicatin 的deployment descriptor
作用有:组织各类元素
设置init param
设置安全性
8. Request Dispatcher用来把接收到的request forward processing到另一个servlet
要在一个response里包含另一个servlet的output时,也要用到Request Dispatcher.9. Servlet和Jsp在同一个JVM中,可以通过ServeltContext的
setAttribute( )
getAttribute( )
removeAttribute( )
来共享对象
10. 利用request.getParameter( )得到的String存在字符集问题。
可以用 strTitle = request.getParameter(“title”);
strTitle = new String(strTitle.getBytes(“8859-1”),”gb2312”);如果你希望得到更大得兼容性
String encoding = response.getCharacterEncoding();
//确定Application server用什么编码来读取输入的。
strTitle = new String(strTitle.getBytes(encoding),”gb2312”);
XML
1.XML基础知识
1. 一个xml文档可以分成两个基本部分:
首部( header )
内容( content )