第二部分简单讲解:主要讲解el表达式,核心标签库。本章主要讲解:自定义标签库;404页面,505页面,错误页面配置方法

全部代码下载:链接

1.JSP自定义标签:

自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面。 JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签。

2.开发自定义标签

下面的步骤建立一个自定义标签用于战术客户端的ip地址:

  1. 编写一个普通的java类,继承SimpleTagSupport类,
public class ShowIp extends SimpleTagSupport {
/**
* 以下屏蔽的代码在SimpleTagSupport代码中已经做了!这里不需要重复再做!
*/
/*private JspContext context;
*//**
* 传入pageContext
*//*
@Override
public void setJspContext(JspContext pc) {
this.context = pc;
}*/
@Override
public void doTag() throws JspException, IOException {
PageContext pageContext=(PageContext)this.getJspContext();
ServletRequest request = pageContext.getRequest();
String ip=request.getRemoteHost();
JspWriter out = pageContext.getOut();
out.write("使用自定义标签展示客户ip地址"+ip);
List<String> a=null;
}
}
  1. 在web项目的WEB-INF目录下建立mytaglib.tld文件,这个tld叫标签库的声明文件。(参考核心标签库的tld文件)
<?xml version="1.0" encoding="UTF-8" ?>
<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">
<description>A tag library exercising SimpleTag handlers.</description>
<!-- 标签库的版本 -->
<tlib-version>1.0</tlib-version>
<!-- 标签库前缀 -->
<short-name>rlovep</short-name>
<!-- tld文件的唯一标记 -->
<uri>http://rlovep.com</uri>
<!-- 定义标签,标签要放在方法前面 -->
<tag>
<!-- 标签名 -->
<name>showIp</name>
<!-- 标签处理类 -->
<tag-class>com.rlovep.tags.ShowIp</tag-class>
<body-content>empty</body-content>
</tag>
<tag>
</taglib>
  1. 在jsp页面的头部导入自定义标签库:url为你在tld中写的url,前缀也是你在tld文件中定义的

               <%@ taglib uri="http://rlovep.com" prefix="rlovep" %>
  2. 在jsp中使用自定义标签

<%-- 测试简单的自定义标签,标签体(我是你)不显示 --%>
<rlovep:showIp>我是你
</rlovep:showIp>

3.自定义标签的执行过程

当访问:http://localhost:8080/stuJsp/Hellotags.jsp 时;要重启Tomcat使服务器启动时,加载每个web应用的WEB-INF目录下的所有文件!!!例如。web.xml, tld文件!!!

步骤如下:

  1. 检查jsp文件的taglib指令,是否存在一个url为http://rlovep.com的tld文件。如果没有,则报错。
  2. 执行jsp文件的转化:把jsp文件翻译成java源文件->编译class->构造类对象->调用_jspService()方法
  3. 读到rlovep:showIp到mytaglib.tld文件中查询是否存在为showIp的标签
  4. 找到对应的标签,则读到内容,得到com.rlovep.tags.ShowIp
  5. 构造ShowIp对象,然后调用ShowIp里面的方法:dotag方法;

4.访问标签体

你可以像标准标签库一样在标签中包含消息内容。如我们要在我们自定义的rlovep:showIp中包含内容

  1. 格式如下:
<rlovep:showIp>我是你
</rlovep:showIp>
  1. 但要文字显示需要修改处理类和tld文件:

    修改处理类在doTag方法中增加如下内容:
JspContext jspContext2 = this.getJspContext();
//显示标签体的两种方法
//方法1直接调用
//jspBody.invoke(null);
//方法2通过输出到out
//jspBody.invoke(jspContext2.getOut());

修改tld文件:

 <tag>
<!-- 标签名 -->
<name>showIp</name>
<!-- 标签处理类 -->
<tag-class>com.rlovep.tags.ShowIp</tag-class>
<!-- 输出标签体的内容格式标签体不可以写jsp的java代码 -->
<body-content>scriptless</body-content>
</tag>
  1. 现在你可以将标签体的内容显示了;
<%-- 标签提会显示 --%>
<rlovep:showIp>我是你
</rlovep:showIp>
  1. 输出标签体的内容格式:

    JSP: 在传统标签中使用的。可以写和执行jsp的java代码。

    scriptless: 标签体不可以写jsp的java代码

    empty: 必须是空标签。

    tagdependent : 标签体内容可以写jsp的java代码,但不会执

5.给标签体带属性:

你可以在自定义标准中设置各种属性,要接收属性,值自定义标签类必须实现setter方法;

  1. 格式如下:
<!-- 测试带属性的标签,标签体显示通过类处理 -->
<rlovep:AttributeTags name="peace" value="12345
  1. 定义属性步骤如下:

    编写处理类:AttributeTags extends SimpleTagSupport
添加俩个属性:
//声明属性的成员变量
private Integer value;
private String name;
并为两个成员属性写setter方法;
public void setValue(Integer value)
public void setName(String name)

在标签库文件tld注明此标签和属性:

<!-- 标签名 -->
<name>AttributeTags</name>
<!-- 标签处理类 -->
<tag-class>com.rlovep.tags.AttributeTags</tag-class>
<!-- 输出标签体的内容格式标签体不可以写jsp的java代码 -->
<body-content>scriptless</body-content>
<!-- 配置属性name -->
<attribute>
<name>name</name>
<!-- 是否必填 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
<!-- 配置属性value -->
<attribute>
<name>value</name>
<!-- 是否必填 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
  1. 现在就可以用带属性的标签了
  2. 在tld配置属性时你可以配置下面的属性:

6.带有子标签的自定义标签:

就像核心标签库的choose标签一样我们也可以定义嵌套的自定义标签,这部分我们主要讲解自己创建一个类似核心标签库的choose标签。步骤如下:

  1. 建立处理类,处理类还是与前面一样的方法。需要介绍的是用到了一个getParent()方法,从名字上就可以知道是为了获得父标签,对就是获得父标签类;

    建立三个处理类文件: ChooseTag,OtherWiseTag,whenTag
//ChooseTag类:
public class ChooseTag extends SimpleTagSupport{
//此去时变量不是标签属性,由when标签更改;othewise获得;
private boolean flag;
public boolean isFlag() {
return flag;
}
public void setFlag(boolean flag) {
this.flag = flag;
}
@Override
public void doTag() throws JspException, IOException {
// Choose标签作用显示标签体,以及作为其他两个标签的父标签;
getJspBody().invoke(null);
}
}
//whenTag类
public class whenTag extends SimpleTagSupport{
//增加test属性
private boolean test;
public boolean isTest() {
return test;
}
public void setTest(boolean test) {
this.test = test;
}
@Override
public void doTag() throws JspException, IOException {
//如果标签属性为true,显示标签体
if(test){
getJspBody().invoke(null);
}
//设置父标签给otherwise用
ChooseTag parent=null;
if(getParent() instanceof ChooseTag){
parent=(ChooseTag)getParent();
parent.setFlag(test);
}
}
}
//OtherWiseTag类:
public class OtherWiseTag extends SimpleTagSupport {
@Override
public void doTag() throws JspException, IOException {
boolean test=true;
//获取父标签的test,由他的上一个when设置
if(getParent() instanceof ChooseTag)
{
//获取父标签的test,由他的上一个when设置
ChooseTag parent=(ChooseTag)getParent();
test=parent.isFlag();
}
if(!test){
getJspBody().invoke(null);
}
}
}
  1. 编写tld文件:与其他的标签定义一模一样
<!-- 定义标签,choose-->
<tag>
<!-- 标签名 -->
<name>choose</name>
<!-- 标签处理类 -->
<tag-class>com.rlovep.tags.ChooseTag</tag-class>
<!-- 输出标签体的内容格式标签体不可以写jsp的java代码 -->
<body-content>scriptless</body-content>
</tag>
<!-- 定义标签,when-->
<tag>
<!-- 标签名 when -->
<name>When</name>
<!-- 标签处理类 -->
<tag-class>com.rlovep.tags.whenTag</tag-class>
<!-- 输出标签体的内容格式标签体不可以写jsp的java代码 -->
<body-content>scriptless</body-content>
<!-- 配置属性name -->
<attribute>
<name>test</name>
<!-- 是否必填 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!-- 定义标签,Otherwise-->
<tag>
<!-- 标签名 -->
<name>otherwise</name>
<!-- 标签处理类 -->
<tag-class>com.rlovep.tags.OtherWiseTag</tag-class>
<!-- 输出标签体的内容格式标签体不可以写jsp的java代码 -->
<body-content>scriptless</body-content>
</tag>
  1. 使用带子标签的标签:与使用其他标签稍微有些不同,需要嵌套
<!-- 测试choose -->
<rlovep:choose>
<rlovep:When test="${10<5 }">
条件成立执行when
</rlovep:When>
<rlovep:otherwise>
条件不成立执行otherwise
</rlovep:otherwise>
</rlovep:choose>

自定义标签就介绍到这里;

404页面,505页面,错误页面配置方法:

可以在web.xml中给你的网站配置全局的404页面,505页面,错误页面;配置方法如下:记得建立相应的跳转文件。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<!-- 配置空指针异常 -->
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/error.jsp</location>
</error-page>
<!-- 配置505错误页面 -->
<error-page>
<error-code>500</error-code>
<location>/common/500.jsp</location>
</error-page>
<!-- 配置404错误页面 -->
<error-page>
<error-code>404</error-code>
<location>/common/404.html</location>
</error-page>
</web-app>

好的本章介绍到这里

JSP入门就介绍到这里,哟哟,切割闹;

来自一条小鲨鱼wpeace(rlovep.com)

JSP入门之自定义标签的更多相关文章

  1. javaWeb 在jsp中 使用自定义标签输出访问者IP

    1.java类,使用简单标签,jsp2.0规范, 继承 SimpleTagSupport public class ViewIpSimpleTag extends SimpleTagSupport { ...

  2. jsp页面中自定义标签的小演示

    在实习期遇到公司的pg自定义标签了,同事要我自己自学一下 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet.JSP标签扩展可以让你创建新的标签并且可以直接 ...

  3. JSP 2.x 自定义标签

    JSP 1.x的标签,虽然使用起来非常灵活,但是比较复杂,JSP 2.x提供了一组简化的标签写法 SimpleTagSupport是SimpleTag接口的子类,同时支持参数和标签体,最核心的方法时d ...

  4. javaweb学习总结(二十三)——jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  5. javaweb(二十三)——jsp自定义标签开发入门

    一.自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码. 二.自定义标签开发和使用 2.1.自定义标签开发步骤 1.编写一个实现Tag接口的Java类(标签处理器类) 1 packag ...

  6. JSP第六篇【自定义标签之传统标签】

    为什么要使用自定义标签? JSTL标签库只提供了简单的输出等功能,没有实现任何的HTML代码封装,并且某些复杂类型转换,或者逻辑处理的时候,JSTL标签库完成不了,需要自定义标签! 编写自定义标签的步 ...

  7. javaEE(7)_自定义标签&JSTL标签(JSP Standard Tag Library)

    一.自定义标签简介 1.自定义标签主要用于移除Jsp页面中的java代码,jsp禁止出现一行java脚本. 2.使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: •编写一个实现T ...

  8. JSP自定义标签/自定义标签打包

    有这样一个业务需求: 当我们在编辑某个用户时,需要设置该用户的角色,在转到编辑页面时,就需要自动勾选上该用户已经选择的角色,如下图: 当我们点击编辑时,会查询用户详细信息,以及角色集合传到编辑页面. ...

  9. 12、Jsp加强/自定义标签/JavaBean

    1 Jsp加强回顾 Jsp加强 1)Jsp的9大内置对象 request       HttpServletRequet response     HttpServletResponse config ...

随机推荐

  1. gRPC初探——概念介绍以及如何构建一个简单的gRPC服务

    目录 引言 1. gRPC简介 2. 使用Protocol Buffers进行服务定义 2.1 定义消息 2.2 定义服务接口 3.构建简单的gRPC服务 3.1 编写proto文件,定义消息和接口 ...

  2. 【转载】Javascript里面的线程和异步

    JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序. 参考这篇文章 http://www.ruanyifeng.com/blog/2012/1 ...

  3. php判断一个数组是另一个数组的子集

    需求最少的时间复杂度判断$a数组是否是$b数组的子集 // 快速的判断$a数组是否是$b数组的子集$a = array(135,138);$b = array(135,138,137); 实现方法 这 ...

  4. Java 设计模式系列(十)外观模式

    Java 设计模式系列(十)外观模式 门面模式(Facade):外部与一个子系统的通信必须通过一个统一的外观对象进行,为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这 ...

  5. 尝试编写的rabbitmq+spring 框架

    spring有自己的一套框架与消息队列结合使用http://projects.spring.io/spring-amqp/,这个接下来会好好的研究一下. 在领导的帮助下,终于勉强写完了这个消息队列的框 ...

  6. msys2 + clion安装所需的mingw64编译环境

    pacman -S mingw-w64-x86_64-toolchain 输出结果为: $ pacman -S mingw-w64-x86_64-toolchain:: 在组 mingw-w64-x8 ...

  7. 【转】java遍历实体类的属性和数据类型以及属性值

    和同学接了个外包的活,由于项目中很多地方要用到poi导出excel,而每次导出都要写很多相同的代码,因为poi的cell.setCellValue();每次设置的都是不同实体bean的属性值,导致代码 ...

  8. HDU1233 还是畅通工程 2017-04-12 19:49 64人阅读 评论(0) 收藏

    还是畅通工程 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  9. GNOME桌面的安装

    首先搭建yum仓库 http://www.cnblogs.com/jw35/p/5967677.html yum grouplist                     #列出yum仓库里的软件组 ...

  10. Linux带有时间控制的多进程bash脚本

    目标 以可控制的多进程执行,达到最大执行时长后停止脚本. 思路 1.产生fifo管道,并预填充n个值(与并发数相等) 2.记录脚本本身PID并启动计时器进程(计时终止后杀脚本本身PID) 3.并发执行 ...