编辑: 摇摆白勺白芍 | 2019-09-04 |
6 Servlet 3.
0 中的新特性
2 议题 ? 易于开发和部署 ? 模块化 web.xml ? 动态配置 ? 异步 Servlet
3 ? 用于 Web 应用程序的功能全面的中型 profile ? web profile 中的各种技术 C Servlet 3.
0、JSP 2.
1、对其他语言的调试支持、EL 1.
2、JSTL 1.
2、JSF 2.0 C EJB Lite 3.
1、JTA 1.
1、JPA 2.
0、通用批注 C Bean validation 1.0 Web Profile 完整的 JavaEE
6 Web Profile
4 易于开发和部署
5 简化的打包 foo.ear foo_web.war WEB-INF/web.xml WEB-INF/classes com.sun.FooServlet com.sun.TickTock foo_ejb.jar com.sun.FooBean com.sun.FooHelper foo.war WEB-INF/classes com.sun.FooServlet com.sun.TickTock com.sun.FooBean com.sun.FooHelper Java EE
5 Java EE
6 6 Servlet ― 下一代 ? Servlet 3.0 ― 易于开发 C 主要关注点 ? 增强了 API 以便使用 SE
5 中新的语言特性 C 例如:批注、泛型(Generics) C 在上次 JavaEE
5 中漏掉的 Servlet ? 部署描述批注 C 现在 web.xml 为可选 ? 用于保证 API 类型安全的泛型(Generics) C 不影响后向兼容性 ? 惯例优先原则(Convention over) C 更好的默认值 C 例外配置
7 Servlet 2.x public class HelloServlet extends HTTPServlet { public void doGet(HttpServletRequest req , HttpServletResponse res) throws Exception { … } } HelloServlet myservlet.HelloServlet HelloServlet /hello . . .
8 Servlet 3.0 ― 示例
1 无web.xml @WebServlet(name=‖HelloServlet‖, urlPatterns=D/hello‖) public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest req , HttpServletResponse res) throws Exception { . . . } //name=‖HelloServlet‖, urlPatterns=‖/hello‖ @WebServlet(D/hello‖) public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest req , HttpServletResponse res) throws Exception { . . . }
9 @WebServlet ? 用于指定 servlet ? 批注至少必须有 urlPattern C urlPattern 属性是默认属性 ? 即value() ? 所有其他字段都有合理的 默认值 C 例如,servlet 的名称默认为 servlet 的全称类名 ? 类的其余内容与之前相同 C 必须扩展 HttpServlet 类C重写 doXXX() 来处理行为 ? @WebListener、@WebFilter 的工作方式相同
10 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 );
… } …
11 使用批注 ? 用于部署 servlet、过滤器、监听器的批注 C @WebServlet ― 向web.xml 中添加 servlet 项C@WebFilter ― 添加过滤器项 C @WebListener ― 添加监听器项 C @WebInitParam ― 添加参数项 C @MultiPartConfig ―表示 servlet 要求使用 mime/multipart 数据 格式 ? 在部署时使用 web.xml 覆盖批注值
12 Servlet 3.0 ― 示例
2 @WebFilter(urlPatterns= /hello , dispatcherTypes={ DispatcherType.FORWARD} ) public class HelloServletFilter implements Filter { public void doFilter(HttpServletRequest req , HttpServletResponse res) { . . . }
13 Multipart 支持 ? Multipart 格式用于在 HTTP 流中分割传输内容 C 通常是表单数据、非ASCII 数据、二进制数据等 Name: File to upload: 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‖ …
14 Multipart 支持 ? Servlet 目前原生支持 multipart 数据 C 以前必须借助于第三方库 ? 获得 MIME 内容的新方法 C HttpServletRequest.getParts() C Iterable C HttpServletRequest.getPart(String name) C String ? 类似功能 C HttpServletRequest.getParameter(Dname‖) C HttpServletRequest.getPart(Dname‖) ? 比前者更通用的形式
15 @MultipartConfig 批注 ? 帮助 servlet 容器确定哪个 servlet 将处理 multipart 数据 ? 配置容器处理数据的方式 C 临时文件的位置 C 最大文件大小 @WebServlet(D/hello‖) @MultipartConfig(location=‖/tmp‖) public class HelloServlet extends HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) { Part part = req.getPart(Dmyfile‖);
InputStream is = part.getInputStream();
//Read in file . . . }
16 模块化 web.xml
17 最新发展 ― web.xml ? 多种非常高效的 web 框架 ? 框架的使用需要(可能是复杂的)配置 C 如果使用多种框架则难以管理 ― 复杂性增加 C 需要知道各框架之间的整合方式 ? 例如 C 声明控制器 servlet 及其参数 C 处理请求前后所使用的过滤器 C 声明监听器以便管理应用程序生命周期的各点 ? 很多这种配置在应用程序间通用
18 模块化 web.xml ? 允许在没有框架配置的情况下使用框架 C 为您的应用程序保留 web.xml C 将框架配置工作放在框架这边 ? 允许框架将它们的 web.xml 存储在自己的 JAR 中C在应用程序启动期间合并它们 ? web.xml 分段的概念
19 web.xml 与web-fragment.xml web.xml … web-fragment.xml … web-fragment.xml … 来自框架的 JAR
20 web-fragment.xml ? 用于指定整个 web.xml 的一部分 ? 除根元素外与 web.xml 相同 C ? 位于框架的 JAR 中CMETA-INF/web-fragment.xml C JAR 文件必须位于 WEB-INF/lib 中21 web-fragment.xml 示例 javax.faces.STATE_SAVING_METHOD client . . . Faces Servlet javax.faces.webapp.FacesServlet
1 Faces Servlet *.jsf . . .
22 web-fragment.xml 示例 jsf_framework.jar META-INF/web-fragment.xml mywebapp.war WEB-INF/lib/jsf_framework.jar
23 资源共享 ? 静态页面和 JSP 页面,资源不再局限于应用程序的 DOCROOT C 允许框架捆绑自己的资源 ? 资源位于框架的 JAR 文件中 C META-INF/resources C ServletContext.getResourceAsStream() 将知道如何解析资源 位置 ? 应用程序 DOCROOT 中的资源优先于框架 JAR 文件中 的资源 C 如果存在命名空间冲突 ? D/‖ 对应 DOCROOT 或META-INF/resources
24 资源共享示例 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
25 动态配置与按需加载
26 动态配置 ? 以编程方式添加 servlet、监听器和过滤器 C 例如,自动添加 Strut 的ActionServlet ? 只能在下列各项中执行配置 C ServletContextListener.contextInitialized() ? 由应用程序实现 ? 应用程序启动时调用 C ServletContainerInitializer.onStartup() ? 稍后详细介绍 C 使用返回的 Registration 对象进一步定制 ? 例如,映射、初始化参数、servlet 名称等
27 web.xml 配置 action org.apache.struts.action.ActionServlet config /WEB-INF/struts-config.xml
2 action *.do
28 编程式配置 @WebListener(DAuto configure Struts‖) public class MyListener implements ServletContextListener { public void contextInitialized(ServletContextEvent evt) { ServletContext ctx = evt.getServletContext();
//Register the servlet ServletRegistration.Dynamic servReg = ctx.addServlet( Daction‖, Dorg.apache.struts.action.ActionServlet‖);
//Set init parameter servReg.setInitParameter(Dconfig‖ , D/WEB-INF/struts-config.xml‖);
servReg.setLoadOnStartup(2);
//Add mappings servReg.addMapping(D*.do‖);
//Annotate with @MultipartConfig servReg.setMultipartConfig( new MultipartConfigElement(D/tmp‖));
} }
29 动态配置的局限 ? 注册仅发生在应用程序启动时 C 之后不能更改 ? 无法以编程方式删除 servlet........