Jsp与Servlet⾯试题
⼀、、jsp有哪些内置对象作⽤分别是什么
答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):
  request ⽤户端请求,此请求会包含来⾃GET/POST请求的参数
response ⽹页传回服务器端的回应
pageContext ⽹页的属性是在这⾥管理
session 与请求有关的会话期
application : 服务器启动时创建,服务器关闭时停⽌,为多个应⽤程序保存信息
out ⽤来传送回应的输出
config servlet的构架部件
page JSP⽹页本⾝
exception 针对错误⽹页,未捕捉的例外
⼆、jsp有哪些动作作⽤分别是什么
答:JSP共有以下6种基本动作
jsp:include:在页⾯被请求的时候引⼊⼀个⽂件。
jsp:useBean:寻或者实例化⼀个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到⼀个新的页⾯。
jsp:plugin:根据浏览器类型为Java插件⽣成OBJECT或EMBED标记
三、JSP中动态INCLUDE与静态INCLUDE的区别?
答:动态INCLUDE⽤jsp:include动作实现
它总是会检查所含⽂件中的变化,适合⽤于包含动态页⾯,并且可以带参数
静态INCLUDE⽤include伪码实现,定不会检查所含⽂件的变化,适⽤于包含静态页⾯
四、 Servlet⽣命周期
Servlet⽣命周期包括三部分:
初始化:Web容器加载servlet,调⽤init()⽅法
处理请求:当请求到达时,运⾏其service()⽅法。service()⾃动派遣运⾏与请求相对应的doXXX(doGet或者doPost)⽅法。
销毁:服务结束,web容器会调⽤servlet的distroy()⽅法销毁servlet。
五、get提交和post提交有何区别
(1)get⼀般⽤于从服务器上获取数据,post⼀般⽤于向服务器传送数据
(2)请求的时候参数的位置有区别,get的参数是拼接在url后⾯,⽤户在浏览器地址栏可以看到。post是放在http包的包体中。
⽐如说⽤户注册,你不能把⽤户提交的注册信息⽤get的⽅式吧,那不是说把⽤户的注册信息都显⽰在Url上了吗,是不安全的。
(3)能提交的数据有区别,get⽅式能提交的数据只能是⽂本,且⼤⼩不超过1024个字节,⽽post不仅可以提交⽂本还有⼆进制⽂件。 所以说想上传⽂件的话,那我们就需要使⽤post请求⽅式
(4)servlet在处理请求的时候分别对应使⽤doGet和doPost⽅式进⾏处理请求
六、JSP与Servlet有什么区别
Servlet是服务器端的程序,动态⽣成html页⾯发送到客户端,但是这样程序⾥会有很多out.println(),Java与html语⾔混在⼀起很乱,所以后来sun公司推出了JSP.其实JSP就是Servlet,每次运⾏的时候JSP都⾸先被编译成servlet⽂件,然后再被编译成.class⽂件运⾏。有了jsp,在MVC项⽬中servlet不再负责动态⽣成页⾯,转⽽去负责控制程序逻辑的作⽤,控制jsp与javabean之间的流转。
七、doGet与doPost⽅法的两个参数是什么
HttpServletRequest:封装了与请求相关的信息
HttpServletResponse:封装了与响应相关的信息
⼋、Attribute()和Parameter
(1)有setAttribute,没有setParameter⽅法
(2)getParameter获取到的值只能是字符串,不可以是对象,⽽getAttribute获取到的值是Object类型的。
(3)通过form表单或者url来向另⼀个页⾯或者servlet传递参数的时候需要⽤getParameter获取值;getAttribute只能获取setAttribute 的值
(4)setAttribute是应⽤服务器把这个对象放到该页⾯所对应的⼀块内存当中,当你的页⾯服务器重定向到另⼀个页⾯的时候,应⽤服务器
会把这块内存拷贝到另⼀个页⾯对应的内存当中。通过getAttribute可以取得你存下的值,当然这种⽅法可以⽤来传对象。
⽤session也是⼀样的道理,这是说request和session的⽣命周期不⼀样⽽已。
九、四种会话跟踪技术
会话作⽤域ServletsJSP 页⾯描述
page:是代表与⼀个页⾯相关的对象和属性。⼀个页⾯由⼀个编译好的 Java servlet 类(可以带有任何的 include 指令,但是没有include 动作)表⽰。这既包括 servlet ⼜包括被编译成 servlet 的 JSP 页⾯
request是是代表与 Web 客户机发出的⼀个请求相关的对象和属性。⼀个请求可能跨越多个页⾯,涉及多个 Web 组件(由于 forward 指令和 include 动作的关系)
session是是代表与⽤于某个 Web 客户机的⼀个⽤户体验相关的对象和属性。⼀个 Web 会话可以也经常会跨越多个客户机请求 application是是代表与整个 Web 应⽤程序相关的对象和属性。这实质上是跨越整个 Web 应⽤程序,包括多个页⾯、请求和会话的⼀个全局作⽤域
page:当前页⾯,也就是只要跳到别的页⾯就失效了
request:⼀次会话,简单的理解就是⼀次请求范围内有效
session:浏览器进程,只要当前页⾯没有被关闭(没有被程序强制清除),不管怎么跳转都是有效的
application:服务器,只要服务器没有重启(没有被程序强制清除),数据就有效
⼗、forward和redirect的区别
转发与重定向
(1)从地址栏显⽰来说
forward是服务器请求资源,服务器直接访问⽬标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送
的内容从哪⾥来的,所以它的地址栏还是原来的地址.redirect是服务端根据逻辑,发送⼀个状态码,告诉浏览器重新去请求那个地址.所以地址栏显⽰的是
新的URL.
(2)从数据共享来说
forward:转发页⾯和转发到的页⾯可以共享request⾥⾯的数据.
redirect:不能共享数据.
(3)从运⽤地⽅来说
forward:⼀般⽤于⽤户登陆的时候,根据⾓⾊转发到相应的模块.
redirect:⼀般⽤于⽤户注销登陆时返回主页⾯和跳转到其它的⽹站等.
(4)从效率来说
forward:⾼.
redirect:低.
⼗⼀、Servlet的线程安全问题:
实例变量不正确的使⽤是造成Servlet线程不安全的主要原因。
从Servlet的调⽤过程可以看出,当客户端第⼀次请求Servlet的时候,tomcat会根据l配置⽂件实例化servlet
当⼜有⼀个客户端访问该servlet的时候,不会再实例化该servlet,也就是多个线程在使⽤这个实例。
JSP/Servlet容器默认是采⽤单实例多线程(这是造成线程安全的主因)⽅式处理多个请求的,这种默认以多线程⽅式执⾏的设计可⼤⼤降低对系统的资源需求,提⾼系统的并发量及响应时间。
Servlet本⾝是⽆状态的,⼀个⽆状态的Servlet是绝对线程安全的,⽆状态对象设计也是解决线程安全
问题的⼀种有效⼿段。
所以,servlet是否线程安全是由它的实现来决定的,如果它内部的属性或⽅法会被多个线程改变,它就是线程不安全的,反之,就是线程安全的。
如何控制Servlet的线程安全性?
避免使⽤实例变量
避免使⽤⾮线程安全的集合
在多个Servlet中对某个外部对象(例如⽂件)的修改是务必加锁(Synchronized,或者ReentrantLock),互斥访问。
属性的线程安全:ServletContext、HttpSession是线程安全的;ServletRequest是⾮线程安全的。
servlet和tomcat的关系设计线程安全的Servlet
1.实现 SingleThreadModel 接⼝
该接⼝指定了系统如何处理对同⼀个Servlet的调⽤。如果⼀个Servlet被这个接⼝指定,那么在这个Se
rvlet中的service⽅法将不会有两个线程被同时执⾏,当然也就不存在线程安全的问题。但是,如果⼀个Servlet实现了SingleThreadModel接⼝,Servlet引擎将为每个新的请求创建⼀个单独的Servlet实例,这将引起⼤量的系统开销,在现在的Servlet开发中基本看不到SingleThreadModel的使⽤,这种⽅式了解即可,尽量避免使⽤。
2.同步对共享数据的操作
使⽤synchronized 关键字能保证⼀次只有⼀个线程可以访问被保护的区段,可以通过同步块操作来保证Servlet的线程安全。如果在程序中使⽤同步来保护要使⽤的共享的数据,也会使系统的性能⼤⼤下降。这是因为被同步的代码块在同⼀时刻只能有⼀个线程执⾏它,使得其同时处理客户请求的吞吐量降低,⽽且很多客户处于阻塞状态。另外为保证主存内容和线程的⼯作内存中的数据的⼀致性,要频繁地刷新缓存,这也会⼤⼤地影响系统的性能。所以在实际的开发中也应避免或最⼩化Servlet 中的同步代码。
3.避免使⽤实例变量
线程安全问题很⼤部分是由实例变量造成的,只要在Servlet⾥⾯的任何⽅法⾥⾯都不使⽤实例变量,那么该Servlet就是线程安全的。
在Servlet中避免使⽤实例变量是保证Servlet线程安全的最佳选择。
Java 内存模型中,⽅法中的临时变量是在栈上分配空间,⽽且每个线程都有⾃⼰私有的栈空间,所以它们不会影响线程的安全

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。