谈一谈Java Web(Servlet + JSP)那些事

Question1:servlet&jsp - jsp和servlet 有什么联系和区别?

Answer1:

1、从JVM来说,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类。所以说,jsp经编译后就变成了Servlet,JSP的本质就是Servlet。

2、从本质上来说,Servlet是个完整的Java类,JSP是Servlet的一种简化。Servlet是完整的Java类,这个类的Service方法用于生成对客户端的响应;JSP是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,至于JSP 中的Java脚本是如何镶嵌到一个类中,由JSP容器完成,程序员不用操心。

3、从页面来说,jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。

4、从内置对象来说,Servlet中没有内置对象,Jsp中的有9种内置对象,但是都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。

Question2:servlet&jsp - jsp 有哪些内置对象?作用分别是什么?

Answer2:

JSP有9个内置对象:

request:封装客户端的请求,其中包含来自GET或POST请求的参数;

response:封装服务器对客户端的响应;

pageContext:通过该对象可以获取其他对象;

session:封装用户会话的对象;

application:封装服务器运行环境的对象;

out:输出服务器响应的输出流对象;

config:Web应用的配置对象;

page:JSP页面本身(相当于Java程序中的this);

exception:封装页面抛出异常的对象。

Question3:servlet&jsp - 说一下 jsp 的 4 种作用域?

Answer3:

JSP中的四种作用域包括page、request、session和application,具体来说:

page代表与一个页面相关的对象和属性。

request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。

session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。

application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。

Question4:session&cookie - session 和 cookie 有什么区别?

Answer4:

由于HTTP协议是无状态的协议,所以服务端需要记录用户的状态时,就需要用某种机制来识具体的用户,这个机制就是Session.典型的场景比如购物车,当你点击下单按钮时,由于HTTP协议无状态,所以并不知道是哪个用户操作的,所以服务端要为特定的用户创建了特定的Session,用用于标识这个用户,并且跟踪用户,这样才知道购物车里面有几本书。这个Session是保存在服务端的,有一个唯一标识。在服务端保存Session的方法很多,内存、数据库、磁盘文件都有。集群的时候也要考虑Session的转移,在大型的网站,一般会有专门的Session服务器集群,用来保存用户会话,这个时候 Session 信息都是放在内存的,使用一些缓存服务比如Memcached之类的来放 Session。

思考一下服务端如何识别特定的客户?这个时候Cookie就登场了。每次HTTP请求的时候,客户端都会发送相应的Cookie信息到服务端。实际上大多数的应用都是用 Cookie 来实现Session跟踪的,第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。有人问,如果客户端的浏览器禁用了 Cookie 怎么办?一般这种情况下,会使用一种叫做URL重写的技术来进行会话跟踪,即每次HTTP交互,URL后面都会被附加上一个诸如 sid=xxxxx 这样的参数,服务端据此来识别用户。

Cookie其实还可以用在一些方便用户的场景下,设想你某次登陆过一个网站,下次登录的时候不想再次输入账号了,怎么办?这个信息可以写到Cookie里面,访问网站的时候,网站页面的脚本可以读取这个信息,就自动帮你把用户名给填了,能够方便一下用户。这也是Cookie名称的由来,给用户的一点甜头。

所以,总结一下:Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式

Question5:session&cookie - 说一下 session 的工作原理?

Answer5:

其实session是一个存在服务器上的类似于一个散列表格的文件。里面存有我们需要的信息,在我们需要用的时候可以从里面取出来。类似于一个大号的map吧,里面的键存储的是用户的sessionid,用户向服务器发送请求的时候会带上这个sessionid。这时就可以从中取出对应的值了。

Question6:session&cookie - 如果客户端禁止 cookie 能实现 session 还能用吗?

Answer6:

Cookie与 Session,一般认为是两个独立的东西,Session采用的是在服务器端保持状态的方案,而Cookie采用的是在客户端保持状态的方案。但为什么禁用Cookie就不能得到Session呢?因为Session是用Session ID来确定当前对话所对应的服务器Session,而Session ID是通过Cookie来传递的,禁用Cookie相当于失去了Session ID,也就得不到Session了。

假定用户关闭Cookie的情况下使用Session,即不使用Cookie传递Session ID,可以使用以下几种方式传递Sesssion ID:

1、设置php.ini配置文件中的“session.use_trans_sid = 1”,或者编译时打开打开了“–enable-trans-sid”选项,让PHP自动跨页传递Session ID。

2、手动通过URL传值、隐藏表单传递Session ID。

3、用磁盘文件、数据库等形式保存Session ID,在跨页过程中手动调用。

Question7:struts&springmvc - struts和springmvc 的区别是什么?

Answer7:

拦截级别、拦截实现、网络请求、单例、url、接收参数

Struts2是类级别的拦截;
Struts2拦截使用自己的拦截Interceptor机制,导致Struts2的配置文件比SpringMVC大;
每次请求就会创建一个Action,需要加载所有的属性值注入,性能较低;
无法用注解或其他方式标识所属方法,只能设计为多例;
一个Action对应一个request-response上下文,Action中的一个方法对应一个url;
在接收参数时,通过类属性接收,由于类属性参数是让多个方法共享的,所以类中所有方法共享request-response数据。

SpringMVC是方法级别的拦截;
SpringMVC使用的是独立的AOP方式;
所有的请求只会创建一个Controller,仅需要加载一次方法参数注入,性能更高;
可以使用注解或其他方式标识所属方法,设计为单例,最后将处理结果通过ModelMap返回给框架;
一个方法对应一个request-response上下文,一个方法对应一个url;
在接收参数时,通过方法参数接收,由于方法参数是各个方法独享的,所以各个方法独享request-response数据。

底层框架和初始化时机

Struts2底层采用Filter(StrutsPrepareAndExecuteFilter)实现,Filter在容器启动之后初始化,服务停止坠毁;
SpringMVC(DispatcherServlet)底层采用Servlet实现,Servlet在是在容器调用时初始化,服务停止销毁。
因为Servlet的初始化早于Filter的初始化,所以SpringMVC的调用早于Struts2的调用。

与Spring的整合

Struts2在Spring整合时,Struts2的Action Bean默认是是原型模式Prototype。
SpringMVC在Spring整合时,SpringMVC的Controller Bean默认是单例模式Singleton,所以默认对所有的请求,只会创建一个Controller,又因为没有共享的属性,所以是线程安全的,如果要改变默认的作用域,需要添加@Scope注解修改。

SpringMVC作为Spring的子容器,和Spring的整合是无缝的,整个项目的管理和安全上也比Struts2高。

Struts2 SpringMVC
拦截级别 类拦截 方法拦截
拦截实现 Struts2有自己的拦截Interceptor机制,所以配置文件大 SpringMVC使用的是独立的AOP方式,所以配置文件小
网络请求 每次请求就会创建一个Action,需要加载所有的属性注入,性能较低 所有的请求只会创建一个Controller,仅需要加载一次方法参数注入,性能更高
单例 无法用注解或其他方式标识所属方法,只能设计为多例 可以使用注解或其他方式标识所属方法,设计为单例,最后将处理结果通过ModelMap返回给框架
url 一个Action对应一个request-response上下文,Action中的一个方法对应一个url 一个方法对应一个request-response上下文,一个方法对应一个url
接收参数 在接收参数时,通过类属性接收,由于类属性参数是让多个方法共享的,所以类中所有方法共享request-response数据 在接收参数时,通过方法参数接收,由于方法参数是各个方法独享的,所以各个方法独享request-response数据
底层框架及初始化时机 Filter Servlet,因为Servlet的初始化早于Filter的初始化,所以SpringMVC的调用早于Struts2的调用
Spring整合 在Spring整合时,Struts2的Action Bean默认是是原型模式Prototype 在Spring整合时,SpringMVC的Controller Bean默认是单例模式Singleton,且SpringMVC作为Spring的子容器,和Spring的整合是无缝的
发布了207 篇原创文章 · 获赞 80 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_36963950/article/details/105554813