System.out.println(nm+"名字空間中的元素");
NodeList nl=doc.getElementsByTagNameNS(nm,"*");
for(int i=0;i<nl.getLength();i++){
Node n=nl.item(i);
System.out.println(n.getNodeName());
}
System.out.println("\n 名稱為 "+local+" 的元素");
nl=doc.getElementsByTagNameNS("*",local);
for(int i=0;i<nl.getLength();i++){
Node n=nl.item(i);
System.out.println(n.getNodeName());
}
System.out.println("\n名字空間 "+ob+" 中的屬性");
nl=doc.getElementsByTagName("*");
for(int i=0;i<nl.getLength();i++){
if(nl.item(i) instanceof Element){
Text t=(Text)nl.item(i).getFirstChild();
Element e=(Element)nl.item(i);
Attr a=e.getAttributeNodeNS(ob,"class");
if(a!=null){
String val=a.getNodeValue();
System.out.println("<"+val+">"+t.getNodeValue()+"</"+val+">");
}
}
}
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String args[]){
BookDetails nsd=null;
if(args.length>=1){
nsd=new BookDetails(args[0]);
}else{
System.out.println("Books.xml");
}
}
}
使用SAX API解析XML文檔
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
public class SAXParserHandler extends DefaultHanlder{
public void startDocument() throws SAXException{
System.out.println("起始文檔");
}
public void endDocument() throws SAXException{
System.out.println("結(jié)束文檔");
}
//在遇到字符數(shù)據(jù)時(shí)激發(fā)
public void characters(char[] ch,int start,int lenght) throws SAXException){
String charString=new String(ch,start,lenght);
System.out.println("字符:"+charString);
}
public void startElement(String namespaceURI,String localName,String qName,
Attributes atts)throws SAXException{
System.out.println("起始元素"+qName);
for(int i=0;i<atts.getLength();i++){
System.out.println("屬性值:"+atts.getvalue(i));
}
}
public void endElement(String namespaceURI,String localName,String qName)
throws SAXException{
System.out.println("結(jié)束元素"+qName);
}
public static void main(String args[]) throws Exception{
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
parser.parse("book.xml",new SAXParserHanlder());
}
}
使用DOM API寫XML文檔
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import java.io.*;
public class Student{
public static void main(String args[]){
Document doc;
Element students;
Element stud;
Element fName;
Element sName;
try{
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
DocumentBuilder db=dbf.newDocumentBuilder();
doc=db.newDocument();
stud=doc.createElement("Student");
fName=doc.createElement("FirstName");;
fName.appendChild(doc.createTextNode("John"));
stud.appendChild(fName);
sName=doc.createElement("Surname");
sName.appendChild(doc.createTextNode("David"));
stud.appendChild(sName);
students=doc.createElement("Students");
students.setAttribute("Department","Mathematics");
students.appendChild(stud);
doc.appendChild(students);
TransformerFactory tf=TransformerFactory.newInstance();
Transformer transformer=tf.newTransformer();
transformer.transform(new DOMSource(doc),new StreamResult(System.out));
}catch(Exception e){
e.printStackTrace();
}
}
}
使用DOM API顯示現(xiàn)有XML文檔內(nèi)容
使用DOM API將XML文檔數(shù)據(jù)插入數(shù)據(jù)庫(kù)
使用DOM API根據(jù)數(shù)據(jù)庫(kù)創(chuàng)建XML文檔
Java的國(guó)際化
國(guó)際化是為了將應(yīng)用程序發(fā)布在多個(gè)地區(qū)(locale)而進(jìn)行準(zhǔn)備的過(guò)程。不同地區(qū)標(biāo)識(shí)了各個(gè)特定的國(guó)家在信息表現(xiàn)上所廣泛使用的語(yǔ)言、流通貨幣、字符集、日期格式及其他要素。
支持國(guó)際化的應(yīng)用程序具有以下特點(diǎn):
1、不用改變代碼就可以支持另外的語(yǔ)言。
2、文本元素、消息和圖片保存在源代碼之外。
3、將于文化背景有關(guān)的數(shù)據(jù),比如日期和時(shí)間、十進(jìn)制數(shù)值以及流通貨幣,根據(jù)用戶所用的語(yǔ)言和所在地理位置進(jìn)行正確格式化。
4、支持非標(biāo)準(zhǔn)字符集。
5、應(yīng)用程序可以快速適應(yīng)新的語(yǔ)言區(qū)域。
為了使一個(gè)應(yīng)用程序國(guó)際化,:
1、必須將用戶所見到的硬編碼字符(如標(biāo)簽、工具提示和錯(cuò)誤信息等)替換成包含在資源包ResourceBundle中的字符。它是一個(gè)java屬性文件,它將關(guān)鍵字映射為字符值。并且可以使用多個(gè)不同語(yǔ)言版本的ResourceBundle,這樣將可以對(duì)于不同語(yǔ)言提供不同的字符串。
2、使用Locale對(duì)象,可以使數(shù)據(jù)格式化為與地區(qū)相關(guān)的數(shù)據(jù)。
3、國(guó)際化的應(yīng)用程序還必須使用統(tǒng)一的字符編碼標(biāo)準(zhǔn)字符集。
應(yīng)用服務(wù)器有那些?
Servlet方面
什么是Servlet?
Servlet是J2EE應(yīng)用框架中部署于Web層的Web組件,運(yùn)行在支持Servlet的Web服務(wù)器或應(yīng)用服務(wù)器上。Servlet為客戶端和服務(wù)器端的信息處理提供了一種“請(qǐng)求/響應(yīng)”機(jī)制。
客戶程序?qū)⒄?qǐng)求發(fā)送到服務(wù)器;服務(wù)器將請(qǐng)求發(fā)送到Servlet;依據(jù)客戶程序的請(qǐng)求,Servlet動(dòng)態(tài)地構(gòu)造回答信息并返回給服務(wù)器;服務(wù)器將回答返回給客戶程序。
什么是JSP?
JSP是J2EE應(yīng)用框架中部署于Web層的Web組件,是對(duì)Servlet技術(shù)的擴(kuò)展。它使在靜態(tài)的頁(yè)面中加入動(dòng)態(tài)的內(nèi)容變得非常容易。并且通過(guò)使用標(biāo)簽庫(kù)可以大大節(jié)省開發(fā)時(shí)間;將JavaBean與JSP一起使用可以將數(shù)據(jù)表示和程序?qū)崿F(xiàn)分離。
在MVC架構(gòu)模式中:
使用Servlet作為控制器,而JSP作為數(shù)據(jù)視圖。
CGI與Servlet的區(qū)別?
CGI(公共網(wǎng)關(guān)接口)是一項(xiàng)標(biāo)準(zhǔn),使WEB服務(wù)器可以與外部應(yīng)用程序交互。但是該技術(shù)存在一些嚴(yán)重的限制:
1、CGI應(yīng)用程序占用資源很多。當(dāng)系統(tǒng)要處理來(lái)自一個(gè)用戶的請(qǐng)求時(shí),就會(huì)創(chuàng)建一個(gè)新的進(jìn)程來(lái)處理該請(qǐng)求,一旦CGI腳本停止執(zhí)行,系統(tǒng)就必須收回該進(jìn)程。這種重量級(jí)進(jìn)程的經(jīng)常啟動(dòng)和停止非常低效。
2、CGI很難鏈接于請(qǐng)求進(jìn)程的其他階段,因?yàn)樵赪EB服務(wù)器上它們運(yùn)行于不同的進(jìn)程。這就很難處理授權(quán)、工作流和日志記錄工作。
Java Servlet技術(shù)提供了一個(gè)基于組件、與平臺(tái)無(wú)關(guān)的方法來(lái)構(gòu)建WEB應(yīng)用程序。Servlet沒(méi)有標(biāo)準(zhǔn)CGI應(yīng)用程序所遇到的性能局限。
Servlet比CGI更高效是因?yàn)椋?br />Servlet應(yīng)用中將只創(chuàng)建一個(gè)單一個(gè)重量級(jí)進(jìn)程,并對(duì)每個(gè)用戶請(qǐng)求使用更輕量級(jí)的線程來(lái)完成請(qǐng)求處理,并且這些線程是由JVM自動(dòng)維護(hù)。每個(gè)客戶端請(qǐng)求對(duì)應(yīng)一個(gè)線程,每個(gè)Servlet類在Servlet容器中只存在一個(gè)唯一的對(duì)象(實(shí)例)。Servlet類首次加載后將常駐內(nèi)存。
1、說(shuō)一說(shuō)Servlet的生命周期?
答:在第一次請(qǐng)求Servlet時(shí)將創(chuàng)建Servlet實(shí)例,容器調(diào)用實(shí)例的init方法,如果容器有請(qǐng)求要傳送給servlet,它就會(huì)調(diào)用servlet實(shí)例的Service方法。一個(gè)請(qǐng)求將作為一個(gè)線程。如果服務(wù)器要銷毀servlet實(shí)例就會(huì)調(diào)用servlet實(shí)例的destory方法,否則該實(shí)例將會(huì)常駐內(nèi)存。
2、Servlet版本間(忘了問(wèn)的是哪兩個(gè)版本了)的不同?
希望大家補(bǔ)上,謝謝
會(huì)話根中技術(shù)
用戶認(rèn)證:使用用戶名和口令進(jìn)行驗(yàn)證來(lái)讓客戶端訪問(wèn)某些資源。
隱藏表單字段:用于保存一個(gè)瀏覽器在服務(wù)器中的相關(guān)信息。
URL重寫:在URL后面添加附加信息
持久Cookie:在請(qǐng)求和響應(yīng)頭信息中添加和編輯信息
什么是會(huì)話對(duì)象?
會(huì)話對(duì)象用于在用戶訪問(wèn)一個(gè)Web站點(diǎn)的多個(gè)頁(yè)面時(shí)共享信息。任何時(shí)候用戶第一次訪問(wèn)某個(gè)網(wǎng)頁(yè),系統(tǒng)都將創(chuàng)建一個(gè)會(huì)話。如果以后用戶訪問(wèn)此網(wǎng)頁(yè),JSP將檢索有關(guān)此會(huì)話的信息。只要服務(wù)器收到此用戶的請(qǐng)求,則會(huì)話就會(huì)持續(xù),如果經(jīng)過(guò)一段時(shí)間沒(méi)有收到此用戶的新請(qǐng)求,會(huì)話就會(huì)終止。
3、JAVA SERVLET API中forward() 與redirect()的區(qū)別?
使用重定向:當(dāng)調(diào)用sendRedirect方法時(shí),Web容器就會(huì)向?yàn)g覽器返回響應(yīng),指示需要新的URL。因?yàn)闉g覽器發(fā)出了完全嶄新的請(qǐng)求,所以在重定向之前存儲(chǔ)為請(qǐng)求屬性的任何對(duì)象都會(huì)消失。
使用轉(zhuǎn)發(fā):當(dāng)為一個(gè)請(qǐng)求調(diào)用轉(zhuǎn)發(fā)時(shí),請(qǐng)求就發(fā)送給服務(wù)器上另一個(gè)資源,而無(wú)需通知客戶機(jī)由不同的資源處理請(qǐng)求。這個(gè)過(guò)程完全在Web容器內(nèi)部進(jìn)行,客戶機(jī)絕不知曉。與重定向不同,轉(zhuǎn)發(fā)過(guò)程中,對(duì)象可以存儲(chǔ)在請(qǐng)求中,并發(fā)送給下一個(gè)資源使用。
因?yàn)檗D(zhuǎn)發(fā)過(guò)程完全在服務(wù)器上進(jìn)行,與客戶機(jī)沒(méi)用通信,因此轉(zhuǎn)發(fā)的性能優(yōu)于重定向。
但是如果在JSP頁(yè)面上使用圖形的相對(duì)路徑和其他資源,轉(zhuǎn)發(fā)機(jī)制就會(huì)帶來(lái)問(wèn)題。因?yàn)闉g覽器無(wú)從得知發(fā)生了轉(zhuǎn)發(fā),所以相對(duì)路徑只是相對(duì)初始的Servlet,而不是所轉(zhuǎn)發(fā)到的JSP頁(yè)面。使用JSP自定義標(biāo)簽可以解決這個(gè)問(wèn)題。
如何現(xiàn)實(shí)servlet的單線程模式
servlet的配置
4、Servlet的基本架構(gòu)
public class ServletName extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
}
}
?
Jsp方面
1、jsp有哪些內(nèi)置對(duì)象?作用分別是什么?
JSP的隱式對(duì)象
RequestJavax.servlet.ServletRequest它包含了有關(guān)瀏覽器請(qǐng)求的信息.通過(guò)該對(duì)象可以獲得請(qǐng)求中的頭信息、Cookie和請(qǐng)求參數(shù)。
Enumeration getHeaderNames()String getHeader(name)Cookie[] getCookies()Enumeration GetParameterNames()String getParameter(name)String[] GetParametervalues(name)HttpSession getSession(flag)
responseJavax.servlet.ServletResponse作為JSP頁(yè)面處理結(jié)果返回給用戶的響應(yīng)存儲(chǔ)在該對(duì)象中。并提供了設(shè)置響應(yīng)內(nèi)容、響應(yīng)頭以及重定向的方法(如cookies,頭信息等)
Void setContentType(type)String getCharacterEncoding()Void addCookie(cookie)Void sendRedirect(url)
outJavax.servlet.jsp.JspWriter用于將內(nèi)容寫入JSP頁(yè)面實(shí)例的輸出流中,提供了幾個(gè)方法使你能用于向?yàn)g覽器回送輸出結(jié)果。
pageContextJavax.servlet.jsp.PageContext描述了當(dāng)前JSP頁(yè)面的運(yùn)行環(huán)境。可以返回JSP頁(yè)面的其他隱式對(duì)象及其屬性的訪問(wèn),另外,它還實(shí)現(xiàn)將控制權(quán)從當(dāng)前頁(yè)面?zhèn)鬏斨疗渌?yè)面的方法。
Void forward(path)PAGE_SCOPEREQUEST_SCOPESESSION_SCOPEAPPLICATION_SCOPEVoid setAtrribute(key,value,scope)Enumeration getAttributeNamesInScope(scope)Object getAttribute(key,scope)Void RemoveAttribute(key,scope)Object findAttribute(name)Int getAttributeScope(name)
sessionjavax.servlet.http.HttpSession會(huì)話對(duì)象存儲(chǔ)有關(guān)此會(huì)話的信息,也可以將屬性賦給一個(gè)會(huì)話,每個(gè)屬性都有名稱和值。會(huì)話對(duì)象主要用于存儲(chǔ)和檢索屬性值。
Void setAttribute(name,data)Object getAttribute(name)
applicationjavax.servle.ServletContext存儲(chǔ)了運(yùn)行JSP頁(yè)面的servlet以及在同一應(yīng)用程序中的任何Web組件的上下文信息。
pageJava.lang.Object表示當(dāng)前JSP頁(yè)面的servlet實(shí)例
configjavax.servlet.ServletConfig該對(duì)象用于存取servlet實(shí)例的初始化參數(shù)。
Enumeration getInitParameterNames()String getInitParameter(name)
ExceptionJavax.lang.Throwable在某個(gè)頁(yè)面拋出異常時(shí),將轉(zhuǎn)發(fā)至JSP錯(cuò)誤頁(yè)面,提供此對(duì)象是為了在JSP中處理錯(cuò)誤。
String getMessage()Void printStackTrace(out)<%@ page errorPage=”error.jsp”%><%@ page isErrorPage=”true” %>
2、jsp有哪些動(dòng)作?作用分別是什么?
答:JSP共有以下6種基本動(dòng)作
ljsp:include:在頁(yè)面被請(qǐng)求的時(shí)候引入一個(gè)文件。
ljsp:useBean:尋找或者實(shí)例化一個(gè)JavaBean。
ljsp:setProperty:設(shè)置JavaBean的屬性。
ljsp:getProperty:輸出某個(gè)JavaBean的屬性。
ljsp:forward:把請(qǐng)求轉(zhuǎn)到一個(gè)新的頁(yè)面。
ljsp:plugin:根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標(biāo)記
3、JSP中動(dòng)態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?
答:動(dòng)態(tài)INCLUDE用jsp:include動(dòng)作實(shí)現(xiàn)
<jsp:include page="included.jsp" flush="true" />它總是會(huì)檢查所含文件中的變化,適合用于包含動(dòng)態(tài)頁(yè)面,并且可以帶參數(shù)
靜態(tài)INCLUDE用include偽碼實(shí)現(xiàn),定不會(huì)檢查所含文件的變化,適用于包含靜態(tài)頁(yè)面
<%@ include file="included.htm" %>
4、兩種跳轉(zhuǎn)方式分別是什么?有什么區(qū)別?
答:有兩種,分別為:
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者頁(yè)面不會(huì)轉(zhuǎn)向include所指的頁(yè)面,只是顯示該頁(yè)的結(jié)果,主頁(yè)面還是原來(lái)的頁(yè)面。執(zhí)行完后還會(huì)回來(lái),相當(dāng)于函數(shù)調(diào)用。并且可以帶參數(shù).后者完全轉(zhuǎn)向新頁(yè)面,不會(huì)再回來(lái)。相當(dāng)于go to 語(yǔ)句。
JSP的常用指令
<%@ include file=”localURL” %>
<%@ page attribute=”value1” %>
屬性值缺省值示例
contentTypeMIME類型和字符集“text/hmt”contentType=“text/html;charset=ISO-8859-1“contentType=“text/xml“
Extends類名無(wú)Extends=“com.taglib.wdjsp.MyJspPage“
Import 類名或包名無(wú)
Session布爾值TrueSession=“true”
isThreadSafe布爾值True
ErrorPage
isErrorPage
<%@ taglib uri=”tagLibraryURL” prefix=”tagPrefix” %>
Jdbc
說(shuō)出數(shù)據(jù)連接池的工作機(jī)制是什么?
1、可能會(huì)讓你寫一段Jdbc連Oracle的程序,并實(shí)現(xiàn)數(shù)據(jù)查詢.
答:程序如下:
package hello.ant;
import java.sql.*;
public class jdbc {
String dbUrl="jdbc:oracle:thin:@127.0.0.1:1521:orcl";
String theUser="admin";
String thePw="manager";
Connection c=null;
Statement conn;
ResultSet rs=null;
public jdbc() {
try{
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
c = DriverManager.getConnection(dbUrl,theUser,thePw);
conn=c.createStatement();
}catch(Exception e){
e.printStackTrace();
}
}
public boolean executeUpdate(String sql) {
try {
conn.executeUpdate(sql);
return true;
} catch (SQLException e) {
e.printStackTrace();
return false;
}
}
public ResultSet executeQuery(String sql) {
rs=null;
try {
rs=conn.executeQuery(sql);
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
public void close(){
try {
conn.close();
c.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
ResultSet rs;
jdbc conn = new jdbc();
rs=conn.executeQuery("select * from test");
try{
while (rs.next()) {
System.out.println(rs.getString("id"));
System.out.println(rs.getString("name"));
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
2、Class.forName的作用?為什么要用?
答:調(diào)用該訪問(wèn)返回一個(gè)以字符串指定類名的類的對(duì)象。
說(shuō)出在JSP頁(yè)面里是怎么分頁(yè)的?
頁(yè)面需要保存以下參數(shù):
總行數(shù):根據(jù)sql語(yǔ)句得到總行數(shù)
每頁(yè)顯示行數(shù):設(shè)定值
當(dāng)前頁(yè)數(shù):請(qǐng)求參數(shù)
頁(yè)面根據(jù)當(dāng)前頁(yè)數(shù)和每頁(yè)行數(shù)計(jì)算出當(dāng)前頁(yè)第一行行數(shù),定位結(jié)果集到此行,對(duì)結(jié)果集取出每頁(yè)顯示行數(shù)的行即可。
4、在ORACLE大數(shù)據(jù)量下的分頁(yè)解決方法。一般用截取ID方法,還有是三層嵌套方法。
答:一種分頁(yè)方法
<%
int i=1;
int numPages=14;
//獲取當(dāng)前頁(yè)面
String pages = request.getParameter("page") ;
int currentPage = 1;
currentPage=(pages==null)?(1):{Integer.parseInt(pages)};
//獲得記錄總數(shù)
sql = "select count(*) from tables";
ResultSet rs = DBLink.executeQuery(sql) ;
while(rs.next()) i = rs.getInt(1) ;
//獲取總頁(yè)數(shù)
int intPageCount=1;
intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);
//設(shè)置上下頁(yè)
int nextPage ;
int upPage;
nextPage = currentPage+1;
if (nextPage>=intPageCount) nextPage=intPageCount;
upPage = currentPage-1;
if (upPage<=1) upPage=1;
//獲取數(shù)據(jù)內(nèi)容并顯示
rs.close();
sql="select * from tables";
rs=DBLink.executeQuery(sql);
i=0;
while((i<numPages*(currentPage-1))&&rs.next()){i++;}
%>
//輸出內(nèi)容
//輸出翻頁(yè)連接
合計(jì):<%=currentPage%>/<%=intPageCount%>
<a href="List.jsp?page=1">第一頁(yè)</a>
<a href="List.jsp?page=<%=upPage%>">上一頁(yè)</a>
<%
for(int j=1;j<=intPageCount;j++){
if(currentPage!=j){
%>
//顯示所有頁(yè)面的連接
<a href="list.jsp?page=<%=j%>">[<%=j%>]</a>
<%
}else{
out.println(j);
} //end of if
} //end of for
%>
<a href="List.jsp?page=<%=nextPage%>">下一頁(yè)</a>
<a href="List.jsp?page=<%=intPageCount%>">最后頁(yè) </a>
Xml方面
2、你在項(xiàng)目中用到了xml技術(shù)的哪些方面?如何實(shí)現(xiàn)的?
答:用到了數(shù)據(jù)存貯,信息配置兩方面。在做數(shù)據(jù)交換平臺(tái)時(shí),將不能數(shù)據(jù)源的數(shù)據(jù)組裝成XML文件,然后將XML文件壓縮打包加密后通過(guò)網(wǎng)絡(luò)傳送給接收者,接收解密與解壓縮后再同XML文件中還原相關(guān)信息進(jìn)行處理。在做軟件配置時(shí),利用XML可以很方便的進(jìn)行,軟件的各種配置參數(shù)都存貯在XML文件中。
3、用jdom解析xml文件時(shí)如何解決中文問(wèn)題?如何解析?
答:看如下代碼,用編碼方式加以解決
package test;
import java.io.*;
public class DOMTest {
private String inFile = "c:\\people.xml";
private String outFile = "c:\\people.xml";
public static void main(String args[]){
new DOMTest();
}
public DOMTest() {
try {
javax.xml.parsers.DocumentBuilder builder =
javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
org.w3c.dom.Document doc = builder.newDocument();
org.w3c.dom.Element root = doc.createElement("老師");
org.w3c.dom.Element wang = doc.createElement("王");
org.w3c.dom.Element liu = doc.createElement("劉");
wang.appendChild(doc.createTextNode("我是王老師"));
root.appendChild(wang);
doc.appendChild(root);
javax.xml.transform.Transformer transformer =
javax.xml.transform.TransformerFactory.newInstance().newTransformer();
transformer.setOutputProperty(javax.xml.transform.OutputKeys.ENCODING, "gb2312");
transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");
transformer.transform(new javax.xml.transform.dom.DOMSource(doc),
new javax.xml.transform.stream.StreamResult(outFile));
} catch (Exception e) {
System.out.println (e.getMessage());
}
}
}
4、編程用JAVA解析XML的方式.
答:用SAX方式解析XML,XML文件如下:
<?xml version="1.0" encoding="gb2312"?>
<person>
<name>王小明</name>
<college>信息學(xué)院</college>
<telephone>6258113</telephone>
<notes>男,1955年生,博士,95年調(diào)入海南大學(xué)</notes>
</person>
事件回調(diào)類SAXHandler.java
import java.io.*;
import java.util.Hashtable;
import org.xml.sax.*;
public class SAXHandler extends HandlerBase {
private Hashtable table = new Hashtable();
private String currentElement = null;
private String currentvalue = null;
public void setTable(Hashtable table) {
this.table = table;
}
public Hashtable getTable(){
return table;
}
public void startElement(String tag, AttributeList attrs) throws SAXException {
currentElement = tag;
}
public void characters(char[] ch, int start, int length) throws SAXException {
currentvalue = new String(ch, start, length);
}
public void endElement(String name) throws SAXException {
if (currentElement.equals(name)) table.put(currentElement, currentvalue);
}
}
JSP內(nèi)容顯示源碼,SaxXml.jsp:
<HTML>
<HEAD>
<title>剖析XML文件people.xml</title>
</HEAD>
<BODY>
<%@ page errorPage="ErrPage.jsp" contentType="text/html;charset=GB2312" %>
<%@ page import="java.io.*" %>
<%@ page import="java.util.Hashtable" %>
<%@ page import="org.w3c.dom.*" %>
<%@ page import="org.xml.sax.*" %>
<%@ page import="javax.xml.parsers.SAXParserFactory" %>
<%@ page import="javax.xml.parsers.SAXParser" %>
<%@ page import="SAXHandler" %>
<%
File file = new File("c:\\people.xml");
FileReader reader = new FileReader(file);
Parser parser;
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
SAXHandler handler = new SAXHandler();
sp.parse(new InputSource(reader), handler);
Hashtable hashTable = handler.getTable();
out.println("<TABLE BORDER=2><CAPTION>教師信息表</CAPTION>");
out.println("<TR><TD>姓名</TD>" + "<TD>" +
(String)hashTable.get(new String("name")) + "</TD></TR>");
out.println("<TR><TD>學(xué)院</TD>" + "<TD>" +
(String)hashTable.get(new String("college"))+"</TD></TR>");
out.println("<TR><TD>電話</TD>" + "<TD>" +
(String)hashTable.get(new String("telephone")) + "</TD></TR>");
out.println("<TR><TD>備注</TD>" + "<TD>" +
(String)hashTable.get(new String("notes")) + "</TD></TR>");
out.println("</TABLE>");
%>
</BODY>
</HTML>
EJB方面
1、EJB2.0有哪些內(nèi)容?分別用在什么場(chǎng)合? EJB2.0和EJB1.1的區(qū)別?
答:規(guī)范內(nèi)容包括Bean提供者,應(yīng)用程序裝配者,EJB容器,EJB配置工具,EJB服務(wù)提供者,系統(tǒng)管理員。這里面,EJB容器是EJB之所以能夠運(yùn)行的核心。EJB容器管理著EJB的創(chuàng)建,撤消,激活,去活,與數(shù)據(jù)庫(kù)的連接等等重要的核心工作。JSP,Servlet,EJB,JNDI,JDBC,JMS.....
2、EJB與JAVA BEAN的區(qū)別?
JavaBean是可復(fù)用的平臺(tái)獨(dú)立的軟件組件,開發(fā)者可以在軟件構(gòu)造器工具中對(duì)其直接進(jìn)行可視化操作。
Enterprise Java Bean 相當(dāng)于DCOM,即分布式組件。它是基于Java的遠(yuǎn)程方法調(diào)用(RMI)技術(shù)的,所以EJB可以被遠(yuǎn)程訪問(wèn)(跨進(jìn)程、跨計(jì)算機(jī))。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問(wèn)真正的EJB組件,而是通過(guò)其容器訪問(wèn)。EJB容器是EJB組件的代理,EJB組件由容器所創(chuàng)建和管理。客戶通過(guò)容器來(lái)訪問(wèn)真正的EJB組件。
3、EJB的基本架構(gòu)
答:一個(gè)EJB包括三個(gè)部分:
Remote Interface 接口的代碼
package Beans;
import javax.ejb.EJBObject;
import java.rmi.RemoteException;
public interface Add extends EJBObject {
//some method declare
}
Home Interface 接口的代碼
package Beans;
import java.rmi.RemoteException;
import jaax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface AddHome extends EJBHome {
//some method declare
}
EJB類的代碼
package Beans;
import java.rmi.RemoteException;
import javax.ejb.SessionBean;
import javx.ejb.SessionContext;
public class AddBean Implements SessionBean {
//some method declare
}
J2EE,MVC方面
1、MVC的各個(gè)部分都有那些技術(shù)來(lái)實(shí)現(xiàn)?如何實(shí)現(xiàn)?
答:MVC是Model-View-Controller的簡(jiǎn)寫。設(shè)計(jì)的基本原理是將復(fù)雜性分解為三個(gè)組件,即模型、視圖、控制器。
模型表示數(shù)據(jù)和處理數(shù)據(jù)的業(yè)務(wù)邏輯或應(yīng)用程序?qū)ο蟆?br />試圖是用戶要查看或存取的數(shù)據(jù)的表示。
控制器定義了用戶與模型和試圖交互的方式。
2、應(yīng)用服務(wù)器與WEB SERVER的區(qū)別?
Web Service 是一種新的分布式技術(shù)。一個(gè)Web服務(wù)本質(zhì)上是一個(gè)應(yīng)用組件,可以通過(guò)Web協(xié)議和數(shù)據(jù)編碼機(jī)制,例如HTTP和XML,對(duì)這個(gè)組件進(jìn)行訪問(wèn)。
Soap簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議:
是一種基于XML的通信協(xié)議。它包括3個(gè)部分。
Soap封裝結(jié)構(gòu):定義消息的XML格式,包括其整體框架、消息內(nèi)容、由誰(shuí)處理這些內(nèi)容等。
Soap編程規(guī)則:定義如何將程序數(shù)據(jù)表示為XML。
Soap RPC表示:定義如何使用scap進(jìn)行遠(yuǎn)程過(guò)程調(diào)用。
WSDL Web服務(wù)描述語(yǔ)言:
WSDL文件是一個(gè)XML文檔,用于說(shuō)明一組soap消息以及如何交換這些消息。還定義了服務(wù)的位置以及使用服務(wù)的通信協(xié)議等。
Uddi統(tǒng)一描述、發(fā)現(xiàn)和集成標(biāo)準(zhǔn)
是wed服務(wù)的黃頁(yè)。它提供了用于服務(wù)注冊(cè)的目錄技術(shù),并用它來(lái)建立Web服務(wù)的目錄信息。UDDI的核心組件是UDDI商業(yè)注冊(cè),它使用一個(gè)XML文檔來(lái)描述企業(yè)及所提供的Web服務(wù)。它包括3個(gè)部分:
白頁(yè):介紹提供服務(wù)的公司,包括名稱、地址和聯(lián)系方式等;
黃頁(yè):包括按照標(biāo)準(zhǔn)分類法進(jìn)行分類的行業(yè)類別;
綠頁(yè):詳細(xì)介紹,訪問(wèn)服務(wù)接口等技術(shù)信息。
Web服務(wù)是構(gòu)建在soap(簡(jiǎn)單對(duì)象訪問(wèn)協(xié)議)、wsdl(web服務(wù)描述語(yǔ)言)、uddi(統(tǒng)一描述、發(fā)現(xiàn)和集成標(biāo)準(zhǔn))3個(gè)開放的核心標(biāo)準(zhǔn)之上的。Soap用來(lái)進(jìn)行Web服務(wù)通信的協(xié)議,WSDL用來(lái)進(jìn)行說(shuō)明和描述Web服務(wù)
由于Web服務(wù)完全基于XML的,使Web服務(wù)成為一個(gè)跨語(yǔ)言、跨平臺(tái)、跨網(wǎng)絡(luò)的可互操作的分布式應(yīng)用軟件的新平臺(tái)。
3、J2EE是什么?
J2EE是sun公司推出的一個(gè)高層次的全方位、多功能的企業(yè)應(yīng)用開發(fā)環(huán)境。它包括了當(dāng)今軟件工業(yè)界許多最新、最重要的軟件技術(shù)。J2EE平臺(tái)包含一整套的服務(wù)、應(yīng)用程序接口和協(xié)議,是java技術(shù)企業(yè)級(jí)應(yīng)用的整體解決方案。J2EE平臺(tái)通過(guò)基于組件的應(yīng)用程序模型大大簡(jiǎn)化了開發(fā)過(guò)程,同時(shí)還支持任何分布式體系和多層次的應(yīng)用開發(fā)。隨著越來(lái)越多的第三方對(duì)J2EE的支持和標(biāo)準(zhǔn)認(rèn)證,J2EE已被廣泛用來(lái)開發(fā)企業(yè)級(jí)應(yīng)用軟件、中間件和組件軟件。
J2EE Java2平臺(tái)企業(yè)版:
1、提供了基于組件的方式來(lái)設(shè)計(jì)、開發(fā)、組裝和部署企業(yè)應(yīng)用。
2、提供了一個(gè)多層次分布式的應(yīng)用模型,包括了可復(fù)用的組件、基于XML數(shù)據(jù)交換、統(tǒng)一的安全模式以及靈活的事務(wù)控制。基于這些技術(shù),可開發(fā)出滿足市場(chǎng)要求的,基于平臺(tái)無(wú)關(guān)的J2EE組件的解決方案。
3、J2EE平臺(tái)使用的多層分布式應(yīng)用模型中應(yīng)用程序主要分為:客戶層(Applet)、Web層(Servlet和JSP)、業(yè)務(wù)層(EJB)、企業(yè)信息系統(tǒng)層。
使用類庫(kù)開發(fā)與使用框架包進(jìn)行開發(fā)的區(qū)別?
框架包簡(jiǎn)單的可以認(rèn)為是一組類和接口,它們相互協(xié)作以解決特定類型的軟件問(wèn)題。
類庫(kù)包含的是應(yīng)用程序可以調(diào)用的函數(shù)或例程。而框架包提供通用的、相互協(xié)作的組件,應(yīng)用程序通過(guò)擴(kuò)展這些組件提供特定函數(shù)組。應(yīng)用程序?qū)⒃谶@些擴(kuò)展點(diǎn)進(jìn)行擴(kuò)展,運(yùn)行時(shí)這些擴(kuò)展將被框架系統(tǒng)反調(diào)用。這正與使用類庫(kù)開發(fā)的應(yīng)用程序,運(yùn)行時(shí)的函數(shù)調(diào)用時(shí)顛倒的。
5、BS與CS的聯(lián)系與區(qū)別。
傳統(tǒng)的分布式應(yīng)用程序都是基于Client/Server結(jié)構(gòu)的,而近年來(lái)人們發(fā)現(xiàn)基于Client/Server結(jié)構(gòu)的應(yīng)用程序有很多缺點(diǎn),比如:如果客戶端的代碼需要改變,那么所有機(jī)器上的客戶端程序都要重新安裝;如果某臺(tái)機(jī)器有了不可修復(fù)的損壞,那么得去別的機(jī)器上重新安裝客戶端軟件才能夠使用。而基于Browser/Server結(jié)構(gòu)的應(yīng)用程序就沒(méi)有以上的缺點(diǎn)了,我們可以使用任何一臺(tái)有瀏覽器的機(jī)器來(lái)工作,而因?yàn)樗械某绦蜻壿嫸荚诜?wù)器端,所以服務(wù)器端的代碼變動(dòng)不需要作為客戶端的瀏覽器再做任何工作。
6、STRUTS的應(yīng)用(如STRUTS架構(gòu))
答:Struts是采用Java Servlet/JavaServer Pages技術(shù),開發(fā)Web應(yīng)用程序的開放源碼的framework。 采用Struts能開發(fā)出基于MVC(Model-View-Controller)設(shè)計(jì)模式的應(yīng)用構(gòu)架。 Struts有如下的主要功能:
一.包含一個(gè)controller servlet,能將用戶的請(qǐng)求發(fā)送到相應(yīng)的Action對(duì)象。
二.JSP自由tag庫(kù),并且在controller servlet中提供關(guān)聯(lián)支持,幫助開發(fā)員創(chuàng)建交互式表單應(yīng)用。
三.提供了一系列實(shí)用對(duì)象:XML處理、通過(guò)Java reflection APIs自動(dòng)處理JavaBeans屬性、國(guó)際化的提示和消息。
設(shè)計(jì)模式方面
1、開發(fā)中都用到了那些設(shè)計(jì)模式?用在什么場(chǎng)合?
答:人們?cè)谧约旱沫h(huán)境中不斷發(fā)現(xiàn)問(wèn)題和尋找問(wèn)題的解決方案的時(shí)候,發(fā)現(xiàn)有一些問(wèn)題及其解決方案不斷變換面孔重復(fù)出現(xiàn),但在這些不同的面孔后面有著共同的本質(zhì),這些共同的本質(zhì)就是模式。設(shè)計(jì)模式就是用來(lái)描述解決這些問(wèn)題的解決方案的核心的。
工廠模式
專門負(fù)責(zé)將大量有共同接口的類實(shí)例化。工廠模式可以動(dòng)態(tài)確定將那一個(gè)類實(shí)例化,不必事先知道每次要實(shí)例化那一個(gè)類。
簡(jiǎn)單工廠模式
或稱靜態(tài)工廠方法模式。簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類的實(shí)例。簡(jiǎn)單工廠模式就是由一個(gè)工廠類根據(jù)傳入的參數(shù)決定創(chuàng)建那一種產(chǎn)品類的實(shí)例。
簡(jiǎn)單工廠模式涉及到工廠角色、抽象產(chǎn)品角色以及具體產(chǎn)品角色:l工廠類角色:含有與應(yīng)用緊密相關(guān)的商業(yè)邏輯。工廠類在客戶端的直接調(diào)用下創(chuàng)建產(chǎn)品對(duì)象。l抽象產(chǎn)品角色:擔(dān)任這個(gè)角色的類是由工廠方法模式所創(chuàng)建的對(duì)象的父類,或它們共同擁有的接口。l具體產(chǎn)品角色:工廠方法模式所創(chuàng)建的任何對(duì)象都是這個(gè)角色的實(shí)例。
優(yōu)點(diǎn)是:允許客戶端相對(duì)獨(dú)立于產(chǎn)品創(chuàng)建的過(guò)程,并且在系統(tǒng)引入新產(chǎn)品的時(shí)候無(wú)需修改客戶端。缺點(diǎn)是:如果有新的產(chǎn)品加入到系統(tǒng)中去,就需要修改工廠類,將必要的邏輯加入到工廠類中。
工廠方法模式
或稱多態(tài)性工廠模式。工廠方法模式的用意是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類中。工廠方法模式中,核心的工廠類不再負(fù)責(zé)所有的產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類去做。它僅負(fù)責(zé)給出具體工廠子類必須實(shí)現(xiàn)的接口。這樣可以用來(lái)允許系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。
工廠方法模式涉及到的角色:l抽象工廠角色:它不包含應(yīng)用邏輯。任何在模式中創(chuàng)建對(duì)象的工廠類必須實(shí)現(xiàn)這個(gè)接口。l具體工廠角色:含有與應(yīng)用密切相關(guān)的邏輯,并且受到應(yīng)用程序的調(diào)用以創(chuàng)建產(chǎn)品對(duì)象。l抽象產(chǎn)品角色:工廠方法模式所創(chuàng)建的對(duì)象的超類型,也就是產(chǎn)品對(duì)象的共同父類或共同擁有的接口。l具體產(chǎn)品角色:這個(gè)角色實(shí)現(xiàn)了抽象產(chǎn)品角色所聲明的接口。
單例模式
確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例。
特點(diǎn):?jiǎn)卫愔荒苡幸粋€(gè)實(shí)例;單例類必須自己創(chuàng)建自己的惟一的實(shí)例;單例類必須給所有其他對(duì)象提供這一實(shí)例。
多例模式
多例類可以有多個(gè)實(shí)例,并且多例類必須自己創(chuàng)建、管理自己的實(shí)例,并向外界提供自己的實(shí)例。
在系統(tǒng)中可以用于數(shù)據(jù)庫(kù)連接池、鍵值緩存等。
代理模式
給某個(gè)對(duì)象提供一個(gè)代理對(duì)象,并由代理對(duì)象控制對(duì)原對(duì)象的引用。
代理模式所涉及的角色:抽象主題角色:聲明了真實(shí)主題和代理主題的共同接口,這樣一來(lái)在任何可以使用真實(shí)主題的地方都可以使用代理主題角色。
名稱
?
2、UML方面
UML包括的圖有:案例圖、類圖、序列圖、合作圖、狀態(tài)圖、活動(dòng)圖、構(gòu)件圖、部署圖。
類圖中的關(guān)系有:
一般關(guān)系(類于類的繼承關(guān)系、接口與接口的繼承關(guān)系、類對(duì)接口的實(shí)現(xiàn)關(guān)系);
關(guān)聯(lián)關(guān)系:它使一個(gè)類知道另一個(gè)類的屬性和方法。在java中,使用實(shí)例變量實(shí)現(xiàn)。
聚合關(guān)系:是整體與個(gè)體之間的關(guān)系。也是使用實(shí)例變量實(shí)現(xiàn)。
合成關(guān)系:是比聚合關(guān)系強(qiáng)的關(guān)系。它要求普通的聚合關(guān)系中代表整體的對(duì)象負(fù)責(zé)代表部分的對(duì)象的生命周期。
依賴關(guān)系:總是單向的。表示一個(gè)類依賴于另一個(gè)類的定義。
3、軟件的可維護(hù)性與可復(fù)用性
一個(gè)好的系統(tǒng)設(shè)計(jì)應(yīng)該有如下性質(zhì):
可擴(kuò)展性:新的性能可以很容易地加入到系統(tǒng)中。
靈活性:可以允許代碼修改平穩(wěn)地發(fā)生、而不會(huì)波及到很多其他的模塊。
可插入性:可以很容易地將一個(gè)類抽出去,同時(shí)將另一個(gè)有同樣接口的類加入進(jìn)來(lái)。
在java中可以給出一個(gè)或多個(gè)抽象java類或java接口,規(guī)定出所有的具體類必須提供的方法特征作為系統(tǒng)設(shè)計(jì)的抽象層。這個(gè)抽象層預(yù)見了所有的可能擴(kuò)展,因此,在任何擴(kuò)展情況下都不會(huì)改變。
接口是實(shí)現(xiàn)構(gòu)件的可插入性的關(guān)鍵。一個(gè)java接口是一些方法特征的集合,這些方法一般都是在系統(tǒng)經(jīng)常出現(xiàn)的方法。一個(gè)接口只有方法的特征,沒(méi)有方法的實(shí)現(xiàn),因此在不同地方的該方法實(shí)現(xiàn),可以具有不同的行為。
接口是對(duì)可插入性的保證:
因?yàn)樵陬惖年P(guān)聯(lián)中,如果一個(gè)關(guān)聯(lián)不是針對(duì)一個(gè)具體類的,而是針對(duì)一個(gè)接口的,那么任何實(shí)現(xiàn)這個(gè)接口的類就都可以滿足要求。當(dāng)前對(duì)象并不在意所關(guān)聯(lián)的是哪個(gè)具體類,而僅僅關(guān)心這個(gè)類是否實(shí)現(xiàn)了某個(gè)接口。這樣一來(lái),就可以動(dòng)態(tài)地將這個(gè)關(guān)聯(lián)從一個(gè)具體類轉(zhuǎn)換到另一個(gè)具體類,而這樣做的唯一條件是它們都實(shí)現(xiàn)某個(gè)接口。
抽象類僅提供一個(gè)類型的部分實(shí)現(xiàn)。抽象類通常代表一個(gè)抽象概念,它提供一個(gè)繼承的出發(fā)點(diǎn)。
javascript方面
1、如何校驗(yàn)數(shù)字型?
var re=/^\d{1,8}$|\.\d{1,2}$/;
var str=document.form1.all(i).value;
var r=str.match(re);
if (r==null) {
sign=-4;
break;
} else{
document.form1.all(i).value=parseFloat(str);
}
CORBA方面
什么是RMI?
Java RMI(Remote Method Invocation)--Java的遠(yuǎn)程方法調(diào)用是Java所特有的分布式計(jì)算技術(shù),它允許運(yùn)行在一個(gè)Java虛擬機(jī)上的對(duì)象調(diào)用運(yùn)行在另一個(gè)Java虛擬機(jī)上的對(duì)象的方法,從而使Java編程人員可以方便地在網(wǎng)絡(luò)環(huán)境中作分布式計(jì)算。面向?qū)ο笤O(shè)計(jì)要求每個(gè)任務(wù)由最適合該任務(wù)的對(duì)象執(zhí)行,RMI將這個(gè)概念更深入了一步,使任務(wù)可以在最適合該任務(wù)的機(jī)器上完成。
RMI定義了一組遠(yuǎn)程接口,可以用于生成遠(yuǎn)程對(duì)象。客戶機(jī)可以象調(diào)用本地對(duì)象的方法一樣用相同的語(yǔ)法調(diào)用遠(yuǎn)程對(duì)象。RMI API提供的類和方法可以處理所有訪問(wèn)遠(yuǎn)程方法的基礎(chǔ)通信和參數(shù)引用要求的串行化。
使用RMI開發(fā)步驟:
1、定義一個(gè)遠(yuǎn)程接口(遠(yuǎn)程接口必須繼承接口,每個(gè)方法必須拋出遠(yuǎn)程異常,方法參數(shù)和方法返回值都必須是可序列化的)
2、實(shí)現(xiàn)遠(yuǎn)程接口
3、定義使用遠(yuǎn)程對(duì)象的客戶程序
4、產(chǎn)生遠(yuǎn)程訪問(wèn)對(duì)象的樁和框
5、注冊(cè)遠(yuǎn)程對(duì)象
6、運(yùn)行服務(wù)器和客戶程序
RMI和CORBA的區(qū)別?
遠(yuǎn)程方法調(diào)用(RMI)和CORBA都是分布式計(jì)算技術(shù),在進(jìn)行分布式時(shí)各有其優(yōu)缺點(diǎn),CORBA和RMI的區(qū)別。
CORBA(Common Object Request Broker Architecture)是OMG的Object Management Architecture(對(duì)象管理結(jié)構(gòu)),它是面向?qū)ο蟮姆植际较到y(tǒng)建立所依據(jù)的標(biāo)準(zhǔn)。CORBA被設(shè)計(jì)成一個(gè)能供所有編程語(yǔ)言使用的一個(gè)開放性說(shuō)明,就是說(shuō)一個(gè)機(jī)器上的Java客戶可以要求另一個(gè)用SmallTalk或C++的機(jī)器服務(wù)。正是由于這種語(yǔ)言的獨(dú)立性使得CORBA這么靈活和吸引人。為了適應(yīng)語(yǔ)言獨(dú)立性,CORBA采用了非常通用的標(biāo)準(zhǔn)作為其接口。在不同的語(yǔ)言中,遠(yuǎn)程調(diào)用、簽名和對(duì)象的引入有各自不同的定義,所以CORBA必須盡可能的中立和開放。正是這種通用性是CORBA的一個(gè)弱點(diǎn)。當(dāng)開發(fā)人員都采用CORBA時(shí),他們要用一種新的標(biāo)準(zhǔn)定義語(yǔ)言接口,它要求開發(fā)者學(xué)習(xí)新的編程接口,從而減小了遠(yuǎn)程模型的透明性。
RMI是為僅在Java對(duì)Java的分布式計(jì)算中而開發(fā)的。遠(yuǎn)程調(diào)用的標(biāo)準(zhǔn)是為了Java和應(yīng)用Java的自然Java簽名和調(diào)用而開發(fā)的,這使得RMI對(duì)Java的開發(fā)者相當(dāng)透明而且易于實(shí)現(xiàn)。RMI用Java語(yǔ)言緊密集成從而同CORBA相比能夠提供非常好的容錯(cuò)能力及對(duì)異常的處理。盡管Java的RMI標(biāo)準(zhǔn)不像CORBA那樣語(yǔ)言獨(dú)立,但Java本身是一個(gè)獨(dú)立的平臺(tái),這就使RMI在跨平臺(tái)的分布軟件開發(fā)中是一個(gè)很好的選擇。
RMI是Java語(yǔ)言在分布式計(jì)算上的基本模型,很多Java的分布式系統(tǒng),包括我們本章要涉及的EJB,都是建立在RMI的思想上的。
基于IIOP協(xié)議的遠(yuǎn)程方法調(diào)用(RMI-IIOP)
RMI是一個(gè)分布對(duì)象系統(tǒng),允許java對(duì)象與運(yùn)行在其他虛擬機(jī)上的java對(duì)象進(jìn)行交互。使得可以象訪問(wèn)本地對(duì)象一樣訪問(wèn)遠(yuǎn)程對(duì)象;只要獲得一個(gè)遠(yuǎn)程對(duì)象的引用,就可以把這個(gè)對(duì)象看作如同運(yùn)行在同一虛擬機(jī)上那樣來(lái)調(diào)用它的方法。但RMI是一個(gè)僅限于Java的分布式對(duì)象系統(tǒng),這個(gè)系統(tǒng)使用了一個(gè)java特有的傳輸協(xié)議,即java遠(yuǎn)程方法協(xié)議(JRMP),在客戶端和服務(wù)器之間進(jìn)行信息傳輸。然而,這也意味著使用這種協(xié)議只能訪問(wèn)其他java對(duì)象,而無(wú)法訪問(wèn)非java對(duì)象。
遠(yuǎn)程方法調(diào)用的實(shí)際處理過(guò)程與CORBA的過(guò)程相似,即RMI使用客戶端樁和服務(wù)器端框。要調(diào)用遠(yuǎn)程方法,客戶端首先在樁上生成一個(gè)請(qǐng)求,然后將此請(qǐng)求傳遞給服務(wù)器,在服務(wù)器的框?qū)⒄?qǐng)求轉(zhuǎn)換成對(duì)遠(yuǎn)程對(duì)象的實(shí)際方法調(diào)用。客戶端樁將遠(yuǎn)程方法的所有參數(shù)序列化后傳遞給服務(wù)器框,框?qū)?duì)參數(shù)反序列化。
但是由于這種協(xié)議不支持EJB需要的企業(yè)級(jí)交互,因?yàn)樵谶@種類型的交互中必須通過(guò)遠(yuǎn)程方法調(diào)用來(lái)傳遞事務(wù)和安全環(huán)境。為此sun公司創(chuàng)建了RMI-IIOP即基于因特網(wǎng)內(nèi)部對(duì)象請(qǐng)求代理協(xié)議之上的遠(yuǎn)程方法調(diào)用。IIOP是一個(gè)用在CORBA對(duì)象請(qǐng)求代理間進(jìn)行通信的協(xié)議,在IIOP之上的RMI同時(shí)具有RMI和CORBA技術(shù)的特點(diǎn)。
LINUX方面
1、LINUX下線程,GDI類的解釋。
答:LINUX實(shí)現(xiàn)的就是基于核心輕量級(jí)進(jìn)程的"一對(duì)一"線程模型,一個(gè)線程實(shí)體對(duì)應(yīng)一個(gè)核心輕量級(jí)進(jìn)程,而線程之間的管理在核外函數(shù)庫(kù)中實(shí)現(xiàn)。
GDI類為圖像設(shè)備編程接口類庫(kù)。