j2ee高级开发技术课程第三周
一、分析Filter例子(轻量级javaee企业应用实战p132)
// 执行过滤的核心方法
public void doFilter(ServletRequest request,
ServletResponse response, FilterChain chain)
throws IOException,ServletException
{
// ---------下面代码用于对用户请求执行预处理---------
// 获取ServletContext对象,用于记录日志
ServletContext context = this.config.getServletContext();
long before = System.currentTimeMillis();
System.out.println("开始过滤...");
// 将请求转换成HttpServletRequest请求
HttpServletRequest hrequest = (HttpServletRequest)request;
// 输出提示信息
System.out.println("Filter已经截获到用户的请求的地址: " +
hrequest.getServletPath());
// Filter只是链式处理,请求依然放行到目的地址
chain.doFilter(request, response);
// ---------下面代码用于对服务器响应执行后处理---------
long after = System.currentTimeMillis();
// 输出提示信息
System.out.println("过滤结束");
// 输出提示信息
System.out.println("请求被定位到" + hrequest.getRequestURI() +
" 所花的时间为: " + (after - before));
}
第8行,从Filter 子类的this中获取ServletContext对象。
第12行,从参数request强制转换为HttpServletRequest对象。
第14行,打印截获的用户请求的地址
第17行,filter链式处理用户请求和应答
二、了解session
2.1、session的使用
三、异步
容器在部署时会处理XML片段并组装成最终的部署描述符。由于容器负责组装web.xml文件,因此如果需要按照特定的顺序来调用框架的 Servlet、Listener或Filter时就可能产生问题。为了避免这个问题,Servlet 3.0 API支持绝对与相对顺序的部署描述符。我们可以在web.xml文件中使用元素指定绝对顺序,这样 WEB-INF/lib下的每个jar都可以通过META-INF/web-fragment.xml文件的元素获得一个名字。接下来,Web应用的WEB-INF/web.xml文件可以通过元素按照顺序列举出这些片段名,这个顺序就是jar的调用顺序,同时还有一个可选的元素用于指定是否以及何时包含那些未命名的jar文件。由于部署者可以选择只列出那些受信任的jar以进行部署,这样就可以避免意外情况的发生。除此之外,通过顺序还可以排除那些不需要被扫描的jar,这样就可以加快应用的部署速度。最后,如果你不想在产品环境下看到自我注册的情况发生,那就可以在web.xml文件中使用 元素,这会告诉Web容器只去寻找注解而非Web片段。
由于既支持片段,又可以使用注解作为另一种配置机制,Servlet 3.0可以插入框架的共享拷贝,比如JAX-WS、JAX-RS以及JSF等,他们都构建在Web容器之上,使用了 ServletContainerInitializers。这些框架是通过jar services API被检测到的,同时还可以指定其处理的类型列表。对于WEB-INF/lib下的任何jar来说,只要其中包含的类被检测到都会传递给 ServletContainerInitializer。这样,我们还可以将同样的API作为ServletContextListeners。
从Servlet API首次发布以来,构建Web应用的方法发生了翻天覆地的变化,尤其是使用越来越多的异步Web技术。这些技术(一般统称为Ajax或是Web 2.0)对于Web客户端(比如浏览器)与服务器端之间的传输机制产生了重要的影响,因为客户端会在一个页面中向服务器端发出更多的请求而不是每次请求都刷新一次页面。
长时间的服务器端处理会恶化这一情况,比如等待JDBC连接池中的连接,或是等待JMS队列中的消息等。在Servlet中等待实在是太低效了,因为这种阻塞会消耗线程以及其他有限的系统资源。鉴于此,Servlet 3.0引入了异步处理请求的功能,这样线程就可以返回到容器中并执行其他任务。在请求上的异步处理开始时,其他线程或是回调既可以生成响应,也可以分发请求以便通过AsyncContext.dispatch方法在容器上下文中执行请求。
由于异步Servlet的行为与同步的差别非常大,因此Servlet 3.0要求开发者指定asyncSupported=true以表示Servlet支持异步请求。不仅是Servlet,Filter也可以异步执行。 Servlet 3.0通过新的ServletRequest方法来支持异步处理,比如startAsync()会返回一个AsyncContext对象,该对象用于持有传递给方法的request与response对象。这里,处理原始请求的线程还可以执行其他操作。此外,API还引入了一个新的Listener 类:AsyncListener,它会告诉我们异步操作何时结束或者是否超时了。AsyncContext类拥有一个complete()方法,凭借该方法我们可以在异步操作结束后提交响应。AsyncListener类拥有一个dispatch()方法,它会将异步请求转发给容器,这样其他框架(比如 JSP)就可以生成响应了。
除了引入大量的新技术和新方法外,Servlet 3.0规范还对其他地方进行了大量的增强:HttpServletRequest终于获得对multipart/form-data MIME类型的内置支持了、Cookie类开始支持“HttpOnly” cookie以避免某些跨站点的脚本攻击、ServletContext API也得到了更新,我们可以通过编程的方式将Servlet和Filter加到上下文中了。
例子:
@WebServlet(name="CalculatorServlet", asyncSupported=true, urlPatterns={"/calc", "/getVal"})
public class CalculatorServlet extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse res) {
...
AsyncContext aCtx = req.startAsync(req, res);
}
...
}
j2ee高级开发技术课程第三周的更多相关文章
- j2ee高级开发技术课程第五周
pplet 是一种 Java 程序.它一般运行在支持 Java 的 Web 浏览器内.因为它有完整的 Java API支持,所以Applet 是一个全功能的 Java 应用程序. 如下所示是独立的 J ...
- j2ee高级开发技术课程第六周
一.jsf(java server faces)的运行原理(工作方式) 1.jsf应用是事件驱动的,当一个事件发生时(比如用户单击一个按钮),事件通知通过HTTP发往服务器,服务器端使用叫做Faces ...
- j2ee高级开发技术课程第八周
介绍一. hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢? 因 ...
- j2ee高级开发技术课程第七周
来源:https://baike.baidu.com/item/JSON/2462549?fr=aladdin JSON(JavaScript Object Notation, JS 对象标记) 是一 ...
- j2ee高级开发技术课程第一周
一.课程目标 这学期开始了J2EE高级开发技术这门课,在此之前我学习了javaSE,为这门课的学习打下了一定的基础.到这学期的结束我希望我能熟悉javaee,能开发企业级应用,对开发轻量级企业应用的主 ...
- j2ee高级开发技术课程第二周(web请求的整个过程、XML)
博客非原创,只是收集整理了一下网上的一些文章 一.web请求的整个过程 1)把URL分割成几个部分:协议.网络地址.资源路径.其中网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括 ...
- j2ee高级开发技术课程第十四周
RPC(Remote Procedure Call Protocol) RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果.这个请求包括一个参数集和一个文本集,通常形成“cl ...
- Java EE开发技术课程第三周
一.分析Filter例子: @WebFilter(filterName="log",urlPatterns={"/*"})//创建一个LOgFilter类pub ...
- j2ee高级开发技术课程第四周
分析hello.java,在hello1项目中.下载链接:https://github.com/javaee/tutorial-examples/tree/master/web/jsf/hello1 ...
随机推荐
- SSH 等效性问题 总提示输入密码问题
家目录权限问题 .chmod 700 /home/.. 得到的教训就是没事儿不要乱修改家目录权限,一时方便,可能在别的地方载跟头 ~~ 浪费好许时间 哎
- 2016-2017-2 20155326实验二《Java面向对象程序设计》实验报告
2016-2017-2 20155326实验二<Java面向对象程序设计>实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉 ...
- CSS 基础 例子 盒子模型及外边距塌陷
我们通常设置的宽度和高度,是指盒子模型中内容(content)的宽度和高度.元素的高度,还要加上上下padding和上下border,元素整个盒子的高度还要加上上下margin:宽度类似计算. 注意: ...
- ASP.NET Web API 框架研究 Controller创建过程与消息处理管道
现在我们从代码角度来看下,从消息处理管道末尾是怎么创建出Controller实例的.消息处理管道末端是一个叫HttpRoutingDispatcher的处理器,其内部完成路由后 ,会把消息派送给其内部 ...
- 微擎 人人商城 merchant.php源码
<?php define('IN_SYS', true); require '../framework/bootstrap.inc.php'; load()->web('common'); ...
- 在线团队协作工具+在线UML工具
话不多说直接上https://worktile.com去看,顺便附上小众软件上面的介绍 默默增加worktile的外国原版https://trello.com/,worktile照着trello做的, ...
- LinuxC下获取UDP包中的路由目的IP地址和头标识目的地址
在接受到UDP包后,有时候我们需要根据所接收到得UDP包,获取它的路由目的IP地址和头标识目的地址. (一)主要的步骤: 在setsockopt中设置IP_PKTINFO,然后通过recvmsg来获取 ...
- 利用 LibWebP-NET 解码与编码 WebP 格式图片
此文以后将会在我的新博客更新,有任何疑问可在我的新博文中提出 https://blog.clso.fun/posts/2019-03-02/vb-net-webp.html WebP 格式是谷歌开发并 ...
- 【javascript】原生js更改css样式的两种方式
下面我给大家介绍的是原生js更改CSS样式的两种方式: 1通过在javascript代码中的node.style.cssText="css表达式1:css表达式2:css表达式3 &quo ...
- hangfire的使用
1.安装: hangfire包.StackExchange.Redis(abp下的hangfire则安装abp.hangfire) 2.配置 startup文件configuration方法添加以下代 ...