jsp总结

阅读更多
JSP 其实就是Servlet,只不过Servlet如果大量写入表现层语言会
很难维护,因此会引入JSP。JSP其实两个部分:
1、HTML
2、JAVA

   JSP原理:Web服务器接收.jsp文件请求时,会把JSP文件语法交给
JSP引擎处理。Tomcat中的JSP引擎其实就是一个Servlet小程序。
每一个JSP页面在第一次访问的时候,JSP引擎会把JSP页面翻译成一
段小Servlet的源程序。接着再把这个Servlet源程序编程成相对应
的class程序。

  JSP中,一般以下语法放入Java代码:
1、<%  %> 放入Java代码
2、<%! %> 变量与函数的声明
3、<%= %> 表达式写法
4、<%-- --%> JSP注释

JSP 编译指令:
    JSP的编译指令是通知JSP引擎的消息的。它本身不直接生成输出。编译指令都会有
默认值。并且不需要再开发过程中,每个都设置。

JSP 三大指令:
1、page: 该指令是针对当前页面的指令
2、include: 用于指定包含另一个页面
3、taglib: 用于定义和访问自定义标签

JSP编译指令语法:
<%@ 属性=属性值  %>

Page指令:
page指令通常位于JSP的头部,注意一个JSP页面可以包含一个或者多个page指令
<%@ page
   [language="Java"]
   [extend="package.class"]
   [import="package.class|package.*|..."]
   [session="true|false"]
   [buffer="none|8KB|..."]
   [autoFlush="true|false"]
   [isThreadSafe="true|false"]
   [info="text"]
   [contentType="mineType;charset="UTF-8"]
   [pageEncoding="ISO-8859-1"]
   [isErrorPage="true|false"]
   [errorPage="error.jsp"]
%>

language: 声明当前JSP页面使用的脚本语言种类,通常是java。默认值也是java。
extends: 指定JSP页面编译所产生Java类所去继承的类。
import: 通常用来导入包。有几个包是默认自动导入的:
java.lang.*,java.servlet.*,java.jsp.*  ...;
session: 设置当前页面是否需要HTTP Session。
buffer: 设置当前的缓存大小。默认值为8KB。可以设置none。
autoFlush: 当前输入缓冲区即将溢出的时候,是否需要抛出一个溢出异常。
info: 设置该JSP页面的信息。
errorPage: 指定错误处理的页面。
isErrorPage: 设置本JSP页面是否需要错误页面。通常情况下是无序指定。
contentType: 用于生成网页的文件格式以及编码。
pageEncoding: 指定生成网页的编码字符集。

include 指令:

使用incluce,可以将一个外部文件包含到JSP文件中,同时解析必要Java语法。注意编译指令
最好引入静态的JSP文件。什么静态引入?一旦使用编译include的静态引入本把引入的JSP融合
成一个页面。因此被包含页面设置不需要是完整的页面。
<%@include file="relativeURLFile" %>

注意:需要指出的是,静态包含还会包含页面中的编译指令,如果
两个页面的编译指令相冲突,程序报错。

JSP 动作指令:
动作指令与编译指令不同,编译指令是通知Servlet引擎去处理消息。
而动作指令只是运行时的动作。编译指令在将JSP编译成Servlet时起作用。
而动作指令通常可替换成JSP脚本。(注意:它只是JSP脚本的标准化写法)

JSP 7个动作指令如下:
1、jsp:forward 执行页面专项,将请求处理转发到下一个页面。
2、jsp:param 用于传递参数,注意:必须和其他支持参数的标签一起使用。
3、jsp:include 用于动态引入一个JSP页面。
4、jsp:plugin 用于下载JavaBean 或者  Applet 到客户端执行。
5、jsp:useBean 创建一个JavaBean的实例。
6、jsp:setProperty: 设置JavaBean 实例的属性值。
7、jsp:getProperty: 输出JavaBean 实例的属性值。

forward指令:
forward指令用于将页面响应转发到另一个页面。注意:forward 既可以转发到静态HTML页面。
页面转发到JSP页面,或者转发给容器中的Servlet。

forward 格式如下:
JSP 1.0之前:

JSP 1.1以上规范语法:




注意:第二种也就是1.1以上的规范在转发时增加额外的请求参数。
所以请求参数的值,可以通过HttpServletRequest类中的getParameter()方法获取。

注意:1、执行forward请求时,用户请求的地址并没有发生改变。但是页面内容全部改成目标
页面内容。
    2、执行forward指令请求的时候,客户端的请求参数不会丢失。

总结:从表面上看, 指令给人感觉,它是将用户请求“转发”给另一个页面
。但是实际上, 并且没有重新向另一个页面发送请求。它是完全采用了
新页面来对用户生成响应。请求依然就只是一次请求。

JSP练习01:请完成一个表单比如信息录入过程中所应该有的控件,例如:
一个问卷调查,从前端的页面 到  另一个页面的传值接收并显示。
如:下拉菜单,checkbox,radio,textarea

include指令:
include指令一个动态include指令,也用于包含某个页面。它不会导入被include页面编译指令。
仅仅将被导入页面的body内容插入本页面。

include格式如下:
1、
2、

  

  
flush属性用于指定输出缓存是否转移到被导入的文件。如果指定为true,则包含在被
导入的文件中,如果指定为false,那么就不包含。

注意,对于第二种写法,需要额外添加参数。

静态导入和动态导入的3点区别:
1、静态导入是将被导入的页面代码的完全融入,两个页面内容完全的在一起形成一个整体,编译。
而动态的其实在Servlet源码只是一句引入的话仅此而已。
2、静态导入时被导入的页面的编译命令会起作用,动态导入则不会有该种问题。
3、动态还可以增加额外的参数。

jsp:forward 和  jsp:include
实际上,jsp:forward和jsp:include动作指令十分相似,这是它们的语法
都是采用特殊的方法去引入目标的页面。通过查看JSP页面所生成Servlet代码可以发现区别。
区别在于:执行forward时,被forward的页面将完全代替原有的页面。
而执行include时,被include的页面只是插入原有的页面。

jsp:useBean指令,jsp:setProperty指令,jsp:getProperty指令:
这三个指令都是与JavaBean相关的指令。其中useBean指令用于JSP页面
初始化Java实例。setProperty指令用于JavaBean实例设置相关属性。
getProperty指令用于JavaBean实例获取相关属性。

使用前提:如果多个JSP页面中需要重复使用某段代码。则可以把
这段代码定义成Java类的方法。然后让多个JSP页面调用该方法。

useBean的语法格式如下:

page: 该JavaBean实例仅在该页面有效。
request: 该JavaBean实例仅在请求的时候有效。
session: 该JavaBean实例仅在本次session会话内有效。
application: 该JavaBean实例会一直有效(本应用)。

setProperty指令语法如下:

其中name属性需要设置JavaBean实例名。

getProperty指令语法如下:


   JSP 隐式对象:
所谓对象,就是在JSP中内置好的对象,就叫隐式对象。
JSP 九大内置对象:
1、application  -- javax.servlet.ServletContext。
该实例代表JSP所属的Web应用本身。
2、config  -- javax.servlet.ServletConfig
该实例代表JSP所属的配置信息。
3、exception -- java.lang.Throwable
该实例代表JSP所属其他页面的异常和错误。
4、page --  代表页面本身。也就是Servlet的this
5、out -- javax.servlet.jsp.JspWriter
该实例代表JSP的输出流
6、pageContext -- javax.servlet.jsp.PageContext
该实例代表页面的上下文
7、request -- javax.servlet.HttpServletRequest
该实例封装一个请求
8、response -- javax.servlet.HttpServletResponse
该实例代表客户端的响应
9、session -- javax.servlet.HttpSession
该实例代表一次会话

application 通过setAttribute方法设置application的某个属性,
该属性值可以作用于整个Web。因此在Web内可以使用getAttribute获取该属性。

需要指出的是:虽然使用application(即Servlet实例)可以方便多个Servlet,多个JSP
共享数据,但不要仅仅为了JSP、Servlet共享数据就将数据放入Application中!由于Application
代表了整个的Web因此,因为只有关于整个Web项目的配置信息,数据才会放入Application

application 还有一个重要的用处:可用于获取Web应用的配置参数。web.xml

注意:通过Web获取配置参数的方式,可以将一些配置信息放在web.xml文件中配置。
避免使用硬编码方式写在代码中,该种方式可以更好的程序的移植性。

config 对象:
config对象代表当前JSP页面的配置信息。但JSP页面通常无须配置。因此也就不存在配置信息。
所以JSP页面比较少用该对象。但是Servlet中则用处相对较大,因为Servelt需要在web.xml
文件中进行配置。

exception 对象:
exception对象是Throwable的实例,代表JSP脚本中产生的错误和异常。是JSP页面异常机制的
一部分。
在JSP脚本中无须处理异常。事实上,JSP脚本包含的所有的可能出现的异常都交给错误页面处理。

注意:exception 对象仅在异常处理页面中有效,通过异常处理结构可以看出。
注意:由于只有JSP脚本,输出表达式才会对应于_jspService()方法里的代码。所以这两个
部分的代码无须关心异常。但是在JSP的声明部分依然需要处理异常。
JSP异常处理机制对JSP的声明不起作用。

注意:在异常处理的页面中,应该在page指令中isErrorPage添加上并且设置为true,
只有该属性设置为true时,才可以访问exception内置对象。

Servlet:

JSP的本质就是Servlet。一般编译的流程就是把编写好的JSP页面
部署到web容器会将JSP页面编译成相对应Servlet。
但是如果需要直接使用Servlet的坏处:写前端极其麻烦。
Servlet是标准的Java类。

Servlet其实也是一个特殊类,这个类必须继承HttpServlet。
注意:每一个Servlet都可以提供不同方法用于响应客户端的请求。
*doGet 用于用户的Get请求
*doPost 用于用户的Post请求
doPut 用于用户的Put请求
doDelete 用于用户Delete请求

事实上,Get和Post在客户端才会经常用到。
如果Servlet需要响应这4种方法,可以考虑重写上述方法。
注意:大部分Servlet请求响应基本完全一样。
service()即可响应客户端的请求。
另外,HttpServlet还包含了两个方法:
1、init(ServletConfig config); 创建Servlet的时候,初始化的方法。
2、destroy(); 销毁Servlet实例时,自动调用该方法回收资源。

注意:init()和destroy()两个方法,除非在初始化一定要去完成的事情。
否则不建议重写。

Servlet和JSP的区别:
1、Servlet没有内置对象,原来JSP的内置对象通常必须根据程序创建。
2、对于静态HTML的标签,Servlet输出流必须逐个输出。
其实JSP就是Servlet的一种简化写法。

注意:普通的Servlet中的service作用就是JSP源码中的_jspService()方法。
因此原JSP页面的JSP脚本和JSP静态页面内容,在普通中的Servlet中就是service方法
中的输出片段。原JSP声明部分的,对应Sevlet中的定义成员变量或方法。

注意:@WebServlet 使用方式是Servlet3.0以后的注解方法。
目的是为了简化配置操作。
1、asyncSupported 指定该Servlet是否支持异步操作。
2、displayName  指定该 Servlet的显示名。
3、initParams  用于为这个Servlet配置参数。
4、loadOnStartup 用于将Servlet配置成load-on-start
的servlet。
5、name  指对应servlet的名称
6、urlPatterns  指Servlet处理的URL。
如果你打算使用注解配置Servlet。有以下几点需要注意:
1、不要在web.xml文件的根元素()
中指定metadata-complete="true"
2、不要在web.xml配置这个Servlet
如果你打算使用web.xml来配置Servlet。有以下几点需要注意:
1、配置Servlet的名字:对应web.xml文件中的元素
2、配置Servlet的URL: 对应web.xml中的元素
注意:servlet-mapping是可选的。也就是说如果没有配置Servlet
的URL,也不影响正常运行。

JSP/Servlet 生命周期

JSP本质就是Servlet。只是把开发好的JSP页面将由Web容器
编译成对应的Servlet。当Servlet在运行时,其实这个过程并不是由
开发者决定的。而是由Web容器控制的。

注意,创建Servlet实例有2个时机:
1、客户端第一次请求某个Servlet,系统创建该Servlet实例。其实
现在大部分的Servlet都是该种。
2、Web应用启动时立即创建Servlet实例,即load-on-startup Servelt

每一个Servlet生命周期的如下:
1、创建Servlet实例。
2、Web应用启动时,调用Servlet的init方法。对Servlet进行初始化。
3、Servlet初始化后,一直存在容器内。用于响应客户端请求。
4、Web容器决定销毁Servlet时,先调用destroy方法。
5、销毁Servlet。

创建实例成功   --init--> 完成初始化   ---> 响应客户请求 
--destroy--> 资源回收完成  ----> 实例被销毁

  Servlet 生命周期

load-on-startup: 通常Web启动时立即创建的Servlet。
配置 load-on-startup 的Servlet 有两种方式:
1、web.xml 文件通过中的配置一个
子元素进行配置。
2、通过注解方式@WebServlet 指定属性load-on-startup.

注意:load-on-stratup 或者 loadOnStartup 属性只接收一个
整型值,这个整型越小,Servlet实例化的优先级越高。

Servlet的配置参数:
通常配置Servlet时候,需要额外的增加一些参数。一般是需要加入到文件中。
有以下两种方法:
1、通过web.xml中的中的init-param
2、通过注解方式,initParams方式。

你可能感兴趣的:(jsp)