一.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站点的根目录

posted on 2015-01-11 09:45  milan's  阅读(247)  评论(0编辑  收藏  举报