关于JSP和Servlet的一些回顾认识

来源:互联网 发布:苹果手机赌博软件 编辑:程序博客网 时间:2024/06/08 02:42

接触JSP和servlet时间也不短了,但是真正用到却很少,要说为什么,大概有以下几点原因:

 

1.纯Jsp已经过时了,它通常搭载标签库一起使用比如JSTL或者是Struts2的标签库,而标签库出现的主要目的在于消除JSP页面上的Java脚本,更进一步做到业务和视图分离。

 

2.与标签库配合使用的Jsp也正在过时,虽然各种框架开发出各种好用的标签库,但是标签库所以来的核心还是JSP,而JSP最终所展示的页面是由JspServlet负责构建出的HTML,也就是说,页面的构建过程是服务器端完成的。但是,当存在大量的JSP页面时,服务器端构建页面就会有一定压力。那么,为什么一定要在服务器端构建页面?不能把数据传到浏览器端,让浏览器在现有的静态html上由JavaScript去改出一个新的页面呢?这样做的好处是:不但能消除服务器端构建页面的压力,还能更进一步的做到视图和业务分离,提升开发过程的质量。简直的一石二鸟。

 

3.JSP还有另外一个缺点,JSP的交互过程是基于刷新的,而刷新的用户体验非常差,它较难保存当前页面的一些临时数据(这些临时数据往往不需要和后台交互),还非常可能去服务器重复取出一些已有的数据,而不是只取所需数据的(这又增加了服务器的负担)。因此,基于刷新的交互过程也很糟糕。

 

Ok,我说了这么多,看来我们需要一种技术:它只需要服务器传给浏览器数据,然后尽可能的在浏览器端利用JavaScript构建新的页面,并且它一定要支持异步无刷新的交互机制,给客户留下一个没有停顿感的体验。

 

没错,你已经猜到了,这就是Ajax技术,多的我就不说了,再说就扯远了。

 

虽然分析了一圈,JSP这不好,那不好,但是JSP还是基础啊,JSP的本质Servlet更是基础啊,虽然Servlet也因为种种原因开始退役(这里就不再分析原因了),但是,是基础就要好好掌握,再不行的话也得有个大概的了解。好了,我就讲一下这几天的重新回顾把:

 

1.Servlet是由表单中的action字段所指明的,这个action其实是一个Servlet的URL-pattern,然后tomcat再去web.xml做转换,最终定位到你的Servlet,然后把这个类加载进来,对了,Servlet是单实例,多线程的,这也就是说你要在Servlet里面做好同步控制,而至于单实例的原因嘛,我想应该是出于对内存的保护吧(一个实例反复利用好过不停地大批创建,再不停地大批销毁),可怜的Servlet只能车轮战,服务完这个线程,又去服务那个线程。

 

2.Servlet并不是最先执行的,他的前面还有Filter要执行,在Servlet2.3规范出来后,Filter之前还有Listener要执行。但是Filter执行完之后,并不会结束,而是像一个栈式的调用过程。

 

3.转发和重定向我就不多说了,简要记录一下:重定向是告诉浏览器说:“你去找它”,而转发则是浏览器自己去找到了别的servlet,那个servlet处理完了,你所请求的servlet再把那个处理结果取回来,在发给你,浏览器是不知道这个过程的,还以为就是它所请求的servlet处理的。

 

4.JSP里面有几个全局对象,比如request,response,session等等,我记得不太清楚,但是在处理有汉字的情况下,要记得在doPost或者doGet方法的前两行调用request和response的setCharacterEncoding("UTF-8");以设定编解码的字符集,以避免乱码。

 

5.怎么转发?request.getRequestDispatcher("/xxx.jsp").forword(request,response);

 

6.转发过程中怎么传递参数?利用request对象携带:转发之前request.setAttribute("arg",object);,转发之后:request.getAttribute("arg");

 

7.JSP里面<%=request.getParameter("name")%>就会显示request中名为name的参数值。

 

8.注意,在JSP里面写java脚本的时候(<%%>之间的东西),你发现这些脚本根本就没有定义在某个方法里面,但是你写的是Java啊,怎么会有代码脱离方法独立存在?是的不会,你能直接写逻辑而不定义方法,是因为JspServlet已经定义好了一个方法,你写的代码,直接搬到那个方法里执行,所以你才可以直接写。

 

9.参照8说的,既然是<%%>中间的代码已经存在于方法中了,那就不能在<%%>之间定义方法了,因为java中不允许在方法中定义方法啊,等等,那我们需要在JSP页面上复用逻辑怎么办?只要在<%! %>中间定义方法就好了,因为<%! %>所对应的域是,成员内部,成员内部是可以定义方法的,因此在<%! %>之间是可以定义方法的,以达到复用逻辑的目的。

 

10.现在项目上一般不用session原因是:session中的对象是强引用,用户登录数量大了以后虚拟机立刻会内存溢出。当吧session换成一个软引用做的内存敏感的cache的时候,这个问题就解决了,内存不够,就缩减cache,当然,session是配合cookie使用的,这个cache也得配合session使用。因此现在项目多使用的搭配是cookie+全局cache。