advanced java program笔记

j2ee:
------------------------------------------------------------------------
DATABASE
------------------------------------------------------------------------
◎JDBC
Entity Bean
Java Data
Object

◎设计数据表
1.定义数据表的属性
2.描述表与表之间的关系
3.过滤吊冗余的数据表关系(避免重复修改,重复删除的操作)
4.调整表的属性
5.生成sql语句
◎engine可以处理同一个service中的多个connector
◎context代表的是app应用
◎在web.xml中所定义的标签不能颠倒
:相关内容如下
<web-app>
<display-name>
<description>
<filter>
<filter-mapping>
<servlet>
<servlet-mapping>
<session-config>
<welcome-file-list>
<taglib>
<resource-ref>
<security-constraint>
<login-config>
<security-role>

 

◎如果在servlet中使用了某个jndi resource 则必须在web.xml中的<resource-ref> ...</resource-ref>中定义
◎在创建表时还可以对定义类型为索引的变量
如:
(在mysql数据库中的声明)
create table tmptab
{
 id varchar(2) primary key,
   index ix_t_project_pm(project_manager)
}type=InnDB;(是mysql数据表最好都这样声明,默认是不支持transaction)
◎即可以通过程序forclass.name()来装载jdbc的数据库驱动程序,也可以通过command line
◎可以通过java.util.properties来从文本文件中转载参数,其是一个hashtable
◎在result中的columnIndex是从1开始的
◎数据库查询需要关闭connection和statment
◎当在一个类中声明一个static语句快,那该类在被引用的时候则会被初始化,什么时候被引用
比如:当子类在调用父类方法的时候,则被调用static语句快
◎元数据是对数据库表的结构的描述,如:表中的数据,表中的列,等等
◎数据库字典就相当与对一个数据库中各中表,存储过程,触发器的归纳,便于查询
◎schema也就相当于是数据库创建的源代码
◎元数据描述了表的结构,视图的结构,表的列,域等
◎resultset没有自动commit功能,需要手动
◎resultset可以在connection.createstatement()中指定cursor的类别
◎在创建createstatment时指定的
ResultSet.SCROLL_SENSITIVE:结果集是完全可浏览的,只要进行更新立刻就能在结果集中反映出来
ResultSet.SCROLL_INSENSITIVE:结果集是完全可浏览的,但是只有在结果集关闭之后才能看到更新。
◎oracle数据库都是使用binary tree进行索引,这样插入数据删除数据就不会导致速度很慢
◎protocol://host:port/context_path?para1=value1&para2=value2...
  ftp://username:password@ftp.company.com/pub/file.jar
◎一个css由三部分组成selector{property;value}
◎隐藏域提供对程序的跟踪
◎当点击链接时会产生get请求
◎window.document.myform.submit()
myform为以下form的名称
submit的为form中button的方法
<form name="myform">
 ...
 <input type="submit" name="submit">
</form>
◎javascript中this指待当前对象
◎取得form中文本框user的值
如:form.user.value或form["user"].value 后一种方法为了防止空格的命名
◎javascript中的字符串用单引号括起来
◎将java中的int为空对应数据库中的Null,使用Integer.minvalue
◎java中将域设为空
------------------------------------------------------------------------
END-DATABASE
------------------------------------------------------------------------
------------------------------------------------------------------------
XML:
------------------------------------------------------------------------
◎xml大小写区分,xml所有的值必须以“”括起来,xml的属性一定要带有值
◎xml中可以不写head
xml的格式:
head
dtd
root element
element
attribute
◎dtd  
<!DOCTYPE 根标记名字[
...
]>
◎值中本省就有双引号,用单引号括起来,如title='"jsp"'
◎<![CDATA[text...]]>可以跟随任何字符,而不会被转义
◎如果元素有冲突需要定义name space如下语句:
<department xmlns="http://com.mycom/app/department">
 <id>1</id>
  <employee xmlns="http://com.mycom/app/employee">
   <id>1</id>
  </employee>
</department>
◎可以为命名空间声明别名
◎dtd可以对文件进行合法性检查
◎#pcdata就是文本类型,可以在dtd中进行定义
◎声明空标记<!ELEMENT element-name EMPTY>
◎没有结束标记的元素为空元素
◎dtd中的第一行首先应该是根元素
◎dtd中,+可以出现多次,?0或者1次
◎ANY为任何类型













































































































































































------------------------------------------------------------------------
END-XML:
------------------------------------------------------------------------
------------------------------------------------------------------------
SERVLET:
------------------------------------------------------------------------

◎jboss支持hot config,无需重启
◎servlet运行在容器中
◎使用-d来指定package
◎servlet的关闭在容器被关闭之后才被关闭,当整个服务器关闭后,servlet的在内存中的资源被释放
◎servlet中所配置的config
◎servlet context就是servlet的运行环境
◎servlet的parameter可以用于传送log日志文件的位置
◎javac -d 目标路径 源路径
◎可以采用jar工具产生war archive文件
如:
jar -cvf helloservlet.war WEB-INF
c:表示创建
v:表示显示
f:表示文件
◎web.xml程序发布描述器
◎声明web.xml是根据什么来进行发布可以使用:
<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd">
◎在web-app_2_3.dtd中的servlet-name,(servlet-class|)
◎所有的webapplication都放在C:/jboss-3.2.2/server/default/deploy目录下
◎启动jboss的命令可以执行路径为:C:/jboss-3.2.2/bin/run.bat
◎jboss的默认端口号为8080
◎执行setContentType方法用于设置文件类型
◎可以通过修改C:/jboss-3.2.2/server/default/deploy/jbossweb-tomcat41.sar/META-INF/jboss-service.xml文件来修改browser上的端口号
◎<welcome-file-list>用来显示文件列表
◎connection关闭,则resultset则不可用了,rowset则将数据保存在client端
◎getparameter()用来返回字符串的值
◎获得所有参数的值
Enumeration enum=req.getParameterName();
while(enum.hasMoreElements())
{
 Object item=enum.nextElement();
 String value=req.getParameter(item.toString());

}

◎getContextPath()显示的是路径
◎通过使用httpservletResponse的addcookie来进行session跟踪
◎通过如下方法可以产生饼干cookie
Cookie cookie =new Cookie("client-id",new Integer(counter++));
resp.addCookie(cookie);
◎可以根据重编码来进行会话跟踪
如:

◎可以通过setAttribute(),getAttribute()来将用户的查询结果存放在用户的session,之后用户的查询只需要从服务器中的内存中获得数据,这样就无需再从数据库中查询,加快了速度
◎getSession(true);如果用户登陆的时候没有session,则会创建一个session,再次登陆有session,他则不建立
◎invalidate()显示的清楚session
◎servlet如果已经打印出文字,则不能进行转移
◎servlet context就像是servlet的运行环境
◎通过httprequest的attribute来使得各中httpservlet来共享数据
◎通过url可以和servlet进行通讯
◎新接触的servlet类以及方法
HttpServletRequest.getHeaderNames();
HttpServletRequest.getSession();
HttpServletRequest.getHeaders();
Enumeration.hasMoreElement();
Enumeration.nextElement();
HttpServletResponse.setContentType()
HttpServletResponse.getWriter();
Session.getId();
HttpServletRequest.getProtocol();
HttpServletRequest.getServerName();
HttpServletRequest.getContextPath();
HttpServletRequest.getPathInfo();
HttpServletRequest.getQueryString();
HttpServletResponse.encodeURL();
◎servletcontext context=httpservlet.getservletcontext,其中的context是在一个webapp中有效的,他终止于
browser的关闭(可试验),如果开两个browser,则两个browser中的值会不一样(可以测试在当前页面转换到其他页面那么该值是否仍保持不变)
总之servletcontext是代表着该webapp的全局变量,
◎在servlet中是通过将sessionID保存到cookie中来使得区别读取browser id是否相同的
◎httpsession通过invalidation()方法来释放一个httpsession



































































------------------------------------------------------------------------
END-SERVLET:
------------------------------------------------------------------------
------------------------------------------------------------------------
JSP:
------------------------------------------------------------------------
◎jsp标签中的*表示可以有多个值
◎输入语句<%@ page import="package1,package2"%>
◎servlet的session缺省是没有激活的,而jsp则默认是激活的
◎jsp缺省的字符集是"text/html; charset=iso-8859-1
◎jsp默认threadsafe=true,jsp假设你开的thread是线程安全的,是不需要同步的,如果设为false则
jsp会帮你同步化,这样性能就降低了
◎include只能被包含一次,语法规则:<%@ include file="url" %>
◎所有的jsp文件放在web目录下
◎jsp大小敏感
◎include只能做到静态文件的包含,在文件修改后在页面上并不会及时的显示出来(jboss的include类似于jsp:include)
而jsp:include 标签则可以动态的包含,在文件修改后页面上会及时的显示出来
◎<%!declaration_statement%>
example:<%! int counter; %>
◎对实例变量的同步:
<%synchronized(page){
 counter++;
}
%>//可以将page替换成this

◎<jsp:include file="filename"/> 静态内容采用语句
  <jsp:include page="filename" flush="trueorfalse"/> 动态内容采用语句
◎<jsp:forward>转换到下一个jsp或servlet
◎jsp的隐含性的对象有request,response,out,session,pagecontext(pagecontext是从factory中生产出来的)
pagecontext可以整个环境,不同的应用程序间共享信息,而request,response,session则只能在当前的应用程序中共享
◎JavaBean必须需要一个无参数的构造器
◎externalizable是serializble的一个子类
◎javaBean中的属性必须符合规则即必须set/get的前缀方法
如:
属性String id;
方法:setId(),getId()
◎<%!declare_statement%>用此中方法申明的变量为类变量
◎servlet中的servletcontext与jsp中<%!%>中申明的变量有本质的不同,看起来好像都类似与全局变量
但是两者有着显著的不同,前者在多个browser访问时,访问的都不是一个东西,而以<%!%>定义的变量则
被多个browser所共享,原因后者为类变量(需要discuss),
◎<jsp:forward page="jsp2.jsp">标签用于将一个jsp1.jsp的页面转换到jsp2.jsp并且jsp1中的任何输
出语句都不会被执行,之后的代码语句也都不会被执行。
◎如果要将一个网页输出给另一个网页作为异常处理的网页,则需要在代码首加入
<%@page isErrorPage="true" %>
◎加入jsp文件可以直接加入在该webapp的根目录下使用,也可以使用累世于servlet的方法进行url mapping(方法与servlet一致)

◎javabean中的有效使用范围:
page:只在当前页面有效,失效在forward到其他页面,返回信息给browser,则javabean失效,刷新该
页面则javabean失效
request:当前页面,以及forward,include的页面都有效,失效在包括该javabean的所有页面都关闭时
则失效,刷新该页面则javabean失效
session,整个webapp,只有当该browser关闭后则javabean被关闭,刷新该页面,javabean仍然存在,在不同浏览
器之间的javabean各不相同。
application:他的有效范围在整个web,其他browser所调用的该javabean仍然有效,多个browser访问的
javabean为同一个javabean

◎在同一个页面,如果submit那么他们共享同一个httprequest






















































































------------------------------------------------------------------------
END-JSP:
------------------------------------------------------------------------
------------------------------------------------------------------------
JAVABEAN:
------------------------------------------------------------------------
◎设置bean的属性时可以不和bean的属性相一致,可以使用param来进行对应
如:<jsp:setProperty name="item" property="productCode" param="code"/>
对应的提交表单的文本框的name为code,这样通过param就对应起来了
◎如果value设置的话,在设置javabean属性的时候是不会进行conversion的
◎如何定义一个自定义的标签,如下步骤:
develop custom tag handler(标志处理器)
define tag library
define jsp tag

 

 

◎pageContext是由TagSupport继承过来的变量
◎标签库的扩展名一定是tld
◎SKIP_BODY就不对其中任何的标签等等进行显示
◎applet必须要实现start()和init()两个方法
◎applet没有setSize()方法
◎applet一定得public的
◎panel为flowGrid

◎<Applet code="" weight=? height=?></Applet>嵌入到html中就可以正常显示applet了
◎applet被下载来之后是不能再去访问其他主机,如果要其访问其他的主机,可以使用signature的方法
◎可以通过添加codebase加快applet的下载速度
WEB-INF/
image/
applet/
 allapplet.jar
*.jsp
*.html
<Applet codebase="applet" archive="allapplet.jar">

◎getParameter()方法可以获得applet运行时所设置的参数

------------------------------------------------------------------------
END-JAVABEAN:
------------------------------------------------------------------------
------------------------------------------------------------------------
APPLET:
------------------------------------------------------------------------
◎applet经常和url一起使用
URL url=new URL();
Connection conn= url.getConnection();
showDocument(new URL())显示url所指的页面;
showDocument(URL,String)显示指定url中的指定left,right等部分的
◎可以使用javascript来调用applet
如:
document.applets[0].appletMethod
◎制作一个安全的applet访问程序
1.Download applet from website
2.applet ask for a session key from servlet
3.user keys in user/password
4.Use Applet to encrypt password + sessionKy ->binary key
5.base4 encoder to encoder to encode binary key ->text key
6.send text key to login servlet,which performs validation
◎遇到在sql语句中用字符串代替查询字段可以用一下语句:
strSql="select * from dangan where xingming='"+name+"'";
◎获取数据字段的名称以及类型
private void getTableColumnName(ResultSetMetaData rsmd){
Hashtable[] columnHt=null;
try {
int columnCount=rsmd.getColumnCount();
columnHt=new Hashtable[columnCount];
for(int i=0;i<columnCount;i++){
String columnName=rsmd.getColumnName(i+1);
String columnTypeName=rsmd.getColumnTypeName(i+1);
columnHt[i]=new Hashtable();//重要点在这里!
columnHt[i].put(columnName,columnTypeName);
}
}
catch (Exception ex){
System.out.println(ex.toString());
}
}

◎开发applet需要注意的:
import java.applet.Applet;

context.showDocument(URL,"right");


java.awt.Checkbox
Checkbox(String label)
getState()

layout(new GridLayout(3, 1));
CheckboxGroup cbg = new CheckboxGroup();
add(new Checkbox("one", cbg, true));
add(new Checkbox("two", cbg, false));
add(new Checkbox("three", cbg, false));




















































------------------------------------------------------------------------
END-APPLET:
------------------------------------------------------------------------
--------------------------------------------------------------------------
ANT:
--------------------------------------------------------------------------
◎fileset的路径是相对于basedir来说的,fileset中的文件必须带有通配符
fileset的属性include,和其子元素之间有着区别,前者可以有多个文件,后者则每次一个元素只能带有一个文件
带有include,也可以带有exclude,原因是include中有通配符,那么可以用exclude排除在通配符中的文件
**/*.java可以将
*当前目录下所有的文件
**当前目录以及下级目录中的所有文件
?字符串中包含的一个字符于指定字符相同的文件名

◎javac task可以使用include来指定src目录中的include所指定的文件进行编译,默认src为所指定的当前目录以级下级子目录中的所有文件
◎可以在Ant中将war文件发布到远程服务器,
www.savarese.org/oro/downloads
unzip to get netcomponents.jar copy to lib directory
◎touch默认会为当前的系统时间
◎时间搓<tstamp/>只用在编译文件的时候用到,















--------------------------------------------------------------------------
END-ANT:
--------------------------------------------------------------------------
------------------------------------------------------------------------
INTERNATIONAL:
------------------------------------------------------------------------
◎locale是用来本地化的
◎一个国际化的例子:
该例子格式化了当前的国家,语言,时间
import java.util.*;
import java.text.*;

public class TestLocale
{
 public static void main(String args[])
 {
  Locale ln=new Locale("zh","cn");
  NumberFormat nf=NumberFormat.getCurrencyInstance(ln);
  NumberFormat cf=NumberFormat.getIntegerInstance(ln);
  double num=9000.00;
  String s=nf.format(num);
  String c=cf.format(num);
  System.out.println(s);
  System.out.println(c);
  
  DateFormat df=DateFormat.getDateInstance(DateFormat.SHORT,ln);
  Date date=new Date();
  String sd=df.format(date);
  
  System.out.println(sd);
  
  
  
  DateFormat df2=DateFormat.getTimeInstance();
  Date date2=new Date();
  String sd2=df2.format(date2);
  
  System.out.println(sd2);
  
 } 
 
 
}
◎ResouceBundle需要定义resouce_language_country_variable
   resource_language_country
   resource_language
   resource
类名都以以上的格式进行定义
◎ResourceBundle的properties文件,resourceBoundle会自动去查找这个文件,
◎Resoucebundle的class文件以及properties文件要全部存放在WEB-INF/classes目录中
◎服务器端都是使用ISO-8859-1进行解码
◎页面之间的charset转换
byte[] b=request.getParameter().getbyte("iso-8859-1");
String value=new String(bytes,"utf-8");
◎使用utf-8存入的字符串到数据库中,该数据库中的数据是不可看的
推荐使用iso-8859-1,但是在读出到page时是需要转换一下的,转换的方式采用上一种的方式
◎国际化都使用utf-8
◎本地化可以使用GBK


------------------------------------------------------------------------
END-INTERNATIONAL:
------------------------------------------------------------------------
---------------------------------------------------------------------------
RMI:
---------------------------------------------------------------------------
◎负载均衡是通过ejb来实现的,ejb容器的客户端必须拥有于ejb交流同样的协议,如果采用tcp/ip不能达到同样的
效果,而rmi就可以(表面了解,需要深入理解)
◎rmi服务器相对ejb服务器,性能差很多,不支持事务,实体bean等
◎rmi可以动态对象装载,可以将远程的对象转入到本地进行调用
◎rmi中的stub与corba中的orb相似,orb用于对象之间通讯
stub是埃客户端存在的,载服务器中存在的叫skeletion
stub的功能
参数整理
发送request
接受response
反参数整理
◎本地对象是可以不需要参数整理的
◎每一个实现remote接口的方法都必须抛出remoteException
◎所有载rmi中的对象必须实现serializable
◎rmi的默认端口为1099,在server端可以更改
◎rmic 只有在1。2版本之后只会产生stub,之前版本会产生stub和skeleton
client端一般有至少三个类分别是
client:client.java
remote:remote.java
stub:helloImpl_stub
server端一般有至少二个类分别是
remote:remote
implement:helloimpl
stub:helloImpl_stub
◎junitjava单元自动测试工具
◎-D定义系统变量
◎注册服务是在服务器进行运行的,需要先启动注册服务,然后才能运行你的服务器,否则会出现tcp错误
◎rmi中对象的传递必须clone,因为不能引用传递
传递对象:必须clone,必须serializable,
◎静态对象需要在客户机,服务器上共同定义,必须实现remote接口(不需要将服务器的实现class复制到客户端)
◎动态的对象需要在客户机,服务器上共同定义接口,在运行的时候确定具体的实现,这样的话,服务器修改了
对象的实际操作,或增加了某个属性,都不需要再修改客户端,但是服务器,客户器的接口必须一致(和静态对象一致,只是只能接口同步)
◎将传会来的对象也implements remote,那么返回来的stub对象就是远程端copy的对象,引用对象则不需要继承remote接口,那么在客户端的操作该对象就像是操作远程对象,这就消耗了大量的网络资源,其实就是一种引用
◎继承了remote接口的类所传回去的对象是一个对象的copy
◎string
class Test
{
 public static void pass(String s1)
 {
  System.out.println("pass before:"+s1);
  s1="huangh";
  System.out.println("pass after:"+s1);
 }
 public static void main(String args[])
 {
  String s2=new String("hello");
  Test.pass(s2);
  System.out.println(s2);

 }

}






















---------------------------------------------------------------------------
END-RMI:
---------------------------------------------------------------------------

---------------------------------------------------------------------
STRUCT:
---------------------------------------------------------------------
◎struct app的构成
jsp using structs custom tags(view)
actionForm(model)
action(servlet)
actionServlet(servlet)
structs-config.xml
◎序列图可以通过自动化工具相互转换成Collaboration Diagram
◎提交表单的时候会自动将javabean的属性给填充好,只要表单的名称与javabean的属性一致,
◎可以通过actionfrom直接实现商业逻辑,也可以通过actionform提交给action有action来执行商业逻辑
◎需要用到的jar文件必须加到classpath中才可以使用
◎转义通过actionservlet来得以实现
◎do扩展名的文件全部mapping成actionservlet
◎action被调用起来会直接调用action的方法execute。所以写action时都将他给覆盖(重写)
◎action一般都对应多个动作
◎action可以作的动作如:
验证
商业逻辑转移(javabean)
查找映射(servlet)
◎action使用mapping来进行映射
◎在action中尽量使用局部变量否则的化会产生同步化
同步化:
private int i;
public ActionForward execute(...)
{
 synchronized(this)
 {
  i++;
 }
}
◎使用actionforward必须要在struts-config.xml中定义一个action标签,如下实例:
<action>
 <forward name="mymapping" path="yourpage.jsp" />
</action>
在path也同样可以指定servlet等其他资源

◎global forward可以由多个forward所组成
◎actionservlet一般都用apache自己的actionservlet,开发人员主要作actionform,action的编写
◎一个action中可以有多个forward
◎在Global-forward标签中定义的为全局forward,在action中写的forward为局部forward
◎带有struct的taglib的html必须要先actionservlet->生成actionform->交给action->在jsp显示actionform
◎actionform在第一次显示的时候会提交reset
◎通过在struts-config中定义一个<message-resources parameter="resoures.application"/>
其中resources为classes下的目录,application为properties文件的文件名
设置一个reset即actionform的validate方法
1.在actionform中加上validate方法
2.在struts-config上的action中添加出错转的页面input=
3.指定一个properties文件,与actionerrer相对应,在发生错误时,可以指定错误的语句
◎global error与actionform中的某个input或其他不相关
◎同样也可以在action中使用saveError()方法来进行验证,其他部署工作与actionform的validate方法一致
◎如果想要控制页面的显示的语言可以通过locale以及resourcebundle共同使用的方法,也可以通过action的
setlocale的方法来达到一样的目地,所有的读取properties文件的都可以在struts-config.xml中设定
<message-resources parameter="resources.application"/>来指定读取properties文件的key所对应的value
◎一个web.xml中可以包含若干个struts-config.xml可以实现模块化,但是一个struts-config.xml中只能包含
<message-resource/>
◎<bean:define>=<jsp:useBean>
  <bean:write name="name" property="propertyName" />
◎<logic />标签进行比较




















































---------------------------------------------------------------------
JAXP:
---------------------------------------------------------------------
◎dom用于产生一个document tree,用于产生所有的节点
◎sax产生的是event,只产生需要的节点,而非全部,处理逻辑比较简单情况下可以用sax
◎<myapp:dropdown xmlns:myapp="">
localname=dropdown
qualifled name=myapp:dropdown
◎dom适合于一些复杂的处理
◎text并不是一个element
◎在documentbuilder中在解析一个xml文件时会包含一个空白符,可用SetIgnoringElementContentWhitespaces(boolean)
◎domsource用于在将document转换为file的时候,就需要一个domsource,以及一个streamresult
◎获取一个元素的全部子元素getchildnodes()
◎一个dtd的例子:

◎通过定义一个dtd文件可以做到
1。自动校验xml
2。产生xml文档定义:web.xml,struts-config.xml
3.减少程序验证代码






















































---------------------------------------------------------------------
RMI_IIOP(Remote Method Invocation Over Internet Inter-ORB):
---------------------------------------------------------------------
◎扩展了rmi,为了使得能够于不同的ORB进行通讯
◎orb为corba的底层组件
◎如果在两台jvm上运行,进行通讯必须使用portableRemoteOjbect,如果在本地一台jvm上进行通讯只需要
强制类型转换就可以了































---------------------------------------------------------------------
JNDI(Java Naming Directory Interface):
---------------------------------------------------------------------
◎JNDI可以访问不同的目录服务器如ldap,等
◎运行一个jndi程序需要使用properties(可以从system中读取,同时也可以从文件中读取,然后传给context),并且需要指定jboss的包文件jbossall-client.jar














































































---------------------------------------------------------------------
EJB:
---------------------------------------------------------------------
◎由ejb object,ejb home以及ejb的实现所组成,ejb的client端只能看到ejb home,ejb
object
◎消息驱动bean是一种异步的bean,而session bean以及entity bean为同步bean
◎handle用来保存ejb对象,这样就可以使得以后调用ejb对象从而加快访问ejb对象的速度
◎用户使用ejbobject来操作访问ejbbean
◎用户使用ejbhome来获得ejbobject,可以通过ejbhome来查找entitybean的功能(该方法仅对实体bean有效)
◎session bean as a facade
◎session bean就类似于一个controller
◎stateful session bean has passivate and activate function
◎LRU最近最少使用
◎将lru的sessonbean存入db中,当用户需要激活的时候再找一个lru的sessionbean进行敦化,然后将激活的sessionbean存入先前的敦化后的sessionbean
◎stateless bean于用户的对应关系为一对多个用户
◎stateful bean于用户来说似一对一的关系
◎stateless bean是被容器进行管理,删除,增加的
◎可以通过sessoncontext来获得容器的各种服务
◎ejbhome实现类于sessionbean实现类的方法create是一一对应的,但是
前者是create()后者是ejbcreate(),前者返回一个ejbobject,后者没有返回值
◎反是继承了remote接口的类的方法必须要抛出remoteException
◎在活化只前必须得到一个数据库的链接
◎ejbcreate可以被重载,而ejbremove只能有一个方法,不能被重载
◎部署:
build/*.class
src/
dist/*.jar
META-INF/ejb-jar.xml(标准发布描述器),jboss.xml

◎在部署文件中
<home>定义home的接口
<remote>定义object的接口
<ejb-class>定义bean的实现类
◎本地接口在ejb-jar.xml中使用<local-jndi-name>ejb/salesOrderLocal</local-jndi-name>来进行查找,在
jsp中可以使用如下方法来进行查找

ejb的创建过程:
class.forName()
setSessionContext
ejbCreate()
◎被敦化的bean,如果长时间没有被调用,那时可以将其销毁,销毁操作是由容器来进行操作的
◎一个SessionContext提供了,事务支持,安全支持,获得ejbhome,ejbobject的引用
◎connection的事务(setautocommit()方法等),是不能支持分布式的,是一个平面式的事务
◎由容器所访问的事务称为申明型的事务JTA
◎required,如果当前的session的trx不存在,则创建,但mandatory则不一样,如果存在则mandatory使用该trx
如果没有trx则mandatory抛出异常,如果client call sessionA trx(required),sessionA call sessionB trx
(required) 如果有一个失败,则全部失败,但是使用requiredNew则会创建一个独立的trx,则不会有这种全部失败
◎NotSupported则不支持trx,如果当前存在trx,则NotSupported suspend trx再执行method
◎supports,如果当前session存在一个trx,则使用该trx,如果没有,则也不创建,这是和required最大的不同
◎Never,如果当前有trx,则抛出异常,不会启动一个trx
◎如果想使用嵌套式的trx,则需要对trx进行标志位处理(抽象,未深入理解)
◎ejb出现system异常,则会自动rollback(容错),捕捉到异常然后转到其他的容器(实现了集群cluster)
◎createexception就是一个applicationexception的例子
◎application exception不一定需要rollback,如果逻辑业务上需要,可以通过EJBContext's setRollBackOnly()方法
◎通过j2ee server来分布式管理各种不同的数据库
◎通过SetSessionContext来获得datasource,再通过datasource来获得connection
◎jdbc的事务由jdbc进行管理,而jta则是由容器进行管理
◎connection完成之后,要将其关闭,statment同样要将其close
-----
◎再查找datasource的时候要在你的jndi名称前面加上java:
◎每一个实体bean都是单线程的
◎多个entitybean可以对应同一条记录,一个entitybean对该记录的修改,容器会进行ejbstore操作,由于多个entitybean对应一条记录,容器就会协调,将该条记录ejbload给指向同一条记录的entitybean,所有的操作都可以
由容器进行管理协调,对于一条记录的更新等操作,为了做到同步,可以使用transaction
◎每个entitybean可以重用
◎实体bean的activation,passivation都是存在或从内存中存放,取出
◎实体bean不允许用户自定义的transaction,只能使用container,在其部署文件中没有transaction-type的标签选项
-------
◎ejbpostCreate和ejbCreate的参数必须一致,有一对一的关系
◎entityBean的敦化与sessionbean的敦化有所不同,前者是将entitybean从数据库中去出来绑定到一个ejbobject
而后者是将sessionbean中硬盘中将sessionbean放入到缓冲池
◎可以ejbactivate方法中添加一些关于获得datasource的语句,在unsetEntityBean时将该datasource进行关闭(需要确认)
◎删除了实体bean之后,只删除了数据库的记录,但该bean被放回缓冲池已供其他客户端进行使用
◎在容器中每个实体bean的实例是单线程的,但这并不意味这一个enttiybean只能被一个客户进行访问,这样其他用户就会每次等到前一个用户放弃对该entitybean的控制权之后才能访问该entitybean,容器使用了复制多个entitybean的方法,使得多个客户能同时使用该entitybean instance,但是他们之间必须要同步,容器通过调用该entitybean的ejbstore()和ejbload()的方法来使得其他用户所拿到的该entitybean的实例都是同步的,

◎一个entitybean实例要做到重复的使用,但是可能该entitybean再先前的使用当中占用了一些如socket,datasource的资源,如果该entitybean被其他用户重新activate to use,那么用户必须能够将以前的资源进行关闭
否则的话,资源就是白白被浪费了,所以再entitybean中有两个方法,一个是activate和passivate,这两个方法前者用于再entitybean被激活时,同时产生一些必要的资源,如先前所说的datasource以及socket,但是当bean不被使用的时候,他就应该释放该资源,容器会自动的调用passivate方法,所以再该方法中应该存放一些销毁该bean再activate时所使用到的方法,比如datasource,socket等等
◎实体bean与会话bean的一个不同点在于前者的home接口可以定义find方法,而后者因为他是随着用户的产生而产生
并且有一定的使用时间范围,他必定要被回收到缓冲池,所以他没有find方法
◎entitybean可以不通过ejbcreate方法来进行entitybean的初始化,以及插入数据,但如果不让客户端每次create的
时候都再数据库中insert数据,则可以通过其他方法(何种其他方法可以初始化创建entitybean呢?从context中getpemeterkey?)
◎ejbcreate与ejbPostCreate是一一对应的,有前者就肯定有后者,后者也有前者,ejbPostCreate主要定义一下该bean与其他bean间的关系,传递该ejb引用给其他bean,重置某些事务(有何具体意义,很抽象)
◎再ejbactivate中不要存放任何的有关事务的方法,比如插入一些数据到数据库,ejbactivate的主要任务可以是初始化一些外部资源如datasource以及socket连接,ejbpassivate方法与ejbactivate方法类是,不要存放任何事务方法,只存放那些释放datasource资源,socket资源的事情
◎ejbload配合ejbgetprimarykey来进行一起使用,因为该entitybean必须要知道他要绑定是么数据
◎通过用户调用create,服务端调用ejbcreate将entitybean绑定到该ejbobject中
◎将bean进行回收,可以通过remove方法,但是该方法会删除数据库中的数据,为了避免必须删除数据库中的数据
,可以使用ejbstore,然后再调用ejbpassivate方法等
◎find,create,remove都有其相应的exception语句
◎定位器必须抛出一个findexception,方式在方法体里面抛出了findexception则必须在方法名候跟findexception
◎ejb home里可以定义全局的商业方法,可以被任何的bean进行调用
使用hascode来判断两个对象是否一致
public int hasCode()
{
 return name.hasCode();
}

public boolean equals(Object  o)
{
 return ((Device)o).name.equals(name);
}
◎ejbPostCreate也抛出一个CreateException,ejbpostcreate主要用来维护各个bean之间的关系
◎标签<reentrant>意思是是否可以重进入,多个bean之间需要调用相关方法,比如bean1调用bean2的方法,
然后bean2又要调回来bean1的某个方法,那么必须该标签设置为true,否则可能出现死锁的问题
◎在sessionbean中有类似于事件等相关的方法,这种类似的相关方法是通过该sessionbean实现SessionSynchronization,所调用的transaction方法都会间接的调用相关时间方法
◎在home接口中定义的全局方法必须在相关的bean中定义相应的方法,该方法的方法名前必须带有前缀ejbHome
◎如果客户端使用大量的get,set方法,那会产生大量的网络通讯,甚至导致网络堵塞,可以通过fascade来进行调整,通过使用一个valueobject,该对象总是存放实体bean的值
◎数据源在context.lookup的时候,需要加上前缀:java:,而查找一个entitybean或者sessionbean则不需要
◎实体bean尽量放在sessionbean的后面不要暴露给client进行直接的调用
◎解决计算多条记录的某个字段的总和不要放在entitybean去迭代,使用sql语句的sum函数将值传回entitybean里
这样就 解决了瓶颈的问题





























































-----------------------------------------------------------------
CMP:
-----------------------------------------------------------------
◎将实体bean的业务逻辑和bean的sql语句进行分离
◎bmp必须需要实例变量,而cmp则不需要持久化的域
◎在cmp中的获取属性的方法都是抽象的
◎在部署描述符中定义域
<cmp-field>
<field-name>name</field-name>
</cmp-field>
◎setEntityContext()和unsetEntityContext方法与bmp一致
◎<primkey-field>name</primkey-field>指定主键类
◎cmp为一个抽象类
◎cmp中没有一个find方法
◎select Object(d) from Device as d where d.description=?1 
其中1为参数的第一个
d为Device的别名

<ejb-ql>
<![CDATA[select object(d) from device as d where d.name is not null]]>
</ejb-ql>
加上<![CDATA[...]]>就可以加上>=<等,就可以执行相关操作
◎定位器在cmp中可以连声明都没有
◎cmp中使用EJB-QL来实现查询类似于bmp中使用的select语句
◎cmp中完全不需要写update语句只需要在cmp的object的方法中加上public void update()
再在bean上加上该方法的实现,在该方法中只需要加上语句的set字段就会对该字段中的所有字段进行更新
public void update(int id,String desc)
{
 setId(id);
 setDesripation(desc);

}

◎在jbosscmp-jdbc_3_0.dtd中的标签<remove-table></remove-table>是指所创建的表是否需要在当前的jar文件被
删除时,同时也把数据库的表给删除
◎cmpbean中实现其中的业务逻辑方法可以在部署文件中query中实现,如果实现的是全局的方法则必须
在部署文件里面实现select方法,在bean里面声明该方法,在home里面定义全局方法,在bean里面使用全局方法
调用select方法,然后返回集合,进行不断迭代。
◎定位器find选择的是一个对象,而select则可以选择的是一个字段
◎主键类必须是一个类
◎创建<abstract-schema-name>指定table的名字,在指定名字之后在数据库创建是根据指定value在加上ejb字样







---------------------------------------------------------------------
QUESTION:
---------------------------------------------------------------------
{
◎jta是不是就是有ejbobject来进行调用的,所以成为bean管理
◎postCreate如果产生异常,那create方法是否进行callback,嵌套式的事务?
◎entitybean都是通过ejbcreate插入一条记录来对应一条记录的,能否不用插入记录,就使用数据库原有的记录
进行映射呢?(可以的,使用entitybean的定位器)
◎定位器必须抛出一个findexception,方式在方法体里面抛出了findexception则必须在方法名候跟findexception
◎ejb home里可以定义全局的商业方法,可以被任何的bean进行调用
使用hascode来判断两个对象是否一致
public int hasCode()
{
 return name.hasCode();
}

public boolean equals(Object  o)
{
 return ((Device)o).name.equals(name);
}

◎fasade有什么作用?使用valueobject和localhome等来优化entitybean的性能,使得entitybean隐藏在sessionbeean的后面,对于客户端,entitybean是看不见的,(注意sessionbean必须实现同步化)
◎entitycontext是不是整个环境下的entitybean,是否每个再home接口中定义的全局业务方法所调用的context都是同样的。
◎因为ejbcreate和ejbpostcreate是一一对应关系的,那是否意味着用户调用了home.create(),服务器会自动的调用ejbpostcreate呢(是的)
◎在sessionbean中是否有事件,比如afterBegin(),afterCompletion(),beforeCompletion(),是在sessionbean从pool中被调用之后所调用的(由于该bean实现SessionSynchronization,则会在调用事件方法的时候就会调用相关事件方法)
◎web.xml中的jsp标签<jsp-config>是用来干嘛的?























































































}
-----------------------------------------------------------------
CMP_RELATIONS:
-----------------------------------------------------------------
◎一对一的关系
在bean中store,load的时候为了保持数据完整性,表与表之间存在着外键的关系
通常写法是:
private String invoiceId;
private InvoiceLocal invoice;
public void ejbStore()
{
 String InvoicedId=invoice.getPrimaryKey();
 String sql="update device set description=?,invoiceId=?";
 //prepareStatement
 pstmt.setString(1,description);
 pstmt.setString(2,invoiceId);
}

public void ejbLoad()
{
 String sql="select * from device ...";

 //
 //prepareStatement
 //resultset
 name=rs.getString();
 description=rs.getString()
 invoiceid=rs.getString()

 Context ctx=new Context()
 InvoiceLocalHome iHome=(InvoiceLocalHome)ctx.lookup("...");
 InvoiceLocalInvoice=iHome.findByPrimaryKey(invoicedId)
}
由于一对一的关联这种关系会导致插入记录,删除记录会产生互锁的情况,那么可以通过级联删除来进行操作
cascade delete 来进行操作

通过以上语句已经实现了实体bean中建立另一个实体bean的关系
然后在sessionbean中必须先进行设置,因为实体bean不暴露给用户
通过如下语句进行实现:
public class DeviceManangerBean implements SessionBean
{
 private DeviceLocalHome deviceHome;
 private InvoiceLocalHOme invoiceHome;

 public voic saveDeviceWithInvoice(DeviceVO deviceVO,InvoiceVO invoiceVO)
 {
  try
  {
   DeviceLocal device=deviceHome.create(deviceVO.name,deviceVO.description);
   InvocieLocal invoice=invoiceHome.create(invoiceVO.invoiceID,invoiceVO.amount);
   device.setInvoice(invoice);
   invoice.setDevice(device);
  }
  catch()
  {
 
  }

 }

 

}
cmp中可以使用如下方法构造一对一的关系:
public abstract class DeviceBean implements EntityBean
{
 public abstract InvoiceLocal getInvoice();
 public abstract void setInvoice(InvoiceLocal i);

 .....

}
◎一对多的关系
表示部门和设备的一对多的关系
public class DepartmentBean implements EntityBean
{
 public void ejbLoad()
 {
  
 }
}
◎在进行关联的时候能不能一个实体bean是bmp,而另一个实体bean是cmp呢?
◎可以将多和多的关系模拟成一对一的关系,通过增加一个新的bean,具体的实现方法如下:
在设计数据表的时候,由于可能有多对多的关系,那就必须采用第三张表来抽象成一对多的关系,从而来描述多对
多的关系


◎多对多的关系如果一方没有定义域,则不需要写get/set,这时就产生了单方向
◎如果要维持同一张表的关系,容器会产生另一张表维持之间的关系
◎调用在关联中get/set关联表名,被惰性加载
◎调用get方法会自动调用ejbLoad
◎聚合关联就好比我和我的书,我的书丢了,但我还在,所以为聚合关联
◎组合关联就好比定单和定单条目,定单丢了,订单条目也应该不存在,存在没有意义了,订单条目依赖于订单
◎bmp中的cascading delete是通过在remove方法中找到相关联的关联bean的集合,迭代该集合的到的ejbobject
调用其remove方法进行删除
cmp比较简单,只要在部署的时候,定义<cascad-delete>标签


















--------------------------------------------------------------------------------
{
◎一对一关系,由于双方互锁,如何解决这个问题的?
◎关于多对多的关系需要熟悉













































}
-----------------------------------------------------------------
JMS:
-----------------------------------------------------------------
◎jms在发出消息之后,服务器端会马上响应用户要求
◎jms可以放在本地,也可以放在远程其他服务器
◎多个接受者,多个发送者
◎所谓绑定就是你的服务器端的接口必须要告诉对方,才能进行通讯
◎紧绑定有组建和接口的定义
◎松绑定不需要定义组建和接口,直接使用jms就性了,通过jms去链接中间件
◎MOM-Messaging Oriented Middleware即中间件
◎如果网络有问题可以通过存储转发来完成想过操作
◎JMS是通过生产者和消费者来进行链接的
◎MOM产品IBM MQSerials
◎松绑定是通过中间件进行通讯
◎received采用的是同步的通讯
◎采用messageListener则是异步的通讯,只需要setMessageListener(MessageListener listener)就ok了
◎可以使用durable持久性来保存jms的消息
◎通过修改jboss目录下的C:/jboss-3.2.2/server/default/deploy/jms/jbossmq-destinations-service.xml
添加queue和topic
◎持久的subscriber和存储转发一起用才会有效,否则的话,在client出现事故的时候,就不会发到client了,但是
持久化的subscriber还是会收到邮件,这就是两者的差别
◎jms可以设置优先级,9级最高,4级为默认
◎jms中可以设置消息
◎mdb的ejbcreate主要用于访问sessionbean,可以在其中添加相关查找initialcontext的操作
◎不要在mdb的onMessage的方法中添加有关throwejbexception的系统性异常,这样会导致毒消息,因为系统会认为
你这边出先了系统级异常,那么系统就会滚回当前的操作,这样的话destination就会认为bean没有接受到,所以会
不断重发,bean这边不断callback,这样就会导致毒消息的产生




















-----------------------------------------------------------------
webservice:
-----------------------------------------------------------------
◎在binding-里面必须定义有关encoding相关的语句



































-----------------------------------------------------------------
basic:
-----------------------------------------------------------------
◎collection和collections的区别是前者是一个接口所有继承的该接口的类都为collections的实例
而后者则是一个框架,集成了所有的集合类































--------------------------------------------------------------------------------
{
◎在topic中有durableSubscriber,通过存储转发可以达到系统崩溃,同样client可以收到消息的目地,那么queue
中是否也有同样的durable如果没有怎么解决这一问题呢












































}

 

 

 

---------------------------------------------------------------------------
QUESTION:
---------------------------------------------------------------------------
{














































 

}

{
servlet:
ejb:
j2ee:
◎什么时bmp
◎session Bean and entitiy Bean 有什么区别?
◎servlet如何生成xml文件
◎所谓独立的Servlet容器是否就是一个单进程的程序,他就是一个web服务器
◎所谓进程内的Servlet容器,可能就是一个web服务器,再开一个进程也就是子进程来运行jvm创建一个servlet的进程进行执行?
◎在mysql中为什么创建好的用户,数据库不能进行连接
◎数据库中的结构类型如何对应java相对应的类型
◎如果从html表单中取的查询语句在prepare statment时需要使用setstring进行设置(再议)
◎自定义标记如何隐藏jdbc的细节
◎如何使用jstl,有什么作用
◎在servlet中要将返回的信息以html的形式返回给用户,但这样嵌入实在太麻烦,有什么好的方法
◎servlet中的config存有什么信息?
◎子类是否继承父类的构造方法
◎如何使用索引使得查找表的字段更快











































































































































































-------------------------------------------------------------
jsp:


◎为什么我在jsp中放置一个缓存就会出错?
◎<%@ page contentType="text/html"; charset="ISO-8859-1" %>也有错
◎pagecontext与application即servletcontext有是么不同·
◎如何有效使用cookie,商业化代码查看
◎如何使用隐藏字段进行会话跟踪
◎在mysql无需配置连接池,datasource,只要webapp通过配置server.xml以及web.xml就可以达到通过datasource从
连接池中得到connection的效果?
◎查找关于context(即连接池中context的api描述)






































































---------------------------------------------------------------------------
END-QUESTION:
---------------------------------------------------------------------------






















--------------------------------------------------------------------
Ant:
◎如何使用














































}

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值