实现组件功能(含页面)的JAR包化是一直是我的一个想法,在我原先做的一些系统中我们做到的API组别的组件化,但是当我们要将一个新的组件功能加入到系统中我们会发现很大问题,那就是对页面的COPY,特别是当程序员对页面的划分不太规范的时候我们实在是无法找到对应的页面文件,或者在COPY的时候很容易搞错。 针对上面的问题,我认为组件应该是包含两个部分的,一个是API部分的JAR包,一个是页面文件的JAR包,那么我要解决两个问题:
一、静态文件的读取
这里所说的静态文件指的是不需要编译的文件,如:图片文件,JS文件,其它不需要编译的文件。
将静态文件放在JAR包中并要显示出来,采用到的方法是通过过滤器通过读取JAR包里的文件并通过Response写入到文件中。
由于这个过滤器是对整个资源的过滤,要考虑到兼容性,所以要对页面文件进行转发。
类名:com.youyoulong.framework.util.filter.ResourceContextFilter
二、页面文件的读取
通过freemarker的springmvc插件配置读取页面文件。所以整个页面的编译器我抛弃了JSP,采用freemarker的编译器。配置代码如下:
<!-- freemarker的配置 -->
<bean id="freemarkerConfigurer" class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPaths">
<list>
<value>classpath:/web/view</value>
</list>
</property>
<!--将文件的内容全部放入JAR包中-->
<property name="defaultEncoding" value="UTF8" />
<property name="preferFileSystemAccess" value="false" /><!--解决html在多个包中的问题-->
<property name="freemarkerSettings">
<props>
<prop key="object_wrapper">freemarker.ext.beans.BeansWrapper</prop>
<prop key="template_update_delay">10</prop>
<prop key="locale">zh_CN</prop>
<prop key="datetime_format">yyyy-MM-dd HH:mm:ss</prop>
<prop key="date_format">yyyy-MM-dd</prop>
<prop key="number_format">#.##</prop>
<prop key="boolean_format">True,False</prop>
<prop key="auto_import">/base/include/spring.html as spring</prop>
</props>
</property>
<property name="freemarkerVariables"><!--设置一些常用的全局变量-->
<map>
<entry key="aa" value="/static/view"></entry>
</map>
</property>
</bean>
系统访问路径入口:http://localhost:20040/framework-webapp/static/view/auth/login/login.html admin/123456
所有要访问jar包中的静态文件都以staic/view为起始路径,后auth/login/login.html 为JAR包中的文件路径。所有的页面和静态文件都要在jar包中的web/view目录下。(可参考代码中的目录)
结合com.youyoulong.framework.controller.ViewController类的goView方法,可以在路径中直接访问.html文件的方式,跳转到正确的页面文件,仅仅只是制造一个直接访问静态文件的假象。
总结:从上所述,任何事情都是从提出问题,到解决问题的过程,正是因为我需要达到的目标决定了我应该采用什么样的框架,什么样的模式去解决问题,这就是站在巨人的肩膀上。
QQ:93334958 微信:18028750128