[JSP]tld在项目中的应用

JSP中的代码越来越多,冗余的内容自然也就多了,往往一个很小的改动你需要去改动N个页面,工作量大不说,还容易出错。今天带你彻底解决这个问题!

tips:

  1. 这里需要使用:SpringContextHolder.java[Spring]无论你在哪我一直在
  2. 图片点击放大

 

本文介绍的是jsp:tag中的一般使用方式,另外一种叫做:jsp:tld,两者同时使用并不冲突。我们习惯T们称作页面控件,通常一个项目中这两者都会使用到。

  1. jsp:tag主要做页面进行逻辑处理后显示,最后的效果就是你可以给T一些参数,T会处理后把产生的结果显示在页面中。举个栗子:<c:if>,<c:for>,<c:set> 都是这样实现的,不信你ctrl点进去看看呗。
  2. jsp:tld会映射到一个具体的类的方法,最后的效果就是你可以在页面上写个标签就可以把数据库的数据显示到页面中。举个栗子:<sec:authorize>,<shiro:hasRole>,不信你再试试。。。。哈哈哈哈
  3. 显示只是其中一种用法,你可以根据你的业务场景和脑洞去想T可以有多少种用法,因为这个标签属于你。
  4. tag在本篇中并没有去介绍T的使用方式,以后可以补上:[JSP]tag在项目中的应用

 

 

1.创建Tld文件

我的习惯是先在WEB-INF下创建一个tld文件夹,比如:WEB-INF/tlds

 再创建我的Tld,我的命名习惯是fnXXX。比如:fnl.tld   最后的l是:Layout的缩写

<?xml version="1.0" encoding="ISO-8859-1"?>

<taglib xmlns="http://java.sun.com/xml/ns/javaee"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
        version="2.1">

    <tlib-version>1.0</tlib-version>
    <short-name>LayoutUtils</short-name>
    <uri>http://mycompany.com</uri>

    <!-- Invoke 'Generate' action to add tags or functions -->
    <function>
        <description>获取节点列表</description>
        <name>getShutdownSiteList</name>
        <function-class>com.wttech.tciss.jsxy.utils.LayoutUtils</function-class>
        <function-signature>java.util.List getShutdownSiteList()</function-signature>
        <example>${fnc:getShutdownSiteList()}</example>
    </function>
    <function>
        <description>获取节点选择控件HTML</description>
        <name>getShutdownSiteHTML</name>
        <function-class>com.wttech.tciss.jsxy.utils.LayoutUtils</function-class>
        <function-signature>java.lang.String getShutdownSiteHTML()</function-signature>
        <example>${fnc:getShutdownSiteHTML()}</example>
    </function>
</taglib>

JAVA文件:

import com.wttech.tciss.jsxy.core.service.ConfigService;
import com.wttech.tciss.jsxy.core.service.statistics.ShutdownSiteService;
import com.wttech.tciss.jsxy.core.utils.SpringContextHolder;
import com.wttech.tciss.jsxy.core.vo.statistics.ShutdownSite;
import org.apache.commons.lang3.StringUtils;

import java.util.List;

/**
 *
 * @ClassName:LayoutUtils
 * @Description:前端显示控件工具类
 * @author:ta0477
 * @date:16/7/20
 *
*/
public class LayoutUtils {

    private static ShutdownSiteService shutdownSiteServiceImpl= SpringContextHolder.getBean(ShutdownSiteService.class);
    private static ConfigService configServiceImpl= SpringContextHolder.getBean(ConfigService.class);

    //一些默认值
    private static  final String GETSHUTDOWNSITEHTML_SELECTID ="shutdownSiteId";
    private static  final String GETSHUTDOWNSITEHTML_SELECTNAME ="shutdownSiteName";
    private static  final String GETSHUTDOWNSITEHTML_SELECTDES ="年度信息";
    /**
     *
     * @Title:getShutdownSiteList
     * @Description: 查询所有节点信息
     * @param:[]
     * @return:java.util.List<com.wttech.tciss.jsxy.core.vo.statistics.ShutdownSite>
     * @throw:
     *
     */
    public static List<ShutdownSite> getShutdownSiteList(){
        return shutdownSiteServiceImpl.findShutdownSiteList();
    }
    /**
     *
     * @Title:getShutdownSiteSelect
     * @Description: 查询所有节点信息并以HTML形式返回
     * @param:[selectId, selectName, SelectDes]
     * @return:java.lang.String
     * @throw:
     *
     */
    public static String getShutdownSiteSelect(String selectId,String selectName,String selectDes){
        /**
         * <th class="r" width="116">年度信息:</th>
         <td width="220">
         <select id="shutdownSiteId" name="selectName" class="form-control w210px">
         <c:forEach var="site" items="${shutdownSites}">
         <c:choose>
         <c:when test="${v.id==nowSite.id}">
         <option value="${site.id}" selected>${site.year}</option>
         </c:when>
         <c:otherwise>
         <option value="${site.id}">${site.year}</option>
         </c:otherwise>
         </c:choose>
         </c:forEach>
         </select>
         </td>
         * */
        //如果为空使用默认值
        if (StringUtils.isNotBlank(selectId)) {
            selectId= GETSHUTDOWNSITEHTML_SELECTID;
        }
        if (StringUtils.isNotBlank(selectName)) {
            selectName= GETSHUTDOWNSITEHTML_SELECTNAME;
        }
        if (StringUtils.isNotBlank(selectDes)) {
            selectDes= GETSHUTDOWNSITEHTML_SELECTDES;
        }
        //获取数据
        List<ShutdownSite> shutdownSites=shutdownSiteServiceImpl.findShutdownSiteList();
        //当前节点ID
        String nowSiteId=configServiceImpl.getNowShutdownSiteId();
        //html  我觉得这种方式有些蠢!!! 不如直接在tag里使用tld获取数据.
        StringBuilder html=new StringBuilder();
        html.append("<th class="r" width="116">
").append(selectDes).append(":</th>
");
        html.append("<td width="220">
");
        html.append("<select id=" ").append(selectId).append("" name="").append(selectName).append("" class="form-control w210px">");
        //for
        for (ShutdownSite site: shutdownSites) {
            //默认选中
            if (nowSiteId.equals(site.getId())) {
                html.append(" <option value="").append(site.getId()).append("" selected>").append(site.getYear()).append("</option>
");
            }else{
                html.append(" <option value="").append(site.getId()).append("">").append(site.getYear()).append("</option>
");
            }
        }
        html.append("</select>
");
        html.append("</td>
");
        return html.toString();
    }

    //next

}

2.使用Tld文件

我这里的需求是这样:很多页面都需要加年度选项来查询数据,这些数据都来自于我的后台数据库中,前台展示的方式都是使用select来展示。

我先在common.jsp中加入我的jsp:tld

<!--显示控件tld-->
<%@ taglib prefix="fnl" uri="/WEB-INF/tlds/fnl.tld" %>

在页面中使用我的jsp:tld

注意: ${fnl:getShutdownSiteList()},fnl:getShutdownSiteSelect

<table class="w100">
    <tr>
        <%--<layout:shudownsitelist selectId="shutdownSIteID" selectName="shutdownSIteID"/>--%>
            <th class="r" width="116">年度信息:</th>
            <td width="220">
                <select id="shutdownSIteID" name="shutdownSiteName" class="form-control w210px">
                    <c:forEach var="site" items="${fnl:getShutdownSiteList()}">
                        <c:choose>
                            <c:when test="${v.id==nowSite.id}">
                                <option value="${site.id}" selected>${site.year}</option>
                            </c:when>
                            <c:otherwise>
                                <option value="${site.id}">${site.year}</option>
                            </c:otherwise>
                        </c:choose>
                    </c:forEach>
                </select>
            </td>
            ${fnl:getShutdownSiteSelect("shutdownSIteID","shutdownSiteName","")}
        <th class="r" width="116">企业名称:</th>
        <td width="220"><input class="form-control w210px" name="enterpriseName" id="enterpriseName" value=""/>
        </td>
        <td>
            <button class="btn btn-info" onclick="recordList()"><span class=" iconfa-search"></span>&nbsp;查询
            </button>
        </td>
    </tr>
</table>

最后的效果:一个加载好数据的下拉选项框。

  1. 如果其他地方需要这个内容我只需要将上面代码再复制一行到其他页面中即可。
  2. 如果哪天因为需求的变化,页面的显示效果需要修改,我找到我的tld修改完毕后所有使用这个控件的地方都被修改了。

  

 

 

最后:给看的个留个作业:完成getShutdownSiteSelect。。。。。还是算了吧(突然懒癌犯了不想打字了。。。。。。)!

希望这篇文章对你有所帮助,帮我点个赞吧。!!!!

欢迎你来和我交流学习。

原创禁止转载!!!!!! 

原文地址:https://www.cnblogs.com/flyingMonkey/p/5689596.html