JSP自定义标签总结
JSP自定义标签分离了程序逻辑和表示逻辑,将Java代码从HTML中分离,而且可重用。
自定义标签由标签处理程序和标签描述组成;
标签处理程序是一个Java类,实现特定的标签接口;
Web容器在处理JSP页面的过程中,在处理自定义标签时调用相应的标签处理程序;
目前流行的标签库有:JSP标准标签库JSTL和Struts TagLib; 一个自定义标签需要具备三个条件才能工作:
1、标签处理程序:一个自定义标签必须有后台的一个java类来处理标签的的具体内容;
2、标签描述:一个标签需要一个描述文件(后缀名为tld的文件)来描述标签的前缀,名称,熟悉,哪个类来处理等等;
3、Jsp页面通过taglib指令引入标签,才能够使用。
容器标签:带有属性和主体部分,成对出现,反之为空标签。 当然了,还需要修改web.xml文件,增加自定义标签支持 Tag接口的生命周期: setPageContext(),setParent(),doStartTag(),release(),还需要导入servlet架包(servlet-api,jar, 简单说一下servlet:Servlet是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。 它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的
中间层。 Servlet是位于Web 服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Servlet的Java虚拟机。在传统的CGI中,每个请求都要启动一个新的进程,如果CGI程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在Servlet中,每个请求由一个轻量级的Java线程处理(而不是重量级的操作系统进程,在未来的技术发展过程中,Servlet有可能彻底取代CGI)。当用户访问这样的网页时,Applet被下载到用户计算机上执行,但前提是用户使用的是支持Java的网络浏览器。由于Applet是在用户计算机上执行的,因此它的执行速度是不受网络宽带或者MODEM存取速度的限制,用户可以更好的欣赏网页上Applet产生的多媒体效果。在Java Applet中,可以实现图形绘制、字体和颜色控制、动画和声音的插入、人机交互及网络交流等功能.Applet还提供各种名为抽象窗口工具箱 (Abstract Window Toolkit,AWT)的窗口环境开发工具,但AWT的设计是存在缺陷的,取而代之的Swing技术为Java GUI组建的轻量组建.它们利用用户计算机的GUI元素,可以建立标准的图形用户界面,如窗口、按钮、滚动条等。目前,在网络上有非常多的Applet范例来生动地展现这些功能。)
TLD(标签描述符tag library descriptor)文件对于自定义标签处理程序,就像web部署描述符对于servlet一样。
我们使用TagSupport实现类(或BodyTagSupport),包括IterationTag
接口和Tag接口中的所有方法,实际应用中只需重写doStartTag()方法和doEndTag()方法即可。
第二篇:jsp自我总结
参考servlet中的接口:
request.getScheme(); 返回的协议名称,默认是http
request.getServerName() 返回的是你浏览器中显示的主机名,你自己试一下就知道了 getServerPort() 获取服务器端口号
request.getContextPath()应该是得到项目的名字,如果项目为根目录,则得到一个"",即空的字条串。如果项目为abc, <%=request.getContextPath()% > 将得到abc,服务器端的路径则会自动加上,<a href="XXXX.jsp"> 是指当前路径下的这个xxx.jsp页面,有时候也可以在head里设置html:base来解决路径的问题,不过用的最多的还是request.getContextPath。 在js文件中得到request.getContextPath()的值,不想在JSP中写太多的Javascript代码: 一种方法是用
hidden: <input type=hidden name=contextPath value=<%= request.getContextPath()> 再就是在本页面的js里面也是可以使用Scriptlet来赋值的: var a = '<%=
request.getContextPath()>' 或者你赋值给一个hidden的控件都是可以的,然后js取,这样js可以不用写在jsp里
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", -10);
HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。
普通报头中的Cache-Control用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。
请求时的缓存指令包括:no-cache(用于指示请示或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。
例:为了指示IE浏览器(客户端)不要缓存页面,服务器端的jsp程序可以编写如下: response.setHeader(“Cache-Control”, “no-cache”);
//response.setHeader(“Pragma”, “no-cache”);作用相当于上行代码,通常两者合用
Expires实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)的页
面,我们可以使用Expires实体报头域指定页面过期时间。例:Expires:Thu,15 Sep 20xx 16:23:12 GMT
HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。如:为了让浏览器不要缓存页面,也可以利用Expires实体报关域,设置为0,jsp程序如下:
response.setDateHeader(“Expires”, “0”);
System.out.println("Protocol: " + request.getProtocol());
System.out.println("Scheme: " + request.getScheme());
System.out.println("Server Name: " + request.getServerName() ); //获得服务器的名字 System.out.println("Server Port: " + request.getServerPort()); //获得服务器的端口号 System.out.println("rotocol: " + request.getProtocol());
System.out.println("Server Info: " + getServletConfig().getServletContext().getServerInfo()); System.out.println("Remote Addr: " + request.getRemoteAddr()); /获得客户端的ip地址 System.out.println("Remote Host: " + request.getRemoteHost()); //获得客户端电脑的名字,若失败,则返回客户端电脑的ip地址
System.out.println("Character Encoding: " + request.getCharacterEncoding());
System.out.println("Content Length: " + request.getContentLength());
System.out.println("Content Type: "+ request.getContentType());
System.out.println("Auth Type: " + request.getAuthType());
System.out.println("HTTP Method: " + request.getMethod()); //获得客户端向服务器端传送数据的方法有get、post、put等类型
System.out.println("ath Info: " + request.getPathInfo());
System.out.println("ath Trans: " + request.getPathTranslated());
System.out.println("Query String: " + request.getQueryString());
System.out.println("Remote User: " + request.getRemoteUser());
System.out.println("Session Id: " + request.getRequestedSessionId());
System.out.println("Request URI: " + request.getRequestURI());//获得发出请求字符串的客户端地址
System.out.println("Servlet Path: " + request.getServletPath()); //获得客户端所请求的脚本文件的文件路径
System.out.println(request.getHeaderNames()); //返回所有request header的名字,结果集是一个enumeration(枚举)类的实例
System.out.println("Accept: " + request.getHeader("Accept"));
System.out.println("Host: " + request.getHeader("Host"));
System.out.println("Referer : " + request.getHeader("Referer"));
System.out.println("Accept-Language : " + request.getHeader("Accept-Language"));
System.out.println("Accept-Encoding : " + request.getHeader("Accept-Encoding"));
System.out.println("User-Agent : " + request.getHeader("User-Agent")); //返回客户端浏览器的
版本号、类型
System.out.println("Connection : " + request.getHeader("Connection")); System.out.println("Cookie : " + request.getHeader("Cookie"));
System.out.println("Created : " + session.getCreationTime());
System.out.println("LastAccessed : " + session.getLastAccessedTime()); 假定你的web application 名称为news,你在浏览器中输入请求路径: http://localhost:8080/news/main/list.jsp
则执行下面向行代码后打印出如下结果:
1、 System.out.println(request.getContextPath()); 打印结果:/news
2、System.out.println(request.getServletPath()); 打印结果:/main/list.jsp
3、 System.out.println(request.getRequestURI()); 打印结果:/news/main/list.jsp
4、 System.out.println(request.getRealPath("/"));
打印结果: F:/Tomcat 6.0/webapps/news/test