jsp详解与应用...持续更新中

来源:互联网 发布:python入门知乎 编辑:程序博客网 时间:2024/06/06 08:12

jsp执行过程简介:

用户发出请求,请求一个jsp页面——页面是否被编辑过——编译以后是否被修改过——没有编译、以后修改过,将.jsp文件编译成servlet(.java)文件。java文件进行编译得到.class文件执行servlet中service方法将HTML代码响应给页面客户端

如果页面进行过编译,编译后没有修改过,直接执行servlet中service方法。

jsp执行过程详解:

1)JSP容器先将jsp文件转换为一个java源文件(java servlet源文件)在转换过程中如果发现jsp文件中存在任何语法错误,则中断转换过程并向服务端和客户端返回出错信息

2)如果转换成功,则jsp容器使用javac将生成的java源文件编译成相应的字节码文件*.class。该.class文件就是一个servlet,servlet容器会像处理其他的servlet一样来处理它。

3)由servlet容器加载转换后的servlet类(.class文件),创建一个该servlet(jsp页面的转换结果)的实例,并执行servlet的jsplnit()方法在servlet的整个生命周期中只会被执行一次。

4)执行_jspservlet方法来处理客户端的请求。对于每一个请求,jsp容器都会创建一个新的线程来处理它,如果有多个客户端同时请求该jsp文件,则jsp容器也会创建多个线程,使得每个客户端请求都对应一个线程。jsp运行过程中采用的这种多线程的执行方式可以极大地降低对系统资源的需求,提高系统的并发量和响应时间。要注意的是,第三步中生成的servlet是常驻内存的,所以响应速度也是非常快的。

5)如果.jsp文件被修改了,则服务器将根据设置决定是否对改文件重新编译,如果需要重新编译,则使用重新编译后的结果取代内存中常驻的servlet,并继续上述处理过程。

6)虽然jsp效率高,但在第一次调用时往往由于需要转换和编译过程而产生一些轻微的延迟。此外,由于系统资源不足等原因,jsp容器会以某种不确定的方式将servlet从内存中移去。当这种情况发生时会首先调用jspDestory()方法。

7)接着servlet实例便被加入“垃圾收集”处理。

8)当请求处理完成后,响应对象由jsp容器接收,并将HTML格式的响应信息发送回客户端。

jsp页面组成:

1、HTML模板元素

2、脚本元素:<%  java代码%>

2.1声明<%!变量或方法定义%>——里面可以声明变量(变量的类型可以是java语言中所提供的任意数据类型)、方法等,需要写方法体,不能写system.out.print,在声明里只能写声明变量,声明方法等,在该脚本内所有的声明、变量、方法,都会在编译时被添加到全局变量,成员变量{在work目录里。java文件可以看见} 使用jsp声明语句声明的变量将来会转换成servlet类中的成员变量,这些变量在整个jsp页面内部都有效,因此被称为jsp页面的成员变量。在jsp中声明语句中声明的方法在整个jsp页面内完全有效,但是该方法内定义的变量只在该方法内有效,当声明的方法被调用时,会为方法内的变量分配内存,而调用结束后立刻释放变量所占的内存。

使用jsp声明语言声明的方法将来会转换成servlet类中的成员方法,当方法被调用时,方法内定义的变量被分配内存,调用完毕即可释放所占的内存。

实际上,jsp页面最终会编译成servlet类,而在容器中只会存在一个servlet类的实例,在jsp中声明的变量是成员变量,它只在创建servlet实例时被初始化一次,此后,该变量的值将一直被保存,直到该servlet实例被销毁掉。

2.2脚本jsp scriptlet:<%变量、方法、表达式...%>——脚本里面可以写声明,也可以写一些执行的方法,脚本里也包含了声明的部分,主要用的时候可以在脚本里声明,在该脚本中所有的java代码都会被加入到service方法中,在service中,页面的内容和自己写的脚本之类的都会在service方法中执行,都会被服务器调用的,方法执行以后会将脚本添加到service方法中

当需要使用java实现一些复杂操作或控制时,jsp表达式往往不能满足要求,此时就需要用到脚本,在jsp scriptlet中声明的变量是jsp页面的局部变量,调用jsp scriptlet时,会为局部变量分配内存空间,调用结束后,释放局部变量所占有的内存空间。

2.3表达式<%=expression%>——jsp可以在<%=和%>中插入一个表达式,这个表达式必须能够求值,并且计算结果会以字符串的形式发送到客户端显示出来,jsp表达式的值会作为HTML页面的内容。

注意:<%=表达式%>中插入的是一个表达式,不能插入语句

3、指令元素

JSP的7个动作指令

1forword指令

  用于将页面响应转发到另一个页面,既可以转发到静态的HTML,也可以转发到动态的JSP页面,或者转发到容器中的servlet。

2param指令

  用于执行参数,必须与其支持参数的标签一起使用。本身不能单独使用,因为单独的param指令没有实际意义。

3include指令

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

4plugin指令

  用于下载JavaBean或applet到客户端执行。

5useBean指令

  创建一个JavaBean的实例

6setProperty指令

  设置JavaBean实例的属性值

7getProperty指令

  输出JavaBean实例的属性值


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

page指的是当前页面,也可认为java中this关键字,当前页面使用的语言是java,内容类型:文本或页面并且加了一个编码,第二个编码是页面的编码。

<%@ +指令内容%>

3.1page

 该指令是针对当前页面的指令,通常位于JSP页面的顶端,一个JSP页面可以使用多条page指令。

antoFlush = "true"自动刷新

buffer = “8kb”缓冲区

errorpage = “index.html”当页面发生错误就会按照该属性指定页面进行跳转index.html

import = “com.rimi.test”导包

isErrorpage = "true/false"是否为错误页面,默认false,当部分错误页面指定的是err.jsp但是err.jsp page指令 isErrorpage属性的值必须是false,否则,发生错误时跳转不到错误页面,用工具浏览器必须默认false才能跳转,但是谷歌之类的浏览器都可以跳转。

加上<%=exceotion%>可以输出错误原因,isErrorpage属性需要默认true,如果是false页面中就不能使用exception对象



3.2include(包含)指令

 用于指定包含另一个页面的指令,使用include指令可以将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP。include即可以包含静态文本,又可以包含动态JSP页面。

<%@include file = " head.html"%>

file:指定要包含页面的位置,必须填,一般适用于一些重复性的页面、导包




3.3taglib指令:

用于定义和访问自定义标签。

用来导入第三方的标签,或者自定义的一些标签 自定义标签(page标签分页)

prefix:指定使用标签没标签的前缀

url:指定第三方标签库的URL位置


4、注释

jsp的注释由两种,一种是可以在客户端显示的注释,称之为HTML注释,一种是发送到服务器端,在客户端不能显示的注释名称之为jsp注释。

HTML注释以<!--开始,以-->结束,中间包含的内容即是注释部分,其形式为:

<!--注释内容-->

jsp注释以<%--开始,以--%>结束,中间包含的内容即是注释部分,其形式为:

<%--注释内容-->

由于在jsp标签<%%>中包含的是符合java语法规则的java代码,所以其中可以出现java形式的注释。

5、动作元素

5.1<jsp:useBean>

javabean必须有一个无参的构造函数

必须要有get、set方法才能通过动作元素操作对象中的属性

这个类必须是public修饰的

userbean

class指定类的位置

id相当于变量名

jsp set property name 对应userBean中的id属相值,propery 对应的是Javabean中的字段名称

  value:对应字段中的值

jsp get property name 对应userbean中对的id属相值,property对应的是要取出的字段的值,

jsp:include  page 指定要包含的页面

jsp:forward  请求转发 将reuqest和response转发到另外一个jsp   
        在转发时 可以通过jsp:param 在转发的同时专递参数  参数只能是字符串  name = value

5.2<jsp:param>

jsp:params 同时传递多个参数 
<jsp:params>
<jsp:param></jsp:param>
<jsp:param></jsp:param>
</jsp:params>  

__________

jsp页面第一次访问时,速度会比较慢因为jsp文件需要进行一次编译

————————————


如何将静态页面(html)转换成jsp文件:

首先把后缀改成.jsp之后把指令<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>复制进去,刚复制进去不是关键字,可以先关掉,然后再打开就可以。

————————————————————

jsp的编译指令和动作指令

编译指令和动作指令的区别:编译指令只在jsp转化成servlet中起作用,而动作指令是客户端在请求时动态被执行的(客户端每次请求时都有可能被执行)

(1)page编译指令

一般位于页面的最上方,一个页面可以有多个page编译指令


   ① 用于指定jsp程序所使用的脚本语言的程序

  ② 设置网页的属性和编码 language = “utf-8”

  ③用于设置jsp程序本身的编码


jsp内置对象

①  out对象 用于向客户端、浏览器输出数据


② request对象 封装了来自客户端浏览器的各种信息

request.getMethod();获取请求的方法名

request.getRequestURI();获取请求资源

request.getProtocol();获取请求使用的协议

request.getServerName();获取请求的服务器IP

request.getServerPort();获取请求的服务器端口

request.getRemoteAddr();获取客户端的IP地址

request.getRemoteHost();获取客户端的主机名

request.getParameter("");获取表单提交的值

getParameter("");方法用于获取客户端、浏览器提交的表单数据,而request.setAttribute("", "");
和request.getAttribute("");用于在web组件之间共享数据


③ response对象 封装了服务器的响应信息

response.setHeader(arg0, arg1)设置请求头

response.setIntHeader("refresh", 2);设置每隔两秒请求一次

response.sendRedirect(url);实现页面跳转

使用response设置Cookie

Cookie myCookie = new Cookie("d", "d");
myCookie.setMaxAge(3600);
response.addCookie(myCookie);

④ exception对象 封装了jsp执行过程中发生的异常和错误信息

⑤ config对象 封装了应用程序的配置信息

⑥ page对象 指向了当前jsp程序本身

⑦ session对象 用来保存会话信息,也就是说它可以在统一用户的不同请求之间共享数据

session.getId(); session的唯一标识符
session.getCreationTime(); 获取session创建的时间
session.getLastAccessedTime(); 获取session最后一次访问的时间
session.getMaxInactiveInterval();获取session的失效时间

可以在WEB-INF中的web.xml中手动设置session的失效时间(以分钟为单位)

<session-config>
<session-timeout>10</session-timeout>
</session-config>

⑧application对象 代表当前应用的上下文,它可以在不同的用户之间共享信息

⑨ pageContext对象 提供了对jsp页面所有对象以及命名空间的访问

JSP脚本中的9个内置对象

1

application对象

  javax.servlet.ServletContext的实例,该实例代表JSP所属的web应用本身,可以用于JSP页面,或者servlet之间交换信息。

2config对象

  javax.servlet.ServletConfig的实例,该实例代表JSP的配置信息

3exception对象

  java.lang.Throwable的实例,该实例代表其他页面中的异常和错误。

4out对象

  javax.servlet.jsp.JspWriter的实例,该实例代表JSP的输出流,用于输出内容,形成HTML页面。

5page对象

  代表页面本身,通常没有太大用处。

6pageContext对象

  javax.servlet.jsp.PageContext的实例。该对象代表JSP页面的上下文,使用该对象可以访问页面中的共享数据。

7request对象

  javax.servlet.http.HttpServletRequest的实例,该对象封装了一次请求,客户端请求的参数都被封装在这个对象里。

8response对象

  javax.servlet.http.HttpServletResponse的实例,代表服务器对客户端的响应,通常很少使用该对象直接响应,而是使用out对象,除非需要生成非字符响应。

9session对象

  javax.servlet.http.HttpSession的实例,该对象代表一次会话,当客户端浏览器与站点连接时,会话开始,当客户端关闭浏览器是会话结束。



阅读全文
1 0
原创粉丝点击