开发者学堂课程【Java 面试疑难点串讲 3:开发工具及框架:Struts 问题汇总】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:
https://developer.aliyun.com/learning/course/26/detail/566Struts 问题汇总
所有的开源框架里面必然包含有各个公司自己的一些程序代码,或者是与一些其它的开发框架整合的程序代码,对于这些代码,如果要是有时间,可以直接通过官网下载源代码目录,这个目录一般情况下都比较小 (10M 左右),如果没有源代码,那么最简单的做法就是直接利用 Maven 进行下载。
1、如果要想去研究源代码,或者说是去看某一个程序的具体实现,只是简单的依靠一个开发包根本谁也看不了,你除非下载的是源代码程序包,里面的很多的程序类的关系大部分都不需要你来处理,你所要处理的只是你需要开发的部分。
例如:你开发的拦截器、Action、转换器等等,在 Struts 里面对于这些操作提供有一系列的支持,例如:自动进行参数的赋值就属于拦截器的范畴。
在整个课程里面针对于开发框架,尤其是MVC 开发框架已经给出了反射的分析过程,也就是说你只需要掌握 DispatcherServlet 程序类,那么所有的 MVC 基本核心原理就明确了:线程处理、请求参数自动赋值(拦截器)、自动转换。所有的开发框架的本质就是反射处理操作。
2、Struts 拦截器,在拦截器里面可以设置属性,还需要在 struts.xml 之中进行配置,而且在进行 Struts 配置文件编写的时候往往还需要使用一个继承关系(继承一些公共的配置项);
3、Struts2.x 的上传使用的是 FileUpload 处理操作,而这个处理在 Java WEB 开发实战经典之中讲解过了,其核心的特点是可以接收原始的文件名称以及操作类型,对于接收操作来讲,官方文档已经给出了其接收的类型,这个是由官方定义好的,如果有一天你自己开发的框架可以盛行,那么这些规则由你自己来定义,如果你学习过反射机制,深入理解了 DispatcherServlet 设计,那么就可以理解为什么它有这样的要求了。
4、Struts2.x 之中最大的败笔在于:这些大量的 setter、getter 以及对象的实例化处理机制,而这个问题之所以会要求编写主要也是在 DispatcherServlct 程序类之中已经给了明确的说明,依然是基于反射的处理操作;
5、Struts2.x 里面的转换处理操作本身是有 bug 存在的,也就是说如果你现在默认情况下接收的数据类型是 int,但是你传递了 String,那么这个时候肯定无法正常接收,因为会产生
NumberFormatException
异常,
而这个原因在讲解 DispatcherServlet 的时候也已经分析过了,因为它的原理是根据所有的参数名称以及对应的属性名称 (setter、getter);
6、Struts 2.x 里面默认支持有 EL,但是在 S truts 2.x 最初的时代(WebWork) 是没有EL的,所以它提供了一种与 EL 类似的解决方案:OGNL( 很麻烦,一般不建议再使用了,需要追溯到 2005 年左右);
7、对于数组的接收处理操作其实本质上就是利用了
request.getParameterValues(),
这个处理操作在进行接收的时候可以将接收到的数据以数组的形式出现或者以 L ist 集合的形式出现,因为有参数名称,而且参数名称和属性名称又是一样的,那么就可以根据参数名称获取属性类型,如果发现属性类型是一个数组,则根据数组的形式来进行接收处理,依然采用了反射机制,DispatcherServlet 也已经有了明确的说明;
8、国际化的本质在于 ResourceBundle (Java 基础的时候讲解过的概念),它需要是一个资源名称,例如: Messages.properties、Message_zh_CN.properties,这里面 Message 就属于资源名称,而后面那些国际化标记是通过 Local 实现的指派(Java 基础也有重点讲解)。里面设置的占位符在 java 基础的时候也强调过了,是通过 MessageFormat 类完成处理的,它是按照“{0}”、“{1}”这样的顺序进行设置;
对于 Struts 而言你所需要掌握的部分就是在于 Java 基础、MVC 设计思想、反射应用的结合体上。在 DispatcherServlet 设计之中已经把所有的核心本质的思想都讲解清楚了。