??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲精品A在线观看,亚洲中文字幕伊人久久无码,亚洲国产精品VA在线看黑人http://www.tkk7.com/lvq810/category/31962.html世间最可贵的就是“今”,最易失得也是“今”。因为它最Ҏ丧失Q所以更觉得它宝c?/description>zh-cnWed, 30 Sep 2009 19:27:59 GMTWed, 30 Sep 2009 19:27:59 GMT60EL表达式语ahttp://www.tkk7.com/lvq810/articles/290599.htmllvq810lvq810Mon, 10 Aug 2009 15:53:00 GMThttp://www.tkk7.com/lvq810/articles/290599.html   1.语法l构
    ${expression}
  2.[]?q算W?br />     EL 提供.和[]两种q算W来存取数据?br />     当要存取的属性名UC包含一些特D字W,??{ƈ非字母或数字的符P׃定要使用 []。例如:
        ${user.My-Name}应当改ؓ${user["My-Name"] }
    如果要动态取值时Q就可以用[]来做Q?无法做到动态取倹{例如:
        ${sessionScope.user[data]}中data 是一个变?br />   3.变量
    EL存取变量数据的方法很单,例如Q?{username}。它的意思是取出某一范围中名UCؓusername的变量?br />     因ؓ我们q没有指定哪一个范围的usernameQ所以它会依序从Page、Request、Session、Application范围查找?br />     假如途中扑ֈusernameQ就直接回传Q不再l找下去Q但是假如全部的范围都没有找到时Q就回传null?br />     属性范围在EL中的名称
        Page         PageScope
        Request         RequestScope
        Session         SessionScope
        Application     ApplicationScope
       
二、EL隐含对象
  1.与范围有关的隐含对象
  与范围有关的EL 隐含对象包含以下四个QpageScope、requestScope、sessionScope 和applicationScopeQ?br />   它们基本上就和JSP的pageContext、request、session和application一P
  在EL中,q四个隐含对象只能用来取得范围属性|即getAttribute(String name)Q却不能取得其他相关信息?br />  
  例如Q我们要取得session中储存一个属性username的|可以利用下列ҎQ?br />     session.getAttribute("username") 取得username的|
  在EL中则使用下列Ҏ
    ${sessionScope.username}

  2.与输入有关的隐含对象
  与输入有关的隐含对象有两个:param和paramValuesQ它们是EL中比较特别的隐含对象?br />  
  例如我们要取得用Lh参数Ӟ可以利用下列ҎQ?br />     request.getParameter(String name)
    request.getParameterValues(String name)
  在EL中则可以使用param和paramValues两者来取得数据?br />     ${param.name}
    ${paramValues.name}

  3.其他隐含对象
 
  cookie
  JSTLq没有提供设定cookie的动作,
  例:要取得cookie中有一个设定名UCؓuserCountry的|可以使用${cookie.userCountry}来取得它?br />
  header和headerValues
  header 储存用户览器和服务端用来沟通的数据
  例:要取得用h览器的版本,可以使用${header["User-Agent"]}?br />   另外在鲜机会下Q有可能同一标头名称拥有不同的|此时必须改ؓ使用headerValues 来取得这些倹{?br />
  initParam
  initParam取得讑֮web站点的环境参?Context)
  例:一般的ҎString userid = (String)application.getInitParameter("userid");
    可以使用 ${initParam.userid}来取得名UCؓuserid

  pageContext
  pageContext取得其他有关用户要求或页面的详细信息?br />     ${pageContext.request.queryString}         取得h的参数字W串
    ${pageContext.request.requestURL}         取得h的URLQ但不包括请求之参数字符?br />     ${pageContext.request.contextPath}         服务的web application 的名U?br />     ${pageContext.request.method}           取得HTTP 的方?GET、POST)
    ${pageContext.request.protocol}         取得使用的协?HTTP/1.1、HTTP/1.0)
    ${pageContext.request.remoteUser}         取得用户名称
    ${pageContext.request.remoteAddr }         取得用户的IP 地址
    ${pageContext.session.new}             判断session 是否为新?br />     ${pageContext.session.id}               取得session 的ID
    ${pageContext.servletContext.serverInfo}   取得L端的服务信息

三、ELq算W?br />   1.术q算W有五个Q?????或div?或mod
  2.关系q算W有六个Q?=或eq?=或ne?lt;或lt?gt;或gt?lt;=或le?gt;=或ge
  3.逻辑q算W有三个Q?amp;&或and、||或or?或not
  4.其它q算W有三个QEmptyq算W、条件运符?)q算W?br />     例:${empty param.name}?{A?B:C}?{A*(B+C)}
 
四、EL函数(functions)?br />   语法Qns:function( arg1, arg2, arg3 …. argN)
  其中ns为前|名U?prefix)Q它必须和taglib 指o的前|名UC|?br />

补充Q?br /> <%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
FOREACH:
<c:forEach items="${messages}"
var="item"
begin="0"
end="9"
step="1"
varStatus="var">
……
</c:forEach>

OUT:
<c:out value="/${logininfo.username}"/>
<c:out>value 中的内容输出到当前位|,q里也就是把logininfo 对象?br /> username属性D出到面当前位置?br /> ${……}是JSP2.0 中的Expression LanguageQELQ的语法。它定义了一个表辑ּQ?br /> 其中的表辑ּ可以是一个常量(如上Q,也可以是一个具体的表达语句Q如forEach循环体中
的情况)。典型案例如下:
Ø ${logininfo.username}
q表明引用logininfo 对象的username 属性。我们可以通过“.”操作W引
用对象的属性,也可以用“[]”引用对象属性,?{logininfo[username]}
?{logininfo.username}辑ֈ了同L效果?br /> “[]”引用方式的意义在于,如果属性名中出CҎ字符Q如“.”或?#8220;-”Q?br /> 此时必M?#8220;[]”获取属性g避免语法上的冲突Q系l开发时应尽量避?br /> q一现象的出玎ͼ?br /> 与之{同的JSP Script大致如下Q?br /> LoginInfo logininfo =
(LoginInfo)session.getAttribute(“logininfo”);
String username = logininfo.getUsername();
可以看到QEL大大节省了编码量?br /> q里引出的另外一个问题就是,EL 从哪里扑ֈlogininfo 对象Q对?br /> ${logininfo.username}q样的表辑ּ而言Q首先会从当前页面中L之前?br /> 否定义了变量logininfoQ如果没有找到则依次到Request、Session?br /> Application 范围内寻找,直到扑ֈ为止。如果直到最后依然没有找到匹配的
变量Q则q回null.
如果我们需要指定变量的L范围Q可以在EL表达式中指定搜寻范围Q?br /> ${pageScope.logininfo.username}
${requestScope.logininfo.username}
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
在Spring 中,所有逻辑处理单元q回的结果数据,都将作ؓAttribute 被放
|到HttpServletRequest 对象中返回(具体实现可参见Spring 源码?br /> org.springframework.web.servlet.view.InternalResourceView.
exposeModelAsRequestAttributesҎ的实C码)Q也是说Spring
MVC 中,l果数据对象默认都是requestScope。因此,在Spring MVC 中,
以下dҎ应慎用:
${sessionScope.logininfo.username}
${applicationScope.logininfo.username}
Ø ${1Q?}
l果辑ּ计算l果Q即整数??br /> Ø ${i>1}
如果变量值i>1的话Q将q回boolcdtrue。与上例比较Q可以发现EL会自
动根据表辑ּ计算l果q回不同的数据类型?br /> 表达式的写法与java代码中的表达式编写方式大致相同?/p>

IF / CHOOSE:
<c:if test="${var.index % 2 == 0}">
*
</c:if>
判定条g一般ؓ一个EL表达式?br /> <c:if>q没有提供else子句Q用的时候可能有些不便,此时我们可以通过<c:choose>
tag来达到类似的目的Q?br /> <c:choose>
<c:when test="${var.index % 2 == 0}">
*
</c:when>
<c:otherwise>
!
</c:otherwise>
</c:choose>
cMJava 中的switch 语句Q?lt;c:choose>提供了复杂判定条件下的简化处理手法。其
?lt;c:when>子句cMcase子句Q可以出现多ơ。上面的代码Q在奇数行时输出“*”P
而偶数行时输?#8220;!”?/p>

1、EL表达式用${}表示,可用在所有的HTML和JSP标签?作用是代替JSP面中复杂的JAVA代码. 

2、EL表达式可操作帔R 变量 和隐式对? 最常用?隐式对象?{param}?{paramValues}. ${param}表示q回h参数中单个字W串的? ${paramValues}表示q回h参数的一l?pageScope表示面范围的变?requestScope表示h对象的变? sessionScope表示会话范围内的变量.applicationScope表示应用范围的变?

3?lt;%@  page isELIgnored="true"%> 表示是否用EL语言,TRUE表示止.FALSE表示不禁?JSP2.0中默认的启用EL语言.

4、EL语言可显C?逻辑表达式如${true and false}l果是false    关系表达式如${5>6} l果是false     术表达式如 ${5+5} l果?0

5、EL中的变量搜烦范围?page request session application   点运符(.)?[ ]"都是表示获取变量的?区别是[ ]可以昄非词cȝ变量

 

lvq810 2009-08-10 23:53 发表评论
]]>
Java中的文gContentTypecdhttp://www.tkk7.com/lvq810/articles/284993.htmllvq810lvq810Wed, 01 Jul 2009 09:52:00 GMThttp://www.tkk7.com/lvq810/articles/284993.html    <mime-mapping>    ...  阅读全文

lvq810 2009-07-01 17:52 发表评论
]]>
LookupDispatchAction,EventDispatchAction和MappingDispatchAction使用中的区别http://www.tkk7.com/lvq810/articles/256662.htmllvq810lvq810Wed, 25 Feb 2009 09:42:00 GMThttp://www.tkk7.com/lvq810/articles/256662.htmljava.lang.Object     org.apache.struts.action.Action    ...  阅读全文

lvq810 2009-02-25 17:42 发表评论
]]>
[转]Java NIO原理和?/title><link>http://www.tkk7.com/lvq810/articles/254369.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Thu, 12 Feb 2009 05:17:00 GMT</pubDate><guid>http://www.tkk7.com/lvq810/articles/254369.html</guid><description><![CDATA[Java NIO非堵塞应用通常适用用在I/Od{方面,我们知道Q系l运行的性能瓉通常在I/OdQ包括对端口和文件的操作上,q去Q在打开一个I/O通道后,read()一直等待在端口一边读取字节内容,如果没有内容q来Qread()也是d的等Q这会媄响我 们程序l做其他事情Q那么改q做法就是开讄E,让线E去{待Q但是这样做也是相当耗费资源的? <p align="left">Java NIO非堵塞技术实际是采取Reactor模式Q或者说是Observer模式为我们监察I/O端口Q如果有内容q来Q会自动通知我们Q这P我们׃必开启多个线E死{,从外界看Q实C畅的I/OdQ不堵塞了?/p> <p align="left">Java NIO出现不只是一个技术性能的提高,你会发现|络上到处在介绍它,因ؓ它具有里E碑意义Q从JDK1.4开始,Java开始提高性能相关的功能,从而得Java在底层或者ƈ行分布式计算{操作上已经可以和C或Perl{语aq齐驱?/p> <p align="left">? 果你至今q是在怀疑Java的性能Q说明你的思想和观念已l完全落伍了QJava一两年应该用新的名词来定义。从JDK1.5开始又要提供关于线E、ƈ 发等新性能的支持,Java应用在游戏等适时领域斚w的机会已l成熟,Java在稳定自׃间gC后,开始蚕食传lC的领域?/p> <p align="left">本文主要单介lNIO的基本原理,在下一文章中Q将l合Reactor模式和著名线E大?a >Doug Lea</a>的一文章深入讨论?/p> <p align="left">NIO主要原理和适用?/p> <p align="left">NIO 有一个主要的cSelector,q个cM一个观察者,只要我们把需要探知的socketchannel告诉Selector,我们接着做别的事情,当有 事g发生Ӟ他会通知我们Q传回一lSelectionKey,我们dq些Key,׃获得我们刚刚注册q的socketchannel,然后Q我们从 q个Channel中读取数据,攑ֿQ包准能够读刎ͼ接着我们可以处理q些数据?/p> <p align="left">Selector内部原理实际是在做一个对所注册的channel的轮询访问,不断的轮?目前p一个算?Q一旦轮询到一个channel有所注册的事情发生,比如数据来了Q他׃站v来报告,交出一把钥匙,让我们通过q把钥匙来读取这个channel的内宏V?/p> <p align="left">了解了这个基本原理,我们l合代码看看使用Q在使用上,也在分两个方向,一个是U程处理Q一个是用非U程Q后者比较简单,看下面代码:</p> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.io.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.nio.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.nio.channels.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.nio.channels.spi.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.net.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> </span><span style="color: #0000ff;">import</span><span style="color: #000000;"> java.util.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br /> <br /> </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />  * </span><span style="color: #808080;">@author</span><span style="color: #008000;"> Administrator<br />  * </span><span style="color: #808080;">@version</span><span style="color: #008000;"><br />  </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> NBTest {<br /> <br />     </span><span style="color: #008000;">/**</span><span style="color: #008000;"> Creates new NBTest </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> NBTest() {<br />     }<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> startServer() </span><span style="color: #0000ff;">throws</span><span style="color: #000000;"> Exception {<br />         </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> channels </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />         </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> nKeys </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br />         </span><span style="color: #0000ff;">int</span><span style="color: #000000;"> currentSelector </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用Selector</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        Selector selector </span><span style="color: #000000;">=</span><span style="color: #000000;"> Selector.open();<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 建立Channel q绑定到9000端口</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        ServerSocketChannel ssc </span><span style="color: #000000;">=</span><span style="color: #000000;"> ServerSocketChannel.open();<br />         InetSocketAddress address </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> InetSocketAddress(InetAddress<br />                 .getLocalHost(), </span><span style="color: #000000;">9000</span><span style="color: #000000;">);<br />         ssc.socket().bind(address);<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使设定non-blocking的方式?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        ssc.configureBlocking(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br /> <br />         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 向Selector注册Channel及我们有兴趣的事?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        SelectionKey s </span><span style="color: #000000;">=</span><span style="color: #000000;"> ssc.register(selector, SelectionKey.OP_ACCEPT);<br />         printKeyInfo(s);<br /> <br />         </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (</span><span style="color: #0000ff;">true</span><span style="color: #000000;">) </span><span style="color: #008000;">//</span><span style="color: #008000;"> 不断的轮?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">        {<br />             debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">NBTest: Starting select</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /> <br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> Selector通过selectҎ通知我们我们感兴的事g发生了?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">            nKeys </span><span style="color: #000000;">=</span><span style="color: #000000;"> selector.select();<br />             </span><span style="color: #008000;">//</span><span style="color: #008000;"> 如果有我们注册的事情发生了,它的传回值就会大?</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">            </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (nKeys </span><span style="color: #000000;">></span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">) {<br />                 debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">NBTest: Number of keys after select operation: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> nKeys);<br /> <br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> Selector传回一lSelectionKeys<br />                 </span><span style="color: #008000;">//</span><span style="color: #008000;"> 我们从这些key中的channel()Ҏ中取得我们刚刚注册的channel?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">                Set selectedKeys </span><span style="color: #000000;">=</span><span style="color: #000000;"> selector.selectedKeys();<br />                 Iterator i </span><span style="color: #000000;">=</span><span style="color: #000000;"> selectedKeys.iterator();<br />                 </span><span style="color: #0000ff;">while</span><span style="color: #000000;"> (i.hasNext()) {<br />                     s </span><span style="color: #000000;">=</span><span style="color: #000000;"> (SelectionKey) i.next();<br />                     printKeyInfo(s);<br />                     debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">NBTest: Nr Keys in selector: </span><span style="color: #000000;">"</span><span style="color: #000000;"><br />                             </span><span style="color: #000000;">+</span><span style="color: #000000;"> selector.keys().size());<br /> <br />                     </span><span style="color: #008000;">//</span><span style="color: #008000;"> 一个key被处理完成后Q就都被从就l关键字Qready keysQ列表中除去</span><span style="color: #008000;"><br /> </span><span style="color: #000000;">                    i.remove();<br />                     </span><span style="color: #0000ff;">if</span><span style="color: #000000;"> (s.isAcceptable()) {<br />                         </span><span style="color: #008000;">//</span><span style="color: #008000;"> 从channel()中取得我们刚刚注册的channel?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;">                        Socket socket </span><span style="color: #000000;">=</span><span style="color: #000000;"> ((ServerSocketChannel) s.channel())<br />                                 .accept().socket();<br />                         SocketChannel sc </span><span style="color: #000000;">=</span><span style="color: #000000;"> socket.getChannel();<br /> <br />                         sc.configureBlocking(</span><span style="color: #0000ff;">false</span><span style="color: #000000;">);<br />                         sc.register(selector, SelectionKey.OP_READ<br />                                 </span><span style="color: #000000;">|</span><span style="color: #000000;"> SelectionKey.OP_WRITE);<br />                         System.out.println(</span><span style="color: #000000;">++</span><span style="color: #000000;">channels);<br />                     } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {<br />                         debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">NBTest: Channel not acceptable</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />                     }<br />                 }<br />             } </span><span style="color: #0000ff;">else</span><span style="color: #000000;"> {<br />                 debug(</span><span style="color: #000000;">"</span><span style="color: #000000;">NBTest: Select finished without any keys.</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />             }<br /> <br />         }<br /> <br />     }<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> debug(String s) {<br />         System.out.println(s);<br />     }<br /> <br />     </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> printKeyInfo(SelectionKey sk) {<br />         String s </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> String();<br /> <br />         s </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">Att: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> (sk.attachment() </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000ff;">null</span><span style="color: #000000;"> </span><span style="color: #000000;">?</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">no</span><span style="color: #000000;">"</span><span style="color: #000000;"> : </span><span style="color: #000000;">"</span><span style="color: #000000;">yes</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />         s </span><span style="color: #000000;">+=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">, Read: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> sk.isReadable();<br />         s </span><span style="color: #000000;">+=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">, Acpt: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> sk.isAcceptable();<br />         s </span><span style="color: #000000;">+=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">, Cnct: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> sk.isConnectable();<br />         s </span><span style="color: #000000;">+=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">, Wrt: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> sk.isWritable();<br />         s </span><span style="color: #000000;">+=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">, Valid: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> sk.isValid();<br />         s </span><span style="color: #000000;">+=</span><span style="color: #000000;"> </span><span style="color: #000000;">"</span><span style="color: #000000;">, Ops: </span><span style="color: #000000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> sk.interestOps();<br />         debug(s);<br />     }<br /> <br />     </span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />      * </span><span style="color: #808080;">@param</span><span style="color: #008000;"> args the command line arguments<br />      </span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String args[]) {<br />         NBTest nbTest </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;"> NBTest();<br />         </span><span style="color: #0000ff;">try</span><span style="color: #000000;"> {<br />             nbTest.startServer();<br />         } </span><span style="color: #0000ff;">catch</span><span style="color: #000000;"> (Exception e) {<br />             e.printStackTrace();<br />         }<br />     }<br /> }<br /> </span></div> <p align="left">q是一个守候在端口9000的noblock server例子Q如果我们编制一个客LE序Q就可以对它q行互动操作Q或者用telnet L?9000 可以链接上?/p> <img src ="http://www.tkk7.com/lvq810/aggbug/254369.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/lvq810/" target="_blank">lvq810</a> 2009-02-12 13:17 <a href="http://www.tkk7.com/lvq810/articles/254369.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>J2EE常用Jar包含?/title><link>http://www.tkk7.com/lvq810/articles/247629.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Sun, 21 Dec 2008 08:35:00 GMT</pubDate><guid>http://www.tkk7.com/lvq810/articles/247629.html</guid><wfw:comment>http://www.tkk7.com/lvq810/comments/247629.html</wfw:comment><comments>http://www.tkk7.com/lvq810/articles/247629.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/lvq810/comments/commentRss/247629.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/lvq810/services/trackbacks/247629.html</trackback:ping><description><![CDATA[<strong>commons-digester.jar</strong><br /> DigesterZ规则的XML文档解析,主要用于XML到Java对象的映?br /> <strong>commons-beanutils.jar</strong> <br /> 提供对Java 反射和自省API的包?br /> <strong>aspectjweaver.jar<br /> </strong>用于在Spring 2.0中集成AspectJ AspectJ LTWl入?br /> <strong>ognl.jar <br /> </strong>OGNL是Object-Graph Navigation Language的羃写,它是一U功能强大的表达式语aQExpression LanguageQ简UCؓELQ,通过它简单一致的表达式语法,可以存取对象的Q意属性,调用对象的方法,遍历整个对象的结构图Q实现字D늱型{化等? 能。它使用相同的表辑ּd取对象的属?br /> <br /> hibernate2依赖的一些包 <br /> <strong>hibernate2.jar</strong> <br /> Hibernate的库Q没有什么可说的Q必M用的jar?br /> <strong>cglib-asm.jar</strong><br /> CGLIB库,Hibernate用它来实现PO字节码的动态生成,非常核心的库Q必M用的jar?br /> <strong>dom4j.jar</strong><br /> dom4j是一个Java的XML APIQ类gjdomQ用来读写XML文g的。dom4j是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的YӞ可以在SourceForge上找到它。在IBM developerWorks上面可以扑ֈ一文章,对主的Java XML APIq行的性能、功能和易用性的评测Qdom4j无论在那个方面都是非常出色的。我早在近两年之前开始用dom4jQ直到现在。如今你可以看到? 来越多的Java软g都在使用dom4j来读写XMLQ特别值得一提的是连Sun的JAXM也在用dom4j。这是必M用的jar 包,Hibernate用它来读写配|文件?br /> <strong>odmg.jar<br /> </strong>ODMG是一个ORM的规范,Hibernate实现了ODMG规范Q这是一个核心的库,必须使用的jar?br /> <strong>commons-collections.jar</strong> <br /> Apache Commons包中的一个,包含了一些Apache开发的集合c,功能比java.util.*强大。必M用的jar?br /> <strong>commons-beanutils.jar</strong> <br /> Apache Commons包中的一个,包含了一些Bean工具cȝ。必M用的jar?br /> <strong>commons-lang.jar<br /> </strong>Apache Commons包中的一个,包含了一些数据类型工LQ是java.lang.*的扩展。必M用的jar?br /> <strong>commons-logging.jar<br /> </strong>Apache Commons包中的一个,包含了日志功能,必须使用的jar包。这个包本n包含了一个Simple LoggerQ但是功能很弱。在q行的时候它会先在CLASSPATH找log4jQ如果有Q就使用log4jQ如果没有,找JDK1.4带的 java.util.loggingQ如果也找不到就用Simple Logger。commons-logging.jar的出现是一个历史的的遗留的遗憾Q当初Apache极力游说Sun把log4j加入JDK1.4Q? 然而JDK1.4目组已经接近发布JDK1.4产品的时间了Q因此拒l了Apache的要求,使用自己的java.util.loggingQ这个包 的功能比log4j差的很远Q性能也一般?br /> 后来Apache开发出来了commons-logging.jar用来兼容两个logger。因此用commons-logging.jar写的 logE序Q底层的Logger是可以切换的Q你可以选择log4jQjava.util.logging或者它自带的Simple Logger。不q我仍然强烈使用log4jQ因为log4j性能很高Qlog输出信息旉几乎{于System.outQ而处理一条logq_只需 ?us。你可以在Hibernate的src目录下找到Hibernate已经Z准备好了的log4j的配|文Ӟ你只需要到Apache |站M载log4j可以了。commons-logging.jar也是必须的jar包?br /> 使用Hibernate必须的jar包就是以上的q几个,剩下的都是可选的<br /> <strong>ant.jar<br /> </strong>Ant~译工具的jar包,用来~译Hibernate源代码的。如果你不准备修改和~译Hibernate源代码,那么没有什么用Q可选的jar?br /> <strong>optional.jar <br /> </strong>Ant的一个辅助包<br /> <strong>c3p0.jar</strong> <br /> C3PO是一个数据库q接池,Hibernate可以配置Z用C3POq接池。如果你准备用这个连接池Q就需要这个jar包?br /> <strong>proxool.jar<br /> </strong>也是一个连接池Q同?br /> <strong>commons-pool.jar,</strong><strong>commons-dbcp.jar<br /> </strong>DBCP数据库连接池QApache的Jakartal织开发的QTomcat4的连接池也是DBCP?<br /> 实际上Hibernate自己也实C一个非帔R常简单的数据库连接池Q加上上?个,你实际上可以在Hibernate上选择4U不同的数据库连接池Q? 选择哪一个看个h的偏好,不过DBCP可能更通用一些。另外强调一点,如果在EJB中用HibernateQ一定要用App Server的连接池Q不要用以上4U连接池Q否则容器管理事务不起作?br /> <strong>connector.jar<br /> </strong>JCA 规范Q如果你在App Server上把Hibernate配置为Connector的话Q就需要这个jar。不q实际上一般App Server肯定会带上这个包Q所以实际上是多余的?br /> <strong>jaas.jar<br /> </strong>JAAS是用来进行权限验证的Q已l包含在JDK1.4里面了。所以实际上是多余的包?br /> <strong>jcs.jar <br /> </strong>如果你准备在Hibernate中用JCS的话Q那么必d括它Q否则就不用?br /> <strong>jdbc2_0-stdext.jar<br /> </strong>JDBC2.0的扩展包Q一般来说数据库q接池会用上它。不qApp Server都会带上Q所以也是多余的?br /> <strong>jta.jar<br /> </strong>JTA规范Q当Hibernate使用JTA的时候需要,不过App Server都会带上Q所以也是多余的?br /> <strong>junit.jar</strong><br /> Junit包,当你q行Hibernate自带的测试代码的时候需要,否则׃用?br /> <strong>xalan.jar, xerces.jar, xml-apis.jar<br /> </strong>Xerces是XML解析器,Xalan是格式化器,xml-apis实际上是JAXP。一般App Server都会带上QJDK1.4也包含了解析器,不过不是XercesQ是CrimsonQ效率比较差Q不qHibernate用XML只不q是d 配置文gQ性能没什么紧要的Q所以也是多余的<br /> <strong>antlr.jar</strong> <br /> 语法生成工具<br /> <br /> spring 相关jar包作用:<br /> 除了spring.jar文gQSpringq包括有其它13个独立的jar包,各自包含着对应的SpringlgQ用户可以根据自q需要来选择l合自己的jar包,而不必引入整个spring.jar的所有类文g?br /> <strong>(1) spring-core.jar</strong><br /> q个jar文g包含Spring框架基本的核心工LQSpring其它lg要都要用到q个包里的类Q是其它lg的基本核心,当然你也可以在自q应用pȝ中用这些工L?br /> <strong>(2) spring-beans.jar<br /> </strong>q个jar文g是所有应用都要用到的Q它包含讉K配置文g、创建和理bean以及q行Inversion of Control / Dependency InjectionQIoC/DIQ操作相关的所有类。如果应用只需基本的IoC/DI支持Q引入spring-core.jar及spring- beans.jar文g可以了?br /> <strong>(3) spring-aop.jar<br /> </strong>q个jar文g包含在应用中使用Spring的AOPҎ时所需的类。用基于AOP的SpringҎ,如声明型事务理QDeclarative Transaction ManagementQ,也要在应用里包含q个jar包?br /> <strong>(4) spring-context.jar<br /> </strong>  q个jar文g为Spring核心提供了大量扩展。可以找C用Spring ApplicationContextҎ时所需的全部类QJDNI所需的全部类QUI斚w的用来与模板QTemplatingQ引擎如 Velocity、FreeMarker、JasperReports集成的类Q以及校验Validation斚w的相关类?br /> <strong>(5) spring-dao.jar<br /> </strong>  q个jar文g包含Spring DAO、Spring Transactionq行数据讉K的所有类。ؓ了用声明型事务支持Q还需在自q应用里包含spring-aop.jar?br /> <strong>(6) spring-hibernate.jar<br /> </strong>  q个jar文g包含Spring对Hibernate 2及Hibernate 3q行装的所有类?br /> <strong>(7) spring-jdbc.jar<br /> </strong>  q个jar文g包含对Spring对JDBC数据讉Kq行装的所有类?br /> <strong>(8) spring-orm.jar<br /> </strong>  q个jar文g包含Spring对DAOҎ集q行了扩展,使其支持 iBATIS、JDO、OJB、TopLinkQ因为Hibernate已经独立成包了,现在不包含在q个包里了。这个jar文g里大部分的类都要依赖 spring-dao.jar里的c,用这个包时你需要同时包含spring-dao.jar包?br /> <strong>(9) spring-remoting.jar</strong><br /> q个jar文g包含支持EJB、JMS、远E调用RemotingQRMI、Hessian、Burlap、Http Invoker、JAX-RPCQ方面的cR?br /> <strong>(10) spring-support.jar<br /> </strong>  q个jar文g包含支持~存CacheQehcacheQ、JCA、JMX、邮件服务(Java Mail、COS MailQ、Q务计划SchedulingQTimer、QuartzQ方面的cR?br /> <strong>(11) spring-web.jar<br /> </strong>  q个jar文g包含Web应用开发时Q用到Spring框架时所需的核心类Q包括自动蝲入WebApplicationContextҎ的cRStruts与JSF集成cR文件上传的支持cRFiltercd大量工具辅助cR?br /> <strong>(12) spring-webmvc.jar<br /> </strong>  q个jar文g包含Spring MVC框架相关的所有类。包含国际化、标{、Theme、视囑ֱ现的FreeMarker、JasperReports、Tiles、Velocity? XSLT相关cR当Ӟ如果你的应用使用了独立的MVC框架Q则无需q个JAR文g里的McR?br /> <strong>(13) spring-mock.jar</strong><br /> q个jar文g包含Spring一整套mockcL辅助应用的测试。Spring试套g使用了其中大量mockc,q样试更加简单。模拟HttpServletRequest和HttpServletResponsecdWeb应用单元试是很方便的?br /> jstl相关jar包简?br /> ׃要搭SSH框架Q面寚w么多包,都不知道q嘛的,于是把每个包的作用都查q去Q有Ҏ聊,呵呵?br /> <br /> <strong>mail.jar</strong> <br /> java发送电子邮?,里面包含了activation.jar和mail.jar两个?通过里面的类的调用便可以辑ֈ发送电子邮件的目的.里面.......<br /> <strong>dom.jar</strong> <br /> 文对象模型”(DOM)允许开发者在 XML l构内引用、检索和更改 XML l构中的各项元素?br /> <strong>jaxen-full.jar</strong><br /> jaxen是一个用Java开发的XPath 引擎,支持JDOM, dom4j?br /> <strong>jaxp-api.jar</strong> <br /> JAXP是Java API for XML Processing的英文字头羃?中文含义?用于XML文档处理的用Java语言~写的编E接?br /> <strong>jadb2_0-stdxt.jar</strong> <br /> javax.sql包,可以查下java API?br /> <strong>jstl.jar</strong><br /> <strong>sax.jar</strong> <br /> SAX是一个用于处理XML事g驱动?#8220;?#8221;模型Q虽然它不是W3C标准Q但它却是一个得Cq泛认可的API<br /> <strong>saxpath.jar</strong> <br /> SAXPath is an event-based API for XPath parsers, that is, for parsers which parse XPath expressions. SAXPath is intended to be for XPath what SAX is for XML<br /> <strong>standard.jar</strong> <br /> 标准标签库包。jstl核心的两个包之一?br /> <strong>xalan.jar</strong> <br /> Xalan是将可扩展标记语a(XML)转换文本链接标识语言(HTML)或其它类型XML文的规?br /> <strong>xercesImpl.jar</strong> <br /> 实现解析XML文g的功能很方便,我们可以通过下蝲W三方的一些工具包如xml-<strong>apis.jar,xercesImpl.jar</strong> <br /> Xerces是一个与可扩展标记语a(XML)兼容的语法分析器。Xerces分析器可处理Java和C++,它采用互联网联盟XML、文件对?..Xerces-C是用可移植的C++子集~写的XML分析器。Xerces-C允许对XML数据q行d操作<br /> 如果要用JSTL,则必djstl.jar和standard.jar文g攑ֈclasspath?如果你还需要用XML processing及Database access (SQL)标签,q要相关JAR文g攑ֈclasspath?q些JAR文g全部存在于下载回来的zip文g中? <img src ="http://www.tkk7.com/lvq810/aggbug/247629.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/lvq810/" target="_blank">lvq810</a> 2008-12-21 16:35 <a href="http://www.tkk7.com/lvq810/articles/247629.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]Spring2提供的Remote包学习笔?/title><link>http://www.tkk7.com/lvq810/articles/238533.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Tue, 04 Nov 2008 04:05:00 GMT</pubDate><guid>http://www.tkk7.com/lvq810/articles/238533.html</guid><wfw:comment>http://www.tkk7.com/lvq810/comments/238533.html</wfw:comment><comments>http://www.tkk7.com/lvq810/articles/238533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/lvq810/comments/commentRss/238533.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/lvq810/services/trackbacks/238533.html</trackback:ping><description><![CDATA[原文Qhttp://www.tkk7.com/xmatthew/archive/2008/11/02/238208.html    作者:xmatthew<br /> <br /> Spring2 针对q程讉K服务Q提供的一个remote包。其的的是提供一套统一的远E服务发布功能?br /> 先来看一下Spring2支持那些q程服务功能:<br />     1. RMI服务<br />     2. Hessian或者Burlap通过HTTPq程调用服务<br />     3. HTTP调用器暴露服?br /> <br /> 下面用一个例子,来看一下Spring2 是怎样对这些服务进行统一的封装和理?br /> <br /> 先看一下服务器端的源代?br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">interface</span><span style="color: #000000;"> IBookService {<br /> <br />     Book getById(String id);<br /> <br /> }<br /> <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> Book {<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String name;<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String id;<br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> String author;<br /> <br /> }<br />     <br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> BookService </span><span style="color: #0000ff;">implements</span><span style="color: #000000;"> IBookService {<br /> <br />     </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Book getById(String id) {<br />         </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> BookStore.getById(id);<br />     }<br /> <br /> }   <br /> </span></div> <br /> 客户端源代码<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">class</span><span style="color: #000000;"> BookQueryService {<br />   </span><span style="color: #0000ff;">private</span><span style="color: #000000;"> IBookService bookService;<br />   </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> setAccountService(IBookService bookService) {<br />     </span><span style="color: #0000ff;">this</span><span style="color: #000000;">.bookService </span><span style="color: #000000;">=</span><span style="color: #000000;"> bookService;<br />   }<br />   <br />   </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> Book getBookById(String id) {<br />       </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> bookService.getById(id);<br />   }<br /> }<br /> <br /> </span><span style="color: #008000;">//</span><span style="color: #008000;">客户端调用示?/span><span style="color: #008000;"><br /> </span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> </span><span style="color: #0000ff;">static</span><span style="color: #000000;"> </span><span style="color: #0000ff;">void</span><span style="color: #000000;"> main(String[] args) {<br /> <br />   ClassPathXmlApplicationContext context;<br />     context </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000ff;">new</span><span style="color: #000000;">  ClassPathXmlApplicationContext(</span><span style="color: #000000;">"</span><span style="color: #000000;">applicationContext.xml</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />     BookQueryService bookQueryService </span><span style="color: #000000;">=</span><span style="color: #000000;"> (BookQueryService) context.getBean(</span><span style="color: #000000;">"</span><span style="color: #000000;">bookQueryService</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />     Book book </span><span style="color: #000000;">=</span><span style="color: #000000;"> bookQueryService.getBookById(</span><span style="color: #000000;">"</span><span style="color: #000000;">1</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /> }</span></div> <br /> 使用Spring2 发布 RMI服务CZ<br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">服务器端配置:<br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.BookService"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="org.springframework.remoting.rmi.RmiServiceExporter"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #008000;"><!--</span><span style="color: #008000;"> does not necessarily have to be the same name as the bean to be exported </span><span style="color: #008000;">--></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceName"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="service"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="registryPort"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="1800"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> <br /> 客户端配|?<br /> <br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.client.BookQueryService"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="org.springframework.remoting.rmi.RmiProxyFactoryBean"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceUrl"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="rmi://localhost:1800/bookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span></div> <br /> 使用Spring2 发布 ZHttp的Hessian服务CZ<br /> 注: Hessian提供一U基于HTTP的二q制q程协议。它是由Caucho创徏的,可以?http://www.caucho.com 扑ֈ更多有关Hessian的信息?br />  <br /> 首ؓ使用HessianQ需要ؓ光|Spring ?DispatcherServlet<br /> 把下面的配置加入到web.xml?br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #0000ff;"><</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">></span><span style="color: #000000;">remoting</span><span style="color: #0000ff;"></</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">></span><span style="color: #000000;">org.springframework.web.servlet.DispatcherServlet</span><span style="color: #0000ff;"></</span><span style="color: #800000;">servlet-class</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">load-on-startup</span><span style="color: #0000ff;">></span><span style="color: #000000;">1</span><span style="color: #0000ff;"></</span><span style="color: #800000;">load-on-startup</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">servlet</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">></span><span style="color: #000000;">remoting</span><span style="color: #0000ff;"></</span><span style="color: #800000;">servlet-name</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">></span><span style="color: #000000;">/remoting/*</span><span style="color: #0000ff;"></</span><span style="color: #800000;">url-pattern</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">servlet-mapping</span><span style="color: #0000ff;">></span></div> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">服务器端配置:<br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.BookService"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="/bookService"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="org.springframework.remoting.caucho.HessianServiceExporter"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />   </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="service"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />   </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> <br /> 客户端配|?<br /> <br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.client.BookQueryService"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="org.springframework.remoting.caucho.HessianProxyFactoryBean"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceUrl"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="http://localhost:8080/bookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span></div> <br /> 使用Spring2 发布 ZHttp的Burlap服务CZ<br />  BurlapQ它是一个基于XML的Hessian替代Ҏ。它的配|方法和上述Hessian的一栗只要把 Hessian 换成 Burlap p了?br />  服务器端使用:<br />      org.springframework.remoting.caucho.BurlapServiceExporter 发布服务<br />  客户端?<br />      org.springframework.remoting.caucho.BurlapProxyFactoryBean<br /> <br /> 使用Spring2 发布 ZHTTP调用器暴露服?br /> 和用自w序列化机制的轻量协议Burlap和Hessian相反QSpring HTTP调用器用标准Java序列化机制来通过HTTP暴露业务.<br /> 但其配置与Burlap和Hessian很相q?br /> <br /> <div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><span style="color: #000000;">服务器端配置:<br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.BookService"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="/bookService"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />   </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="service"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />   </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> <br /> 客户端配|?<br /> <br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">class</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.client.BookQueryService"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;"> ref</span><span style="color: #0000ff;">="bookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br /> <br /> </span><span style="color: #0000ff;"><</span><span style="color: #800000;">bean </span><span style="color: #ff0000;">id</span><span style="color: #0000ff;">="bookService"</span><span style="color: #ff0000;"> class</span><span style="color: #0000ff;">="org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean"</span><span style="color: #0000ff;">></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceUrl"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="http://localhost:8080/bookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br />     </span><span style="color: #0000ff;"><</span><span style="color: #800000;">property </span><span style="color: #ff0000;">name</span><span style="color: #0000ff;">="serviceInterface"</span><span style="color: #ff0000;"> value</span><span style="color: #0000ff;">="com.xmatthew.spring.remote.IBookService"</span><span style="color: #0000ff;">/></span><span style="color: #000000;"><br /> </span><span style="color: #0000ff;"></</span><span style="color: #800000;">bean</span><span style="color: #0000ff;">></span></div> <br /> <br /> <br /> <img src ="http://www.tkk7.com/lvq810/aggbug/238533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/lvq810/" target="_blank">lvq810</a> 2008-11-04 12:05 <a href="http://www.tkk7.com/lvq810/articles/238533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring 2.5 版本的Spring MVC应用 Hello world!http://www.tkk7.com/lvq810/articles/230385.htmllvq810lvq810Mon, 22 Sep 2008 03:39:00 GMThttp://www.tkk7.com/lvq810/articles/230385.htmlhttp://www.tkk7.com/lvq810/comments/230385.htmlhttp://www.tkk7.com/lvq810/articles/230385.html#Feedback0http://www.tkk7.com/lvq810/comments/commentRss/230385.htmlhttp://www.tkk7.com/lvq810/services/trackbacks/230385.htmlSpring 2.5全面支持annotation方式Q因此大大减了XML的配|,提高了程序代码的l护和生产效率。下面是我做的一个简单的Hello World!Q?span class="hilite1">Spring mvc。所有配|全部用annotationQ大家可以看看是多么的简单?

首先q是配置好web.xml文gQ主要添加的代码有:

   1. <listener>  
   2.         
<listener-class>  
   3.             org.springframework.web.util.Log4jConfigListener  
   4.         
</listener-class>  
   5.     
</listener>  
   6.   
   7.     
<listener>  
   8.         
<listener-class>  
   9.             org.springframework.web.context.ContextLoaderListener  
  10.         
</listener-class>  
  11.     
</listener>  
  12.   
  13.     
<welcome-file-list>  
  14.         
<welcome-file>index.jsp</welcome-file>  
  15.     
</welcome-file-list>  
  16.   
  17.     
<servlet>  
  18.         
<servlet-name>sim</servlet-name>  
  19.         
<servlet-class>  
  20.             org.springframework.web.servlet.DispatcherServlet  
  21.         
</servlet-class>  
  22.     
</servlet>  
  23.   
  24.     
<servlet-mapping>  
  25.         
<servlet-name>sim</servlet-name>  
  26.         
<url-pattern>*.html</url-pattern>  
  27.     
</servlet-mapping> 

以上的配|和以前是一LQ所以没什么好说的?
然后接着我们建立一个applicationContext.xmlQ作?span class="hilite1">SPRING的配|文件。以往版本里面SPRING? q个配置文g往往随着E序的增加而越来越臃肿Q就我本人来说就十分不喜Ƣ这U方式。因为程序员需要花费大量的旉ȝ理和l护自己的XML文gQ大大的? 了E序员的生效率。ƈ且由于大量的XML文gQ得新加入团队的h员学习成本的增加Q往往造成了很多工时上的浪贏V终于,2.5版本开始支持了annotationQ得这个问题可以得C定的解决。那么好Q下面我们来看看现在的配|文件?

   1. <?xml version="1.0" encoding="UTF-8"?>  
   2. 
<beans xmlns="http://www.springframework.org/schema/beans"  
   3.     xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"  
   4.     xmlns:context
="http://www.springframework.org/schema/context"  
   5.     xsi:schemaLocation
="http://www.springframework.org/schema/beans   
   6.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
   7.            http://www.springframework.org/schema/context  
   8.            http://www.springframework.org/schema/context/spring-context-2.5.xsd"
>  
   9.     
<context:annotation-config />  
  10. 
</beans> 

很好Q很强大Q简单一句话搞定?
搞定了IOC的配|文Ӟ那么我们需要一个MVC的配|XMLQ如果没有annotationQ那么这个文件一样会来臃ѝ然后现在呢Q?
sim-servlet.xml

   1. <?xml version="1.0" encoding="UTF-8"?>  
   2. 
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
   3.         xmlns:p
="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"  
   4.         xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
   5.                 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
>  
   6.       
   7.     
<!-- 
   8.         - The controllers are autodetected POJOs labeled with the @Controller annotation. 
   9.     
-->  
  10.     
<context:component-scan base-package="com.sofmit.sim.wr.web"/>  
  11.       
  12.     
<!--  
  13.         - This bean configures the 'prefix' and 'suffix' properties of   
  14.         - InternalResourceViewResolver, which resolves logical view names   
  15.         - returned by Controllers. For example, a logical view name of "vets"   
  16.         - will be mapped to "/WEB-INF/jsp/vets.jsp".  
  17.     
-->  
  18.     
<bean  
  
19.         class="org.springframework.web.servlet.view.InternalResourceViewResolver"  
  20.         p:prefix
="/WEB-INF/jsp/" p:suffix=".jsp" />  
  21. 
</beans> 

同样十分单,在这里只需要指定好CONTROLLER的包可以了?

现在配置已经全部OK了,是不是感觉很LQ哈哈,原来annotation真是如此妙Qؓ我们节约了大量的配置XML的时间?
下面只需要一个controller和一个JSP面可以完成我们这儿APPLICATION了,那么我们l箋?
首先是controller的定义?

   1/** 
   2.  * com.sofmit.sim.wr.web 
   3.  * Hello.java 
   4.  
*/  
   
5package com.sofmit.sim.wr.web;  
   
6.   
   
7import org.springframework.stereotype.Controller;  
   
8import org.springframework.ui.Model;  
   
9import org.springframework.web.bind.annotation.RequestMapping;  
  
10import org.springframework.web.bind.annotation.RequestMethod;  
  
11.   
  
12/** 
  13.  * 
@author TianYe 
  14.  * 2008-2-14 
  15.  
*/  
  
16. @Controller  
  
17. @RequestMapping("/hello.html")  
  
18public class Hello {  
  
19.   
  
20.     @RequestMapping(method = RequestMethod.GET)  
  
21.     public String sayHello(Model model){  
  
22.         model.addAttribute("say","hello");  
  
23.         return "test";  
  
24.     }  
  
25. } 

在这里面Q用@Controller定义此类是一?span class="hilite1">Spring MVC的controller。然后定义好讉K的\?/hello.html"。在Ҏ上面定义好通过GET方式讉K时调用我们的sayHelloҎQ在Ҏ中定义好要传lJSP面的变?say"以及内容"hello"Q然后定位到面"test"?
一个简单的controller实C?

剩下的就没有什么技术含量了Q就是一个简单的JSP面?

   1. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
   2. 
<h2>Test Page say:${say}</h2> 



lvq810 2008-09-22 11:39 发表评论
]]>
JSP中基于Session的在U用L计分?/title><link>http://www.tkk7.com/lvq810/articles/229503.html</link><dc:creator>lvq810</dc:creator><author>lvq810</author><pubDate>Wed, 17 Sep 2008 10:10:00 GMT</pubDate><guid>http://www.tkk7.com/lvq810/articles/229503.html</guid><wfw:comment>http://www.tkk7.com/lvq810/comments/229503.html</wfw:comment><comments>http://www.tkk7.com/lvq810/articles/229503.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/lvq810/comments/commentRss/229503.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/lvq810/services/trackbacks/229503.html</trackback:ping><description><![CDATA[JSP作ؓ后v之秀能够在服务器~程环境中占据一定地位,是和它良好支持一pd业界标准密切相关的。Session是它提供的基础设施之一。作Z个程 序员Q你可以不介意具体在客户端是如何实现Q就方便的实现简单的Zsession的用L理。现在对于处理在U用P有几U不同的处理Ҏ?br /> <br /> 一U是面hqhӞ服务器端控制一个超时时间比?0分钟Q到了时间之后用h有动作就被踢出。这U方法的优点是,如果用户忘了退出,可以防止 别h恶意操作。缺ҎQ如果你在做一件很耗时间的事情Q超q了q个旉限制Qsubmit的时候可能要再次面登陆。如果原来的叉又是强制失效的话Q就 有可能丢׃做的工作。在实现的角度来看,q是最单的QServer端默认实现的是q样的模式?br /> <br /> 另一U方式是Q站炚w用框架结 构,有一个Frame或者隐藏的iframe在不断刷斎ͼq样你永q不会被t出Q但是服务器端ؓ了判断你是否在线Q需要定一个发呆时_如果过q个发呆 旉你除了这个自动刷新的面外没有刷新其他页面的话,pZ已经不在U了。采取这U方式的典型是xici.net? 他的优点是可以可以利用不断的h实现一些类似server-push的功能,比如|友之间发送消息?br /> <br /> 不管哪一U模式,Z实现览当前所有的在线用户Q还需要做一些额外的工作。servlet API中没有得到Session列表的API?br /> <br /> 可以利用的是Listener. Servlet 2.2?.3规范在这里略微有一些不一栗?.2中HttpSessionBindingListener可以实现当一个HTTPSession中的 Attribute变化的时候通知你的cR?.3中还引入了HttpSessionAttributeListener.鉴于我用的环境? Visual age for java 4和JRun server 3.1,他们q不直接支持Servlet 2.3的编E,q里我用的是HttpSessionBindingListener.<br /> <br /> 需要做的事情包括做一个新的类来实现HttpSessionBindingListener接口。这个接口有两个ҎQ?br /> <br /> <table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"> <tbody> <tr> <td>public void valueBound(HttpSessionBindingEvent event)<br /> public void valueUnbound(HttpSessionBindingEvent event)</td> </tr> </tbody> </table> <br /> 当你执行Session.addAttribute(String,Object)的时候,如果你已l把一个实C HttpSessionBindingListener接口的类加入为Attribute,Session会通知你的c,调用你的valueBound? 法。相反,Session.removeAttributeҎ对应的是valueUndoundҎ?br /> <br /> <table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"> <tbody> <tr> <td>public class HttpSessionBinding implements javax.servlet.http.HttpSessionBindingListener <br /> {<br /> ServletContext application = null;<br /> <br /> public HttpSessionBinding(ServletContext application)<br /> {<br /> super();<br /> if (application ==null)<br /> throw new IllegalArgumentException("Null application is not accept.");<br /> this.application = application;<br /> }<br /> <br /> public void valueBound(javax.servlet.http.HttpSessionBindingEvent e) <br /> { <br /> Vector activeSessions = (Vector) application.getAttribute("activeSessions");<br /> if (activeSessions == null)<br /> {<br /> activeSessions = new Vector();<br /> }<br /> <br /> JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("user");<br /> if (sessionUser != null)<br /> {<br /> activeSessions.add(e.getSession());<br /> }<br /> application.setAttribute("activeSessions",activeSessions);<br /> }<br /> <br /> public void valueUnbound(javax.servlet.http.HttpSessionBindingEvent e) <br /> {<br /> JDBCUser sessionUser = (JDBCUser)e.getSession().getAttribute("user");<br /> if (sessionUser == null)<br /> {<br /> Vector activeSessions = (Vector) application.getAttribute("activeSessions");<br /> if (activeSessions != null)<br /> {<br /> activeSessions.remove(e.getSession().getId());<br /> application.setAttribute("activeSessions",activeSessions);<br /> }<br /> }<br /> }<br /> }</td> </tr> </tbody> </table> <br /> 假设其中的JDBCUsercL一个Q意UsercR在执行用户dӞ把UsercdHttpSessionBindingc都加入到Session中去?br /> <br /> q样Q每ơ用L录后Q在application中的attribute "activeSessions"q个vector中都会增加一条记录。每当session时QvalueUnbound被触发,在这个vector中删d要被时的session.<br /> <br /> <table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"> <tbody> <tr> <td>public void login()<br /> throws ACLException,SQLException,IOException<br /> {<br /> /* get JDBC User Class */<br /> if (user != null)<br /> {<br /> logout();<br /> }<br /> {<br /> // if session time out, or user didn't login, save the target url temporary.<br /> <br /> JDBCUserFactory uf = new JDBCUserFactory();<br /> <br /> if ( (this.request.getParameter("userID")==null) || (this.request.getParameter("password")==null) )<br /> {<br /> throw new ACLException("Please input a valid userName and password.");<br /> }<br /> <br /> JDBCUser user = (JDBCUser) uf.UserLogin(<br /> this.request.getParameter("userID"),<br /> this.request.getParameter("password") );<br /> user.touchLoginTime();<br /> this.session.setAttribute("user",user);<br /> this.session.setAttribute("BindingNotify",new HttpSessionBinding(application));<br /> }<br /> }</td> </tr> </tbody> </table> <br /> Login的时候,把User和这个BindingNotofy目的的类都加入到session中去。logout的时候,pd在activeSessionsq个vector中删去这个session.<br /> <br /> <table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"> <tbody> <tr> <td>public void logout()<br /> throws SQLException,ACLException<br /> {<br /> if (this.user == null && this.session.getAttribute("user")==null)<br /> {<br /> return;<br /> }<br /> <br /> Vector activeSessions = (Vector) this.application.getAttribute("activeSessions");<br /> if (activeSessions != null)<br /> {<br /> activeSessions.remove(this.session);<br /> application.setAttribute("activeSessions",activeSessions);<br /> }<br /> <br /> java.util.Enumeration e = this.session.getAttributeNames();<br /> <br /> while (e.hasMoreElements())<br /> {<br /> String s = (String)e.nextElement();<br /> this.session.removeAttribute(s);<br /> }<br /> this.user.touchLogoutTime();<br /> this.user = null;<br /> }</td> </tr> </tbody> </table> <br /> q两个函C于一个HttpSessionManagercM.q个cd用了jsp里面的application全局对象。这个类的其他代码和本文无关且相当长Q我׃贴出来了?br /> <br /> 下面来看看jsp里面怎么用?br /> <br /> 假设一个登录用的表单被提交到doLogin.jsp, 表单中包含UserName和password域。节选部分片D:<br /> <br /> <table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"> <tbody> <tr> <td>Q?<br /> HttpSessionManager hsm = new HttpSessionManager(application,request,response);<br /> try<br /> {<br /> hsm.login();<br /> }<br /> catch ( UserNotFoundException e)<br /> {<br /> response.sendRedirect("InsufficientPrivilege.jsp?detail=User%20does%20not%20exist.");<br /> return;<br /> }<br /> catch ( InvalidPasswordException e2)<br /> { <br /> response.sendRedirect("InsufficientPrivilege.jsp?detail=Invalid%20Password");<br /> return;<br /> }<br /> catch ( Exception e3)<br /> {<br /> %Q?Error:Q?=e3.toString() %Q<brQ?br /> Press Qa href="login.jsp"QHereQ?aQ?to relogin.<br /> Q? return;<br /> }<br /> response.sendRedirect("index.jsp");<br /> %Q?/td> </tr> </tbody> </table> <br /> 再来看看现在我们怎么得到一个当前在U的用户列表?br /> <br /> <table align="center" bgcolor="#e3e3e3" border="1" bordercolor="#cccccc" width="90%"> <tbody> <tr> <td>Qbody bgcolor="#FFFFFF"Q?br /> Qtable cellspacing="0" cellpadding="0" width="100%"Q?br /> <br /> Qtr Q?br /> Qtd style="width:24px"QSessionId<br /> Q?tdQ?br /> Qtd style="width:80px" QUser<br /> Q?tdQ?br /> Qtd style="width:80px" QLogin Time<br /> Q?tdQ?br /> Qtd style="width:80px" QLast access Time<br /> Q?tdQ?br /> Q?trQ?br /> Q?<br /> Vector activeSessions = (Vector) application.getAttribute("activeSessions");<br /> if (activeSessions == null)<br /> {<br /> activeSessions = new Vector();<br /> application.setAttribute("activeSessions",activeSessions);<br /> }<br /> <br /> Iterator it = activeSessions.iterator();<br /> while (it.hasNext())<br /> {<br /> HttpSession sess = (HttpSession)it.next();<br /> JDBCUser sessionUser = (JDBCUser)sess.getAttribute("user");<br /> String userId = (sessionUser!=null)?sessionUser.getUserID():"None";<br /> %Q?br /> QtrQ?br /> Qtd nowrap=''Q<%= sess.getId() %Q</tdQ?br /> Qtd nowrap=''Q<%= userId %Q</tdQ?br /> Qtd nowrap=''Q?br /> Q?= BeaconDate.getInstance( new java.util.Date(sess.getCreationTime())).getDateTimeString()%Q</tdQ?br /> Qtd class="Q?= stl %Q?" nowrap=''Q?br /> Q?= BeaconDate.getInstance( new java.util.Date(sess.getLastAccessedTime())).getDateTimeString()%Q</tdQ?br /> Q?trQ?br /> Q?<br /> }<br /> %Q?br /> Q?tableQ?br /> Q?bodyQ?/td> </tr> </tbody> </table> <br /> 以上的代码从application中取出activeSessionsQƈ且显C出具体的时间。其中BeaconDatecd设ؓ格式化时间的cR?br /> <br /> q样Q我们得C一个察看在U用L列表的框架。至于在U用户列表分늭功能Q与本文无关Q不予讨论?br /> <br /> q是一个非h模型的例子,依赖于session的超时机制。我的同事sonymusic指出很多时候由于各个厂商思想的不同,q有可能是不可信赖的? 考虑到这U需求,需要在每个叉h的时候都判断当前用户距离上次使用的时间是否超q某一个预定时间倹{这实质上就是自己实现session时。如果需 要实现刷新模型,必M用这U每个叶面进行刷新判断的Ҏ? <br /> <img src ="http://www.tkk7.com/lvq810/aggbug/229503.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/lvq810/" target="_blank">lvq810</a> 2008-09-17 18:10 <a href="http://www.tkk7.com/lvq810/articles/229503.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>110个知名Java目集锦 http://www.tkk7.com/lvq810/articles/227026.htmllvq810lvq810Thu, 04 Sep 2008 09:37:00 GMThttp://www.tkk7.com/lvq810/articles/227026.htmlhttp://www.tkk7.com/lvq810/comments/227026.htmlhttp://www.tkk7.com/lvq810/articles/227026.html#Feedback0http://www.tkk7.com/lvq810/comments/commentRss/227026.htmlhttp://www.tkk7.com/lvq810/services/trackbacks/227026.html
目名称   目描述
ASM Java bytecode manipulation framework
AspectWerkz AspectWerkz - Dynamic AOP for Java
Axis Axis - an implementation of the SOAP (Simple Object Access Protocol) submission to W3C
Batik Batik SVG Toolkit - Toolkit using images in the Scalable Vector Graphics (SVG) format
BCEL Byte Code Engineering Library - Analyze, create and manipulate Java class files
BeanUtils BeanUtils - Utilities for working with JavaBeans
Catalina Catalina - Servlet and JSP based web server
Cayenne Professional Object Relational Mapping
CGLIB CGLIB - Dynamic byte code generatorhttp://andyluo.blogjava.net
Chain Chain - Implementation of the GoF "Chain of Responsibility" pattern
Checkstyle Checkstyle - Development tool to help writing Java code that adheres to a coding standard
CLI Command Line Library - Simple API for working with the command line arguments and options
Codec Commons Codec - Encoders and decoders like Base64, Hex, phonetic encodings and URLs
Collections Collections - Filling the holes left in Sun's Collections API
Configuration Commons Configuration - Generic API enabling configuration from a variety of sources
DBCP DBCP - Connection pooling implementations
DBUtils DbUtils - Set of classes designed to make working with JDBC easier
Digester Struts Digester - Configure an XML/Java mapping with actions when patterns are recognized
Discovery Discovery - Discovering, or finding, implementations for pluggable interfaces
DNSJava DNS in Java - Supporting common record types, queries, zone transfers and dynamic updates
doclet JavaDoc Doclet - Custom output from the types methods and fields in a source tree.
Dom4j DOM4J - XML, XPath and XSLT library
DTDParser DTDParse DTD Library - You can use this library to parse a DTD
EL EL - The JSP 2.0 Expression Language Interpreter from Apache
fastutil FastUtil - Type-specific maps sets and lists with a small memory footprint and fast access
FileUpload HTTP File Upload Library - Add robust, fast file upload capability to your web applications
FreeMarker HTML Template Enginehttp://andyluo.blogjava.net
GJT Giant Java Tree - Java library consisting entirely of open source components
gnu-regex GNU Regular Expressions - Implementation of a traditional (non-POSIX) NFA regex engine
Groovy Groovy - Scripting Language
Hibernate Hibernate - Relational Persistence For Idiomatic Java
HiveMind HiveMind - A services and configuration microkernel
HSQLDB HSQLDB - The Java SQL relational database
HTMLParser HTML Parser - Java library used to parse HTML
HTTPClient HTTP Client - Fills holes left by the java.net package, including most recent HTTP standards
Informa Informa - News aggregation library
IO Commons-IO - Utility classes, stream implementations, file filters and endian classes for IO
iText iText - Generates PDF o­n the fly
J2EE Java 2 Platform, Enterprise Edition
J2SE Java2 Standard Edition v5
JAI Java Advanced Imaging - Network-enabled, scalable, platform-independent image processing
Jalopy Jalopy Source Formatter - Formats Java source code according to widely configurable rules
Jasper Jasper - Tomcat JSP enginehttp://andyluo.blogjava.net
JasperReports JasperReports - Free Java reporting library
Java3d Java3D - Object-oriented interfaces that support a simple, high-level programming mode
JavaComm Java Communications - API for technologies such as voice mail, fax and smartcards
JavaGroups JavaGroups - Reliable multicast communication enable processes to send messages to each other
Jaxen Jaxen XPath Processor - Object model walker; evaluate XPath expressions in dom4j and JDOM
JAXME JaxMe 2 - Open source implementation of JAXB
JClassLib JClassLib - Library for reading, modifing and writing Java class files and bytecode
JCommon JCommon - Collection of useful classes used by JFreeChart, JFreeReport and other projects
JCrontab JCronTab - Scheduler written in Java, provide a fully functional schedules for Java projects
JDIC JDIC - JDesktop Integration Components
JDNC JDNC - JDesktop Network Components
JDO Java Data Objects - Direct storage of Java domain model instances into a database
JDOM JDOM XML Library - For accessing, manipulating and outputting XML data from Java code.
JetSpeed JetSpeed - Java Portal Server
JEXL Java Expression Language - is an embedable expression language engine
JFreeChart JFreeChart - Free library for generating charts, including pie, bar, line and areas charts
JGroups JGroups - Multicast communication toolkit
JMeter JMeter - Load testing applcation
JMF Java Media Framework - Library for audio, video and other time-based media
JMock JMock - Testing library
JSF JavaServer Faces - Web Framework
JSword JSword - Bible software in Java, compatible with the Sword project for C/C++
JTidy JTidy - HTML syntax checker
JUnit JUnit - Regression testing framework used by the developer who implements unit tests in Java
JXPath JXPath Library - Simple interpreter of an expression language called XPath
Lang Lang - Utilities including Enums, String manipulation, reflection, serialization and more
Log4J Log4J - Fast logging API that lets you configure logging at runtime
Logging Commons Logging - Simple wrapper API around multiple logging APIs
Lucene Lucene - high-performance, full-featured text search engine written entirely in Java
Math Math - Library of lightweight, self-contained mathematics and statistics components
Net Network Library - Support for Finger, Whois, TFTP, Telnet, FTP, NNTP, etc developed by ORO
OJB OJB - O/R tool that allows transparent persistence
OpenJMS Open source JMS server
ORO ORO - Text processing library
OSCache OSCache - A high performance J2EE caching framework
PJA Pure Java AWT - Toolkit for drawing graphics without any native graphics resources
PMD PMD - Scans Java source code for potential problems
POI POI - Java OLE 2 Manipulator
Pool Commons Pooling - provides an generic, configurable Object-pooling API
Primitives Primitives - Collection of types and utilities optimized for working with Java primitives
Proxool Java connection pool
Quartz Quartz - J2EE open source job scheduler
Regexp Jakarta Regular Expressions - Java RegEx library under BSD style license
Rhino Mozilla JavaScript - open-source implementation of JavaScript written entirely in Java
Seraph Seraph - Atlassian Security Framework
SiteMesh A web-page layout and decoration framework
Slide Slide - Content repository, can serve as a basis for CMS
SOAP Apache Soap - implementation of the SOAP submission to W3C
Speedo OSS JDO implementationhttp://andyluo.blogjava.net
Spring Server Side alternative to J2EE APIs
Struts Jakarta Struts - open source framework for building web applications
Tapestry Tapestry - Web Framework
Turbine Turbine - Servlet based framework allowing developers to quickly build secure web applications
UDDI4J UDDI4J - Library that provides an API to interact with a UDDI registry
Validator Validtator - Validate data from user input
Velocity Velocity - Support for clean, quick MVC web development and support for the Struts framework
Village Village - API that sits o­n top of the JDBC to make it easier to interact with a JDBC
WebWork 2 Next generation of WebWork
Xalan Xalan - XSLT processor for transforming XML documents into HTML, text, or XML
XDoclet XDoclet - Code generation engine
Xerces Xerces2 - The next generation of high performance, XML parsers in the Apache Xerces family
XMLBeans XMLBeans - XML-Java binding toolhttp://andyluo.blogjava.net
XMLPull XMLPull - Defines a simple pull parsing API that does pull XML parsing from J2ME to J2EE
XMLRPC XML-RPC - Implementation of XML-RPC, using XML over HTTP to implement remote procedure calls
XNI Xerces Native Interface - Framework for streaming a document and constructing generic parsers
XOM XML Object Model - Tree-based API for processing XML that strives for correctness and simplicity.
XStream XML serialization


lvq810 2008-09-04 17:37 发表评论
]]>
Java中ThreadLocal的设计与使用http://www.tkk7.com/lvq810/articles/213404.htmllvq810lvq810Tue, 08 Jul 2008 11:08:00 GMThttp://www.tkk7.com/lvq810/articles/213404.htmlhttp://www.tkk7.com/lvq810/comments/213404.htmlhttp://www.tkk7.com/lvq810/articles/213404.html#Feedback0http://www.tkk7.com/lvq810/comments/commentRss/213404.htmlhttp://www.tkk7.com/lvq810/services/trackbacks/213404.html早在Java 1.2推出之时QJavaq_中就引入了一个新的支持:java.lang.ThreadLocalQ给我们在编写多U程E序时提供了一U新的选择。用这个工L可以很简z地~写Z的多线E程序,虽然ThreadLocal非常有用Q但是似乎现在了解它、用它的朋友还不多?

ThreadLocal是什?

ThreadLocalq是一个线E的本地实现版本Q它q不是一个ThreadQ而是thread local variableQ线E局部变量)。也许把它命名ؓThreadLocalVar更加合适。线E局部变量(ThreadLocalQ其实的功用非常单,是为每一个用该变量的线E都提供一个变量值的副本Q是每一个线E都可以独立地改变自q副本Q而不会和其它U程的副本冲H。从U程的角度看Q就好像每一个线E都完全拥有该变量。线E局部变量ƈ不是Java的新发明Q在其它的一些语a~译器实玎ͼ如IBM XL FORTRANQ中Q它在语a的层ơ提供了直接的支持。因为Java中没有提供在语言层次的直接支持,而是提供了一个ThreadLocal的类来提供支持,所以,在Java中编写线E局部变量的代码相对比较W拙Q这也许是线E局部变量没有在Java中得到很好的普及的一个原因吧?

ThreadLocal的设?

首先看看ThreadLocal的接口:

Object get() ;

// q回当前U程的线E局部变量副?protected Object initialValue(); // q回该线E局部变量的当前U程的初始?

void set(Object value);

// 讄当前U程的线E局部变量副本的?

ThreadLocal?个方法,其中值得注意的是initialValue()Q该Ҏ是一个protected的方法,昄是ؓ了子c重写而特意实现的。该Ҏq回当前U程在该U程局部变量的初始|q个Ҏ是一个gq调用方法,在一个线E第1ơ调用get()或者set(Object)时才执行Qƈ且仅执行1ơ。ThreadLocal中的实实现直接q回一个nullQ?

protected Object initialValue() { return null; }

ThreadLocal是如何做Cؓ每一个线E维护变量的副本的呢Q其实实现的思\很简单,在ThreadLocalcM有一个MapQ用于存储每一个线E的变量的副本。比如下面的CZ实现Q?


public class ThreadLocal

{

private Map values = Collections.synchronizedMap(new HashMap());

public Object get()

{

Thread curThread = Thread.currentThread();

Object o = values.get(curThread);

if (o == null && !values.containsKey(curThread))

{

o = initialValue();

values.put(curThread, o);

}

return o;

}


public void set(Object newValue)

{

values.put(Thread.currentThread(), newValue);

}


public Object initialValue()

{

return null;

}

}




当然Q这q不是一个工业强度的实现Q但JDK中的ThreadLocal的实现M思\也类g此?

ThreadLocal的?

如果希望U程局部变量初始化其它|那么需要自己实现ThreadLocal的子cdƈ重写该方法,通常使用一个内部匿名类对ThreadLocalq行子类化,比如下面的例子,SerialNumcMؓ每一个类分配一个序?


public class SerialNum

{

// The next serial number to be assigned


private static int nextSerialNum = 0;

private static ThreadLocal serialNum = new ThreadLocal()

{

protected synchronized Object initialValue()

{

return new Integer(nextSerialNum++);

}

};


public static int get()

{

return ((Integer) (serialNum.get())).intValue();

}

}




SerialNumcȝ使用非常地单,因ؓget()Ҏ是static的,所以在需要获取当前线E的序号Ӟ单地调用Q?

int serial = SerialNum.get();

卛_?

在线E是zd的ƈ且ThreadLocal对象是可讉K的时Q该U程持有一个到该线E局部变量副本的隐含引用Q当该线E运行结束后Q该U程拥有的所以线E局部变量的副本都将失效Qƈ{待垃圾攉器收集?

ThreadLocal与其它同步机制的比较

ThreadLocal和其它同步机制相比有什么优势呢QThreadLocal和其它所有的同步机制都是Z解决多线E中的对同一变量的访问冲H,在普通的同步机制中,是通过对象加锁来实现多个线E对同一变量的安全访问的。这时该变量是多个线E共享的Q用这U同步机刉要很l致地分析在什么时候对变量q行dQ什么时候需要锁定某个对象,什么时候释放该对象的锁{等很多。所有这些都是因为多个线E共享了资源造成的。ThreadLocal׃另一个角度来解决多线E的q发讉KQThreadLocal会ؓ每一个线E维护一个和该线E绑定的变量的副本,从而隔M多个U程的数据,每一个线E都拥有自己的变量副本,从而也没有必要对该变量进行同步了。ThreadLocal提供了线E安全的׃n对象Q在~写多线E代码时Q可以把不安全的整个变量装qThreadLocalQ或者把该对象的特定于线E的状态封装进ThreadLocal?

׃ThreadLocal中可以持有Q何类型的对象Q所以用ThreadLocal get当前U程的值是需要进行强制类型{换。但随着新的Java版本Q?.5Q将模版的引入,新的支持模版参数的ThreadLocalcd从中受益。也可以减少强制cd转换Qƈ一些错误检查提前到了编译期Q将一定程度地化ThreadLocal的用?

ȝ

当然ThreadLocalq不能替代同步机Ӟ两者面向的问题领域不同。同步机制是Z同步多个U程对相同资源的q发讉KQ是Z多个U程之间q行通信的有效方式;而ThreadLocal是隔d个线E的数据׃nQ从Ҏ上就不在多个U程之间׃n资源Q变量)Q这样当然不需要对多个U程q行同步了。所以,如果你需要进行多个线E之间进行通信Q则使用同步机制Q如果需要隔d个线E之间的׃n冲突Q可以用ThreadLocalQ这极大地化你的程序,使程序更加易诅R简z?/div>

lvq810 2008-07-08 19:08 发表评论
]]>
Java?PO,VO,TO,BO,DAO,POJO)解释http://www.tkk7.com/lvq810/articles/212410.htmllvq810lvq810Thu, 03 Jul 2008 11:31:00 GMThttp://www.tkk7.com/lvq810/articles/212410.htmlhttp://www.tkk7.com/lvq810/comments/212410.htmlhttp://www.tkk7.com/lvq810/articles/212410.html#Feedback0http://www.tkk7.com/lvq810/comments/commentRss/212410.htmlhttp://www.tkk7.com/lvq810/services/trackbacks/212410.htmlPO(persistant object) 持久对象
在o/r映射的时候出现的概念Q如果没有o/r映射Q没有这个概念存在了。通常? 应数据模?数据?,本nq有部分业务逻辑的处理。可以看成是与数据库中的表相映射的java对象。最单的PO是对应数据库中某个表中的一条记录, 多个记录可以用PO的集合。PO中应该不包含MҎ据库的操作?

VO(value object) 值对?
通常用于业务层之间的数据传递,和PO一样也是仅仅包含数据而已。但应是抽象出的业务对象,可以和表对应,也可以不,q根据业务的需?个h觉得同DTO(数据传输对象),在web上传递?nbsp;

TO(Transfer Object)Q数据传输对?br /> 在应用程序不同tie(关系)之间传输的对?nbsp;

BO(business object) 业务对象
从业务模型的角度?见UML元g领域模型中的领域对象。封装业务逻辑的java对象,通过调用DAOҎ,l合PO,VOq行业务操作?nbsp;

POJO(plain ordinary java object) 单无规则java对象
U? 的传l意义的java对象。就是说在一些Object/Relation Mapping工具中,能够做到l护数据库表记录? persisent object完全是一个符合Java Bean规范的纯Java对象Q没有增加别的属性和Ҏ。我的理解就是最基本? Java BeanQ只有属性字D及setter和getterҎQ?

DAO(data access object) 数据讉K对象
? 一个sun的一个标准j2ee设计模式Q这个模式中有个接口是DAOQ它负持久层的操作。ؓ业务层提供接口。此对象用于讉K数据库。通常和POl合? 用,DAO中包含了各种数据库的操作Ҏ。通过它的Ҏ,l合POҎ据库q行相关的操作。夹在业务逻辑与数据库资源中间。配合VO, 提供数据库的CRUD操作... 

O/R Mapper 对象/关系 映射  
定义好所有的mapping之后Q这个O/R Mapper可以帮我们做很多的工作。通过q些mappings,q个O/R Mapper可以生成所有的关于对象保存Q删除,d的SQL语句Q我们不再需要写那么多行的DAL代码了?nbsp;

实体Model(实体模式)
DAL(数据讉K?
IDAL(接口?
DALFactory(cd?
BLL(业务逻辑? 
BOF    Business Object Framework      业务对象框架
SOA    Service Orient Architecture    面向服务的设?
EMF    Eclipse Model Framework        Eclipse建模框架



lvq810 2008-07-03 19:31 发表评论
]]>
Jsp 列出服务器环境变?http://www.tkk7.com/lvq810/articles/209099.htmllvq810lvq810Thu, 19 Jun 2008 02:39:00 GMThttp://www.tkk7.com/lvq810/articles/209099.htmlhttp://www.tkk7.com/lvq810/comments/209099.htmlhttp://www.tkk7.com/lvq810/articles/209099.html#Feedback0http://www.tkk7.com/lvq810/comments/commentRss/209099.htmlhttp://www.tkk7.com/lvq810/services/trackbacks/209099.html
服务器环境变?/font> 功能q?/font>
localhost  服务器的域名
192.168.0.5  服务器的IP地址
Windows XP  服务器操作系l?/td>
1.6.0  服务?Java 虚拟机版?/td>
2.5  服务器支持的 Servlet API 版本
2.1  服务器支持的 JSP API 版本
Apache Tomcat/6.0.16  服务器Y件的名称及版? Tomcat 6.0)
8080  服务器正在运行的端口
pentium_pro+mmx pentium_pro pentium+mmx pentium i486 i386 i86 服务?CPU cd
D:"Java"Tomcat6.0.16"webapps"ROOT"env.jsp  h的物理\?/td>
null  在域名根目录外的到被h面的\?/td>
GET  发出request的方?/td>
null  通过使用GETҎ提交的Q何数?/td>
/env.jsp  E序被调用的路径
127.0.0.1  发出requesth的远端机器的名称
127.0.0.1  发出requesth的远端机器的IP名称
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 1.1.4322)  客户h的浏览器cd

面源代码:

env.jsp

<%--
env.jsp
服务器信息
@version: 1.00
Note:
TODO:
Date: 2005-10-10
@author: BeanSoft
--%>
<%@ page language="java" contentType="text/html; charset=GBK"
pageEncoding="GBK"%>

<html>
<style>
a:hover{color:orange}
</style>
<title>服务器环境变?lt;/title>
<body>

<p>&nbsp;
<table width=90% border="1" align="center" cellpadding="2" cellspacing="0" bordercolor="#99CCFF" style="border-collapse: collapse">
<tr>
<td width="50%" align="center" bgcolor="#99CCFF"><font color="#FFFFFF">服务器环境变?lt;/font></td>
<td height="16" align="center" bgcolor="#99CCFF"><font color="#FFFFFF">功能q?lt;/font></td>
</tr>
<tr>
<td width="50%"><%= request.getServerName()%> </td>
<td height="4">服务器的域名</td>
</tr>
<tr>
<td width="50%"><%= java.net.InetAddress.getLocalHost().getHostAddress() %> </td>
<td height="4">服务器的IP地址</td>
</tr>
<tr>
<td width="50%"><%=System.getProperty("os.name")%> </td>
<td height="4">服务器操作系l?lt;/td>
</tr>
<tr>
<td width="50%"><%=System.getProperty("java.version")%> </td>
<td height="4">服务?Java 虚拟机版?lt;/td>
</tr>
<tr>
<td width="50%"><%=application.getMajorVersion() + "." + application.getMinorVersion()%> </td>
<td height="4">服务器支持的 Servlet API 版本</td>
</tr>
<tr>
<td width="50%"><%=JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion()%> </td>
<td height="4">服务器支持的 JSP API 版本</td>
</tr>
<tr>
<td width="50%"><%=application.getServerInfo()%> </td>
<td height="4">服务器Y件的名称及版?
Tomcat 6.0)</td>
</tr>
<tr>
<td width="50%"><%=request.getServerPort()%> </td>
<td height="5">服务器正在运行的端口</td>
</tr>
<tr>
<td width="50%"><%=System.getProperty("sun.cpu.isalist")%></td>
<td height="5">服务?CPU cd</td>
</tr>
<tr>
<td width="50%"><%=request.getRealPath(request.getServletPath())%> </td>
<td height="4">h的物理\?lt;/td>
</tr>
<tr>
<td width="50%"><%=request.getPathInfo()%> </td>
<td height="4">在域名根目录外的到被h面的\?lt;/td>
</tr>
<tr>
<td width="50%"><%=request.getMethod()%> </td>
<td height="4">发出request的方?lt;/td>
</tr>
<tr>
<td width="50%"><%=request.getQueryString()%> </td>
<td height="4">通过使用GETҎ提交的Q何数?lt;/td>
</tr>
<tr>
<td width="50%"><%=request.getServletPath()%> </td>
<td height="4">E序被调用的路径</td>
</tr>
<tr>
<td width="50%"><%=request.getRemoteHost()%> </td>
<td height="4">发出requesth的远端机器的名称</td>
</tr>
<tr>
<td width="50%"><%=request.getRemoteAddr()%> </td>
<td height="5">发出requesth的远端机器的IP名称</td>
</tr>
<tr>
<td width="50%"><%=request.getHeader("User-Agent")%> </td>
<td height="4">客户h的浏览器cd</td>
</tr>
</table>
</body>
</html>



lvq810 2008-06-19 10:39 发表评论
]]>
Jsp内部对象http://www.tkk7.com/lvq810/articles/209094.htmllvq810lvq810Thu, 19 Jun 2008 02:32:00 GMThttp://www.tkk7.com/lvq810/articles/209094.htmlhttp://www.tkk7.com/lvq810/comments/209094.htmlhttp://www.tkk7.com/lvq810/articles/209094.html#Feedback0http://www.tkk7.com/lvq810/comments/commentRss/209094.htmlhttp://www.tkk7.com/lvq810/services/trackbacks/209094.html1Q?  out(向客L输出各种数据cd)
重要ҎQ?br /> -- out.print(cd)  ?nbsp; out.println(cd)Q换行输?br /> -- out.newLine()Q输Z个换行符?br /> -- out.flush()Q输出缓冲区的数?br /> -- out.close()Q关闭输出流
-- out.clearBuffer()Q清除缓冲区里的数据Qƈ把数据写到客L
-- out.clear()Q清除缓冲区里的数据Q但不把数据写到客户?br /> -- out.getBufferSize()Q获得缓冲区的大,~冲区的大小可用<%@page  buffer=”size”%>讄
-- out.getRemaining()Q获得缓冲区没有使用的空间的大小
-- out.isAutoFlush()Q返回布|若auto  flush则返回trueQ否则返回false。是否auto  fush我们可用%@page  is  AutoFlush=”true/false”%来设|?br /> 注意Q中文显C问?br /> -- 若是直接赋值的中文字符Ԍ?lt;%@  page  contentType=”text/html;charset=gb2312”%>可正常昄。但不能用getStr(String  name)函数或类似的函数转换内码Q否则不能正常显CZ文?br /> -- 若是request传过来的中文字符Ԍ必须要用getStr(String  name)函数或类似的函数转换内码Q否则不能正常显CZ文?br /> 如:String  aa=str;
byte[]  aa=aa.getBytes(“ISO8859-1”);
String  bb=new  String(aa);
-- 在不同^台、不同的服务器jsp中文问题的解x法各不相同,可自行试验?br /> 1Q?  requestQ接受客L输入的信息)
作用Q主要用于接受客L通过http协议q接传输到服务器端的数据?br /> ҎQ?br /> -- getCookies()Q返回客L的cookie对象Q结果是一个cookie数组
-- getHeader(String  name)Q获得http协议定义的传送文件头信息Q?br /> 如:request.getHeader(“User-agent”)q回客户端浏览器的版本号、类?br /> -- getAttribute(String  name)Q返回name指定的属性|若不存在指定的属性,p回空?null)?br /> -- getattributeNames()Q返回request对象所有属性的名字Q结果集是一个EnumerationQ枚举)cȝ实例
-- getHeaderNames()Q返回所有request  header的名字,l果集是一个EnumerationQ枚举)cȝ实例
-- getHeaders(String  name)Q返回指定名字的request  header的所有|l果集是一个EnumerationQ枚举)cȝ实例
-- getMethod()Q获得客L向服务器端传送数据的Ҏ有GET、POST、PUT{类?br /> -- getParameter(String  name)Q获得客L传送给服务器端的参数|该参数由name指定
-- get  parameterNames()Q获得客L传送给服务器端的所有的参数名,l果集是一个EnumerationQ枚举)cȝ实例
-- getParameterValues(String  name)Q获得指定参数所有?br /> -- getQueryString()获得查询字符Ԍ该串由客L以GETҎ向服务器端传?br /> -- getRequestURI()Q获得发求字W串的客L地址
-- getServletPath()Q获得客L所h的脚本文件的文g路径
-- setAttribute(String  name,Java.lang.Object  o)Q设定名字ؓname的request参数|该值由Objectcd的o指定
-- getServerName()Q获得服务器的名?br /> -- getServerPort()Q获得服务器的端口号
-- getRemoteAddr()Q获得客L的IP地址
-- getRemoteHost()Q获得客L电脑的名字,若失败,则返回客L电脑的IP地址
-- getProtocol()Q获取客L向服务器端传送数据所依据的协议名Uͼ如http/1.1
1Q?  applicationQ保存用户信息)
作用Q一旦创建,除非服务器关闭,否则一直保持下?br /> application.setAttribute(“name”,val)
request.setAttribute(“name”,val)
ҎQ?br /> -- getAttribute(String  name)Q返回由name指定名字的application对象属性的|q是个Object对象
-- getattributeNames()Q返回所有application对象属性的名字Q结果集是一个EnumerationQ枚举)cȝ实例
-- getInitParameter(String  name)Q?nbsp; q回application栽个属性的初始|此属性由name指定
-- getServerInfo()Q获得当前版本Servlet~译器的信息
-- setAttribute(String  name,Object  object)Q用object来初始化某个属性,该属性由name指定
例:单计数器QE:"app"java"tomcat322"webapps"myjsp"  count.jspQ?br /> 1Q?  response(控制httpq接)
作用Q向客户端发送数据,如Cookie、HTTP文g关信息等?br /> ҎQ?br /> -- addCookie(Cookie  cookie)Q添?个Cookie对象Q用来保存客L的用户信息。用request的getcookies()Ҏ可获得这个Cookie
如:<%  Cookie  mycookie=new  Cookie(“uname”,”wsr”);
response.addCookie(mycookie);
Cookie  delmycookie=new  cookie(“mycookie”,null);
delmycookie  .setMaxAge(0);
delmycookie  .setPath(/”);
response.addCookie(delmycookie);
%>
-- addHeader(String  name,String  value)Q添加HTTP文g_该header会传到客户端,若同名的header存在Q原来的header会被覆盖
-- containsHeader(String  name)Q判断指定名字的HTTP文g头是否存在ƈq回布尔?br /> -- sendError(int  sc)Q向客户端发送错误信息,如:505Q服务器内部错误Q?04Q网|不到错误
如:response.sendError(response.SC_NO_CONTENT)Q?br /> -- setHeader(String  name,String  value)Q设定指定名字的HTTP文g头的|若该值存在,它将会被新D?br /> ?Q让|页每隔5U刷C?br /> <%  response.setHeader(“Refresh”,”5”);%>
      the  current  dateis:<%=new  Date()%>
?Q利用response对象讑֮HTTP?br /> <%  response.setContentType(“Application/pdf”);
response.setHeader(“content-disposition”,”attachment;filename="”syntax.pdf"””);
%>
-- sendRedirect(“http://www.foo.com/path/error.html”)Q重定向功能
1Q?  exception(处理异常和错?  
作用Q处理JSP文g在执行时所有发生的错误和异常。有3个内建方法?br /> 注意Q必d<%@  page  isErrorPage=”true”%>的情况下才可以用Exception对象
-- getMessage()Q返回错误信?br /> -- printStackTrace()Q以标准错误的Ş式输Z个错误和错误的堆?br /> -- toString()Q以字符串的形式q回1个对异常的描q?br /> 1Q?  sessionQ保存用户信息)
作用Q分别保存每一个用L信息
session.putValue(“name”,val)
session.getValue(“name”)
注意ssion中保存和索的信息不能是基本数据类型,而必LJAVA的相应的Object对象?br /> ҎQ?br /> -- getAttribute(String  name)Q获得指定名字的属性,若该属性不存在Q将q回null
-- getattributeNames()Q返回session对象中存储的W一个属性对象,l果集是一个Enumerationcȝ实例
-- getCreationTime()Q返回该session对象创徏的时_以毫U计Q从1970q??日v
-- getId()Q每生成一个session对象Q服务器都会l其一个不会重复的~号Q此Ҏq回当前session的编?br /> -- getLastAccessedTime()Q返回当前session对象最?ơ被操作的时_q回?970q??日v至今的毫U数
-- getMaxInactiveInterval()Q获得session对象的生存时?br /> -- removeAttribute(String  name)Q删除指定的属性(包括属性名、属性|
-- setAttribute(String  name,Java.lang.Object  value)Q设定指定名字的属性|q将其存储在session对象?/span>

lvq810 2008-06-19 10:32 发表评论
]]>
比较java.io.Externalizable和java.io.Serializable[转] http://www.tkk7.com/lvq810/articles/208865.htmllvq810lvq810Wed, 18 Jun 2008 06:38:00 GMThttp://www.tkk7.com/lvq810/articles/208865.htmlhttp://www.tkk7.com/lvq810/comments/208865.htmlhttp://www.tkk7.com/lvq810/articles/208865.html#Feedback0http://www.tkk7.com/lvq810/comments/commentRss/208865.htmlhttp://www.tkk7.com/lvq810/services/trackbacks/208865.html即你没有用q对象序列化QserializationQ,你可能也知道它。但你是否知?Java q支持另外一UŞ式的对象持久化,外部化(externalizationQ?

下面是序列化和外部化在代码的关联方式:

public interface Serializable {}

public interface Externalizable extends Serializable {
  void readExternal(ObjectInput in);
  void writeExternal(ObjectOutput out);
}

序列化和外部化的主要区别

外部化和序列化是实现同一目标的两U不同方法。下面让我们分析一下序列化和外部化之间的主要区别?/p>

通过Serializable接口对对象序列化的支持是内徏于核?API 的,但是java.io.Externalizable的所有实现者必L供读取和写出的实现。Java 已经h了对序列化的内徏支持Q也是说只要制作自qcjava.io.SerializableQJava ׃试图存储和重l你的对象。如果用外部化Q你可以选择完全p己完成读取和写出的工作,Java 对外部化所提供的唯一支持是接口:

voidreadExternal(ObjectInput in)
void writeExternal(ObjectOutput out)

现在如何实现readExternal() 和writeExternal() 完全看你自׃?/p>

序列化会自动存储必要的信息,用以反序列化被存储的实例Q而外部化则只保存被存储的cȝ标识。当你通过 java.io.Serializable接口序列化一个对象时Q有关类的信息,比如它的属性和q些属性的cdQ都与实例数据一赯存储h。在选择? Externalizableq条路时QJava 只存储有x个被存储cd的非常少的信息?/p>

每个接口的优点和~点

Serializable接口

·         优点Q?/strong>内徏支持

·         优点Q?/strong>易于实现

·         ~点Q?/strong>占用I间q大

·         ~点Q?/strong>׃额外的开销D速度变比较慢

Externalizable接口

·         优点Q?/strong>开销较少Q程序员军_存储什么)

·         优点Q?/strong>可能的速度提升

·         ~点Q?/strong>虚拟Z提供M帮助Q也是说所有的工作都落C开发h员的肩上?/p>

在两者之间如何选择要根据应用程序的需求来定。Serializable通常是最单的解决ҎQ但是它可能会导致出C可接受的性能问题或空间问题;在出现这些问题的情况下,Externalizable可能是一条可行之路?/p>

要记住一点,如果一个类是可外部化的QExternalizableQ,那么ExternalizableҎ被用于序列化类的实例,即ɘq个cd提供了SerializableҎQ?/p>

private void writeObject()
private void readObject()

本文作者:David Petersheim是Genscape公司的应用程序开发部MQ。他设计和开发用于获取和处理实时能源数据的服务器端应用程序?/p>




lvq810 2008-06-18 14:38 发表评论
]]>
深入研究java.lang.Processc[转]http://www.tkk7.com/lvq810/articles/205919.htmllvq810lvq810Wed, 04 Jun 2008 12:47:00 GMThttp://www.tkk7.com/lvq810/articles/205919.htmlhttp://www.tkk7.com/lvq810/comments/205919.htmlhttp://www.tkk7.com/lvq810/articles/205919.html#Feedback0http://www.tkk7.com/lvq810/comments/commentRss/205919.htmlhttp://www.tkk7.com/lvq810/services/trackbacks/205919.html前言Q?/font>Java 的类库日益庞大,所包含的类和接口也不计其数。但其中有一些非帔R要的cd接口Q是Javacd中的核心部分。常见的有String、Object? Class、Collection、ClassLoader、Runtime、Process...Q熟悉这些类是学好Java的基。而这些类一般不? 易理解,需要做深入的研I和实践才能掌握。下面是我对q些cȝ解和使用的一些ȝ。欢q你在阅d你宝贵的意见和d感留下!

 

一、概q?/font>
      ProcesscL一个抽象类Q所有的Ҏ均是抽象的)Q封装了一个进E(即一个执行程序)?br />       Process cL供了执行从进E输入、执行输出到q程、等待进E完成、检查进E的退出状态以及销毁(杀掉)q程的方法?br />       ProcessBuilder.start() ?Runtime.exec Ҏ创徏一个本E,q返?Process 子类的一个实例,该实例可用来控制q程q获取相关信息?

      创徏q程的方法可能无法针Ҏ些本机^C的特定进E很好地工作Q比如,本机H口q程Q守护进E,Microsoft Windows 上的 Win16/DOS q程Q或?shell 脚本。创建的子进E没有自ql端或控制台。它的所有标?ioQ即 stdinQstdoutQstderrQ操作都通过三个? (getOutputStream()QgetInputStream()QgetErrorStream()) 重定向到父进E。父q程使用q些来提供到子q程的输入和获得从子q程的输出。因为有些本机^C针对标准输入和输出流提供有限的缓冲区大小Q如果读写子 q程的输出流或输入流q速出现失败,则可能导致子q程dQ甚至生死锁?

      当没?Process 对象的更多引用时Q不是删掉子q程Q而是l箋异步执行子进E?

 

二、API预览
 destroy()
   杀掉子q程?
 exitValue()
   q回子进E的出口倹{?
 InputStream getErrorStream()
   获得子进E的错误?
 InputStream getInputStream()
   获得子进E的输入?
 OutputStream getOutputStream()
   获得子进E的输出?
 waitFor()
   D当前U程{待Q如果必要,一直要{到p Process 对象表示的进E已l终止?

 

三、如何创建Process对象Q一般有一下两U方法:

 

1、每?ProcessBuilder 实例理一个进E属性集。start() Ҏ利用q些属性创Z个新?Process 实例。start() Ҏ可以从同一实例重复调用Q以利用相同的或相关的属性创建新的子q程。(ProcessBuilderq个是JDK5中新d的finalc,详细请参 ?#8220;深入研究java.lang.ProcessBuilderc?#8221;一文?

 

2、Runtime.exec() Ҏ创徏一个本E,q返?Process 子类的一个实例。详l请参看“深入研究java.lang.Runtimec?#8221;一文?

 

四、官方API文?/strong>

 

java.lang
c?Process

java.lang.Object
l承? src=java.lang.Process

public abstract class Process
extends Object

Process 子类的一个实例,该实例可用来控制q程q获取相关信息?code>Process 对象的更多引用时Q不是删掉子q程Q而是l箋异步执行子进E?

对于带有 Process 对象表示的进E?

从以下版本开始:
JDK1.0
另请参见Q?/strong>

构造方法摘?/strong>
()
           
 
Ҏ摘要
abstract  void ()
          杀掉子q程?/td>
abstract  int ()
          q回子进E的出口倹{?/td>
()
          获得子进E的错误?/td>
()
          获得子进E的输入?/td>
()
          获得子进E的输出?/td>
abstract  int ()
          D当前U程{待Q如果必要,一直要{到p
从类 java.lang.Object l承的方?/strong>
, , , , , , , , , ,

构造方法详l信?/strong>

Process

public Process()

Ҏ详细信息

getOutputStream

public abstract OutputStream getOutputStream()
获得子进E的输出。输出流被传送给p

getInputStream

public abstract InputStream getInputStream()
获得子进E的输入。输入流获得p

getErrorStream

public abstract InputStream getErrorStream()
获得子进E的错误。错误流获得p

waitFor

public abstract int waitFor()
throws InterruptedException
D当前U程{待Q如果必要,一直要{到p 0 表示正常l止?
抛出Q?/strong>

exitValue

public abstract int exitValue()
q回子进E的出口倹{?

q回Q?/strong>
?0 表示正常l止?
抛出Q?/strong>
Process 对象表示的子q程未l止?/dd>

destroy

public abstract void destroy()
杀掉子q程。强制终止此

lvq810 2008-06-04 20:47 发表评论
]]> վ֩ģ壺 ɫɫwww| 91鶹Բ߹ۿ| ҹ1000| 99þþƷ| þùƷר| 99reֻоƷ| 95˾Ѹ| 91㽶߹ۿȫ| 67paoǿ| þþþþþƷο| þþƷѹۿ| 4399ÿձߵӰ| ӽ18վ| һƵ| ձһձһ岻| պĻ| ޹˾þһþ| þۺɫHEZYO| ޳AVƬһ| ۺɫ鶹| þ޹ӰԺ| ůһ | ޸߹ۿ| 鶹Ʒý| ޹˾Ʒ| ޳a߹ۿ| һ| 99ƵƵۿ| ۺ| ձ| AVƬ߹ۿ| ͼƬ߹ۿ| ߾þ֮ۺ߾þ| պ߹ۿƵ| þþƷѹۿ| ҹƷƵ| Ѵվ߹| þAVӰ| AVһӰ | þùɫAVѿ| Ƶѹۿ|