[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\">\n").append(selectDes).append(":</th>\n");
        html.append("<td width=\"220\">\n");
        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>\n");
            }else{
                html.append(" <option value=\"").append(site.getId()).append("\">").append(site.getYear()).append("</option>\n");
            }
        }
        html.append("</select>\n");
        html.append("</td>\n");
        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。。。。。还是算了吧(突然懒癌犯了不想打字了。。。。。。)!

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

欢迎你来和我交流学习。

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

时间: 2024-10-07 00:25:52

[JSP]tld在项目中的应用的相关文章

[JSP]tag在项目中的应用

JSP中的代码越来越多,冗余的内容自然也就多了,往往一个很小的改动你需要去改动N个页面,工作量大不说,还容易出错.今天带你彻底解决这个问题! tips: 图片点击放大   本文介绍的是jsp:tag中的一般使用方式,另外一种叫做:jsp:tld,两者同时使用并不冲突.我们习惯T们称作页面控件,通常一个项目中这两者都会使用到. jsp:tag主要做页面进行逻辑处理后显示,最后的效果就是你可以给T一些参数,T会处理后把产生的结果显示在页面中.举个栗子:<c:if>,<c:for>,&l

java、JSP web项目中的路径问题

java web项目中的路径,有相对路径和绝对路径 什么是相对路径呢    举个简单例子 我们有项目   test     发布后地址  http://localhost:8080/test/ 页面  qiantai/login.jsp        页面中链接  <a href="index.jsp" /> JSP页面相相对寻址     链接的最终地址是    http://localhost:8080/Test/qiantai/index.jsp 相对路径是这么一个过程

GOOGLE kaptcha 验证码生成插件 servlet/jsp项目中使用步骤

步骤一: 在项目中添加kaptchar的jar包,下载地址:http://code.google.com/p/kaptcha/(建议使用迅雷下载) 步骤二: 配置web.xml,详细配置如下(这里不是所有的配置,这里的参数还有很多可以酌情精简): <!-- 配置验证码插件servlet类 --> <servlet> <servlet-name>kaptcha</servlet-name> <servlet-class> com.google.co

项目中遇到的问题——jsp:include

今天工作过程中遇到了一个问题:有两个工程,就叫做 " I " 和 " M " 吧.项目 I 写了JSP的结构,样式,数据取得:项目 M 包含页面的跳转 页面的header部分由M加载出来, 表信息通过<jsp:include>引出项目 I 的内容. 可是!!我 I 部分的画面!就是加载不出来!!!QAQ 咋回事啊 我也很绝望啊!!! 由于<jsp:include>中url是由各个取得的参数拼成的,我怀疑是项目 I 那里参数接收的有问题,或者项

Spring Boot 项目中使用JSP

1    第2-2课:Spring Boot 项目中使用JSP JSP(Java Server Pages,Java 服务器页面)是一个简化的 Servlet 设计,它是由 Sun Microsystems 公司倡导.许多公司参与一起建立的一种动态网页技术标准.JSP 技术类似 ASP 技术,它是在传统的网页 HTML(标准通用标记语言的子集)文件(.html)中插入 Java 程序段(Scriptlet)和 JSP 标记(tag),从而形成 JSP 文件,后缀名为(*.jsp).用 JSP 开

eclipse 项目中嵌入jetty

Jetty是一个提供HHTP服务器.HTTP客户端和javax.servlet容器的开源项目,Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler. 最近工作中需要在项目中集成jetty,由于之前从来没有用过jeety,所以耗费了我多半天的时间去学习,基本

在Java Web项目中引入Mondrian多维分析框架

一,Mondrian简介 Mondrian是一个开源项目,一个用Java写成的OLAP引擎.它用MDX语言实现查询,从关系数据库(RDBMS)中读取数据.然后经过Java API以多维的方式对结果进行展示. Mondrian的使用方式同JDBC驱动类似.可以非常方便的与现有的Web项目集成. Mondrian OLAP 系统由四个层组成,可分为从最终用户到数据中心, 顺序为: 1表现层(the presentation layer) 2维度层(the dimensional layer) 3集合

web项目中的web.xml元素解析

1 定义头和根元素 部署描述符文件就像所有XML文件一样,必须以一个XML头开始.这个头声明可以使用的XML版本并给出文件的字符编码.DOCYTPE声明必须立即出现在此头之后.这个声明告诉服务器适用的servlet规范的版本(如2.2或2.3)并指定管理此文件其余部分内容的语法的DTD(Document Type Definition,文档类型定义).所有部署描述符文件的顶层(根)元素为web-app.请注意,XML元素不像HTML,他们是大小写敏感的.因此,web-App和WEB-APP都是不

160504项目中的error

在学习时,曾经遇到将同组的项目导入时出现红叉的情况.但是没有发现具体错误.开始以为是build path 的问题,于是在Libraries中将相关Jar包重新检查并添加了一遍,但并没有解决问题.后来仔细检查后才发现,是一个很简单的问题,之前都想复杂了.JDK版本不一样,把JDK7换掉重新装JDK8,再把相关配置好,红叉就解决大半. 作为菜鸟程序员,有时候一个很小的问题就能造成很大影响.而经验不足时,更不知道从何入手.为了能顺利编写项目,更为了能在编写项目时能解决出现的问题和错误而不是不知所措,就