面试官常问的 web后台 问题 (二)

11、四种会话跟踪技术作用域

page、request、session、application

(1)page:一个页面
(2)request::一次请求
(3)session:一次会话
(4)application:服务器从启动到停止

12、MVC 的各个部分都有那些技术来实现?如何实现?

MVC(Model(业务逻辑层)-View(表示层)-Controller(控制层))

MVC 是 Model-View-Controller 的简写。
Model 代表的是应用的业务逻辑(通过 JavaBean,EJB 组件实现)
View 是应用的表示面(由 JSP 页面产生)
Controller 是提供应用的处理过程控制(一般是一个 Servlet)
通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现,这些组件可以进行交互和重用。

13、web.xml 文件中可以配置哪些内容?

web.xml 用于配置 Web 应用的相关信息。
如:监听器(listener)、过滤器(filter)、 Servlet、相关参数、会话超时时间、安全验证方式、错误页面。

14、session 和 cookie 有什么区别?

cookie 数据放在浏览器,不安全,有被 cookie 欺骗的风险;服务器性能比session高,但单个 cookie 保存的数据太小。
session 数据放在服务器,安全性比cookie高;在一定时间内保存在服务器上,当访问增多,会比较占用服务器的性能;

1、cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
2、cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session。
3、session 会在一定时间内保存在服务器上。当访问增多,会占用服务器性能。
4、单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。

15、CS 与 BS 的联系与区别

C/S(Client/Server):建立在局域网;高度机密;注重流程;重用性差;升级难;
B/S(Brower/Server):建立在广域网;可部分公开;注重速度;重用性好;无缝升级;

C/S 是 Client/Server 的缩写。服务器通常采用高性能的 PC、工作站或小型机,并采用大型数据库系统,如 SQLServer、MySQL、Oracle 等,客户端需要安装专用的客户端软件。
B/S是 Brower/Server 的缩写,客户机上只要安装一个浏览器(Browser),如 Google 浏览器或 Internet Explorer,服务器安
装 Oracle、MySQL 或 SQL Server 等数据库。在这种结构下,用户界面完全通过 WWW 浏览器实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现。浏览器通过Web Server 同数据库进行数据交互。

C/S 与 B/S 区别:
1.硬件环境不同:
C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务。
B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例与电话上网, 租用设备. 信息自己管理. 有比 C/S 更强的适应范围, 一般只要有操作系统和浏览器就行。
2.对安全要求不同
C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强. 一般高度机密的信息系统采用 C/S 结构适宜.,可以通过 B/S
发布部分可公开信息。
B/S 建立在广域网之上, 对安全的控制能力相对弱, 可能面向不可知的用户。
3.对程序架构不同
C/S 程序可以更加注重流程, 可以对权限多层次校验, 对系统运行速度可以较少考虑.
B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上. 比 C/S 有更高的要求 ,B/S 结构的程序架构是发
展的趋势。
4.软件重用不同
C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在 B/S 要求下的构件的重用性好.
B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就如买来的餐桌可以再利用,而不是做在墙上的石头桌子
5.系统维护不同
C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统
B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升
级.
6.处理问题不同
C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统
B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是 C/S 无法作到的. 与操作系统平台关系最小.
7.用户接口不同
C/S 多是建立的 Window 平台上,表现方法有限,对程序员普遍要求较高
B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.
8.信息流不同
C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低
B/S 信息流向可变化, B-B B-C 等信息、流向的变化, 更像交易中心。

16、Java 反射技术主要实现类有哪些,作用分别是什么?

在 JDK 中,主要由以下类来实现 Java 反射机制,这些类都位于 java.lang.reflect 包中。
1)Class 类:代表一个类
2)Field 类:代表类的成员变量(属性)
3)Method 类:代表类的成员方法
4)Constructor 类:代表类的构造方法
5)Array 类:提供了动态创建数组,以及访问数组的元素的静态方法

17、拦截器与过滤器的区别

拦截器:基于 java 反射机制;不依赖 servlet 容器;只对 action 请求起作用;可访问 action 上下文和值栈里的对象;可被多次调用;可获取IOC容器中各个bean;
过滤器:基于函数回调;依赖servlet 容器;可对几乎所有请求起作用;不可访问 action 上下文和值栈里的对象;只在初始化被调用一次;不可获取IOC容器中各个bean;

拦截器是基于 java 的反射机制的,而过滤器是基于函数回调。
拦截器不依赖 servlet 容器,过滤器依赖 servlet 容器。
拦截器只能对 action 请求起作用,而过滤器则可以对几乎所有的请求起作用。
拦截器可以访问 action 上下文、值栈里的对象,而过滤器不能访问。
在 action 的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次
拦截器可以获取 IOC 容器中的各个 bean,而过滤器就不行,这点很重要,在拦截器里注入一个 service,可以调用业务逻辑。

18、Struts2 的工作流程

①. 请求发送给 StrutsPrepareAndExecuteFilter
②. StrutsPrepareAndExecuteFilter 判定该请求是否是一个 Struts2 请求
③. 若该请求是一个 Struts2 请求,则 StrutsPrepareAndExecuteFilter 把请求的处理交给 ActionProxy
④. ActionProxy 创建一个 ActionInvocation 的实例,并进行初始化
⑤. ActionInvocation 实例在调用 Action 的过程前后,涉及到相关拦截器(Intercepter)的调用
⑥. Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到相对应的返回结果,调用结果的 execute 方法。
⑦. 执行各个拦截器 invocation.invoke()之后的代码
⑧. 把结果发送到客户端

FilterDispatcher是控制器的核心,就是MVC的Struts 2实现中控制层(Controller)的核心!
在这里插入图片描述

19、Struts2 优点

①. 基于 MVC 架构,框架结构清晰;
②. 使用 OGNL(Object Graphic Navigation Language 对象图导航语言):OGNL 可以快速的访问值栈中的数据、调用值栈中对象的方法;
③. 拦截器:struts2 中的很多特性都是通过拦截器实现的,例如异常处理、文件上传、验证等,拦截器是可配置与重用的;
④. 多种表现层技术,如:JSP、FreeMarker、Velocity 等
⑤. 通过配置文件,就可以掌握整个系统各部分之间的关系。
⑥. 异常处理机制,只需在配置文件中配置异常的映射,即可对异常做相应的处理。

Struts2框架是替代了servelt、jsp的一种全新的框架,用于处理用户发送的请求。

20、谈谈值栈 ValueStack

在Struts2里面提供一种存储机制,类似于域对象,是值栈,可以存值和取值,在action里面把数据放到值栈里面,在页面中获取到值栈数据。

①. ValueStack 贯穿整个 Action 的生命周期,保存在 request 域中,所以 ValueStack 和 request 的生命周期时一样的;
②. ValueStack 是多实例的,因为 Action 是多实例的(Servlet 是单例的),每个 Action 都有一个对应的值栈,Action 对象默认
保存在栈顶;
③. ValueStack 本质上就是一个 ArrayList;
④. 使用 OGNL 访问值栈内容是,不需要#号,而访问作用域中的值时,需要#号;
⑤. Struts2 重写了 request 的 getAttribute 方法,所以可以用 EL 直接访问值栈中的内容;

ValueStack 实际上就是一个容器,由Struts框架创建,当前端页面发送请求时,Struts的默认拦截器会将请求中的数据进行封装,并存入ValueStack的栈顶。

Struts2在启动时,会创建一个ValueStack对象,当用户发送请求到对应的Action时,Struts2会把当前被请求的Action01放入CompoundRoot 对象的“栈空间”栈顶,请求结束,Action01会被清除。 (当下一次另一个请求到来时,Struts2会把该请求对应的Action02放入“栈顶”) 所以,我们可以通过Ognl表达式访问CompoundRoot对象栈顶的Action。
Struts2在请求到来时,首先会创建一个ValueStack; 然后,把当前的Action对象放入栈顶(CompoundRoot); Struts2会把ValueStack存放在request中,属性为”struts.valueStack“, 所以,标记库可以访问到ValueStack Struts2的很多标记就是通过访问ValueStack获得数据的:

  • 通过ognl从ValueStack取数据,并且显示

      <s:property value="ognl..."/>
    
  • 省略value,取出ValueStack的栈顶

      <s:property />
    
  • 通过ognl从ValueStack取出集合,依次将集合中的对象置于栈顶,在循环中,ValueStack栈顶即为要显示的数据

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章