servlet的一些问题和解答

1.servlet是什么
2.servlet的生命周期以及和CGI的区别
3.重定向和请求转发
4.如何实现servlet的单线程模式
5.servlet页面间对象传递的方法有几种
6.JSP和Servlet之间有什么相同点和不同点?联系是什么
7.举例说说你所知道的会话跟踪技术
8.session和cookie机制的区别和联系
9.web容器通过哪三种途径实现会话

以下是我整理的一些答案:
1.Servlet 是 SUN 推出的一套规范,规定了如何用 Java 来开发动态网站。由 javax.servlet 和 javax.servlet.http 两个包中的类来实现。
通过Servlet,你可以:
接收用户通过 <form> 表单提交的信息;
查询数据库,包括用户信息、文章内容、页面点击次数等;
生成验证码,防止机器恶意注册。

2.CGI(Common Gateway Interface,公共网关接口),需要把HTML代码当做字符串,通过输出语句一条一条的输出。
在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程)。
在传统CGI中,如果有N个并发的对同一CGI程序的请求,则该CGI程序的代码在内存中重复装载了N次;而对于Servlet,处理请求的是N个线程,只需要一份Servlet类代码。在性能优化方面,Servlet也比CGI有着更多的选择。
Servlet提供了大量的实用工具例程,例如自动地解析和解码HTML表单数据、读取和设置HTTP头、处理Cookie、跟踪会话状态等。
Servlet用Java编写,Servlet API具有完善的标准。

3.第一:在jsp中的写法,请求转发:<jsp:forward page="new.jsp" />;重定向:<response.sendRedirect("new.jsp");
第二:在servlet中的写法:请求转发:RequestDispatcher rde = request.getRequestDispatcher(path);rde.forward(request,response);重定向:response.sengRedirect(path)
第三:使用请求转发的时候浏览器地址不变;而使用重定向的时候地址栏的地址会发生改变
第四:请求转发是服务器端跳转;而重定向是客户端跳转。
第五:请求转发只向服务区请求一次(request);而重定向会向服务器请求两次,1向服务器申请响应码,2带着响应码向服务器请求(request只在第一次有效,在第二次请求时已被销毁)
第六:请求转发是调用者和被调用者共享同一个request和response对象;而重定向中调用者和被调用者使用各自的request和response
第七:请求转发只能将请求转发给同一个web中应用的组件,而重定向不仅可以重定向当前应用的其他资源,还可以重定向到其他站点的资源。

4.<%@ page isThreadSafe="true"%>是默认设置。
默认的,servlet容器是只创建servlet単实例,为请求提供线程池,我们为了能保证servlet的线程安全问题而不在servlet中添加实例属性。
<%@ page isThreadSafe="false"%>,添加了这个命令的意思是该类实现了SingleThreadModel接口。实现这个接口意味着容器在创建实例池会为每个请求分配实例,当用户请求结束时将实例归还实例池,而这样做是不安全的;因为每个请求都会分发一个servlet实例,对于同用户下分发的不同的servlet来说很可能用到同一个session中的属性数据,这样当然出现了线程同步的问题,是不安全的!而且不同用户也可能享用同一个context中的数据,也是不安全的,所以上面的设置是false。于是在servlet2.4中建议不再使用这样的设置。

5.第一种:请求转发,将参数携带在请求中;
第二种:将对象数据放在session中,然后在另一个页面取;
第三种:${param.info}另一个jsp页面获得前一个页面的值

6.JSP引擎通常架构在servlet引擎之上,本身就是一个Servlet的一种简化,把JSP文件转译成servlet源代码,再调用java编译器,编译成Servlet。Servlet和JSP都是继承Servlet类而来的,只是JSP又添加了一些方法,做了新的封装。
JSP中有内置对象,而Servlet中没有;JSP中的java脚本由JSP容器镶嵌到一个类中,而servlet则是个完整的Java类;JSP侧重于视图,Servlet主要用于控制逻辑。

7.(1)隐藏表单域:<input type="hidden"/>,非常适合不需要大量数据存储的会话应用。
(2)URL重写:URL可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。核心代码:String SessionId=request.getRequestedSessionId();
(3)Cookie:一个Cookie是一个小的,已命名数据元素。服务器使用SET-Cookie头标将它作为 HTTP
响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个
Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至
在客户端计算机重启后它仍可以保留其值。 
(4)Session:使用 setAttribute(String str,Object obj)方法将对象捆绑到一个会话。

8.session是存在服务器的,而Cookie是存在客户端的;Cookie的实现本质还是session;Cookie的内容主要包括:名字,值,过期时间,路径和域,而session可以存任何内容,包括Map,List,String等等;Cookie不是很安全,别人可以分析存放在本地的Cookie并进行cookie欺骗,考虑到安全应该使用session;
session会在一定时间内保存在服务器上,但当访问量增多,会比较占用服务器的性能,考虑到减轻服务器性能放面,应当使用cookie;单个cookie保存的数据不能超过4K,很多浏览器也限制了一个站点最多保存20个Cookie。

9.Cookie机制,URL重写,隐藏表单输入
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值