JAVA学习总结二十四

来源:互联网 发布:怎么查看软件注册表 编辑:程序博客网 时间:2024/05/29 17:35

请求转发

在服务器内部做资源调配,客户端只发出一次请求。
request请求对象中,也提供了setAttriute和getAttribute方法,不过,在请求对象中封装的对象,作用范围只在一次请求范围内。

在servlet中转发页面有两种方式:重定向和内部转发

它们的区别在于:

  1. 重定向由response发出,而内部转发由RequestDispatcher发出。
  2. 重定向,客户端发出两次请求,而内部转发,客户端只发出一次请求。所以,内部转发可以共享request请求对象中封装的数据,而重定向不行。
  3. 内部转发只能转发服务器内部的资源,但重定向可以在第二次请求时,转向别的服务器。

状态跟踪:

http协议是一种无状态的协议,当请求和响应完成后,会断开连接,以释放服务器的内存资源。所以服务器无法保存客户端的状态,服务器会认为每次请求的客户端都是新用户。但是,很多时候,我们需要跟踪客户端的状态,完成一系列的商务活动,这时就需要状态跟踪。

状态跟踪有四种解决方案:

  1. 隐藏表单
  2. cookie
  3. session
  4. URL重写

cookie工作流程:

客户端访问服务器,服务器调用response.addCookie()方法。产生响应时,会产生set-cookie响应头,将cookie文本发送给客户端。客户端会将cookie文本保存起来。当客户端再次请求服务器时,会产生cookie请求头,将之前服务器发送的cookie信息,再发送给服务器。服务器就可以根据cookie信息跟踪客户端的状态。

cookie的分类:

  1. 存放在客户端浏览器的缓存中。浏览器不关闭,cookie信息一起存在。浏览器一关闭,cookie消失。
  2. 存放在客户端的文件中,并可以设置cookie的过期时间。过期时间之内,即使浏览器关闭,也可以将cookie信息发送给服务器。超过过期时间,cookie消失。

注意:cookie信息是以文本方式存放在客户端的,所以容易引起一些安全隐患,所以不要把隐秘信息以cookie方式保存。

session的工作流程:

客户端访问服务器,服务器产生调用request。getSession()产生session对象。用于跟踪用户的状态。同时,给session对象分配一个唯一标识。为了管理session对象,以sessionid为键,以session对象为值,封装成Map集合。

产生响应时,将sessionId以cookie方式发送给客户端。存放在客户端浏览器的缓存中。当客户端年再次请求服务器,会将sessionId以cookie请求头的方式发送给服务器。这时服务器得到sessionId后,从Map集合中,得到session对象,从而跟踪状态。

对象作用域

  1. 在Servlet里可以用一个名字绑定一个对象
  2. 谁能看到并使用这个属性,它能存活多久

session是服务端用于保存客户端相关状态的对象。由于http协议是无状态的协议,所以,客户端是否关闭浏览器,服务器并不知道。这就意味着,客户端即使关闭浏览器下线,服务器也会一直保存session对象。这样,会极大耗费服务器的内存资源。所以,服务器应该即使清理过时的session,以释放服务器的内存资源。

session的销毁有三种方式:

  1. 设置超时时间
  2. 调用session对象的invalidate(),强行销毁
  3. 应用服务器崩溃

cookie和sission的区别

  1. cookie信息是存放在客户端的,session信息是以对象方式存放在服务器的
  2. cookie信息存放的是文本数据,而session对象可以绑定对象共享。
  3. 客户端和服务器之间传递cookie,传递的是具体的数据。而使用session时,传递的只是sessionid,所以使用session安全性比较好。

URL重写:

当客户端禁用了cookie之后,这时,服务器发送给客户端的sessionid,客户端就不能通过cookie方式进行保存了。这样,客户端请求时,也不能将sessionid,以cookie请求头方式,提交给服务器。服务器得不到sessionid也就无法取出session对象,从而不能跟踪状态。

解决方案是:当客户端禁用了cookie之后,在URL后面,强行附加sessionid。
如:<a href="/lovobook/WriteURL;jsessionid=F7A5D5B85C80365>click</a>"
这样,客户端无论是否禁用cookie,服务器都可以得到sessionid,从而跟踪状态。

2016/7/7 9:44:54

JSP基础

jsp:全称叫java server page。

jsp页面要被WEB容器翻译成java类,按照servlet规范,所有jsp翻译生成的类,必须实现HttpJspPage接口。而HttpJspPage是Servlet的子接口。也就意味所有jsp翻译生成类也会实现Servlet。所以,从这个意义说,jsp本质是servlet。jsp重在于页面显示,而servlet重在于逻辑处理。

jsp引擎:

jsp引擎是web容器编写的类,负责将jsp页面翻译成java类。在web容器/conf/web.xml中进行注册。

jsp生命周期:

  1. 由jsp引擎将JSP页面翻译成JAVA代码
  2. 将JAVA代码编译成class字节码文件
  3. 加载到容器
  4. 由容器实例化成对象
  5. 初始化阶段相关的方法是jspInit()
  6. 请求到达,调用服务阶段相关的方法是——jspService
  7. 销毁阶段相关的方法是jspDestroy()

jsp网页

  • 主要由元素(Element)和模板数据(TemplateData)两个部分组成
  • 模板数据是jsp静态部分
  • web容器不处理
  • 元素则是必须经由web容器解释
  • 元素都是以XML作为语法基础,并且大小写要一致

WEB容器支持的JSP语法

  • 普通格式
  • XML兼容格式

jsp脚本元素

  • 声明:<%!内容%>定义jsp类的成员变量、静态变量和方法。
  • 脚本:<%内容%>丰富_jspService(),在脚本中定义的变量,全部是_jspService()的局部变量。
  • 表达式:<%=内容%>丰富_jspService(),相当于out.print()向页面输出内容,注意,内容后面不能加分号。

jsp注释分类:

  • jsp注释:<%–内容–%>容器不翻译,只在源代码中可见,最为安全。
  • html注释:html会通过out.print输出到客户端。客户端和服务器均可见,最不安全。
  • java注释://,/多行内容/,给java代码书写的注释,只在服务器端可见。

jsp隐式对象:

jsp引擎翻译的jsp类中,在_jspService()中会定义九个变量,并将这些变量做初始化。由于脚本和表达式是在丰富_jspService()方法。所以可以直接使用这些变量。这些变量称为jsp隐式对象。

九个jsp隐式对象:

  • 四个作用域:

    pageContesxt:只在当前jsp页面有效request:作用于请求session:作用于会话application:作用于全局
  • 两个输出:

    response:响应对象out:打印输出流page:当前对象config:配置对象exception:异常对象

page指令:

  • contentType:设置MIME类型和编码集
  • pageEncoding:设置编码集,MIME类型默认为text/html;
  • import:导入该jsp类中所用到的类。如果需要导入多个类,中间以逗号分开。
  • session:默认为true。表示访问该jsp页面时,产生会话对象。
  • errorPage:表示当前jsp页面如果抛出了运行异常,则跳转指定出错页面。
  • isErrorPage:表示该jsp页面为出错处理页面。定义了exception隐式对象,接收异常对象。

<%@include file=”“>叫做指令包含,也叫静态包含。在编译时发生。将本身jsp和包含的jsp放在一起编译,形成一个class文件。所以两个页面不能存在同名变量,指令包含也只能包含文件。

叫做动作包含,在请求时发生。本身jsp包含的是另一个jsp执行的结果。形成两个class文件。所以两个页面可以存在同名变量。动作包含可以包含文件,也可以包含servlet输出结果。同时,可以传递参数。

代码如:

    <jsp:include page="/out">        <jsp:param value="ppp" name="myid"/>    </jsp:include>内部转发代码:<jsp:forward page="输入URL"/>控制权交给了另一个jsp

2016/7/8 9:20:46

过滤器(拦截器)

  • 概念:

它是一个中间组件,用于拦截元数据和目的数据之间的消息,过滤二者之间传递的数据。

<welcome-file-list>    <welcome-file>index.html</welcome-file>.....<welcome-file-list>表示欢迎页面集合。表示如果在访问web应用程序时,不输入任何路径默认

在标签中的子标签,可以加入标签,表示针对请求路径进行过滤。也可以加入标签,表示针对某个指定名称的servlet过滤

过滤器类型:

  • request:表示直接请求,按请求路径进行过滤。默认方式
  • forward:表示通过内部转发到目标资源之前,进行过滤。
  • include:表示包含指定资源时,进行过滤
  • error:表示发生异常时,进行过滤

过滤器链:

当一个请求到达目标资源时,可能会经过多个过滤器。这就形成了过滤器链。过滤器链执行的顺序是:先经过标签,再经过标签,如果一个请求经过多个标签,按部署的顺序执行。

el表达式的作用域:

${键名} 先从小作用域中查找,如果小作用域中有该键对应的值,则取出,并忽略其他作用域;如果小作用域中没有该键,那么再去大作用域中查找。所以,可以通过作用域,指定需要查找绑定对象。
例如:

${sessionScope.aaa} 表示在session会话范围中查找对象,如果没有找到。也不会去其他作用域查找,返回空值。

通过el表达式,从作用域对象中取出属性时,是调用get方法完成的。所以就算该实体类没有属性,但是提供了get方法,同样可以通过el表达式取出属性值。另外,实体类的属性必须规范,一般来说,属性名前两个字母都不能是大写字母。

0 0
原创粉丝点击