javaweb之自定义tag开发

小熊vip 小熊vip     2022-12-11     626

关键词:

在javaweb开发中我们可能经常会用到basePath这个参数,没错,当我们新建一个jsp页面的时候,myeclipse会自动帮我们生成下面这段代码:

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

起初也许你看他不爽,后来发现这个东西确实很有用哦,但是我们仔细数了数这代码行数有点多,而且还是jsp页面嵌套Java代码实现的,看起来有些不伦不类(话又说回来,这个用肯定是没有问题的)。

现在我们想把这段代码抽离出来,用更简洁的方式实现同样的功能,即提供basePath参数。我们知道jsp页面中的jstl标签库功能强大,我们只需要在jsp页面引入这么一条代码就可以使用功能如此强大的标签。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

同样的,我们打算也用这种方式实现,不过jstl标签库中并没有提供basePath参数,不然也不用我们在这大费周章自定义Tag了。好了废话不多说。我们来实际操作吧:
新建一个WebProject,名字自己定,这里我用Tag
然后我们新建一个文件夹用来存放自定义标签文件(.tld文件),名字自己定,这里我就用WEB-TAG了
新建一个tld文件,名字自己定,这里我就用tools.tld了
taglib标签的内容如下:

<taglib>
    <tlib-version>1.0</tlib-version>
    <jsp-version>1.2</jsp-version>
    <short-name>base</short-name>
    <tag>
        <name>basePath</name>
        <tag-class>com.xy.tag.BasePathTag</tag-class>
        <body-content>jsp</body-content>
    </tag>
</taglib>

新建一个类BasePathTag 继承自TagSupport

package com.xy.tag;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

public class BasePathTag extends TagSupport
    private static final long serialVersionUID = 1L;
    @Override
    public int doEndTag() throws JspException 
        return 0;
    
    @Override
    public int doStartTag() throws JspException 
        HttpServletRequest request = (HttpServletRequest)this.pageContext.getRequest();
        String path = request.getContextPath();
        String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
        JspWriter jspw = this.pageContext.getOut();

        try 
            jspw.print(basePath);
         catch (IOException e) 
            e.printStackTrace();
        
        return 0;
    

是不是在这里看到了这两行熟悉的语句:

String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";

没错,我们在这里获取到了basePath参数,并借助JspWriter写到jsp页面,以什么方式写呢?当然是标签的形式,看看我们的tools.tdl文件,不能猜出是其中的basePath这个标签吧,毕竟我在里面就写了一个tag。。。。。。
ok,准备工作基本上做好了,下面我们开始在jsp页面中测试效果,打开项目的index.jsp页面,在最上面加入下面这行语句(就和引入jstl标签库一样)

<%@ taglib prefix="Cfg" uri="/WEB-TAG/tools.tld" %>

简单说一下里面的两个参数,prefix指的是前缀,也就是我们使用标签的时候的前缀,uri指的是我们的标签库文件路径。具体说我们如何使用就是下面这段代码了:

<Cfg:basePath/>

你没有看错,就是这么简单!现在我们可以删除jsp文件中的那五行代码了。运行后即可正确显示:

djangotemplate层之自定义tag

DjangoTemplate层之自定义tagby:授客QQ:1033553122 测试环境Win7Django1.11 实践步骤1应用根目录下,新建templatetags包目录(注意:该目录名称是约定的),并在该目录下新建自定义py文件(例中为project_dir/website/website_template_tags.py)代码... 查看详情

django模板渲染之自定义inclusion_tag详细使用

inclusion_tag在使用的时候可以帮我们减少很多前端和后端重复的代码逻辑图:   inclusion_tag的作用是主页面以一定的语法给一个参数,调用某个函数,这个函数可以通过主页面给的参数做一些逻辑处理得到一些数据,将... 查看详情

javaweb学习笔记之自定义数据库连接池(代码片段)

一、应用程序直接获取数据库连接的缺点  用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连... 查看详情

ios开发之自定义view

iOSsdk中的view是UIView,我们可以很方便的自定义一个View。创建一个Window-basedApplication程序,在其中添加一个Hypnosister的类,这个类选择继承UIObject。修改这个类,使他继承:UIView@interfaceHypnosisView: UIView自定义View的关键是定义draw... 查看详情

qgis开发之自定义符号

昨天在程序里添加了编辑矢量图层符号的功能,右键LayerTree的矢量图层,选择“EditSymbol”,便可以选择或编辑图层的渲染符号。实现方法很简单,首先参照http://blog.csdn.net/deirjie/article/details/50428179,实现自定义的右键菜单类,具... 查看详情

mybatis应用开发日志之自定义日志实现

1.1. 自定义日志实现实现MyBatis提供的org.apache.ibatis.logging.Log接口即可。publicinterfaceLog{booleanisDebugEnabled();booleanisTraceEnabled();voiderror(Strings,Throwablee);voiderror(Strings);voiddebug(Strings);vo 查看详情

面向对象开发之自定义事件(代码片段)

classEventconstructor()this.handlers=;//记录所有的事件及处理函数////click:[fn1,fn2],//mouseover:[fn3,fn4],//;/***on添加事件监听*@paramtype要添加的事件类型*@paramhandler要添加的的事件处理函数*@paramonce是否只执行一次*/on(type,handler,once 查看详情

细说shiro之自定义filter

写在前面我们知道,shiro框架在JavaWeb应用中使用时,本质上是通过filter方式集成的。也就是说,它是遵循过滤器链规则的:filter的执行顺序与在web.xml中定义的顺序一致,如下所示:<filter><filter-name>securityFilter</filter-nam... 查看详情

ionic3+angular4开发混合app之自定义组件

这里主要是记录ionic3+angular4开发混合app时自定义组件,我想自定义组件的方法和angular4应该类似,具体在纯angular4中自定义组件,暂时没有实践,个人觉得差别不大,之后实践了会再次更新。首先,在ionic3中有命令可以直接创建... 查看详情

springsecurityoauth2provider之自定义开发

SpringOAuth2默认提供的功能难免无法满足需求,需要特殊定制,这里列举常见的几个需要特殊开发的地方。 相关文章: SpringSecurityOAuth2Provider之最小实现 SpringSecurityOAuth2Provider之数据库存储 SpringSecurityOAuth2Provider之第... 查看详情

springcloud系列之自定义gatewayfilterfactory(代码片段)

SpringCloud系列之自定义GatewayFilterFactory学习目的:知道创建一个网关sample知道网关的基本配置知道自定义GatewayFilterFactory类环境准备:JDK1.8SpringBoot2.2.3SpringCloud(Hoxton.SR7)Maven3.2+开发工具IntelliJIDEAsmartGit新增SpringBootInitializer项目:N 查看详情

mapreduce之自定义inputformat(代码片段)

在企业开发中,Hadoop框架自带的InputFormat类型不能满足所有应用场景,需要自定义InputFormat来解决实际问题。自定义InputFormat步骤如下:(1)自定义一个类继承FilelnputFormat。(2)自定义一个类继承RecordReader,实现一次读取一个完... 查看详情

wpf编程之自定义button控件样式(代码片段)

  自.NETFramework3.0以后,WPF编程框架可使开发人员开发出更加令人耳目一新的桌面应用程序。它使开发工作更加方便快捷,它将设计人员和编程人员的工作分离开来。至于WPF的背景历史、框架特点、框架结构这里就不再赘述。... 查看详情

如何提高码农产量,基于java的web快速开发平台之自定义表单开发随笔

老板 :下班前一定写完?程序猿:可以,下班前能一定给!第二天早上上班~~~老板:这都第二天了,怎么没写完?程序猿:我还没有下班呢!哎!程序猿的痛啊公司上线的项目有不少销售记录表,又是报价单,又是仓储表,... 查看详情

玩转dnmp之自定义php容器

文章简介在前面几篇文章中,我们使用dnmp搭建了一个完整的docker开发环境。这篇文章接着分享如何在dnmp的基础上搭建一个自定义的PHP容器,实现多版本的PHP容器。前期准备首先我们下载dnmp仓库。复制docker-compose.sample.yml文件为do... 查看详情

javaweb学习笔记之自定义数据库连接池(代码片段)

一、应用程序直接获取数据库连接的缺点  用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连... 查看详情

javaweb基础—jsp自定义标签入门

自定义标签的作用:替换JSP页面的java代码步骤:1.标签处理类(标签是一个对象,那也就需要先有类)     2.tld文件它是一个xml(可以向c标签里借),一般放到WEB-INF下,不让客户端浏览器看到       核心配置 <ta... 查看详情

springboot系列之自定义枚举类的数据校验注解

SpringBoot系列之自定义枚举类的数据校验注解业务场景:数据校验,需要对枚举类型的数据传参,进行数据校验,不能随便传参。拓展,支持多个参数的枚举数据校验在网上找到很多参考资料,所以本博客基于这些博客进行拓展... 查看详情