Available categories: [/] [development. ~]
jdk1.5/1.6下xslt时xalan版本问题|xalan version problem in XSLT under jdk1.5(jdk5) & jdk1.6(jdk6) [Permalink] Sat Aug 11 13:16:38 CST 2007 在jdk1.5/1.6下,现有的xslt会失败。
Posted by: miles Tomcat 2 Weblogic Migration | Tomcat到Weblogic移植 [Permalink] Sat Sep 24 10:41:04 CST 2005 出于性能、扩展性等等一大堆理由,downwap工程由tomcat移植到了weblogic81sp2上。
移植完毕以后做了压力测试,性能的确好不少。不过要说原因,估计和Tomcat的JK、JRockit的调整、代码整理都有关系。倒不一定是AppServer在这个级别应用上的差距体现。
Posted by: miles 去掉了service和data access层的类中所有的非static成员变量 [Permalink] Wed Dec 22 19:09:54 CST 2004 主要针对pageCount这个property。很多牵扯分页的类都有他。以前通过 String xml=service.getXxxByYyy(); int pageCount=service.getPageCount();这样方式读取页数,而现在则是通过标准化返回的xml,让他本身包含pageCount这个ExtInfo。 这样一来,就可以大量应用singleton模式了。毕竟对于目前系统,频繁的new是不可忽视的性能瓶颈之一。
Posted by: miles 关于servlet的线程模式 [Permalink] Mon Nov 29 10:25:06 CST 2004 昨天做refactoring时候差点犯错误。因为目前的设计,是所有servlet继承公共基类,而基类中进行一些例如错误处理之类的系统级操作(参看这里),所以两者都要用到request/response。以前的做法,是从基类传入request/response,而在子类中调用各个方法时候,也是统统传入。 public class SessionListener extends BaseListener implements HttpSessionListener, ServletRequestListener, Constant { private HttpServletRequest request; //Notification that a session was created public void sessionCreated(HttpSessionEvent se) { logger.debug("New session started!"); setEquipmentInfo(se.getSession()); clearAllAntiAttackRecs(); } private void setEquipmentInfo(HttpSession session) { WebStringUtil webStringUtil=WebStringUtil.getInstance(); String agent=webStringUtil.getUserAgent(request); String info=null; EquipmentService service=EquipmentServiceFactory.getService(); try { info=service.getUserEquipmentByAgent(agent); } catch( DidyException ex) { logger.warn(ex.getMessage()); } UserTracker userTracker=UserTracker.getInstance(); userTracker.setEquipmentInfo(session, info); } //Notification that a session was invalidated public void sessionDestroyed(HttpSessionEvent se) { logger.debug("Session ended!"); } private void clearAllAntiAttackRecs() { Map actAntiAttackRecs=BaseDidyServlet.getActAntiAttackRecs(); Iterator it=actAntiAttackRecs.keySet().iterator(); while(it.hasNext()) { clearAntiAttackRecs(actAntiAttackRecs, (String) it.next()); } } private void clearAntiAttackRecs(Map actAntiAttackRecs, String ip) { NumberUtil numberUtil=NumberUtil.getInstance(); Map ipAntiAttackMap=(Map) actAntiAttackRecs.get(ip); if(ipAntiAttackMap == null) { return; } Set obsoleteKeys=new HashSet(); Iterator it=ipAntiAttackMap.keySet().iterator(); while(it.hasNext()) { String key=it.next().toString(); Map myIpActAntiAttackMap=(Map) ipAntiAttackMap.get(key); long lastActTime= numberUtil.getLong(myIpActAntiAttackMap.get("TIME")); long minInterval= numberUtil.getLong( AppProp.read(ANTI_ATTACK_PREFIX_INTERVAL + "." + key) ); if(System.currentTimeMillis() - lastActTime >= minInterval) { obsoleteKeys.add(key); } } it=obsoleteKeys.iterator(); while(it.hasNext()) { ipAntiAttackMap.remove(it.next()); } if(ipAntiAttackMap.isEmpty()) { actAntiAttackRecs.remove(ip); } } /** The request is about to go out of scope of the web application. */ public void requestDestroyed(ServletRequestEvent sre) { } /** The request is about to come into scope of the web application. */ public void requestInitialized(ServletRequestEvent sre) { request=(HttpServletRequest) sre.getServletRequest(); } }这里就麻烦大了!上网找了资料,还是没有找到合适的。不行的话只能试试看加一个overall的filter来为session listener取得request了。UGLY啊!!
Posted by: miles xslt实现select distinct [Permalink] Thu Nov 25 11:51:55 CST 2004 今天做显示支持的手机列表时候遇到一个技术问题,就是select distinct。目前状况是,一次选出所有的equipment纪录,每条记录带有自己的brand(品牌)信息。选出纪录可能是这样格式: <ROW> <ID>1</ID> <BRAND>NOKIA</BRAND> <MODEL>6100</MODEL> </ROW> <ROW> <ID>2</ID> <BRAND>NOKIA</BRAND> <MODEL>7250</MODEL> </ROW> <ROW> <ID>3</ID> <BRAND>NOKIA</BRAND> <MODEL>8210</MODEL> </ROW> <ROW> <ID>4</ID> <BRAND>MOTO</BRAND> <MODEL>E365</MODEL> </ROW> <ROW> <ID>5</ID> <BRAND>NOKIA</BRAND> <MODEL>V3</MODEL> </ROW> ...这样的数据,我们需要组织成:
<?xml version="1.0" encoding="gb2312"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="wml" omit-xml-declaration="no" indent="no" doctype-public="-//WAPFORUM//DTD WML 1.1//EN" doctype-system="http://www.wapforum.org/DTD/wml_1.1.xml" /> <xsl:include href="../common/common.func.xsl"/> <xsl:include href="../common/header.inc.xsl"/> <xsl:include href="../common/footer.inc.xsl"/> <xsl:variable name="pn" select="/ROOT/EXTINFO/PAGENO"/> <xsl:template match="/"> <wml> <card> <xsl:call-template name="inc.header"/> <p> <xsl:for-each select="/ROOT/DATA/ROW"> <xsl:variable name="thisEm" select="EM_ID"/> <xsl:if test="count(preceding-sibling::ROW)=0"> <a> <xsl:attribute name="href">#<xsl:value-of select="EM_ID"/></xsl:attribute> <xsl:value-of select="BRAND"/></a><br/> </xsl:if> <xsl:if test="preceding-sibling::ROW[1]/EM_ID != $thisEm"> <a> <xsl:attribute name="href">#<xsl:value-of select="EM_ID"/></xsl:attribute> <xsl:value-of select="BRAND"/></a><br/> </xsl:if> </xsl:for-each> </p> <xsl:call-template name="inc.footer"/> </card> <xsl:for-each select="/ROOT/DATA/ROW"> <xsl:variable name="thisEm" select="EM_ID"/> <xsl:if test="count(preceding-sibling::ROW)=0"> <card> <xsl:attribute name="id"><xsl:value-of select="EM_ID"/></xsl:attribute> <xsl:call-template name="inc.header"/> <p align="center">品牌[<xsl:value-of select="BRAND"/>]的支持机型</p> <p> <xsl:for-each select="../ROW[EM_ID=$thisEm]"> 型号:<xsl:value-of select="MODEL"/><br/> 描述:<xsl:value-of select="DESCRIPTION"/><br/> </xsl:for-each> </p> <xsl:call-template name="inc.footer"/> </card> </xsl:if> <xsl:if test="preceding-sibling::ROW[1]/EM_ID != $thisEm"> <card> <xsl:attribute name="id"><xsl:value-of select="EM_ID"/></xsl:attribute> <xsl:call-template name="inc.header"/> <p align="center">品牌[<xsl:value-of select="BRAND"/>]的支持机型</p> <p> <xsl:for-each select="../ROW[EM_ID=$thisEm]"> 型号:<xsl:value-of select="MODEL"/><br/> 描述:<xsl:value-of select="DESCRIPTION"/><br/> </xsl:for-each> </p> <xsl:call-template name="inc.footer"/> </card> </xsl:if> </xsl:for-each> </wml> </xsl:template> </xsl:stylesheet>绕着弯子实现简单功能,是xslt一大特点。 enjoy
Posted by: miles 关于指定资源下载的控制 [Permalink] Thu Nov 25 00:33:32 CST 2004 因为kjava要求文件格式的特殊性,最终设计决定采用如下方案:
附上kjava的jad和jar文件contenttype(mimetype): private static final String CONTENT_TYPE_DOWN_JAD="text/vnd.sun.j2me.app-descriptor"; private static final String CONTENT_TYPE_DOWN_JAR="application/java-archive";
Posted by: miles didy|架构 [Permalink] Thu Nov 25 00:21:24 CST 2004 这段时间又开始开发wap.didy.net,一个付费游戏下载的站点。当然,nexus架构还是沿用,只不过改进更多了 public final void doGet(...) throws ... { //...common functionality (ASPECT?)... process(); //...common functionality (ASPECT?)... }子类: NexusBaseServlet: public class NexusBaseServlet extends BaseServlet { public void process() throws Exception { //... bl goes here.... } }这样的设计,子类的限制太多,而且实际上已经完全没有了upper cast的可能。所以,可以认为这个继承关系仅仅是多余的提高了耦合度。这里就很有改进的必要,比如用decorator或者是AOP的理念,就可以很清楚的分理出子类,实现解耦。 正如xp理念,这次开发refactoring贯穿始终,而且也初步确定了设计到测试的基本流程。希望有时间细化他,精益求精。
Posted by: miles 关于wml中的response status code [Permalink] Thu Nov 25 00:07:59 CST 2004 没错,就是那个200/404/500。对于一般的浏览器,如果返回的status code不是200( public void setStatus(int code) { super.setStatus(HttpServletResponse.SC_OK); }结果正如所愿,丢失的错误信息全部回来了 附:一个完整的错误返回: 处理前 ============== HTTP/1.x 500 Internal Server Error Content-Type: text/vnd.wap.wml Content-Length: 695 Date: Wed, 24 Nov 2004 16:14:13 GMT Server: Apache-Coyote/1.1 Connection: close 处理后 ============== HTTP/1.x 200 OK Content-Type: text/vnd.wap.wml Content-Length: 695 Date: Wed, 24 Nov 2004 16:19:02 GMT Server: Apache-Coyote/1.1
Posted by: miles 关于DOCTYPE [Permalink] Wed Oct 27 09:57:21 CST 2004 如果doc类型是xml的话,不要在xslt时候设置doctype,否则可能会因为root element和doctype不匹配导致错误。因为xml本身就是默认的doctype,实在没有必要多此一举。
Posted by: miles wap通讯录 [Permalink] Wed Sep 29 11:44:00 CST 2004 现在在做通讯录。目前的设计,通讯录不但要求像现在的名片式手机电话簿一样有自定义分组,详细联系人资料,多组电话号码这些基本功能,还需要以下的进阶功能:
这些功能都是一般的电话簿所没有的。应该会比较有吸引力 而且以后再也不用担心手机或手机卡丢失导致重要电话号码一起遗失了。
Posted by: miles |
? |
Available categories: [/] [development. ~]
html hits:?85789