撩课-Java每天5道面试题第18天
121.描述Struts2的工作原理
客户端发送请求--》 请求经过一系列过滤器-> FilterDispatcher通过 ActionMapper来决定这个Reques t需要调用哪个Action -> FilterDispatcher把请求的处理交给ActionProxy-> 通过ConfigurationManager询问 Struts配置文件(Struts.xml) 找到需要调用的Action类-> ActionProxy创建一个ActionInvocation的实例 -> 调用Action->执行完毕, 返回结果
122.result的type属性中有哪几种结果类型?
一共10种:
dispatcher
struts默认的结果类型,
把控制权转发给应用程序里的
某个资源不能把控制权
转发给一个外部资源,
若需要把控制权重定向到
一个外部资源, 应该使用
redirect结果类型
redirect
把响应重定向到另一个资源(包括一个外部资源)
redirectAction
把响应重定向到另一个 Action
freemarker、
velocity、
chain、
httpheader、
xslt、
plainText、
stream
123.拦截器的生命周期与工作过程?
1)每个拦截器都是实现了I nterceptor接口的 Java 类; 2)init(): 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源 进行必要的初始化; 3)intercept(ActionInvocation invocation): 每拦截一个动作请求, 该方法就会被调用一次; 4)destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次; 5)struts2中有内置了18个拦截器。
124.struts2如何完成文件的上传?
1、JSP页面: 1)JSP页面的上传文件的组件: <s: file name=”upload” />, 如果需要一次上传多个文件, 就必须使用多个 file 标签, 但它们的名字必须是相同的, 即: name=“xxx”的值必须一样; 2)必须把表单的enctype属性设置为: multipart/form-data; 3)表单的方法必须为post, 因为post提交的数据在消息体中, 而无大小限制。 2、对应的action: 1)在 Action 中新添加 3 个 和文件上传相关的属性; 2)如果是上传单个文件, uploadImage属性的类型就是 java.io.File, 它代表被上传的文件, 第二个和第三个属性的类型是 String, 它们分别代表上传文 件的文件名和文件类型, 定义方式是分别是: jsp页面file组件的名称+ContentType, jsp页面file组件的名称+FileName 3)如果上上传多个文件, 可以使用数组或 List
125.值栈ValueStack的原理与生命周期?
1)ValueStack贯穿整个 Action 的生命周期, 保存在request域中, 所以ValueStack和request的生命周期一样。 当Struts2接受一个请求时, 会迅速创建ActionContext, ValueStack,action。 然后把action存放进ValueStack, 所以action的实例变量可以被OGNL访问。 请求来的时候, action、ValueStack的生命开始, 请求结束,action、 ValueStack的生命结束; 2)action是多例的,和Servlet不一样, Servelt是单例的; 3)每个action的都有一个对应的值栈, 值栈存放的数据类型是该action的实例, 以及该action中的实例变量, Action对象默认保存在栈顶; 4)ValueStack本质上就是一个ArrayList; 5)关于ContextMap, Struts 会把下面这些映射压入 ContextMap 中: parameters : 该 Map 中包含当前请求的请求参数 request : 该 Map 中包含当前 request 对象中的 所有属性 session :该 Map 中包含当前 session 对象中的所有属性 application :该 Map 中包含当前 application 对象中的所有属性 attr:该 Map 按如下顺序来检索某个属性: request, session, application 6)使用OGNL访问值栈的内容时, 不需要#号, 而访问request、session、application、attr时, 需要加#号; 7)注意: Struts2中, OGNL表达式需要配合Struts标签才可以使用。 如:<s:property value="name"/> 8)在struts2配置文件中引用ognl表达式 , 引用值栈的值 ,此时使用的"$",而不是#或者%;