针对汪大伦的提问,解释Session中为什么也可能出现线程安全的问题,在服务器端比较缓慢时,一个表单可以被提交多次,这时候就会出现多个线程访问同一个Session的情况。所以,我们是要注意存放在Session中的Cart对象本身应该是线程安全的。
前几天雷辉老师在讲解ibatis的JPetStore例子时,我们看到某个业务对象中的一个方法为两个成员变量进行了赋值,结果JSP页面的显示数据就发生了修改,当时觉得很奇怪,我们的习惯思维是将数据显示在某个域范围中,JSP然后显示域范围中的数据。后来雷辉研究明白了,JSP页面显示的就是那个业务对象,业务对象内部的成员变量发生了修改,就导致了JSP页面的显示数据发生变化。
简单标签的setParent方法只在有父标签时才被调用。简单标签只有一个doTag方法来处理标签的业务功能,其标签体用JSPFragment对象来表示,且标签体中不能包含JSP脚本片段。在doTag方法中调用getJspBody().invoke()方法执行JspFragment中包含的内容,并把它输出到某个Writer中。想想如何修改简单标签体中的内容后再输出呢?将标签体先输出到StringWriter中,再从StringWriter中取出内容进行修改,最后输出修改后的内容。
在doTag方法中抛出SkipPageException异常,就可以结束页面后面部分的执行。
<jsp:attribute></jsp:attribute>标签中的内容也是用JSPFragment来表示的。
对于Servlet 2.3规范,<taglib>元素在web.xml文件中的情况是:<web-app><tag-lib></tag-lib></web-app>;对于Servlet 2.4规范,<taglib>元素在web.xml文件中的情况是:<web-app><jsp-config><tag-lib></tag-lib><jsp-config></web-app>。
如何将自定义标签处理类及相关的支持类打包成jar文件对外发布,标签库描述符文件(tld)文件也应该连同打包到jar文件中,其位置应该放置在jar包中的META-INF目录及其子目录中。
接着讲解了java web中的listener和Spring中提供的ContextLoaderListener的功能原理。
冯伟立实验发现的一个问题:在common-logging包中有两个jar文件,一个是commons-logging-api-1.1.jar,一个是common-logging-1.1.jar。在项目中要用后者,如果用前者的话,将总是调用JDK标准的Log工具。
冯伟立自己做了一个digester小练习,有如下一些经验问题:
d.addObjectCreate方法表示遇到标签开始创建对象,d.addCallMethod方法表示遇到标签结束调用方法。d.addSetNext表示遇到标签结束时调用栈中的第二个对象的方法,并将当前的对象作为参数传递给该方法。栈顶的对象是什么时候出栈的呢?以后问问梁言兵老师。估计是遇到对象对应的结束标签就出栈,与程序代码的编写顺序无关。
张艳青发现IE浏览器中的一个JavaScript问题:
<div id="ok">ok</div>
<input name="submit" value="...">
得到div对象后,再调用其nextSibling方法,可以得到<input>对象。
<input name="submit" value="...">
<div id="ok">ok</div>
得到<input>对象后,再调用其nextSibling方法,无法得到<div>对象,得到的是一个代表回车换行的对象。
小技巧:
在eclipse中直接在某个类后面编写其实现的接口,然后按CTRL+1,即可生成接口中定义的方法。