Jsp内置对象及标签


一、Jsp的九个内置对象

内置对象,指的是在页面不需要获取和创建,可以直接使用的对象

内置/隐含对象类型说明
requestHttpServletRequest请求信息(在一起请求中有效)
responseHttpServletResponse响应信息
outJSPWriter输出的数据流
sessionHttpSession会话(在整个会话中有效)
applicationServletContext全局的上下文对象(整个应用中有效)
pageContextPageContextJSP页面上下文(仅当前页面有效)
pageObjectJSP页面本身
configServletConfigServlet配置对象
exceptionThrowable捕获网页异常

1.输出流的选择问题

  • out.write()和response.getWriter()类似,都可以将数据输出到页面上。
  • 在tomcat服务器真正给浏览器做出相应之前,会先找response缓冲区的数据,再找out缓冲区的数据。
  • response.getWriter()数据输出永远在out.write()之前

建议在页面中统一使用out.write()来进行输出。如果突然使用response.getWriter(),很可能会打乱布局。

二、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.转发和重定向的区别

①请求次数不同,重定向在第一次请求并获取相应后,再次向一个新地址发送请求。转发是服务器收到请求后为了完成响应在服务器内部转到一个新的地址。
②数据是否共享问题,重定向请求了两次,不共享数据。转发请求了一次,在web组件间数据共享。
③地址栏地址是否改变,重定向后地址栏改变,转发则不改变地址。
④新地址的范围问题,重定向可以是任意新地址,转发的新地址必须是同一个应用内的某个地址。

三、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文件阶段。(动态加入)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hudie.

不要打赏!不要打赏!不要打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值