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:?41