Struts 2 Customize Theme & Freemarker Template 客制佈景與模板 說明了Struts2 的 tags 是可以自行客制成自已想要的佈景,現在來說明如何使用 FreeMarker 來制作 Struts2 屬於自已建作的 tag libs.

工具:

eclipse : Version: Mars Release (4.5.0) Build id: 20150621-1200

pom.xml:

struts2-core: 2.5.8

struts-annotations: 1.0.5 (不可以用 1.0.6 會出現 tlibVersion Missing 的錯誤)

commons-logging: 1.2

jsp-api : 2.2

javax.servlet-api : 4.0.1

 

Step 01:  建立一個空的 maven project

tag_01

tag_02

 

Step 02: 建立客制的 class: HtmlTag.java 在 package com.easyui.struts2.views.jsp.ui 下

package com.easyui.struts2.views.jsp.ui;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ui.AbstractClosingTag;

import com.easyui.struts2.components.Html;
import com.opensymphony.xwork2.util.ValueStack;

public class HtmlTag extends AbstractClosingTag {

    @Override
    public Component getBean(ValueStack stack, HttpServletRequest req, HttpServletResponse res) {
        
        return new Html(stack, req, res);
    }

}

 

Step 03 : 建立客制的 class: Html.java 在 package com.easyui.struts2.components , 此檔主要是要產生 .tld 的標籤描述檔, 以及告訴 freemarker 要讀取那一個 ftl , 此範例是要有 html.ftl 與 html-close.ftl 這兩個檔案.

package com.easyui.struts2.components;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.components.ClosingUIBean;
import org.apache.struts2.views.annotations.StrutsTag;

import com.opensymphony.xwork2.util.ValueStack;

@StrutsTag(
        name="html",
        tldTagClass="com.easyui.struts2.views.jsp.ui.HtmlTag",
        description="建立一個空的 HTML 結構",
        allowDynamicAttributes=true)
public class Html extends ClosingUIBean {

    public Html(ValueStack stack, HttpServletRequest request, HttpServletResponse response) {
        super(stack, request, response);
        
    }

    @Override
    public String getDefaultOpenTemplate() {        
        return "html";
    }

    @Override
    protected String getDefaultTemplate() {        
        return "html-close";
    }

}

註:

1. 在 pom.xml 中需加入 struts-annotations: 1.0.5 才可以使用 annotations 描述

2. @StrutsTag: annotation for marking a Struts tag
3. @StrutsTagAttribute: annotation for marking an attribute of a Struts tag

 

Step 04: 建立此 tags (標籤) 的 templates & theme

1. 建立 package: template.easyui 並撰寫 html.ftl 與 html-close.ftl

2. 建立 空的 package: template.easyui.html 用來存放 Tobago plugin 自動產生的相關樣版檔案

html.ftl 檔

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>${parameters.title}</title>  
</head>
<body>

 

html-close.ftl 檔


</body>
</html>

 

Step 05: 用 Tobago plugin  建立 TLD file 及使用 Maven 產生這個 taglib 的 jar 檔

請看附註二

 

Step 06: 佈署 (Deploy taglib in your Web application) , 將這個 taglib 的 jar 檔放在 WEB-INF/lib 下

記得要在 struts.xml 裡加入 <constant name="struts.ui.theme" value="easyui"/> , 這樣才會去讀取 JAR 檔 template.easyui 裡的 ftl 檔案

 

Step 07: JSP 裡使用客製的 tag libs

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<%@ taglib prefix="i" uri="/esayui-tags" %>

<i:html title="Basic Layout - jQuery EasyUI Demo">

hi easyui-tags

    <s:form action="Login">
        <s:textfield key="username"/>
        <s:password key="password" />
        <s:submit/>
    </s:form>


</i:html>

 

附註:

一、 Struts2 taglibs Introduction

Few words about the elements of the Struts2 UI component framework should help to understand better the scenario.

JSP Tag: implementation of the JSP tag (e.g TextFieldTag). Notice Struts2 has also Velocity and FreeMarker tags

UI Component: actual implementation of the behavior of the component (e.g TextField)

Template: FreeMarker template which renders the html markup (e.g. <input type=”text”….)

Theme: collection of templates (e.g. simple or ajax)

 

二、整個專案結構如下

tag_03  

註:

1. 在 pom.xml 中需加入 tobago 描述, 才會自動產生目錄: src/main/resources/META-INF 的 easyui-tags.tld 描述檔及 package: template.easyui.html 裡的 html.html

2. 目前 的編譯器 complier 需用 JDK 1.7.x 版才會成功,   JDK1.8.x 會無法產生 easyui-tags.tld 描述檔 及相關的樣版檔

tag_04  

3. Tobago plugin 在 pom.xml 的設定如下:

<plugin>
    <groupId>org.apache.myfaces.tobago</groupId>
    <artifactId>maven-apt-plugin</artifactId>                            
    <configuration>
        <A>
                   uri=/esayui-tags,tlibVersion=${project.version},jspVersion=2.0,shortName=easyui,displayName="EasyUI Tags",
                   outFile=${basedir}/src/main/resources/META-INF/${project.artifactId}.tld,
                   description="EasyUI Tags",
                   outTemplatesDir=${basedir}/src/main/java/template/easyui/html                
        </A>
        <resourceTargetPath>target</resourceTargetPath>
        <fork>false</fork>
        <force>true</force>
        <nocompile>true</nocompile>
        <showWarnings>true</showWarnings>
        <factory>
            org.apache.struts.annotations.taglib.apt.TLDAnnotationProcessorFactory
        </factory>
        <target>1.5</target>
        <includes>
            <include>**/*.java</include>
        </includes>
    </configuration>
    <executions>
        <execution>
            <phase>compile</phase>
            <goals>
                <goal>execute</goal>
            </goals>
        </execution>
    </executions>
</plugin>

 


 三、 完整的 pom.xml 檔

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.gu.apps</groupId>
  <artifactId>easyui-tags</artifactId>
  <version>1.0-SNAPSHOT</version>
  <name>easyui-tags</name>
  <dependencies>
      <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts2-core</artifactId>
          <version>2.3.24.1</version>
      </dependency>
      <dependency>
          <groupId>org.apache.struts</groupId>
          <artifactId>struts-annotations</artifactId>
          <version>1.0.5</version>
      </dependency>
      <dependency>
          <groupId>commons-logging</groupId>
          <artifactId>commons-logging</artifactId>
          <version>1.2</version>
      </dependency>
      <dependency>
          <groupId>javax.servlet.jsp</groupId>
          <artifactId>jsp-api</artifactId>
          <version>2.1</version>
      </dependency>
      <dependency>
          <groupId>javax.servlet</groupId>
          <artifactId>javax.servlet-api</artifactId>
          <version>3.1.0</version>
      </dependency>
  </dependencies>
  <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>
 
  <build>
      <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <encoding>UTF-8</encoding>
                <source>1.5</source>
                <target>1.5</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.myfaces.tobago</groupId>
            <artifactId>maven-apt-plugin</artifactId>                            
            <configuration>
                <A>
                       uri=/esayui-tags,tlibVersion=${project.version},jspVersion=2.0,shortName=easyui,displayName="EasyUI Tags",
                       outFile=${basedir}/src/main/resources/META-INF/${project.artifactId}.tld,
                       description="EasyUI Tags",
                       outTemplatesDir=${basedir}/src/main/java/template/easyui/html                
                </A>
                <resourceTargetPath>target</resourceTargetPath>
                <fork>false</fork>
                <force>true</force>
                <nocompile>true</nocompile>
                <showWarnings>true</showWarnings>
                <factory>
                    org.apache.struts.annotations.taglib.apt.TLDAnnotationProcessorFactory
                </factory>
                <target>1.5</target>
                <includes>
                    <include>**/*.java</include>
                </includes>
            </configuration>
            <executions>
                <execution>
                    <phase>compile</phase>
                    <goals>
                        <goal>execute</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>        
      </plugins>
    <resources>
           <resource>
               <directory>src/main/java</directory>
            <excludes>
                <exclude>**/*.java</exclude>
            </excludes>               
           </resource>
           <resource>
               <directory>src/main/resources</directory>
           </resource>          
       </resources>    
      <finalName>easyui-tags</finalName>
      <defaultGoal>install</defaultGoal>
  </build>
</project>

 

 

參考:

https://bodez.wordpress.com/2009/03/13/customising-struts2-jsp-tags/

arrow
arrow

    MIS 發表在 痞客邦 留言(0) 人氣()