📅  最后修改于: 2023-12-03 15:05:23.532000             🧑  作者: Mango
在现代web应用程序中,前端页面通常都是由许多小的模块组成,每个模块都有自己的展示逻辑、样式以及脚本。如果使用传统的JSP或Servlet来编写页面,会很难维护和扩展。
为了解决这个问题,Tiles产生了,它是一个开源的框架,可以将一个大的页面划分成多个小的块,通过组合这些小的块,产生最终的页面。Tiles需要一个容器来运行,Struts 2正好可以成为这个容器。
使用Struts 2和Tiles集成的步骤如下:
引入Tiles和Struts 2的依赖
在Maven项目中,可以在pom.xml中添加下面的依赖:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>${struts.version}</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-tiles-plugin</artifactId>
<version>${struts.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>${tiles.version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>${tiles.version}</version>
</dependency>
这里的${struts.version}
和${tiles.version}
可以替换成对应的版本号,这里使用的是Struts 2和Tiles的最新版本。
配置Tiles
在web.xml
中添加Tiles的配置:
<listener>
<listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
</listener>
<context-param>
<param-name>tiles.definitionFactory</param-name>
<param-value>org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAOFactory</param-value>
</context-param>
<context-param>
<param-name>tiles.definitions</param-name>
<param-value>/WEB-INF/tiles.xml</param-value>
</context-param>
<servlet>
<servlet-name>tiles</servlet-name>
<servlet-class>org.apache.tiles.servlet.TilesServlet</servlet-class>
<init-param>
<param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
<param-value>/WEB-INF/tiles.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
这里的/WEB-INF/tiles.xml
是Tiles的配置文件,后面我们会详细介绍。
配置Struts 2
在struts.xml
中添加Tiles的插件:
<package name="default" extends="struts-default" namespace="/">
<result-types>
<result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult"/>
</result-types>
<interceptors>
<interceptor name="tileInterceptor" class="org.apache.struts2.tiles.StrutsTilesInterceptor"/>
<interceptor-stack name="tileStack">
<interceptor-ref name="tileInterceptor"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="tileStack"/>
<action name="hello" class="com.example.HelloAction">
<result name="success" type="tiles">hello</result>
</action>
</package>
这里的hello
是一个Action的名称,com.example.HelloAction
是对应的Action类的名称。
配置Tiles的定义
在/WEB-INF/tiles.xml
文件中,定义Layout和Definitions:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name="default" template="/WEB-INF/views/layout.jsp">
<put-attribute name="title" value="Default Title"/>
<put-attribute name="header" value="/WEB-INF/views/header.jsp"/>
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/views/footer.jsp"/>
</definition>
<definition name="hello" extends="default">
<put-attribute name="title" value="Hello Page"/>
<put-attribute name="body" value="/WEB-INF/views/hello.jsp"/>
</definition>
</tiles-definitions>
现在,我们来看一下实现效果。在本地创建一个Maven项目,使用mvn archetype:generate -DgroupId=com.example -DartifactId=tiles-demo -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false
命令生成一个web应用程序骨架。
修改pom.xml
、web.xml
、struts.xml
和/WEB-INF/tiles.xml
文件,然后再分别新建/WEB-INF/views/layout.jsp
、/WEB-INF/views/header.jsp
、/WEB-INF/views/body.jsp
、/WEB-INF/views/hello.jsp
和/WEB-INF/views/footer.jsp
文件。
现在启动应用程序,并访问http://localhost:8080/tiles-demo/hello.action
,我们能看到一个长这样的页面:
Default Title
This is header.
Hello, World!
This is footer.
这里的输出是由/WEB-INF/views/hello.jsp
、/WEB-INF/views/header.jsp
和/WEB-INF/views/footer.jsp
共同组成的。而且由于我们定义了extends="default"
,所以页面也包括了/WEB-INF/views/layout.jsp
。
在本文中,我们介绍了如何使用Struts 2和Tiles集成来构建更加易于维护和扩展的web应用程序。通过这种方法,我们可以将一个大的页面划分成多个小的块,每个块都有自己的展示逻辑,样式以及脚本,然后通过组合这些小的块,产生最终的页面。这种方法不仅可以提高web应用程序的维护性和扩展性,而且还可以提高web应用程序的性能和用户体验。