版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Coder_Boy_/article/details/82503923
JSTL原理
我们可以参照 jstl.jar 中原始的标签库 编写一个自己的标签库:
下面通过案例演示如何 编写一个获取指定格式的系统时间的标签
我们还是以上一节演示工程基础上编写此案例
案例演示:
工程案例目录结构
pom.xml
<?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_2_5.xsd" version="2.5">
<display-name>Jsp03</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>web.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
web.xml:
<?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_2_5.xsd" version="2.5">
<display-name>Jsp03</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>demo</servlet-name>
<servlet-class>web.DemoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo</servlet-name>
<url-pattern>/demo</url-pattern>
</servlet-mapping>
</web-app>
DemoServlet.java
package web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import entity.Course;
import entity.Student;
public class DemoServlet extends HttpServlet{
@Override
protected void service(HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
//模拟一份数据
Student s= new Student();
s.setName("CANG");
s.setAge(40);
s.setSex("M");
s.setInterests(new String[]{"篮球","足球","排球"});
Course c = new Course();
c.setId(1);
c.setName("Java");
c.setDays(80);
s.setCourse(c);
//转发到JSP
req.setAttribute("stu", s);
//当前:/Jsp03/demo
//目标:/Jsp03/demo.jsp
req.getRequestDispatcher("demo.jsp").forward(req,res);
}
}
SysdateTag.java
package web;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.SimpleTagSupport;
public class SysdateTag extends SimpleTagSupport{
//日期格式
private String format = "yyyy/MM/dd HH:mm:ss";
public String getFormat() {
return format;
}
public void setFormat(String format) {
this.format = format;
}
@Override
public void doTag() throws JspException, IOException {
//创建当前系统时间
Date date = new Date();
//格式化这个时间
SimpleDateFormat sdf = new SimpleDateFormat(format);
String now = sdf.format(date);
//3.将格式化后的时间输出
//该方法声明返回的是JspContext
//而实际返回的是PageContext
//PageContext extends JspContext
PageContext ctx =(PageContext)this.getJspContext();
JspWriter w = ctx.getOut();
w.println(now);
//此处不能关闭writer,因为其他的标签
//也共用此writer。
}
}
s.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>这是我自己的标签库</description>
<display-name>My JSTL</display-name>
<tlib-version>3.1</tlib-version>
<short-name>s</short-name>
<uri>/cheri-tag</uri>
<tag>
<description>
该标签用来输出系统时间,
且时间格式可以自己设置。
</description>
<name>sysdate</name>
<tag-class>web.SysdateTag</tag-class>
<!--声明双标签的内容类型(<a>内容</a>)
由于当前标签没有内容,因此其类型为空。 -->
<body-content>empty</body-content>
<attribute>
<description>用来设置日期的格式</description>
<name>format</name>
<!--该属性是否必须传入值 -->
<required>false</required>
<!--是否允许使用EL给属性传入值 -->
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
demo.jsp
<%@page pageEncoding="utf-8"%>
<!-- 引入标签库 -->
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@taglib uri="/cheri-tag" prefix="s" %>
<!doctype html>
<html>
<head>
<title>EL和JSTL</title>
<meta charset="utf-8">
</head>
<body>
<p><s:sysdate/></p>
<p><s:sysdate format="yyyy-MM-dd"/></p>
</body>
</html>
将Jsp03工程部署到Tomcat上,运行Tomcat启动案例工程,
浏览器录入http://localhost:8080/Jsp03//demo 即可:如果没有错误,最终页面显示效果应如下图: