第二个项目做完了,总结一下~~

来源:互联网 发布:as400软件开发工程师 编辑:程序博客网 时间:2024/04/29 07:56

很惭愧,很多次都在《大事记》里面说要坚持写博客的,但项目做完后不是忘了写,就是懒得写,最终在项目里学到的一点东西都淡忘了。如果不能把这些零碎的知识记录下来的话,以后 必定还会做同样的工作,这样不仅浪费时间,更重要的是影响心情!好了,废话不多说,开始写!

 

首先,这是一个wap工程。RFP说只能从手机上浏览,后来发现要用wml写。说实话,和html相比,wml就是个垃圾。不知道当初谁做的规定,硬是要新开辟一种标记语言,直接让手机兼容html不就行了。可能是手机的显示效果不如pc,于是就在html基础上简化了很多,只留下了最基本的功能。协议这东西还是太抽象了,不能理解啊。。

 

花了2天的时间搭界面,一共有4个页面。这就是体力活了,下面说一下wml使用时要注意的几点吧:

 

1.wml不支持session,从一个页面跳转到另一个页面时session会丢失,常用的解决方法是重写url,即调用方法

response.encodeURL("/wap/replyPage.jsp");

 如此就可以继续使用session了!

 

2.wml提交表单的方式和html有很大不同:

<anchor>send 
<do type="accept">
<go href="<%=response.encodeURL(session.getAttribute("url")+"?action=reply")%>" method="post">
<postfield name="recipientNumber" value="$recipientNumber"/>
<postfield name="text" value="$text"/>
<postfield name="contacter" value="${sessionScope.senderNumber}"/>
</go>
</do>
</anchor>

关键的标签是<postfield>,name属性是request.getParameter("")要用到的,value用的是EL表达式,跟在$后面的是表单项的名字,这是提交的内容,注意前面还有<do><go>标签。<go>标签指明了表单提交的地址,<do>标签则是固定用法,记住就行。

 

3.EL表达式:

要注意的是{}里面的内容是从request/session/response中取出的参数,前面可以加sessionScope等前缀。其他的正常。

 

4.jstl标签

最常用的3个标签<c:choose><c:if><c:out>

 

<c:choose>

<c:when test="">cp</c:when>

.

.

.

<c:otherwise>pc</c:otherwise>

</c:choose>

 

以上面的为例,test里面是判断的内容,一般是EL表达式,如果是true,则打印出cp,否则,打印pc。

 

<c:if test=""></c:if>的用法与此相似。

 

<c:out value="">,其实没什么用,在页面中直接写要输出的内容就行。

 

5.<card id="" title=""></card>

 

同一页面不同卡片之间可以互相跳转,方法是<go href="#id"/>,id是card的id号。title是同html的title,即标题。

 

6.正则表达式:

 

先把http的正则表达式贴出来:https?://[-//w.]+(://d+)?(/([//w/_.]*)?)?。qq聊天里面所有的http链接都可以直接点击就是通过正则表达式来匹配的。

 

贴一段代码出来作为参考:

      Pattern pattern = Pattern.compile("https?://[-//w.]+(://d+)?(/([//w/_.]*)?)?");
      Matcher matcher = pattern.matcher(content);

       while(matcher.find()) {
          String url = matcher.group();
          urls.add(url);
      }

 

matcher.find()返回boolean,即是否有匹配的字符串,而且每次向后找下一个匹配字串。matcher.group()输出匹配的字串(是保护匹配字串的字串)。

 

7.subString(startindex,endindex)

取startindex处的字符,但不取endindex处的字符

 

页面的问题说完了,再来说java代码吧,要注意的地方有这么几个:

 

1.如何解析.xml文件并读出里面的内容?

  这里先贴出一段代码,以后直接修改文件路径吧:

 

  DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
  DocumentBuilder dombuilder=domfac.newDocumentBuilder();

  InputStream is = this.getClass().getResourceAsStream("/wap_client_block/blockedIPs.xml");
  Document doc=dombuilder.parse(is);
  NodeList nodeList=doc.getElementsByTagName("ip");
  for (int index = 0; index < nodeList.getLength(); index++){
   Element element = (Element) nodeList.item(index);
   String blockedIP = element.getAttribute("value");
   if(ip.equals(blockedIP))return false;
  }

 

其中涉及到一个文件路径问题,在项目中尽量使用相对路径,不要使用绝对路径,否则不利于项目的移植。Tomcat的默认路径是在WEB-INF/classes下的。

 

2.如何解析.properties文件?

也贴出一段代码吧,用的时候直接改路径,囧。。

 

  Properties props = new Properties();  
  InputStream in = this.getClass().getResourceAsStream("/relay/relay.properties");  
  props.load(in);   
  in.close();  
  Long x =Long.parseLong(props.getProperty("relay"));  

 

3.再说一说即时聊天系统的ajax实现方法吧。

 

关键实现点有二:

 

One.发送信息的时候,会设置一个监听器,

 

XMLHttpRequest.onreadystatechange=processResponse;

 

意思是当发送成功是,执行处理响应函数,一般是向页面中插入响应信息的函数

 

Two.设置一个定时器,每隔xx秒向服务器发送Null请求,目的是检查是否有新的信息。

 

 

要注意的知识点就这么多吧,主要的时间还是花在项目本身代码的理解上面,下面说一下:

 

1.  String tempChecked=phoneNumberHandler.checkPhoneNumber(temp);
  String recipientNumber=PhoneNumberChecker.addPlusSignToPhoneNumber(tempChecked);

 

这两个方法一般是配合着用。前者是完善带countycode的number,后者是为number加+或者去掉00,注意:number的标准是+8613456789012,存到数据库里面都是标准的,所以存入之前必须进行完善。

 

2.getCountryCode(number)这个方法的参数必须是带code的,它就是对code进行遍历,看有没有startwith()的。

 

3.然后就是发短信,这个纠结了好久,就是调用sendInternal()方法,但是因为sender的特殊性,sendInternalAspect()里面关于sender的属性的代码段必须绕过去。

 

4.NullPointerException

这个就是对一个null进行操作的Exception。比如,当sender==null是,操作sender.getId()就会抛这个异常。

 

重提交总结:

 

1.先是code类型的问题,那个问题高啸问过,回答是String,但我想偷懒,又因为他代码里都是Long型,只有RFP里面说是String,于是觉得是zozoc那边没道理,就没改,并在Release Note里面进行了说明。但还是被打回来了,结论是:能改的尽量改,小亏可以吃,大亏可以争。

 

2.控件不显示的问题,这是winwap的bug,winwap和symbian对wml的显示效果不同,第一次jira的时候没看懂他的问题。后来zozoc发了截图给我,我才发现symbian不支持<do/>标签,导致链接不显示。

 

<go href="<%=response.encodeURL(session.getAttribute("url")+"?action=reply")%>" method="post">
<postfield name="recipientNumber" value="$recipientNumber"/>
<postfield name="text" value="$text"/>
<postfield name="contacter" value="${sessionScope.senderNumber}"/>
</go>

 

像这样,直接指定href,不需要用<do/>标签。

 

最后提交了,communication了,但是被auto-accept了,没有被光明正大的accept,有点遗憾,希望他能看到communication。

 

结论一个,UI的问题最好发截图,图比文字强百倍!

 

就这么多吧,欢迎光临fuqingtian的博客~~~~

原创粉丝点击