Slide 1

Similar documents
本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc

EJB-Programming-4-cn.doc

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

Servlet

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ

untitled

resp.getwriter().print(j + "*" + i + "=" + j * i+" "); resp.getwriter().print("<br/>"); protected void dopost(httpservletrequest req, HttpServletRespo

Microsoft PowerPoint - 02-Servlet-Basics-Chinese.ppt

Slide 1

EJB-Programming-3.PDF

Chapter 9: Objects and Classes

基于CDIO一体化理念的课程教学大纲设计

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt

untitled

untitled

优迈科技教学大纲2009版本

IoC容器和Dependency Injection模式.doc

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc

WebSphere Studio Application Developer IBM Portal Toolkit... 2/21 1. WebSphere Portal Portal WebSphere Application Server stopserver.bat -configfile..

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

计算机软件技术专业教学计划

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

设计模式 Design Patterns

Microsoft Word - 第4章 Servlet开发—教学设计.doc

1

目 录 1. 业 务 流 程 系 统 开 发 面 临 的 挑 战 与 机 遇 业 务 流 程 管 理 新 一 代 开 源 业 务 流 程 开 发 平 台 BPMX BPMX3 是 什 么 为 什 么 要 优 先 采 用 BPMX

(Microsoft Word - \272\364\263q\245|\244A_ _\304\254\253\330\336\263__\272\353\302\262\263\370\247i.doc)

untitled

D C 93 2

TopTest_Adminstrator.doc

提纲 1 2 OS Examples for 3

chp6.ppt

拦截器(Interceptor)的学习

Kubenetes 系列列公开课 2 每周四晚 8 点档 1. Kubernetes 初探 2. 上 手 Kubernetes 3. Kubernetes 的资源调度 4. Kubernetes 的运 行行时 5. Kubernetes 的 网络管理理 6. Kubernetes 的存储管理理 7.

Java

设计模式 Design Patterns

untitled

Microsoft Word - SCWCD-CH01.doc

2 Java 语 言 程 序 设 计 教 程 简 单 性 Java 语 言 的 语 法 与 C 语 言 和 C++ 语 言 很 接 近, 使 得 大 多 数 程 序 员 很 容 易 学 习 和 使 用 Java 另 一 方 面,Java 丢 弃 了 C++ 中 很 少 使 用 的 很 难

untitled

Stateless Session Beans(无状态bean)的学习

untitled

jsp

mvc

苏教高〔2005〕 号

"+handlermethod.getbean().getclass().getname()); public void aftercompletion(httpservletrequest req, HttpServletResponse resp, Object handler, Excepti

epub83-1

Microsoft Word - 01.DOC

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

weblogic

附件2

基于ECO的UML模型驱动的数据库应用开发1.doc

PowerPoint プレゼンテーション

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

1. 2. Flex Adobe 3.

2005 3

(CIP) Web /,. :, ISBN X.W T P393.4 CIP (2004) Web ( ) ( / ) : * 787

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

untitled

PowerPoint Presentation

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问

ABSSetup.doc

2 WF 1 T I P WF WF WF WF WF WF WF WF 2.1 WF WF WF WF WF WF

RxJava

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

59 1 CSpace 2 CSpace CSpace URL CSpace 1 CSpace URL 2 Lucene 3 ID 4 ID Web 1. 2 CSpace LireSolr 3 LireSolr 3 Web LireSolr ID

计 算 机 系 统 应 用 年 第 25 卷 第 4 期 线 程 的 复 用 [2,3]. 通 常 情 况 下, 服 务 器 端 程 序 在 启 动 时 创 建 若 干 数 量 的 线 程 对 象 并 缓 存 起 来, 此 时 它 们 处 于

<4D F736F F D2031A3AD4A617661BCBCCAF5CAC6CDB7D5FDBEA22E646F63>


spc

FileMaker 16 ODBC 和 JDBC 指南

JBuilder Weblogic

untitled

, 即 使 是 在 昏 暗 的 灯 光 下, 她 仍 然 可 以 那 么 耀 眼 我 没 有 地 方 去, 你 会 带 着 我 么 杜 晗 像 是 在 嘲 笑 一 般, 嘴 角 的 一 抹 冷 笑 有 着 不 适 合 这 个 年 龄 的 冷 酷 和 无 情, 看 着 江 华 的 眼 神 毫 无 温

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

服务器将响应传输给客户端 Servlet 技术具有如下特点 : 方便 :Servlet 提供了大量的实用工具例程, 如处理很难完成的 HTML 表单数据 读取和设置 HTTP 头, 以及处理 Cookie 和跟踪会话等 跨平台 :Servlet 用 Java 类编写, 可以在不同操作系统平台和不同应

第03章 控制反转(Spring IoC)

《大话设计模式》第一章

输入 project name 选择完成

FAQ -PowerDesigner9.5.DOC

<4D F736F F D20BBF9D3DA416E64726F6964C6BDCCA8B5C4B5E7D7D3C5C4C2F4CFB5CDB32E646F63>

无类继承.key

云数据库 RDS SDK

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

JavaIO.PDF

二 Synchronized 1. Java 语 言 的 关 键 字, 当 它 用 来 修 饰 一 个 方 法 或 者 一 个 代 码 块 的 时 候, 能 够 保 证 在 同 一 时 刻 最 多 只 有 一 个 线 程 执 行 该 段 代 码 2. 当 两 个 并 发 线 程 访 问 同 一 个

OSWorkflow Documentation

android讲座

Swing-02.pdf

6-1 Table Column Data Type Row Record 1. DBMS 2. DBMS MySQL Microsoft Access SQL Server Oracle 3. ODBC SQL 1. Structured Query Language 2. IBM

untitled

Microsoft PowerPoint - 10-JSP-Scripting-Elements-Chinese.ppt

Transcription:

< 在此处插入图片 > JavaEE 6 Servlet 3.0 中的新特性

议题 易于开发和部署 < 在此处插入图片 > 模块化 web.xml 动态配置 异步 Servlet 2

Web Profile 用于 Web 应用程序的功能全面的中型 profile web profile 中的各种技术 Servlet 3.0 JSP 2.1 对其他语言的调试支持 EL 1.2 JSTL 1.2 JSF 2.0 EJB Lite 3.1 JTA 1.1 JPA 2.0 通用批注 Bean validation 1.0 Web Profile 完整的 JavaEE 6 3

< 在此处插入图片 > 易于开发和部署 4

简化的打包 Java EE 5 Java EE 6 foo.ear foo_web.war WEB-INF/web.xml WEB-INF/classes com.sun.fooservlet com.sun.ticktock foo.war WEB-INF/classes com.sun.fooservlet com.sun.ticktock com.sun.foobean com.sun.foohelper foo_ejb.jar com.sun.foobean com.sun.foohelper 5

Servlet 下一代 Servlet 3.0 易于开发 主要关注点 增强了 API 以便使用 SE 5 中新的语言特性 例如 : 批注 泛型 (Generics) 在上次 JavaEE 5 中漏掉的 Servlet 部署描述批注 现在 web.xml 为可选 用于保证 API 类型安全的泛型 (Generics) 不影响后向兼容性 惯例优先原则 (Convention over) 更好的默认值 例外配置 6

Servlet 2.x public class HelloServlet extends HTTPServlet { public void doget(httpservletrequest req, HttpServletResponse res) throws Exception { } } <web-app> <servlet> <servlet-name>helloservlet</servlet-name> <servlet-class>myservlet.helloservlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloservlet</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>... </web-app> 7

Servlet 3.0 示例 1 @WebServlet(name= HelloServlet, urlpatterns= /hello ) public class HelloServlet extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse res) throws Exception {... } //name= HelloServlet, urlpatterns= /hello @WebServlet( /hello ) public class HelloServlet extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse res) throws Exception {... } 无 web.xml 8

@WebServlet 用于指定 servlet 批注至少必须有 urlpattern urlpattern 属性是默认属性 即 value() 所有其他字段都有合理的默认值 例如,servlet 的名称默认为 servlet 的全称类名 类的其余内容与之前相同 必须扩展 HttpServlet 类 重写 doxxx() 来处理行为 @WebListener @WebFilter 的工作方式相同 9

Servlet 3.0 示例 3 @WebServlet( urlpatterns= /hello, loadonstartup=1, initparams={ @InitParam(name= db, value= jdbc:derby... ), @InitParam(name= dbuser, value= fred ), @InitParam(name= dbpasswd, value= fred ) } ) public class HelloServlet extends HttpServlet { public void init(servletconfig config) throws ServletException { String jdbc = config.getinitparameter( db ); } 10

使用批注 用于部署 servlet 过滤器 监听器的批注 @WebServlet 向 web.xml 中添加 servlet 项 @WebFilter 添加过滤器项 @WebListener 添加监听器项 @WebInitParam 添加参数项 @MultiPartConfig 表示 servlet 要求使用 mime/multipart 数据格式 在部署时使用 web.xml 覆盖批注值 11

Servlet 3.0 示例 2 @WebFilter(urlPatterns= /hello, dispatchertypes={ DispatcherType.FORWARD} ) public class HelloServletFilter implements Filter { public void dofilter(httpservletrequest req, HttpServletResponse res) {... } 12

Multipart 支持 Multipart 格式用于在 HTTP 流中分割传输内容 通常是表单数据 非 ASCII 数据 二进制数据等 <form action= /upload > Name: <input name= filename type= text /> File to upload: <input name= myfile type= file /> <input type= submit value= Upload > </form> POST /upload HTTP/1.0 Content-Type: multipart/form-data; boundary=----abcdefghijk ----ABCDEFGHIJK Content-Disposition: form-data; name= filename uploaded_file.txt ----ABCDEFGHIJK Content-Disposition: form-data; name= myfile ; filename= a_text_file.txt 13

Multipart 支持 Servlet 目前原生支持 multipart 数据 以前必须借助于第三方库 获得 MIME 内容的新方法 HttpServletRequest.getParts() Iterable<Part> HttpServletRequest.getPart(String name) String 类似功能 HttpServletRequest.getParameter( name ) HttpServletRequest.getPart( name ) 比前者更通用的形式 14

@MultipartConfig 批注 帮助 servlet 容器确定哪个 servlet 将处理 multipart 数据 配置容器处理数据的方式 临时文件的位置 最大文件大小 @WebServlet( /hello ) @MultipartConfig(location= /tmp ) public class HelloServlet extends HttpServlet { public void dopost(httpservletrequest req, HttpServletResponse res) { Part part = req.getpart( myfile ); InputStream is = part.getinputstream(); //Read in file... } 15

< 在此处插入图片 > 模块化 web.xml 16

最新发展 web.xml 多种非常高效的 web 框架 框架的使用需要 ( 可能是复杂的 ) 配置 如果使用多种框架则难以管理 复杂性增加 需要知道各框架之间的整合方式 例如 声明控制器 servlet 及其参数 处理请求前后所使用的过滤器 声明监听器以便管理应用程序生命周期的各点 很多这种配置在应用程序间通用 17

模块化 web.xml 允许在没有框架配置的情况下使用框架 为您的应用程序保留 web.xml 将框架配置工作放在框架这边 允许框架将它们的 web.xml 存储在自己的 JAR 中 在应用程序启动期间合并它们 web.xml 分段的概念 18

web.xml 与 web-fragment.xml web.xml <servlet> </servlet> 来自框架的 JAR web-fragment.xml <servlet> </servlet> web-fragment.xml <servlet> </servlet> 19

web-fragment.xml 用于指定整个 web.xml 的一部分 除根元素外与 web.xml 相同 <web-fragment> 位于框架的 JAR 中 META-INF/web-fragment.xml JAR 文件必须位于 WEB-INF/lib 中 20

web-fragment.xml 示例 <web-fragment> <context-param> <param-name>javax.faces.state_saving_method</param-name> <param-value>client</param-value> </context-param>... <servlet> <servlet-name>faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.facesservlet</servlet-class> <load-on-startup> 1 </load-on-startup> </servlet> <servlet-mapping> <servlet-name>faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern> </servlet-mapping>... </web-fragment> 21

web-fragment.xml 示例 jsf_framework.jar META-INF/web-fragment.xml mywebapp.war WEB-INF/lib/jsf_framework.jar 22

资源共享 静态页面和 JSP 页面, 资源不再局限于应用程序的 DOCROOT 允许框架捆绑自己的资源 资源位于框架的 JAR 文件中 META-INF/resources ServletContext.getResourceAsStream() 将知道如何解析资源位置 应用程序 DOCROOT 中的资源优先于框架 JAR 文件中的资源 如果存在命名空间冲突 / 对应 DOCROOT 或 META-INF/resources 23

资源共享示例 mywebapp.war /index.jsp /WEB-INF/lib/framework.jar! /META-INF/web-fragment.xml /META-INF/resources/index.jsp /META-INF/resources/shared.jsp http://server.com/mywebapp/shared.jsp mywebapp.war!/web-inf/lib/framework.jar! /META-INF/resources/shared.jsp http://server.com/mywebapp/index.jsp mywebapp.war!/index.jsp 24

< 在此处插入图片 > 动态配置与按需加载 25

动态配置 以编程方式添加 servlet 监听器和过滤器 例如, 自动添加 Strut 的 ActionServlet 只能在下列各项中执行配置 ServletContextListener.contextInitialized() 由应用程序实现 应用程序启动时调用 ServletContainerInitializer.onStartup() 稍后详细介绍 使用返回的 Registration 对象进一步定制 例如, 映射 初始化参数 servlet 名称等 26

web.xml 配置 <servlet> <servlet-name>action</servlet-name> <servlet-class> org.apache.struts.action.actionservlet </servlet-class> <init-param> <param-name>config</param-name> <param-value> /WEB-INF/struts-config.xml </param-value> </init-param> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> 27

编程式配置 @WebListener( Auto configure Struts ) public class MyListener implements ServletContextListener { public void contextinitialized(servletcontextevent evt) { ServletContext ctx = evt.getservletcontext(); //Register the servlet ServletRegistration.Dynamic servreg = ctx.addservlet( action, org.apache.struts.action.actionservlet ); //Set init parameter servreg.setinitparameter( config, /WEB-INF/struts-config.xml ); servreg.setloadonstartup(2); //Add mappings servreg.addmapping( *.do ); //Annotate with @MultipartConfig servreg.setmultipartconfig( new MultipartConfigElement( /tmp )); } } 28

动态配置的局限 注册仅发生在应用程序启动时 之后不能更改 无法以编程方式删除 servlet 无法从 web.xml 删除项 只能在其上下文或上下文分支中安装 servlet/ 过滤器 / 监听器 例如 /myapp /myapp/invoice 无法共享全局状态 每个 分布式 应用程序一个实例 29

按需加载 按需加载库和框架 JSF web 服务 第三方框架 应用程序启动时 Web 容器找到使用的框架 调用 ServletContainerInitializer.onStartup() 来初始化框架 / 库 功能类似于 ServletContextListener.contextInitialized() ServletContextListener.contextInitialized() 由应用程序开发人员实现 ServletContainerInitializer.onStartup() 由框架开发人员实现 30

ServletContainerInitializer 框架实现 ServletContainerInitializer 应用程序启动时调用 onstartup() 负责初始化框架 如果有 例如, 注册控制器 servlet 连接到数据库等 通过 @HandlesTypes 实现批注 将 initializer 与它的批注 类或接口集相关联 例如 @HandlesTypes({Fred.class}) 在 META-INF/services/ 中注册 在运行时由 JavaEE 发现 Web 容器扫描 web 应用程序来寻找 @HandlesTypes 找到时调用 initializer 31

按需加载示例 1 @MyWebFramework public class DoSomething { 框架类 public class DoSomething extends MyWebFramework { public class DoSomethng implements MyWebFramework { 32

按需加载示例 2 myframework.jar META-INF/services/ javax.servlet.servletcontainerinitializer myframework.frameworkloader @HandlesTypes(MyWebFramework.class) public class FrameworkLoader implements ServletContainerInitializer { } public void onstartup(set<class<?>> c, ServletContext ctx) { //Load framework controller ctx.addservlet( SuperFrameworkController, myframework.controller.frameworkcontroller ); //Other processing... } 33

使用框架时解析 myframework.jar META-INF/web-fragment.xml META-INF/resources index.jsp images/logo.jpg META-INF/services/ 框架配置 框架配置 javax.servlet.servletcontainerinitializer myframework.frameworkloader 框架初始化 34

< 在此处插入图片 > 异步 Servlet 35

等待反应缓慢的资源 浏览器 Web 服务器数据库 Web 服务 被阻塞的线程 36

为什么要使用异步 Servlet? 非常适用于以下情况的 web 应用程序 长处理时间或伪长处理时间 等待资源释放 如数据库连接 等待事件发生 如聊天消息 等待缓慢服务的响应 如 web 服务 释放当前请求处理以便处理其他请求 为 web 容器提供了更好的可伸缩性 浏览器将仍然显示为等待 用户体验没有改变 不要与异步 I/O 混淆 目前的 Servlet 3.0 不支持 37

异步 Servlet 浏览器 Web 服务器数据库 Web 服务 请求线程 释放后可用于处理 请他请求 38

AsyncContext 调用 HttpServletRequest.startAsync() 将 servlet 置于异步模式 流将不在从 Servlet.service() 返回时提交 返回 AsyncContext 对象 AsyncContext.start() 启动请求 将其指派给工作线程 AsyncContext.dispatch() 通知工作已经完成 将控制传递回 web 容器 39

异步 Servlet 示例 1 @WebServlet(urlPatterns= /hello, asyncsupported=true) public class HelloServlet extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse res) throws Exception { //Put the request in async mode AsyncContext asyncctx = req.startasync(); //Create an instance of handler SlowResourceHandler handler = new SlowResourceHandler(asyncCtx); } //Starts the process asyncctx.start(handler); //Request will not commit on return 40

异步 Servlet 示例 2 public class SlowResourceHandler implements Runnable { private AsyncContext asyncctx; public SlowResourceHandler(AsyncContext c) { asyncctx = c; } } public void run() { //Perform some long running task... //Dispatches to the response //Completes the request asyncctx.dispatch( displayresult.jsp ); } 41

< 在此处插入图片 > 案例研究 结账 42

购物车结账 结账操作成本高昂 耗时漫长 创建订单 处理商品 ( 例如, 特价商品 ) 信用卡验证和支付 更新客户帐户 制作交货单等 在完成所有这些独立的操作之前, 请求线程将被阻塞 可选择分流到异步 servlet 请求线程将被释放 在结账完成时处理响应 允许独立于处理线程限制请求线程 43

结账 3 种实现 44

异步 EJB EJB 3.1 引入了异步 EJB 在类或方法上使用 @Asynchronous 批注 以 void 作为返回类型, 实现即发即弃 以 Future<?> 作为返回类型, 实现稍后获取结果 EJB 的执行由容器调度 可将 EJB 打包在 WAR 文件中 简化的打包 45

CheckOutServlet @WebServlet( /checkout, asyncsupported=true) @ServletConstraint( value=@httpconstraint(transportguarantee=confidential) httpmethodconstraints={@httpmethodconstraint( value= POST, rolesallowed={ authenticate })) public class CheckOutServlet extends HttpServlet {... @EJB CheckOutBean checkoutbean; public void dopost(... request,... response) { //Perform some checking... AsyncContext ctx = request.startasync(); checkoutbean.processasync(ctx); //Request thread freed on exit } 46

CheckOutBean @Stateless public class CheckOutBean { @TransactionAttribute(REQUIRED) @Asynchronous public void processasync(asynccontext ctx) { try { //Process checkout... ctx.dispatch( /checkout-success ); } catch (Exception e) { sessioncontext.rollbackonly();... ctx.dispatch( /checkout-failed ); } } 47

< 在此处插入图片 > 总结 48

总结 2.4 之后的重大修订 编程模型与其他 EE 规范更趋一致 可插拔性与按需加载 将责任交给框架开发人员 为 Comet 样式的应用程序提供更好的支持 49

硬件和软件, 集成设计 卓越性能 50