JSP即Java Server Pages,是以Java语言为基础的动态网页开发技术
1.优点:解决了servlet不适合向外响应一个完整的页面,又解决了html无法展示动态数据的问题;
2.内部原理:JSP在第一次访问时,会被翻译成一个servlet,对JSP访问后看到的页面其实就是翻译后的servlet
jsp生命周期【jsp两次编译】
jsp执行原理
当一个JSP页面第一次被访问的时候,JSP引擎将执行以下步骤:
1、将JSP页面翻译成一个Servlet,这个Servlet是一个java文件,同时是一个完整的java程序
2、JSP引擎调用java编译器对这个Servlet进行编译,得到可执行文件class
3、JSP引擎调用java虚拟机来解释执行class文件,生成向客户端发送的应答,然后发送给客户端
以上三个步骤仅仅在JSP页面第一次被访问时才会执行,以后的访问速度会因为class文件已经生成而大大提高。
当JSP引擎街道一个客户端的访问请求时,首先判断请求的JSP页面是否比对应的Servlet新,如果新,对应的JSP需要重新编译。
3大页面指令
位置: 可以写在JSP页面的任意位置
格式: <%@ 指令名称 若干属性声明%>
page指令 --用来声明当前JSP页面的基本属性
include用于实现页面静态包含
taglib用于导入tld自定义标签库
JSP四大作用域
1、page,他只在当前页面有效,也就是用户请求的页面有效,当当前页面关闭或转到其他页面时,page对象将在响应回馈给客户端后释放
2、request,他在当前请求中有效,request可以通过setAttribute()方法实现页面中的信息传递,也可以通过forward()方法进行页面间的跳转,需要注意的是request是转发不是重定向,转发相对于浏览器来说是透明的,也就是无论页面如何跳转,地址栏上显示的依旧是最初的地址
3、session,他在当前回话中有效。当一个台电脑上的同一浏览器对服务器进行多次访问时,在这多次访问之间传递的信息就是session作用域的范围。它从浏览器发出第一个HTTP请求即可认为会话开始,但是会话结束的时间是不确定的,因为在浏览器关闭时并不会通知服务器,一般Tomcat设置的默认时间为120分钟,也可以通过setMaxInactiveInterval(int)方法进行设置,或是通过invalidate()方法强制结束当前会话
4、application,他在所有的应用程序中都有效,也就是当服务器开始到服务器结束这段时间,application作用域中存储的数据都是有效的,同样可以通过setAttribute赋值和getAttribute取值。
jsp六大动作
jsp:include 在页面被请求的时候引入一个文件
jsp:useBean 寻找或者实例化一个JavaBean
jsp:setProperty 设置JavaBean的属性
jsp:getProperty 输出某个JavaBean的属性
jsp:forward 把请求转到一个新的页面
jsp:plugin 根据浏览器类型为Java插件生成OBJECT或EMBED标记。
动态包含
可以包含静态也可以包含动态<jsp:include>
请求转发
<jsp:forward page="head.jsp"/>
操作javabean
<jsp:useBean>
标签表示用来在JSP页面中创建一个bean实例并指定它的名字以及作用范围。
-
class指定Bean的完整包名,会在指定的scope中进行查找,如果有则重用,如果没有则自动创建
-
type指定将引用该对象变量的类型,会在指定的scope中进行查找,如果有则重用,如果没有则异常InstantiationException
应用applet
<jsp:plugin>
标签表示执行一个applet或Bean,有可能的话还要下载一个Java插件用于执行它。
地址参数
<jsp:include page="ff3.jsp">
<jsp:param name="username" value="bbbc"/> 相当于想request的parameter中添加数据
<jsp:param name="password" value="11111"/>
</jsp:include>
<jsp:forward page="ff3.jsp">
<jsp:param name="username" value="bbbc"/>
<jsp:param name="password" value="11111"/>
</jsp:forward>
jsp九大默认对象
1、request
HttpServletRequest接口类型,用于封装用户请求信息
<body>
<%
Enumeration<String> enumeration=request.getHeaderNames();
while(enumeration.hasMoreElements()){
String name=enumeration.nextElement();
String value=request.getHeader(name); //getDateHeader getIntHeader
out.println(name+"--->"+value+"<br/>");
}
%>
<hr/>
<%
Enumeration<String> enumeration1=request.getParameterNames();
while(enumeration1.hasMoreElements()){
String name=enumeration1.nextElement();
//String value=request.getParameter(name);
String[] values=request.getParameterValues(name);
out.print(name+"-->"+ Arrays.toString(values));
}
%>
<hr/>
<%
Enumeration<String> enumeration2=request.getAttributeNames();
while(enumeration2.hasMoreElements()){
String name=enumeration2.nextElement();
Object value=request.getAttribute(name);
out.println(name+"-->"+value);
}
%>
2、response
HttpServletResponse接口类型,用于封装服务器的响应信息
response.setContentType("text/html;charset=UTF-8"); // MIMIE @page contentType="text/html;charset=utf-8"
response.setHeader("cache-control","no-cache");//避免客户端缓存的解决方案
//response.setStatus(404); //设置响应状态码 1xx 2xx 3xx 4xx 5xx
//response.sendError(500,"报错信息"); 设置报错状态
//response.sendRedirect("http://www.baidu.com");重定向
PrintStream pw=response.getWriter();
ServletOutputStream oos=response.getOutputStream();
3、config
ServletConfig接口类型,用于封装当前页面的配置信息 web.xml
<%
Enumeration<String> enumeration=config.getInitParameterNames();
while(enumeration.hasMoreElements()){
String name=enumeration.nextElement();
String value=config.getInitParameter(name);
out.println(name+"::"+value +"<br/>");
}
%>
4、page
Object类型,用于指代当前jsp页面对象,相当于this,但是注意是Object类型
<%
this.aaa(); //但是如果使用page.aaa()则语法报错
%>
equals
toString
hashcode
getClass
wait
notify/notifyAll
5、out
JspWriter类型,是服务器向客户端输出信息的字符流,也可以通过response进行获取(PrintWriter)
print(object)
println(object) 不等价于在html显示中的换行
close()
flush()
getBufferSize() / getRemaining()
6、exception
Throwable类型,用于封装异常信息
使用的前提:当前页面必须设置<%@ page isErrorPage=”true”%>
才能使用,否则报错
7、session
HttpSession接口类型,用于实现服务器端跟踪用户,一个用户对应一个session对象
-
获取session对象 request.getSession() / getSession(boolean)
-
常用方法
-
setAttribute(String,Object)
-
getAttribute(String):Object
-
removeAttribute(String)
-
getAttributeNames():Enumeration
-
8、application
ServletContext接口类型,是当前应用的上下文对象,可以实现跨用户数据共享
setAttribute(String,Object)
getAttribute(String):Object
removeAttribute(String)
getAttributeNames():Enumeration
9、pageContext
pageContext对象是javax.servlet.jsp.PageContext类的实例对象,用来代表整个JSP页面。它代表页面上下文,该对象主要用于访问 JSP 之间的共享数据,使用pageContext可以访问page、request、session、application范围的变量。JSP页面中只需将pageContext对象传递给某个Java类的实例对象,在该Java对象中就可以访问和调用其他隐式对象的功能了。
JspWriter getOut(); //返回当前客户端响应被使用的JspWriter流(out)
HttpSession getSession(); //返回当前页面中HttpSession对象(session)
Object getPage(); //返回当前页面的Object对象(Object)
ServeletRequest getRequest(); //返回当前页面的ServletRequest对象(request)
ServeletResponse getResponse(); //返回当前页面的ServletResponse对象(response)
getException()返回exception隐式对象
getServletConfig()返回config隐式对象
getServletContext()返回application隐式对象
void setAttribute(String name,Object attribute); //设置属性及属性值
void getAttribute(String name,int scope); //在指定范围内取属性的值
int getAttributeScope(String name); //返回某属性的作用范围
void forward(String relativeUrlPath); //使当前页面重导到另一页面
void include(String relativeUrlPath); //在当前位置包含另一文件
Servlet和JSP的区别
jsp经编译后就变成了Servlet。JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类。Servlet中的内置对象都是必须通过HttpServletRequest对象、HttpServletResponse对象以及HttpServlet对象得到.Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。