JSP技术原理
利用MySQL、Oracle等海量数据库系统作为数据仓库,利用Servlet的高性能服务器端小程序作为后台总控程序,Servlet接受用户输入并分别调用不同的jsp程序向Client反馈信息,JSP/Servlet通过Http协议连接C/S来传递数据,Jsp/Servlet通过传递参数给JavaBean或EJB组件访问操作数据库,这样系统内部数据得到有效的封装保护,很容易实现分布式网络计算
3大JSP指令
page指令 --用来声明当前JSP页面的基本属性
基础语法:
<%@ page 属性名称="值" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
- language 指定JSP页面使用的脚本语言,默认值为java
- contentType 用来指定JSP页面的响应内容类型和所采用的编码方式, 默认值为“text/html,ISO-8859-1”
MIME多用途互联网邮件扩展协议,解决了通过文件后缀判定文件内容类型的缺陷
- text/html
- image/jpeg
- import 通过该属性来引用脚本语言中使用到的类文件,导入多个类或包用逗号分隔。JSP引擎自动导入
java.lang.*;javax.servlet.*;javax.servlet.jsp.*;javax.servlet.http.*
<%@ page import="java.util.Date" %> 允许在一个页面中出现多次 <%@ page import="java.util.*,java.io.*" %>
- pageEncoding 指定当前JSP页面的编码方式, 默认值为“ISO-8859-1”
从实现上来说,和conentType可以相互替代
<%@ page contentType="text/html; charset=UTF-8"%> <%@ page pageEncoding="UTF-8" %>
- session,用来说明是否创建session对象,默认为true
- buffer,用来指定out对象是否创建buffer缓冲区,并指定缓冲区大小。默认为8kb,none表示不创建缓冲区
- autoFlush,缓冲区是否自动刷新,默认为true,如果为false,缓冲区满后不手动刷新会包异常
- info,定义一个字符串常量,使用getServletInfo方法可以打印
- errorPage,指定异常处理页
可以在web.xml中使用
<error-page>
元素为整个WEB应用程序设置处理页面,其中的<exception-type>
子元素指定异常类的完全限定名,<location>
元素指定以"/"开头的错误处理页面的路径。如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中这是的错误处理将不对该页面起作用。
- isErrorPage用于设定当前页面就是异常处理页,只有在异常处理页中才能直接使用exception对象捕捉异常信息
isThreadSafe=“true”
isThreadSafe="true"用于设置当前页面执行的线程问题,true表示采用多线程的方式执行,如果false则采用单线程的方式运行。如果在Servlet中,Servlet默认采用的是多线程的运行方式,如果定义Servlet实现SingleThreadModel接口则Servlet采用单线程的运行方式
Servlet默认采用单实例多线程的方式对外提供服务,
public class HelloServlet extends HttpServlet implements SingleThreadModel
如果Servlet实现了SingleThreadModel则Servlet采用多实例单线程的方式提供服务,该接口不建议使用
include 指令
include指令用于引入其他JSP页面,如果使用include指令引入了其他JSP页面, 那么JSP引擎将把这两个JSP翻译成一个Servlet ,所以include指令引入通常也成为静态引入
格式: <%@ include file = "head.jsp"%>
注意: 先包含后编译执行----静态包含
taglib指令
<%@taglib %>用于实现引入所需要的标签库,使用标签库定义显得自定义标签,在JSP页面中启用定制行为。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<table>
<c:forEach var="k" begin="1" end="9">
<tr>
<c:forEach var="i" begin="1" end="${k}">
<td>${k}*${i}=${i*k}</td>
</c:forEach>
</tr>
</c:forEach>
</table>
JSTL: java标准标签库
##6大页面动作
jsp中实际上定义了21个页面动作,其中大部分是用于控制xml标签的,所以不做介绍
JSP动作元素(action elements): 动作元素为请求处理阶段提供信息。动作元素遵循XML元素的语法,有一个包含元素名的开始标签,可以有属性、可选的内容、与开始标签匹配的结束标签。
JSP标签也称之为JSP Action(JSP动作)元素,它用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。
JSP动作元素包含五大类:
- 与存储JavaBean有关的:
<jsp:useBean>
,<jsp:setProperty>
,<jsp:getProperty>
- JSP1.2规范就有的6个基本动作元素:
<jsp:include>
,<jsp:forward>
,<jsp:param>
,<jsp:plugn>
,<jsp:params>
,<jsp:fallback>
- JSP2.0新增加主要与JSP Document有关的6个动作元素:
<jsp:root>
,<jsp:declaration>
,<jsp:scriptlet>
,<jsp:exception>
,<jsp:text>
,<jsp:output>
- JSP2.0新增加,主要用于动态生成XML元素标签的值,包括3个动作:
<jsp:attribute>
,<jsp:body>
,<jsp:element>
- JSP2.0新增加,只要用在Tag File中:
<jsp:invoke>
,<jsp:dobody>
动态包含
<jsp:include>
标签用于把另外一个资源的输出内容插入进当前JSP页面的输出内容中,这种在JSP页面执行时的引入方式称之为动态引入。
<jsp:include page="relativeURL | <%=expression%>" flush="true|false" />
。flush属性指定在插入其他资源的输出内容时,是否先将当前JSP页面的已输出的内容刷新到客户端。
<jsp:include/>
用于实现动态包含[静态] 【重点】
- 各自独立执行,包含执行结果
<jsp:include page="bb.jsp"/>
将bb.jsp页面包含到当前页面中,其中被包含的页面名称page属性可以使用变量,也可以添加额外参数
<jsp:include page="bb.jsp">
<jsp:param value="123" name="age"/>
</jsp:include>
<jsp:include>
与<%@include %>
指令比较
<jsp:include>
标签是动态引入, <jsp:include>
标签涉及到的2个JSP页面会被翻译成2个servlet,这2个servlet的内容在执行时进行合并。 而include指令是静态引入,涉及到的2个JSP页面会被翻译成一个servlet,其内容是在源文件级别进行合并。
不管是<jsp:include>
标签,还是include指令,它们都会把两个JSP页面内容合并输出,所以这两个页面不要出现重复的HTML全局架构标签,否则输出给客户端的内容将会是一个格式混乱的HTML文档。但include指令要比<jsp:include>
标签效率高些。
- 不能包含其它应用中的内容
- 动态包含中允许使用变量,静态包含中不允许使用变量
- 动态包含可以额外添加parameter参数,但是静态包含不允许
动态包含和静态包含之间的区别
<%@include file="bb.jsp" %>
静态包含是先包含目标页的代码,然后在编译执行
<jsp:include page="bb.jsp"/>
各自独立执行,然后将目标页面的执行结果包含进来
注意:被包含页面一般是当前页面的一部分,所以不应该是完整页
Servlet编程
RequestDispatcher rd=request.getRequestDispatcher("bbb.jsp");
rd.include(request,response);
###请求转发
<jsp:forward/>
用于实现请求转发
语法:
<jsp:forward page="bb.jsp">
<jsp:param value="123" name="age"/> 人为添加parameter参数值,不是attribute
</jsp:forward>
- 目标页和转发页共享request和response
- 允许转发时添加parameter参数
- 不能转发其它应用
Servlet编程
RequestDispatcher rd=request.getRequestDispatcher("bbb.jsp");
rd.forward(request,response);
###页面中构建对象
基本用法:
<jsp:useBean id="now" class="java.util.Date" scope="request"/>
<%=request.getAttribute("now")%>
<jsp:useBean id="dd" class="java.util.Date"/>
用于在页面上构建Date对象,相当于Date dd=new Date();
- id命名引用该Bean的变量。如果能够找到id和scope相同的Bean实例,jsp:useBean动作将使用已有的Bean实例而不是创建新的实例
- class指定Bean的完整包名
- scope指定Bean在哪种上下文内可用,可以取下面的四个值之一:page,request,session和application。默认值是page,表示该Bean只在当前页面内可用(保存在当前页面的PageContext内)。request表示该Bean在当前的客户请求内有效(保存在ServletRequest对象内)。session表示该Bean对当前HttpSession内的所有页面都有效。最后,如果取值application,则表示该Bean对所有具有相同ServletContext的页面都有效。
因为jsp:useBean只有在不存在具有相同id和scope的对象时才会实例化新的对象;如果已有id和scope都相同的对象则直接使用已有的对象,此时jsp:useBean开始标记和结束标记之间的任何内容都将被忽略 - type 指定引用该对象的变量的类型,它必须是Bean类的名字、超类名字、该类所实现的接口名字之一。请记住变量的名字是由id属性指定的
- beanName指定Bean的名字。如果提供了type属性和beanName属性,允许省略class属性。
<jsp:useBean id="dd" class="java.util.Date" scope="request"/>
首先在request中查找名称为dd的日期类型变量,就是request.getAttribute(“dd”),如果获取不到,则新建Date变量,并存放在request中,名称就是id的值
用法1
<jsp:useBean id="now" class="java.util.Date" scope="request">
<jsp:setProperty name="now" property="date" value="20"/> 给名称为now的对象设置属性date,值为20.相当于调用now.setDate(20),要求now对象中必须有对应的setDate方法
</jsp:useBean>
<%=request.getAttribute("now")%>
用法2
请求方式为http://localhost:8080/index.jsp?day=1200,这里在请求参数中有个参数名为day
<jsp:useBean id="now" class="java.util.Date" scope="request">
<jsp:setProperty name="now" property="date" param="day"/>接收parameter中名称day的值,并且赋值到now对象上的date属性 now.setDate(Integer.parseInt(request.getParameter("day")))
</jsp:useBean>
<%=request.getAttribute("now")%>
用法3
请求为http://localhost:8080/index.jsp?year=1000&month=9&date=23,按照名称对应进行赋值属性
<jsp:useBean id="now" class="java.util.Date" scope="request">
<jsp:setProperty name="now" property="*"/>
</jsp:useBean>
<%=request.getAttribute("now")%>
用法4
<%@ page import="java.util.*,java.text.*" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<jsp:useBean id="now" class="java.util.Date" scope="request"/>
<jsp:getProperty name="now" property="year"/>年<jsp:getProperty property="month" name="now"/>月<jsp:getProperty property="date" name="now"/>日<jsp:getProperty property="day" name="now"/>
<%
Date now1=new Date();
DateFormat df=new SimpleDateFormat("yyyy-MM-ddE");
out.println(df.format(now1));
%>
<jsp:plugin>
动作元素用来在JSP中嵌入Java插件,比如Applet。<jsp:plugin>
将会根据浏览器的版本替换成<object>
标签或者<embed>
标签。
<jsp:plugin>
type="bean | applet"
name="Applet名称"
code="java类名"
codebase="Java类所在目录"
align="对齐方式"
height="高度"
width="宽度"
hspace="水平间距"
vspace="垂直间距"
archive="预先加载的类列表"
jreversion="JRE版本"
iepluginurl="URL"
nspluginurl="URL"
>