JSP 的概述
概念
JSP 是 Java Server Pages 的简称,跟 Servlet 一样可以动态生成 HTML 响应, JSP 文件命名为 xxx.jsp。
与 Servlet 不同,JSP 文件以 HTML 标记为主,然后内嵌 Java 代码段,用于处理动态内容。
示例
代码语言:javascript复制<%@ 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 语法结构
声明区,程序代码区,表达式,注释,指令和动作,内置对象
声明区
基本语法:<%! %>
可以定义全局变量、方法、类。
代码语言:javascript复制<%!
int i;
public void setName(){
...
}
%>
程序代码区
基本语法:<% 程序代码区 %>
可以定义局部变量以及放入任何的Java程序代码。
代码语言:javascript复制<%
int j;
for (int k=0; k<10; k ) {
...
}
%>
表达式
基本语法:<%= %>
可以输出一个变量或一个具体内容,但 =
后面必须是字符串变量或者可以被转换成字符串的表达式。
不需要以 ;
结束,因为只有一行。
<%= "hello world" %>
<%= i 1 %>
注释
注释的内容不会被执行。
代码语言:javascript复制<!-- HTML 文件的注释,浏览器可以查看到 -->
<%-- JSP 文件的注释,浏览器看不到 --%>
<%
// Java 语言中的单行注释,浏览器看不到
/*
Java 语言中的多行注释,
浏览器看不到
*/
%>
指令和动作
指令格式:<%@指令 属性=“属性值” %>
指令的属性可以设定多个。
JSP常用指令有:page
、taglib
、include
。
page
指令
用于导包和设置一些页面属性,常用属性如下:
import
导入相应的包,惟一允许在同一文档中多次出现的属性contentType
设置 Content-Type 响应报头,标明即将发送到浏览器的文档类型pageEncoding
设置页面的编码language
指定页面使用的语言session
控制页面是否参与 HTTP 会话errorPage
处理当前页面中抛出但未被捕获的任何异常isErrorPage
当前页是否可以作为其他页面的错误处理页面
taglib
指令
用来扩展 JSP 程序的标签元素,引入其他功能的标签库文件。
代码语言:javascript复制<!-- prefix 属性用于指定库前缀 -->
<!-- uri 属性用于指定库的标识 -->
<%@taglib uri="tagLibary" prefix="prefix" %>
<!-- 引入第三方的标签库 -->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
include
指令
用于引入另一个 JSP 程序或 HTML 文件等。
JSP 引擎会在 JSP 文件的转换时期先把 file 属性设定的文件包含进来,然后开始执行转换及编译的工作。
代码语言:javascript复制<%@include file="被包含的文件地址" %>
jsp:include
jsp:include
动作用于引入另一个 JSP 程序或 HTML 文件等。
执行到 include 时,被 include 的文件才会被编译。
如果 include 的是 jsp 文件,那它暂时不会被转换成 Servlet 文件。
代码语言:javascript复制<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)
返回指定作用域中名称关联的对象,若找不到则返回 nullServletRequest 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。
单个页面的处理方式:
代码语言:javascript复制<%@page errorPage="error.jsp" %>
在 web.xml 中配置统一的异常处理页面:
代码语言:javascript复制<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 范围。
删除方式
代码语言:javascript复制<%
内置对象.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 页面到浏览器。