第二部分简单讲解:主要讲解el表达式,核心标签库。本章主要讲解:自定义标签库;404页面,505页面,错误页面配置方法
全部代码下载:链接
自定义标签是用户定义的JSP语言元素。当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时Web container调用那些操作。JSP标签扩展可以让你创建新的标签并且可以直接插入到一个JSP页面。 JSP 2.0规范中引入Simple Tag Handlers来编写这些自定义标记。你可以继承SimpleTagSupport类并重写的doTag()方法来开发一个最简单的自定义标签。
下面的步骤建立一个自定义标签用于战术客户端的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 a=null;
}
}
2.在web项目的WEB-INF目录下建立mytaglib.tld文件,这个tld叫标签库的声明文件。(参考核心标签库的tld文件)
<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.0tlib-version>
<short-name>rlovepshort-name>
<uri>http://rlovep.comuri>
<tag>
<name>showIpname>
<tag-class>com.rlovep.tags.ShowIptag-class>
<body-content>emptybody-content>
tag>
<tag>
taglib>
3.在jsp页面的头部导入自定义标签库:url为你在tld中写的url,前缀也是你在tld文件中定义的
<%@ taglib uri="http://rlovep.com" prefix="rlovep" %>
4.在jsp中使用自定义标签
<%-- 测试简单的自定义标签,标签体(我是你)不显示 --%>
<rlovep:showIp>我是你
</rlovep:showIp>
当访问: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. 读到到mytaglib.tld文件中查询是否存在为showIp的标签
4. 找到对应的标签,则读到内容,得到com.rlovep.tags.ShowIp
5. 构造ShowIp对象,然后调用ShowIp里面的方法:dotag方法;
你可以像标准标签库一样在标签中包含消息内容。如我们要在我们自定义的中包含内容
1. 格式如下:
<rlovep:showIp>我是你
rlovep:showIp>
2.但要文字显示需要修改处理类和tld文件:
修改处理类在doTag方法中增加如下内容:
JspContext jspContext2 = this.getJspContext();
//显示标签体的两种方法
//方法1直接调用
//jspBody.invoke(null);
//方法2通过输出到out
//jspBody.invoke(jspContext2.getOut());
修改tld文件:
<tag>
<name>showIpname>
<tag-class>com.rlovep.tags.ShowIptag-class>
<body-content>scriptlessbody-content>
tag>
3.现在你可以将标签体的内容显示了;
<%-- 标签提会显示 --%>
<rlovep:showIp>我是你
</rlovep:showIp>
4.输出标签体的内容格式:
JSP: 在传统标签中使用的。可以写和执行jsp的java代码。
scriptless: 标签体不可以写jsp的java代码
empty: 必须是空标签。
tagdependent : 标签体内容可以写jsp的java代码,但不会执
你可以在自定义标准中设置各种属性,要接收属性,值自定义标签类必须实现setter方法;
1.格式如下:
<rlovep:AttributeTags name="peace" value="12345
2.定义属性步骤如下:
编写处理类:AttributeTags extends SimpleTagSupport
添加俩个属性:
//声明属性的成员变量
private Integer value;
private String name;
并为两个成员属性写setter方法;
public void setValue(Integer value)
public void setName(String name)
在标签库文件tld注明此标签和属性:
<name>AttributeTagsname>
<tag-class>com.rlovep.tags.AttributeTagstag-class>
<body-content>scriptlessbody-content>
<attribute>
<name>namename>
<required>truerequired>
<rtexprvalue>truertexprvalue>
attribute>
<attribute>
<name>valuename>
<required>truerequired>
<rtexprvalue>truertexprvalue>
attribute>
tag>
3.现在就可以用带属性的标签了
<rlovep:AttributeTags name="peace" value="123456">
4.在tld配置属性时你可以配置下面的属性:
就像核心标签库的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);
}
}
}
2.编写tld文件:与其他的标签定义一模一样
<tag>
<name>choosename>
<tag-class>com.rlovep.tags.ChooseTagtag-class>
<body-content>scriptlessbody-content>
tag>
<tag>
<name>Whenname>
<tag-class>com.rlovep.tags.whenTagtag-class>
<body-content>scriptlessbody-content>
<attribute>
<name>testname>
<required>truerequired>
<rtexprvalue>truertexprvalue>
attribute>
tag>
<tag>
<name>otherwisename>
<tag-class>com.rlovep.tags.OtherWiseTagtag-class>
<body-content>scriptlessbody-content>
tag>
3.使用带子标签的标签:与使用其他标签稍微有些不同,需要嵌套
<rlovep:choose>
<rlovep:When test="${10<5 }">
条件成立执行when
rlovep:When>
<rlovep:otherwise>
条件不成立执行otherwise
rlovep:otherwise>
rlovep:choose>
自定义标签就介绍到这里;
可以在web.xml中给你的网站配置全局的404页面,505页面,错误页面;配置方法如下:记得建立相应的跳转文件。
<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.NullPointerExceptionexception-type>
<location>/error.jsplocation>
error-page>
<error-page>
<error-code>500error-code>
<location>/common/500.jsplocation>
error-page>
<error-page>
<error-code>404error-code>
<location>/common/404.htmllocation>
error-page>
web-app>
好的本章介绍到这里
JSP入门就介绍到这里,哟哟,切割闹;
来自一条小鲨鱼wpeace(rlovep.com)