📜  Struts 2和Tiles集成(1)

📅  最后修改于: 2023-12-03 15:05:23.532000             🧑  作者: Mango

Struts 2和Tiles集成

在现代web应用程序中,前端页面通常都是由许多小的模块组成,每个模块都有自己的展示逻辑、样式以及脚本。如果使用传统的JSP或Servlet来编写页面,会很难维护和扩展。

为了解决这个问题,Tiles产生了,它是一个开源的框架,可以将一个大的页面划分成多个小的块,通过组合这些小的块,产生最终的页面。Tiles需要一个容器来运行,Struts 2正好可以成为这个容器。

Struts 2和Tiles集成的步骤

使用Struts 2和Tiles集成的步骤如下:

  1. 引入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的最新版本。

  2. 配置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的配置文件,后面我们会详细介绍。

  3. 配置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类的名称。

  4. 配置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.xmlweb.xmlstruts.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应用程序的性能和用户体验。