Jsp内置对象及标签

折月煮酒 提交于 2019-12-20 03:42:27


一、Jsp的九个内置对象

内置/隐含对象 类型 说明
request HttpServletRequest 请求信息(在一起请求中有效)
response HttpServletResponse 响应信息
out JSPWriter 输出的数据流
session HttpSession 会话(在整个会话中有效)
application ServletContext 全局的上下文对象(整个应用中有效)
pageContext PageContext JSP页面上下文(仅当前页面有效)
page Object JSP页面本身
config ServletConfig Servlet配置对象
exception Throwable 捕获网页异常

二、Jsp内置对象源码剖析

任何一个jsp都会翻译成servlet,存储到tomcat的work文件夹中
在这里插入图片描述

而这些内置对象也都是在生成的servlet中自己生成。
在这里插入图片描述

jsp代码 转化为servlet
Jsp声明<%! %> 类的变量或方法
Jsp小脚本<% %> service方法内部的内容、定义变量。
Jsp表达式<%= %> service方法中out.print();

Jsp声明中的变量信息会被当做类属性/变量处理
在这里插入图片描述

三、转发

(1)转发简介

一个Web组件(Servlet/jsp)将未完成的处理通过容器转交给另外一个Web组件继续完成,这个转交的过程叫做转发。
常见情况是Servlet负责获取数据,然后将数据转交给JSP进行展现。

转发代码:

request.getRequestDispatcher(String uri).forward(request,response);

绑定数据到request对象:

request.setAttribute(String name,Object obj);

(2)练习:在servlet中使用request绑定员工信息,转发到Jsp从request中取值展示员工信息

ActionServlet.java

package web;


import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ActionServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//使用request绑定参数
		//转发可以共享数据
		request.setAttribute("id",101);
		request.setAttribute("name","没头脑");
		request.setAttribute("salary",8000);
		request.setAttribute("age",21);
		//转发
		//转发绝对跳转,不用加项目名,因为它只能跳转到项目的内部
		RequestDispatcher dispatcher = request.getRequestDispatcher("list.jsp");
		dispatcher.forward(request,response);
		//重定向
		//重定向跳转绝对路径,不能直接加上"/",必须加上项目名.因为它可以跳转到任何路径.
//		String contextPath = request.getContextPath();
//		response.sendRedirect(contextPath+"index.jsp");
	}
}

list.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  	<meta http-equive="content-tyupe" content="text/html;charset=urf-8">
  </head>
  
  <body>
  <%--获取request绑定的参数 --%>
  	<%
  		Object id = request.getAttribute("id");
  	 	Object name = request.getAttribute("name");
  	 	Object salary = request.getAttribute("salary");
  	 	Object age = request.getAttribute("age");
  	 %>
  	 <%=id %>
  	 <%=name %>
  	 <%=salary %>
  	 <%=age %>
  </body>
</html>

效果演示:
在这里插入图片描述

(3)转发的特点

  • 转发之后地址栏地址不会发生变化,因为转发过程发生在服务器内部的,浏览器并不知道。
  • 转发的目的地必须是同一个应用内部的某个地址,决不能跳出应用
  • 转发过程中涉及到的所有web组件共享同一个request对象和- response对象,数据的传递和共享就依赖request对象。
  • 在forward之后的其他语句还会继续执行,只要不报异常。

(4)重定向和转发图解

在这里插入图片描述

  • 重定向的servlet会带着状态码回到浏览器,让浏览器再次向servlet发送请求。
  • 转发的servlet会发生跳转到list.jsp,这一跳转直接在tomcat中完成,所以地址不变。
//转发
		RequestDispatcher dispatcher = request.getRequestDispatcher("list.jsp");
		dispatcher.forward(request,response);
//重定向
		//response.sendRedirect("index.jsp");错误的
		//正确的,会在/前,自动加上jsp  
		String contextPath = request.getContextPath();
		response.sendRedirect(contextPath+"index.jsp");

注意: 重定向跳转绝对路径,不能直接加上"/",必须加上项目名。因为它可以跳转到任何路径,如果非要加上“/”,那么就加上contextPath。

(5)转发和重定向的区别

  • 重定向是浏览器发送请求并收到响应以后再次向一个新地址发请求;转发是服务器收到请求后为了完成响应转到一个新的地址。
  • 重定向中有两次请求对象,不共享数据;转发只产生一次请求对象且在组件间共享数据。
  • 重定向后地址栏地址改变;而转发则不会。
  • 重定向的新地址可以是任意地址;转发到的新地址必须是同一个应用内的某个地址。

三、Jsp标签

(1)标签简介

标签的作用:简化代码。

标签 作用
<jsp:forward page="/xxx.jsp"></jsp:forward> 用于页面的转发
<jsp:include page =" " flush="true" /> 用于页面的包含(动态包含)
<jsp:param /> 用于带有路径的标签下,传递参数
<jsp:useBean /> 用于在JSP中使用JavaBean
<jsp:setProperty /> 用于在JSP中向JavaBean设置属性的
<jsp:getProperty /> 用于在JSP中获得JavaBean的属性

(2)静态包含

创建三个jsp文件
header.jsp

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

<html>
  <head>
	<meta http-equive="content-type content="text/html;charset=utf-8/>
  </head>
  
  <body>
 		<h1>this is header</h1>

content.jsp

 		<table border="1">
 			<tr><td>1</td><td>2</td><td>3</td></tr>
 			<tr><td>4</td><td>5</td><td>6</td></tr>
 			<tr><td>7</td><td>8</td><td>9</td></tr>
 		</table>

footer.jsp

		<hr/>
 		<h1>copyright:2000-2019</h1>
  </body>
</html>

创建include_static.jsp来演示静态包含

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%--静态包含 --%>
<%@ include file="header.jsp" %>
<%@ include file="content.jsp" %>
<%@ include file="footer.jsp" %>

程序执行如下:
在这里插入图片描述
打开jsp代码转换成的servlet文件
在这里插入图片描述
在这里插入图片描述

(3)动态包含

创建include_dynamic.jsp来演示静态包含

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%-- 动态包含--%>
<jsp:include page="header.jsp"></jsp:include>
<jsp:include page="content.jsp"></jsp:include>
<jsp:include page="footer.jsp"></jsp:include>

程序执行后:
在这里插入图片描述
打开jsp代码转换成的servlet文件:
在这里插入图片描述

(4)动态包含和静态包含的区别

静态包含:<%@ include file="包含页面" %>
动态包含:<jsp:include page=" " flush="true"/>

1.静态包含用于加载进页面显示后就再也不变的东西(页眉页脚,导航栏等)
动态包含用于加载经常变化的、要求显示最新版本内容的东西(对数据库实时查询,时间戳等)
2.最终编译成的java文件数目不同
静态包含在转换为java文件时将需要包含的文件内容copy到主体文件,然后作为一个整体编译。最终编译为一个java文件;而动态包含则是各个jsp文件分别转化,分别编译,最终生成多个java文件。
3.执行时间不同
静态包含发生在:jsp--->文件阶段
动态包含发生在:执行class文件阶段。(动态加入)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!