欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jsp总结 jsp 

程序员文章站 2022-06-07 08:44:34
...
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:forward page="{relativeURL|<%expression%>}"/>
JSP 1.1以上规范语法:
<jsp:forward page="{relativeURL|<%expression>}">
<jsp:param.../>
</jsp:forward>

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

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

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

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

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

include格式如下:
1、<jsp:include page="relativeURL|<%expression%>" flush="true"/>
2、<jsp:include page="relativeURL|<%expression%>" flush="true">
<jsp:param name="名称" value="值"/>
   </jsp:include>
  
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的语法格式如下:
<jsp:useBean id="name" class="classname" scope="page|request|
session|application"/>
page: 该JavaBean实例仅在该页面有效。
request: 该JavaBean实例仅在请求的时候有效。
session: 该JavaBean实例仅在本次session会话内有效。
application: 该JavaBean实例会一直有效(本应用)。

setProperty指令语法如下:
<jsp:setProperty name="BeanName" property="属性名" value="值"、>
其中name属性需要设置JavaBean实例名。

getProperty指令语法如下:
<jsp:getProperty name="BeanName"  property="属性名" value="值"/>

   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文件的根元素(<web-app.../>)
中指定metadata-complete="true"
2、不要在web.xml配置这个Servlet
如果你打算使用web.xml来配置Servlet。有以下几点需要注意:
1、配置Servlet的名字:对应web.xml文件中的<servlet/>元素
2、配置Servlet的URL: 对应web.xml中的<servlet-mapping/>元素
注意: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 文件通过<servlet></servlet>中的配置一个
<load-on-startup>子元素进行配置。
2、通过注解方式@WebServlet 指定属性load-on-startup.

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

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