一.JSP简介
JSP是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中的要
动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态HTML页面的方式编写
JSP 页面的文件扩展名必须为.jsp
在JSP页面中编写的Java代码需要嵌套在<%和%>中,嵌套在<%和%>之间的Java代码被称之为脚本片段(Scriptlets),
没有嵌套在<%和%>之间的内容被称之为JSP的模版元素
JSP中的Java代码可以使用out.println语句将其他Java程序代码产生的结果字符串输出给客户端,也可以使用
System.out.println语句将它们打印到命令行窗口。
在JSP页面中也可以使用一种称之为JSP表达式的元素,只需将要输出的变量或表达式直接封装在<%= 和 %>之中,
就可以向客户端输出这个变量或表达式的运算结果。在JSP表达式中嵌套的变量或表达式后面不能有分号。
二.JSP运行原理
•WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。
•每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet
的class类文件,然后再 由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP
页面翻译成的Servlet程序。
•JSP规范也没有明确要求JSP中的脚本程序代码必须采用Java语言,JSP中的脚本程序代码可以采用Java语言之外的其他
脚本语言来编写,但是,JSP页面最终必须转换成Java Servlet程序。
•可以在WEB应用程序正式发布之前,将其中的所有JSP页面预先编译成Servlet程序。
从上得出:JSP本质上是一个Servlet,看源代码更能理解
若项目发布在tomcat中,可以到tomcat的work文件-->Catalina-->localhost-->项目名-->jsp-->org
-->apache-->jsp下找到jspname_jsp.java和jspname_jsp.class
Jsp与Servlet的关系
1、 JSP文件必须在JSP服务器内运行。
2、 JSP文件必须生成Servlet才能执行。
3、 每个JSP页面的第一个访问者速度很慢,因为必须等待JSP编译成Servlet。
4、 JSP页面的访问者无须安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面。
5、 JSP页面的静态内容、JSP脚本都会转换成Servlet的xxxService()方法,类似于自行创建Servlet时service()方法。
6、 JSP声明部分,转换成Servlet的成员部分。所有JSP声明部分可以使用private,protected,public,static等修饰符,其他地方则不行。
7、 JSP的输出表达式(<%= ..%>部分),输出表达式会转换成Servlet的xxxService()方法里的输出语句。
8、 九个内置对象要么是xxxService()方法的形参,要么是该方法的局部变量,所以九个内置对象只能在JSP脚本和输出表达式中使用。
三.JSP九个内置对象
在以下每个jspname_jsp.java中_jspService方法中声明这九个内置对象,所以JSP页面才能在不声明该对象的情况下在<% %>中使用他们
1 public void _jspService(HttpServletRequest request, HttpServletResponse response) 2 throws java.io.IOException, ServletException { 3 4 PageContext pageContext = null;//页面上下文,很重要,可以获取页面的一切信息,可以获取其他八个隐藏对象 5 HttpSession session = null;//代表浏览器和服务器的一次会话 6 ServletContext application = null;//代表当前web应用,能获取web应用的初始化参数 7 ServletConfig config = null;//代表当前JSP对应的servlet的对象,几乎不使用,因为需要为该JSP配置初始化参数 8 JspWriter out = null;//JspWriter对象,常调用out.println()方法,将字符串打印到浏览器,eg out.println("<br/>")换行 9 Object page = this;//指向当前JSP对应的Servlet对象的应用,但为Object类型,只能调用Object的方法,几乎不用 10 JspWriter _jspx_out = null; 11 PageContext _jspx_page_context = null; 12 13 ... ... 14 Throwable exception = 15 org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request); 16 if (exception != null) { 17 response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 18 //exception只有在声明了page指令的isErrorPage=true时,才能使用,如下声明: 19 //在JSP文件首部声明<% page isErrorPage="true" %> 20 }
上面九个内置对象中,以下4个称为域对象
pageContext,request,session,application,他们都有以下属性相关方法:
1.Object getAttribute(String name):获取指定的属性
2.Enumeration getAttributeNames():获取所有的属性的名称组成的Enumeration
3.removeAttribute(String name):移除指定的属性
4.void setAttribute(String name,Object o):设置属性
它们的作用域范围如下:
pageContext:属性的作用范围仅限于当前JSP页面
request:属性的作用范围仅限于同一个请求
session:属性的作用范围仅限于同一次会话,即浏览器从打开到关闭称为一次会话(在此期间会话不失效)
application:属性的作用范围限于当前web应用,最大的属性作用范围,只要在一处设置访问,在各个JSP或Servlet中都可以获取到
四.JSP与Servlet的应用比较
•JSP是一种以产生网页显示内容为中心的WEB开发技术,它可以直接使用模版元素来产生网页文档的内容。
•JSP页面的源文件要比Servlet源文件简单,并且JSP页面的开发过程要比Servlet的开发过程简单得多。
•JSP引擎可以对JSP页面的修改进行检测,并自动重新翻译和编译修改过的JSP文件。
•JSP技术是建立在Servlet技术基础之上的,所有的JSP页面最终都要被转换成Servlet来运行。
•在大型WEB应用程序的开发中,Servlet与JSP经常要混合使用,各司其职,Servlet通常用作控制组件,并处理
一些复杂的后台业务,JSP则作为显示组件。
•一次响应过程可以划分成几个功能模块来协同完成,首先由Servlet完成流程控制和业务处理,并将结果数据存储
在request或session域中,然后将请求转发(forward)到JSP页面,再由JSP页面从request或session域中取出结
果数据并完成响应内容的输出。通过这种方式实现业务逻辑与显示内容的分离,从而将应用程序开发者和网页作者的
工作分离。
五.请求的转发与重定向
1)请求转发
Servlet请求转发实现过程:
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 4 System.out.println("forwardServlet doGet"); 5 //1.在doXxx()中调用HttpServletRequest的getRequestDispatcher(String path),并传入转发地址 6 RequestDispatcher requestDispatcher=request.getRequestDispatcher("testServlet"); 7 //2.调用HttpServletRequest的forward(request,response),进行请求转发 8 requestDispatcher.forward(request, response); 9 }
JSP请求转发实现:
同理
1 <body> 2 <% 3 //请求转发 4 request.getRequestDispatcher("/jsp_result.jsp").forward(request, response); 5 %> 6 </body>
2)重定向
Servlet重定向实现过程:
1 public void doGet(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 4 System.out.println("RedirectServlet doGet"); 5 //在doXxx()中执行请求的重定向,直接调用response.sendRedirect(String path),并传入要重定向的地址 6 response.sendRedirect("testServlet"); 7 }
JSP重定向实现过程:
1 <body> 2 <% 3 //重定向 4 response.sendRedirect("jsp_result.jsp"); 5 %> 6 </body>
3)两者的区别
本质区别是:请求转发只发送一次请求,而重定向则发送两次请求
具体如下
(1)转发:地址栏的请求地址是初次发出请求的地址
重定向:地址栏的请求地址显示为最后重定向的地址
(2)转发:在最终的Servlet中,request对象和中转的那个request是同一个对象
重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象
(3)转发:只能转发给当前web应用的资源
重定向:可以重定向到任何资源
(4)转发:path中/ 代表当前web应用的根目录
重定向:path中/ 代表当前web站点的根目录