39 JSP核心技术

154 阅读8分钟

1 JSP概述

JSP是 Java Server Pages的简称,跟Servlet一样可以动态生成HTML响应,JSP文件命名为xxx.jsp。与Servlet不同的是,JSP文件以HTML标记为主,然后嵌入Java代码段,用于处理动态内容。

JSP实例

<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=utf-8" language="java"%>
<html>
  <head>
    <title>jsp</title>
    <body>
      现在的时间是:<%= new Date()%>
    </body>
  </head>
</html>
  

JSP和Servlet之间的关系如下图

servlet.PNG

2 JSP语法

2.1 JSP语法结构

  • 声明区
  • 程序代码区
  • 表达式
  • 注释
  • 指令和动作
  • 内置对象

2.2 声明区

基本语法:<%! %> 可以定义全局变量、方法和类

声明区实例:

<%! 
  	int i;
		public void setName(){
      
    }
  %>

2.3 程序代码区

基本语法:<% 程序代码区%> 可以定义局部变量以及放入任何的Java程序代码

实例:

<% 
		int j;
		for(int i=0;i<5;i++){
		}
%>

2.4 表达式

基本语法:<%= %> 可以输出一个变量或一个具体内容,但=后面必须是字符串变量或者转换成字符串的表达式,需要特别注意的是不需要以分号结尾,因为只有一行

实例:

<%= "hello world" %>
<%=	i+1%>

2.5 注释

格式:
<!-- --> HTML文件的注释,浏览器可以看到
<%-- --> JSP文件的注释,浏览器看不到
<% // %>Java语言中单行注释,浏览器也看不到
<% /*  */ %>Java语言中多行注释,浏览器看不到
注释的内容是不会执行的

2.6 指令和动作

指令格式:<%@指令 属性="属性值" %> 指令的属性可以设定多个,JSP常用指令有:page 、taglib和include

page指令

page指令用于导包和设置一些页面属性,常用属性如下:

import	导入相应的包,唯一允许在同一个文档中出现多次的属性
contentType	设置ContentType的响应头,标明即将发送到浏览器的文档属性
pageEncoding	设置页面编码
language	指定页面使用的语言
session	控制页面是否参与HTTP会话
errorPage	处理当前页面中抛出的但未被捕获的任何异常
isErrorPage	当前页面是否可以作为其他页面的错误处理页面

taglib指令

taglib指令用来拓展JSP程序的标签元素,引入其他功能的标签库文件

<!-- prefix属性用于指定库前缀 -->
<!-- url属性用于指定库的标识 -->
<%@taglib url="tagLibrary" prefix="prefix"%>

include指令

include指令用于引入另一个JSP程序或HTML文件等,格式:

<%@include file="被包含文件的地址"%>

JSP引擎会在JSP文件转换时期先把file属性设定的文件包含进来,然后执行转换及编译的工作

jsp:include/jsp:param

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指令和include动作的区别是:

  • include指令是在JSP程序的转换时期就将file属性所指定的程序内容嵌入在执行编译(静态包含)
  • include动作在转换时期不会被编译,只有在客户端请求时期被执行才会被动态的编译载入(动态包含,推荐)

jsp:forward/jsp:param

forward动作用于在JSP中实现转发,将请求转发到另一个指定的JSP程序或者Servlet中处理

<jsp:froward page="urlspec" flush="true"/>
<jsp:froward page="urlspec">
  <jsp:param name="key" value="value"/>
</jsp:froward>

3 JSP内置对象

在JSP程序中有9个内置对象,有容器为用户进行实例化,程序员可以不用定义直接使用。在JSP转换为Servlet后,会自动追加这些变量的定义,使用内置对象可以简化JSP的开发

9个内置对象如下:

对象变量对象类型作用
outJSPWriter输出流
requestHttpServletRequest请求信息
responseHttpServletResponse响应信息
sessionHttpSession会话
applicationSercletContext全局上下文对象
pageContextPageContextJSP页面上下文
pageObjectJSP页面本身
configServletConfigServlet配置对象
exceptThrowable捕获网页异常

3.1 out内置对象

out内置对象是一个缓冲的输出流,用来给客户端输出信息,常用方法如下:

方法声明功能介绍
void println(String x)向客户端输出各种类型数据
void newLine()输出一个换行符
void close()关闭输出流
int getBufferSize()返回缓冲区的大小
int getRemaining()返回缓冲区中未使用的字节数
void flush()输出缓冲区的数据
void cleanBuffer()清除缓冲区里的数据,同时把数据输出到客户端
void clean()清楚缓冲区的数据,但不把数据输出到客户端

3.2 request内置对象

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)将指定属性的值作为对象返回,若不存在则返回空值

3.3 response内置对象

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 senndRedirect(String location)重定向JSP文件
void setContentType(String type)设置类型与编码方式

3.4 session内置对象

session对象表示浏览器和服务器之间的一次会话,一次会话可以包含多次请求,在多次请求之间可以借助session对象存储信息,它是HttpSession类型的一个实例。

该对象的属性值再一次会话范围中保存,保存在服务器端,只要不关闭服务器,默认半个小时内都可以访问。常用方法:

方法声明功能介绍
void setAttribute(String name,Object value)使用指定的名称将对象绑定到此会话
Object getAttribute(String name)返回在此会话中用指定名称绑定的对象,如果没有对象在该名称下绑定则返回空值

3.5 application内置对象

application对象是一个web程序的全局变量,它是ServletContext类型的一个实例。在整个服务器上保存数据,所有用户共享。

常用方法:

方法声明功能介绍
void setAttribute(String name,Object value)将对象绑定到次Servlet上下文中的给定属性名
Object getAttribute(String name)返回给定名称的servlet容器属性,若没有该名称的属性返回null

3.6 pageContext内置对象

pageContext对象是PageContext类型的对象,可以使用这个对象来管理其他的隐含对象,注意只在一个页面中保存数据。

常用方法:

方法声明功能介绍
void setAttribute(String name,Object value)使用适当作用域设置指定的名称和值
Object getAttribute(String name,int scope)返回指定作用域中名称关联的对象,若找不到返回null
ServletRequest getRequest()获取请求对象
ServletResponse getResponse()获取响应对象
HttpSession getSession()获取会话对象
ServletConfig getServletConfig()获取配置对象
JspWriter getOut()获取输出对象
Object getPage()获取页面对象
Exception getException()获取异常对象

3.7 exception内置对象

exception对象是Throwable的实例,表示的是JSP的异常信息,若果要使用它,必须将对应的页面page指令的isErrorPage属性值设为true。

单个页面的处理方式:

<%@page errorPage="erro.jsp"%>

在web.xml配置统一的异常处理页面

<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/erro.jsp</location>
</error-page>

4 JavaBean组件

JavaBean是使用Java语言开发的一个可重用的组件,在JSP开发中可以使用JavaBean减少重复代码,使整个JSP代码的开发更加简洁。

JavaBean本质上就是Java类,通常要求如下:

  • 属性:全部私有化,通过get和set方法进行访问
  • 方法:必须是public关键字修饰
  • 构造器:必须有无参构造方法

使用方式:

使用jsp:useBean的方式创建javaBean的实例

<jsp:useBean id="对象名" scope="保存范围" class="包名.类名"/>
保存范围有:page request session appliction,默认为page范围

使用jsp:setProperty的方式设置javaBean的属性值

<jsp:setProperty name="对象名" property="属性名" value="属性值" param="参数名"/>

使用jsp:getProperty的方式获取javaBean的属性值

<jsp:getProperty name="对象名" property="属性名"/>

JavaBean的保存范围有page、request、session以及application,默认是page范围

删除方式:

<% 
		内置对象.removeAttribute("JavaBean的名字");
%>

5 MVC设计模式

MVC是模型Model和视图View以及控制器Controller的简写,是一种将数据、界面显示和业务逻辑进行分离的组织方式,这样在改进界面及用户交互式,不需要重新编写业务逻辑,从而提高了代码的可维护性。

M:主要用于封装业务数据的JavaBean和业务逻辑的JavaBean及访问数据库的DAO对象

V:主要负责数据收集和数据展现,通常由JSP文件完成

C:主要负责流程控制和页面跳转,通常由Servlet完成

MVC模型示意图:

mvc.PNG