??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲午夜久久久久妓女影院 ,91亚洲国产成人久久精品网址,亚洲大码熟女在线观看http://www.tkk7.com/songfei/category/4996.htmlE序--人生--哲学___________________Ƣ迎艛_的加?/description>zh-cnFri, 29 Jun 2007 14:25:35 GMTFri, 29 Jun 2007 14:25:35 GMT60Java中的回调函数实例说明http://www.tkk7.com/songfei/articles/126093.html天外飞仙天外飞仙Mon, 25 Jun 2007 06:13:00 GMThttp://www.tkk7.com/songfei/articles/126093.htmlhttp://www.tkk7.com/songfei/comments/126093.htmlhttp://www.tkk7.com/songfei/articles/126093.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/126093.htmlhttp://www.tkk7.com/songfei/services/trackbacks/126093.html使用接口  
   
  也就是用多态来实现回调函数  
   
public interface ICallback {
  public void   func();
}
   
public class ClassWithCallbackFunction implements ICallback{
  public ClassWithCallbackFunction() {
  }
  public void func(){
    System.out.println("cccccccccccccccccc");
  }
}
   
public class Caller {
  ICallback callback;
  public void doCallback() {
    callback.func();
  }

  public void setCallback(ICallback callback) {
    this.callback = callback;
  }

}
    
public class MainClass {
  public MainClass() {
  }

  public static void main(String[] args) {
    Caller caller = new Caller();
    caller.setCallback(new ClassWithCallbackFunction() {
      public void func() {
        System.out.println("aaaaaaaaaa");
      }
    });
    caller.doCallback();
  }

现实中是把doCallback()Ҏ攑֜setCallback里调?以上是ؓ了说明回调原?br>public class Caller {
  ICallback callback;
  public void doCallback() {
    callback.func();
  }

  public void setCallback(ICallback callback) {
    this.callback = callback;
    doCallback();
  }

}



天外飞仙 2007-06-25 14:13 发表评论
]]>
关于weblogic下静态页面下载文Ӟ配置mimecdQ的疑问Q!Q?/title><link>http://www.tkk7.com/songfei/articles/122120.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Tue, 05 Jun 2007 05:15:00 GMT</pubDate><guid>http://www.tkk7.com/songfei/articles/122120.html</guid><wfw:comment>http://www.tkk7.com/songfei/comments/122120.html</wfw:comment><comments>http://www.tkk7.com/songfei/articles/122120.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/songfei/comments/commentRss/122120.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/songfei/services/trackbacks/122120.html</trackback:ping><description><![CDATA[<table cellSpacing=0 cellPadding=0 width="100%" border=0> <tbody> <tr vAlign=top> <td width="99%"><br>提交旉: May 17, 2007 4:06:14 PM </td> <td width="1%"></td> </tr> <tr> <td class=message_content style="BORDER-TOP: #ccc 1px solid" colSpan=2><br> <table style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all; WORD-WRAP: break-word" width="100%"> <tbody> <tr> <td>试q程中的体会Q?br><br>W一、修Ҏ件类型处理只需修改站点下,也就是WEB_INF下的web.xml文g卛_<br><br>QaQ、下?br><br>    <mime-mapping><br>        <extension>zip</extension><br>        <mime-type>application/zip</mime-type><br>    </mime-mapping><br>    <mime-mapping><br>        <extension>rar</extension><br>        <mime-type>application/rar</mime-type><br>    </mime-mapping><br>    <mime-mapping><br>        <extension>exe</extension><br>        <mime-type>application/octet-stream</mime-type><br>    </mime-mapping><br>    <mime-mapping><br>        <extension>iso</extension><br>        <mime-type>application/octet-stream</mime-type><br>    </mime-mapping><br><br>    <mime-mapping><br>        <extension>doc</extension><br>        <mime-type>application/doc</mime-type><br>    </mime-mapping><br><br>QbQ、打开<br><br>如果惌在IE中自动打开DOCQXLSQPDF文g的配|如? <br><mime-mapping> <br><extension>doc</extension> <br><mime-type>application/msword</mime-type> <br></mime-mapping> <br><br><mime-mapping> <br><extension>xls</extension> <br><mime-type>application/msexcel</mime-type> <br></mime-mapping> <br><br><mime-mapping> <br><extension>pdf</extension> <br><mime-type>application/pdf</mime-type> <br></mime-mapping><br><br><br>W二、测试的时候一定记得清除一下你览器的~存(否则你会晕掉?Q也是打开IE“工具”-->“Internet选项”-->“常规”-->“删除文g”-->“清除历史”-->“定”</td> </tr> </tbody> </table> </td> </tr> </tbody> </table> <img src ="http://www.tkk7.com/songfei/aggbug/122120.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/songfei/" target="_blank">天外飞仙</a> 2007-06-05 13:15 <a href="http://www.tkk7.com/songfei/articles/122120.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java1.5泛型指南中文?Java1.5 Generic Tutorial)http://www.tkk7.com/songfei/articles/117542.html天外飞仙天外飞仙Tue, 15 May 2007 03:10:00 GMThttp://www.tkk7.com/songfei/articles/117542.htmlhttp://www.tkk7.com/songfei/comments/117542.htmlhttp://www.tkk7.com/songfei/articles/117542.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/117542.htmlhttp://www.tkk7.com/songfei/services/trackbacks/117542.html阅读全文

天外飞仙 2007-05-15 11:10 发表评论
]]>
日期操作java转蝲http://www.tkk7.com/songfei/articles/109696.html天外飞仙天外飞仙Tue, 10 Apr 2007 09:54:00 GMThttp://www.tkk7.com/songfei/articles/109696.htmlhttp://www.tkk7.com/songfei/comments/109696.htmlhttp://www.tkk7.com/songfei/articles/109696.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/109696.htmlhttp://www.tkk7.com/songfei/services/trackbacks/109696.html阅读全文

天外飞仙 2007-04-10 17:54 发表评论
]]>
AJAX实践DWR?/title><link>http://www.tkk7.com/songfei/articles/105567.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Thu, 22 Mar 2007 07:30:00 GMT</pubDate><guid>http://www.tkk7.com/songfei/articles/105567.html</guid><wfw:comment>http://www.tkk7.com/songfei/comments/105567.html</wfw:comment><comments>http://www.tkk7.com/songfei/articles/105567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/songfei/comments/commentRss/105567.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/songfei/services/trackbacks/105567.html</trackback:ping><description><![CDATA[ <div id="8wcioym" class="textbox-title"> <h4>AJAX实践<a name="baidusnap0" _base_></a><b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>?/h4> <div id="smqycuy" class="textbox-label">[ 2006-6-13 8:51:00 | By: mengyang ]</div> </div> <div id="waugyem" class="textbox-content"> <table style="TABLE-LAYOUT: fixed" cellspacing="0" cellpadding="0" width="100%" border="0" _base_> <tbody _base_> <tr _base_> <td valign="top" _base_> <b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>(Direct Web Remoting)是一个WEBq程调用框架.利用q个框架可以让AJAX开发变得很?利用<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>可以在客L利用JavaScript直接调用服务端的JavaҎq返回值给JavaScript好像直接本地客L调用一?<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>ҎJavacL动态生成JavaScrip代码).它的最新版?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>0.6d许多Ҏ如:支持Dom Trees的自动配|?支持Spring(JavaScriptq程调用spring bean),更好览器支?q支持一个可选的commons-logging日记操作.<br /><br />以上摘自open-openQ看了几天,实是一个非怼U的项目,它通过反射Q将java译成javascriptQ然后利用回调机ӞL实现了javascript调用Java代码?br /><br />其大概开发过E如下:<br />1.~写业务代码Q该代码是和<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>无关的?br />2.认业务代码中哪些类、哪些方法是要由javascript直接讉K的?br />3.~写<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>lgQ对步骤2的方法进行封装?br />4.配置<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>lg?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.xml文g中,如果有必要,配置convertQ进行java和javascriptcd互{?br />5.通过反射机制Q?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>步?的类转换成javascript代码Q提供给前台面调用?br />5.~写|页Q调用步?的javascript中的相关ҎQ间接调用服务器端的相关cȝҎQ,执行业务逻辑Q将执行l果利用回调函数q回?br />6.在回调函CQ得到执行结果后Q可以l编写业务逻辑的相关javascript代码?br /><br />下面以用h册的例子Q来说明其用。(注意Q本ơ例子只是用于演C,说明<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>的用,c设计ƈ不是最优的Q?br /><br />1.先介l下相关的Javac?br /><br />  User: 用户c,<br />  public class User {<br />//登陆IDQ主键唯一<br />private String id;<br />//姓名<br />private String name;<br />//口o<br />private String password;<br />//电子邮g<br />private String email;<br />        <br />//以下包含getXXX和setXXXҎ<br />.......<br />  }<br /><br />  UserDAOQ实现User的数据库讉KQ这里作Z个演C,~写试代码<br />  public class UserDAO { <br />    //存放保存的数?br />    private static Map dataMap = new HashMap();<br /><br />    //持久用户<br />    public boolean save(User user) {<br />      if (dataMap.containsKey(user.getId()))<br />        return false;<br />      System.out.println("下面开始保存用?);<br />      System.out.println("idQ?+user.getId());<br />      System.out.println("passwordQ?+user.getPassword());<br />      System.out.println("nameQ?+user.getName());<br />      System.out.println("emailQ?+user.getEmail());<br />      dataMap.put(user.getId(), user);<br />      System.out.println("用户保存l束");<br />      return true;<br />    }<br /><br />    //查找用户<br />    public User find(String id) {<br />      return (User)dataMap.get(id);<br />    }<br />}<br /><br />  DWRUserAccessQ?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>lgQ提供给javascript讉K的?br /><br />  public class DWRUserAccess {<br /><br />      UserDAO userDAO = new UserDAO();<br /><br />      public boolean save(User user) {<br />        return userDAO.save(user);<br />      }<br /><br />      public User find(String id) {<br />        return userDAO.find(id);<br />      }<br />  }<br />  <br /><br />  下面说明下程序执行的程<br /><br />  1.用户在页面上输入相关注册信息Qid、name、password、emailQ点几Z提交”按?br />  2.javascript代码开始执行,Ҏ用户填写相关信息Q通过<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>提供的DWRUserAccess.js里save的方法,调用服务器端的DWRUserAccesscsaveҎQ将注册信息保存?br />  3.通过DWRUserAccess.jsp里的findҎQ调用服务器端DWRUserAccessc里的findҎQ执行用户信息查找?br /><br />  注意Q在以上的执行过E中QDWRUserAccess是供<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>调用的,?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>lgQ因此需要将DWRUserAccessc配|到<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>中?br /><br />  接下来讲解本?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>试环境的配|?br /><br />  1.新徏一个webappQ命名ؓtestApp<br />  2.?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.jar拯到testApp的WEB-INF的lib目录?br />  3.~译上面的UserQUserDAOQDWRUserAccessc,攑ֈclasses目录?br />  4.在web.xml中配|servlet,适配路径?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>目录?如下所C?br />    <servlet><br />    <servlet-name><b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>-invoker</servlet-name><br />    <display-name><b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b> Servlet</display-name><br />    <description>Direct Web Remoter Servlet</description><br />    <servlet-class>uk.ltd.getahead.<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.DWRServlet</servlet-class><br />    <init-param><br />      <param-name>debug</param-name><br />      <param-value>true</param-value><br />    </init-param><br />    <init-param><br />      <param-name>scriptCompressed</param-name><br />      <param-value>false</param-value><br />    </init-param><br />    <load-on-startup>1</load-on-startup><br />  </servlet><br /><br />  <servlet-mapping><br />    <servlet-name><b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>-invoker</servlet-name><br />    <url-pattern>/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/*</url-pattern><br />  </servlet-mapping><br /><br />  以上的配|可以拦截testApp下所有指?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>的请求,关于q个拦截器,我们会在后面介绍?br /><br />  5.WEB-INF下新Z?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.xml文gQ内容如下:<br />  <?xml version="1.0" encoding="UTF-8"?><br /><!DOCTYPE <b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b> PUBLIC "-//GetAhead Limited//DTD Direct Web Remoting 1.0//EN" "http://www.getahead.ltd.uk/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>10.dtd"><br /><br /><<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>><br />  <allow><br /><create creator="new" javascript="DWRUserAccess"><br />      <param name="class" value="test.DWRUserAccess"/><br />    </create><br /><convert converter="bean" match="test.User"/><br />  </allow><br /></<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>><br /><br />  q里我们把DWRUserAccess配置C<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>中,create元素中,creater="new"表示每调用一ơDWRUserAccessӞ需要new一个这Lc;javascript="DWRUserAccess"Q表C提供给前台面调用的javascirpt文g是DWRUserAccess.js?br /><br />  convert元素用于数据cd转换Q即javacdjavascript之间怺转换Q因为和前台交换的是User对象Q因此需要对此用bean转换Q我们将在后面介l这个类?br /><br />  4.~写试的HTML面 test.html<br />   <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><br /><HTML><br /><HEAD><br /><TITLE><b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>试</TITLE><br /><meta http-equiv=Content-Type content="text/html; charset=gb2312"><br /><script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/engine.js"></script><br /><script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/util.js"></script><br /><script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/interface/DWRUserAccess.js"></script><br /></HEAD><br /><BODY><br /><B>用户注册</B><br><br />------------------------------------------------<br /><Br><br /><form name="regForm"><br />登陆IDQ?lt;input type="text" name="id"><br><br />口  oQ?lt;input type="password" name="password"><br><br />姓  名Q?lt;input type="text" name="name"><br><br />电子邮gQ?lt;input type="text" name="email"><br><br /><input type="button" name="submitBtn" value="提交" onclick="OnSave()"><br><br />    </form><br /><br /><br><br /><br><B>用户查询</B><br><br />------------------------------------------------<br /><Br><br /><form name="queryForm"><br />登陆IDQ?lt;input type="text" name="id"><br><br /><input type="button" name="submitBtn" value="提交" onclick="OnFind()"><br><br /></form><br /><br><br /></BODY><br /></HTML><br /><SCRIPT LANGUAGE="JavaScript"><br /><!--<br />function saveFun(data) {<br />if (data) {<br />  alert("注册成功Q?);<br />} else {<br />  alert("登陆ID已经存在Q?);<br />}<br />}<br /><br />function OnSave() {<br />var userMap = {};<br />userMap.id = regForm.id.value;<br />userMap.password = regForm.password.value;<br />userMap.name = regForm.name.value;<br />userMap.email = regForm.email.value;<br />DWRUserAccess.save(userMap, saveFun); <br />}<br /><br />function findFun(data) {<br />if (data == null) {<br />  alert("无法扑ֈ用户Q?+queryForm.id.value);<br />  return;<br />}<br /><br />alert("扑ֈ用户Q\nidQ?+data.id+"Q\npasswordQ?+data.password+"Q\nnameQ?+data.name+"Q\nemailQ?+data.email);<br /><br />}<br /><br />function OnFind() {<br />DWRUserAccess.find(queryForm.id.value, findFun); <br />}<br />//--><br /></SCRIPT><br /><br /><br />以下寚w面的javascriptq行解释<br /><br /><script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/engine.js"></script><br /><script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/util.js"></script><br />q两个是<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>提供的,用户可以不必兛_Q只需要导入即?br /><br /><script src="/oblog312/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/interface/DWRUserAccess.js"></script><br />是我们编写的DWRUserAccessc,l?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>反射后,生成的javascript代码Q它和DWRUserAccess.java是对应的Q供用户调用Q实际上我们是通过q个js文g去调用服务器端的DWRUserAccesscȝ?br /><br /><SCRIPT LANGUAGE="JavaScript"><br /><!--<br />function saveFun(data) {<br />if (data) {<br />  alert("注册成功Q?);<br />} else {<br />  alert("用户名已l存在!");<br />}<br />}<br /><br />function OnSave() {<br />var userMap = {};<br />userMap.id = regForm.id.value;<br />userMap.password = regForm.password.value;<br />userMap.name = regForm.name.value;<br />userMap.email = regForm.email.value;<br />DWRUserAccess.save(userMap, saveFun); <br />}<br /><br />function findFun(data) {<br />if (data == null) {<br />  alert("无法扑ֈ用户Q?+queryForm.id.value);<br />  return;<br />}<br /><br />alert("扑ֈ用户Q\nidQ?+data.id+"Q\npasswordQ?+data.password+"Q\nnameQ?+data.name+"Q\nemailQ?+data.email);<br /><br />}<br /><br />function OnFind() {<br />DWRUserAccess.find(queryForm.id.value, findFun); <br />}<br />//--><br /></SCRIPT><br /><br />q段javascirpt代码Q我们来看下OnSave函数Q首先它构造一个mapQ将表单数据都设|到map中,然后调用 DWRUserAccess.save(userMap, saveFun)Q执行save操作。大家可以注意到Q服务器端的DWRUserAccess中的saveҎ是这LQboolean save(User user)Q其参数是一个User对象Q返回一个boolean|而客L的方法是q样的:save(userMap,saveFun)Q第一个参?userMap是javascirpt中的map对象Q在q里相当于服务器端的User对象Q在服务器端执行Ӟ会通过convert转换成User对象Q,前面我们提到<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>是利用回调函数来q回执行l果的,W二个参数saveFunx一个回调函数。在函数function saveFun(data)中,data是执行结果,q里是一个bool|非常单的Q我们通过判断data是否为真Q可以知道用户名是否重复Q用h否注册成功?br /><br />看一下OnFind查找函数Q执行结果在回调函数findFun(data)中,因ؓ服务器端q回的是一个User对象Q通过convertQ将会{换成javascript的一个map对象Q?br />于是在findFun中,通过data.id、data.name、data.password、data.email我们可以L的访问到q个User对象?br /><br /><br />好了配置完毕Q启动服务器Q在目录中打入localhost/testApp/test.html?br /><br />1.在“用h册”表单中Qid框中输入adminQpassword中输?23456Qname中输入chenbugQemail中输入chenbug@zj.comQ点L交按钮,弹出对话框:“注册成功”,在服务器后台可以看到信息如下Q?br /><br />下面开始保存用?br />idQadmin<br />passwordQ?23456<br />nameQchenbug<br />emailQchenbug@zj.com<br />用户保存l束<br /><br />再次点击提交按钮Q弹出对话框“登陆ID已经存在”?br /><br />2.在“用h询”对话框中,输入登陆ID为adminQ点L交按钮,提示扑ֈ用户Qƈ昄相关信息Q输入admin123Q点L交按钮,提示无法扑ֈ用户?br /><br />xQ测试结束?br /><br /><br />后箋Q?br />1。拦截器 uk.ltd.getahead.<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.DWRServlet<br />该类拦截所有指?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>目录下的hQƈ调用Processor的handlerҎq行处理Q在uk.ltd.getahead.<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.impl.DefaultProcessor下,我们可以看到详细的处理过E?br />if (pathInfo.length() == 0 ||<br />            pathInfo.equals(HtmlConstants.PATH_ROOT) ||<br />            pathInfo.equals(req.getContextPath()))<br />        {<br />            resp.sendRedirect(req.getContextPath() + servletPath + HtmlConstants.FILE_INDEX);<br />        }<br />        else if (pathInfo.startsWith(HtmlConstants.FILE_INDEX))<br />        {<br />            index.handle(req, resp);<br />        }<br />        else if (pathInfo.startsWith(HtmlConstants.PATH_TEST))<br />        {<br />            test.handle(req, resp);<br />        }<br />        else if (pathInfo.startsWith(HtmlConstants.PATH_INTERFACE))<br />        {<br />            iface.handle(req, resp);<br />        }<br />        else if (pathInfo.startsWith(HtmlConstants.PATH_EXEC))<br />        {<br />            exec.handle(req, resp);<br />        }<br />        else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_ENGINE))<br />        {<br />            file.doFile(req, resp, HtmlConstants.FILE_ENGINE, HtmlConstants.MIME_JS);<br />        }<br />        else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_UTIL))<br />        {<br />            file.doFile(req, resp, HtmlConstants.FILE_UTIL, HtmlConstants.MIME_JS);<br />        }<br />        else if (pathInfo.equalsIgnoreCase(HtmlConstants.FILE_DEPRECATED))<br />        {<br />            file.doFile(req, resp, HtmlConstants.FILE_DEPRECATED, HtmlConstants.MIME_JS);<br />        }<br />        else<br />        {<br />            log.warn("Page not found (" + pathInfo + "). In debug/test mode try viewing /[WEB-APP]/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/"); //$NON-NLS-1$ //$NON-NLS-2$<br />            resp.sendError(HttpServletResponse.SC_NOT_FOUND);<br />        }<br /><br />通过判断requesth的servlet路径Q进行处理,大家可以自己d看,q里不详l讨论?br /><br /><br />2.bean转换器,<convert converter="bean" match="test.User"/><br />?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.jar解压~,在\径uk\ltd\getahead\<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>下可以看?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.xmlQ这里配|了pȝ默认的一些{换器Q?br /><converter id="bean" class="uk.ltd.getahead.<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>.convert.BeanConverter"/>x刚才用到Usercȝ转换器,q入代码我们来看看它是如何在javascript和java间进行{换的?br /><br />打开BeanConverter代码Q定位到函数<br /><br />public Object convertInbound(Class paramType, InboundVariable iv, InboundContext inctx) throws ConversionException<br /><br />xjavascript对象转换成java对象的,其中<br />paramType即ClasscdQ在上面的例子中是test.UserQ?br />InboundVariable ivQ是传入的|通过iv.getValue可以得到传入的javascriptg<br />InboundContext inctxQ是入口参数上下文,用于保存转换的后java对象?br /><br />因ؓ前台传入的是一个javascript的mapcdQ而map肯定是以{开始和以}l束的,于是在这个函C开始进行了判断<br />if (!value.startsWith(ConversionConstants.INBOUND_MAP_START))<br />        {<br />            throw new IllegalArgumentException(Messages.getString("BeanConverter.MissingOpener", ConversionConstants.INBOUND_MAP_START)); //$NON-NLS-1$<br />        }<br /><br />        if (!value.endsWith(ConversionConstants.INBOUND_MAP_END))<br />        {<br />            throw new IllegalArgumentException(Messages.getString("BeanConverter.MissingCloser", ConversionConstants.INBOUND_MAP_START)); //$NON-NLS-1$<br />        }<br /><br />javascript中,map里各个项是用逗号q接的,如var userMap = {id:'admin',password:'123456',name:'chenbug',email:'chenbug@zj.com'};而每个项的键值对是用冒号q接的,<br />在convertInbound函数的接下来的处理中Q即是通过分析map字串Q通过paramType构造java实例Q即Userc)Q然后通过反射Q将q些键值对讄到java实例中,q返回?br />q样完成了javascript到java的{换?br /><br /><br />另一个函?br />public String convertOutbound(Object data, String varname, OutboundContext outctx) throws ConversionException<br /><br />xjava对象转换为javascript对象Q其实是声明和赋D句)?br />Object data Q是待{换的java对象<br />String varnameQ是javascript中的该对象的变量?br />OutboundContext outctxQ传出参C下文Q用于保存{换后的javascript?br /><br />StringBuffer buffer = new StringBuffer();<br />        buffer.append("var "); //$NON-NLS-1$<br />        buffer.append(varname);<br />        buffer.append("={};"); //$NON-NLS-1$<br />q里声明了mapcd的变量?br /><br />即下来来的代码即是通过反射q行变量赋|如下<br />  buffer.append(varname);<br />                    buffer.append('.');<br />                    buffer.append(name);<br />                    buffer.append('=');<br />                    buffer.append(nested.getAssignCode());<br />                    buffer.append(';');<br />大家可以自己d看更多的代码?br /><br />3.<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>本n提供了一个测试环境,大家在配|完后,可以在IE中输入地址http://localhost/testApp/<b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">dwr</b>/index.htmlQ看到配|的?b style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">DWR</b>lgQƈq行相关试?br /><br />testApp下蝲地址 http://waplife.cn/testApp.rar</td> </tr> </tbody> </table> </div> <img src ="http://www.tkk7.com/songfei/aggbug/105567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/songfei/" target="_blank">天外飞仙</a> 2007-03-22 15:30 <a href="http://www.tkk7.com/songfei/articles/105567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSP标签库参考文?/title><link>http://www.tkk7.com/songfei/articles/103548.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Tue, 13 Mar 2007 07:44:00 GMT</pubDate><guid>http://www.tkk7.com/songfei/articles/103548.html</guid><wfw:comment>http://www.tkk7.com/songfei/comments/103548.html</wfw:comment><comments>http://www.tkk7.com/songfei/articles/103548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/songfei/comments/commentRss/103548.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/songfei/services/trackbacks/103548.html</trackback:ping><description><![CDATA[ <div id="y4ys8ec" class="tit">一可以做为参考手册的JSP标签库文?/div> <div id="mgkiqoe" class="date">2007-03-03 14:05</div> <table style="TABLE-LAYOUT: fixed"> <tbody> <tr> <td> <div id="eqiiqa6" class="cnt"> <p>标准的JSP 标记可以调用JavaBeanslg或者执行客LhQ这大大降低了JSP开发的复杂度和l护量。JSP技术也允许你自定义taglibQ其实换句话_taglib可以看成是对JSP标记的一U扩展,正如xml是对html的一U扩展一栗taglib通常定义在tag标签库中Q这U标{ֺ存放着你自己定义的tag标签。简而言之,如果使用taglibQ那么你可以设计自己的JSP标记Q?/p> <p>一般来_自定义tag标签主要用于操作隐藏对象、处理html提交表单、访问数据库或其它企业的服务,诸如邮g和目录操作等{。自定义tag标签的用者一般都是那些对java~程语言非常_N,而且Ҏ据访问和企业U服务访问都非常熟悉的程序员Q对于HTML设计者来_使得他可以不d注那些较复杂的商业逻辑Q而将_֊攑֜|页设计上。同Ӟ它也库开发者和库用者进行合理分工,自定义tag标签那些重复工作进行封装,从而大大提高了生力,而且可以使得tag库可用于不同的项目中Q完地体现了Y件复用的思想?/p> <p>在这文章中Q我们主要讨论:</p> <p>· 什么是自定义tag标签Q?/p> <p>· 怎么使用tag标签Q?/p> <p>o 声明要用的tag?/p> <p>o 扑ֈ与之对应的tag处理c?/p> <p>o tag标签的类?/p> <p>· 自定义tag标签</p> <p>o tag处理c?/p> <p>o tag库描q?/p> <p>o tag标签CZ</p> <p>o 带属性的tag</p> <p>o 带body的tag</p> <p>o 定义了脚本变量的tag</p> <p>o h协作关系的tag</p> <p>· 自定义tag标签</p> <p>o 一个P代tag的例?/p> <p>o 一个模板tag?/p> <p>o tag处理cd底是怎样被调用的Q?/p> <p> <br />什么是自定义的tag?</p> <p>一个自定义的tag标签是用户定义的一UJSP标记。当一个含有自定义的tag标签的JSP面被jsp引擎~译成servletӞtag标签被{化成了对一个称为tag处理cȝ对象q行的操作。于是当JSP面被jsp引擎转化为servlet后,实际上tag标签被{化成Z对tag处理cȝ操作?/p> <p>自定义tag标签有很多特Ԍ诸如Q?/p> <p>· 可以在JSP面中自定义tag标签的属?/p> <p>· 讉KJSP面中的所有对?/p> <p>· 可以动态地修改面输出</p> <p>· 彼此q间可以怺通信。你可以先创Z个JavaBeanslgQ然后在一个tag中调用此JavaBeanslgQ同时可以在另一个tag中调用它?/p> <p>· tag允许怺嵌套Q可以在一个JSP面中完成一些复杂的交互?/p> <p> <br />使用tag标签</p> <p> <br />本节主要描述怎样在JSP面中用tag标签Q以及tag标签的不同类型?/p> <p>要用tag标签QJSPE序员必d2件事Q?/p> <p>· 声明此tag标签的tag?/p> <p>· 实现此tag标签</p> <p>声明tag标签所在的tag?/p> <p>如果要用tag标签Q则应用JSP的taglib指示W来指定其tag库(注意Qtaglib要在在用此tag标签之前声明Q?/p> <p><%@ taglib uri=?WEB-INF/tutorial-template.tld?prefix=”tt?%></p> <p>uri属性定义了唯一的标{ֺ描述(以下UTLD)Q它可以是直接是tld文g名或一个独一无二的名字。prefix是用来区别其它TLD中和本TLD中有重名的tag的一U手Dc?/p> <p>TLD必须?tld作ؓ扩展名,q且存放在当前应用的WEB-INF目录或其子目录下。你可以通过它的文g名直接引用它Q也可以通过别的方式间接地引用它?/p> <p>以下taglib指示W直接引用一个TLDQ?/p> <p><%@ taglib uri=?WEB-INF/tutorial-template.tld?prefix=”tt?%></p> <p>以下的taglib指示W通过一个逻辑名称间接地引用一个TLDQ?/p> <p><%@ taglib uri=?tutorial-template?prefix=”tt?%></p> <p>如果是间接引用TLD的话Q那你必还要在web.xml中定义此逻辑名称与tld文g之间的映,具体做法是在web.xml中加入一个名为taglib的元素:</p> <p><taglib></p> <p><taglib-uri>/tutorial-template</taglib-uri></p> <p><taglib-location></p> <p>/WEB-INF/tutorial-template.tld</p> <p></taglib-location></p> <p></taglib></p> <p> <br />实现此tag标签</p> <p> <br />Z实现tag标签Q你?U方法来存放tag处理cR一、让tag处理cM.class的方式存放于当前应用的WEB-INF/class子目录下Q二、如果tag处理cL以JAR包的形式存在的话Q那可以攑֜当前应用的WEB-INF/lib目录下,如果tag处理c要在多个应用中׃nQ那么它应攑֜jsp服务器上的common/lib目录下,对于tomcat来说Q就是tomcat/common/lib目录下?/p> <p> <br />tag标签cd</p> <p> <br />自定义的tag标签遵@XML语法。它有一个开始标记和一个结束标讎ͼ有的q有bodyQ即文本节点Q:</p> <p><tt:tag></p> <p>body</p> <p></tt:tag></p> <p> <br />一个不带body的tag标签如下Q?/p> <p><tt:tag /></p> <p> <br />单的tag标签</p> <p>一个没有body和属性的tag标签如下Q?/p> <p><tt:simple /></p> <p> <br />带属性的tag标签</p> <p> <br />自定义标{֏以有自己的属性。属性一般在开始标C定义Q语法ؓ attr=”value”。属性的作用相当于自定义标签的一个参敎ͼ它媄响着tag处理cȝ行ؓ。你可以在TLD中详l定义它?/p> <p>你可以用一个String帔Rl一个属性赋|也可以通过表达式给它赋|?lt;%= ...%>。以strutsZQ它的logic:present标签是用的String帔R来给属性赋|</p> <p><loglic:present parameter = “Clear?gt;</p> <p>而另一个标{logic:iterate是用表达式来l属性赋|</p> <p><logci:iterate collection=?lt;%= bookDB.getBooks() %>?/p> <p>id=”book?type=”database.BookDetails?gt;</p> <p> <br />带body的tag标签</p> <p>一个自定义标签可以包含其它自定义标{、脚本变量、HTML标记或其它内宏V?/p> <p>在下qC子中Q此JSP面使用了struts的logic:present标签Q如果些标签定义了parameter=”Clear”的属性,则将清除购物车的内容Q然后打印出一条信息:</p> <p><logic:present parameter=”Clear?gt;</p> <p><% cart.clear(); %></p> <p><font color=?ff0000?size=?2?gt;<strong></p> <p>你选择了清除购物RQ?/p> <p></strong></font></p> <p></logic:present></p> <p> <br />到底是用属性还是用body来传递信息?</p> <p>如上所qͼ我们既可以通过属性,也可以通过body来传递信息。但一般来_比较单的cdQ如字符串或单表辑ּ最好采用属性来传递信息?/p> <p> <br />定义脚本变量的tag标签</p> <p>所谓脚本变量,是指JSP中可以调用的变量或对象。它可由tag标签产生。以下示例阐qC一个tag标签定义了一个名为tx的由JNDI所定义的事务处理对象。脚本变量可以是ejb对象、事务、数据库q接{等Q?/p> <p><tt:lookup id=”tx?type=”UserTransaction?name=”java:comp/UserTransaction?/></p> <p><% tx.begin(); %></p> <p>...</p> <p> <br />h协作关系的tag标签</p> <p>自定义tag标签之间可以通过׃n对象来实现协作。在下述例子中,标签tag1创徏了一个名为obj1的对象,在标{tag2仍可以重复用obj?/p> <p><tt:tag1 attr1=”obj1?value1=”value?/></p> <p><tt:tag2 attr1=”obj1?/></p> <p>在以下这个例子当中,如果外层的tag标签创徏了一个对象,那么其内层的所有tag标签都可以用这个对象。由于这样生的对象没有一个指定的名字Q那么就可以少重名的冲H。这个例子阐qC一pd协作的嵌套对象?/p> <p><tt:outerTag></p> <p><tt:innerTag /></p> <p></tt:outerTag></p> <p>Tag处理c?/p> <p> <br />Tag处理cdd现Tag接口或BodyTag接口Q不q现在一般都行从TagSupport或BodyTagSupportcMl承Q这些类或接口都可以在javax.servlet.jsp.tagext包中扑ֈ?/p> <p>当JSP引擎看到自己的JSP面中包含有tag标签Ӟ它会调用doStartTagҎ来处理tag标签的开_调用doEndTagҎ来处理tag标签的结束?/p> <p>下表说明不同cd的tag所需要不同的处理q程Q?/p> <p>Tag处理cȝҎ </p> <p>Tag标签cd<br />所调用的方?/p> <p>基本标签<br />doStartTag, doEndTag, release</p> <p>带属性的标签<br />doStartTag, doEndTag, set/getAttribute1...N, release</p> <p>带内容的标签<br />doStartTag, doEndTag, release</p> <p>带内容的标签Q且内容重复循环<br />doStartTag, doAfterBody, doEndTag, release</p> <p>带内容的标签Q且内容与JSP交互<br />doStartTag, doEndTag, release, doInitBody, doAfterBody, release</p> <p>一个tag处理cd以通过javax.servlet.jsp.PageContext来与JSP交互Q通过javax.servlet.jsp.PageContextc,tag处理cd以访问JSP中的request、session和application对像?/p> <p>如果tag标签是互相嵌套的Q那内层的tag处理cd以通过它的parent属性来讉K上层的tag处理cR?/p> <p>一般情况都所有的tag处理cL成了JAR的包Q以便于发布?/p> <p> <br />Tag库描q?UTLD)</p> <p> <br />Tag库是用xml语言描述的,TLD包括了tag库中所有tag标签的描qͼ它一般用来被jsp服务器用来校验tag的语法正性,或者被jsp开发者用来开发新的标{?/p> <p>TLD的文件扩展名必须?tldQ而且必须攑֜当前WEB应用的WEB-INF目录或其子目录中?/p> <p>一个TLD的内容的开头必遵守标准的XML开_用于描述DTD和xml的版本,例如Q?/p> <p><?xml version="1.0" encoding="ISO-8859-1" ?></p> <p><!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "<a ><br />TLD必须?lt;taglib>来作为它的根元素Q?lt;taglib>的子元素如下表:</p> <p> <br /><taglib>的子元素 </p> <p>Element<br />Description</p> <p>tlib-version<br />Tag库的版本</p> <p>jsp-version<br />Tag库所需要的jsp的版?/p> <p>short-name<br />助记W,tag的一个别名(可选)</p> <p>uri<br />用于定一个唯一的tag?/p> <p>display-name<br />被可视化工具Q诸如JbuilderQ用来显C的名称Q可选)</p> <p>small-icon<br />被可视化工具Q诸如JbuilderQ用来显C的图标(可选)</p> <p>large-icon<br />被可视化工具Q诸如JbuilderQ用来显C的大图标(可选)</p> <p>description<br />对tag库的描述Q可选)</p> <p>listener<br />参见下面listener元素</p> <p>tag<br />参见下面tag 元素</p> <p>Listener元素</p> <p>一个tag库可能定义一些类做ؓ它的事g侦听c,q些cdTLD中被UCؓlistener 元素Qjsp服务器将会实例化q些侦听c,q且注册它们。Listener元素中有一个叫listener-class的子元素Q这个元素的值必L该侦听类的完整类名?/p> <p>Tag元素</p> <p>每个tag元素在tag库中都要指出它的名字、类名、脚本变量、tag的属性。其中脚本变量的值可以直接在TLD中定义或通过tag附加信息的类来取得。每个属性描qCq个属性是否可以省略,它的值是否可以通过<%= ?>q样的JSP语法来获得,以及属性的cd?/p> <p>每一个tag在TLD中对应一个tag元素Q下表是tag元素的子元素Q?/p> <p>Tag元素的子元素</p> <p>元素名称<br />描述</p> <p>name<br />独一无二的元素名</p> <p>tag-class<br />Tag标签对应的tag处理c?/p> <p>tei-class<br />javax.servlet.jsp.tagext.TagExtraInfo的子c,用于表达脚本变量Q可选)</p> <p>body-content<br />Tag标签body的类?/p> <p>display-name<br />被可视化工具Q诸如JbuilderQ用来显C的名称Q可选)</p> <p>small-icon<br />被可视化工具Q诸如JbuilderQ用来显C的图标(可选)</p> <p>large-icon<br />被可视化工具Q诸如JbuilderQ用来显C的大图标(可选)</p> <p>description<br />此tag标签的描q?/p> <p>variable<br />提供脚本变量的信息(同tei-classQ?可?</p> <p>attribute<br />Tag标签的属性名</p> <p>以下章节介绍对于不同cd的tagQ如何具体地实现它们?/p> <p> <br />单的tag</p> <p> <br />tag处理c?/p> <p>单的tag处理cdd现Tag接口的doStartTag和doEndTagҎ。当jsp引擎到tag标签的开头时QdoStartTag被调用,因ؓ单的tag没有bodyQ所以此Ҏ返?SKIP_BODY。当jsp引擎到tag标签的结时QdoEndTag被调用,如果余下的页面还要被计算Q那它将q回EVAL_PAGE,否则会q回SKIP_PAGE?/p> <p>以下是例子:对于标签 <tt:simple /> Q它的tag处理cd现如下:</p> <p> <br />public SimpleTag extends TagSupport </p> <p>{ </p> <p>public int doStartTag() throws JspException </p> <p>{ </p> <p>try{ </p> <p>pageContext.getOut().print(“Hello.?; </p> <p>}catch(Exception e){ </p> <p>throw new JspTagException(“SimpleTag: ?+ e.getMessage()); </p> <p>} </p> <p>return SKIP_BODY; </p> <p>} </p> <p>public int doEndTag() </p> <p>{ </p> <p>return EVAL_PAGE; </p> <p>} </p> <p>} </p> <p> <br />注意Q如果tag标签没有内容的话Q那必须定义body-content元素为空Q例?/p> <p><body-content>empty</body-content></p> <p> <br />带属性的tag标签</p> <p> <br />tag处理c?/p> <p>对于tag标签的每个属性,你必M照JavaBeans规范来定义其属性,以及get和setҎ。以struts的logic:present 标签ZQ?/p> <p><logic:present parameter=”Clear?gt;</p> <p>与此相应Q此tag处理cd有如下方法和定义Q?/p> <p> <br />protected String parameter = null; </p> <p>public String getParameter() </p> <p>{ </p> <p>return this.parameter; </p> <p>} </p> <p>public void setParameter(String parameter) </p> <p>{ </p> <p>this.parameter = parameter; </p> <p>} </p> <p> <br />注意Q如果你的属性名为idQ而且你的tag处理cL从TagSupportcȝ承的Q那你就不需要定义它的属性和set和getҎ,因ؓ他们早已在TagSupport被定义过了?/p> <p>Attribute元素</p> <p>对于tag标签的每个属性,你必d义它是否必须的,它的值是否可以用诸如<%= ?>的表辑ּ来获得,以及它的cdQ可选)Q如果不指定它的cdQ那默认ؓ是java.lang.Stringcd。如果rtexprvalue元素被定义ؓtrue或yesQ那么在type元素中就定义了attribute的返回类型?/p> <p><attribute></p> <p><name>attr1</name></p> <p><required>true|false|yes|no</required></p> <p><rtexprvalue>true|false|yes|no</rtexprvalue></p> <p><type>attribute的返回类型(只用当rtexprvalue为真是才有效Q?lt;/type></p> <p></attribute></p> <p>如果tag的某个属性不是必ȝQ那tag处理cM自动提供一个缺省倹{?/p> <p>例如Q在logic:presentq个tag标签中定义了一个属性叫parameterQ但它不是必ȝQ而且它可以被诸如<%= ?>的表辑ּ来赋倹{?/p> <p><tag></p> <p><name>present</name></p> <p><tag-class>org.apache.struts.taglib.logic.PresentTag</tag-class></p> <p><body-content>JSP</body-content></p> <p>?/p> <p><attribute></p> <p><name>parameter</name></p> <p><required>false</required></p> <p><rtexprvalue>true</rtexprvalue></p> <p></attribute></p> <p>?/p> <p></tag></p> <p> <br />属性元素的校验</p> <p> <br />有关于tag标签的有效值可以从tag库的说明文档中获得,当JSP面被编译时Qjsp引擎会强制性地参照TLD中定义的规则q行查?/p> <p>q有一个方法也可以q行属性元素的校验Q就是先l承cTagExtraInfoQ然后调用它的isValidҎ。这个类同时也v到提供tag中定义的脚本变量信息的作用?/p> <p>IsValidҎ通过TagData对象来传递属性信息,它包括着tag的所有的属性名Q值的信息。由于校验发生在q行时刻Q因此这个属性的值将被赋gؓTagData.REQUEST_TIME_VALUE?/p> <p>例如tag标签<tt:twa attr1=”value1?/>在TLD中定义如下:</p> <p><attribute></p> <p><name>attr1</name></p> <p><required>true</required></p> <p><rtexprvalue>true</rtexprvalue></p> <p></attribute></p> <p> <br />q个定义说明了attr1能在q行期间被赋倹{?/p> <p>以下的isValidҎ查attr1属性的值是否属于Booleancd。注意由于attr1能在q行刻被赋|那么isValidҎ必须查tag用户是否Ҏtagq行了运行时刻赋倹{?/p> <p> <br />Public class TwaTEI extends TagExtraInfo </p> <p>{ </p> <p>public boolean isValid(Tagdata data) </p> <p>{ </p> <p>Object o = data.getAttribute(“attr1?; </p> <p>If(o != null && o != TagData.REQUEST_TIME_VALUE) </p> <p>{ </p> <p>if( ( (String)o).toLowerCase().equals(“true? ||  </p> <p>((String)o).toLowerCase().equals(“false? ) </p> <p>return true; </p> <p>else </p> <p>return false; </p> <p>} </p> <p>else </p> <p>return true; </p> <p>} </p> <p>} </p> <p>带body的tag</p> <p>tag处理c?/p> <p> <br />如果tag标签含有内容Q那处理方式会略微有些不同,而且q要视tag处理cL否要与body交互的情况而定。如果要与body交互Q那我们认ؓtag处理c要可能要对bodyq行操作?/p> <p>Tag处理cM与body交互</p> <p>如果tag处理cM与body交互Qtag处理cd该实现Tag接口或从TagSupport中派生,如果body要被计算Q那么doStartTagҎ应返?EVAL_BODY_INCLUDEQ否则应q回SKIP_BODY?/p> <p>如果tag处理c要对body反复q算Q则它应该实现IterationTag或从TagSupport中派生。如果tag处理c认为bodyq未计算完的话,那它的doStartTagҎ和doAfterBodyҎ必须q回EVAL_BODY_AGAIN?/p> <p>Tag处理cMbody交互</p> <p>如果tag处理cMbody交互Q那tag处理cd实现BodyTag接口或从BodyTagSupport中派生。这Utag处理cM般要实现doInitBody和doAfterBodyҎ?/p> <p>Body允许一些方法来d它的内容。Tag处理cd以调用body内容的getString或getReaderҎ来从body中提取信息,也可?writeOut(out) Ҏ来将body的内容写入到out对象中。其中out对象通过tag处理cȝgetPreviousOutҎ来获得?/p> <p>如果body的内定w要被计算Q那么doStartTagҎ必须q回EVAL_BODY_BUFFEREDQ否则,它将q回 SKIP_BODY?/p> <p>doInitBody Ҏ</p> <p>此方法在body内容已经讑֥Q但未被计算之前被调用。你可以Ҏ不同的body内容来制定初始化{略?/p> <p>doAfterBodyҎ</p> <p>此方法在body内容已被计算后进行调用?/p> <p>和doStartTagҎ一PdoAfterBodyҎq回一个指C符指示是否要l计bodyQ如果要l箋计算Q则doAfterBody应返回EVAL_BODY_BUFFEREDQ否则,它应q回SKIP_BODY?/p> <p>release Ҏ</p> <p>tag处理c调用此Ҏ它的状态重|ؓ初始状态,q放所有的U有资源?/p> <p> <br />以下的例子读取body的内容(其中含有一条sql语句Q,然后它传递给一个对象,让它q行查询。由于此处body不须重新计算Q所以doAfterBody会返回SKIP_BODY?/p> <p> <br />Public class QueryTag extends BodyTagSupport </p> <p>{ </p> <p>public int doAfterBody() throws JspTagException </p> <p>{ </p> <p>BodyContent bc = getBodyContent(); </p> <p>//body的内容以字符串的格式提取出来 </p> <p>String query = bc.getString(); </p> <p>//清除body </p> <p>bc.clearBody(); </p> <p>try{ </p> <p>Statement stmt = connection.createStatement(); </p> <p>Result result = stmt.executeQuery(query); </p> <p>}catch(SQLException e){ </p> <p>throw new JspTagException(“queryTag: ?+ e.getMessage() ); </p> <p>return SKIP_BODY; </p> <p>} </p> <p>} </p> <p> <br />body-content元素</p> <p> <br />׃tag可能会有bodyQ你必须用body-content元素来指定body内容的类型:</p> <p><body-content>JSP|tagdependent</body-content></p> <p> <br />如果body的内Ҏ定制的或内部的tag、脚本元素、或HTMLq本Q则归类为JSPcd。其他的cdQ比如上面代码所q的?D?Dsql statementcMl?query tag的这U类型应该标为tagdependent?/p> <p>注意Q实际上body-content的值ƈ不媄响tag处理cdbody内容的处理,它仅仅是被tag~辑工具用来描述此body的内宏V?/p> <p> <br />用tags定义脚本变量</p> <p>tag处理c?/p> <p> <br />tag处理c负责创建或讄面中定义的脚本变量Q用pageContext.setAttribute(name,value,scope)或pageContext.setAttribute(name,value)Ҏ来实现。一般来_tag处理c通过脚本变量的名U来获取它,脚本变量的名UC般可用getҎ来获得?/p> <p>如果脚本变量的g赖于tag处理cM的上下文中某一对象Q那它可用pageContext.getAttribute(name,scope)Ҏ来找到那个对象。一般的处理q程是tag处理cd扑ֈ脚本变量Q再对其q行处理Q然后用pageContext.setAttribute(name,object)的方法来讄它的新倹{?/p> <p>对象的生存周?scope)如下表:</p> <p>对象的生存周期表</p> <p>名字<br />可访问范?br />生存周期</p> <p>page<br />当前面<br />一直有效,除非面向客h交响应或重定向到一个新面</p> <p>request<br />当前面或当前页面重定向到的面<br />一直有效,除非面向客h交响?/p> <p>session<br />当前面或在同一览器窗口中的页?br />一直有?除非关闭当前览器、超时、网l故?/p> <p>application<br />整个web应用E序的所有请?br />一直有效,除非发生|络故障、服务器故障</p> <p>提供关于脚本变量的信?/p> <p>以下CZ定义了一个名为“book”的脚本变量Q用来访问程序中关于书的信息Q?/p> <p><bean:define id=”book?name=”bookDB?property=”bookDetails?type=”database.BookDetails?/></p> <p><font color=”red?size=?2?></p> <p><%= messages.getString(“CartRemoved? %></p> <p><strong><jsp:getProperty name=”book?property=”title?/></strong></p> <p></font></p> <p>当包含此tag的JSP面被编译时Qjsp引擎会自动生成关于此book的同步的代码Q同步可以避免几个客户同时访问此book旉成的冲H)Q要生成同步代码Qjsp引擎需要知道此脚本变量的如下信息:</p> <p>· 脚本变量名称 </p> <p>· 脚本变量所属的c?/p> <p>· 此脚本变量是否引用了一个新的或已存在的对象 </p> <p>· 此脚本变量的有效?/p> <p>有两U办法可以向jsp引擎提供关于脚本变量的信息:在TLD中定义variable子元素,或用tei-class子元素定义一个额外tag信息cR用variable最单,但可能降低了一些灵zL?/p> <p>Variable元素</p> <p>Variable元素有如下子元素Q?/p> <p>· name-given ?D?D l出的名字,是一个常?/p> <p>· name-from-attribute?D?D 属性名Q在~译时给出的属性名 </p> <p>name-given或name-from-attribute两者必选一Q但以下子元素是可选的Q?/p> <p>· variable-class?D?D变量的类型,~省为java.lang.String?</p> <p>· declare?D?D此脚本变量是否引用了一个新对象Q缺省ؓTrue?/p> <p>· scope?D?D脚本变量的范_~省为NESTED。下表描qCscope的几U类型:</p> <p>脚本变量的有效范?</p> <p>?br />有效?br />Ҏ </p> <p>NESTED<br />在tag标签的开始和l束之间<br />如果tag处理cd现BodyTag接口Q则在doInitBody和doAfterBody中调用,否则在doStartTag中调?/p> <p>AT_BEGIN<br />从tag标签的开始一直到面l束<br />如果tag处理cd现BodyTag接口Q则在doInitBody、doAfterBody和doEndTag中调用,否则在doStartTag和doEndTag中调?/p> <p>AT_END<br />从tag标签的结束一直到面l束<br />在doEndTag中调?/p> <p>以strutsZQ它的bean:define标签的实现遵循JSP1.1规范Q此规范要求使用额外tag信息cL定义脚本变量。Variable元素是JSP1.2规范中加入的。以bean:define标签ZQ你可以定义如下variable元素Q?/p> <p><tag></p> <p><variable></p> <p><name-from-attribute>id</name-from-attribute></p> <p><variable-class>database.BookDetails</variable-class></p> <p><declare>true</declare></p> <p><scope>AT_BEGIN</scope></p> <p></variable></p> <p></tag></p> <p>额外tag信息c?/p> <p>如果要定义一个额外tag信息c,你要l承javax.servlet.jsp.TagExtraInfocR一个TagExtraInfocdd现getVariableInfoҎQ此Ҏq回一个叫VariableInfo的数l类Q它包括如下信息Q?/p> <p>· 变量?/p> <p>· 变量所属类?</p> <p>· 此变量是否引用了一个新对象</p> <p>· 此变量的有效范围</p> <p>jsp引擎一个名为data的参ClgetVariableInfoҎQdata中包括tag标签中的所有“属性名?D?D属性值”对。它可以用来向VariableInfo对象提供脚本变量的名字和cd?/p> <p>以strutsZQ它在bean:define标签中定义了一个名为DefineTei的额外tag信息c,用来向脚本变量提供信息。由于脚本变量的名称QbookQ和cdQdatabase.BookDetailsQ是通过tag标签的属性来传递的Q它们一般定义在VariableInfo的构Z码中Qƈ且可用data.getAttributeStringҎ来得到这些信息。如果要允许book脚本变量能在从tag开始直到整个JSP面l束的范围内都可用的话,那它的范围应设ؓAT_BEGIN。如下所C:</p> <p> <br />public class DefineTei extends TagExtraInfo </p> <p>{ </p> <p>public VariableInfo[] getVariableInfo(TagData data) </p> <p>{ </p> <p>String type = data.getAttributeString(“type?; </p> <p>If( type == null) </p> <p>type = “java.lang.Object? </p> <p>return new VariableInfo[] { </p> <p>new VariableInfo(data.getAttributeString(“id?,  </p> <p>type, </p> <p>true, </p> <p>VariableInfo.AT_BEGIN) </p> <p>}; </p> <p>} </p> <p>} </p> <p> <br />注意Q关于额外tag信息cȝcd必须要在TLD中的tag标签下的tei-class子元素中定义。因此,DefineTei的tei-class中的定义看v来如下:<br /><tei-class><br />org.apache.struts.taglib.bean.DefineTagTei<br /></tei-class></p> <p> <br />h协作关系的tag</p> <p> <br />tag通过׃n对象来进行协作,JSP技术支?U方式的对象׃n?/p> <p>W一U方法是使用pageContext对象q行对象的共享(可支持JSP面和tag处理cM间的׃nQ,如果在一个tag处理cM要调用由另一个tag处理cd建的对象Q可调用pageContext.getAttribute(name, scope)Ҏ?/p> <p>W二各方式的׃n是对于tag之间有嵌套关p而言的,外层的tag所创徏的对象对于内层的tag来说是可以共用的。这UŞ式的׃n的好处是减少了可能存在的重名冲突?/p> <p>要访问一个嵌套tag创徏的对象,tag处理cdd扑ֈ此嵌套tag对象Q可用TagSupport的静态方?TagSupport.findAncestorWithClass(from, class)或TagSupport.getParentҎ。前者在当不定此tag是否为嵌套tag对象时用。一旦它的父c被扑ֈQ它p讉K其所有动态或静态创建的对象。静态创建的对象是父cȝ成员Q而动态创建的对象可能是父cȝU有对象。诸如此cȝ对象可以用tag处理cȝsetValueҎ来保存,用getValueҎ来获得?/p> <p>下例阐述了以上两U共享对象的Ҏ。在q个例子当中Q一个查询tag查一个名为connection的属性名是否在doStartTag中被讄。如果connection属性被讄Qtag处理cMpageContext中得到这个connection对象。否则,此tag处理cd扑ֈ它的父tag处理c,然后从它的父tag处理cM扑ֈconnection对象?/p> <p> <br />public class QueryTag extends BodyTagSupport </p> <p>{ </p> <p>private String connectionId; </p> <p>public int doStartTag() throws JspException </p> <p>{ </p> <p>String cid = getConnection(); </p> <p>if(cid != null) </p> <p>{ </p> <p>//存在一个connection idQ用它?</p> <p>connection = (Connection) pageContext.getAttribute(cid); </p> <p>} </p> <p>else </p> <p>{ </p> <p>ConnectionTag ancestorTag = (ConnectionTag)findAncestorWithClass(this,  </p> <p>ConnectionTag.class); </p> <p>if(ancestorTag == null) </p> <p>{ </p> <p>throw new JspTagException(“一个没有connection属性的查询标签必须被一个connection标记嵌套。?; </p> <p>} </p> <p>connection = ancestorTag.getConnection(); </p> <p>} </p> <p>} </p> <p>}  </p> <p> <br />此查询标{֜JSP面中的调用形式可以从以?U定义中任选一U:</p> <p><tt:connection id=”con01?...> ... </tt:connection></p> <p><tt:query id=”balances?connection=”con01?></p> <p>SELECT account, balance FROM acct_table</p> <p>where customer_num = <%= request.getCustno() %></p> <p></tt:query></p> <p>?/p> <p><tt:connection ...></p> <p><x:query id=”balances?gt;</p> <p>SELECT account, balance FROM acct_table</p> <p>where customer_num = <%= request.getCustno() %></p> <p></x:query></p> <p></tt:connection></p> <p>与此同时Q在TLD中必L定connection属性ؓ可选的Q定义如下:</p> <p><tag></p> <p>...</p> <p><attribute></p> <p><name>connection</name></p> <p><required>false</required></p> <p></attribute></p> <p></tag></p> </div> </td> </tr> </tbody> </table> <img src ="http://www.tkk7.com/songfei/aggbug/103548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/songfei/" target="_blank">天外飞仙</a> 2007-03-13 15:44 <a href="http://www.tkk7.com/songfei/articles/103548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>(转蝲)Java中的cd机?/title><link>http://www.tkk7.com/songfei/articles/67131.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Fri, 01 Sep 2006 08:02:00 GMT</pubDate><guid>http://www.tkk7.com/songfei/articles/67131.html</guid><wfw:comment>http://www.tkk7.com/songfei/comments/67131.html</wfw:comment><comments>http://www.tkk7.com/songfei/articles/67131.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/songfei/comments/commentRss/67131.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/songfei/services/trackbacks/67131.html</trackback:ping><description><![CDATA[ <p> <a class="diary_title" > <font class="diary_title" color="#0079a2"> <strong>Java中的cd机?/strong> </font> </a> <a name="35678943"> </a> <br /> <br />(转蝲)Java中的cd机?br /><br /> <br /><br />一、反的概念 Q?br />反射的概忉|由Smith?982q首ơ提出的Q主要是指程序可以访问、检和修改它本w状态或行ؓ的一U能力。这一概念的提出很快引发了计算机科学领域关于应用反性的研究。它首先被程序语a的设计领域所采用,q在Lisp和面向对象方面取得了成W。其中LEAD/LEAD++ 、OpenC++ 、MetaXa和OpenJava{就是基于反机制的语言。最q,反射机制也被应用C视窗pȝ、操作系l和文gpȝ中。?br /><br />反射本nq不是一个新概念Q它可能会我们联想到光学中的反概念,管计算机科学赋予了反射概念新的含义Q但是,从现象上来说Q它们确实有某些盔R之处,q些有助于我们的理解。在计算机科学领域,反射是指一cd用,它们能够自描q和自控制。也是_q类应用通过采用某种机制来实现对自己行ؓ的描qͼself-representationQ和监测QexaminationQ,q能Ҏ自n行ؓ的状态和l果Q调整或修改应用所描述行ؓ的状态和相关的语义。可以看出,同一般的反射概念相比Q计机U学领域的反不单单指反本w,q包括对反射l果所采取的措施。所有采用反机制的pȝQ即反射pȝQ都希望使系l的实现更开放。可以说Q实C反射机制的系l都h开放性,但具有开放性的pȝq不一定采用了反射机制Q开放性是反射pȝ的必要条件。一般来_反射pȝ除了满开放性条件外q必L_因连接(Causally-connectedQ。所谓原因连接是指对反射pȝ自描q的改变能够立即反映到系l底层的实际状态和行ؓ上的情况Q反之亦然。开放性和原因q接是反系l的两大基本要素?3700863760<br /><br />Java中,反射是一U强大的工具。它使您能够创徏灉|的代码,q些代码可以在运行时装配Q无需在组件之间进行源代表链接。反允许我们在~写与执行时Q我们的程序代码能够接入装载到JVM中的cȝ内部信息Q而不是源代码中选定的类协作的代码。这使反成为构建灵zȝ应用的主要工兗但需注意的是Q如果用不当,反射的成本很高?br /><br />二、Java中的cd:<br />Reflection 是 Java E序开发语a的特征之一Q它允许q行中的 Java E序对自w进行检查,或者说“自审”,q能直接操作E序的内部属性。Java 的这一能力在实际应用中也许用得不是很多Q但是在其它的程序设计语a中根本就不存在这一Ҏ。例如,Pascal、C 或者 C++ 中就没有办法在程序中获得函数定义相关的信息?br /><br />1Q检类Q?br /><br />1.1 reflection的工作机?br /><br />考虑下面q个单的例子Q让我们看看 reflection 是如何工作的?br /><br />import java.lang.reflect.*;<br />public class DumpMethods {<br />    public static void main(String args[]) {<br />        try {<br />            Class c = Class.forName(args[0]);<br />            Method m[] = c.getDeclaredMethods();<br />            for (int i = 0; i < m.length; i++)<br />                System.out.println(m[i].toString());<br />        } catch (Throwable e) {<br />            System.err.println(e);<br />        }<br />    }<br />}<br /><br />按如下语句执行:<br /><br />java DumpMethods java.util.Stack<br /><br />它的l果输出为:<br /><br />public java.lang.Object java.util.Stack.push(java.lang.Object)<br /><br />public synchronized java.lang.Object java.util.Stack.pop()<br /><br />public synchronized java.lang.Object java.util.Stack.peek()<br /><span id="dissub1"></span></p> <div class="24ame84" id="blog_sub_st" name="blog_sub_st">loading...</div> <img src ="http://www.tkk7.com/songfei/aggbug/67131.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/songfei/" target="_blank">天外飞仙</a> 2006-09-01 16:02 <a href="http://www.tkk7.com/songfei/articles/67131.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>抽象cȝ用?/title><link>http://www.tkk7.com/songfei/articles/65013.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Tue, 22 Aug 2006 03:01:00 GMT</pubDate><guid>http://www.tkk7.com/songfei/articles/65013.html</guid><wfw:comment>http://www.tkk7.com/songfei/comments/65013.html</wfw:comment><comments>http://www.tkk7.com/songfei/articles/65013.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/songfei/comments/commentRss/65013.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/songfei/services/trackbacks/65013.html</trackback:ping><description><![CDATA[ <table style="WIDTH: 80%; mso-cellspacing: 2.2pt; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt" cellspacing="3" cellpadding="0" width="80%" border="0"> <tbody> <tr> <td style="PADDING-RIGHT: 2.25pt; PADDING-LEFT: 2.25pt; BACKGROUND: #cccccc; PADDING-BOTTOM: 2.25pt; PADDING-TOP: 2.25pt"> <p class="MsoNormal"> <span lang="EN-US" style="FONT-SIZE: 10.5pt">public abstract class Benchmark<br />{<br />  /**<br />  * 下面操作是我们希望在子类中完?br />  */<br />  public abstract void benchmark(); <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:p></o:p></span> </p> <p>  <span lang="EN-US">/**<br />  * 重复执行benchmarkơ数<br />  */<br />  public final long repeat (int count) {<br />    if (count <= 0)<br />      return 0;<br />    else {<br />      long startTime = System.currentTimeMillis();<o:p></o:p></span></p> <p>    <span lang="EN-US">for (int i = 0; i < count; i++) <br />      benchmark();<br /><br />    long stopTime = System.currentTimeMillis();<br />    return stopTime - startTime;<br />  }<br />}<br />}<o:p></o:p></span></p> </td> </tr> </tbody> </table> <p class="MsoNormal"> <span lang="EN-US" style="FONT-SIZE: 10.5pt">public class MethodBenchmark extends Benchmark<br />{<br />  /**<br />  * 真正定义benchmark内容<br />  */<br />  public void benchmark() {<br /><br />    for (int i = 0; i < Integer.MAX_VALUE; i++){<br />      System.out.printtln("i="+i);    <br />    }<br />  }<br />}<br /><br />也许你以前还疑惑抽象cL什么用<span lang="EN-US">,现在你应该彻底明白了? 至于q样做的好处,很显然啊,扩展性强,以后Benchmark内容变化,我只要再做一个承子cd可以,不必修改其他应用代码.<o:p></o:p></span><o:p></o:p></span> </p> <img src ="http://www.tkk7.com/songfei/aggbug/65013.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/songfei/" target="_blank">天外飞仙</a> 2006-08-22 11:01 <a href="http://www.tkk7.com/songfei/articles/65013.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>深入理解abstract class和interfacehttp://www.tkk7.com/songfei/articles/64097.html天外飞仙天外飞仙Thu, 17 Aug 2006 05:12:00 GMThttp://www.tkk7.com/songfei/articles/64097.htmlhttp://www.tkk7.com/songfei/comments/64097.htmlhttp://www.tkk7.com/songfei/articles/64097.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/64097.htmlhttp://www.tkk7.com/songfei/services/trackbacks/64097.html 深入理解abstract class和interface

 

abstract class和interface是Java语言中对于抽象类定义q行支持的两U机Ӟ正是׃q两U机制的存在Q才赋予了Java强大的面向对象能力。abstract class和interface之间在对于抽象类定义的支持方面具有很大的怼性,甚至可以怺替换Q因此很多开发者在q行抽象cd义时对于abstract class和interface的选择昑־比较随意。其实,两者之间还是有很大的区别的Q对于它们的选择甚至反映出对于问题领域本质的理解、对于设计意囄理解是否正确、合理。本文将对它们之间的区别q行一番剖析,试图l开发者提供一个在二者之间进行选择的依据?/blockquote>

理解抽象c?/span>

abstract class和interface在Java语言中都是用来进行抽象类Q本文中的抽象类q从abstract class译而来Q它表示的是一个抽象体Q而abstract class为Java语言中用于定义抽象类的一U方法,误者注意区分)定义的,那么什么是抽象c,使用抽象c能为我们带来什么好处呢Q?/p>

在面向对象的概念中,我们知道所有的对象都是通过cL描绘的,但是反过来却不是q样。ƈ不是所有的c都是用来描l对象的Q如果一个类中没有包含够的信息来描l一个具体的对象Q这Lcd是抽象类。抽象类往往用来表征我们在对问题领域q行分析、设计中得出的抽象概念,是对一pd看上M同,但是本质上相同的具体概念的抽象。比如:如果我们q行一个图形编辑Y件的开发,׃发现问题领域存在着圆、三角Şq样一些具体概念,它们是不同的Q但是它们又都属于Ş状这样一个概念,形状q个概念在问题领域是不存在的Q它是一个抽象概c正是因为抽象的概念在问题领域没有对应的具体概念Q所以用以表征抽象概늚抽象cL不能够实例化的?/p>

在面向对象领域,抽象cM要用来进行类型隐藏。我们可以构造出一个固定的一l行为的抽象描述Q但是这l行为却能够有Q意个可能的具体实现方式。这个抽象描q就是抽象类Q而这一lQ意个可能的具体实现则表现为所有可能的zcR模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允怿改的Q同Ӟ通过从这个抽象体zQ也可扩展此模块的行为功能。熟悉OCP的读者一定知道,Z能够实现面向对象设计的一个最核心的原则OCP(Open-Closed Principle)Q抽象类是其中的关键所在?/p>

从语法定义层面看abstract class和interface

在语法层面,Java语言对于abstract class和interfacel出了不同的定义方式Q下面以定义一个名为Demo的抽象类Z来说明这U不同?/p>

使用abstract class的方式定义Demo抽象cȝ方式如下Q?/p>

																				
abstract class Demo ?
	abstract void method1();
	abstract void method2();
	?
?

																		

使用interface的方式定义Demo抽象cȝ方式如下Q?/p>

																				
interface Demo {
	void method1();
	void method2();
	?
}

																		

在abstract class方式中,Demo可以有自q数据成员Q也可以有非abstarct的成员方法,而在interface方式的实CQDemo只能够有静态的不能被修改的数据成员Q也是必须是static final的,不过在interface中一般不定义数据成员Q,所有的成员Ҏ都是abstract的。从某种意义上说Qinterface是一U特DŞ式的abstract class?/p>

对于abstract class和interface在语法定义层面更多的l节问题Q不是本文的重点Q不再赘qͼ读者可以参阅参考文献?〕获得更多的相关内容?/p>

从编E层面看abstract class和interface

从编E的角度来看Qabstract class和interface都可以用来实?design by contract"的思想。但是在具体的用上面还是有一些区别的?/p>

首先Qabstract class在Java语言中表C的是一U承关p,一个类只能使用一ơ承关pR但是,一个类却可以实现多个interface。也许,q是Java语言的设计者在考虑Java对于多重l承的支持方面的一U折中考虑吧?/p>

其次Q在abstract class的定义中Q我们可以赋予方法的默认行ؓ。但是在interface的定义中Q方法却不能拥有默认行ؓQؓ了绕q这个限Ӟ必须使用委托Q但是这?增加一些复杂性,有时会造成很大的麻烦?/p>

在抽象类中不能定义默认行存在另一个比较严重的问题Q那是可能会造成l护上的ȝ。因为如果后来想修改cȝ界面Q一般通过abstract class或者interface来表C)以适应新的情况Q比如,d新的Ҏ或者给已用的方法中d新的参数Q时Q就会非常的ȝQ可能要p很多的时_对于zcd多的情况Q尤为如此)。但是如果界面是通过abstract class来实现的Q那么可能就只需要修改定义在abstract class中的默认行ؓ可以了?/p>

同样Q如果不能在抽象cM定义默认行ؓQ就会导致同LҎ实现出现在该抽象cȝ每一个派生类中,q反?one ruleQone place"原则Q造成代码重复Q同样不利于以后的维护。因此,在abstract class和interface间进行选择时要非常的小心?/p>

从设计理念层面看abstract class和interface

上面主要从语法定义和~程的角度论qCabstract class和interface的区别,q些层面的区别是比较低层ơ的、非本质的。本节从另一个层面:abstract class和interface所反映出的设计理念Q来分析一下二者的区别。作者认为,从这个层面进行分析才能理解二者概늚本质所在?/p>

前面已经提到q,abstarct class在Java语言中体C一U承关p,要想使得l承关系合理Q父cdzcM间必d?is a"关系Q即父类和派生类在概忉|质上应该是相同的Q参考文献?〕中有关?is a"关系的大幅深入的论qͼ有兴的读者可以参考)。对于interface 来说则不Ӟq不要求interface的实现者和interface定义在概忉|质上是一致的Q仅仅是实现了interface定义的契U而已。ؓ了便于理解Q下面将通过一个简单的实例q行说明?/p>

考虑q样一个例子,假设在我们的问题领域中有一个关于Door的抽象概念,该Doorh执行两个动作open和closeQ此时我们可以通过abstract class或者interface来定义一个表C抽象概念的类型,定义方式分别如下所C:

使用abstract class方式定义DoorQ?/p>

																				
	abstract class Door {
		abstract void open();
		abstract void close()Q?
}

																		

使用interface方式定义DoorQ?/p>

																				
interface Door {
		void open();
	void close();
}

																		

其他具体的Doorcd可以extends使用abstract class方式定义的Door或者implements使用interface方式定义的Door。看h好像使用abstract class和interface没有大的区别?/p>

如果现在要求Doorq要h报警的功能。我们该如何设计针对该例子的cȝ构呢Q在本例中,主要是ؓ了展Cabstract class和interface反映在设计理念上的区别,其他斚w无关的问题都做了化或者忽略)Q下面将|列出可能的解决ҎQƈ从设计理念层面对q些不同的方案进行分析?/p>

解决Ҏ一Q?/b>

单的在Door的定义中增加一个alarmҎQ如下:

																				
	abstract class Door {
		abstract void open();
		abstract void close()Q?
		abstract void alarm();
}

																		

或?/p>

																				
interface Door {
		void open();
	void close();
	void alarm();
}

																		

那么h报警功能的AlarmDoor的定义方式如下:

																				
	class AlarmDoor extends Door {
		void open() { ?}
    		void close() { ?}
		void alarm() { ?}
}

																		

或?/p>

																				
	class AlarmDoor implements Door ?
	void open() { ?}
    		void close() { ?}
		void alarm() { ?}
?

																		

q种Ҏq反了面向对象设计中的一个核心原则ISPQInterface Segregation PricipleQ,在Door的定义中把Door概念本n固有的行为方法和另外一个概?报警?的行为方法؜在了一赗这样引L一个问题是那些仅仅依赖于Doorq个概念的模块会因ؓ"报警?q个概念的改变(比如Q修改alarmҎ的参敎ͼ而改变,反之依然?/p>

解决Ҏ二:

既然open、close和alarm属于两个不同的概念,ҎISP原则应该把它们分别定义在代表q两个概늚抽象cM。定义方式有Q这两个概念都用abstract class方式定义Q两个概念都使用interface方式定义Q一个概念用abstract class方式定义Q另一个概念用interface方式定义?/p>

昄Q由于Java语言不支持多重承,所以两个概念都使用abstract class方式定义是不可行的。后面两U方式都是可行的Q但是对于它们的选择却反映出对于问题领域中的概念本质的理解、对于设计意囄反映是否正确、合理。我们一一来分析、说明?/p>

如果两个概念都用interface方式来定义,那么反映出两个问题Q?、我们可能没有理解清楚问题领域,AlarmDoor在概忉|质上到底是Doorq是报警器?2、如果我们对于问题领域的理解没有问题Q比如:我们通过对于问题领域的分析发现AlarmDoor在概忉|质上和Door是一致的Q那么我们在实现时就没有能够正确的揭C我们的设计意图Q因为在q两个概늚定义上(均用interface方式定义Q反映不Zq含义?/p>

如果我们对于问题领域的理解是QAlarmDoor在概忉|质上是DoorQ同时它有具有报警的功能。我们该如何来设计、实现来明确的反映出我们的意思呢Q前面已l说q,abstract class在Java语言中表CZU承关p,而承关pd本质上是"is a"关系。所以对于Doorq个概念Q我们应该用abstarct class方式来定义。另外,AlarmDoor又具有报警功能,说明它又能够完成报警概念中定义的行ؓQ所以报警概念可以通过interface方式定义。如下所C:

																				
	abstract class Door {
		abstract void open();
		abstract void close()Q?
	}
interface Alarm {
	void alarm();
}
class AlarmDoor extends Door implements Alarm {
	void open() { ?}
	void close() { ?}
   	void alarm() { ?}
}

																		

q种实现方式基本上能够明的反映出我们对于问题领域的理解Q正的揭示我们的设计意图。其实abstract class表示的是"is a"关系Qinterface表示的是"like a"关系Q大家在选择时可以作Z个依据,当然q是建立在对问题领域的理解上的,比如Q如果我们认为AlarmDoor在概忉|质上是报警器Q同时又hDoor的功能,那么上述的定义方式就要反q来了?/p>

l论

abstract class和interface是Java语言中的两种定义抽象cȝ方式Q它们之间有很大的相似性。但是对于它们的选择却又往往反映出对于问题领域中的概忉|质的理解、对于设计意囄反映是否正确、合理,因ؓ它们表现了概念间的不同的关系Q虽焉能够实现需求的功能Q。这其实也是语言的一U的惯用法,希望读者朋友能够细l体会?/p>

参考文?/span>
[1] Thinking in Java, Bruce Eckel
[2] Design Patterns Explained: A New Perspective on Object-Oriented Design, Alan Shalloway and James R. Trott
[3] Effective C++: 50 Specific Ways to Improve Your Programs and Design, Scott Meyers



天外飞仙 2006-08-17 13:12 发表评论
]]>
java?0个学习目?http://www.tkk7.com/songfei/articles/59660.html天外飞仙天外飞仙Sun, 23 Jul 2006 08:51:00 GMThttp://www.tkk7.com/songfei/articles/59660.htmlhttp://www.tkk7.com/songfei/comments/59660.htmlhttp://www.tkk7.com/songfei/articles/59660.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/59660.htmlhttp://www.tkk7.com/songfei/services/trackbacks/59660.html java?0个学习目?/span>
[b]你需要精通面向对象分析与设计QOOA/OODQ、涉及模式(GOF,J2EEDPQ以及综合模式。你应该十分了解UMLQ尤其是class,object,interaction以及state diagrams.

你需要学习JAVA语言的基知识以及它的核心cdQcollections,serialization,streams,networking,multithreading,reflection,event,handling,NIO,localization,以及其他Q?br />
你应该了解JVMQclass loaders,class reflect,以及垃圾回收的基本工作机制等。你应该有能力反~译一个类文gq且明白一些基本的汇编指o?br />
如果你将要写客户端程序,你需要学习WEB的小应用E序QappletQ,必需掌握GUI设计的思想和方?以及桌面E序的SWINGQAWTQSWT。你q应该对UI部g的JAVABEANlg模式有所了解。JAVABEANS也被应用在JSP中以把业务逻辑从表现层中分d来?br />
你需要学习java数据库技术,如JDBC APIq且会用至一Upersistence/ORM构架Q例如Hibernate, JDO, CocoBase, TopLink,Inside LiberatorQ国产JDO U工厂YӞ或者iBatis。你q应该了解对象关pȝL失配的含义,以及它是如何影响业务对象的与关系型数据库的交互,和它的运行结?q需要掌握不同的数据库品运用,比如: oracle,mysql,ms sql server.

你需要学习JAVA的沙盒安全模式(class loaders, byte code verification, managers, policy and permissions, code signing, digital signatures, cryptography, certification, Kerberos,以及其他Q还有不同的安全/认证APIQ例如JAAS( Java Authentication and Authorization Service), JCE (Java Cryptography Extension), JSSE (Java Secure Socket Extension), 以及 JGSS (Java General Security Service).

你需要学习Servlets, JSP, 以及JSTLQStandard Tag LibrariesQ和可以选择的第三方Tag Libraries?br />
你需要熟悉主的|页框架Q例如JSF, Struts, Tapestry, Cocoon, WebWork, 以及他们下面的涉及模式,如MVC/MODEL2.

你需要学习如何用及理WEB服务器,例如tomcat,resin,JrunQƈ且知道如何在其基上扩展和l护WEBE序?br />
你需要学习分布式对象以及q程APIQ例如RMI和RMI/IIOP?br />
你需要掌握各U流行中间g技术标准和与javal合实现Q比如Tuxedo、CROBAQ当然也包括java EE 本n.

你需要学习最一U的XML APIQ例如JAXP (Java API for XML Processing), JDOM (Java for XML Document Object Model), DOM4J, ?JAXR (Java API for XML Registries).

你应该学习如何利用JAVA API和工h构徏Web Service。例如JAX-RPC (Java API for XML/RPC), SAAJ (SOAP with Attachments API for Java), JAXB (Java Architecture for XML Binding), JAXM (Java API for XML Messaging), JAXR (Java API for XML Registries), 或?JWSDP (Java Web Services Developer Pack)?br />
你需要学习一门轻量应用E序框架Q例如Spring, PicoContainer, Avalon, 以及它们的IoC/DI 风格(setter, constructor, interface injection)?br />
你需要熟悉不同的J2EE技术,例如JNDI (Java Naming and Directory Interface), JMS (Java Message Service), JTA/JTS (Java Transaction API/Java Transaction Service), JMX (Java Management eXtensions), 以及 JavaMail.

你需要学习企业Java BeansQEJBQ以及它们的不同lg模式QStateless/Stateful Session Beans, Entity Beans (包含Bean-Managed Persistence [BMP] 或?Container-Managed Persistence [CMP] 和它?EJB-QL), 或者Message-Driven Beans (MDB).

你需要学习如何管理与配置一个J2EE应用E序服务器,如WebLogic QJBoss{,q且利用它的附加服务Q例如簇c?q接池以及分布式处理支援。你q需要了解如何在它上面封装和配置应用E序q且能够监控、调整它的性能?br />
你需要熟悉面向方面的E序设计以及面向属性的E序设计Q这两个都被很容易؜淆的~写为AOPQ,以及他们的主JAVA规格和执行。例如AspectJ 和AspectWerkz?br />
你需要熟悉对不同有用的API和framework{来Z服务。例如Log4J (logging/tracing), Quartz (scheduling), JGroups (network group communication), JCache (distributed caching), Lucene (full-text search), Jakarta Commons{等?br />
如果你将要对接或者正和旧的系l或者本地^収ͼ你需要学习JNI (Java Native Interface) and JCA (Java Connector Architecture).

你需要熟悉JINI技术以及与它相关的分布式系l,比如掌握CROBA?br />
你需要Java Community Process(JCP)以及他的不同Java Specification Requests (JSRs), 例如 Portlets (168), JOLAP (69), Data Mining API (73), {等?br />
你应该熟l掌握一UJAVA IDE例如sunOne ,netBeans ,IntelliJ IDEA或者Eclipse。(有些人更喜欢VI或EMACS来编写文件。随便你用什么了Q)Q?br />
JAVAQ精的说是有些配置Q是冗长的,它需要很多的人工代码Q例如EJBQ,所以你需要熟悉代码生成工P例如XDoclet?br />
你需要熟悉一U单元测试体p(JNunitQ,q且学习不同的生成、部|工PAnt, MavenQ?br />
你需要熟悉一些在JAVA开发中l常用到的Y件工E过E。例如RUP (Rational Unified Process) and Agile methodologies.

你需要能够深入了解加熟练操作和配|不同的操作pȝ,比如GNU/linux ,sun solaris,mac OS{?做ؓ跨^台Y件的开发者?br />
你还需要紧跟java发展的步?比如现在可以深入的学习java ME ,以及各种java 新规范,技术的q用,?新v的web富客L技术?br />
你必需要对open source有所了解Q因java 的很多技术直接是靠开源来驱动发展?,?java 3D技术?/b>[/b]


天外飞仙 2006-07-23 16:51 发表评论
]]>
析Java语言中的内部c?http://www.tkk7.com/songfei/articles/54617.html天外飞仙天外飞仙Fri, 23 Jun 2006 01:44:00 GMThttp://www.tkk7.com/songfei/articles/54617.htmlhttp://www.tkk7.com/songfei/comments/54617.htmlhttp://www.tkk7.com/songfei/articles/54617.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/54617.htmlhttp://www.tkk7.com/songfei/services/trackbacks/54617.html
析Java语言中的内部c?/b>
autumn_thermal 转脓  (参与分:47178Q专家分Q?441)   发表Q?006-06-22 12:32   版本Q?.0   阅读Q?b>207?

析Java语言中的内部c?br />作者:morgan83    来自Qcsdn

  提vJava内部c(Inner ClassQ可能很多h不太熟悉Q实际上cM的概念在C++里也有,那就是嵌套类QNested ClassQ,关于q两者的区别与联p,在下文中会有Ҏ。内部类从表面上看,是在类中又定义了一个类Q下文会看到Q内部类可以在很多地方定义)Q而实际上q没有那么简单,乍看上去内部cM乎有些多余,它的用处对于初学者来说可能ƈ不是那么显著Q但是随着对它的深入了解,你会发现Java的设计者在内部cn上的是用心良苦。学会用内部类Q是掌握Java高~程的一部分Q它可以让你更优雅地设计你的E序l构。下面从以下几个斚w来介l:

  W一ơ见?br />
public interface Contents {
 int value();
}

public interface Destination {
 String readLabel();
}

public class Goods {
 private class Content implements Contents {
  private int i = 11;
  public int value() { 
   return i; 
  }
 }

 protected class GDestination implements Destination {
  private String label;
  private GDestination(String whereTo) {
   label = whereTo;
  }
  public String readLabel() { 
   return label; 
  }
 }

 public Destination dest(String s) {
  return new GDestination(s);
 }
 public Contents cont() {
  return new Content();
 }
}

class TestGoods {
 public static void main(String[] args) {
  Goods p = new Goods();
  Contents c = p.cont();
  Destination d = p.dest("Beijing");
 }
}  

  在这个例子里cContent和GDestination被定义在了类Goods内部Qƈ且分别有着protected和private修饰W来控制讉KU别。Content代表着Goods的内容,而GDestination代表着Goods的目的地。它们分别实C两个接口Content和Destination。在后面的mainҎ里,直接用 Contents c和Destination dq行操作Q你甚至q这两个内部cȝ名字都没有看见!q样Q内部类的第一个好处就体现出来??隐藏你不惌别h知道的操作,也即装性。?br />
  同时Q我们也发现了在外部cM用范围之外得到内部类对象的第一个方法,那就是利用其外部cȝҎ创徏q返回。上例中的cont()和dest()Ҏ是q么做的。那么还有没有别的方法呢Q当然有Q其语法格式如下Q?br />
outerObject=new outerClass(Constructor Parameters);

outerClass.innerClass innerObject=outerObject.new InnerClass(Constructor Parameters); 

  注意在创建非静态内部类对象Ӟ一定要先创v相应的外部类对象。至于原因,也就引出了我们下一个话??非静态内部类对象有着指向其外部类对象的引用,对刚才的例子E作修改Q?br />
public class Goods {

 private valueRate=2;

 private class Content implements Contents {
  private int i = 11*valueRate;
  public int value() { 
   return i; 
  }
 }

 protected class GDestination implements Destination {
  private String label;
  private GDestination(String whereTo) {
   label = whereTo;
  }
  public String readLabel() { 
   return label; 
  }
 }

 public Destination dest(String s) {
  return new GDestination(s);
 }
 public Contents cont() {
  return new Content();
 }


  修改的部分用蓝色昄了。在q里我们lGoodscd加了一个private成员变量valueRateQ意义是货物的h值系敎ͼ在内部类Content的方法value()计算价值时把它乘上。我们发玎ͼvalue()可以讉KvalueRateQ这也是内部cȝW二个好??一个内部类对象可以讉K创徏它的外部cd象的内容Q甚臛_括私有变量!q是一个非常有用的Ҏ,为我们在设计时提供了更多的思\和捷径。要惛_现这个功能,内部cd象就必须有指向外部类对象的引用。Java~译器在创徏内部cd象时Q隐式的把其外部cd象的引用也传了进dƈ一直保存着。这样就使得内部cd象始l可以访问其外部cd象,同时q也是ؓ什么在外部cM用范围之外向要创建内部类对象必须先创建其外部cd象的原因?br />
  有h会问Q如果内部类里的一个成员变量与外部cȝ一个成员变量同名,也即外部cȝ同名成员变量被屏蔽了Q怎么办?没事QJava里用如下格式表达外部cȝ引用Q?br />
outerClass.this  

  有了它,我们׃怕这U屏蔽的情况了?br />
  静态内部类

  和普通的cMP内部cM可以有静态的。不q和非静态内部类相比Q区别就在于静态内部类没有了指向外部的引用。这实际上和C++中的嵌套cd相像了,Java内部cMC++嵌套cL大的不同在于是否有指向外部的引用这一点上Q当然从设计的角度以及以它一些细节来讲还有区别?br />
  除此之外Q在M非静态内部类中,都不能有静态数据,静态方法或者又一个静态内部类Q内部类的嵌套可以不止一层)。不q静态内部类中却可以拥有q一切。这也算是两者的W二个区别吧?br />
  局部内部类 

  是的QJava内部cM可以是局部的Q它可以定义在一个方法甚至一个代码块之内?br />
public class Goods1 {
 public Destination dest(String s) {
  class GDestination implements Destination {
   private String label;
   private GDestination(String whereTo) {
    label = whereTo;
   }
   public String readLabel() { return label; }
  }
  return new GDestination(s);
 }

 public static void main(String[] args) {
  Goods1 g= new Goods1();
  Destination d = g.dest("Beijing");
 }


  上面是q样一个例子。在Ҏdest中我们定义了一个内部类Q最后由q个Ҏq回q个内部cȝ对象。如果我们在用一个内部类的时候仅需要创建它的一个对象ƈ创给外部Q就可以q样做。当Ӟ定义在方法中的内部类可以使设计多样化Q用途绝不仅仅在q一炏V?br />
  下面有一个更怪的例子Q?br />
public class Goods2{
 private void internalTracking(boolean b) {
  if(b) {
   class TrackingSlip {
    private String id;
    TrackingSlip(String s) {
     id = s;
    }
    String getSlip() { return id; }
   }
   TrackingSlip ts = new TrackingSlip("slip");
   String s = ts.getSlip();
  } 
 }

 public void track() { internalTracking(true); }

 public static void main(String[] args) {
  Goods2 g= new Goods2();
  g.track();
 }


  你不能在if之外创徏q个内部cȝ对象Q因已经出了它的作用域。不q在~译的时候,内部cTrackingSlip和其他类一样同时被~译Q只不过它由它自q作用域,出了这个范围就无效Q除此之外它和其他内部类q没有区别?br />
  匿名内部c?br />
  java的匿名内部类的语法规则看上去有些古怪,不过如同匿名数组一P当你只需要创Z个类的对象而且用不上它的名字时Q用内部类可以使代码看上去z清楚。它的语法规则是q样的:

new interfacename(){......}; 或 new superclassname(){......};  

  下面接着前面l箋举例子:

public class Goods3 {
 public Contents cont(){
  return new Contents(){
   private int i = 11;
   public int value() { 
    return i; 
   }
  };
 }
}  

  q里Ҏcont()使用匿名内部cȝ接返回了一个实C接口Contents的类的对象,看上ȝ十分简z?br />
  在java的事件处理的匿名适配器中Q匿名内部类被大量的使用。例如在惛_闭窗口时加上q样一句代码:

frame.addWindowListener(new WindowAdapter(){
 public void windowClosing(WindowEvent e){
  System.exit(0); 
 }
}); 

  有一炚w要注意的是,匿名内部cȝ于没有名字,所以它没有构造函敎ͼ但是如果q个匿名内部cȝ承了一个只含有带参数构造函数的父类Q创建它的时候必d上这些参敎ͼq在实现的过E中使用super关键字调用相应的内容Q。如果你惌初始化它的成员变量,有下面几U方法:

  如果是在一个方法的匿名内部c,可以利用q个Ҏ传进你想要的参数Q不q记住,q些参数必须被声明ؓfinal。?br />
  匿名内部类攚w成有名字的局部内部类Q这样它可以拥有构造函C。?br />
  在这个匿名内部类中用初始化代码块。?br />
  Z么需要内部类Q?br />
  java内部cL什么好处?Z么需要内部类Q?br />
  首先举一个简单的例子Q如果你惛_C个接口,但是q个接口中的一个方法和你构想的q个cM的一个方法的名称Q参数相同,你应该怎么办?q时候,你可以徏一个内部类实现q个接口。由于内部类对外部类的所有内定w是可讉K的,所以这样做可以完成所有你直接实现q个接口的功能?br />
  不过你可能要质疑Q更改一下方法的不就行了吗?

  的确Q以此作计内部类的理由,实在没有说服力?br />
  真正的原因是q样的,java中的内部cd接口加在一P可以的解军_被C++E序员抱怨java中存在的一个问??没有多ѝ实际上QC++的多l承设计h很复杂,而java通过内部cd上接口,可以很好的实现多l承的效果?br />


天外飞仙 2006-06-23 09:44 发表评论
]]>
WEBlogic中部|EJB的XML写法http://www.tkk7.com/songfei/articles/52715.html天外飞仙天外飞仙Wed, 14 Jun 2006 06:01:00 GMThttp://www.tkk7.com/songfei/articles/52715.htmlhttp://www.tkk7.com/songfei/comments/52715.htmlhttp://www.tkk7.com/songfei/articles/52715.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/52715.htmlhttp://www.tkk7.com/songfei/services/trackbacks/52715.htmlejb-jar.xml
<?xml version="1.0"?>

<!DOCTYPE ejb-jar PUBLIC '-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 1.1//EN' 'http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd'>

<ejb-jar>
  <enterprise-beans>
    <session>
      <ejb-name>zx0050e01</ejb-name>
      <home>jp.co.sri.tyresv.zensya.service.zx.zx0050.zx0050e01.Zx0050E01Home</home>
      <remote>jp.co.sri.tyresv.zensya.service.zx.zx0050.zx0050e01.Zx0050E01</remote>
      <ejb-class>jp.co.sri.tyresv.zensya.service.zx.zx0050.zx0050e01.Zx0050E01Bean</ejb-class>
      <session-type>Stateless</session-type>
      <transaction-type>Container</transaction-type>
      <env-entry>
        <description></description>
        <env-entry-name>zensyaDbConnection</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>ome.DbUrl2</env-entry-value>
      </env-entry>
      <env-entry>
        <description></description>
        <env-entry-name>zensyaDbUser</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>ome.DbUser2</env-entry-value>
      </env-entry>
      <env-entry>
        <description></description>
        <env-entry-name>zensyaDbPassword</env-entry-name>
        <env-entry-type>java.lang.String</env-entry-type>
        <env-entry-value>ome.DbPassword2</env-entry-value>
      </env-entry>
    </session>
  </enterprise-beans>
  <assembly-descriptor>
    <container-transaction>
      <method>
        <ejb-name>zx0050e01</ejb-name>
        <method-intf>Remote</method-intf>
        <method-name>*</method-name>
      </method>
      <trans-attribute>Required</trans-attribute>
    </container-transaction>
  </assembly-descriptor>
</ejb-jar>


weblogic-ejb-jar.xml:::::::::::::::
<?xml version="1.0"?>

<!DOCTYPE weblogic-ejb-jar PUBLIC '-//BEA Systems, Inc.//DTD WebLogic 6.0.0 EJB//EN' 'http://www.bea.com/servers/wls600/dtd/weblogic-ejb-jar.dtd'>

<weblogic-ejb-jar>
  <weblogic-enterprise-bean>
    <ejb-name>zx0050e01</ejb-name>
    <jndi-name>jp.co.sri.tyresv.zensya.service.zx.zx0050.zx0050e01</jndi-name>
  </weblogic-enterprise-bean>
</weblogic-ejb-jar>

////////////////////////////
D:\jar\Zx0050E01\jp\co\sri\tyresv\zensya\business\zx\zx0050\zx0050e01\BizZx0050E01.class
/////////////////////
D:\jar\Zx0050E01\jp\co\sri\tyresv\zensya\service\zx\zx0050\zx0050e01\Zx0050E01.class,Zx0050E01Bean.class,Zx0050E01D01$1.class,Zx0050E01D01.class,Zx0050E01D02.class,Zx0050E01Home.class,Zx0050E01I01.class



天外飞仙 2006-06-14 14:01 发表评论
]]>
JAVA相关基础知识http://www.tkk7.com/songfei/articles/51638.html天外飞仙天外飞仙Fri, 09 Jun 2006 03:06:00 GMThttp://www.tkk7.com/songfei/articles/51638.htmlhttp://www.tkk7.com/songfei/comments/51638.htmlhttp://www.tkk7.com/songfei/articles/51638.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/51638.htmlhttp://www.tkk7.com/songfei/services/trackbacks/51638.htmlJAVA相关基础知识
1、面向对象的特征有哪些方?/strong>   
1.抽象Q?/strong>
抽象是忽略一个主题中与当前目标无关的那些斚wQ以便更充分地注意与当前目标有关的方面。抽象ƈ不打了解全部问题,而只是选择其中的一部分Q暂时不用部分细节。抽象包括两个方面,一是过E抽象,二是数据抽象?br />2.l承Q?/strong>
l承是一U联l类的层ơ模型,q且允许和鼓q的重用,它提供了一U明表q共性的Ҏ。对象的一个新cd以从现有的类中派生,q个q程UCؓcȝѝ新cȝ承了原始cȝҎ,新类UCؓ原始cȝzc(子类Q,而原始类UCؓ新类的基c(父类Q。派生类可以从它的基c那里承方法和实例变量Qƈ且类可以修改或增加新的方法之更适合Ҏ的需要?br />3.装Q?/strong>
装是把q程和数据包围v来,Ҏ据的讉K只能通过已定义的界面。面向对象计始于这个基本概念,即现实世界可以被描绘成一pd完全自治、封装的对象Q这些对象通过一个受保护的接口访问其他对象?br />4. 多态性:
多态性是指允怸同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语ah灉|、抽象、行为共享、代码共享的优势Q很好的解决了应用程序函数同名问题?br />2、String是最基本的数据类型吗?
基本数据cd包括byte、int、char、long、float、double、boolean和short?br />java.lang.StringcLfinalcd的,因此不可以承这个类、不能修改这个类。ؓ了提高效率节省空_我们应该用StringBufferc?br />3、int 和 Integer 有什么区?/strong>
Java 提供两种不同的类型:引用cd和原始类型(或内|类型)。Int是java的原始数据类型,Integer是java为int提供的封装类。Java为每个原始类型提供了装cR?br />原始cd装c?br />booleanBoolean
charCharacter
byteByte
shortShort
intInteger
longLong
floatFloat
doubleDouble
引用cd和原始类型的行ؓ完全不同Qƈ且它们具有不同的语义。引用类型和原始cdh不同的特征和用法Q它们包括:大小和速度问题Q这U类型以哪种cd的数据结构存储,当引用类型和原始cd用作某个cȝ实例数据时所指定的缺省倹{对象引用实例变量的~省gؓ nullQ而原始类型实例变量的~省g它们的类型有兟?br />4、String 和StringBuffer的区?/strong>
JAVAq_提供了两个类QString和StringBufferQ它们可以储存和操作字符Ԍ卛_含多个字W的字符数据。这个StringcL供了数g可改变的字符丌Ӏ而这个StringBuffercL供的字符串进行修攏V当你知道字W数据要改变的时候你可以用StringBuffer。典型地Q你可以使用StringBuffers来动态构造字W数据?br />5、运行时异常与一般异常有何异同?
异常表示E序q行q程中可能出现的非正常状态,q行时异常表C拟机的通常操作中可能遇到的异常Q是一U常见运行错误。java~译器要求方法必d明抛出可能发生的非运行时异常Q但是ƈ不要求必d明抛出未被捕Lq行时异常?br />6、说出Servlet的生命周期,q说出Servlet和CGI的区别?/strong>
Servlet被服务器实例化后Q容器运行其initҎQ请求到达时q行其serviceҎQserviceҎ自动zNq行与请求对应的doXXXҎQdoGetQdoPostQ等Q当服务器决定将实例销毁的时候调用其destroyҎ?br />与cgi的区别在于servlet处于服务器进E中Q它通过多线E方式运行其serviceҎQ一个实例可以服务于多个hQƈ且其实例一般不会销毁,而CGIҎ个请求都产生新的q程Q服务完成后销毁,所以效率上低于servlet?br />7、说出ArrayList,Vector, LinkedList的存储性能和特?/strong>
ArrayList和Vector都是使用数组方式存储数据Q此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素Q但是插入元素要涉及数组元素Ud{内存操作,所以烦引数据快而插入数据慢QVector׃使用了synchronizedҎQ线E安全)Q通常性能上较ArrayList差,而LinkedList使用双向链表实现存储Q按序号索引数据需要进行前向或后向遍历Q但是插入数据时只需要记录本的前后即可,所以插入速度较快?br />8、EJB是基于哪些技术实现的Qƈ说出SessionBean和EntityBean的区别,StatefulBean和StatelessBean的区别?/strong>
    EJB包括Session Bean、Entity Bean、Message Driven BeanQ基于JNDI、RMI、JAT{技术实现?br />SessionBean在J2EE应用E序中被用来完成一些服务器端的业务操作Q例如访问数据库、调用其他EJBlg。EntityBean被用来代表应用系l中用到的数据?br />对于客户机,SessionBean是一U非持久性对象,它实现某些在服务器上q行的业务逻辑?br />对于客户机,EntityBean是一U持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用E序实现的实体?br />Session Bean q可以再l分为 Stateful Session Bean 与 Stateless Session Bean Q这两种的 Session Bean都可以将pȝ逻辑攑֜ method之中执行Q不同的是 Stateful Session Bean 可以记录呼叫者的状态,因此通常来说Q一个用者会有一个相对应的 Stateful Session Bean 的实体。Stateless Session Bean 虽然也是逻辑lgQ但是他却不负责记录使用者状态,也就是说当用者呼叫 Stateless Session Bean 的时候,EJB Container q不会找ȝ定的 Stateless Session Bean 的实体来执行q个 method。换a之,很可能数个用者在执行某个 Stateless Session Bean 的 methods Ӟ会是同一个 Bean 的 Instance 在执行。从内存斚w来看Q Stateful Session Bean 与 Stateless Session Bean 比较Q Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持用者的状态?br />9、Collection 和 Collections的区别?/strong> 
  Collection是集合类的上U接口,l承与他的接口主要有Set 和List.
Collections是针寚w合类的一个帮助类Q他提供一pd静态方法实现对各种集合的搜索、排序、线E安全化{操作?br />10?amp;?amp;&的区别。?/strong>
    &是位q算W,表示按位与运,&&是逻辑q算W,表示逻辑与(andQ?br />11、HashMap和Hashtable的区别?/strong> 
    HashMap是Hashtable的轻量实现Q非U程安全的实玎ͼQ他们都完成了Map接口Q主要区别在于HashMap允许I(nullQ键|keyQ?׃非线E安全,效率上可能高于Hashtable?br />HashMap允许null作ؓ一个entry的key或者valueQ而Hashtable不允许?br />HashMap把Hashtable的containsҎL了,Ҏcontainsvalue和containsKey。因为containsҎҎ让h引v误解。?br />Hashtablel承自Dictionaryc,而HashMap是Java1.2引进的Map interface的一个实现?br />最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是Q在多个U程讉KHashtableӞ不需要自׃ؓ它的Ҏ实现同步Q而HashMap 必Mؓ之提供外同步。?br />Hashtable和HashMap采用的hash/rehash法都大概一P所以性能不会有很大的差异?br />12、final, finally, finalize的区别?/strong> 
  final 用于声明属性,Ҏ和类Q分别表C属性不可变Q方法不可覆盖,cM可ѝ?br />finally是异常处理语句结构的一部分Q表CL执行?br />finalize是Objectcȝ一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回Ӟ例如关闭文g{?br />13、sleep() 和 wait() 有什么区? 
    sleep是线E类QThreadQ的ҎQ导致此U程暂停执行指定旉Q给执行Zl其他线E,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁?br />wait是ObjectcȝҎQ对此对象调用waitҎD本线E放弃对象锁Q进入等待此对象的等待锁定池Q只有针Ҏ对象发出notifyҎQ或notifyAllQ后本线E才q入对象锁定池准备获得对象锁q入q行状态?br />14、Overload和Override的区别。Overloaded的方法是否可以改变返回值的cd?
Ҏ的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父cM子类之间多态性的一U表玎ͼ重蝲Overloading是一个类中多态性的一U表现。如果在子类中定义某Ҏ与其父类有相同的名称和参敎ͼ我们说该Ҏ被重写?Overriding)。子cȝ对象使用q个ҎӞ调用子cM的定义,对它而言Q父cM的定义如同被"屏蔽"了。如果在一个类中定义了多个同名的方法,它们或有不同的参C数或有不同的参数cdQ则UCؓҎ的重?Overloading)。Overloaded的方法是可以改变q回值的cd?br />15、error和exception有什么区?
error 表示恢复不是不可能但很困隄情况下的一U严重问题。比如说内存溢出。不可能指望E序能处理这L情况?br />    exception 表示一U设计或实现问题。也是_它表C如果程序运行正常,从不会发生的情况?br />16、同步和异步有何异同Q在什么情况下分别使用他们QD例说明?/strong>
如果数据在U程间共享。例如正在写的数据以后可能被另一个线E读刎ͼ或者正在读的数据可能已l被另一个线E写q了Q那么这些数据就是共享数据,必须q行同步存取?br />当应用程序在对象上调用了一个需要花费很长时间来执行的方法,q且不希望让E序{待Ҏ的返回时Q就应该使用异步~程Q在很多情况下采用异步途径往往更有效率?br />17、abstract class和interface有什么区?
声明Ҏ的存在而不d现它的类被叫做抽象类Qabstract classQ,它用于要创徏一个体现某些基本行为的c,qؓ该类声明ҎQ但不能在该cM实现该类的情c不能创建abstract cȝ实例。然而可以创Z个变量,其类型是一个抽象类Qƈ让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract cȝ子类为它们父cM的所有抽象方法提供实玎ͼ否则它们也是抽象cMؓ。取而代之,在子cM实现该方法。知道其行ؓ的其它类可以在类中实现这些方法?br />接口QinterfaceQ是抽象cȝ变体。在接口中,所有方法都是抽象的。多l承性可通过实现q样的接口而获得。接口中的所有方法都是抽象的Q没有一个有E序体。接口只可以定义static final成员变量。接口的实现与子cȝ|除了该实现类不能从接口定义中l承行ؓ。当cd现特D接口时Q它定义Q即程序体l予Q所有这U接口的Ҏ。然后,它可以在实现了该接口的类的Q何对象上调用接口的方法。由于有抽象c,它允怋用接口名作ؓ引用变量的类型。通常的动态联~将生效。引用可以{换到接口cd或从接口cd转换Qinstanceof q算W可以用来决定某对象的类是否实现了接口?br />18、heap和stack有什么区别?/strong>
栈是一U线形集合,其添加和删除元素的操作应在同一D完成。栈按照后进先出的方式进行处理?br />堆是栈的一个组成元?br />19、forward 和redirect的区?/strong>
forward是服务器h资源Q服务器直接讉K目标地址的URLQ把那个URL的响应内容读取过来,然后把这些内容再发给览器,览器根本不知道服务器发送的内容是从哪儿来的Q所以它的地址栏中q是原来的地址?br />    redirect是服务端根据逻辑,发送一个状态码,告诉览器重新去h那个地址Q一般来说浏览器会用刚才h的所有参数重新请求,所以session,request参数都可以获取。?br />

天外飞仙 2006-06-09 11:06 发表评论
]]>
Tomcat+JSPl典配置实例http://www.tkk7.com/songfei/articles/51286.html天外飞仙天外飞仙Thu, 08 Jun 2006 03:04:00 GMThttp://www.tkk7.com/songfei/articles/51286.htmlhttp://www.tkk7.com/songfei/comments/51286.htmlhttp://www.tkk7.com/songfei/articles/51286.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/51286.htmlhttp://www.tkk7.com/songfei/services/trackbacks/51286.html
一、开发环境配|?/b>

W一步:下蝲j2sdk和tomcatQ到sun官方站(http://java.sun.com/j2se/1.5.0/download.jspQ下载j2sdkQ注意下载版本ؓWindows Offline Installation的SDKQ同时最好下载J2SE 1.5.0 DocumentationQ然后到tomcat官方站点Qhttp://jakarta.apache.org/site/downloads/downloads_tomcat-5.cgiQ下载tomcatQ下载最?.5.9版本的tomcatQ;

W二步:安装和配|你的j2sdk和tomcatQ执行j2sdk和tomcat的安装程序,然后按默认设|进行安装即可?br />
1.安装j2sdk以后Q需要配|一下环境变量,在我的电?>属?>高->环境变量->pȝ变量中添加以下环境变?假定你的j2sdk安装在c:\j2sdk1.5.0Q:

JAVA_HOME=c:\j2sdk1.5.0
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;Q?;一定不能少Q因为它代表当前路径)
path=%JAVA_HOME%\bin

接着可以写一个简单的javaE序来测试J2SDK是否已安装成功:

public class Test{
public static void main(String args[]){
System.out.println("This is a test program.");
}
}

上面的q段E序保存为文件名为Test.java的文件?br />
然后打开命o提示W窗口,cdC的Test.java所在目录,然后键入下面的命?br />
javac Test.java
java Test

此时如果看到打印出来This is a test program.的话说明安装成功了,如果没有打印句话Q你需要仔l检查一下你的配|情c?br />
2.安装Tomcat后,在我的电?>属?>高->环境变量->pȝ变量中添加以下环境变?假定你的tomcat安装在c:\tomcat)Q?br />
CATALINA_HOME=c:\tomcat
CATALINA_BASE=c:\tomcat

然后修改环境变量中的classpathQ把tomat安装目录下的common\lib下的(可以Ҏ实际q加)servlet.jarq加到classpath中去Q修改后的classpath如下Q?br />
classpath=.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%CATALINA_HOME%\common\lib\servlet.jar;

接着可以启动tomcatQ在IE中访问http://localhost:8080Q如果看到tomcat的欢q页面的话说明安装成功了?br />
W三步:建立自己的jsp app目录

1.到Tomcat的安装目录的webapps目录Q可以看到ROOTQexamples, tomcat-docs之类Tomcat自带的的目录Q?br />2.在webapps目录下新Z个目录,起名叫myappQ?br />3.myapp下新Z个目录WEB-INFQ注意,目录名称是区分大写的;
4.WEB-INF下新Z个文件web.xmlQ内容如下:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!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>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
</web-app>

5.在myapp下新Z个测试的jsp面Q文件名为index.jspQ文件内容如下:
<html><body><center>
Now time is: <%=new java.util.Date()%>
</center></body></html>

6.重启Tomcat

7.打开览器,输入http://localhost:8080/myapp/index.jsp 看到当前旉的话说明成功了?br />
W四步:建立自己的ServletQ?br />
1.用你最熟悉的编辑器Q徏议用有语法查的java ideQ新Z个servletE序Q文件名为Test.javaQ文件内容如下:

package test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
PrintWriter out=response.getWriter();
out.println("<html><body><h1>This is a servlet test.</h1></body></html>");
out.flush();
}
}

2 .~译
Test.java攑֜c:\test下,使用如下命o~译Q?br />
C:\Test>javac Test.java

然后在c:\Test下会产生一个编译后的servlet文gQTest.class

3 .结构test\Test.class剪切?CATALINA_HOME%\webapps\myapp\WEB-INF\classes下,也就是剪切那个test目录到classes目录下,如果classes目录不存在,新Z个?现在webapps\myapp\WEB-INF\classes下有test\Test.class的文件目录结?br />
4 .修改webapps\myapp\WEB-INF\web.xmlQ添加servlet和servlet-mapping

~辑后的web.xml如下所C,U色为添加的内容:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!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>
<display-name>My Web Application</display-name>
<description>
A application for test.
</description>
<servlet>
<servlet-name>Test</servlet-name>
<display-name>Test</display-name>
<description>A test Servlet</description>
<servlet-class>test.Test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Test</servlet-name>
<url-pattern>/Test</url-pattern>
</servlet-mapping>
</web-app>

q段话中的servletq一D声明了你要调用的ServletQ而servlet-mapping则是声明的servlet"映射"到地址/Test?br />
5 .好了Q重启动TomcatQ启动浏览器Q输入http://localhost:8080/myapp/Test 如果看到输出This is a servlet test.p明编写的servlet成功了?br />
注意Q修改了web.xml以及新加了classQ都要重启Tomcat

W四步:建立自己的BeanQ?br />
1.用你最熟悉的编辑器Q徏议用有语法查的java ideQ新Z个javaE序Q文件名为TestBean.javaQ文件内容如下:

package test;
public class TestBean{
private String name = null;
public TestBean(String strName_p){
this.name=strName_p;
}
public void setName(String strName_p){
this.name=strName_p;
}
public String getName(){
return this.name;
}
}

2 .~译

TestBean.java攑֜c:\test下,使用如下命o~译Q?br />
C:\Test>javac TestBean.java

然后在c:\Test下会产生一个编译后的bean文gQTestBean.class

3 .TestBean.class文g剪切?%CATALINA_HOME%\webapps\myapp\WEB-INF\classes\test下,

4 .新徏一个TestBean.jsp文gQ文件内容ؓQ?br />
<%@ page import="test.TestBean" %>
<html><body><center>
<%
TestBean testBean=new TestBean("This is a test java bean.");
%>
Java bean name is: <%=testBean.getName()%>
</center></body></html>

5 .好了Q重启TomcatQ启动浏览器Q输入http://localhost:8080/myapp/TestBean.jsp 如果看到输出Java bean name is: This is a test java bean.p明编写的Bean成功了?br />
q样完成了整个Tomcat下的jsp、servlet和javabean的配|。接下来需要做的事情就是多看书、多d人的好代码,自己多动手写代码以增己在q方面开发的能力了?br />
jvm应填写到
c:\j2sdk\bin

l你一个简单的配置Q:Q:

JSP环境配置心得

首先要说的是Q用jdk+tomcat完全可以配置我们的jsp服务器,不再需要其实Q何东东,有很多文章介l了ApacheQ其实根本用不着Q一般的学习调试tomcat完全可以胜Q了?br />
安装jdk后,tomcat在安装之前会自动扑ֈjdk的安装\径,一路点?下一?Q经q一D|间的文g复制Q最?close"Q完成comcat的安装?br />
您最好去下蝲一个版本较高的tomcatQ比?.1以上的,因ؓ它不需要设|太多的pȝ变量Q右?我的电脑"Q选择"属?->"高"->"环境变量"->"pȝ变量"Q新Z个TOMCAT_HOMEQD|成你的tomcat所在的路径Q比如:D:\Program Files\Apache Group\Tomcat 5.5Q配|完成?br />
从开始菜单中扑ֈtomcat选项Q一般打开序是:开?>E序->Apache Tomcat 5.5Q选择"Start Tomcat"Q让jsp服务器开始运行,此时会打开一个类似Dos的窗口,会显CZ些相关的信息?br />
如果您用代理上|,一定要先撤掉代理,不然您的jspE序永远也得不到执行。如果不是代理的Q这一步就跌了?br />
打开览器,在地址栏中输入Qhttp://localhost:8080Q如果看到有老虎Q我也不知道是老虎q是猫)的画面,恭喜您,您成功了一半?br />
先来享受一下成功的喜悦吧,误入下面的代码Q?br />
<html>
<head>
<title>First Page</title>
</head>
<body>
<H3>Today is: h
<%= new java.util.Date() %>
</H3>
</body>
</html>

该E序保存?First.jspQ放到Tomcat的ROOT目录下,然后在浏览器的地址栏中输入Qhttp://localhost:8080/First.jspQ?First.jsp跟我们保存的文g名的大小写要一?回RQ如果不出意外,应该可以看到形如Today is: h Fri Apr 11 08:32:38 CST 2003 的结果?br />
注意QROOT是tomcat的默认虚拟目录,如果要改成自q虚拟目录怎么办呢Q请l箋往下看吧?br />
要改成自q虚拟目录Q就要请出server.xml来了Q该文g是一个配|文Ӟ在Tomcat\conf目录下,使用M文本~辑软g都能打开它,我们先找C面一句:

<Connector className="org.apache.coyote.tomcat4.CoyoteConnector"
port="8080" minProcessors="5" maxProcessors="75"
enableLookups="true" redirectPort="8443"
acceptCount="100" debug="0" connectionTimeout="20000"
useURIValidationHack="false" disableUploadTimeout="true" />

q里的port="8080"是端口Q我们完全可以用别的端口来代替,但不能是被系l占用的端口Q?--1023Q,q里单提一下?br />
下面我们再往下找Q会发现以下的语句:

</Context>
</Host>

我们应该找到这两个语句Q如果不懂E文,您就认定q两个语句好了。然后我们将该语句更改如下:

</Context>
<Context path="/myjsp" debug="0" docBase="e:/myjsp" reloadable="true">
</Context>
</Host>

q里的path="/myjsp"是我们配|的虚拟目录了,以后在地址栏中输入http://localhost:8080/myjsp卛_。而docBase="e:/myjsp" 则是机器本地路径Q他们通过q个语句形成一个映关p,其它照抄?br />
上面的First.jsp文g攑ֈe:/myjsp目录下,输入http://localhost:8080/myjsp/First.jspQ是不是有一U喜上眉梢的感觉Q?br />
在论坛里我见得最多的是很多Z知道javaBean文g攑ֈ哪里Q老实说开始我也不知道Q更令h不解的是Q十个h有九U不同的说法Q这更让我们茫然。其实这问题也不是我们想像的那么复杂Q我们以一个例子说明:

先徏立一个javaE序Q代码如下:

package hall;
public class SimpleBean {
private String message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}

保存为SimpleBean.javaQ编译后会生成一个包Q其实就相当于一个目录,也就是SimpleBean.class会存攑֜hall目录中,暂且保存hQ将来备用?br />
再输入以下代码:

<HTML>
<HEAD>
<TITLE>Reusing JavaBeans in JSP</TITLE>
</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
Reusing JavaBeans in JSP</TABLE>
</CENTER>
<P>
<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test" property="message" value="Hello WWW" />
<H1>Message: <I>
<jsp:getProperty name="test" property="message" />
</I></H1>
</BODY>

保存在我们刚才徏立的虚拟目录e:/myjsp下面Qƈ命名为:BeanTest.jsp?br />
现在我们应该hallQ包Q目录放在哪儿呢Q别急,我们先在e:/myjsp下徏立一个文件夹WEB-INFQ然后再在WEB-INF下徏立一个classes文g夹,最后将hall目录攑ֈclasses下,当然Qhall下的字节码文件SimpleBean.class也一q要U过来,而SimpleBean.java和BeanTest.jsp攑ֈ同一目录吧(可以不需要放的,自己试试Q?br />
重新启动机器Q如果您试了好多ơ都不行Q这一步一定要做)Q在览器中输入Qhttp://localhost:8080/myjsp/BeanTest.jspQ您看到了什么?呵,别告诉我您什么都没看刎ͼ那肯定是您设|的问题了?br />
Java学习 - 技术文章中?/b>

初学者问的诸如:《怎样配置环境变量》《怎样q行Servlet》啊Q这L问题太多了,现在我写一个初学者入门必读,以便对初学者有指导作用Q?br />
首先是下载工P

我徏议初学者用EditplusQJDKQ我觉得如果用例如JBQEclipseQJCreatorQ虽然刚开始的时候比较方便,但是初学者门不知道怎样配置环境变量Q?br />
从而难以达到知其然Q知其所以然的地?br />
可以通过如下地址下蝲Q?br />
Editplus(最新版本是v2.11)Qhttp://count.skycn.com/softdown.php?id=3641&url=http://sc-http.skycn.net/down/epp211a_cn.exe(要照注册码就自己扑֐Q网上很多的Q?br />
JDK(最新版本是Java2sdk1_5_0)Qhttp://192.18.97.54/ECom/EComTicketServlet/BEGIN30AA3B63E5C2F61C8C26F84B78970A98/-2147483648/926882595/1/627578/627410/926882595/2ts+/westCoastFSEND/jdk-1.5.0_04-oth-JPR/jdk-1.5.0_04-oth-JPR:3/jdk-1_5_0_04-windows-i586-p.exeQ这是For WindowsQ?br />
然后是安装JDKQ我是把它装Cc:\JDK目录下面Q?br />
然后是CLASSPATH的问题了Q?br />
正如操作pȝ利用PATH来搜索可执行E序一PJavaq行环境也会遍历CLASSPATH来查扄Q即便是HelloWorldq样单的E序QJVM也会遍历

CLASSPATH定义的每一个\径,直到扑ֈ相应的文件ؓ止?br />
怿大家用的pȝ不是2k是XPQ然后就应当如下讄PathQ?br />
我的电脑->属?>高->环境变量

然后在环境变量的Path后面q加: C:\JDK\bin;.;C:\JDK\lib

也可以这样配|?C:\JDK\bin;.;C:\JDK\lib\dt.jar;C:\JDK\lib\tools.jar

★记?环境变量中的 . 切记不能,它表C当前\径,如果掉出现的错误等会就_

dt.jar是关于运行环境的cdQtools.jar是关于一些工Lcd

如果没有配置:C:\JDK\binQ则会出?" javac?不是内部或外部命令,也不是可q行的程序或批处理文件?q样的错误?br />
然后下面p写程序了Q?br />
首先?HelloWorld.java),打开EditplusQ新Z个Java文gQ请照着如下输入Q要一字不漏,q且分清大小写:

public class HelloWorld{
public static void main(String[] args){
System.out.println("Hello,World!");
}
}

然后把这个文件保?ctrl + s)到HelloWorld.java,C大小写一定要分清Q是HelloWorld.java不是helloworld.java或者其它的

下面pq行了,开?>q行->cmd

在控制台中把目录切换到当前目录:

javac HelloWorld.java
java HelloWorld

你就会在控制C看见输出的Hello,World!(没出来?我把电脑吃了Q))

javac是编译命令,它把HelloWorld.java~译成HelloWorld.class

java是解释命oQJVM把HelloWorld.class解释执行.

在这个时候:

1。如果出现Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld

那就是你在环境变量中没有加上那个.(dot)

2。如果出现Exception in thread "main" java.lang.NoSuchMethodError: main

或者HelloWorld.java:1: Public class helloworld must be defined in a file called

"HelloWorld.java".

那就是你没有分清大小写的写入q个HelloWorldQ或者保存得时候没有保存ؓHelloWorld.java

q个名字一定要跟public class的名字一?br />
对于环境变量的问题就说到q里Q下面我先所说怎么在Editplus里面~译和运行,在ToolsQ?gt;参数讄->配置用户工具

1.d工具Q添加应用程序)

菜单文字QCompile Java Program

E序QC:\JDK\bin\javac.exe

参数Q文件名U?br />
初始目录Q文件目?br />
2.d工具Q添加应用程序)

菜单文字QRun Java Program

E序QC:\JDK\bin\java.exe

参数Q文件名Uͼ不含扩展名)

初始目录Q文件目?br />
工具l名U可以随便添Q比如Debug Java Program

然后在Tools的下拉菜单中Q你׃看见Compile Java Program以及Run Java Programq两个选项Q以后你可以利用ctrl + 1~译和ctrl Q?q行E序?br />
下面p论Servlet的运行:

首先要运行ServletQ则需要JSP/Servlet containerQ我初学者用Tomcat

TomcatQ最新版?.5Q:http://apache.justdn.org/jakarta/tomcat-5/v5.5.9/bin/jakarta-tomcat-5.5.9.exe然后把这个压~包解压刎ͼ

C:\Tomcat

然后再配|环境变量:

d三个pȝ变量Q?br />
JAVA_HOME: C:\JDK
TOMCAT_HOME: C:\Tomcat
CLASSPATH: %JAVA_HOME%\lib;%TOMCAT_HOME%\lib

Tomcat的环境变量就配置完毕了,下面验Tomcat是否能够q行Q?br />
在控制台中{到C:\Tomcat\binq个目录Q运行startupQ然后回出现一个窗口,q蟩一大串东西Q最后表CServer已经q行

在浏览器中输入http://localhost:8080Q出现欢q界面,则表CTomcat没问题了

然后和上面一P写入你的W一个Servlet

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloWorld extends HttpServlet
{
public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException
{
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<html><head><title>");
out.println("This is my first Servlet");
out.println("</title></head><body>");
out.println("<h1>Hello,World!</h1>");
out.println("</body></html>");

}
}

然后照样用javac HelloWorld.java来编译这个文Ӟ如果出现无法import javax.servlet.*

那么是应该把C:\Tomcat\common\lib里面的servlet.jarQ根据实际来看)文g拯到C:\JDK\jre\lib\ext中,再次~译Q就没有问题了!

然后在Tomcat目录里面的C:\Tomcat\webapps\ROOT里面按如下的文gl构Q?br />
ROOT\index.html
ROOT\welcom.jsp
ROOT\WEB-INF\lib\MyServlet.jarQ如果你的servlet?class打成?jar文gQ则攑֜lib下面)
ROOT\WEB-INF\classes\HelloWorld.class(把上面生成的HelloWorld.class文g攑֜q个里面)

然后在浏览器中输入http://localhost:8080/servlet/HelloWorld,于是Server众望所归的报错?Error 404--Not Found

怎么回事呢?

Servlet必须使用C:\Tomcat\webapps\ROOT\WEB-INFq个目录下面的web.xml文gq行注册Q用EP打开q个web.xml文gQ在里面加入

<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/servlet/helloworld</url-pattern>
</servlet-mapping>

q样的结?br />
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>HelloWorld</servlet-class>
</servlet>

表示指定包含的servletc?
而以下的l构

<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/servlet/HelloWorld</url-pattern>
</servlet-mapping>

表示指定HelloServlet应当映射到哪一UURL模式?br />
在修改web.xml完毕q后Q重新启动ServerQ然后再输入http://localhost:8080/servlet/HelloWorldQ那么偌大一个Hello,World!{着你呢?

天外飞仙 2006-06-08 11:04 发表评论
]]>
JDBCq接MySQLhttp://www.tkk7.com/songfei/articles/42116.html天外飞仙天外飞仙Thu, 20 Apr 2006 02:56:00 GMThttp://www.tkk7.com/songfei/articles/42116.htmlhttp://www.tkk7.com/songfei/comments/42116.htmlhttp://www.tkk7.com/songfei/articles/42116.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/42116.htmlhttp://www.tkk7.com/songfei/services/trackbacks/42116.html

JDBCq接MySQL

加蝲及注?/span>JDBC驱动E序

Class.forName("com.mysql.jdbc.Driver");

Class.forName("com.mysql.jdbc.Driver").newInstance();

JDBC URL 定义驱动E序与数据源之间的连?/span>

标准语法Q?/p>

<protocolQ主要通讯协议Q?/span>>:<subprotocolQ次要通讯协议Q即驱动E序名称Q?/span>>:<data source identifierQ数据源Q?/span>>

MySQL?/span>JDBC URL格式Q?/span>

jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][&param2=value2]?

 

CZQ?/span>jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password

 

常见参数Q?/p>

user                       用户?/span>

password                  密码

autoReconnect                  联机p|Q是否重新联机(true/falseQ?/span>

maxReconnect              试重新联机ơ数

initialTimeout               试重新联机间隔

maxRows                   传回最大行?/span>

useUnicode                 是否使用Unicode字体~码Q?/span>true/falseQ?/span>

characterEncoding          何种~码Q?/span>GB2312/UTF-8/?/span>Q?/span>

relaxAutocommit            是否自动提交Q?/span>true/falseQ?/span>

capitalizeTypeNames        数据定义的名UC大写表示

建立q接对象

String url="jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password";

Connection con = DriverManager.getConnection(url);

建立SQL陈述式对象(Statement ObjectQ?/span>

Statement stmt = con.createStatement()Q?/span>

执行SQL语句

executeQuery()

String query = "select * from test";

ResultSet rs=stmt.executeQuery(query);

l果?/span>ResultSet

while(rs.next())

{rs.getString(1);rs.getInt(2);}

executeUpdate()

String upd="insert into test (id,name) values(1001,xuzhaori)";

int con=stmt.executeUpdate(upd);

execute()

CZQ?/p>

try

 

 

{

 

 

 

 

 

}

catch(SQLException sqle)

{

}

finally

{

}

 

Javacd?/span>SQLcd技术手?/span>P421

PreparedStatementQ预~语句)

PreparedStatement stmt = conn.prepareStatement("insert into test(id,name)values(?,?)");

stmt.setInt(1,id);

stmt.setString(2,name);

注:一旦设定语句的参数值后Q就可以多次执行改语句,直到调用clearParametersQ)Ҏ他清除为止

CallableStatementQ预储程序)技术手?/span>P430

JDBC2.0使用

ResultSet对象中的光标上下自由Ud

Statement stmt = con.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);

ResultSet rs=stmt.executeQuery("select * from test");

 

public Statement createStatement(int resultSetType,int resultSetConcuttency) throws SQLException

 

resultSetType

TYPE_FORWARD_ONLY            只能使用nextQ)Ҏ?/span>

TYPE_SCROLL_SENSITIVE        可以上下UdQ可以取得改变后的倹{?/span>

TYPE_SCROLL_INSENSITIVE      可以上下Ud?/span>

resultSetConcuttency

CONCUR_READ_ONLY        只读

CONCUR_UPDATABLE        ResultSet对象可以执行数据库的新增、修攏V和U除

 

直接使用ResultSet对象执行更新数据

新增数据

Statement stmtQ?/span>con.createStatementQ?/span>ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLEQ?/span>;

ResultSet uprs=stmt.executeQuery("select * from test");

uprs.moveToInsertRow();

uprs.updateInt(1,1001);

uprs.updateString(2,"许召?/span>");

uprs.insertRow;

更新数据

Statement stmtQ?/span>con.createStatementQ?/span>ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLEQ?/span>;

ResultSet uprs=stmt.executeQuery("select * from test");

uprs.last();

uprs.updateString("name","xuzhaori");

uprs.updateRow;

删除数据

Statement stmtQ?/span>con.createStatementQ?/span>ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLEQ?/span>;

ResultSet uprs=stmt.executeQuery("select * from test");

uprs.absolute(4);

uprs.deleteRow();

 

批处?/p>

con.setAutoCommit(false);  关闭自动认可模式

Statement stmt=con.createStatement();

int[] rows;

stmt.addBatch("insert into test values(1001,xuzhaori)");

stmt.addBatch("insert into test values(1002,xuyalin)");

rows=stmt.executeBatch();

con.commit();  没有M错误Q执行批处理stmt.executeBatch();

 

JNDI-数据源(Data SourceQ与q接池(Connection PoolQ?/span>

Tomcat?/span>JDBC数据源设|?/span>  技术手?/span>P439

q接池工PProxool Var 0.8.3 技术手?/span>P446

web.xml

<?xml version="1.0" encoding="ISO-8859-1"?>

<!--<?xml version="1.0" encoding="GB2312"?>-->

 

<web-app xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

version="2.4">

?

<servlet>

<servlet-name>ServletConfigurator</servlet-name>

<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>

 

<init-param>

<param-name>propertyFile</param-name>

<param-value>WEB-INF/classes/Proxool.properties</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

后端l计端口d下列

<servlet>

<servlet-name>Admin</servlet-name>

<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>

</servlet>

 

<servlet-mapping>

<servlet-name>Admin</servlet-name>

<url-pattern>/Admin</url-pattern>

</servlet-mapping>

 

?

 

</web-app>

 

配置Proxool.properties

jdbc-0.proxool.alias=JSPBook

jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver

jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/sample_db?user=root&password=browser&useUnicode=true&characterEncoding=UTF-8

jdbc-0.proxool.maximum-connection-count=10

jdbc-0.proxool.prototype-count=4

jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE

jdbc-0.proxool.verbose=true

jdbc-0.proxool.statistics=10s,1m,1d    后端l计接口d此行

jdbc-0.proxool.statistics-log-level=DEBUG

使用Proxoolq接?/span>

Connectioncon = DriverManager.getConnection("proxool.JSPBook");

Statementstmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);

String query = "SELECT * FROM employee";

ResultSetrs = stmt.executeQuery(query);



天外飞仙 2006-04-20 10:56 发表评论
]]>
以前的bloghttp://www.tkk7.com/songfei/articles/36820.html天外飞仙天外飞仙Wed, 22 Mar 2006 04:28:00 GMThttp://www.tkk7.com/songfei/articles/36820.htmlhttp://www.tkk7.com/songfei/comments/36820.htmlhttp://www.tkk7.com/songfei/articles/36820.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/36820.htmlhttp://www.tkk7.com/songfei/services/trackbacks/36820.html阅读全文

天外飞仙 2006-03-22 12:28 发表评论
]]>
jvm装入原理http://www.tkk7.com/songfei/articles/36770.html天外飞仙天外飞仙Wed, 22 Mar 2006 01:16:00 GMThttp://www.tkk7.com/songfei/articles/36770.htmlhttp://www.tkk7.com/songfei/comments/36770.htmlhttp://www.tkk7.com/songfei/articles/36770.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/36770.htmlhttp://www.tkk7.com/songfei/services/trackbacks/36770.htmljvm装入原理

操作pȝ装入jvm是通过jdk中java.exe来完?通过下面4步来完成jvm环境.
1.创徏jvm装蝲环境和配|?br />2.装蝲jvm.dll
3.初始化jvm.dllq挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装蝲q处理classcR?br />

在我们运行和调试javaE序的时?l常会提C个jvm的概?jvm是javaE序q行的环?但是他同时一个操作系l的一个应用程序一个进E?因此他也有他自己的运行的生命周期,也有自己的代码和数据I间.
首先来说一下jdkq个东西,不管你是初学者还是高?是j2eeE序员还是j2seE序?jdkL在帮我们做一些事?我们在了解java之前首先大师们会l我们提供说jdkq个东西.它在java整个体系中充当着什么角色呢?我很惊叹sun大师们设计天?能把一个如此完整的体系l构化的如此完美.jdk在这个体pM充当一个生产加工中?产生所有的数据输出,是所有指令和战略的执行中?本n它提供了java的完整方?可以开发目前java能支持的所有应用和pȝE序.q里说一个问?大家会问,那ؓ什么还有j2me,j2eeq些东西,q两个东西目的很?分别用来化各自领域内的开发和构徏q程.jdk除了jvm之外,q有一些核心的API,集成API,用户工具,开发技?开发工具和API{组?br />好了,废话说了那么?来点于主题相关的东西?jvm在整个jdk中处于最底层,负责于操作系l的交互,用来屏蔽操作pȝ环境,提供一个完整的javaq行环境,因此也就虚拟计算? 操作pȝ装入jvm是通过jdk中java.exe来完?通过下面4步来完成jvm环境.
1.创徏jvm装蝲环境和配|?br />2.装蝲jvm.dll
3.初始化jvm.dllq挂界到JNIENV(JNI调用接口)实例
4.调用JNIEnv实例装蝲q处理classcR?br />一Qjvm装入环境Qjvm提供的方式是操作pȝ的动态连接文Ӟ既然是文仉׃个装入\径的问题Qjava是怎么找这个\径的呢?当你在调用java test的时候,操作pȝ会在path下在你的java.exeE序Qjava.exe通过下面一个过E来定jvm的\径和相关的参数配|了Q下面基于windows的实现的分析Q?br />  首先查找jre路径Qjava是通过GetApplicationHome api来获得当前的java.exel对路径Qc:\j2sdk1.4.2_09\bin\java.exe,那么它会截取到绝对\径c:\j2sdk1.4.2_09\Q判断c:\j2sdk1.4.2_09\bin\java.dll文g是否存在Q如果存在就把c:\j2sdk1.4.2_09\作ؓjre路径Q如果不存在则判断c:\j2sdk1.4.2_09\jre\bin\java.dll是否存在Q如果存在这c:\j2sdk1.4.2_09\jre作ؓjre路径Q如果不存在调用GetPublicJREHome查HKEY_LOCAL_MACHINE\Software\JavaSoft\Java Runtime Environment\“当前JRE版本号”\JavaHome的\径ؓjre路径?br />  然后装蝲jvm.cfg文gJRE路径+\lib+\ARCHQCPU构架Q?\jvm.cfgARCHQCPU构架Q的判断是通过java_md.c中GetArch函数判断的,该函Cwindowsq_只有两种情况QWIN64的‘ia64’,其他情况都ؓ‘i386’。以我的ZQC:\j2sdk1.4.2_09\jre\lib\i386\jvm.cfg.主要的内容如下:
-client KNOWN
-server KNOWN
-hotspot ALIASED_TO -client
-classic WARN
-native ERROR
-green ERROR
在我们的jdk目录中jre\bin\server和jre\bin\client都有jvm.dll文g存在Q而java正是通过jvm.cfg配置文g来管理这些不同版本的jvm.dll的.通过文g我们可以定义目前jdk中支持那些jvm,前面部分QclientQ是jvm名称Q后面是参数QKNOWN表示jvm存在QALIASED_TO表示l别的jvm取一个别名,WARN表示不存在时找一个jvm替代QERROR表示不存在抛出异常.在运行java XXX是,java.exe会通过CheckJvmType来检查当前的jvmcdQjava可以通过两种参数的方式来指定具体的jvmcdQ一U按照jvm.cfg文g中的jvm名称指定Q第二种Ҏ是直接指定,它们执行的方法分别是“java -J”、“java -XXaltjvm=”或“java -J-XXaltjvm=”。如果是W一U参C递方式,CheckJvmType函数会取参数?J’后面的jvm名称Q然后从已知的jvm配置参数中查扑֦果找到同名的则去掉该jvm名称前的?’直接返回该|而第二种ҎQ会直接q回?XXaltjvm=”或?J-XXaltjvm=”后面的jvmcd名称Q如果在q行java时未指定上面两种Ҏ中的M一U参敎ͼCheckJvmType会取配置文g中第一个配|中的jvm名称Q去掉名U前面的?’返回该倹{CheckJvmType函数的这个返回g在下面的函数中汇同jre路径l合成jvm.dll的绝对\径。如果没有指定这会用jvm.cfg中第一个定义的jvm.可以通过set _JAVA_LAUNCHER_DEBUG=1在控制台上测试.
最后获得jvm.dll的\径,JRE路径+\bin+\jvmcd字符?\jvm.dll是jvm的文件\径了Q但是如果在调用javaE序时用-XXaltjvm=参数指定的\径path,q接用path+\jvm.dll文g做ؓjvm.dll的文件\径.
  二:装蝲jvm.dll
通过W一步已l找Cjvm的\径,java通过LoadJavaVM来装入jvm.dll文gQ装入工作很单就是调用windows API函数Q?br />LoadLibrary装蝲jvm.dll动态连接库Q然后把jvm.dll中的导出函数JNI_CreateJavaVM和JNI_GetDefaultJavaVMInitArgs挂接到InvocationFunctions变量的CreateJavaVM和GetDefaultJavaVMInitArgs函数指针变量上。jvm.dll的装载工作宣告完成?br />  三:初始化jvmQ获得本地调用接口,q样可以在java中调用jvm的函CQ调用InvocationFunctionsQ?gt;CreateJavaVM也就是jvm中JNI_CreateJavaVMҎ获得JNIEnvl构的实例.
  四:q行javaE序Q?br />javaE序有两U方式一U是jar包,一U是class. q行jar,java -jar XXX.jarq行的时候,java.exe调用GetMainClassName函数Q该函数先获得JNIEnv实例然后调用javacjava.util.jar.JarFileJNIEnv中方法getManifest()q从q回的Manifest对象中取getAttributes("Main-Class")的值即jar包中文gQMETA-INF/MANIFEST.MF指定的Main-Class的主cd作ؓq行的主cR之后main函数会调用java.c中LoadClassҎ装蝲该主c(使用JNIEnv实例的FindClassQ。main函数直接调用java.c中LoadClassҎ装蝲该类。如果是执行classҎ。main函数直接调用java.c中LoadClassҎ装蝲该类?/jvmcd名称>

然后main函数调用JNIEnv实例的GetStaticMethodIDҎ查找装蝲的classȝ?br />“public static void main(String[] args)”方法,q判断该Ҏ是否为publicҎQ然后调用JNIEnv实例?br />CallStaticVoidMethodҎ调用该javacȝmainҎ



天外飞仙 2006-03-22 09:16 发表评论
]]>
多重提交处理(? http://www.tkk7.com/songfei/articles/36410.html天外飞仙天外飞仙Mon, 20 Mar 2006 11:31:00 GMThttp://www.tkk7.com/songfei/articles/36410.htmlhttp://www.tkk7.com/songfei/comments/36410.htmlhttp://www.tkk7.com/songfei/articles/36410.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/36410.htmlhttp://www.tkk7.com/songfei/services/trackbacks/36410.html 多重提交处理(?
?当然是一U改善,但我们还是需要一些其他方法。仍然有许多情况会导 致错误。如果用h下了览器的后退键或者刷C整个|页会怎么P如果用户的浏览器关闭了JavaScript的功能或者浏览器不能处理会如何呢Q我们还是可以处理这个问题的Q但是ؓ了取代防止多重提交,我们需要在后端通过表单处理的服务端程序处理它们?br />
  Z理解如何解决多重提交问题Q我们必首先理解服务端程序会?sessions)机制。每个h都知道,HTTP协议的固有性质中ƈ不对状态(客户端请求信息的历史记录Q进行记录。ؓ了处理状态,我们需要一些方法ɋ览器能够将当前h与其他大量请求联pv来。会?session)E序提供l我们一个解册个问题的Ҏ。HttpServlet中的ҎdoGet()和doPost()使用了两个指定的参数QHttpServletRequest和HttpServletResponse。服务端程序请求参C我们能够讉K会话(session)。会话ؓ讉K和存储状态提供了机制?br />
  什么才是会?session)呢?会话(session)包括很多内容Q?br />状态集——由web服务器管理ƈ且由特定用户所有请求所׃n的详l表C描q?br />存储I间——通过HttpSession接口臛_HttpServlets所需状态数据和定义存储h?br />
  在我们具体了解如何用服务器端方案解x们的问题之前Q我们还需要了解服务端程序会?session)的生命周期。与EJB及其他服务端实体一P会话在生存期中通过一个定义的状态集q行。下图显CZ会话的生命周期。Servlet可在三种特定的状态中转换Q不存在(does not exist)Q新?new)Q非新徏(not new/或用中in-use)?br />
?Q服务端程序会?session)生命周期
image

a) 会话在开始时处于不存在状态。会话从q一状态开始或者由于许多原因而返回到此状态。最主要的原因就是用户以前没有访问过q些状态或者是׃用户qQ超Ӟ站点或退Z会话被设|ؓ无效?br />b) 当会话被建立时便会从“不存在”状态进入“新建”状态。新Z非新建状态的区分是非帔R要的Q因为HTTP协议不记录状态信息。根据servlet详细说明书描qͼ在客Lq回会话l服务端之前会话不能够进入非新徏状态(即从预期会话转变为当前会话)。这样在客户端不知道或者还没有军_加入会话时会话处于新建状态?br />c) 当会话通过cookie或是重写URL()q回到服务器Ӟ会话变为“用中”或“非新徏”状态?br />d) 通过各种get与setҎl箋使用会话会其维持在“用中”状态?br />e) 当会话由于长旉没有被用而超时或昑ּ的被设ؓ无效则会发生图中所C的5以及6所标识的{UR不同应用服务器用不同方式处理超时。BEA公司的WebLogic使应用部|者能够通过与web应用一h包的Ҏ部v描述脚本(weblogic.xml)讄会话时的时限?br />
  现在我们了解了会话的生命周期Q那么如何获得一个会话ƈ有效的用它呢?接口HttpServletRequest提供了两个关于会话的ҎQ?br />
public HttpSession getSession()q回一个新的会话或一个已存在的会话?br />
  如果提供一个有效的会话IDQ可能是通过cookieQ则q回一个存在的会话。返回新的会话可能会有许多原因:用户最初的会话Q无法提供有效会话IDQ;会话过有效旉Q提供了会话IDQ;一个无效的会话Q提供了会话IDQ;或者是明确指出会话无效Q提供了会话IDQ?br />
  public HttpSession getSession(boolean)可能q回C话、存在的会话或者空。getSession(true)可能返回一个存在的会话。否则创Z个新会话。getSession(false) 可能返回一个存在的会话否则q回I?br />
  我们q是只解决了手边一半的问题。我们希望能够蟩q会话“新建”状态ƈ自动的{换到会话“用中”状态。我们能够通过重定向浏览器到处理服务端程序自动的实现q些。表3把服务端程序会话逻辑和重定向用户端与有效会话到处理服务端程序的能力l合在一赗?br />
?QRedirectServlet.java
01: package multiplesubmits;
02:
03: import java.io.*;
04: import java.util.Date;
05: import javax.servlet.*;
06: import javax.servlet.http.*;
07:
08: public class RedirectServlet extends HttpServlet{
09: public void doGet (HttpServletRequest req, HttpServletResponse res)
10: throws ServletException, IOException {
11: HttpSession session = req.getSession(false);
12: System.out.println("");
13: System.out.println("-------------------------------------");
14: System.out.println("SessionServlet::doGet");
15: System.out.println("Session requested ID in Request:" +
16: req.getRequestedSessionId());
17: if ( null == req.getRequestedSessionId() ) {
18: System.out.println("No session ID, first call,
creating new session and forwarding");
19: session = req.getSession(true);
20: System.out.println("Generated session ID in Request: " +
21: session.getId());
22: String encodedURL = res.encodeURL("/RedirectServlet");
23: System.out.println("res.encodeURL(\"/RedirectServlet\");="
+encodedURL);
24: res.sendRedirect(encodedURL);
25: //

26: // RequestDispatcher rd = getServletContext().getRequestDispatcher(encodedURL);
27: // rd.forward(req,res);

28: //
29: return;
30: }
31: else {
32: System.out.println("Session id = " +
req.getRequestedSessionId() );
33: System.out.println("No redirect required");
34: }
35:
36: HandleRequest(req,res);
37: System.out.println("SessionServlet::doGet returning");
38: System.out.println("------------------------------------");
39: return;
40: }
41:
42: void HandleRequest(HttpServletRequest req, HttpServletResponse res)
43: throws IOException {
44: System.out.println("SessionServlet::HandleRequest called");
45: res.setContentType("text/html");
46: PrintWriter out = res.getWriter();
47: Date date = new Date();
48: out.println("<html>");
49: out.println("<head><title>Ticket Confirmation</title></head>");
50: out.println("<body>");
51: out.println("<h1>The Current Date And Time Is:</h1><br>");
52: out.println("<h3>" + date.toString() + "</h3>");
53: out.println("</body>");
54: out.println("</html>");
55: System.out.println("SessionServlet::HandleRequest returning");
56: return;
57: }
58: }

  q如何解x们的问题的呢Q测试上面这D代码显C出?1行我们尝试获得一个会话的句柄。在17行我们通过ؓI的会话ID或检有效会话ID来确定存在一个有效的会话。如果不存在会话执?8-29行程序。通过下述Ҏ我们处理多重提交的问题,?9行首先徏立一个会话,?2行用URL~码dC话IDQƈ且在24行重定向我们的服务端程序到新的URL~码?br />
  不熟悉重写URL的读者可参?5行到23行。一个HttpServlet对象可以重写URL。这个过E将一个会话ID插入到URL。底层的应用服务器能够自动的用编码URL提供l服务端程序或JSP一个存在的会话。由于这依赖于应用服务器Qؓ了上面的例子可以运行,你可能需要设|环境URL能够重写Q?br />

ȝ

  在这文章中Q我们讨Z多重提交问题的许多解x案。每一个方案都有优点和~陷。在处理问题Ӟ要清晰的理解和权衡解x案多斚w的优点和~陷。我们最后的例子有利于解军_L额外重复的访问和览的问题。JavaScript脚本的方法是最好的Q但是需要客L支持才能够运行。和其他M问题一P会有一大堆解决ҎQ每个方案都会有其自q优缺炏V掌握每个方案的优缺点,有利于我们ؓ解决问题作出最好的选择?br />

matrix开源技?/a>l?a target="_new">onjava授权译q发?
如果你对此文章有M看法或徏?请到Matrix论坛发表您的意见.
注明: 如果对matrix的翻译文章系列感兴趣,L?a target="_new">oreilly和javaworld文章译计划查看详细情况
您也可以点击-fpwang查看译作者的详细信息


天外飞仙 2006-03-20 19:31 发表评论
]]>
新关键字http://www.tkk7.com/songfei/articles/36334.html天外飞仙天外飞仙Mon, 20 Mar 2006 07:33:00 GMThttp://www.tkk7.com/songfei/articles/36334.htmlhttp://www.tkk7.com/songfei/comments/36334.htmlhttp://www.tkk7.com/songfei/articles/36334.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/36334.htmlhttp://www.tkk7.com/songfei/services/trackbacks/36334.htmlif (argHttpServletRequest instanceof OmHttpServletRequest) {

天外飞仙 2006-03-20 15:33 发表评论
]]>
java容器与框架的区别http://www.tkk7.com/songfei/articles/36303.html天外飞仙天外飞仙Mon, 20 Mar 2006 05:19:00 GMThttp://www.tkk7.com/songfei/articles/36303.htmlhttp://www.tkk7.com/songfei/comments/36303.htmlhttp://www.tkk7.com/songfei/articles/36303.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/36303.htmlhttp://www.tkk7.com/songfei/services/trackbacks/36303.html待研I?/p>

天外飞仙 2006-03-20 13:19 发表评论
]]>
System.currentTimeMillis()http://www.tkk7.com/songfei/articles/36301.html天外飞仙天外飞仙Mon, 20 Mar 2006 05:14:00 GMThttp://www.tkk7.com/songfei/articles/36301.htmlhttp://www.tkk7.com/songfei/comments/36301.htmlhttp://www.tkk7.com/songfei/articles/36301.html#Feedback4http://www.tkk7.com/songfei/comments/commentRss/36301.htmlhttp://www.tkk7.com/songfei/services/trackbacks/36301.html      得到了这个毫U数Q我们自׃可以v现在的年月日周时Q但是这不是我们去计的Q因为有Calendar。Calendar最l出的结果就是年月日周时时区?br />

天外飞仙 2006-03-20 13:14 发表评论
]]>
关于Config参数和Context参数的访?/title><link>http://www.tkk7.com/songfei/articles/36295.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Mon, 20 Mar 2006 05:05:00 GMT</pubDate><guid>http://www.tkk7.com/songfei/articles/36295.html</guid><wfw:comment>http://www.tkk7.com/songfei/comments/36295.html</wfw:comment><comments>http://www.tkk7.com/songfei/articles/36295.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/songfei/comments/commentRss/36295.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/songfei/services/trackbacks/36295.html</trackback:ping><description><![CDATA[ <div id="swmmcsc" class="ContentFont" id="NewaspContentLabel" style="PADDING-RIGHT: 10px; DISPLAY: block; PADDING-LEFT: 10px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px"> <div>关于Config参数和Context参数的访?br /><br />虽然在论坛中已经回答q不止一?但现在看?真正掌握q两个参数的区别的h5%都不?<br />所以有必要专门写出?供大家学?<br /><br />我们先来回顾一下各U内|对象的作用范围<br /><br />HttpServletRequest,HttpServletResponse:q两个属性的作用范围最?br />旉上:只是本nh和应{完成就失效Q当然{发是把当前的request对象取出来传l另一<br />      个资源,其实本n的request对象q是只生存到本次hl束Qresponse也同栗?br />I间上:只能发送请求的客户端有效?br /><br />HttpSession:一ơ连l到客户端关闭,旉作用范围比上面两个大Q空间Q用范围相同?br /><br />ServletConfig:从一个servlet被实例化后,对Q何客L在Q何时候访问有效,但仅Ҏservlet<br />有效Q一个servlet的ServletConfig对象不能被另一个servlet讉K?br /><br />ServletContext:对Q何servletQQ何h在Q何时间都有效Q这才是真正全局的对象?br /><br />那么QServletConfig参数和ServletContext参数到底应该如何使用Q如何取得?<br /><br />一般来_Ҏ个应用的配置Qؓ了不使用“硬~码”,应该配置为ServletContext参数Q比如字<br />W集讑֮?br /><web-app><br />.................<br /><init-param><br /><param-name>charset</param-name> <br /><param-value>GB2312</param-value> <br /></init-param><br />.................<br /></web-app><br />注意以上格式只是2?以后的标准格式,旧容器(引擎Q采用服务商自己的格式配|。注意它?br />父元素应该是<web-app>也就是说它是对一个应用作用的?br /><br />而如果只有一个特定的servlet要设定的参数Q其它servlet不能׃nQ应该配|ؓServletConfig<br />参数Q如一个读取附件的servlet要用到绝对目录,而别的servlet不会用到Q?br /><servlet><br />        <servlet-name>GetAtt</servlet-name><br /><servlet-class>mail.GetAttServlet</servlet-class><br /><init-param><br /><param-name>absPath</param-name> <br /><param-value>/usr/mail/ax/axman/Maildir/</param-value> <br /></init-param><br /></servlet><br />不用_因ؓ?lt;servlet>标签中已l指定了name和class,也就是说只有mail.GetAttServletq个<br />servlet中才能取到path,而别的Servlet是不能取到的?br /><br />那么如何讉Kq两个对象的参数呢?<br />讉KServletConfig参数Q?br />首先要取得ServletConfig对象Q然后调用它的getInitParameter();Ҏ。要讉K<br />ServletConfig对象Qjsp中直接用config内置对象Q但因ؓ你的JSP~译后的servlet一般不会被<br />加到web.xml中的Q所以一般不会通过jsp来取ҎJSP~译后的servlet的配|参敎ͼ那么在servlet<br />中要得到ServletConfig对象有两U方法:<br /><br />在inii()Ҏ中取刎ͼ通过init的重载方法传?br /><br />.....<br />public class Test extends HttpServlet <br />{<br />ServletConfig config;<br />public void init(ServletConfig config) throws ServletException {<br />this.config = config;<br />}<br />..................<br />}<br />然后在下面的Ҏ中就可以讉Kconfig对象。但要注意,Z保能从构造方法中到到当前servlet?br />config对象Q应该调用父cȝ构造方法:<br />.....<br />public class Test extends HttpServlet <br />{<br />ServletConfig config;<br />public void init(ServletConfig config) throws ServletException {<br />super.init(config);<br />this.config = config;<br />}<br />..................<br />}<br /><br />通过getServletConfig()Ҏ直接到时Q这样做的好处是不必调手工传递属性,惛_M时候都?br />以得到?br /><br />q有W三U方法,要自己实C些接口,q里作ؓ一般讨论就不介l了?br /><br />要访问ServletContext对象Q只要从现有的ServletConfig对象getServletContextQ)可以了Q然?br />调用它的getInitParameter()Ҏ可以获取它的参数?br /><br />按说QServletContext对象的作用域比ServletConfig作用域大Qؓ什么要从ServletConfig中到?br />ServletContext对象呢?我个为:容器保存了很多个ServletContext对象Q请求时容器到底取哪一?br />l你呢?那就取其中包含ServletConfig信息的那个给你,是说取ServletConfig对象的父U对象。就?br />象HttpSession要从requset中取得一P是取那个包含当前requese对象的session对象l你Q这只是?br />的个人想法,q没有来得及看具体实现。反正就q么用吧?/div> </div> <img src ="http://www.tkk7.com/songfei/aggbug/36295.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/songfei/" target="_blank">天外飞仙</a> 2006-03-20 13:05 <a href="http://www.tkk7.com/songfei/articles/36295.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java中的日期加一个月的计?/title><link>http://www.tkk7.com/songfei/articles/31961.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Wed, 22 Feb 2006 06:35:00 GMT</pubDate><guid>http://www.tkk7.com/songfei/articles/31961.html</guid><wfw:comment>http://www.tkk7.com/songfei/comments/31961.html</wfw:comment><comments>http://www.tkk7.com/songfei/articles/31961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/songfei/comments/commentRss/31961.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/songfei/services/trackbacks/31961.html</trackback:ping><description><![CDATA[//請求処理?ヶ月加算したi果(ơ回請求予定)を画面表C?BR>          SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd", Locale.US);<BR>          Date date = simpleDateFormat.parse(selectQuery.getString("SIMEYMD"));<BR>          Calendar calender = Calendar.getInstance();<BR>          calender.setTime(date);<BR>          calender.add(Calendar.MONTH, 1);<BR>          simpleDateFormat.format(calender.getTime());<BR>          argConditionData.setSimeymd(simpleDateFormat.format(calender.getTime()).toString());<img src ="http://www.tkk7.com/songfei/aggbug/31961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/songfei/" target="_blank">天外飞仙</a> 2006-02-22 14:35 <a href="http://www.tkk7.com/songfei/articles/31961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> java中在链接中提取一些信?/title><link>http://www.tkk7.com/songfei/articles/29043.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Mon, 23 Jan 2006 12:03:00 GMT</pubDate><guid>http://www.tkk7.com/songfei/articles/29043.html</guid><wfw:comment>http://www.tkk7.com/songfei/comments/29043.html</wfw:comment><comments>http://www.tkk7.com/songfei/articles/29043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/songfei/comments/commentRss/29043.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/songfei/services/trackbacks/29043.html</trackback:ping><description><![CDATA[在编写JSP/Servlet应用时常帔R要从传入的链接中提取一些信息。HttpServletRequest提供了多个方法,q些Ҏ之间Ҏh。ȝqD例如下,希望能对大家有所帮助?<BR>举例Q?BR><A href="http://localhost:7001/myservlet/somepath/test?someparam=somevalue">http://localhost:7001/myservlet/somepath/test?someparam=somevalue</A> <BR>request.getPathInfo()Q返?somepath/test <BR>request.getRequestURL()Q返?A href="http://localhost:7001/myservlet/somepath/test">http://localhost:7001/myservlet/somepath/test</A> <BR>request.getRequestURI()Q返?myservlet/somepath/test <BR>request.getServletPath()Q返?myservlet <BR>request.getQueryString()Q返回someparam=somevalue <BR><img src ="http://www.tkk7.com/songfei/aggbug/29043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/songfei/" target="_blank">天外飞仙</a> 2006-01-23 20:03 <a href="http://www.tkk7.com/songfei/articles/29043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>配置MyEclipse的WebLogic服务?http://www.tkk7.com/songfei/articles/28867.html天外飞仙天外飞仙Sat, 21 Jan 2006 04:31:00 GMThttp://www.tkk7.com/songfei/articles/28867.htmlhttp://www.tkk7.com/songfei/comments/28867.htmlhttp://www.tkk7.com/songfei/articles/28867.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/28867.htmlhttp://www.tkk7.com/songfei/services/trackbacks/28867.html配置MyEclipse的WebLogic服务?
MyEclipse默认的应用服务器为JBoss3Q这里我们用WebLogic8.1。启动EclipseQ选择“窗口\首选项”菜单,打开首选项对话框。展开MyEclipse下的Application Serversl点Q点击JBoss 3Q选中右面的Disable单选按钮,停用JBoss 3。然后点击WebLogic 8Q选中双的Enable单选按钮,启用WebLogic服务器。同时下面的配置如下Q?
(1)BEA home directoryQD:\BEA。假定WebLogic安装在D:\BEA文g夹中?
(2)WebLogic installation directoryQD:\BEA\weblogic81?
(3)Admin usernameQuser?
(4)Admin passwordQ?2345678?
(5)Execution domain rootQD:\BEA\user_projects\dev?
(6)Execution domain nameQdev?
(7)Execution server nameQadmin?
(8)Hostname:PortNumberQlocalhost:7001?
(9)Security policy fileQD:\BEA\weblogic81\server\lib\weblogic.policy?
(10)JAAS login configuration fileQ省略?
接着展开WebLogic 8l点Q点击JDKQ在双的WLS JDK name处选择WebLogic 8的默认JDK。这里组合框中缺省ؓj2re1.4.2_03Q即之前单独安装的jre。单击Add按钮Q弹出WebLogic > Add JVM对话框,在JRE名称处随便输入一个名字,如jre1.4.1_02。然后在JREȝ录处选择WebLogic安装文g夹中的JDK文g夹,如D:\BEA\jdk141_02Q程序会自动填充Javadoc URL文本框和JREpȝ库列表框。单ȝ定按钮关闭对话框。这时候就可以在WLS JDK namel合框中选择jre1.4.1_02了。之后还要在下面的Optional Java VM argumentsQ如-ms64m -mx64m -Djava.library.path="D:/BEA/weblogic81/server/bin" -Dweblogic.management.discover=false -Dweblogic.ProductionModeEnabled=false
最后点击PathsQ在双的Prepend to classpath列表框中Q通过Add JAR/ZIP按钮Q加入D:\BEA\weblogic81\server\lib\weblogic.jar、D:\BEA\weblogic81\server\lib\webservices.jar。如果用到数据库Q还需把数据库的驱动类库加q来Q这里我们用WebLogic自带的SQL Server数据库驱动库D:\BEA\weblogic81\server\lib\mssqlserver4v65.jar?
xQ?SPAN style="COLOR: #ffa34f">MyEclipse中WebLogic8的配|工作就完成了。下面可以看看在Eclipse中能否启动WebLogic了?自从安装?SPAN style="COLOR: #ffa34f">MyEclipse之后QEclipse工具栏中׃有一个Run/Stop Servers下拉按钮。点击该按钮的下拉部分,选择“WebLogic 8\Start”菜单,卛_始启动WebLogic了。通过查看下面的控制台消息Q就可以知道启动是否成功Q或有什么异常发生。停止WebLogic可选择“WebLogic\Stop”菜单?/FONT>


天外飞仙 2006-01-21 12:31 发表评论
]]>
JSP取得在WEB.XML中定义的参数 http://www.tkk7.com/songfei/articles/28687.html天外飞仙天外飞仙Thu, 19 Jan 2006 10:34:00 GMThttp://www.tkk7.com/songfei/articles/28687.htmlhttp://www.tkk7.com/songfei/comments/28687.htmlhttp://www.tkk7.com/songfei/articles/28687.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/28687.htmlhttp://www.tkk7.com/songfei/services/trackbacks/28687.html
JSP取得在WEB.XML中定义的参数

在WEB.XML文g中设|参?
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "<web-app>


<servlet>
<servlet-name> myjsp </servlet-name>
<jsp-file> /MyJsp.jsp </jsp-file>
<init-param>
<param-name>firstparam</param-name>
<param-value>firstparamvalue</param-value>
</init-param>
</servlet>


<servlet-mapping>
<servlet-name> myjsp </servlet-name>
<url-pattern> /myurl/* </url-pattern>
</servlet-mapping>


</web-app>


下面的程序无法取出在WEB.XML中定义的参数firstparam的值firstparamvalue
<html>
<HEAD><TITLE>my jsp page .jsp</TITLE></HEAD>
My init parameter is <%= application.getInitParameter("firstparam") %>
</html>


下面的程序就可以取出在WEB.XML中定义的参数firstparam的值firstparamvalue
<%
String Str1;
Str1=config.getInitParameter("firstparam");
Out.println(Str1);
%>


因ؓconfig是类javax.servlet.ServletConfig的对?而application 是类 javax.servlet.ServletContext的对?
如果指定WebLogic SERVER的侦听端口ؓ80Q那么在IE中就不用输入端口
http://hostname/myfile.html取代http://hostname:portnumber/myfile.html.



天外飞仙 2006-01-19 18:34 发表评论
]]>
HTTPh头概q?http://www.tkk7.com/songfei/articles/28686.html天外飞仙天外飞仙Thu, 19 Jan 2006 10:32:00 GMThttp://www.tkk7.com/songfei/articles/28686.htmlhttp://www.tkk7.com/songfei/comments/28686.htmlhttp://www.tkk7.com/songfei/articles/28686.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/28686.htmlhttp://www.tkk7.com/songfei/services/trackbacks/28686.html
4.1 HTTPh头概q?
  
     HTTP客户E序Q例如浏览器Q,向服务器发送请求的时候必L明请求类型(一般是GET或者POSTQ。如有必要,客户E序q可以选择发送其他的h头。大多数h头ƈ不是必需的,但Content-Length除外。对于POSTh来说Content-Length必须出现?nbsp;  
     下面是一些最常见的请求头Q?nbsp;  
  AcceptQ浏览器可接受的MIMEcd?
  Accept-CharsetQ浏览器可接受的字符集?
  Accept-EncodingQ浏览器能够q行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器q回lgzip~码的HTML面。许多情形下q可以减??0倍的下蝲旉?
  Accept-LanguageQ浏览器所希望的语aU类Q当服务器能够提供一U以上的语言版本时要用到?
  AuthorizationQ授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中?
  ConnectionQ表C是否需要持久连接。如果Servlet看到q里的gؓ“Keep-Alive”,或者看到请求用的是HTTP 1.1QHTTP 1.1默认q行持久q接Q,它就可以利用持久q接的优点,当页面包含多个元素时Q例如AppletQ图片)Q显著地减少下蝲所需要的旉。要实现q一点,Servlet需要在应答中发送一个Content-Length_最单的实现Ҏ是:先把内容写入ByteArrayOutputStreamQ然后在正式写出内容之前计算它的大小?
  Content-LengthQ表C求消息正文的长度?
  CookieQ这是最重要的请求头信息之一Q参见后面《Cookie处理》一章中的讨论?
  FromQ请求发送者的email地址Q由一些特D的Web客户E序使用Q浏览器不会用到它?
  HostQ初始URL中的L和端口?
  If-Modified-SinceQ只有当所h的内容在指定的日期之后又l过修改才返回它Q否则返?04“Not Modified”应{?
  PragmaQ指定“no-cache”DC服务器必须q回一个刷新后的文档,即它是代理服务器而且已经有了面的本地拷贝?
  RefererQ包含一个URLQ用户从该URL代表的页面出发访问当前请求的面?
  User-AgentQ浏览器cdQ如果Servletq回的内容与览器类型有兛_该值非常有用?
  UA-PixelsQUA-ColorQUA-OSQUA-CPUQ由某些版本的IE览器所发送的非标准的h_表示屏幕大小、颜色深度、操作系l和CPUcd?
     有关HTTP头完整、详l的说明Q请参见http://www.w3.org/Protocols/ 的HTTP规范?nbsp;  
4.2 在Servlet中读取请求头   
     在Servlet中读取HTTP头是非常方便的,只需要调用一下HttpServletRequest的getHeaderҎ卛_。如果客戯求中提供了指定的头信息,getHeaderq回对应的字W串Q否则,q回null。部分头信息l常要用刎ͼ它们有专用的讉KҎQgetCookiesҎq回Cookie头的内容Q经解析后存攑֜Cookie对象的数l中Q请参见后面有关Cookie章节的讨论;getAuthType和getRemoteUserҎ分别dAuthorization头中的一部分内容QgetDateHeader和getIntHeaderҎd指定的头Q然后返回日期值或整数倹{?nbsp;  
     除了d指定的头之外Q利用getHeaderNamesq可以得到请求中所有头名字的一个Enumeration对象?nbsp;  
     最后,除了查看h头信息之外,我们q可以从hd令行获得一些信息。getMethodҎq回hҎQ请求方法通常是GET或者POSTQ但也有可能是HEAD、PUT或者DELETE。getRequestURIҎq回URIQURI是URL的从L和端口之后到表单数据之前的那一部分Q。getRequestProtocolq回h命o的第三部分,一般是“HTTP/1.0”或者“HTTP/1.1”?nbsp;  
4.3 实例Q输出所有的h?nbsp;  
     下面的Servlet实例把所有接收到的请求头和它的g表格的Ş式输出。另外,该Servletq会输出主请求命令的三个部分Q请求方法,URIQ协?版本?nbsp;  
     ShowRequestHeaders.java
  package hall;
  
  import java.io.*;
  import javax.servlet.*;
  import javax.servlet.http.*;
  import java.util.*;
  
  public class ShowRequestHeaders extends HttpServlet {
   public void doGet(HttpServletRequest request,
   HttpServletResponse response)
   throws ServletException, IOException {
   response.setContentType("text/html");
   PrintWriter out = response.getWriter();
   String title = "昄所有请求头";
   out.println(ServletUtilities.headWithTitle(title) +
   "QBODY BGCOLOR=Q?#FDF5E6Q?Q\n" +
   "QH1 ALIGN=CENTERQ? + title + "Q?H1Q\n" +
   "QBQRequest Method: Q?BQ? +
   request.getMethod() + "QBRQ\n" +
   "QBQRequest URI: Q?BQ? +
   request.getRequestURI() + "QBRQ\n" +
   "QBQRequest Protocol: Q?BQ? +
   request.getProtocol() + "QBRQ<BRQ\n" +
   "QTABLE BORDER=1 ALIGN=CENTERQ\n" +
   "QTR BGCOLOR=Q?#FFAD00Q?Q\n" +
   "QTHQHeader NameQTHQHeader Value");
   Enumeration headerNames = request.getHeaderNames();
   while(headerNames.hasMoreElements()) {
   String headerName = (String)headerNames.nextElement();
   out.println("QTRQ<TDQ? + headerName);
   out.println(" QTDQ? + request.getHeader(headerName));
   }
   out.println("Q?TABLEQ\nQ?BODYQ</HTMLQ?);
   }
  
   public void doPost(HttpServletRequest request,
   HttpServletResponse response)
   throws ServletException, IOException {
   doGet(request, response);
   }
  }

天外飞仙 2006-01-19 18:32 发表评论
]]>
表单数据概述http://www.tkk7.com/songfei/articles/28684.html天外飞仙天外飞仙Thu, 19 Jan 2006 10:25:00 GMThttp://www.tkk7.com/songfei/articles/28684.htmlhttp://www.tkk7.com/songfei/comments/28684.htmlhttp://www.tkk7.com/songfei/articles/28684.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/28684.htmlhttp://www.tkk7.com/songfei/services/trackbacks/28684.html 4.1 表单数据概述  
     如果你曾l用过Web搜烦引擎Q或者浏览过在线书店、股h根{机信息,或许会留意到一些古怪的URLQ比如“http://host/path?user=Marty+Hall&origin=bwi&dest=lax”。这个URL中位于问号后面的部分Q即“user=Marty+Hall&origin=bwi&dest=lax”,是表单数据Q这是将Web面数据发送给服务器程序的最常用Ҏ。对于GEThQ表单数据附加到URL的问号后面(如上例所C)Q对于POSThQ表单数据用一个单独的行发送给服务器?nbsp; 
     以前Q从q种形式的数据提取出所需要的表单变量是CGI~程中最ȝ的事情之一。首先,GETh和POSTh的数据提取方法不同:对于GEThQ通常要通过QUERY_STRING环境变量提取数据Q对于POSThQ则一般通过标准输入提取数据。第二,E序员必负责在?amp;”符号处截断变量名字-变量值对Q再分离出变量名字({号左边Q和变量|{号双Q。第三,必须对变量D行URL反编码操作。因为发送数据的时候,字母和数字以原来的Ş式发送,但空D转换成加P其他字符被{换成?XX”Ş式,其中XX是十六进制表C的字符ASCIIQ或者ISO Latin-1Q编码倹{例如,如果HTML表单中名为“users”的域gؓ“~hall, ~gates, and ~mcnealy”,则实际向服务器发送的数据为“users=%7Ehall%2C+%7Egates%2C+and+%7Emcnealy”。最后,即第四个D解析表单数据非常困难的原因在于,变量值既可能被省略(如“param1=val1Qparam2=Qparam3=val3”)Q也有可能一个变量拥有一个以上的|卛_一个变量可能出Cơ以上(如“param1=val1Qparam2=val2Qparam1=val3”)?nbsp;  
     Java Servlet的好处之一在于所有上q解析操作都能够自动完成。只需要简单地调用一下HttpServletRequest的getParameterҎ、在调用参数中提供表单变量的名字Q大写敏感Q即可,而且GETh和POSTh的处理方法完全相同?nbsp;  
     getParameterҎ的返回值是一个字W串Q它是参C指定的变量名字第一ơ出现所对应的值经反编码得到得字符Ԍ可以直接使用Q。如果指定的表单变量存在Q但没有|getParameterq回I字W串Q如果指定的表单变量不存在,则返回null。如果表单变量可能对应多个|可以用getParameterValues来取代getParameter。getParameterValues能够q回一个字W串数组?nbsp;  
     最后,虽然在实际应用中Servlet很可能只会用到那些已知名字的表单变量Q但在调试环境中Q获得完整的表单变量名字列表往往是很有用的,利用getParamerterNamesҎ可以方便地实现这一炏VgetParamerterNamesq回的是一个EnumerationQ其中的每一w可以转换用getParameter的字W串?
  
4.2 实例Q读取三个表单变?nbsp; 
     下面是一个简单的例子Q它d三个表单变量param1、param2和param3Qƈ以HTML列表的Ş式列出它们的倹{请注意Q虽然在发送应{内容之前必L定应{类型(包括内容cd、状态以及其他HTTP头信息)Q但Servlet对何时读取请求内容却没有什么要求?nbsp;  
     另外Q我们也可以很容易地把Servlet做成既能处理GEThQ也能够处理POSThQ这只需要在doPostҎ中调用doGetҎQ或者覆盖serviceҎQserviceҎ调用doGet、doPost、doHead{方法)。在实际~程中这是一U标准的ҎQ因为它只需要很的额外工作Q却能够增加客户端编码的灉|性?nbsp;  
     如果你习惯用传统的CGIҎQ通过标准输入dPOST数据Q那么在Servlet中也有类似的ҎQ即在HttpServletRequest上调用getReader或者getInputStreamQ但q种ҎҎ通的表单变量来说太麻烦。然而,如果是要上蝲文gQ或者POST数据是通过专门的客L序而不是HTML表单发送,那么p用到q种Ҏ?nbsp;  
     注意用第二种ҎdPOST数据Ӟ不能再用getParameter来读取这些数据?nbsp;  
ThreeParams.java
  package hall;
  
  import java.io.*;
  import javax.servlet.*;
  import javax.servlet.http.*;
  import java.util.*;   
  public class ThreeParams extends HttpServlet {
   public void doGet(HttpServletRequest request,
   HttpServletResponse response)
   throws ServletException, IOException {
   response.setContentType("text/html");
   PrintWriter out = response.getWriter();
   String title = "d三个h参数";
   out.println(ServletUtilities.headWithTitle(title) +
   "QBODYQ\n" +
   "QH1 ALIGN=CENTERQ? + title + "Q?H1Q\n" +
   "QULQ\n" +
   " QLIQparam1: "
   + request.getParameter("param1") + "Qn" +
   " QLIQparam2: "
   + request.getParameter("param2") + "Qn" +
   " QLIQparam3: "
   + request.getParameter("param3") + "Qn" +
   "Q?ULQ\n" +
   "Q?BODYQ</HTMLQ?);
   }
  
   public void doPost(HttpServletRequest request,
   HttpServletResponse response)
   throws ServletException, IOException {
   doGet(request, response);
   }
  }
4.3 实例Q输出所有的表单数据  
     下面q个例子L表单所发送的所有变量名字,q把它们攑օ表格中,没有值或者有多个值的变量都突出显C?nbsp;  
     首先Q程序通过HttpServletRequest的getParameterNamesҎ得到所有的变量名字QgetParameterNamesq回的是一个Enumeration。接下来Q程序用循环遍历q个EnumerationQ通过hasMoreElements定何时l束循环Q利用nextElement得到Enumeration中的各个V由于nextElementq回的是一个ObjectQ程序把它{换成字符串后再用q个字符串来调用getParameterValues?nbsp;  
     getParameterValuesq回一个字W串数组Q如果这个数l只有一个元素且{于I字W串Q说明这个表单变量没有|Servlet以斜体Ş式输出“No Value”;如果数组元素个数大于1Q说明这个表单变量有多个|Servlet以HTML列表形式输出q些|其他情况下Servlet直接把变量值放入表根{?nbsp;  
     ShowParameters.java   
     注意QShowParameters.java用到了前面介l过的ServletUtilities.java?
  package hall;
  
  import java.io.*;
  import javax.servlet.*;
  import javax.servlet.http.*;
  import java.util.*;
  
  public class ShowParameters extends HttpServlet {
   public void doGet(HttpServletRequest request,
   HttpServletResponse response)
   throws ServletException, IOException {
   response.setContentType("text/html");
   PrintWriter out = response.getWriter();
   String title = "d所有请求参?;
   out.println(ServletUtilities.headWithTitle(title) +
   "QBODY BGCOLOR=Q?#FDF5E6Q?Q\n" +
   "QH1 ALIGN=CENTERQ? + title + "Q?H1Q\n" +
   "QTABLE BORDER=1 ALIGN=CENTERQ\n" +
   "QTR BGCOLOR=Q?#FFAD00Q?Q\n" +
   "QTHQ参数名字<THQ参数?);
   Enumeration paramNames = request.getParameterNames();
   while(paramNames.hasMoreElements()) {
   String paramName = (String)paramNames.nextElement();
   out.println("QTRQ<TDQ? + paramName + "QnQTDQ?);
   String[] paramValues = request.getParameterValues(paramName);
   if (paramValues.length == 1) {
   String paramValue = paramValues[0];
   if (paramValue.length() == 0)
   out.print("QIQNo ValueQ?IQ?);
   else
   out.print(paramValue);
   } else {
   out.println("QULQ?);
   for(int i=0; iQparamValues.length; i++) {
   out.println("QLIQ? + paramValues[i]);
   }
   out.println("Q?ULQ?);
   }
   }
   out.println("Q?TABLEQ\nQ?BODYQ</HTMLQ?);
   }
  
   public void doPost(HttpServletRequest request,
   HttpServletResponse response)
   throws ServletException, IOException {
   doGet(request, response);
   }
  }
  
试表单   
     下面是向上述Servlet发送数据的表单PostForm.html。就像所有包含密码输入域的表单一P该表单用POSTҎ发送数据。我们可以看刎ͼ在Servlet中同时实现doGet和doPostq两U方法ؓ表单制作带来了方ѝ?
  Q?DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"Q?
  QHTMLQ?
  QHEADQ?
   QTITLEQ示例表单</TITLEQ?
  Q?HEADQ?
  
  QBODY BGCOLOR="#FDF5E6"Q?
  QH1 ALIGN="CENTER"Q用POSTҎ发送数据的表单Q?H1Q?
  
  QFORM ACTION="/servlet/hall.ShowParameters"
   METHOD="POST"Q?
   Item Number:
   QINPUT TYPE="TEXT" NAME="itemNum"Q<BRQ?
   Quantity:
   QINPUT TYPE="TEXT" NAME="quantity"Q<BRQ?
   Price Each:
   QINPUT TYPE="TEXT" NAME="price" VALUE="$"Q<BRQ?
   QHRQ?
   First Name:
   QINPUT TYPE="TEXT" NAME="firstName"Q<BRQ?
   Last Name:
   QINPUT TYPE="TEXT" NAME="lastName"Q<BRQ?
   Middle Initial:
   QINPUT TYPE="TEXT" NAME="initial"Q<BRQ?
   Shipping Address:
   QTEXTAREA NAME="address" ROWS=3 COLS=40Q</TEXTAREAQ<BRQ?
   Credit Card:QBRQ?
   QINPUT TYPE="RADIO" NAME="cardType"
   VALUE="Visa"QVisaQBRQ?
   QINPUT TYPE="RADIO" NAME="cardType"
   VALUE="Master Card"QMaster CardQBRQ?
   QINPUT TYPE="RADIO" NAME="cardType"
   VALUE="Amex"QAmerican ExpressQBRQ?
   QINPUT TYPE="RADIO" NAME="cardType"
   VALUE="Discover"QDiscoverQBRQ?
   QINPUT TYPE="RADIO" NAME="cardType"
   VALUE="Java SmartCard"QJava SmartCardQBRQ?
   Credit Card Number:
   QINPUT TYPE="PASSWORD" NAME="cardNum"Q<BRQ?
   Repeat Credit Card Number:
   QINPUT TYPE="PASSWORD" NAME="cardNum"Q<BRQ<BRQ?
   QCENTERQ?
   QINPUT TYPE="SUBMIT" VALUE="Submit Order"Q?
   Q?CENTERQ?
  Q?FORMQ?
  
  Q?BODYQ?
  Q?HTMLQ?

天外飞仙 2006-01-19 18:25 发表评论
]]>
weblogic的jsp问题解决Ҏhttp://www.tkk7.com/songfei/articles/23888.html天外飞仙天外飞仙Wed, 14 Dec 2005 08:00:00 GMThttp://www.tkk7.com/songfei/articles/23888.htmlhttp://www.tkk7.com/songfei/comments/23888.htmlhttp://www.tkk7.com/songfei/articles/23888.html#Feedback0http://www.tkk7.com/songfei/comments/commentRss/23888.htmlhttp://www.tkk7.com/songfei/services/trackbacks/23888.html
weblogic的jsp问题解决Ҏ
littleboys 原创  (参与分:47498Q专家分Q?30)   发表Q?002-08-27 19:26   版本Q?.0   阅读Q?B>16714?

在做目的时候,jsp在运行的时候出C一些问题,现将我的问题解决Ҏ做一个小l,供以后作目的参考?BR>
问题1Q?BR>weblogic 的数据库q接数目在程序运行中不断增长Q最后连接数目超q最大数Q导致weblogic服务关闭
原因Q?BR>在操作完数据库后Q没有关闭数据库q接Q或者是q回l果集(ResultsetQ,而无法在jsp中关闭数据库q接?BR>解决ҎQ?BR>1Q?nbsp;   在操作完数据库要关闭数据库连接?BR>2Q?nbsp;   量不要q回l果集Resultset, 可以q回VectorQ一个字D)、HashtableQ多个字D)Q这样可以在javabean中关闭数据库?BR>3Q?nbsp;   如果javabean中返回的是结果集QResultsetQ,也可以在javaBean中写一个connectDBQ连接数据库Q、closeDB(关闭数据?的方法,然后jsp里面调用connectDBQ)Q徏立数据库q接Q同时就可以Ҏ据库q行操作了,操作数据库完毕,可以通过closeDB() 来关闭数据库?BR>使用W二U方?BR>问题2Q?BR>在运行某一个jsp E序的时候,weblogic 的内存陡然增长,而且居高不下。最l导致weblogic 内存不Q甚臛_机?BR>原因Q?BR>q度使用内存?BR>解决ҎQ?BR>1Q?nbsp;   ׃数据量比较大Q在对字W串q行操作的时候,使用 + q行字符串连接,?BR>   怿大家对String都非常熟悉,我们也经常要用它来做字符串的q接什么的Q例如:
String a =b+c file://b,c 都是String 
但是在实际的~译中却是这P 
String a=new StringBuffer().append(b).append(c).toString() 昄,在一个简单的语句中却意外的多生成?个对象:
.StringBuffer() 
.toStringq回的一个String
我们比较一下这两段E序的性能Q?BR>E序片断一Q?BR>StringBuffer s=new StringBuffer();
long start = System.currentTimeMillis();
for (int i=0;i<10000;i++){
s1+="a";
}
long stop = System.currentTimeMillis();
System.out.println(stop-start);
E序片断二: 
StringBuffer s=new StringBuffer(10000);//
long start=System.currentTimeMillis(); 
for (int i=0;i<10000;i++){
s.append("a"); 
}
long stop=System.currentTimeMillis();
System.out.println(stop-start);
比较一下结果,差距很明显?BR>至于Z么String的连接这么做Q因为String无法直接改变光度,而必采用StringBuffer的用法?BR>因此使用StringBuffer 的append Ҏ来进行字W串相连?BR>2Q?nbsp;   在解册个问题的时候,我也试使用上面的方法,效果q不是很明显(消耗内存上)。后来在昄大量数据的时候,避免字符串相q的步骤Q而直接用out.println(),直接输出?BR>问题3QJavaq不LE序占用q多的内?当对象向堆所h的内存不x,垃圾攉?Garbage Collector)׃自动启动,释放那些引用Cؓ零的对象所占用的内存,Java也不会自动释放无用的对象的引?如果E序忘记释放指向对象的引?则程序运行时的内存随着旉的推U而增?发生所谓内存泄?memory leaks)Q创建对象不但消耗CPU的时间和内存,同时,为释攑֯象内存JVM需不停地启动垃圾收集器(Garbage Collector),q也会消耗大量的CPU旉?BR>     
解决ҎQ?nbsp;׃在运行一D|间jspE序后,weblogic 的内存会有一个缓慢的增长Q这样也会导致内存溢出,Z避免qȝ象的出现Q最l的解决Ҏ是: ~写一个servletE序Q在启动服务器的时候,启动一个这个servletQ每?0分钟q行在服务器端运行一ơ,来定时回收内存?BR> 问题4Q?BR>log文g里面的调试信息没有注释去掉?BR> 解决ҎQ?BR>在程序通过后,量把调试的信息注释L?BR>同时在捕捉错误的时候要写明E序名称Q方便查找,q一点做的还不够?BR>最好能写一个记录log的方法,以便E序调用?BR>问题5
改善性能Q提高速度?BR>具体实例Q?BR> 我们再来看一个有关Vectorcȝ代码片段Q?BR>for(int I=0; I<v.size(); I++) { System.out.println( v.get(I).getClass().toString()); }
如果v包含100,000个元素,q个代码片段调用v.size()Ҏ100,000ơ。虽然sizeҎ是一个简单的ҎQ但它仍旧需要一ơ方法调用的开销Q至JVM需要ؓ它配|以及清除堆栈环境。在q里Qfor循环内部的代码不会以M方式修改Vectorcd对象v的大,因此上面的代码最好改写成下面q种形式Q?BR>int size = v.size(); for(int I=0; I<size; I++) { System.out.println( v.get(I).getClass().toString()); }
虽然q是一个简单的改动Q但它仍旧赢得了性能。毕竟,每一个CPU周期都是宝贵的?BR>问题 6Q?BR>?nbsp;jsp 文g里面 不要?nbsp;<%@ page import="java.lang.*" %>
因ؓjava 不需要引入此包就可以引用里面的类文g?BR>
问题7Q?BR>使用vector+hashtable 一ơ返回查询结果resulset.

解决ҎQ?nbsp;记录集:一条记录放C个hashtable里面Q然后把它再
       d到vector里面Q@环记录下l果集,q回vector
具体见后面的java文g的部分代码(不包扩数据库的连接和关闭Q?BR>

 package zjdx.bean.common;

/********************************************
 ***** Title:      hashtable_vector_rs  
 ***** Description: 数据昄           
 ***** Copyright:  Copyright (c) 2002   
 ***** Company:       DHC            
 ***** author:     wangyl               
 ***** version:    1.0                  
 ***** 说明Q?BR> ***** 记录集:一条记录用攑ֈ一个hashtable里面Q然后把它再
       攑ֈvector里面Q@环记录下l果集,q回vector
       
*********************************************/

import java.io.*;
import java.sql.*;
import java.util.*;
import java.text.*;

public class hashtable_vector_rs
{
    /*----------------------------------------------------------------*/
    /* 函数名称Q?nbsp;getMultiRowInfo
    /* 功能描述Q?nbsp;q回记录集,攑ֈHashtable里面
    /* 参数Q?nbsp;   sql 语句,字段个数
    /* q回?   成功---htable, p|---null
    /*----------------------------------------------------------------*/
    public Vector ListResult(String sqlStatement,int num)
    {
        Vector ListRs=new Vector();
        
        try
        {
            connectDB();
            rs=stmt.executeQuery(sqlStatement);
            //判断字段数据cd 
            //date?nbsp;q回 93 
            //int?nbsp;q回 2,4
            //bigint?nbsp;q回 3 
            //String?nbsp;q回 12
            //(char ?q回 1
            int t = -1;
            rsmd = rs.getMetaData();
            int ColumnCount=0;
            if(num>0)
                ColumnCount = num;
            else
                ColumnCount = rsmd.getColumnCount();
            while(rs.next())
            {                             
                Hashtable htable =new Hashtable();
                for (int i = 1; i <= ColumnCount; i++) 
                {
                    t=rsmd.getColumnType(i);
                    System.out.println("i="+i+",t="+t+"name="+rsmd.getColumnName(i)); 
                    if(t==12||t==1||t==3)
                    {
                        if(rs.getString(i)==null|| rs.getString(i).equals(""))
                            htable.put(rsmd.getColumnName(i),"");
                        else
                            htable.put(rsmd.getColumnName(i),rs.getString(i));
                    }
                    else if(t==93)
                    {
                        htable.put(rsmd.getColumnName(i),rs.getDate(i).toString());
                    }
                    else if(t==2||t==4)
                    {
                        htable.put(rsmd.getColumnName(i),Integer.toString(rs.getInt(i)));
                    }
                }
                ListRs.add(htable);
            }//e
            return ListRs;                
        }
        catch(Exception listError)
        {
            System.out.println("数据库操作失败!"+listError);
            return null;
        } 
        finally
        {
            try
            {
                closeDB();
            }    
            catch(Exception closeErr)
            {
                System.out.println("关闭数据库出错:"+closeErr);    
            }
        }     
    }
}

 问题8: jsp的程序也有设计的不够合理的地?BR>     例如Q选择一个下拉框Q提交一ơ,列出所选的数据Q选择另外一个下拉框再次提交Q再ơ列出所选的数据?BR>解决ҎQ?BR>     量一ơ把条g选择完毕Q然后列出所选择的数据,q且在数据多的时候,量使用页Q减运行时间?BR>
问题9Q性能优化Q尽量用PreparedStatement
解决ҎQ?BR>PreparedStatement 对象和用的普通的 Statement 对象有两点不同?BR>W一Q?nbsp;   它们是ؓ了性能更快而由 JDBC 驱动E序或数据库~译Q预~译Q的?BR>W二Q?nbsp;   它们接受一个或多个动态输入参敎ͼUCؓ IN 参数。这两点?nbsp;PreparedStatement 对象适用于重复的 SQL 操作Q其中操作基本上都是一LQ只有微的差异Q如数据载入Q。要?nbsp;SQL 语句在用前预备好,?nbsp;PreparedStatement 对象创徏时必d SQL 传送到 JDBC 驱动E序Q而不是在其执行时才传送?nbsp;

IN 参数?nbsp;SQL String 中的 ? 占位W表C。在 PreparedStatement 能够成功地执行前Q还必须调用 PreparedStatement 对象?nbsp;setXXX() Ҏ来设|?nbsp;IN 参数Q在q里 XXX 被设|的参数的数据类型所替换。因而,要将W一?nbsp;IN 参数讄为整数?nbsp;100Q您应该调用 setInt(1, 100)。同样地Q要第二个 IN 参数讄为字W串值“rjb”,您应该调?nbsp;setString(2, "rjb")。最后一ҎQ设|好的参数值在讄Z个新的|或用 clearParameters() 昑ּ地清除之前会保持不变。这很重要,因ؓ PreparedStatement 可以被多ơ执行;如果您不注意的话Q就会让您的数据库充满无用数据?BR>问题10 Q?BR>  1、我把包含SQLBridge 的java文g改了一遍,?2个java文gQ已l改完)?BR>   2、我把包含SQLPool 的java文g改了一遍,?7个java文gQ已l改完)?BR>   3、我把不用的jsp文g整理了一下,大概?7 个目录的jsp文g不用或者没有上Uѝ(整理完毕Q?BR>问题11Q提交页面,每次都提交两ơ?BR>原因Q?BR>  1?BR><input type="submit" name="sendit" value="发? class=button onclick="javascript:if(chkit())form_submit('broadcast_operation.jsp?s_coming=1&s_num=<%=str_num%>')">
q里如果type=”sbumit?面׃提交两次。(p了一天的旉才找到原因)?BR>在onclick事g里面会提交一ơ,而submit 按钮本n也会提交一ơ?BR>
解决ҎQ?BR>   如果在onclick 事g里面提交面Q按钮的cdtype 一定不可以是”submit?nbsp; 按钮?BR>可以是”button?
   全文搜烦共有33个类似的文g?BR>java.net.SocketException: ReadFile failed: 指定的网l名不再可用?BR>主要是由于这个引L?BR>问题12Q定时刷新页面,600U(不是必要的,不要q样做) 
原因Q?BR>   <meta http-equiv="refresh" content="600">
解决ҎQ?BR>       Lq样的语句?BR>    
全文搜烦共有12个类似的文g?BR>
问题13Q在跌{到别的页面的时候,要加return?BR>否则可能会引起错误。蟩转不q去?BR>If{
request.getRequestDispatcher("/zjdx/jsp/common/ErrorPage.jsp?s_mark=error:record have existed").forward(request,response); 
return;
}
else
{
response.sendRedirect();
//用上面的Ҏ
return;
}


天外飞仙 2005-12-14 16:00 发表评论
]]>
Java正则表达式详?/title><link>http://www.tkk7.com/songfei/articles/23686.html</link><dc:creator>天外飞仙</dc:creator><author>天外飞仙</author><pubDate>Tue, 13 Dec 2005 07:50:00 GMT</pubDate><guid>http://www.tkk7.com/songfei/articles/23686.html</guid><wfw:comment>http://www.tkk7.com/songfei/comments/23686.html</wfw:comment><comments>http://www.tkk7.com/songfei/articles/23686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/songfei/comments/commentRss/23686.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/songfei/services/trackbacks/23686.html</trackback:ping><description><![CDATA[     摘要: Java正则表达式详解仙人掌工作? 01-7-31 下午 04:13:03 如果你曾l用qPerl或Q何其他内建正则表辑ּ支持的语aQ你一定知道用正则表达式处理文本和匚w模式是多么简单。如果你不熟悉这个术语,那么“正则表辑ּ”(Regular ExpressionQ就是一个字W构成的Ԍ它定义了一个用来搜索匹配字W串的模式? 许多语言Q包括Perl、P...  <a href='http://www.tkk7.com/songfei/articles/23686.html'>阅读全文</a><img src ="http://www.tkk7.com/songfei/aggbug/23686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/songfei/" target="_blank">天外飞仙</a> 2005-12-13 15:50 <a href="http://www.tkk7.com/songfei/articles/23686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://zaidongmaixi.com" target="_blank">͵͵޸պ</a>| <a href="http://cc58866.com" target="_blank">ɫƷƵ</a>| <a href="http://cao9999.com" target="_blank">ȫaëƬ**Ƶ</a>| <a href="http://pufenghotel.com" target="_blank">޾Ʒa߹ۿ </a>| <a href="http://c7vl.com" target="_blank">AVվ</a>| <a href="http://hh5151.com" target="_blank">þùһ</a>| <a href="http://fl6fe.com" target="_blank">޾ƷƵѿ</a>| <a href="http://jmzc888.com" target="_blank">ѹվ߹ۿ </a>| <a href="http://zhaoav7.com" target="_blank">ѹۿվ߲</a>| <a href="http://vvbbn.com" target="_blank">jyzzjyzz鶹</a>| <a href="http://815389.com" target="_blank">ŮվɫƵ</a>| <a href="http://25v8.com" target="_blank">޵һAVվþþƷ˵AV </a>| <a href="http://wwwkckc.com" target="_blank">91˾Ʒ޾Ʒ</a>| <a href="http://77663499.com" target="_blank">պAVһ </a>| <a href="http://dou18.com" target="_blank">ҸŮˬ߳Ƭ </a>| <a href="http://f4f8.com" target="_blank">vƬ߹ۿ</a>| <a href="http://930mk.com" target="_blank">޾ƷAAƬ</a>| <a href="http://289qq.com" target="_blank">ҳվƵ</a>| <a href="http://xingqiu1.com" target="_blank">ѹ99þþ㽶</a>| <a href="http://zhidianzh.com" target="_blank">Ʒѿþþ </a>| <a href="http://kypbuy.com" target="_blank">Ļ뾫ƷԴ</a>| <a href="http://douhuowang.com" target="_blank">ëƬ߹ۿ</a>| <a href="http://ti166.com" target="_blank">ҸŮˬ߳Ƭ</a>| <a href="http://gdsanhai.com" target="_blank">aëƬ߲</a>| <a href="http://ccc321.com" target="_blank">޵Ӱѹۿ</a>| <a href="http://xdxsw.com" target="_blank">߹ۿɫëƬ</a>| <a href="http://34pmpm.com" target="_blank">MM131޹Ůþ</a>| <a href="http://djllgs.com" target="_blank">߹ۿ˳վ</a>| <a href="http://szyxfhm.com" target="_blank">è˳վ</a>| <a href="http://jogador1.com" target="_blank">18ŮëƬˮ</a>| <a href="http://hhgcnet.com" target="_blank">AV˳ۺ</a>| <a href="http://www-xg5777.com" target="_blank">߾ƷһС˵</a>| <a href="http://bzzxyp.com" target="_blank">޳avӰԺ</a>| <a href="http://biarn.com" target="_blank">޾ƷӰԺþþþþ</a>| <a href="http://doubiseo.com" target="_blank">gvh߹ۿ</a>| <a href="http://shguojing.com" target="_blank">ձһ</a>| <a href="http://bjgjjrxy.com" target="_blank">ȫѹɫһ</a>| <a href="http://hhrrrr.com" target="_blank">þþþþAv뾫Ʒר </a>| <a href="http://5r7b.com" target="_blank">һƵ</a>| <a href="http://601508.com" target="_blank">þþþһƷ޹ۺAV</a>| <a href="http://cztshw.com" target="_blank">ӰԺ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>