web应用开发知识之jsp,servlet(2)

一 jsp相关

 

1 原理

(1)JSP页面必须要在JSP服务器内运行,如tomcat weblogic,jboss等等(注意apache没有实现jsp与servlet规范,他只是静态web服务器,一般在分布式系统中用来做请求转发).

 

(2)JSP页面必须先生成Servlet才能被服务器响应给客户端。

 

(3)每个JSP页面的第一个访问者速度很慢,那是因为必须等到JSP页面编译成Servlet;而每次访问jsp页面,都是在服务端重新执行jsp对应的servlet,生成新的静态html返回到客户端浏览器.

 

(4)JSP页面的访问者无须安装任何客户端,甚至不需要可以运行Java的运行环境,因为JSP页面输送到客户端的是标准HTML页面

 

2 jsp有哪些内置对象?作用分别是什么? 

答:JSP共有以下9种基本内置组件:  

(1),application:javax.servlet. ServletContext 的实例,全局作用范围,整个应用程序共享,就是在部署文件中的同一个webApp共享,生命周期为:应用程序(服务器程序)启动到停止。

(2),session:javax.servlet.http.HttpSession 的实例,该对象代表一次会话。从客户端浏览器与站点建立连接起,开始会话,直到关闭浏览器时结束会话。

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

(4),page:一个JSP页面,也就是Servlet中的this,其类型就是生成的Servlet 。

(5),pageContext: javax.servlet.jsp.PageContext 的实例,该对象代表该JSP 页面上下文,使用该对象可以访问页面中的共享数据。可以通过 pageContext 调用 getAttribute 方法获取了指定范围内的属性的值,如getAttribute("name",3));),常用的方法有getServletContext()和getServletConfig()等。

    注,整型值分别对应几个生存范围:1对应page生存范围;2对应request生存范围;3对应session生存范围;4对应application生存范围。

(6),config: javax.servlet. ServletConfig 的实例,该实例代表该JSP 的配置信息。常用的方法有getInitPararneter(String paramNarne) 及getInitPararneternarnes() 等方法。事实上, JSP 页面通常无须配置,也就不存在配置信息。因此,该对象更多地在Servlet 中有效。

(7),exception: java.lang.Throwable 的实例,该实例代表其他页面中的异常和错误。只有当页面是错误处理页面,即编译指令page 的isErrorPage 属性为true 时,该对象才可以使用。常用的方法有getMessageO和printStackTraceO等。

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

(9),response: javax.servlet.http.HttpServletResponse 的实例,代表服务器对客户端的响应。通常,也很少使用该对象直接响应,输出响应使用out 对象,而response 对象常用于重定向。常用的方法有sendRedirect(j ava.lang.String location)等。

 

3 jsp有哪些动作?作用分别是什么?

答:JSP共有以下6种基本动作  

jsp:include:在页面被请求的时候引入一个文件。 

jsp:useBean:寻找或者实例化一个JavaBean。 

jsp:setProperty:设置JavaBean的属性。 

jsp:getProperty:输出某个JavaBean的属性。 

jsp:forward:把请求转到一个新的页面。  

jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

 

4 JSP中动态INCLUDE与静态INCLUDE的区别? 

答:

        动态INCLUDE用jsp:include动作实现 <jsp:include page=”included.jsp” flush=”true” />它总是会检查所含文件中的变化,适合用于包含动态页面,并且可以带参数。  

        静态INCLUDE用include伪码实现,不会检查所含文件的变化,适用于包含静态页面<%@ include file=”included.htm” %> 

 

5 jsp的两种跳转方式

在JSP中,跳转页面有两种方式:

(1).forward跳转:

<jsp:forward page="跳转页面地址" />

 

(2).response跳转:response.sendRedirect("跳转页面地址");

 

(3)两种跳转的区别如下:

 

forward跳转:

a.服务器端跳转,地址栏不改变;

b.执行到跳转语句后马上无条件跳转,之后的代码不再执行(跳转之前一定要释放全部资源);

c.request设置的属性在跳转后的页面仍可以使用;

d.使用<jsp:param name="参数名" value="参数值" />传递参数。

 

response跳转:

a.客户端跳转,地址栏改变;

b.所有代码执行完毕后跳转;

c.跳转后的页面不能使用上一个页面的request属性;

d.使用地址重写传递参数

(response.sendRedirect("URL?参数名=参数值"))。

 

 

6 JSP是怎么执行的?JSP的生命周期   

(1)、 客户端浏览器向JSP页面发出一个请求; 

(2)、 JSP引擎分析JSP文件的内容;  

(3)、 JSP引擎根据JSP文件的内容,创建临时Servlet源代码,所产生的Servlet负责生成在设计时说明JSP页面的静态元素以及创建页面的动态元素。 

(4)、 Servlet源代码由JAVA编译器编译成Servlet类文件。  

(5)、 实例化Servlet,该Servlet被JSP引擎加载到内存,此时JSP引擎调用Servlet的jspInit和jspService方法并执行Servlet逻辑。  

(6)、 静态HTML和图形相结合,再与JSP页面定义中说明的动态元素结合在一起,通过Servlet响应对象的输出传送到浏览器。

 

 

二 servlet:

1 servlet容器管理servlet的原理(对应于生命周期)

(1)创建对象及初始化:

        一个时机是Servlet容器启动时,读取web.xml配置文件中的信息,假如为Servlet设置了<load-on-startup>,则构造指定的Servlet对象,创建ServletConfig对象,同时将ServletConfig对象作为参数来调用Servlet对象的init方法

        另一个时机是在Servlet容器启动后,客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建并初始化,然后根据客户的请求创建HttpRequest、HttpResponse对象,从而调用Servlet对象的service方法。

        再一个时机是Servlet的类文件被更新后,重新创建Servlet

 

(2)servlet容器为请求分配一个工作线程,然后调用对应servlet的service方法,负责处理并响应客户的请求

 

(3)Servlet容器停止或者重新启动前,Servlet容器会调用Servlet对象的destroy方法来释放资源

 

2 请求-响应过程

st0 servlet容器会根据请求找到或创建对应的Servlet对象

st1 Web Client 向Servlet容器(Tomcat)发出Http请求

st2 Servlet容器接收Web Client的请求

st3 Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中

st4 Servlet容器创建一个HttpResponse对象

st5 Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数

     传给 HttpServlet对象

st6 HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息

st7 HttpServlet调用HttpResponse对象的有关方法,生成响应数据

st8 Servlet容器把HttpServlet的响应结果传给Web Client

 

3 servlet的单实例多线程模型

        servlet依赖于一个线程池来服务请求,通过一个调度线程来管理线程池内的工作者线程.

        当servlet容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行Servlet的service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。也就是说,容器会为每个请求分配一个线程.

        注意:服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的效益问题,但一般不这样做

 

4 如何开发线程安全的servlet

        在Servlet中避免使用实例变量是保证Servlet线程安全的最佳选择;否则需要对访问实例变量的代码做同步处理,以及使用一些线程安全的容器管理实例变量

        ServletContext是可以多线程同时读/写属性的,线程是不安全的

        HttpSession对象在用户会话期间存在,只能在处理属于同一个Session的请求的线程中被访问,但同一个session的请求也是可能并发处理的,所以也是线程不安全的

        ServletRequest,对于每一个请求,由一个工作线程来执行,都会创建有一个新的ServletRequest对象,所以ServletRequest对象只能在一个线程中被访问。ServletRequest是线程安全的

        对于外部的可能存在多个线程同时访问的资源,也要做好同步处理

        javax.servlet.SingleThreadModel接口是一个标识接口,如果一个Servlet实现了这个接口,那Servlet容器将保证在一个时刻仅有一个线程可以在给定的servlet实例的service方法中执行。将其他所有请求进行排队,由于其不能解决并发问题,所以基本上已废弃

        不要在Servlet中创建自己的线程来完成某个功能

 

 

5 servlet3.0新特性

 

(1)Annotation支持: Servlet、Filter、Listener无需在web.xml中进行配置,可以通过Annotation进行配置;

 

(2)模块化编程,即将各个Servlet模块化,将配置文件也分开配置.Servlet 3.0可以将每个Servlet、Filter、Listener打成jar包,然后放在WEB-INF\lib中;注意各自的模块都有各自的配置文件,这个配置文件的名称为  web-fragment.xml

 

(3)Servlet异步处理,异步处理关键点:将复杂业务处理另外开一个线程,而Servlet将执行好的业务先送往jsp输出,等到耗时业务做完后再送往JSP页面;这个特性可以用来实现消息投送.

 

(4)异步Listener,异步监听器用来监听异步处理事件

 

(5)文件上传API简化,原本文件上传时通过 common-fileupload或者SmartUpload,上传比较麻烦,在Servlet 3.0 中不需要导入任何第三方jar包,并且提供了很方便进行文件上传的功能;

 

三 JSP和Servlet的转换:

    - JSP页面的静态内容、JSP脚本都会转换成Servlet的xxxService()方法,类似于自行创建Servlet时service()方法。

    - JSP声明部分,转换成Servlet的成员部分。所有JSP声明部分可以使用private,protected,public,static等修饰符,其他地方则不行。

    - JSP的输出表达式(<%= ..%>部分),输出表达式会转换成Servlet的xxxService()方法里的输出语句。

    - 九个内置对象要么是xxxService()方法的形参,要么是该方法的局部变量,所以九个内置对象只能在JSP脚本和输出表达式中使用。

 

 

// Servlet知识补充: servlet的filter,listener的作用与原理

 

一 过滤器filter: 

1 Servlet中的过滤器Filter是实现了javax.servlet.Filter接口的服务器实例,此接口有三个方法:

  • init(FilterConfig): web应用启动时进行初始化
  • doFilter(ServletRequest,ServletResponse, FilterChain): 当在web.xml配置的对应请求来临时调用此方法,最后要调用FilterChain..doFilter(request, response)将请求转发到下一个过滤器.
  • destroy(): web应用销毁或重启时调用此方法

2 Servlet过滤器的主要用途是过滤字符编码、做一些业务逻辑判断,如用户是否已经登陆、有没有权限访问该页面等等

 

二 监听器listener

1  在Servlet规范中定义了多种类型的监听器,它们用于监听的事件源分别为 ServletContext, HttpSession 和 ServletRequest 这三个域对象,Servlet规范针对这三个对象上的操作,又把这多种类型的监听器划分为三种类型:

  •  监听三个域对象创建和销毁的事件监听器,这三个监听器接口分别是                                                               ServletContextListener,   HttpSessionListener, ServletRequestListener
  •  监听域对象中属性的增加和删除的事件监听器,这三个监听器接口分别是ServletContextAttributeListener ,HttpSessionAttributeListener ,ServletRequestAttributeListener
  •  监听绑定到 HttpSession 域中的某个对象的状态的事件监听器

2 监听器使用的一点说明

 

(1)ServletContextListener监听ServletContext

当创建ServletContext时,激发contextInitialized(ServletContextEvent sce)方法;

当销毁ServletContext时,激发contextDestroyed(ServletContextEvent sce)方法。

服务器启动时会针对每一个web应用创建servletcontext,服务器关闭前会先关闭代表每一个web应用的servletContext

 

(2)因为HttpSessionListener可以监听Session的创建,所以可以用来统计当前访问应用的客户端数量

 

(3)Servlet 规范中定义了两个特殊的监听器接口来帮助 JavaBean 对象了解自己在 Session 域中的相关状态:HttpSessionBindingListener接口和HttpSessionActivationListener接口 ,实现这两个接口的JavaBean类不需要 web.xml 文件中进行注册.实现了HttpSessionBindingListener接口的 JavaBean 对象可以感知自己被绑定到 Session 中和从 Session 中删除的事件;实现了HttpSessionActivationListener接口的 JavaBean 对象可以感知自己被活化和钝化的事件.活化是指session对象从硬盘上读取;钝化是指把session对象保存到硬盘上.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值