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ù)時激發(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ù)庫
使用DOM API根據(jù)數(shù)據(jù)庫創(chuàng)建XML文檔
Java的國際化
國際化是為了將應(yīng)用程序發(fā)布在多個地區(qū)(locale)而進行準備的過程。不同地區(qū)標識了各個特定的國家在信息表現(xiàn)上所廣泛使用的語言、流通貨幣、字符集、日期格式及其他要素。
支持國際化的應(yīng)用程序具有以下特點:
1、不用改變代碼就可以支持另外的語言。
2、文本元素、消息和圖片保存在源代碼之外。
3、將于文化背景有關(guān)的數(shù)據(jù),比如日期和時間、十進制數(shù)值以及流通貨幣,根據(jù)用戶所用的語言和所在地理位置進行正確格式化。
4、支持非標準字符集。
5、應(yīng)用程序可以快速適應(yīng)新的語言區(qū)域。
為了使一個應(yīng)用程序國際化,:
1、必須將用戶所見到的硬編碼字符(如標簽、工具提示和錯誤信息等)替換成包含在資源包ResourceBundle中的字符。它是一個java屬性文件,它將關(guān)鍵字映射為字符值。并且可以使用多個不同語言版本的ResourceBundle,這樣將可以對于不同語言提供不同的字符串。
2、使用Locale對象,可以使數(shù)據(jù)格式化為與地區(qū)相關(guān)的數(shù)據(jù)。
3、國際化的應(yīng)用程序還必須使用統(tǒng)一的字符編碼標準字符集。
應(yīng)用服務(wù)器有那些?
Servlet方面
什么是Servlet?
Servlet是J2EE應(yīng)用框架中部署于Web層的Web組件,運行在支持Servlet的Web服務(wù)器或應(yīng)用服務(wù)器上。Servlet為客戶端和服務(wù)器端的信息處理提供了一種“請求/響應(yīng)”機制。
客戶程序?qū)⒄埱蟀l(fā)送到服務(wù)器;服務(wù)器將請求發(fā)送到Servlet;依據(jù)客戶程序的請求,Servlet動態(tài)地構(gòu)造回答信息并返回給服務(wù)器;服務(wù)器將回答返回給客戶程序。
什么是JSP?
JSP是J2EE應(yīng)用框架中部署于Web層的Web組件,是對Servlet技術(shù)的擴展。它使在靜態(tài)的頁面中加入動態(tài)的內(nèi)容變得非常容易。并且通過使用標簽庫可以大大節(jié)省開發(fā)時間;將JavaBean與JSP一起使用可以將數(shù)據(jù)表示和程序?qū)崿F(xiàn)分離。
在MVC架構(gòu)模式中:
使用Servlet作為控制器,而JSP作為數(shù)據(jù)視圖。
CGI與Servlet的區(qū)別?
CGI(公共網(wǎng)關(guān)接口)是一項標準,使WEB服務(wù)器可以與外部應(yīng)用程序交互。但是該技術(shù)存在一些嚴重的限制:
1、CGI應(yīng)用程序占用資源很多。當系統(tǒng)要處理來自一個用戶的請求時,就會創(chuàng)建一個新的進程來處理該請求,一旦CGI腳本停止執(zhí)行,系統(tǒng)就必須收回該進程。這種重量級進程的經(jīng)常啟動和停止非常低效。
2、CGI很難鏈接于請求進程的其他階段,因為在WEB服務(wù)器上它們運行于不同的進程。這就很難處理授權(quán)、工作流和日志記錄工作。
Java Servlet技術(shù)提供了一個基于組件、與平臺無關(guān)的方法來構(gòu)建WEB應(yīng)用程序。Servlet沒有標準CGI應(yīng)用程序所遇到的性能局限。
Servlet比CGI更高效是因為:
Servlet應(yīng)用中將只創(chuàng)建一個單一個重量級進程,并對每個用戶請求使用更輕量級的線程來完成請求處理,并且這些線程是由JVM自動維護。每個客戶端請求對應(yīng)一個線程,每個Servlet類在Servlet容器中只存在一個唯一的對象(實例)。Servlet類首次加載后將常駐內(nèi)存。
1、說一說Servlet的生命周期?
答:在第一次請求Servlet時將創(chuàng)建Servlet實例,容器調(diào)用實例的init方法,如果容器有請求要傳送給servlet,它就會調(diào)用servlet實例的Service方法。一個請求將作為一個線程。如果服務(wù)器要銷毀servlet實例就會調(diào)用servlet實例的destory方法,否則該實例將會常駐內(nèi)存。
2、Servlet版本間(忘了問的是哪兩個版本了)的不同?
希望大家補上,謝謝
會話根中技術(shù)
用戶認證:使用用戶名和口令進行驗證來讓客戶端訪問某些資源。
隱藏表單字段:用于保存一個瀏覽器在服務(wù)器中的相關(guān)信息。
URL重寫:在URL后面添加附加信息
持久Cookie:在請求和響應(yīng)頭信息中添加和編輯信息
什么是會話對象?
會話對象用于在用戶訪問一個Web站點的多個頁面時共享信息。任何時候用戶第一次訪問某個網(wǎng)頁,系統(tǒng)都將創(chuàng)建一個會話。如果以后用戶訪問此網(wǎng)頁,JSP將檢索有關(guān)此會話的信息。只要服務(wù)器收到此用戶的請求,則會話就會持續(xù),如果經(jīng)過一段時間沒有收到此用戶的新請求,會話就會終止。
3、JAVA SERVLET API中forward() 與redirect()的區(qū)別?
使用重定向:當調(diào)用sendRedirect方法時,Web容器就會向瀏覽器返回響應(yīng),指示需要新的URL。因為瀏覽器發(fā)出了完全嶄新的請求,所以在重定向之前存儲為請求屬性的任何對象都會消失。
使用轉(zhuǎn)發(fā):當為一個請求調(diào)用轉(zhuǎn)發(fā)時,請求就發(fā)送給服務(wù)器上另一個資源,而無需通知客戶機由不同的資源處理請求。這個過程完全在Web容器內(nèi)部進行,客戶機絕不知曉。與重定向不同,轉(zhuǎn)發(fā)過程中,對象可以存儲在請求中,并發(fā)送給下一個資源使用。
因為轉(zhuǎn)發(fā)過程完全在服務(wù)器上進行,與客戶機沒用通信,因此轉(zhuǎn)發(fā)的性能優(yōu)于重定向。
但是如果在JSP頁面上使用圖形的相對路徑和其他資源,轉(zhuǎn)發(fā)機制就會帶來問題。因為瀏覽器無從得知發(fā)生了轉(zhuǎn)發(fā),所以相對路徑只是相對初始的Servlet,而不是所轉(zhuǎn)發(fā)到的JSP頁面。使用JSP自定義標簽可以解決這個問題。
如何現(xiàn)實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)置對象?作用分別是什么?
JSP的隱式對象
RequestJavax.servlet.ServletRequest它包含了有關(guān)瀏覽器請求的信息.通過該對象可以獲得請求中的頭信息、Cookie和請求參數(shù)。
Enumeration getHeaderNames()String getHeader(name)Cookie[] getCookies()Enumeration GetParameterNames()String getParameter(name)String[] GetParametervalues(name)HttpSession getSession(flag)
responseJavax.servlet.ServletResponse作為JSP頁面處理結(jié)果返回給用戶的響應(yīng)存儲在該對象中。并提供了設(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頁面實例的輸出流中,提供了幾個方法使你能用于向瀏覽器回送輸出結(jié)果。
pageContextJavax.servlet.jsp.PageContext描述了當前JSP頁面的運行環(huán)境。可以返回JSP頁面的其他隱式對象及其屬性的訪問,另外,它還實現(xiàn)將控制權(quán)從當前頁面?zhèn)鬏斨疗渌撁娴姆椒ā?br />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會話對象存儲有關(guān)此會話的信息,也可以將屬性賦給一個會話,每個屬性都有名稱和值。會話對象主要用于存儲和檢索屬性值。
Void setAttribute(name,data)Object getAttribute(name)
applicationjavax.servle.ServletContext存儲了運行JSP頁面的servlet以及在同一應(yīng)用程序中的任何Web組件的上下文信息。
pageJava.lang.Object表示當前JSP頁面的servlet實例
configjavax.servlet.ServletConfig該對象用于存取servlet實例的初始化參數(shù)。
Enumeration getInitParameterNames()String getInitParameter(name)
ExceptionJavax.lang.Throwable在某個頁面拋出異常時,將轉(zhuǎn)發(fā)至JSP錯誤頁面,提供此對象是為了在JSP中處理錯誤。
String getMessage()Void printStackTrace(out)<%@ page errorPage=”error.jsp”%><%@ page isErrorPage=”true” %>
2、jsp有哪些動作?作用分別是什么?
答:JSP共有以下6種基本動作
ljsp:include:在頁面被請求的時候引入一個文件。
ljsp:useBean:尋找或者實例化一個JavaBean。
ljsp:setProperty:設(shè)置JavaBean的屬性。
ljsp:getProperty:輸出某個JavaBean的屬性。
ljsp:forward:把請求轉(zhuǎn)到一個新的頁面。
ljsp:plugin:根據(jù)瀏覽器類型為Java插件生成OBJECT或EMBED標記
3、JSP中動態(tài)INCLUDE與靜態(tài)INCLUDE的區(qū)別?
答:動態(tài)INCLUDE用jsp:include動作實現(xiàn)
<jsp:include page="included.jsp" flush="true" />它總是會檢查所含文件中的變化,適合用于包含動態(tài)頁面,并且可以帶參數(shù)
靜態(tài)INCLUDE用include偽碼實現(xiàn),定不會檢查所含文件的變化,適用于包含靜態(tài)頁面
<%@ include file="included.htm" %>
4、兩種跳轉(zhuǎn)方式分別是什么?有什么區(qū)別?
答:有兩種,分別為:
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者頁面不會轉(zhuǎn)向include所指的頁面,只是顯示該頁的結(jié)果,主頁面還是原來的頁面。執(zhí)行完后還會回來,相當于函數(shù)調(diào)用。并且可以帶參數(shù).后者完全轉(zhuǎn)向新頁面,不會再回來。相當于go to 語句。
JSP的常用指令
<%@ include file=”localURL” %>
<%@ page attribute=”value1” %>
屬性值缺省值示例
contentTypeMIME類型和字符集“text/hmt”contentType=“text/html;charset=ISO-8859-1“contentType=“text/xml“
Extends類名無Extends=“com.taglib.wdjsp.MyJspPage“
Import 類名或包名無
Session布爾值TrueSession=“true”
isThreadSafe布爾值True
ErrorPage
isErrorPage
<%@ taglib uri=”tagLibraryURL” prefix=”tagPrefix” %>
Jdbc
說出數(shù)據(jù)連接池的工作機制是什么?
1、可能會讓你寫一段Jdbc連Oracle的程序,并實現(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)用該訪問返回一個以字符串指定類名的類的對象。
說出在JSP頁面里是怎么分頁的?
頁面需要保存以下參數(shù):
總行數(shù):根據(jù)sql語句得到總行數(shù)
每頁顯示行數(shù):設(shè)定值
當前頁數(shù):請求參數(shù)
頁面根據(jù)當前頁數(shù)和每頁行數(shù)計算出當前頁第一行行數(shù),定位結(jié)果集到此行,對結(jié)果集取出每頁顯示行數(shù)的行即可。
4、在ORACLE大數(shù)據(jù)量下的分頁解決方法。一般用截取ID方法,還有是三層嵌套方法。
答:一種分頁方法
<%
int i=1;
int numPages=14;
//獲取當前頁面
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) ;
//獲取總頁數(shù)
int intPageCount=1;
intPageCount=(i%numPages==0)?(i/numPages):(i/numPages+1);
//設(shè)置上下頁
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)容
//輸出翻頁連接
合計:<%=currentPage%>/<%=intPageCount%>
<a href="List.jsp?page=1">第一頁</a>
<a href="List.jsp?page=<%=upPage%>">上一頁</a>
<%
for(int j=1;j<=intPageCount;j++){
if(currentPage!=j){
%>
//顯示所有頁面的連接
<a href="list.jsp?page=<%=j%>">[<%=j%>]</a>
<%
}else{
out.println(j);
} //end of if
} //end of for
%>
<a href="List.jsp?page=<%=nextPage%>">下一頁</a>
<a href="List.jsp?page=<%=intPageCount%>">最后頁 </a>
Xml方面
2、你在項目中用到了xml技術(shù)的哪些方面?如何實現(xiàn)的?
答:用到了數(shù)據(jù)存貯,信息配置兩方面。在做數(shù)據(jù)交換平臺時,將不能數(shù)據(jù)源的數(shù)據(jù)組裝成XML文件,然后將XML文件壓縮打包加密后通過網(wǎng)絡(luò)傳送給接收者,接收解密與解壓縮后再同XML文件中還原相關(guān)信息進行處理。在做軟件配置時,利用XML可以很方便的進行,軟件的各種配置參數(shù)都存貯在XML文件中。
3、用jdom解析xml文件時如何解決中文問題?如何解析?
答:看如下代碼,用編碼方式加以解決
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>信息學院</college>
<telephone>6258113</telephone>
<notes>男,1955年生,博士,95年調(diào)入海南大學</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>學院</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)容?分別用在什么場合? EJB2.0和EJB1.1的區(qū)別?
答:規(guī)范內(nèi)容包括Bean提供者,應(yīng)用程序裝配者,EJB容器,EJB配置工具,EJB服務(wù)提供者,系統(tǒng)管理員。這里面,EJB容器是EJB之所以能夠運行的核心。EJB容器管理著EJB的創(chuàng)建,撤消,激活,去活,與數(shù)據(jù)庫的連接等等重要的核心工作。JSP,Servlet,EJB,JNDI,JDBC,JMS.....
2、EJB與JAVA BEAN的區(qū)別?
JavaBean是可復(fù)用的平臺獨立的軟件組件,開發(fā)者可以在軟件構(gòu)造器工具中對其直接進行可視化操作。
Enterprise Java Bean 相當于DCOM,即分布式組件。它是基于Java的遠程方法調(diào)用(RMI)技術(shù)的,所以EJB可以被遠程訪問(跨進程、跨計算機)。但EJB必須被布署在諸如Webspere、WebLogic這樣的容器中,EJB客戶從不直接訪問真正的EJB組件,而是通過其容器訪問。EJB容器是EJB組件的代理,EJB組件由容器所創(chuàng)建和管理。客戶通過容器來訪問真正的EJB組件。
3、EJB的基本架構(gòu)
答:一個EJB包括三個部分:
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的各個部分都有那些技術(shù)來實現(xiàn)?如何實現(xiàn)?
答:MVC是Model-View-Controller的簡寫。設(shè)計的基本原理是將復(fù)雜性分解為三個組件,即模型、視圖、控制器。
模型表示數(shù)據(jù)和處理數(shù)據(jù)的業(yè)務(wù)邏輯或應(yīng)用程序?qū)ο蟆?br />試圖是用戶要查看或存取的數(shù)據(jù)的表示。
控制器定義了用戶與模型和試圖交互的方式。
2、應(yīng)用服務(wù)器與WEB SERVER的區(qū)別?
Web Service 是一種新的分布式技術(shù)。一個Web服務(wù)本質(zhì)上是一個應(yīng)用組件,可以通過Web協(xié)議和數(shù)據(jù)編碼機制,例如HTTP和XML,對這個組件進行訪問。
Soap簡單對象訪問協(xié)議:
是一種基于XML的通信協(xié)議。它包括3個部分。
Soap封裝結(jié)構(gòu):定義消息的XML格式,包括其整體框架、消息內(nèi)容、由誰處理這些內(nèi)容等。
Soap編程規(guī)則:定義如何將程序數(shù)據(jù)表示為XML。
Soap RPC表示:定義如何使用scap進行遠程過程調(diào)用。
WSDL Web服務(wù)描述語言:
WSDL文件是一個XML文檔,用于說明一組soap消息以及如何交換這些消息。還定義了服務(wù)的位置以及使用服務(wù)的通信協(xié)議等。
Uddi統(tǒng)一描述、發(fā)現(xiàn)和集成標準
是wed服務(wù)的黃頁。它提供了用于服務(wù)注冊的目錄技術(shù),并用它來建立Web服務(wù)的目錄信息。UDDI的核心組件是UDDI商業(yè)注冊,它使用一個XML文檔來描述企業(yè)及所提供的Web服務(wù)。它包括3個部分:
白頁:介紹提供服務(wù)的公司,包括名稱、地址和聯(lián)系方式等;
黃頁:包括按照標準分類法進行分類的行業(yè)類別;
綠頁:詳細介紹,訪問服務(wù)接口等技術(shù)信息。
Web服務(wù)是構(gòu)建在soap(簡單對象訪問協(xié)議)、wsdl(web服務(wù)描述語言)、uddi(統(tǒng)一描述、發(fā)現(xiàn)和集成標準)3個開放的核心標準之上的。Soap用來進行Web服務(wù)通信的協(xié)議,WSDL用來進行說明和描述Web服務(wù)
由于Web服務(wù)完全基于XML的,使Web服務(wù)成為一個跨語言、跨平臺、跨網(wǎng)絡(luò)的可互操作的分布式應(yīng)用軟件的新平臺。
3、J2EE是什么?
J2EE是sun公司推出的一個高層次的全方位、多功能的企業(yè)應(yīng)用開發(fā)環(huán)境。它包括了當今軟件工業(yè)界許多最新、最重要的軟件技術(shù)。J2EE平臺包含一整套的服務(wù)、應(yīng)用程序接口和協(xié)議,是java技術(shù)企業(yè)級應(yīng)用的整體解決方案。J2EE平臺通過基于組件的應(yīng)用程序模型大大簡化了開發(fā)過程,同時還支持任何分布式體系和多層次的應(yīng)用開發(fā)。隨著越來越多的第三方對J2EE的支持和標準認證,J2EE已被廣泛用來開發(fā)企業(yè)級應(yīng)用軟件、中間件和組件軟件。
J2EE Java2平臺企業(yè)版:
1、提供了基于組件的方式來設(shè)計、開發(fā)、組裝和部署企業(yè)應(yīng)用。
2、提供了一個多層次分布式的應(yīng)用模型,包括了可復(fù)用的組件、基于XML數(shù)據(jù)交換、統(tǒng)一的安全模式以及靈活的事務(wù)控制。基于這些技術(shù),可開發(fā)出滿足市場要求的,基于平臺無關(guān)的J2EE組件的解決方案。
3、J2EE平臺使用的多層分布式應(yīng)用模型中應(yīng)用程序主要分為:客戶層(Applet)、Web層(Servlet和JSP)、業(yè)務(wù)層(EJB)、企業(yè)信息系統(tǒng)層。
使用類庫開發(fā)與使用框架包進行開發(fā)的區(qū)別?
框架包簡單的可以認為是一組類和接口,它們相互協(xié)作以解決特定類型的軟件問題。
類庫包含的是應(yīng)用程序可以調(diào)用的函數(shù)或例程。而框架包提供通用的、相互協(xié)作的組件,應(yīng)用程序通過擴展這些組件提供特定函數(shù)組。應(yīng)用程序?qū)⒃谶@些擴展點進行擴展,運行時這些擴展將被框架系統(tǒng)反調(diào)用。這正與使用類庫開發(fā)的應(yīng)用程序,運行時的函數(shù)調(diào)用時顛倒的。
5、BS與CS的聯(lián)系與區(qū)別。
傳統(tǒng)的分布式應(yīng)用程序都是基于Client/Server結(jié)構(gòu)的,而近年來人們發(fā)現(xiàn)基于Client/Server結(jié)構(gòu)的應(yīng)用程序有很多缺點,比如:如果客戶端的代碼需要改變,那么所有機器上的客戶端程序都要重新安裝;如果某臺機器有了不可修復(fù)的損壞,那么得去別的機器上重新安裝客戶端軟件才能夠使用。而基于Browser/Server結(jié)構(gòu)的應(yīng)用程序就沒有以上的缺點了,我們可以使用任何一臺有瀏覽器的機器來工作,而因為所有的程序邏輯都在服務(wù)器端,所以服務(wù)器端的代碼變動不需要作為客戶端的瀏覽器再做任何工作。
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è)計模式的應(yīng)用構(gòu)架。 Struts有如下的主要功能:
一.包含一個controller servlet,能將用戶的請求發(fā)送到相應(yīng)的Action對象。
二.JSP自由tag庫,并且在controller servlet中提供關(guān)聯(lián)支持,幫助開發(fā)員創(chuàng)建交互式表單應(yīng)用。
三.提供了一系列實用對象:XML處理、通過Java reflection APIs自動處理JavaBeans屬性、國際化的提示和消息。
設(shè)計模式方面
1、開發(fā)中都用到了那些設(shè)計模式?用在什么場合?
答:人們在自己的環(huán)境中不斷發(fā)現(xiàn)問題和尋找問題的解決方案的時候,發(fā)現(xiàn)有一些問題及其解決方案不斷變換面孔重復(fù)出現(xiàn),但在這些不同的面孔后面有著共同的本質(zhì),這些共同的本質(zhì)就是模式。設(shè)計模式就是用來描述解決這些問題的解決方案的核心的。
工廠模式
專門負責將大量有共同接口的類實例化。工廠模式可以動態(tài)確定將那一個類實例化,不必事先知道每次要實例化那一個類。
簡單工廠模式
或稱靜態(tài)工廠方法模式。簡單工廠模式是由一個工廠對象決定創(chuàng)建出哪一種產(chǎn)品類的實例。簡單工廠模式就是由一個工廠類根據(jù)傳入的參數(shù)決定創(chuàng)建那一種產(chǎn)品類的實例。
簡單工廠模式涉及到工廠角色、抽象產(chǎn)品角色以及具體產(chǎn)品角色:l工廠類角色:含有與應(yīng)用緊密相關(guān)的商業(yè)邏輯。工廠類在客戶端的直接調(diào)用下創(chuàng)建產(chǎn)品對象。l抽象產(chǎn)品角色:擔任這個角色的類是由工廠方法模式所創(chuàng)建的對象的父類,或它們共同擁有的接口。l具體產(chǎn)品角色:工廠方法模式所創(chuàng)建的任何對象都是這個角色的實例。
優(yōu)點是:允許客戶端相對獨立于產(chǎn)品創(chuàng)建的過程,并且在系統(tǒng)引入新產(chǎn)品的時候無需修改客戶端。缺點是:如果有新的產(chǎn)品加入到系統(tǒng)中去,就需要修改工廠類,將必要的邏輯加入到工廠類中。
工廠方法模式
或稱多態(tài)性工廠模式。工廠方法模式的用意是定義一個創(chuàng)建產(chǎn)品對象的工廠接口,將實際創(chuàng)建工作推遲到子類中。工廠方法模式中,核心的工廠類不再負責所有的產(chǎn)品的創(chuàng)建,而是將具體創(chuàng)建的工作交給子類去做。它僅負責給出具體工廠子類必須實現(xiàn)的接口。這樣可以用來允許系統(tǒng)在不修改具體工廠角色的情況下引進新的產(chǎn)品。
工廠方法模式涉及到的角色:l抽象工廠角色:它不包含應(yīng)用邏輯。任何在模式中創(chuàng)建對象的工廠類必須實現(xiàn)這個接口。l具體工廠角色:含有與應(yīng)用密切相關(guān)的邏輯,并且受到應(yīng)用程序的調(diào)用以創(chuàng)建產(chǎn)品對象。l抽象產(chǎn)品角色:工廠方法模式所創(chuàng)建的對象的超類型,也就是產(chǎn)品對象的共同父類或共同擁有的接口。l具體產(chǎn)品角色:這個角色實現(xiàn)了抽象產(chǎn)品角色所聲明的接口。
單例模式
確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。
特點:單例類只能有一個實例;單例類必須自己創(chuàng)建自己的惟一的實例;單例類必須給所有其他對象提供這一實例。
多例模式
多例類可以有多個實例,并且多例類必須自己創(chuàng)建、管理自己的實例,并向外界提供自己的實例。
在系統(tǒng)中可以用于數(shù)據(jù)庫連接池、鍵值緩存等。
代理模式
給某個對象提供一個代理對象,并由代理對象控制對原對象的引用。
代理模式所涉及的角色:抽象主題角色:聲明了真實主題和代理主題的共同接口,這樣一來在任何可以使用真實主題的地方都可以使用代理主題角色。
名稱
?
2、UML方面
UML包括的圖有:案例圖、類圖、序列圖、合作圖、狀態(tài)圖、活動圖、構(gòu)件圖、部署圖。
類圖中的關(guān)系有:
一般關(guān)系(類于類的繼承關(guān)系、接口與接口的繼承關(guān)系、類對接口的實現(xiàn)關(guān)系);
關(guān)聯(lián)關(guān)系:它使一個類知道另一個類的屬性和方法。在java中,使用實例變量實現(xiàn)。
聚合關(guān)系:是整體與個體之間的關(guān)系。也是使用實例變量實現(xiàn)。
合成關(guān)系:是比聚合關(guān)系強的關(guān)系。它要求普通的聚合關(guān)系中代表整體的對象負責代表部分的對象的生命周期。
依賴關(guān)系:總是單向的。表示一個類依賴于另一個類的定義。
3、軟件的可維護性與可復(fù)用性
一個好的系統(tǒng)設(shè)計應(yīng)該有如下性質(zhì):
可擴展性:新的性能可以很容易地加入到系統(tǒng)中。
靈活性:可以允許代碼修改平穩(wěn)地發(fā)生、而不會波及到很多其他的模塊。
可插入性:可以很容易地將一個類抽出去,同時將另一個有同樣接口的類加入進來。
在java中可以給出一個或多個抽象java類或java接口,規(guī)定出所有的具體類必須提供的方法特征作為系統(tǒng)設(shè)計的抽象層。這個抽象層預(yù)見了所有的可能擴展,因此,在任何擴展情況下都不會改變。
接口是實現(xiàn)構(gòu)件的可插入性的關(guān)鍵。一個java接口是一些方法特征的集合,這些方法一般都是在系統(tǒng)經(jīng)常出現(xiàn)的方法。一個接口只有方法的特征,沒有方法的實現(xiàn),因此在不同地方的該方法實現(xiàn),可以具有不同的行為。
接口是對可插入性的保證:
因為在類的關(guān)聯(lián)中,如果一個關(guān)聯(lián)不是針對一個具體類的,而是針對一個接口的,那么任何實現(xiàn)這個接口的類就都可以滿足要求。當前對象并不在意所關(guān)聯(lián)的是哪個具體類,而僅僅關(guān)心這個類是否實現(xiàn)了某個接口。這樣一來,就可以動態(tài)地將這個關(guān)聯(lián)從一個具體類轉(zhuǎn)換到另一個具體類,而這樣做的唯一條件是它們都實現(xiàn)某個接口。
抽象類僅提供一個類型的部分實現(xiàn)。抽象類通常代表一個抽象概念,它提供一個繼承的出發(fā)點。
javascript方面
1、如何校驗數(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的遠程方法調(diào)用是Java所特有的分布式計算技術(shù),它允許運行在一個Java虛擬機上的對象調(diào)用運行在另一個Java虛擬機上的對象的方法,從而使Java編程人員可以方便地在網(wǎng)絡(luò)環(huán)境中作分布式計算。面向?qū)ο笤O(shè)計要求每個任務(wù)由最適合該任務(wù)的對象執(zhí)行,RMI將這個概念更深入了一步,使任務(wù)可以在最適合該任務(wù)的機器上完成。
RMI定義了一組遠程接口,可以用于生成遠程對象。客戶機可以象調(diào)用本地對象的方法一樣用相同的語法調(diào)用遠程對象。RMI API提供的類和方法可以處理所有訪問遠程方法的基礎(chǔ)通信和參數(shù)引用要求的串行化。
使用RMI開發(fā)步驟:
1、定義一個遠程接口(遠程接口必須繼承接口,每個方法必須拋出遠程異常,方法參數(shù)和方法返回值都必須是可序列化的)
2、實現(xiàn)遠程接口
3、定義使用遠程對象的客戶程序
4、產(chǎn)生遠程訪問對象的樁和框
5、注冊遠程對象
6、運行服務(wù)器和客戶程序
RMI和CORBA的區(qū)別?
遠程方法調(diào)用(RMI)和CORBA都是分布式計算技術(shù),在進行分布式時各有其優(yōu)缺點,CORBA和RMI的區(qū)別。
CORBA(Common Object Request Broker Architecture)是OMG的Object Management Architecture(對象管理結(jié)構(gòu)),它是面向?qū)ο蟮姆植际较到y(tǒng)建立所依據(jù)的標準。CORBA被設(shè)計成一個能供所有編程語言使用的一個開放性說明,就是說一個機器上的Java客戶可以要求另一個用SmallTalk或C++的機器服務(wù)。正是由于這種語言的獨立性使得CORBA這么靈活和吸引人。為了適應(yīng)語言獨立性,CORBA采用了非常通用的標準作為其接口。在不同的語言中,遠程調(diào)用、簽名和對象的引入有各自不同的定義,所以CORBA必須盡可能的中立和開放。正是這種通用性是CORBA的一個弱點。當開發(fā)人員都采用CORBA時,他們要用一種新的標準定義語言接口,它要求開發(fā)者學習新的編程接口,從而減小了遠程模型的透明性。
RMI是為僅在Java對Java的分布式計算中而開發(fā)的。遠程調(diào)用的標準是為了Java和應(yīng)用Java的自然Java簽名和調(diào)用而開發(fā)的,這使得RMI對Java的開發(fā)者相當透明而且易于實現(xiàn)。RMI用Java語言緊密集成從而同CORBA相比能夠提供非常好的容錯能力及對異常的處理。盡管Java的RMI標準不像CORBA那樣語言獨立,但Java本身是一個獨立的平臺,這就使RMI在跨平臺的分布軟件開發(fā)中是一個很好的選擇。
RMI是Java語言在分布式計算上的基本模型,很多Java的分布式系統(tǒng),包括我們本章要涉及的EJB,都是建立在RMI的思想上的。
基于IIOP協(xié)議的遠程方法調(diào)用(RMI-IIOP)
RMI是一個分布對象系統(tǒng),允許java對象與運行在其他虛擬機上的java對象進行交互。使得可以象訪問本地對象一樣訪問遠程對象;只要獲得一個遠程對象的引用,就可以把這個對象看作如同運行在同一虛擬機上那樣來調(diào)用它的方法。但RMI是一個僅限于Java的分布式對象系統(tǒng),這個系統(tǒng)使用了一個java特有的傳輸協(xié)議,即java遠程方法協(xié)議(JRMP),在客戶端和服務(wù)器之間進行信息傳輸。然而,這也意味著使用這種協(xié)議只能訪問其他java對象,而無法訪問非java對象。
遠程方法調(diào)用的實際處理過程與CORBA的過程相似,即RMI使用客戶端樁和服務(wù)器端框。要調(diào)用遠程方法,客戶端首先在樁上生成一個請求,然后將此請求傳遞給服務(wù)器,在服務(wù)器的框?qū)⒄埱筠D(zhuǎn)換成對遠程對象的實際方法調(diào)用。客戶端樁將遠程方法的所有參數(shù)序列化后傳遞給服務(wù)器框,框?qū)?shù)反序列化。
但是由于這種協(xié)議不支持EJB需要的企業(yè)級交互,因為在這種類型的交互中必須通過遠程方法調(diào)用來傳遞事務(wù)和安全環(huán)境。為此sun公司創(chuàng)建了RMI-IIOP即基于因特網(wǎng)內(nèi)部對象請求代理協(xié)議之上的遠程方法調(diào)用。IIOP是一個用在CORBA對象請求代理間進行通信的協(xié)議,在IIOP之上的RMI同時具有RMI和CORBA技術(shù)的特點。
LINUX方面
1、LINUX下線程,GDI類的解釋。
答:LINUX實現(xiàn)的就是基于核心輕量級進程的"一對一"線程模型,一個線程實體對應(yīng)一個核心輕量級進程,而線程之間的管理在核外函數(shù)庫中實現(xiàn)。
GDI類為圖像設(shè)備編程接口類庫。