发表于: 2018-04-09 16:19:04

1 768


今天完成的任务:自定义标签

标签的实现类必须要继承TagSupport类,翻看源码得知TagSupport之上还有各种类,这个是最顶端接口:

继承TagSupport类后需要重写doStartTag方法(这个方法是jsp页面渲染后执行)

@Override
public int doStartTag() throws JspException {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if (value==null) {
Date date = new Date();
String string = simpleDateFormat.format(date);
try {
pageContext.getOut().print(string);
} catch (IOException e) {
e.printStackTrace();
}
}
else {
Date date = new Date(value);
String string = simpleDateFormat.format(date);
try {
pageContext.getOut().print(string);
} catch (IOException e) {
e.printStackTrace();
}
}
return super.doStartTag();
}

其实自定义标签还有更多作用,比如EVAL_BODY_AGAIN这个静态变量可以实现标签的循环,如果不执行doAfterBody()则会一直执行该标签,但是由于任务需要没有学太深(使用pageContext.getOut().print需要抛出异常),注意重写的时候和父类要一致。

昨天写tld文件的时候没有注意到attribute这个属性的具体含义,然后今天在做标签的时候想让这个标签指定与不指定值都可以,不指定value的时候直接取系统时间反馈给用户,指定value的时候取value值进行转换,一开始报错,然后去查了一下配置详解,拿我写的tld举例:

<tag>
<name>date</name>
<tag-class>utils.TimeUtils</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>value</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>

name:tag的名字    tagclass:该tag的实现类  

body-content:由3个值可选

(1)jsp 标签体由其他jsp元素组成,如果其有jsp元素,那么标签会先解释,然后将元素的实际值传入,比如标签体里含有<%=attributeName%>这样子的jsp元素,此时标签会按attributeName的实际值是什么就传入什么。

(2)empty 标签体必须为空  在引用这个Tag的时候,可以<bean:date value="attributeName" />,而不必<bean:date value="attributeName" ></bean:write> 

(3)tagdependent 由标签解释,不带jsp转换 

attribute:识别tag的一个参数     name:参数的名字

required 参数是否必填 如果为true则参数必填否则报错   rtexprvalue 决定这个标签的值是否可以写入 rtexprvalue设置为true后,可用${attributeName}动态赋值

一开始全都设置为false还是报错,如果想从数据库中动态赋值需要设置rtexprvalue为true


由于之前对时间转换不熟悉,就试着比较了三种获取当前系统时间戳的方法:

public class demo {
private static long a =10000;

public static void main(String[] args) {
long b = 100000*a;
long t1 = System.currentTimeMillis();
testSystem(b);
long t2 = System.currentTimeMillis();
//      System.currentTimeMillis()所需时间
       System.out.println(t2-t1);
testCalandar(b);
long t3 = System.currentTimeMillis();
//testCalander()所需时间
       System.out.println(t3-t2);
testDate(b);
long t4 = System.currentTimeMillis();
//testDate所需时间
       System.out.println(t4-t3);

}
public static  void testSystem (long b){
for(int i=0;i<b;i++){
long c = System.currentTimeMillis();
}
}
public static  void testCalandar(long b){
for(int i=0;i<b;i++){
long c = Calendar.getInstance().getTimeInMillis();
}
}
public static  void testDate(long b){
for (int i=0;i<b;i++){
long c = new Date().getTime();
}
}
}

最后的输出:

calender方法需要换算时区耗时较长,其他两个差不多吧。

最后标签实现的效果:


深度思考:

1.jsp是什么

jsp全名为Java Server PagesJSP,是一种网页的动态设计思想(相对于静态html而言),客户向服务端发起请求,服务端将请求经过控制器处理得到jsp页面,这样jsp页面能实现和数据库的交互,通常以<%,%>作为语句,其实jsp页面也是一种类servlet(也可以使用一个jsp页面提交表单到另外一个jsp页面去处理,不过在jsp页面中写业务逻辑是非常繁琐且无法维护的事情)。

2.jsp有几个内置对象?

(1)request--服务器取得客户端信息

1)头信息 

String getHeader(String name):返回指定的http头标

Enumeration getHeaderNames():返回请求给出的所有http头标名称的枚举值

2)cookie

cookie[] getCookies():返回与请求相关cookies的一个数组

3)请求参数

以超链接形式请求,

4)属性

进行请求转发操作,把一些数据带到转发后的页面处理,可以使用request对象的属性

request.setAttribute("key",value):参数key为String类型的属性名,value为object类型的属性值。

(2)response--服务器回应客户端信息

1)重定向

response.senRedirect(string location);指定重定向url并发送重定向响应,可以使用相对url,此方法会终止当前请求和响应,重定向页面无法获得request属性

2)添加cookie

addCookie(Cookie cookie):添加一个cookie对象

3)设置头标

setHeader(String name,String value):设置指定名字和取值的一个头标

(3)pageContext--表示页容器

pageContext对象的作用时取得任何范围的参数,通过pageContext可以获取jsp页面的out、request、response、session等对象。

(4)page--和this意义相同,表示这个jsp页面

page对象的声明类型时java.lang.Object,代表jsp本身即对应的servlet类的对象

<%@page %>是指令不是page对象

(5)exception--表示错误页处理操作

只有page指令的isErrorPage属性为true时(<% page isErrorPage="true"%>),jsp中的exception对象才有效,其他页面通过<%@page errorPage="JSP路径名称"%>指定错误页面。

(6)config--获取初始化参数,初始化参数在web.xml文件中配置

<context-param>

<param-name></param-name>

<param-value></param-value>

</context-param>

(7)session--表示每一个用户,用于登陆验证

session用于保存客户信息,分配给客户对象,session的生命周期从客户端进行第一个request开始,到客户端结束对应用程序访问终止,如关闭浏览器,session中的ID标识唯一,当刷新浏览器时标识值不变。

(8)application--表示整个服务器

每个web应用程序开始运行时会创建唯一的application对象,所有访问该应用程序的客户端共享。

(9)out--输出

out对象向web浏览器内输出各种数据类型的内容,并且管理应用服务器上的输出缓冲器,缓冲器默认值为8KB

3.C标签和EL表达式

1.EL表达式

(1)访问bean的属性

 ${user.name},容器会依次从pageContext,request,session,application中查找(getAttribute)绑定名称为user的对象,并调用该对象的getName方法,最后输出。

指定查找范围:pageScope,requestScope,sessionScope,application来指定,例如${sessionScope.user.name}

访问数组下标:${user.interest[0]},注意这里也需要get方法

 (2)进行简单运算,运算结果可以给jsp标签属性赋值也可以直接输出

  $(1+1)会输出2,$(2>1)会输出true,$(1<2 && 3>2)会输出false

(3)读取请求参数

${param.username}等价于request.getParameter("username");

2.C标签

有if、choose、foreach功能:

c:forEach items="${studentList}" var="student" varStatus="st">
<tr>
<td>${student.id}</td>
<td>${student.name}</td>
<td>${student.qq}</td>
<td>${student.job}</td>
<td>${student.school}</td>
<td>${student.url}</td>
<td><date:date value="${student.createtime}"/></td>
<td><date:date value="${student.updatetime}"/></td>
<td><a href="student/${student.id}/profile">更新</a> </td>
<td><a href="student/${student.id}" onclick = 'return confirm("确认要删除吗?");'>删除</a></td>
</tr>
</c:forEach>



返回列表 返回列表
评论

    分享到