JSP基础知识

来源:互联网 发布:linux grub命令进win 编辑:程序博客网 时间:2024/06/06 00:25
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="值"/>


课后练习:
1、写2个程序,展示forward和include两个动态指令的区别。
2、在useBean中,尝试用id去获取相关设置的属性值(Bean设置法),并以此写一个例子。



gJSP 隐式对象:
所谓对象,就是在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内置对象。
 
 
    out: 其实就是输出流。通常用于输出变量的值。
注意:<%=> 本质等于 out.write() 输出表达式

pageContext: 该对象表示页面上下文,用于访问对象之间共享数据。

上下文:当一个页面需要访问其他页面声明的变量等参数的时候,该行为
动作就是上下文。

getAttributesScope() 返回属性范围
 1 为page
 2 为request
 3 为session
 4 为application

pageContext还可以用于其他内置对象:
1、servletRequest getRequest(): 获取request对象
2、servletResponse getRepsonse(): 获取response对象
3、servletConfig getServletConfig(): 获取config对象
4、HttpSession getSession() 获取session对象

request 对象是JSP重要的对象。每个request都会是一个用户的请求。
这个请求里面包含了所有的用户需要传递的参数。
request 重要的特性:可以操作表示一个request请求范围。
所有的web应用都会有请求与响应,没有请求与响应就没有web开发!

request和response 是HTTPRequest HTTPResponse的请求实例操作。

函数:
String getParameter("参数名") 获取提交请求的参数值。
Map getParameterMap() 获取所有请求参数和参数值的Map对象。
String[] getParameterValues("参数名") 获取提交请求的参数值的集合。

HttpServletRequest 函数:
String getHeader("参数名") 根据请求参数获取请求头。
java.util.Enumeration<String> getHeaderNames() 根据所有获取请求头名。
int getIntHeader(String name) 获取请求头并转成整数。
Get 和 Post 区别需要记牢!

注意:不是每个表单都会生成请求参数,特别是post不会生成浏览器的请求参数。
有以下几点需要考虑:
1、表单中,每个name属性都对应一个参数。
2、表单中,多个相同的name属性可以对应多个值。
3、表单中,name表示参数名,value表示参数值。
4、表单中,如果默认传值的参数,不要显示,考虑用hidden。

setCharacterEncoding("UTF-8"); 设置request字符集。
一般在web开发,只要不涉及到国际化。只需要知道2个字符集:
1、UTF-8
2、GBK

注意:request 除了可以接受参数,识别请求以外,还有一个功能就是
可以执行forward和include。也就是可以代替jsp所提供的编译指令。

response: 代表服务端的响应。基本上大部分时间服务器无须使用response。
因为可以直接使用更简单的out。out就是代表输出流。
HttpResponse
1、response 可以生成非字符串响应。
2、response 重定向。
注意:重定向 其实就相当于发送了二次请求。
重定向:sendRedict(String path)

注意:重定向会丢失所有的请求参数,使用重定向效果。
和在浏览器的地址栏重新输入没有任何区别。

从表面上看,forwar动作和redirect重定向行为有些相似。
它们都可以将请求传递到另一个页面上。但是实际还是有差异的。

forward( 转发,前进 )          redirect(重定向)
1、执行forward后依然上一次请求     1、执行redirect生成二次请求

2、forward的目标页面可以访问原来  2、redirect目标页面不能访问原来的请求参数。
的请求参数,因为依然在一个页面一次        request内参数全部丢失。
请求。所有request内参数都存在。

3、forward浏览器url不会改变         3、既然是重定向,当然会改变。


Cookie 时常是用来表示或者记录网站的数据。比如用户购物车。
Session 一般是存放在服务器的。用户每次访问网站的时候,
都会携带cookie,网站后台可根据携带cookie找到session。
Cookie和Session的最大不同之处在于,session会随着浏览器
的关闭而消失。Cookie会保留一段时间,具体时间看设置。

众所周知,Cookie会很大安全隐患。因此在有大部分浏览器,需要你
支持使用Cookie。
注意:增加Cookie也是repsonse内置的对象完成。
提供如下相关方法:
1、addCookie( Cookie对象 );


操作:
1、创建Cookie实例
2、设置Cookie生存周期
3、可向客户端写入Cookie

注意:使用Cookie对象必须设置生存周期,
否则随着浏览器关闭会消失。

注意:当在Cookie中设置中文的时候,需要URLEncoder 和 URLDecoder设置。
否则会报错!

session:session 是对象是一个很有用的对象,它代表了一次会话所存储的值。
会话的意思是:从客户端请求服务器开始,到客户端断开服务器位置,这个过程
就是一个完整的对象。

session对象是HttpSession的实例:
1、setAttribute("参数名","参数值");
2、getAttribute("参数名");

注意:session一般是用于存放用户需要完成的会话。比如登录成功的ID
,比如验证码等信息。
session属性值可以是任何可序列化的Java对象。


0 0
原创粉丝点击