⑥又是星期五,小试牛刀(编写定制标签)

前言

  今天有点迷茫。是身体累了,还是心累了。有种觉得想大哭而无力的感觉(可能心还没成熟,或是昨天羽毛球打累了)。加油,Jeff Li. 活在当下,坚持打好基础,坚持刷ACM,坚持coding。

  今天下午的小故事,其实我今天想回家。但不知道住哪里?买了动车票,等车的时候,我在候车室看着书。渐渐地,回去,家?爸妈在远地工作。家,仿佛还是实验室是我的家。渐渐地,收拾书本。我退了票,做上了回来的公交,返回终点站的学校。

  路途中,发现了一位老者,还是莫莫的扫着往前看没有尽头,往后看扫过的地也是没有尽头的马路。抬了下头,用自己暗色的工作服擦去额上的汗水。“他是用生命在work,用生命在路上。”想想自己,迷茫,何必迷茫?用生命看书,获取知识,用生命去coding。我的理想[传送门]会靠近。

                                                                                   “I can do it !”

言归正传

  定制标签概述

    利用JSP标准动作指令访问和操作JavaBeans,是首次尝试将表现代码(html)和业务逻辑(java 代码)实现分离。JSP 2.0添加了两项新特性,第一个特性是一个新的接口,称作Simple Tag. 第二项特性是一种使编写定制标签一样编写标签文件机制。[go]

 

  简单工作原理和小范例

 

                  

                      A simple pic of its principle

 

  简单的标签处理器中的主体用一个JspFragment类实例表示其生命周期。

 

    1.JSP容器创建简单标签处理器实例

    2.JSP→setJspContext 传递一个JspContext对象,其对象返回一个JspWriter,用于响应到客户端

            public void setJspContext(JspContext jspContext)

    3.JSP 调用setParent方法。将JspTag进来。

            public void setParent(JspTag parent)

    4.JSP为每个标签定义的属性设置方法(Setter)

    5.若标签有主体内容,则JSP调用SimpleTag接口的setJspBody方法,将主体作为JspFragment传递。

    6.Jsp调用doTag方法(SimpleTag只有这个接口),所有变量该方法同步。

 

    mum said, “I learned a little . so i use my hand to earn money by the hard work.”

 

  SimpleTag 小例子

    结构

      

 

    MyFirstTag类

package sedion.jeffli.tag;import java.io.IOException;import javax.servlet.jsp.JspContext;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.JspTag;
import javax.servlet.jsp.tagext.SimpleTag;public class MyFirstTag implements SimpleTag{JspContext jspContext;    //传递的对象
    @Overridepublic void doTag() throws JspException, IOException {System.out.println("doTag");jspContext.getOut().print("This is my first tag");}@Overridepublic JspTag getParent() {System.out.println("getParent");return null;}@Overridepublic void setJspBody(JspFragment arg0) {System.out.println("setJspBody");}@Overridepublic void setJspContext(JspContext arg0) {System.out.println("setJspContext");this.jspContext = arg0;}@Overridepublic void setParent(JspTag arg0) {System.out.println("setParent");}}
View Code

   

   注册标签-mytags.tld

<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/j2eeweb-jsptaglibraty_2_1.xsd"version="2.1"><tlib-version>1.0</tlib-version><short-name>mt</short-name><tag><name>firstTag</name><tag-class>sedion.jeffli.tag.MyFirstTag</tag-class><body-content>empty</body-content></tag></taglib>

  

  显示的jsp-index.jsp

<%@taglib uri="/WEB-INF/classes/mytags.tld" prefix="easy"%>
<html><head><title>this is my first tag</title></head><body>hello! tags<br/><easy:firstTag></easy:firstTag></body>
</html>

 

   效果图

    

    自然,控制台打印也是调用流程... 自己看吧,亲们

  小结:

    

    JSP→setJspContext 传递一个JspContext对象,其对象返回一个JspWriter,用于响应到客户端。

 

编写EL函数

  EL(JSP Expression Language),忘了就[传送门]

  编写两个步骤(这里我们还是用上面的项目add 进去):

    ①写静态public类

    ②将function元素注册标签库

    

    在sedion.jeffli.tag包下 -- MyFunctions类

package sedion.jeffli.tag;public class MyFunctions {public static String reverseString(String s){return new StringBuffer(s).reverse().toString();}
}

 

   mytags.tld 内<taglib></taglib>之间添加

  <function><name>reverseString</name><function-classe>sedion.jeffli.tag.MyFunctions</function-classe><function-signature>java.lang.String reverseString(java.lang.String)</function-signature></function>

  

   页面添加

    ${easy:reverseString("hello EL functions")}

 

    此时,我在听天籁。一个好的耳机,让我很陶醉,不累. 想起阿公一句话:“书法,坚持练。肯定比我好了。有些字我还要向你学习呢。”

                  

                        小朽作品一张,做比说难。贵在坚持!

    

发布定制标签(我很看好,以后这样做)

  简单来说,打个jar以便其他人使用。

  123,轻松搞定(上面function为例)

 

    ①结构

 

      

 

    ②在tld文件<taglib></taglib>之间添加uri

<uri>http://examp.com/taglib/function</uri>

    

    ③改。去页面

<%@taglib uri="http://examp.com/taglib/function" prefix="easy"%>

 

    这,懵懵懂懂那些java.lang.String形成。我以后也要开源写出来hlep others

 

去总结

   对于,分离表现逻辑和业务逻辑来说,用定制标签必用javabean好很多。还有 打包 jar,我马上要用起来。

 

   这里想对妈妈说,“sorry,有时候迷茫导致我有点不乖。我会坚持习惯,慢慢完成自己的目标。心慢慢练,不然炸了就不好了。哈哈,爸妈身体健康。工作辛苦了!”

      

 

转载于:https://www.cnblogs.com/Alandre/p/3601389.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么要“男孩穷养、女孩富养”

所谓富养女&#xff0c;是说女儿要精细地养&#xff0c;就是在家庭经济条件许可的前提下&#xff0c;尽可能地满足女儿对物质的需求&#xff0c;送她们去参加钢琴、小提琴、音乐、形体等方面的训练&#xff0c;培养她们的高雅气质和大家闺秀的涵养……要从小宠她、爱她,培养她的…

技术分享|前端性能 关键性能指标以及测量工具介绍

源宝导读&#xff1a;对于一款商业软件产品而言&#xff0c;其性能表现往往会直接关系到它的生死存亡&#xff0c;这种说法一点也不夸张&#xff0c;数据显示&#xff0c;40&#xff05;的人放弃了加载时间超过3秒的网站。但是一个网页的加载时间&#xff0c;响应时间的“快”“…

ELKstack-Elasticsearch各类安装部署方法

手动安装部署Elasticsearch 开篇 开篇闲话&#xff0c;如果是新人在接触ELKstack什么都不懂的情况下&#xff0c;可以先看看各位前人写的关于ELKstack的博客&#xff0c;如何对ELKstack部署安装及使用&#xff0c;但是别人的东西只能作为借鉴&#xff0c;在自己搭建使用一定要以…

Android之 如何在退出一个activity后,很好的取消AsyncTask继续运行

public class Task extends AsyncTask<Void, Void, Void>{Override protected Void doInBackground(Void... path) { // Task被取消了&#xff0c;马上退出循环 if(isCancelled()) return null; }Override public void onProgressUpdate(File... files) { // Task被取消了…

美国超人气漫画科普书!85%以上中学物理考点,5岁孩子秒懂物理

▲ 点击查看今年的高考&#xff0c;不得不说&#xff0c;一度被浙江学霸刷屏&#xff01;他总分720分&#xff0c;物理等3门满分的成绩&#xff0c;最终获得“浙江高考状元”。状元能摘得桂冠&#xff0c;除了日积月累的不断努力外&#xff0c;最重要的是&#xff0c;不断调整自…

我的博客初始化

我是一名在读学生&#xff0c;平时没有摘抄、写日记、笔记之类的习惯&#xff0c;自从在amobbs上发了一篇lwip的移植记录&#xff0c;得到大家的回响&#xff0c;对自己的工作也有了极大的鼓舞作用&#xff0c;也开始学着写一些学习的笔记。记录生活和学习的点滴&#xff0c;经…

gevent 学习笔记一

import geventdef a():print a starting....gevent.sleep(1)print a endingdef b():print b starting....gevent.sleep(1)print b endinggevent.joinall([gevent.spawn(a), gevent.spawn(b) ]) 结果显示&#xff0c;用gevent并不会因为gevent.sleep而造成阻塞,但用内置的time.s…

在.Net环境下使用elasticsearch实现大数据量的搜索

Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎。无论在开源还是专有领域&#xff0c;Lucene可以被认为是迄今为止最先进、性能最好的、功能最全的搜索引擎库。Elasticsearch使用标准的RESTful API和JSON。我们还用多种语言构建和维护客户机&#xff0c;如Java、Pyth…

鸿蒙手机启动器apk下载,澪Pro启动器本体下载最新版

澪Pro启动器本体下载最新版专为我的世界的玩家们打造&#xff0c;可以在这里自由安装不同mod&#xff0c;也可以自定义编辑丰富的游戏内容&#xff0c;感受全新精彩的沙盒冒险玩法乐趣&#xff0c;更有丰富的资源和皮肤提供给玩家们&#xff0c;畅爽的玩法模式&#xff0c;沉浸…

当前联机日志损坏恢复

2019独角兽企业重金招聘Python工程师标准>>> 环境模拟 删除状态为active的联机日志&#xff0c;然后强行关闭数据库 处理过程 SQL> startup ORACLE instance started. Total System Global Area 167772160 bytes Fixed Size 1260720 bytes Variable Size 1426071…

Android之 如何解决ScrollView 和ListView滑动冲突的问题如何解决ScrollView can host only one direct child

android 采用ScrollView布局时出现异常:ScrollView can host only one direct child。 解决办法:主要是ScrollView内部只能有一个子元素,即不能并列两个子元素,所以需要把所有的子元素放到一个LinearLayout内部或 RelativeLayout等其他布局 如何解决ScrollView 和ListVi…

mysql 中执行的 sql 注意字段之间的反向引号和单引号

如下的数据表 create table test( id int(11) not null auto_increment primary key, user varchar(100) not null, flag char(2) not null default ok ); 当查询时应该写成 $sql "select user from test where flagok "; 字段是数据表的&#xff0c;用 &#xff08…

权威杂志评选出的十个最伟大的公式,爱因斯坦的质能方程竟然只能排第六!简直神仙打架....

全世界只有3.14 % 的人关注了爆炸吧知识难决高下各有千秋当数学家得出方程式和公式&#xff0c;如同看到雕像&#xff0c;美丽的风景&#xff0c;听到优美的曲调等等一样而得到充分的快乐。——柯普宁公式&#xff0c;是数学世界中一道美丽的风景&#xff0c;一个小小的等式&am…

在Idea中测试各JVM语言的交互性

为什么80%的码农都做不了架构师&#xff1f;>>> 背景&#xff1a; 假设出现这样的场景&#xff0c;一个Java项目中&#xff0c;需要用其他语言来编写相关模块&#xff0c;但需要能被Java调用 测试工具&#xff1a;Idea12 测试语言&#xff1a;Groovy、Scala、Ko…

android pcm调节音量,调整PCM语音数据的音量

通过编程实现调整PCM的音量&#xff0c;具体做法是乘上一个固定的数&#xff0c;但是要考虑数据的溢出问题&#xff0c;代码如下&#xff1a;//调节PCM数据音量//comment : 对PCM数据的音量进行放大//parameter :// pData PCM数据// nLen PCM数据的长度// nBitsPerSample 每个S…

.NET 大会今日开幕 |这些白嫖福利不看肠子都悔青

{ 12.18 线上开幕 文末有福利 }2021 .NET 开发者大会&#xff0c;今日开幕你是否已经满怀期待&#xff0c;同时又有很多疑问“ 会场在哪里&#xff1f;” "哪些大咖会参加&#xff1f;"“ 技术主题有哪些&#xff1f;” “ 什么时间有福利&#xff1f;”…时间不多了…

Android之如何解决ScrollView起始位置不是最顶部的解决办法

最近遇到了打开带有ScrollView的页面布局默认起始位置不是最顶部的情况&#xff0c;最后发现问题是因为ScrollView内部嵌套了listview&#xff0c;只需要设置listview获取焦点为false即可。 listview.setFocusable(false); 如果内部嵌套的是其它&#xff0c;也是同样的处理方…

asp.net web常用控件FileUpload(文件上传控件)

2019独角兽企业重金招聘Python工程师标准>>> FileUpload控件的主要中能&#xff1a;向指定目录上传文件&#xff0c;该控件包括一个文本框和一个浏览按钮。 常用的属性&#xff1a;FileBytes&#xff0c;FileContent、FileName、HasFile、PostedFile。 常用的方法&a…

SQL、LINQ、Lambda 三种用法

颜色注释&#xff1a; SQL LinqToSql Lambda QA1、 查询Student表中的所有记录的Sname、Ssex和Class列。select sname,ssex,class from studentLinq: from s in Students select new { s.SNAME, s.SSEX, s.CLASS }Lambda: Students.Select( s…

android 拍照换头像,Android调用相机拍照,裁剪及更换头像功能的实现

1&#xff0c;点击弹出popwindow&#xff0c;选择相机或者相册这个就不多说了&#xff0c;在OnclickListener里写弹出的窗口位置和样式。2&#xff0c;选择拍照功能&#xff0c;调用手机相机。//调用相机Intent intent new Intent("android.media.action.IMAGE_CAPTURE&q…