jsp详细介绍
⼀.jsp的执⾏过程
⽤户访问jsp页⾯时,jsp的处理过程如下图所⽰:
1.预处理阶段
客户第⼀次请求jsp页⾯时,jsp引擎会将jsp⽂件中的脚本代码(HTML)和代码⽚段(java代码)全部转换为java代码,转换过程⾮常直观:对于HTML⽂本只需要⽤简单的out.println⽅法包裹,对于java脚本只做保留或简单的处理。
2、编译阶段
预处理阶段把jsp⽂件解析为java代码,编译阶段jsp引擎把java代码编译成servlet类⽂件,对于Tomcat,⽣成的class⽂件默认情况下存放在<Tomcat>/work⽬录下。
3、响应阶段
编译后的class对象被加载到容器中,并根据⽤户的请求⽣成HTML格式的响应页⾯返回给客户端。
在执⾏jsp⽹页时,通常分为两个时期:转译时期和请求时期。转译时期jsp页⾯被翻译成Servlet类,然后编译成Class⽂件;⽤户请求时期,servlet类被执⾏,⽣成HTML响应⾄客户端。
4、jsp和servlet的区别
jsp的转译和请求都在在第⼀次访问时进⾏的,所以⽤户在第⼀次访问jsp页⾯时响应时间会⽐较长。在之后的请求中,这些⼯作已经完成,时间延长问题不存在了。在处理后续的访问时jsp和servlet的执⾏速度是⼀样的。
5、容器、jsp容器、jsp引擎
jsp要转译为servlet,但是servlet没有main()⽅法,servlet对象的创建、⽅法的调⽤由web容器来实现。以Tomcat为例,先看⼀下Tomcat的总体结构:
从图中可以看出,Tomcat的核⼼组建是connector和container,container就是容器。容器就是负责管理控制servlet的应⽤程序。图中的jasper就是解析jsp的jsp引擎。Tomcat既是servlet容器⼜是web服务器,也是jsp引擎。
⼆.jsp中如何引⼊jsp
1.第⼀种:jstl  import
<c:import url="inlayingJsp.jsp"></c:import>
2. 第⼆种:jsp include指令(静态引⼊)
include指令告诉容器:复制被包含⽂件汇总的所有内容,再把它粘贴到这个⽂件中。
<%@ include file="inlayingJsp.jsp" %>
3. 第三种:jsp include动作(动态引⼊)
<jsp:include  page="inlayingJsp.jsp" flush="true"/>
静态导⼊和动态导⼊的区别:
静态导⼊代码:<%@ include file="xxx.jsp"%>
动态导⼊代码:<jsp:include page="xxx.jsp" />
1.静态导⼊是将被导⼊页⾯的代码完全融⼊,两个页⾯融合成⼀个整体Servlet;⽽动态导⼊则在Servlet中使⽤include⽅法来引⼊被导⼊页⾯的内容。
2.静态导⼊时被导⼊页⾯的编译指令会起作⽤;⽽动态导⼊时被导⼊页⾯的编译指令则失去作⽤,只是插⼊被导⼊页⾯的body内容。
3.动态包含还可以增加额外的参数。
三、jsp的四个作⽤域和九⼤内置对象
现在我们先来说⼀下四个作⽤域,以便描述各⼤对象都分属于什么作⽤域,下⾯我们就通过⼀张简单的表格来看看各⼤作⽤域的信息共享范围:
第⼀个作⽤域是page,他只在当前页⾯有效,也就是⽤户请求的页⾯有效,当当前页⾯关闭或转到其他页⾯时,page对象将在响应回馈给客户端后释放。
第⼆个作⽤域是request,他在当前请求中有效,request可以通过setAttribute()⽅法实现页⾯中的信息传递,也可以通过forward()⽅法进⾏页⾯间的跳转,需要注意的是request是转发不是重定向,转发相对于浏览器来说是透明的,也就是⽆论页⾯如何跳转,地址栏上显⽰的依旧是最初的地址。
第三个作⽤域是session,他在当前回话中有效。当⼀个台电脑上的同⼀浏览器对服务器进⾏多次访问时,在这多次访问之间传递的信息就是session作⽤域的范围。它从浏览器发出第⼀个HTTP请求即可认为会话开始,但是会话结束的时间是不确定的,因为在浏览器关闭时并不会通知服务器,⼀般Tomcat设置的默认时间为120分钟,也可以通过setMaxInactiveInterval(int)⽅法进⾏设置,或是通过invalidate()⽅法强制结束当前会话。
第四个作⽤域是application,他在所有的应⽤程序中都有效,也就是当服务器开始到服务器结束这段时间,application作⽤域中存储的数据都是有效的,同样可以通过setAttribute赋值和getAttribute取值。
好了,相信现在⼤家已经对四个作⽤域有了⼀定的了解,下⾯我们来说⼀下九⼤内置对象。
内置对象⼀(out):
out 对象⽤于在Web浏览器内输出信息,并且管理应⽤服务器上的输出缓冲区。在使⽤ out 对象输出数据时,可以对数据缓冲区进⾏操作,及时清除缓冲区中的残余数据,为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。其最常⽤的⽅法为print,可在页⾯中显⽰字符串信息。out的作⽤域为page:
<%out.print("Hello"); %>
内置对象⼆(request):
request 对象是 javax.servlet.httpServletRequest类型的对象。该对象代表了客户端的请求信息,主要⽤于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求⽅式以及请求参数等)。request对象的作⽤域为⼀次请求(也就是request作⽤域)。request的常⽤⽅法有getParameter(String name)根据表单组件名称获取页⾯提交数据,getParameterValues(String name)获取⼀组以相同名称命名的表单组件提交的数据,setCharacterEncoding(String charset)在调⽤getParameter()⽅法前进⾏设定,⽤于解决中⽂乱码,getRequestDispatcher(String path)返回⼀个javax.servlet.RequestDispatcher对象,该对象的forward()⽅法⽤于转发请求:
[javascript]
1. <%
2.  Object obj = new Object();
3.      Parameter("uname");
4.      ParameterValues("rid");
5.      request.setCharacterEncoding("UTF-8");
6.      RequestDispatcher("⽬标页⾯").forward(request,response);
7.  %>
<%
Object obj = new Object();
request.setCharacterEncoding("UTF-8");
%>
内置对象三(response):
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作⽤域,它只在JSP页⾯内有效。response的常⽤⽅法有addCookie(Cookie cookie)向客户端添加cookie,serContentType(String type)设置HTTP响应的contentType类
型,setCharacterEncoding(String charset)设置响应所采⽤的字符编码类型,sendRedirect(String location)将请求重新定位到⼀个上,这是地址栏上的地址会改变:
[javascript]
1. <%
2.  response.addCookie(cokkie);
3.  response.setContentType("type");
4.  response.setCharacterEncoding("utf-8");
5.  response.sendRedirect("重新定位的页⾯");
6.  %>
<%
response.addCookie(cokkie);
response.setContentType("type");
response.setCharacterEncoding("utf-8");
response.sendRedirect("重新定位的页⾯");
%>
内置对象四(session):
session 对象是由服务器⾃动创建的与⽤户请求相关的对象。服务器为每个⽤户都⽣成⼀个session对
象,⽤于保存该⽤户的信息,跟踪⽤户的操作状态。session对象内部使⽤Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使⽤对象类型。session的常⽤⽅法有setAttribute(String key,Object value)以key/value的形式将对象保存到session中,getAttribute(String key)通过key值获取session中保存的
value,invalidate()强制session对象失效,getId()获取sessionid,setMaxInactiveInterval(int interval)设置session的⾮活动时
间,getMaxInactiveInterval()获取session的有效⾮活动时间,removeAttribute(String key)删除session中对应key的value值:
[javascript]
1. <%
2.    Object obj = new Object();
3.    session.setAttribute("key",obj);
4.    Attribute("key");
5.    session.setMaxInactiveInterval(100);
6.    MaxInactiveInterval();
7.    Id();
8.    veAttribute("key");
9.    session.invalidate();
10.    %>
<%
Object obj = new Object();
session.setAttribute("key",obj);
session.setMaxInactiveInterval(100);
session.invalidate();
%>
内置对象五(application):
application 对象可将信息保存在服务器中,直到服务器关闭,否则application对象中保存的信息会在整个应⽤中都有效。与session对象相
jsp页面输出的三种方式⽐,application对象⽣命周期更长,类似于系统的“全局变量”。application常⽤⽅法有setAttribute(String key,Object value)以key/value的形式将对象存储到application中,getAttribute(String key)通过key获取application中存储的对象,getRealPath(String path)返回相对路径的真实路径:
[javascript]
1. <%
2.  Object obj = new Object();
3.  application.setAttribute("key",obj);
4.  Attribute("key");
5.  RealPath("路径名");
6.  %>
<%
Object obj = new Object();
application.setAttribute("key",obj);
%>
内置对象六(pageContext):
pageContext 对象的作⽤是取得任何范围的参数,通过它可以获取 JSP页⾯的out、request、reponse、session、application 等对象。pageContext 对象的创建和初始化都是由容器来完成的,在JSP页⾯中可以直接使⽤ pageContext对象。pageContext的常⽤⽅法有getRequest()获取request对象,getResponse()获取response对象,getSession()获得session对象,getOut()获取out对象,setAttribute(String key,Object value)保存属
性,getAttribute(String key)获取属性,include("url")请求指定的资源,并且将⽬标资源的响应结果包含在调⽤页⾯的响应中:
[javascript]
1. <%
2.    Object obj = new Object();
3.    Request();
4.    Response();
5.    Session();
6.    Out();
7.    pageContext.setAttribute("key",obj);
8.    Attribute("key");
9.    pageContext.include("资源地址");
10.    %>

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。