文章目录
一、Jsp的九个内置对象
内置对象,指的是在页面不需要获取和创建,
可以直接使用的对象
。
内置/隐含对象 | 类型 | 说明 |
---|---|---|
request | HttpServletRequest | 请求信息(在一起请求中有效) |
response | HttpServletResponse | 响应信息 |
out | JSPWriter | 输出的数据流 |
session | HttpSession | 会话(在整个会话中有效) |
application | ServletContext | 全局的上下文对象(整个应用中有效) |
pageContext | PageContext | JSP页面上下文(仅当前页面有效) |
page | Object | JSP页面本身 |
config | ServletConfig | Servlet配置对象 |
exception | Throwable | 捕获网页异常 |
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文件阶段
。(动态加入)