目录
- 概述
- 页面元素及内置对象的概念
- Servlet 与 JSP 作用总结
- 登录案例
一、概述内容
1.1 动态网页的执行原理
- 使用 Servlet 生成动态网页,任何网页的内容都可以通过 out.priintln() 一行一行的实现
- 执行步骤:
- 容器初始化 Servlet实例。根据网页相对应的请求方法,调用与之对应的 doXXX 方法,并初始化请求和响应对象,作为 doXXX 方法的参数使用
- 执行 doXXX 方法后,将响应对象的数据流写到客户端
- 游览器将收到的数据进行解析,显示给用户
问题提出?
Servlet 生成动态页面太麻烦了,其实大部分静态内容都是一行一行的输出
解决方案:
Java EE 提供了新的动态页面组件 JSP,可以更加便捷的生成动态网页
1.2 JSP 功能与特性
1.2-1 JSP 功能与特性
- JSP (Java Server Page)是 JavaEE 规范中的 Web 组件,用来编写动态页面
- JSP 运行在服务端,本质是 Servlet
- JSP 文件以 .jsp 为后缀,存放在项目下的 WebContent 目录下
- JSP 文件游览器可以直接访问
- JSP 文件的内容是 HTML + Java 代码,静态部分使用 HTML 和 文本即可,动态部分使用 Java 代码
1.2-2 JSP 功能与特性
一个标准的 JSP 页面如下
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!--前面两行是 Java 代码能够写在 HTML 中的特定格式,也是 JSP 中的指令格式。这里是 JSP 的指令格式 -->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
这里就是 JSP 的静态文本结构,比Servlet 简单多
<% System.out.println("Hello World")%> <!--这里是专门写 Java 代码的地方,用于实现 HTML 不方便实现的功能,但是 JavaScript同样也可以实现 -->
</body>
</html>
特别强调,在 JSP 中, 动态部分是写 Java 代码为主<%%> 为脚本片段,<%=%> 为输出表达式
1.3 JSP 的执行流程解析
JSP 的执行流程主要分为三个部分:
首先我们编写好了一个 index.jsp 文件是打开游览器运行,这时候进行了如下过程
- Web 服务器找到了 index.jsp,然后会对其进行翻译,生成 index_jsp.java 文件,然后进入工作空间
\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost
- 编译、服务器(tomcat服务器) 会将 index_jsp.java 编译成 class 文件(类文件),翻译和编译过程遵守 Servlet规范,因此说 JSP 的本质也是 Servlet
- 运行:实例化并提供服务:服务器实例化类,调用类中的_jspService方法提供服务
我们可以在 生成的 index_jsp.java 文件中下的 _jspService 文件下可以看到一行行我们在 HTML 中编写的代码,全部都在这个文件中变成了 out.println(xxx)。静态内容都是用 out 输出,和 Servlet中输出的是一样的,而且
所有的 Java代码都直接翻译到相对应的位置。
总结一句话,JSP 的本质就是一个 Servlet,不过是服务器翻译生成了 Java 类,不用我们编写而已。但是也并不是 Servlet 没有任何用了,它还可以用来写一些后台逻辑等问题
提问 与 总结
- 为什么要用 JSP 组件?
答:Servlet 生成动态页面比较繁琐,使用 JSP生成动态页面比较便捷,其中静态内容可以使用 HTML 生成
- JSP 执行的流程是什么?
答:JSP 的执行过程 翻译—>编译—>实例化—>提供服务
JSP 的本质就是 Servlet,不过服务器是将 JSP 进行了翻译和编译,可以说 JSP 也是Java 类
二、页面元素及内置对象概念
知识点:
- 脚本元素
- 表达式元素
- 模板元素
- 声明元素
- 内置对象概念
2.1 脚本元素
- 脚本元素可以包含 Java 代码
- 基本格式: <%Java代码%>
<%System.out.println("我是脚本元素")%>
- 服务器翻译脚本元素的时候,将其中的 java 代码直接翻译到 _jspService中,如果语法错误,游览器就会显示对应的错误
2.2 表达式元素
- 表达式元素用来向叶面输出动态内容
- 格式为:<%=Java代码%>,例如
<%=request.getRemoteAddr() %> 获取当前的端口
- 服务器翻译表达式元素时,将把其中Java代码部分的返回值使用out.write语句输出,例如:
out.write("您的IP地址:");
out.print(request.getRemoteAddr() );
2.3 模板元素
- 模板元素指 JSP 中静态 HTML 或者 XML 内容;
- 在 JSP 中可以使用注释元素,有三种情况
- 格式为 <%-- JSP --%>,JSP的注释只有在源代码中可见,翻译时已忽略
- 在 JSP 中,除了使用 JSP 注释外,还可以使用 HTML 注释 <!-- HTML 注释 – >(这里直接打 HTML 注释会被隐藏) ,HTML 注释会被返回到客户端,但是不会显示到页面中
- JSP 中的 Java 代码部分,可以使用 Java 注释;Java 注释会翻译到.java 文件中,但是编译时忽略
2.4 声明元素
- 需要在 JSP 文件中定义类的成员变量或者方法,可以使用声明元素
- 格式: <%! 声明语句 %>
- 声明元素被翻译到 Java类中,而不是 jspService 中
eg:比如我写一个比较大小的函数
<%!
private String path="WEB-INF";
public void readPropertiesFile(){
}
public int max(int x,int y)
{
return a>b?a:b;
}
%>
这样在 jsp 其他页面中就可以直接通过方法名调用我们写的方法
2.5 内置对象的概念
- 内置对象指的是在 JSP 中可以直接使用的对象,不需要申明,直接使用固定的名字即可
比如:
<%=request.getRemoteAddr()%>中的 request 就是内置对象
问题1:不用声明,对象从哪里来的?
答1:服务器在翻译编译 JSP 时默认声明创建的,都在 JSPService 方法的参数和方法体内。
问题2:为什么可以直接使用呢(直接使用 request 方法)?
答2:我们所编写的 JSP 的所有内容,都被服务器翻译在内置对象声明创建后,因此可以直接用
问题3:有哪些内置对象?
答3:有 9个,比如 request、response、out、session等等。查看 JSP 翻译成的 Java 文件就很清楚了
2.6 总结及提问 【页面元素及内置对象】
- 脚本元素、表达式元素的作用是什么?
- 有几种注释? (三种)
- 声明元素有什么不同?
- 内置对象时是什么意思?如何使用?
问题一:
JSP 中的 Java 代码都可以直接写到脚本元素 <%%> 中
如果要向游览器输出动态内容,可以使用表达式元素 <%=%>
问题二:
JSP中有三种注释,分别是JSP注释、HTML注释、Java注释;
问题三:
<%!%>声明元素只能用来编写声明代码,翻译到Java类中,而不是_jspService方法中;
问题四:
内置对象指的是服务器已经声明并赋值的对象,可以直接使用
第三节 Servlet 与 JSP 的作用
- Servlet与JSP的作用总结
- Servlet与JSP之间跳转的方式
- 请求属性的使用
3.1 Servlet 与 JSP 作用总结
- Servlet 和 JSP 都可以生成动态页面,然而 JSP 中静态页面可以直接使用 HTML 来编写,动态部分通过 java 语言编写即可
- Servlet 一般不会用来生成动摇页面,而是会用来接收来自 JSP 的请求,处理请求,然后跳转到 JSP 页面吧结果显示给客户端看
3.2 Servlet 与 JSP 之间的跳转方式
跳转方式一:响应重定向
方法声明 | 方法描述 |
---|---|
void sendRedirect(java.lang.String location) | 响应重定向到location,相当于客户端重新请求location所在的资源; |
请求转发后,页面会重新加载到 显示的 jsp 页面
跳转方式二:请求转发
方法声明 | 方法描述 |
---|---|
forward(ServletRequest request, ServletResponse response) | 响应重定向到location,相当于客户端重新请求location所在的资源; |
- 要使用 forward 方法,需要现货的 RequestDispatcher 对象,请求接口中提供了获得该对象的方法
方法声明 | 方法描述 |
---|---|
RequestDispatcher getRequestDispatcher(java.lang.String path) | |
使用path返回一个RequestDispatcher 对象 | |
3.3 请求属性的使用
- 如果需要在Servlet,JSP之间跳转时,同时把一些自定义的、或者通过数据库查询的、或者调用其他资源获得的数据传递到下一个资源时,就可以把这些数据设置为请求的属性即可。
- 请求接口中定义了一系列与属有关的方法
方法声明 | 方法描述 |
---|---|
void setAttribute(java.lang.String name, java.lang.Object o) | 将任意类型对象设置为请求的属性,指定一个名字; |
java.lang.Object getAttribute(java.lang.String name) | 通过属性的名字,获取属性的值; |
void removeAttribute(java.lang.String name) | 通过属性的名字,删除属性; |
3.4 总结与提问
1. Servlet 与 JSP 分别有什么作用?
- JSP 往往用来生成动态页面, 而Servlet虽然可以生成动态页面却比较麻烦,往往用来接收JSP 请求,处理请求,然后跳转到不同的 JSP 页面进行结果显示
2. Servlet 和 JSP 之间跳转有几种方式,有何区别?
- Servlet 和 JSP 之间的跳转方式有两种,分别是 响应重定向 和 请求转发
- 响应重定向 相当于客户端重新发出请求,之前的请求不再保存; 请求转发是把当前请求转发到下一个资源; 请求转发比较常用
3. 什么是请求属性?和请求参数有啥区别?
- 请求属性可以是任意类型的对相爱过,可以用 setAttribute 方法将对象作为属性存储到请求对象中