什么是 JSP
JSP(Java Server Page)是 Java 服务端的页面,所以它是动态的,它是需要经过 JDK 编译后把内容发给客户端去显示,我们都知道,Java 文件编译后会产生一个 class 文件,最终执行的就是这个 class 文件。翻译和编译的过程遵守 Servlet 规范,因此说==JSP 的本质也是 Servlet==;
html 和 jsp 的表头不一样,这个是 JSP 的头<%@ page language=”java” import=”java.util.*” pageEncoding=”gbk”%>
在表头中有编码格式和倒入包等。也是很好区分的,在 jsp 中用<%%>
就可以写 Java 代码了,而 html 没有<%%>
。
简单说,jsp 在后台通过服务器解析为相应的 html,然后在供浏览器识别显示。
为什么要用 JSP
Servlet 生成动态页面比较繁琐,使用 JSP 生成动态页面比较便捷,因为其中的静态内容可以使用 HTML 生成;
JSP 元素
脚本元素可以用来包含任意 Java 代码,格式为:
<%Java代码%>
- 服务器翻译脚本元素时,将把其中 Java 代码直接翻译到
jspService
方法中,如果语法错误,将在浏览器中提示错误;
- 服务器翻译脚本元素时,将把其中 Java 代码直接翻译到
表达式元素用来向页面输出动态内容;格式为:
<%=Java代码%>
- 服务器翻译表达式元素时,将把其中 Java 代码部分的返回值使用 out.write 语句输出
模块元素指 JSP 中静态 HTML 或者 XML 内容
注释元素有三种情况:
- 格式为
<%--JSP注释--%>
;JSP 的注释只有在源代码中可见,翻译时已经忽略; + 在 JSP 中,除了使用 JSP 注释外,还可以使用 HTML 注释,<!--HTML注释-->
,HTML 注释会被返回到客户端,但是不显示到页面中; + JSP 中的 Java 代码部分,可以使用 Java 注释;Java 注释会翻译到.java 文件中,但是编译时忽略;
- 格式为
声明元素:
如果需要在 JSP 文件中定义类的成员变量或方法,可以使用声明元素,格式为
<%! 声明语句%>
1
<%! private String path="WEB-INF"; public void readPropertiesFile(){}>
声明元素被翻译到 Java 类中,而不是_jspService 方法中;
内置对象
内置对象指的是在 JSP 中可以直接使用的对象,不需要声明,直接使用固定的名字使用即可;例如<%=request.getRemoteAddr()%>
中的request
就是内置对象;
jsp 中共有 9 种对象
request
:用户端请求,此请求会包含来自 GET/Post 请求的参数;response
:网页传回用户端的回应。pageContext
:页面的属性是在这里管理session
:与请求有关的回话期application
:Servlet 正在执行的内容out
:用来传递回应的输出config
:servlet 的构架部件pagejsp
网页本身exception
:针对错误的网页。未捕捉的例外
Servlet 和 JSP 的作用
实际应用中,Servlet 是不会用来生成动态页面的,而是会用来接收来自 JSP 的请求,处理请求,然后调跳转到 JSP 页面把结果显示给客户端看;
Servlet 与 JSP 之间的跳转方式
跳转方式一:响应重定向,响应接口中提供了该方法
void sendRedirect(java.lang.String location)
:响应重定向到 location,相当于客户端重新请求 location 所在的资源;第一个 JSP 页面发送请求
request
到Servlet
,Servlet
接收请求后,响应response
重定向到目标 JSP 页面,但是请求并没有传递过来.(重定向相当于是产生一个新的请求)
跳转方式二:请求转发,RequestDispatcher 接口定义了请求转发的方法
forward(ServletRequest request, ServletResponse response)
:将请求转发到服务器上的其他资源,包括其他的 Servlet,JSP 等;- 要使用 forward 方法,需要先获得 RequestDispatcher 对象;请求接口(request)中提供了获得该对象的方法:
RequestDispatcher getRequestDispatcher(java.lang.String path)
:使用 path 返回一个 RequestDispatcher 对象
- 请求转发把请求对象发送到了目标 JSP 页面,因此目标页面可以获得上一个页面的请求对象.
请求属性的使用
如果需要在 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)|通过属性的名字,删除属性;|
可以将数据封装进请求对象中,在前后端传递
例如:后台 Servlet 中将数据保存进 request(请求)中,跳转到前台 JSP 后,JSP 可以用<%=request.getAttribute("name")%>
来获取(直接输出)也可以保存为变量(前提是需要强转,因为获取的是 Object 类型)