一.JSP简介
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 }
•JSP页面的源文件要比Servlet源文件简单,并且JSP页面的开发过程要比Servlet的开发过程简单得多。
•JSP引擎可以对JSP页面的修改进行检测,并自动重新翻译和编译修改过的JSP文件。
•JSP技术是建立在Servlet技术基础之上的,所有的JSP页面最终都要被转换成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>
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 }
1 <body> 2 <% 3 //重定向 4 response.sendRedirect("jsp_result.jsp"); 5 %> 6 </body>
本质区别是:请求转发只发送一次请求,而重定向则发送两次请求
具体如下
(1)转发:地址栏的请求地址是初次发出请求的地址
重定向:地址栏的请求地址显示为最后重定向的地址
(2)转发:在最终的Servlet中,request对象和中转的那个request是同一个对象
重定向:在最终的Servlet中,request对象和中转的那个request不是同一个对象
(3)转发:只能转发给当前web应用的资源
重定向:可以重定向到任何资源
(4)转发:path中/ 代表当前web应用的根目录
重定向:path中/ 代表当前web站点的根目录