每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理。JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet) ,然后按照servlet的调用方式进行调用。
由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
JSP九大隐式对象是:
request
response
config
application
exception
Session
page
out
pageContext
1、out隐式对象:out隐式对象用于向客户端发送文本数据。
out.write("heyley");
response.getWriter().write("hi");
%>
JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
设置page指令的buffer属性关闭了out对象的缓存功能
out对象的缓冲区已满
整个JSP页面结束
同时使用out和response.getwriter()输出数据:
<%out.write("heyley");
response.getWriter().write("hi");
%>
会显示:hiheyley
用JSP实现文件下载:
<%@ page language="java" import="java.util.*,java.io.*,java.net.*" pageEncoding="UTF-8"%><%
String path=application.getRealPath("./images/1.jpg");
File file=new File(path);
InputStream is=new FileInputStream(file);
//response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(file.getName(),"UTF-8"));
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(file.getName(),"UTF-8"));
OutputStream os=response.getOutputStream();
byte buffer[]=new byte[1024];
int len=0;
while((len=is.read(buffer))!=-1){
os.write(buffer,0,len);
}
os.flush();
os.close();
is.close();
%>
String path=application.getRealPath("./images/1.jpg");
File file=new File(path);
InputStream is=new FileInputStream(file);
//response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(file.getName(),"UTF-8"));
response.setHeader("content-disposition", "attachment;filename="+URLEncoder.encode(file.getName(),"UTF-8"));
OutputStream os=response.getOutputStream();
byte buffer[]=new byte[1024];
int len=0;
while((len=is.read(buffer))!=-1){
os.write(buffer,0,len);
}
os.flush();
os.close();
is.close();
%>
注意:之前和之后都不能有空格!!!!!否则会出错!!!!!
2、pageContext作为域对象
pageContext对象的方法
public void setAttribute(java.lang.Stringname,java.lang.Objectvalue)
public java.lang.ObjectgetAttribute(java.lang.Stringname)
public voidremoveAttribute(java.lang.Stringname)
实现浏览器访问次数:
<%
int n;
if(application.getAttribute("much")==null){
application.setAttribute("much","1");
}else{
n=Integer.parseInt(application.getAttribute("much").toString());
n++;
application.setAttribute("much",n+"");
System.out.println(n);
out.print("你是第"+n+"个访问");
}
%>
int n;
if(application.getAttribute("much")==null){
application.setAttribute("much","1");
}else{
n=Integer.parseInt(application.getAttribute("much").toString());
n++;
application.setAttribute("much",n+"");
System.out.println(n);
out.print("你是第"+n+"个访问");
}
%>