Struts2是一个强大的Java web应用程序框架,它提供了一种组织应用程序的方式,并且支持多种视图技术,其中之一就是FreeMarker模板。FreeMarker是一个基于模板的、声明式的语言,用于生成动态内容,尤其适合Web应用中的HTML、XML等输出。在Struts2中集成FreeMarker,可以方便地将业务逻辑和视图层分离,提高代码的可维护性和可扩展性。
要开始在Struts2中使用FreeMarker模板,首先需要将`freemarker-2.3.8.jar`库文件导入到你的项目的`WEB-INF/lib`目录下。这个库包含了FreeMarker模板引擎的所有必要组件。然后创建一个新的web工程,例如`freeMarkerTest`,并确保Struts2已经正确配置。
接下来,在`web.xml`中,你需要配置一个名为`JSPSupportServlet`的servlet,这个servlet是Struts2用来支持JSP标签的。这样做是为了确保Struts2在服务器启动时能优先加载这个servlet,以便支持FreeMarker模板中使用Struts2的标签。
在`struts.xml`配置文件中,定义一个action,比如`test`,并指定其结果类型为`freemarker`,这样当用户触发这个action时,Struts2会将控制权交给FreeMarker模板来渲染视图。例如:
```xml
<action name="test" class="com.action.TestAction">
<result type="freemarker">/WEB-INF/pages/index.ftl</result>
</action>
```
在`index.ftl`模板文件中,你可以使用FreeMarker语法结合Struts2的标签库来生成HTML。为了使用Struts2的标签,如`s:textfield`,需要在模板的开头引入Struts2的TLD(Tag Library Descriptor)文件。这通常涉及复制`struts2-core-2.0xx.jar`中的`META-INF/struts-tags.tld`到`/WEB-INF/struts-tags.tld`,并用以下代码引用:
```freemarker
<#assign s=JspTaglibs["/WEB-INF/struts-tags.tld"] />
```
然后,你可以在模板中使用这些标签,如:
```freemarker
<html>
<head>
...
<@s.form action="test.action">
<@s.textfield name="username"/>
<@s.textfield name="password"/>
<@s.submit value="提交"/>
</@s.form>
...
</html>
```
值得注意的是,由于Web容器默认不处理FreeMarker模板,直接通过浏览器访问`.ftl`文件会导致显示源代码,而不是生成的HTML页面。为了避免这种情况,Struts2框架会接管请求处理,它会自动加载FreeMarker模板并填充数据模型,最后输出HTML页面。因此,将所有FreeMarker模板放在`WEB-INF/pages`目录下,可以确保用户无法直接访问,而只有通过Struts2的action才能访问并呈现相应的视图。
例如,当用户访问`test.action`时,Struts2会找到对应的`index.ftl`模板,结合Action中的数据生成HTML页面并返回给客户端。这种做法保证了安全性和良好的架构设计,使得开发者可以专注于业务逻辑,而不用关心视图的实现细节。