JSP 的概述
概念
JSP 是 Java Server Pages 的简称,跟 Servlet 一样可以动态生成 HTML 响应, JSP 文件命名为 xxx.jsp。
与 Servlet 不同,JSP 文件以 HTML 标记为主,然后内嵌 Java 代码段,用于处理动态内容。
示例:
<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello Time</title>
</head>
<body>
现在的时间是:<%= new Date()%>
</body>
</html>
JSP 与 Servlet 的关系
- JSP 在静态 HTML 内容中嵌入 Java 代码,Java 代码被动态执行后生成 HTML 内容;Servlet 在 Java 代码中通过 >HttpServletResponse 对象动态输出 HTML 内容。
- JSP 经编译后就变成了 Servlet。JSP 的本质就是 Servlet,JVM 只能识别 Java 的类,不能识别 JSP 的代码,Web 容器将 JSP 的代码编译成 JVM 能够识别的 Java 类。
- JSP 更擅长表现于页面显示,servlet 更擅长于逻辑控制。
- Web 浏览器发送 HTTP 请求到服务端,被 Servlet 获取并进行处理(例如参数解析、请求转发);Servlet 调用核心业务逻辑获得处理结果;Servlet 将逻辑处理结果交给 JSP,动态输出 HTML 内容;动态生成的 HTML 内容返回到浏览器显示。
JSP 的语法
JSP 语法结构
声明区,程序代码区,表达式,注释,指令和动作,内置对象
声明区
基本语法:<%! %>
可以定义全局变量、方法、类。
<%!
int i;
public void setName(){
...
}
%>
程序代码区
基本语法:<% 程序代码区 %>
可以定义局部变量以及放入任何的Java程序代码。
<%
int j;
for (int k=0; k<10; k++) {
...
}
%>
表达式
基本语法:<%= %>
可以输出一个变量或一个具体内容,但 = 后面必须是字符串变量或者可以被转换成字符串的表达式。
不需要以 ; 结束,因为只有一行。
<%= "hello world" %>
<%= i+1 %>
注释
注释的内容不会被执行。
<!-- HTML 文件的注释,浏览器可以查看到 -->
<%-- JSP 文件的注释,浏览器看不到 --%>
<%
// Java 语言中的单行注释,浏览器看不到
/*
Java 语言中的多行注释,
浏览器看不到
*/
%>
指令和动作
指令格式:<%@指令 属性=“属性值” %>
指令的属性可以设定多个。
JSP常用指令有:page、taglib、include。
- page 指令
用于导包和设置一些页面属性,常用属性如下:
- import 导入相应的包,唯一允许在同一文档中多次出现的属性
- contentType 设置 Content-Type 响应报头,标明即将发送到浏览器的文档类型
- pageEncoding 设置页面的编码
- language 指定页面使用的语言
- session 控制页面是否参与 HTTP 会话
- errorPage 处理当前页面中抛出但未被捕获的任何异常
- isErrorPage 当前页是否可以作为其他页面的错误处理页面
- taglib 指令
用来扩展 JSP 程序的标签元素,引入其他功能的标签库文件。
<!-- prefix 属性用于指定库前缀 -->
<!-- uri 属性用于指定库的标识 -->
<%@taglib uri="tagLibary" prefix="prefix" %>
<!-- 引入第三方的标签库 -->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- include 指令
用于引入另一个 JSP 程序或 HTML 文件等。
JSP 引擎会在 JSP 文件的转换时期先把 file 属性设定的文件包含进来,然后开始执行转换及编译的工作。
<%@include file="被包含的文件地址" %>
jsp:include
jsp:include 动作用于引入另一个 JSP 程序或 HTML 文件等。
执行到 include 时,被 include 的文件才会被编译。
如果 include 的是 jsp 文件,那它暂时不会被转换成 Servlet 文件。
<jsp:include page="URLSpec" flush="true"/>
<jsp:include page="URLSpec" flush="true">
<jsp:param name="key" value="value"/>
</jsp:include>
include 指令和 jsp:include 动作的区别
include 指令是在 JSP 程序的转换时期就将 file 属性所指定的程序内容嵌入再编译执行(静态包含)。
jsp:include 动作在转换时期是不会被编译的,只有在客户端请求时期被执行到才会被动态的编译载入(动态包含,推荐)。
jsp:forward
jsp:forward 动作用于在 JSP 中实现转发,将请求转发到另一个指定的 JSP 程序或者 Servlet 中处理。
<jsp:forward page="urlSpec" flush="true"/>
<jsp:forward page="urlSpec">
<!-- 用于指定参数和其对应的值 -->
<jsp:param name="key" value="value"/>
</jsp:forward>
JSP 内置对象
基本概念
在 JSP 程序中有 9 个内置对象由容器为用户进行实例化,程序员可以不用定义就直接使用这些变量。
在 JSP 转换成 Servlet 后,会自动追加这些变量的定义,使用内置对象可以简化 JSP 的开发。
-
out 内置对象
该对象类型是 JSPWriter。
该对象是一个缓冲的输出流,用来给客户端输出信息。
方法声明 | 功能介绍 |
---|---|
void println(String x) | 向客户端输出各种类型数据 |
void newLine() | 输出一个换行符 |
void close() | 关闭输出流 |
int getBufferSize() | 返回缓冲区的大小 |
int getRemaining() | 返回缓冲区中未使用的字节数 |
void flush() | 输出缓冲区里的数据 |
void clearBuffer() | 清除缓冲区里的数据,同时把数据输出到客户端 |
void clear() | 清除缓冲区里的数据,但不把数据输出到客户端 |
-
request 内置对象
该对象封装的是调用 JSP 页面的请求信息,它是 HttpServletRequest 接口的一个实例。
该对象的属性值只在一个请求中保存。
方法声明 | 功能介绍 |
---|---|
String getMethod() | 返回客户端向服务器端传送数据的方式 |
String getParameter(String name) | 返回客户端向服务器端传送的参数值 |
String[] getParameterValues(String name) | 获得指定参数的所有值 |
String getRequestURI() | 获得请求地址 |
String getRemoteAddr() | 返回发送请求的客户端或最后一个代理的 IP 地址 |
int getRemotePort() | 返回发送请求的客户端或最后一个代理的端口号 |
String getServerName() | 获取服务器的名字 |
int getServerPort() | 获取服务器端的端口 |
void setAttribute(String name, Object o) | 在此请求中存储属性。属性在请求之间重置 |
Object getAttribute(String name) | 将指定属性的值作为对象返回,若不存在则返回空值 |
-
response 内置对象
该对象作用是响应信息,用于给客户端输出相应的处理结果,它是 HttpServletResponse 接口的一个实例。
该对象经常用于设置 HTTP 标题,添加 cookie、设置响应内容的类型和状态、发送 HTTP 重定向和编码 URL。
方法声明 | 功能介绍 |
---|---|
void addCookie(Cookie cookie) | 添加一个 Cookie 对象,用于在客户端保存特定的信息 |
void addHeader(String name, String value) | 添加 HTTP 头信息,该 Header 信息将发送到客户端 |
boolean containsHeader(String name) | 判断指定名字的 HTTP 文件头是否存在 |
void sendRedirect(String location) | 重定向 JSP 文件 |
void setContentType(String type) | 设置类型与编码方式 |
-
session 内置对象
该对象表示浏览器和服务器之间的一次会话;一次会话可以包含多次请求,在多次请求之间可以借助 session 对象存储信息,它是 HttpSession 类型的一个实例。
该对象的属性值在一次会话范围中保存,保存在服务器端,只要不关闭浏览器,默认半个小时内都可以访问。
方法声明 | 功能介绍 |
---|---|
void setAttribute(String name, Object value) | 使用指定的名称将对象绑定到此会话 |
Object getAttribute(String name) | 返回在此会话中用指定名称绑定的对象,如果没有对象在该名称下绑定则返回空值 |
-
application 内置对象
该对象代表全局上下文,是一个 web 程序的全局变量,它是 ServletContext 类型的一个实例。
该对象在整个服务器上保存数据,所有用户共享。
方法声明 | 功能介绍 |
---|---|
void setAttribute(String name, Object object) | 将对象绑定到此 servlet 上下文中的给定属性名 |
Object getAttribute(String name) | 返回给定名称的 servlet 容器属性,若没有该名称的属性返回 null |
-
pageContext 内置对象
该对象表示 JSP 页面上下文,是 PageContext 类型的对象,可以使用这个对象来管理其他的隐含对象。
该对象只在一个页面中保存数据。
方法声明 | 功能介绍 |
---|---|
void setAttribute(String name, Object value, int scope) | 使用适当的作用域设置指定的名称和值 |
Object getAttribute(String name, int scope) | 返回指定作用域中名称关联的对象,若找不到则返回 null |
ServletRequest getRequest() | 获取请求对象 |
ServletResponse getResponse() | 获取响应对象 |
HttpSession getSession() | 获取会话对象 |
ServletConfig getServletConfig() | 获取配置对象 |
JspWriter getOut() | 获取输出对象 |
Object getPage() | 获取页面对象 |
Exception getException() | 获取异常对象 |
-
page 内置对象
该对象的类型是 Object。
该对象是 JSP 页面本身。
-
config 内置对象
该对象的类型是 ServletConfig。
该对象是 Servlet 配置对象。
-
exception 内置对象
该对象是 Throwable 的实例,表示的是 JSP 的异常信息,作用是捕获网页异常。
如果要使用它,必须将跳转的错误页面(如 error.jsp)的 page 指令的 isErrorPage 属性设置成 true。
单个页面的处理方式:
<%@page errorPage="error.jsp" %>
在 web.xml 中配置统一的异常处理页面:
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error.jsp</location>
</error-page>
JavaBean 组件
基本概念
JavaBean 是使用 Java 语言开发的一个可重用的组件,在 JSP 开发中可以使用 JavaBean 减少重复代码,使整个 JSP 代码的开发更加简洁。
JavaBean 本质上就是 Java 类,通常要求如下:
属性 - 全部私有化,通过 get 和 set 方法进行访问。
方法 - 必须是 public 关键字修饰。
构造器 - 必须有无参构造方法。
使用方式
使用 jsp:useBean 的方式创建 javaBean 实例;保存范围有 page|request|sessin|application,默认为 page 范围。
<jsp:useBean id="对象名" scope="保存范围" class="包名.类名" />
使用 jsp:setProperty 的方式设置 javaBean 的属性值。
<jsp:setProperty name="对象名" property="属性名" value="属性值" param="参数名"/>
使用 jsp:getProperty 的方式获取 javaBean 的属性值。
<jsp:getProperty name="对象名" property="属性名"/>
保存范围
JavaBean 的保存范围有 page、request、session 以及 application,默认是 page 范围。
删除方式
<%
内置对象.removeAttribute(“JavaBean 的名字”);
%>
MVC 设计模式
基本概念
MVC 是模型(Model)和视图(View)以及控制器(Controller)的简写,是一种将数据、界面显示和业务逻辑进行分离的组织方式,这样在改进界面及用户交互时,不需要重新编写业务逻辑,从而提高了代码的可维护性。
M:主要用于封装业务数据的 JavaBean(Bean) 和 业务逻辑的 JavaBean(Service) 及访问数据库的 DAO 对象。
V:主要负责数据收集和数据展现,通常由 JSP 文件完成。
C:主要负责流程控制和页面跳转,通常由 Servlet 完成。
基本模型
- 浏览器发起请求;
- Servlet 接受处理请求,通过 JavaBean 封装业务数据和业务逻辑;
- Servlet 通过 Dao 对象来访问数据库,数据库把数据以 JavaBean 的形式发给 Servlet;
- Servlet 对数据进行业务逻辑处理并将结果发给 JSP;
- JSP 动态输出 HTML 页面到浏览器。
网友评论