JAVA教程之利用JSP+JAVABEAN+XML 开辟的一个例子
有了这样一个呼声:让java代替C语言成为基本语言。这些足以说明java简单易学的这个优点。其次,java的功能强大,前面我也提到了,EJB3.0的推出使java成为了大型项目的首选。js|xml本例子是参考了一些网站上有关JSP对XML的操纵的相干文档,又分离了一些团体的体味。例子触及的内容是,开辟的一个企业外部定餐体系背景办理真个部分代码,功效次要会合在关于餐馆基础信息的办理。
该例子自己开辟的原因是我在原公司和同事们一个打趣的一部分。特此也表达对那些一同同事的伴侣们的惦念。
例子自己是在TOMCAT4.01平台下运转的B/S布局的程式。有关TOMCAT的设置,这里不做申明。只解说一下相干文件及文件夹的目次布局。
目次布局申明:
/tomcat/webapps/canyin/-----主目次
/tomcat/webapps/canyin/jsp/-----JSP文件目次
/tomcat/webapps/canyin/jsp/admin/-----完成背景办理的JSP文件的寄存目次
/tomcat/webapps/canyin/WEB-INF/classes/canyin/------javabean文件的寄存目次
/tomcat/webapps/canyin/data/-----xml文件寄存目次
/tomcat/webapps/ROOT/-----tomcat启动文件寄存文件夹,只寄存了index.html文件
文件复杂申明:
/tomcat/webapps/canyin/data/users.xml-----纪录用户信息
/tomcat/webapps/canyin/data/restaurants.xml-----纪录餐馆的基本信息
/tomcat/webapps/ROOT/index.html-----首页,页面呈现输出框,请求用户输出用户名,暗码
/tomcat/webapps/canyin/jsp/loginjudge.jsp-----用户身份判别页面,依据用户称号和暗码决意页面是转进背景办理端,仍是前台客户端。本例子中,用户身份一旦确以为有办理权限,能够进进背景办理端,就间接跳到餐馆基础信息办理页面,简化申明的流程。
/tomcat/webapps/canyin/jsp/admin/admin_rest.jsp-----餐馆基础信息办理页面,办理餐馆的称号,德律风,地点等信息
/tomcat/webapps/canyin/WEB-INF/classes/canyin/checkSessionBean.class-----背景办理端检测标记用户身份的session的值,假如不是办理员的话,跳回上岸页面。
/tomcat/webapps/canyin/WEB-INF/classes/canyin/connXmlBean.class-----毗连xml文件
/tomcat/webapps/canyin/WEB-INF/classes/canyin/writeXmlBean.class-----写进xml文件
文件具体先容及附带代码申明。
/tomcat/webapps/canyin/data/users.xml
代码:
<?xmlversion="1.0"encoding="UTF-8"?>
-<users>
<username="joard"password="joard"roles="admin"/>
<username="joard01"password="joard01"roles="user"/>
<username="joard02"password="joard02"roles="user"/>
</users>
申明:字段寄义是用户名,暗码和用户的身份
/tomcat/webapps/canyin/data/restaurants.xml
代码:
<?xmlversion="1.0"encoding="UTF-8"?>
-<restaurantsnum="10">
-<restaurantid="1">
<name>上海亭快餐店</name>
<phone>021-76546726</phone>
<address>百老汇广场B座</address>
</restaurant>
-<restaurantid="8">
<name>喷鼻格里拉年夜饭铺</name>
<phone>021-2312134</phone>
<address>南京路1023号</address>
</restaurant>
</restaurants>
申明:<num>属性是纪录在restaurants.xml文件中统共有过量少笔记录,每新增一条,不管今后删除是不是,该值城市增添1,就好象数据库中习气利用的主动增添1的id项。用来给新增的<restaurant>的属性<id>赋一个独一的值。别的的字段意义对照分明。
/tomcat/webapps/ROOT/index.html(纯真的HTML代码)
代码:
<html>
<head>
<title>oddWorld餐饮体系</title>
<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">
</head>
<bodyonload="javascript:dataform.username.focus()">
<divalign="center">
<tablewidth="100%"border="0"cellspacing="0"cellpadding="0"height="22">
<tr>
<tdwidth="1"></td>
</tr>
</table>
<br>
<br>
<tablewidth="300"border="0"cellspacing="1"cellpadding="0">
<tr>
<tdheight="200"valign="top"align="center">
<palign="center">
<tablewidth="100%"border="0"cellspacing="1"cellpadding="5"bgcolor=#999999class=a9px>
<tr>
<tdbgcolor="#efefef">餐饮体系登录</td>
</tr>
<tr>
<tdbgcolor="#FFFFFF"valign="top"align="center">
<tablewidth="100%"border="0"cellspacing="0"cellpadding="0">
<formname=dataformmethod=postaction=canyin/jsp/loginjudge.jsp>
<tr>
<tdwidth="100"><b>登录名:</b></td>
<td>
<inputmaxlength=16
name="username"class=steditvalue="joard">
</td>
</tr>
<tr>
<tdwidth="100"><b>暗码:</b></td>
<td>
<inputclass=steditmaxlength=16
name="userpass"type=passwordvalue="oddworld">
</td>
</tr>
</form>
</table>
<br>
<tableborder=0cellpadding=0cellspacing=0>
<tbody>
<tr>
<td>
<inputclass=stbtmname=updateonClick="javascript:if(checkform()==false);"type=buttonvalue="登录">
</td>
<td></td>
<td>
<inputclass=stbtmname=SubmitonClick="javascript:window.location.href=index.asp?myjoke=1;"type=buttonvalue="修正暗码">
</td>
<td></td>
</tr>
</tbody>
</table>
<br>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</body>
</html>
<SCRIPTlanguage=javascript>
<!--
functioncheckform()
{
varCheckblank=/^(s*|( )|(.))*$/;
if(Checkblank.test(dataform.username.value))
{
alert("登录名不克不及为空!");
returnfalse;
}
if(Checkblank.test(dataform.userpass.value))
{
alert("暗码不克不及为空!");
returnfalse;
}
window.dataform.submit();
}
-->
</SCRIPT>
申明:把用户称号和用户暗码提交到/tomcat/webapps/canyin/jsp/loginjudge.jsp
/tomcat/webapps/canyin/WEB-INF/classes/canyin/checkSessionBean.class(代码是响应的java文件)
packagecanyin;
importjavax.servlet.http.HttpSession;
importjavax.servlet.http.HttpServletRequest;
publicclasscheckSessionBean{
privatebooleanbolCheckPass=false;
privateHttpServletRequestrequest=null;
publicbooleancheckSessionBean(HttpServletRequestrequest,StringstrSessionName,StringstrCheckValue){
publicbooleancheckSessionBean(HttpServletRequestrequest){
HttpSessionsession=request.getSession(false);
return(bolCheckPass);
if(strSessionName==null||strCheckValue==null){
return(bolCheckPass);
}else{
if(session!=null&&session.getValue(strSessionName)!=null){
bolCheckPass=session.getValue(strSessionName).equals(strCheckValue);
}
return(bolCheckPass);
}
}
}
申明:查验参数传进的session称号的数值和参数传进的字段的数值是不是相称。
/tomcat/webapps/canyin/WEB-INF/classes/canyin/connXmlBean.class
代码:
packagecanyin;
importjavax.xml.parsers.*;
importjavax.xml.transform.*;
importjavax.xml.transform.dom.DOMSource;
importjavax.xml.transform.stream.StreamResult;
importorg.w3c.dom.*;
publicclassconnXmlBean{
privateDocumentBuilderFactoryfactory=null;
privateDocumentBuilderbuilder=null;
privateDocumentdoc=null;
publicconnXmlBean(){}
publicStringconnXml(StringxmlFileName){
StringstrExc="";
try{
factory=DocumentBuilderFactory.newInstance();
builder=factory.newDocumentBuilder();
doc=builder.parse(xmlFileName);
doc.normalize();
}catch(Exceptione){
strExc=e.toString();
}
return(strExc);
}
publicDocumentgetXmlDoc(){
return(doc);
}
}
申明:翻开一个指定xml文件
/tomcat/webapps/canyin/WEB-INF/classes/canyin/writeXmlBean.class
代码:
packagecanyin;
importjavax.xml.parsers.*;
importjavax.xml.transform.*;
importjavax.xml.transform.dom.DOMSource;
importjavax.xml.transform.stream.StreamResult;
importjava.io.File;
importorg.w3c.dom.*;
publicclasswriteXmlBean{
publicwriteXmlBean(){}
publicStringwriteXml(Documentdoc,StringxmlFileName){
StringstrExc="";
try{
TransformerFactorytfactory=TransformerFactory.newInstance();
Transformertransformer=tfactory.newTransformer();
DOMSourcesource=newDOMSource(doc);
StreamResultresult=newStreamResult(newFile(xmlFileName));
transformer.transform(source,result);
}catch(Exceptione){
strExc=e.toString();
}
return(strExc);
}
}
申明:写进dom的内容到一个指定的xml文件。
/tomcat/webapps/canyin/jsp/loginjudge.jsp
代码:
<%--oddWorld餐饮办理体系(简体中文版)2002年12月1日
copyrightbyjoardast
loginjudge.jsp功效:用户身份校验,依据/data/user.xml文件内标示的用户分歧的身份
决意转进背景办理页面,仍是客户点菜页面。
--%>
<%@pagecontentType="text/html;charset=gb2312"%>
<%@pagelanguage="java"import="javax.xml.parsers.*"%>
<%@pageimport="org.w3c.dom.*"%>
<%@pageimport="canyin.*"%>
<jsp:useBeanid="xmlBean"class="canyin.connXmlBean"scope="page"/>
<%
session.setMaxInactiveInterval(1800);
Documentdoc;
NodeListusers;
StringstrExc="";
StringstrUsername,strPassword;
strUsername=(String)request.getParameter("username");
strPassword=(String)request.getParameter("userpass");
//校验数据是不是为空
if(strUsername==""||strPassword==""){
out.println("<scriptlanguage=javascript>");
out.println("alert(用户名或暗码有空值!);");
out.println("window.location.href=/index.html;");
out.println("</script>");
return;
}
xmlBean.connXml("webapps/canyin/data/users.xml");
doc=xmlBean.getXmlDoc();
try{
users=doc.getElementsByTagName("user");
for(inti=0;i<users.getLength();i++){
Elementuser=(Element)users.item(i);
StringstrAtrNameValue=user.getAttributeNode("name").getNodeValue();
StringstrAtrPassWordValue=user.getAttributeNode("password").getNodeValue();
StringstrAtrRoleValue=user.getAttributeNode("roles").getNodeValue();
if(strAtrNameValue.equals(strUsername)&&strAtrPassWordValue.equals(strPassword)){
if(strAtrRoleValue.equals("admin")){
out.println("<scriptlanguage=javascript>");
out.println("alert(接待办理员上岸体系!);");
out.println("</script>");
//设置标示用户身份的session(sesUserRole),办理员身份为admin
session.setAttribute("sesUserRole","admin");
//跳转到办理页面
response.sendRedirect("admin/admin_rest.jsp");
return;
}else{
//设置标示用户身份的session(sesUserRole),办理员身份为user
session.setAttribute("sesUserRole","user");
//跳转到一般用户页面
response.sendRedirect("index.jsp");
return;
}
}else{
out.println("<scriptlanguage=javascript>");
out.println("alert(用户名或暗码毛病!);");
out.println("history.go(-1);");
out.println("</script>");
return;
}
}
}catch(Exceptione){
strExc=e.toString();
}
%>
申明:.......
/tomcat/webapps/canyin/jsp/admin/admin_rest.jsp
代码:
<%--oddWorld餐饮办理体系(简体中文版)2002年12月1日
copyrightbyjoardast
admin_rest.jsp功效:背景办理页面,餐馆办理页面。
--%>
<%@pagecontentType="text/html;charset=gb2312"%>
<%@pagelanguage="java"import="javax.xml.parsers.*"%>
<%@pageimport="javax.xml.transform.*"%>
<%@pageimport="org.w3c.dom.*"%>
<%@pageimport="canyin.*"%>
<%@includefile="../../include/sys_dialog.jsp"%>
<jsp:useBeanid="checkSessionBean"class="canyin.checkSessionBean"scope="page"/>
<jsp:useBeanid="xmlBean"class="canyin.connXmlBean"scope="page"/>
<jsp:useBeanid="writeXmlBean"class="canyin.writeXmlBean"scope="page"/>
<%//校验可户身份,判别是否是办理员
if(!checkSessionBean.checkSessionBean(request,"sesUserRole","admin")){
out.print(showDialog("您没有办理的权限!","/index.html"));
return;
}
//从餐馆材料文件rest.xml中失掉相干数据
Documentdoc;
NodeListrestaurants;
StringstrAct;
intintId=0;
StringstrOperation="show";
//承受内部传进的参数
strAct=(String)request.getParameter("act");
xmlBean.connXml("webapps/canyin/data/restaurants.xml");
doc=xmlBean.getXmlDoc();
restaurants=doc.getElementsByTagName("restaurant");
//依据内部传进的参数来决意对restaurant.xml文件的操纵
if(strAct!=null){
if(strAct.equals("addnewDo")){
StringstrName;
StringstrPhone;
StringstrAddress;
Texttextseg;
strName=(String)request.getParameter("name").trim();
strPhone=(String)request.getParameter("phone").trim();
strAddress=(String)request.getParameter("address").trim();
//数据校验
if(strName==null){
out.print(showDialog("餐馆称号不克不及为空!"));
return;
}
if(strPhone==null){
out.print(showDialog("餐馆德律风不克不及为空!"));
return;
}
/*if(strAddress==null){
out.print(showDialog("餐馆地点不克不及为空!"));
return;
}*/
//校验数据的独一性
for(inti=0;i<restaurants.getLength();i++){
Elementrestaurant=(Element)restaurants.item(i);
if(((String)restaurant.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()).equals(strName)){
out.print(showDialog("餐馆称号反复!"));
return;
}else{
if(((String)restaurant.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()).equals(strPhone)){
out.print(showDialog("餐馆德律风反复!"));
return;
}
}
}
//失掉已有的纪录数,给新增的餐馆纪录设定独一的递增的id属性
intintNum=0;
ElementrestNum=(Element)doc.getElementsByTagName("restaurants").item(0);
intNum=Integer.parseInt(restNum.getAttributeNode("num").getNodeValue());
intNum+=1;
//为restaurants的属性num的数值加1
restNum.getAttributeNode("num").setNodeValue(String.valueOf(intNum));
//新增节点
ElementnewRestaurant=doc.createElement("restaurant");
AttrnewArrId=doc.createAttribute("id");
//AttributenewArrId=newAttribute("id",String.valueOf(intNum));
textseg=doc.createTextNode(String.valueOf(intNum));
newArrId.setValue(String.valueOf(intNum));
newRestaurant.setAttributeNode(newArrId);
ElementnewName=doc.createElement("name");
textseg=doc.createTextNode(strName);
newName.appendChild(textseg);
newRestaurant.appendChild(newName);
ElementnewPhone=doc.createElement("phone");
textseg=doc.createTextNode(strPhone);
newPhone.appendChild(textseg);
newRestaurant.appendChild(newPhone);
ElementnewAddress=doc.createElement("address");
textseg=doc.createTextNode(strAddress);
newAddress.appendChild(textseg);
newRestaurant.appendChild(newAddress);
doc.getDocumentElement().appendChild(newRestaurant);
//挪用bean写进响应的xml文件
writeXmlBean.writeXml(doc,"webapps/canyin/data/restaurants.xml");
response.sendRedirect(request.getRequestURI());
return;
}
if(strAct.equals("modiDo")){
StringstrName;
StringstrPhone;
StringstrAddress;
Texttextseg;
intmodiId;
//纪录要修正的纪录是item(i)的哪一项
intintI=0;
strName=(String)request.getParameter("name").trim();
strPhone=(String)request.getParameter("phone").trim();
strAddress=(String)request.getParameter("address").trim();
modiId=Integer.parseInt(request.getParameter("recordId").trim());
//数据校验
if(strName==null){
out.print(showDialog("餐馆称号不克不及为空!"));
return;
}
if(strPhone==null){
out.print(showDialog("餐馆德律风不克不及为空!"));
return;
}
if(modiId==0){
out.print(showDialog("你要修正餐馆的纪录不存在!"));
return;
}
/*if(strAddress==null){
out.print(showDialog("餐馆地点不克不及为空!"));
return;
}*/
//标记显现纪录存在
booleanrecordExist=false;
//校验数据的独一性
for(inti=0;i<restaurants.getLength();i++){
Elementrestaurant=(Element)restaurants.item(i);
if(Integer.parseInt(restaurant.getAttributeNode("id").getNodeValue())==modiId){
recordExist=true;
intI=i;
}
if(((String)restaurant.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()).equals(strName)&&Integer.parseInt(restaurant.getAttributeNode("id").getNodeValue())!=modiId){
out.print(showDialog("餐馆称号反复!"));
return;
}else{
if(((String)restaurant.getElementsByTagName("name").item(0).getFirstChild().getNodeValue()).equals(strPhone)&&Integer.parseInt(restaurant.getAttributeNode("id").getNodeValue())!=modiId){
out.print(showDialog("餐馆德律风反复!"));
return;
}
}
}
if(!recordExist){
out.print(showDialog("你要修正餐馆的纪录不存在!"));
return;
}else{
//举行纪录变动的操纵
try{
ElementmodiRestaurant=(Element)restaurants.item(intI);
modiRestaurant.getElementsByTagName("name").item(0).getFirstChild().setNodeValue(strName);
modiRestaurant.getElementsByTagName("phone").item(0).getFirstChild().setNodeValue(strPhone);
modiRestaurant.getElementsByTagName("address").item(0).getFirstChild().setNodeValue(strAddress);
//挪用bean写进响应的xml文件
writeXmlBean.writeXml(doc,"webapps/canyin/data/restaurants.xml");
response.sendRedirect(request.getRequestURI());
return;
}catch(Exceptione){}
}
}
//举行删除操纵
if(strAct.equals("del")){
intdelId;
//纪录要修正的纪录是item(i)的哪一项
intintI=0;
delId=Integer.parseInt(request.getParameter("recordId").trim());
if(delId==0){
out.print(showDialog("你要修正餐馆的纪录不存在!"));
return;
}
file://标记显现纪录存在
booleanrecordExist=false;
//校验数据的独一性
for(inti=0;i<restaurants.getLength();i++){
Elementrestaurant=(Element)restaurants.item(i);
if(Integer.parseInt(restaurant.getAttributeNode("id").getNodeValue())==delId){
recordExist=true;
intI=i;
}
}
if(!recordExist){
out.print(showDialog("你要删除餐馆的纪录不存在!"));
return;
}else{
//举行纪录删除的操纵
try{
NodedelNode=(Node)restaurants.item(intI);
doc.getElementsByTagName("restaurants").item(0).removeChild(delNode);
//挪用bean写进响应的xml文件
writeXmlBean.writeXml(doc,"webapps/canyin/data/restaurants.xml");
response.sendRedirect(request.getRequestURI());
return;
}catch(Exceptione){}
}
}
}
//由内部传进参数决意页面响应的处置形态
if(strAct==null){
strOperation="show";
}else{
if(strAct.equals("modi")){
strOperation="modi";
intId=Integer.parseInt(request.getParameter("recordId"));
}else{
if(strAct.equals("addnew")){
strOperation="addnew";
}else{
strOperation="show";
}
}
}
//假如为空纪录,则变动页面形态为“新增”
if(restaurants.getLength()==0){
strOperation="addnew";
}
%>
<html>
<head>
<title>oddWorld餐饮体系</title>
<metahttp-equiv="Content-Type"content="text/html;charset=gb2312">
<metahttp-equiv="expires"content="0">
<linkrel="stylesheet"href="../../include/itsp.css"type="text/css">
</head>
<body>
<divalign="center">
<tablewidth="100%"border="0"cellspacing="0"cellpadding="0"height="22">
<tr>
<tdwidth="1"></td>
<tdwidth=100align="center"><ahref="/index.html">[加入体系]</a></td>
</tr>
</table>
<br>
<br>
<tablebgcolor="#999999"align=centerborder=0cellpadding=1cellspacing=1
width="90%">
<tbody>
<trbgcolor="#efefef"align="center"valign="middle">
<tdclass=ttTableheight=30width="20"></td>
<tdclass=ttTableheight=30width="0">餐馆称号</td>
<tdclass=ttTableheight=30width="0">餐馆德律风</td>
<tdclass=ttTableheight=30width="0">
<divalign="center">餐馆地点</div>
</td>
<tdclass=ttTableheight=30width="30">
<divalign="center">修正</div>
</td>
<tdclass=ttTableheight=30width="30">
<divalign="center">删除</div>
</td>
</tr>
<%
for(inti=0;i<restaurants.getLength();i++)
{
Elementrestaurant=(Element)restaurants.item(i);
if(strOperation=="modi"&&Integer.parseInt(restaurant.getAttributeNode("id").getNodeValue())==intId){
%>
<%//显现修正的格局%>
<tralign="center"bgcolor="#ffffff"valign="middle">
<formname=dataformaction="<%=request.getRequestURI()%>?act=modiDo"method="post";">
</td>
</tr>
</table>
</td>
</tr>
</table>
<p></p>
</div>
</body>
</html>
<SCRIPTLANGUAGE=javascript>
<!--
functioncheckform2()
{
varCheckblank=/^(s*|( )|(.))*$/;
if(Checkblank.test(dataform2.name.value))
{
alert("餐馆称号不克不及为空!");
dataform2.name.focus();
returnfalse;
}
if(Checkblank.test(dataform2.phone.value))
{
alert("餐馆德律风不克不及为空!");
dataform2.phone.focus();
returnfalse;
}
window.dataform2.submit();
}
functioncheckform()
{
varCheckblank=/^(s*|( )|(.))*$/;
if(Checkblank.test(dataform.name.value))
{
alert("餐馆称号不克不及为空!");
dataform.name.focus();
returnfalse;
}
if(Checkblank.test(dataform.phone.value))
{
alert("餐馆德律风不克不及为空!");
dataform.phone.focus();
returnfalse;
}
window.dataform.submit();
}
-->
</SCRIPT>
申明:本文件的誊写有良多中央其实不简洁,由于在程式的开辟过程当中,太过简洁的程序常常会带来前期保护的坚苦。
开辟心得:
doc.getElementsByTagName("restaurants").item(inti)的前往值是node型,假如不是要挪用它的属性值,没有需要强迫转型为Element型。能够间接操纵。本体系由于开辟的参考材料的毛病,以是全都接纳了强迫转型。能够在今后的开辟中思索利用node间接举行操纵。
trim()和Interger.parseInt()函数都不成以承受null型的数值
在tomcat下摆布的文件都是目次从TOMCAT算起,详细情形请拜见webappscanyinjspuserjudge.jsp里关于xml路径的写法。
对原代码感乐趣的伴侣请经由过程以下信箱和我接洽,joard@163.com
唉!都是钱闹的1.Swing和.net开发比较------从市场份额看.net开发主要占据大部分的中小型和中型的的桌面开发,原因是它封装了很多工具 Java 编程语言的风格十分接近C、C++语言。 J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。 有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想) 让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧 Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 http://www.jdon.com/去下载,或到同济技术论坛的服务器ftp://nro.shtdu.edu.cn去下,安装上有什么问题,可以到论坛上去提问。 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 关于设计模式的资料,还是向大家推荐banq的网站 http://www.jdon.com/,他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。 那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧! 是一种语言,用以产生「小应用程序(Applet(s)) 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。 是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能 接着就是EJB了,EJB就是Enterprise JavaBean, 看名字好象它是Javabean,可是它和Javabean还是有区别的。它是一个体系结构,你可以搭建更安全、更稳定的企业应用。它的大量代码已由中间件(也就是我们常听到的 Weblogic,Websphere这些J2EE服务器)完成了,所以我们要做的程序代码量很少,大部分工作都在设计和配置中间件上。 多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
页:
[1]