1. Servlet类只实例化一次(在正常情况下),且常驻内存中,任何短期内不会引发内存泄漏的问题在这里最终都会暴露出来,所以在写程序时一定要注意内存方面的问题,最好事先要测试一下。
2. 在Servlet中声明变量时,要始终记住一点,就是Servlet的访问规则是线程级的,所以在声明每个变量前都要思考,这个变量是用来干什么的,是给所有线程也可以说是用户来使用的公共变量,还是一个针对每个线程或用户都不同(特有)的变量。Servlet的变量可分为三种,一种是静态变量,这种变量的用途显而易见。另外的就是局部变量和实例变量,这两种很难区分,我个人理解为:局部变量是为每个线程准备的,这样每个线程使用的变量地址都不同,各自声明自己不同的变量,不易发生错误。而实例变量则不同,他(可能)是声明给所有用户的,但这并不是你的本意,因为你忽略了正常情况下Servlet只实例化一次,所以当单用户时不会发生问题,但当用户多了即多线程访问时就可能出现问题,如A用户访问的变量A实际上返回的可能时B用户中的变量A。下面给出局部变量和实例变量的例子,读者一看就明白了,还是那句话,要记住Servlet正常情况下只实例话一次,而访问是往往是多线程的,个人建议新手如果区分不开变量用途话尽量使用局部变量,这样虽然浪费一点内存和效率,但却保证了程序的正确性。局部变量和实例变量例子如下(这里简写拉呵呵):
1,局部变量,每个线程都会声明各自的局部变量,因此访问不冲突。
public class getDemo extents HttpServlet {
public void doget(…….)throws…..{
……….
String A=new String();//局部变量,每个线程调用doget()方法时都会
A=?…..; //重新声明此变量
……….
}
}
2,实例变量,这种变量一般只随Servlet实例话一次后常驻内存,使用时要慎重。
public class getDemo extents HttpServlet {
String A=new String(); //实例化变量,在此声明后,每个线程都使用一个变量。
public void doget(…….)throws…..{
……….
A=?…..//此处A没有声明,因此当一个线程改变了这个之后,其它的线程中此值也变了。
……….
}
}
3如何获得错误类型:
可以在error.jsp页面声明:
if(exception instanceof NumberFormatException){
……………….
}
因此同理可以在error页面处理各种已知的错误类型了。
4 Dom和Sax的区别:
编程因素 Dom Sax
内存要求 可能很大 取决与内存中保留项目的大小
启动时间 较慢,因为要分析每个元素。 很快,特别是所要元素易于找到
重复搜索时间 很快,一切都在内存中。 很慢,每次都得重新运行分析
修改功能 很灵活 只限于每次编写新的XML文档
所以日后若用到解析XML时要根据需要选择不同的解析器。
5.servlet中的转发机制
如果servlet组件要把一个请求转发个一个jsp页面,如hello.jsp时,可以利用下面的代码:
RequestDispather rd=request.getRequestDispather(“hello.jsp”);
rd.forward(request,response);
重定向可用下面代码:
response.sendRedirect(“hello.jsp”);
区别:利用forward可以转发request里的数据,而重定向只是强制跳转到某个页面,什么数据都不传递。
6.怎样使用数据库中的回滚功能,以及预处理命令,怎么控制异常和关闭连接。
public void insert()throws Exception{
Connection con=DBCon.getConnection();
PrepareadStatement pre=null;
try{
Pre=con.prepareStatement(insert into A (id,name) values(?,?));
Con.setAutoCommit(false);
Pre.setInt(1);
Pre.setString(“mc”);
Con.commit()
}catch(Exception e){
try{
con.rollback();
}catch(SQLException ee){
……..
}
throw e;
}finally{
try{
pre.close();
con.close();
}catch(Exception e){
…….
}
}
}
7如何配置Servlet,及其含义。
首先在web.xml中,添加<servlet></servlet><servlet-mapping></servlet-mapping>节点,例子如下:
<servlet>
<servlet-name>action</servlet-name>//……….1
<servlet-class>edu.cust.mm</servlet-class>//….2
</servler>
<servlet-mapping>
<servlet-name>action</servlet-name>//……….3
<url-pattern>*.do</url-pattern>//………………4
</servlet-mapping>
具体含义是在1处声明你在网页中要访问的servlet的名字。
在2处指出您要访问的servlet的类地址
在3处是映射,要注意3和2必须一致,4处的意思是凡是在URL中,以do结尾的,都转到action这个servlet中处理。例如:http://127.0.0.1/mc/11111.do;如果将其改为/do/*,则表示action将处理所有以/do为前缀的url,如,http://127.0.0.1/mc/do/afasdfa;
另外,<init-param>可以用来配置servlet的初始化参数,常用<param-name><param-value>来配对。<welcome-file-list> 中的<welcome-file>可以用来设置多个欢迎文件