Microsoft Word - 第5章.doc

Size: px
Start display at page:

Download "Microsoft Word - 第5章.doc"

Transcription

1 第 5 章 解密 Struts 之核心文件 在第 4 章中简单介绍了 Java Web 开发的三大框架之一的 Struts 2 框架的一些基本概念及其开发的流程 在 Struts 2 项目开发中, 有一个重要的过程就是其配置文件的配置 本章将介绍 Struts 核心配置文件的具体作用及其配置方式, 然后介绍 Struts 2 框架中的另一种文件 Action 类文件, 本章的主要内容如下 : 配置文件 web.xml 配置文件 struts.properties 配置文件 struts.xml Action 类文件 5.1 Struts 配置文件之 web.xml 本节介绍 Struts 2 框架中的 web.xml 配置文件, 先介绍该文件的主要作用, 然后对该文件中的关键元素进行分析 web.xml 文件中包含了大量的标签元素, 这些元素都对应着各自不同的功能 web.xml 文件中的元素种类繁多, 但读者不需要记住所有的, 只需要掌握一些常用的标签元素即可 web.xml 的主要作用 不管是基于 MVC 框架的 struts 2 框架, 还是基于 Servlet 的纯 JSP 工程, 只要开发者想要开发 Java Web 的程序, 就不得不学习 web.xml 文件的相关知识 所以,web.xml 是 Struts 2 框架中一个非常重要的配置文件, 对 Web 应用中一些初始信息进行了配置 Struts 2 框架要先依赖于过滤器 FilterDispatcher 来截获 Web 程序的 HTTP 请求, 再做进一步的处理 这就必须在 web.xml 文件中来配置 FilterDispatcher 过滤器 web.xml 除了用来配置过滤器外, 还可以用来配置 <session-config> 会话时间 欢迎页 错误页 监听器 控制器等等 web.xml 文件中含有一系列标签元素, 这些标签元素代表了不同的功能, 读者需要掌握其中一些基本的用法 web.xml 文件中可以包含哪些元素是由其对应的 Schema 文件来定义的 因此, 必须在每个 web.xml 文件的根元素 web-app 中指定其 Schema 文件的版本 web.xml 的 Schema 文件由 Sun 公司定义 01 <?xml version="1.0" encoding="utf-8"?> 02 <web-app id="webapp_9" version="2.4" xmlns="

2 第 2 篇表现层框架 Struts 技术 xml/ns/j2ee" 03 xmlns:xsi=" 04 xsi:schemalocation=" </web-app> 在上面代码的第 1 行定义了 XML 文件的版本和编码方式, 接着在 <web-app> </web-app> 标签中 ( 即第 2~6 行 ) 指明了 Schema 文件的来源 当需要添加其他标签时, 应该将其加入到 <web-app></web-app> 标签之间 ( 即第 5 行省略部分 ) web.xml 关键元素分析 下面对 web.xml 中的常用元素做一下介绍 1.welcome-file-list 和 welcome-file 元素 在访问一个网站时, 用户看到的第一个页面就是欢迎页面 通常, 欢迎页面都在 web.xml 中指定, 但在一个 Web 工程中 web.xml 并不是必须存在的 随着 Web 应用的功能越来越复杂,web.xml 逐渐变得日益重要, 因此, 一般在 Eclipse 中创建动态 Web 工程时都让其为我们自动生成一个 web.xml 文件 如果在访问 Web 应用时, 只指定了一个根名, 而没有指定具体的页面或 Action, 那么 Tomcat 就会查看 web.xml 中是否指定了欢迎页面, 如果指定了, 则访问此欢迎页面 ; 否则, Tomcat 默认会去查找 index.html 和 index.jsp 页面 ; 如果这两个页面也不存在, 就会报错 在 web.xml 文件中, welcome-file-list 和 welcome-file 元素就是用来指定欢迎页面的, welcome-file-list 元素可以包含多个 welcome-file 元素, 每个 welcome-file 元素指定一个欢迎页面 如下代码所示 : <welcome-file-list> <!-- 欢迎页面 --> <welcome-file>a.jsp</welcome-file> <welcome-file>b.jsp</welcome-file> </welcome-file-list> 在上面代码中,Tomcat 会按顺序来查找欢迎页面, 即如果 Web 应用中存在 a.jsp, 则它就是欢迎页面, 否则继续查找 b.jsp 2.filter 和 filter-mapping 元素 filter 元素用于声明一个过滤器, 使用该元素可以同时拦截多个请求的 URL filter-mapping 元素用来指定与过滤器关联的 URL, 代码如下 : <!-- 定义 Filter--> <filter> <filter-name>struts2</filter-name> <!-- 指定 Filter 的名字, 不能为空 --> <!-- 指定 Filter 的实现类, 此处使用的是 Struts2 提供的过滤器类 --> <filter-class>org.apache.struts2.dispatcher.ng.filter.strutspreparea ndexecutefilter</filter-class> </filter> <!-- 定义 Filter 所拦截的 URL 地址 --> 124

3 第 5 章解密 Struts 之核心文件 <filter-mapping> <filter-name>struts2</filter-name> <!--Filter 的名字, 该名字必须是 filter 元素中已声明过的过滤器名字 --> <url-pattern>/*</url-pattern> <!-- 定义 Filter 负责拦截的 URL 地址 --> </filter-mapping> 上面代码中 <url-pattern></url-pattern> 标签中的 /* 表明该过滤器可以拦截所有的 HTTP 请求 3.error-page 元素 虽然 Struts 框架提供了通用的错误处理机制, 但是并不能保证对所有错误和异常都能进行处理 如果 Struts 框架不能处理某种错误, 就会把它抛给 Web 容器来处理 默认情况下,Web 容器会将原始的错误信息返回给用户浏览器, 如 HTTP404 错误 如果不希望用户看到原始的错误信息, 就可以在 web.xml 文件的 error-page 元素中进行配置 还可以通过配置 error-page 元素来捕获 Java 异常, 此时需要设置 exception-type 子元素来指定 Java 异常类 error-page 元素用来指定错误处理页面 可以通过配置错误码元素 error-code 以避免用户直接看到原始错误信息 还可以配置异常类型元素 exception-type 来指定 Java 中的异常类, 代码如下 : <!-- 配置异常页 --> <error-page> <error-code>404</error-code> <!-- 指定错误代码 --> <location>/error.jsp</location> <!-- 如果发生 HTTP404 错误, 则返回 location 子元素中指定的文件 --> </error-page> <!-- 下面代码段和上面代码段效果一样 --> <!-- 配置 error-page 元素用于捕获 Java 异常 --> <error-page> <exception-type>java.lang.exception<exception-type><!-- 指定 Java 异常类 --> <location>/error.jsp<location> </error-page> 4.listener 元素 该元素用来注册监听器类, 并使用子元素 listener-class 指定监听程序的完整限定类名, 下面的代码设置了监听器, 用于初始化 Spring 框架 : <!-- 监听器 --> <listener> <listener-class>org.springframework.web.context.contextloaderlistener </listener-class> </listener> 5.session-config 元素 该元素用来指定会话过期时间, 下面代码表示会话时间超过 30 分钟,session 对象里面存放的值会自动失效 : <!-- 会话时间配置 --> <session-config> 125

4 第 2 篇表现层框架 Struts 技术 <session-timeout>30</session-timeout> </session-config> 通常, 该元素用在需要记录用户登录状态的时间的应用中, 将用户登录的关键信息放入 session 对象中 如果用户登录的时间超过配置的时间, 该信息就会丢失, 这样用户就需要重新登录 因此, 使用该元素可以保证用户的登录安全 6.init-param 元素 该元素用来定义参数, 在 web.xml 中可以有多个 init-param 元素 下面的代码使用 init-param 元素设置了常量 : <!-- 配置常量 --> <init-param> <param-name> struts.i18n.encoding </param-name> <param-value> UTF-8</param-value> </init-param> 例 5-1 本例说明 web.xml 配置文件的使用方式 (1) 首先在 Eclipse 中创建一个新工程 ErrorPage, 将 Struts 2 框架所需的支持库添加到 WEB-INF 目录下的 lib 文件夹中 在 WEB-INF 目录下创建 web.xml 文件, 打开 web.xml 并写入如下代码 : <?xml version="1.0" encoding="utf-8"?> <web-app id="webapp_9" version="2.4" xmlns=" xmlns:xsi=" xsi:schemalocation=" <!-- 定义 Filter--> <filter> <filter-name>struts2</filter-name> <!-- 指定 Filter 的名字, 不能为空 --> <!-- 指定 Filter 的实现类, 此处使用的是 Struts 2 提供的过滤器类 --> <filter-class>org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- 定义 Filter 所拦截的 URL 地址 --> <filter-mapping> <!--Filter 的名字, 该名字必须是 filter 元素中已声明过的过滤器名字 --> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> <!-- 定义 Filter 负责拦截的 URL 地址 --> </filter-mapping> <!-- 欢迎页面 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- 错误 404 页面 --> <error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> </web-app> (2) 在 WebContent 目录下创建 index.jsp error.jsp 文件, 分别打开并编写代码, 核心代码如下 126

5 第 5 章解密 Struts 之核心文件 index.jsp 核心代码 : <body> <!--a 标签 --> <s:a action="hello">hello</s:a> </body> error.jsp 核心代码 : <body> <!-- 控制文本水平居中 --> <center> <h4>the page you request is not existing!</h4> </center> </body> (3) 运行程序, 结果如图 5.1 所示, 单击链接后, 出现如图 5.2 所示的页面 图 5.1 例 5-1 运行结果 图 5.2 单击链接后 在这个例子中, 由于没有配置 struts.xml 等文件, 单击链接时会发生错误, 其错误码是 404, 根据 web.xml 文件中的配置, 会转到 error.jsp 页面 读者需要注意的是, 当 Web 应用程序运行过程中出错时, 会有对应的 HTTP 状态码与出现的错误相匹配,Web 服务器根据状态码就会返回相应的页面 此处由于在 web.xml 中配置了 404 错误的错误处理页面为 error.jsp, 所以会转到 error.jsp; 否则, 会转到 Web 服务器定义的 404 页面 404 错误码表示用户访问的页面不存在, 除此以外还有其他一些常用的 HTTP 状态码如下所示 : 200: 服务器成功返回网页 404: 请求的网页不存在 503: 服务不可用 403:Forbidden( 禁止 ), 服务器拒绝请求 408:Request Timeout( 请求超时 ), 服务器等候请求时发生超时 413:Request Entity Too Large( 请求实体过大 ), 服务器无法处理请求, 因为请求实体过大, 超出服务器的处理能力 414:Request-URI Too Long( 请求的 URI 过长 ), 请求的 URI( 通常为网址 ) 过长, 服务器无法处理 415:Unsupported Media Type( 不支持的媒体类型 ), 请求的格式不受请求页面的支持 416:Requested Range Not Satisfiable( 请求范围不符合要求 ), 如果页面无法提供请求的范围, 则服务器会返回此状态代码 127

6 第 2 篇表现层框架 Struts 技术 417:Expectation Failed( 未满足期望值 ), 服务器未满足 期望 请求标头字段的要求 500:Internal Server Error( 服务器内部错误 ), 服务器遇到错误, 无法完成请求 501:Not Implemented( 尚未实施 ), 服务器不具备完成请求的功能 例如, 服务器无法识别请求方法时可能会返回此代码 502:Bad Gateway( 错误网关 ), 服务器作为网关或代理, 从上游服务器收到无效响应 503:Service Unavailable( 服务不可用 ), 服务器目前无法使用 ( 由于超载或停机维护 ) 通常, 这只是暂时状态 504:Gateway Timeout( 网关超时 ), 服务器作为网关或代理, 但是没有及时从上游服务器收到请求 505:HTTP Version Not Supported(HTTP 版本不受支持 ), 服务器不支持请求中所用的 HTTP 协议版本 5.2 Struts 配置文件之 struts.properties 在 5.1 节介绍了 Struts 2 框架中的一个配置文件 web.xml, 本节将介绍 Struts 2 中的 struts.properties 配置文件 先介绍 struts.properties 文件的主要作用, 然后对文件中的关键元素进行详细分析 在 Struts 工程的开发中, 需要用到大量的属性, 这些属性大多在默认的配置文件中已经配置好, 但根据用户需求的不同, 开发的要求也不同, 可能需要更改这些属性值, 改变这些属性值的方法就是在 struts.properties 文件中来配置即可 struts.properties 的主要作用 struts.properties 是 Struts 2 框架中一个重要的配置文件, 程序员可以通过它来管理 Struts 2 框架中定义的大量常量 struts.properties 文件是一个标准的 properties 文件, 其格式是 key-value 对, 即每个 key 对应一个 value,key 表示的是 Struts 2 框架中的常量, 而 value 则是其常量值 struts.properties 文件必须放到 Web 应用下的类加载路径下才能使用, 即 WEB-INF/classes 路径下 在 Eclipse 中, 由于编译时,Eclipse 会自动将 src 路径下的 struts.properties 文件编译后放到 WEB-INF classes 路径下, 所以, 通常直接将其放到 src 路径下就可以了 前面说过,struts.properties 是一个 key-value 文件, 所以其格式比较简单, 下面是 struts.properties 文件的代码片段 : ### 设置默认编码集为 UTF-8 格式 struts.i18n.encoding=utf-8 ### 设置使用开发模式 struts.devmode=true ### 设置默认的 local 为 en_us struts.locale=en_us 128

7 第 5 章解密 Struts 之核心文件 struts.properties 关键元素分析 下面介绍一些常用的 Struts 2 常量 : struts.i18n.encoding: 该常量指定了 Web 应用中的默认编码集 通常, 由于使用中文字符集, 将其设置为 UTF-8 struts.devmode: 该常量指定 Struts 2 是否使用开发模式 当值设为 true 时, 表示使用开发模式, 可以在应用程序出错时显示更详细的出错提示 其默认值为 false 通常, 在开发阶段, 建议使用开发模式 ; 当产品发布后, 则可将该常量设置为 false struts.configuration: 该常量指定 Struts 2 框架的配置管理器, 如果程序员要开发自己的配置管理器, 需实现一个 Configuration 接口的类, 该类会自己加载 Struts 2 配置文件 struts.locale: 该常量指定 Web 应用的默认 Locale, 默认的 Locale 是 en_us struts.action.extension: 该常量指定由 Struts 2 处理的请求后缀 程序员可以根据需要设置, 默认的后缀是 action, 要设置多个请求后缀时要用逗号隔开 struts.tag.altsyntax: 该常量指定是否在 Struts 2 标签中使用表达式语法, 一般设置为 true struts.ui.theme: 该常量指定视图中 Struts 2 标签默认的主题, 默认值是 xhtml struts.custom.i18n.resources: 该常量指定 Web 应用所需要的国际化资源文件, 多个文件名用逗号隔开 struts.custom.properties: 该常量指定加载附加的配置文件的位置 struts.enable.dynamicmethodinvocation: 该常量指定 Struts 2 框架是否支持动态方法调用, 默认值为 true, 如果要关闭动态方法调用, 设置该常量为 false struts.i18n.reload: 该常量指定国际化信息是否自动加载, 默认值为 true, 如果不自动加载国际化信息, 则设置该常量为 false struts.url.http.port: 该常量指定 Web 应用的端口 以上只对一部分常用的常量进行了介绍, 读者如果想了解更多 Struts 2 常量的内容, 可以查阅相关资料 5.3 Struts 配置文件之 struts.xml 在 5.2 节中介绍了 struts.xml 配置文件, 本节将介绍 Struts 2 框架中的 struts.xml 配置文件, 先介绍 struts.xml 文件的主要作用, 然后对该文件中的关键元素进行分析 实际上, 在开发 Struts 项目的过程中,struts.xml 文件的使用频率和 web.xml 文件差不多, 二者都在 Struts 项目中得到了广泛的运用 所以,struts.xml 文件是开发 Struts 项目所必须掌握的 struts.xml 的主要作用 和 struts.properties 一样,struts.xml 也是 Struts 2 框架中一个重要的配置文件, 其存放 129

8 第 2 篇表现层框架 Struts 技术 路径和 struts.properties 一样, 位于 WEB-INF/classes 路径下 struts.xml 文件主要用来配置 Action 和 HTTP 请求的对应关系, 以及配置逻辑视图和物理视图资源的对应关系 但除了这些功能之外,struts.xml 文件还有一些额外的功能, 如配置常量 导入其他配置文件等 相比 struts.properties 文件格式,struts.xml 文件配置的格式复杂得多 下面的代码是 struts.xml 文件最基本的配置 : <!-- 必不可少的 --> <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" " <!--struts 根元素 --> <struts> <!-- 配置包 default, 命名空间为 / --> <package name="default" namespace="/" extends="struts-default"> <!-- 配置名为 NN 的 Action, 实现类为 XXXAction--> <action name="nn" class=" XXXAction"> <result>/yy.jsp</result> <!-- 返回 YY.jsp --> </action> </package> </struts> 在上面代码中,<struts../> 是根标签, 所有其他的标签都放在 <struts></struts> 中间 ; package 元素定义了一个包, 在 Struts 2 框架中, 用包来组织 Action 和拦截器等, 每个包都是零个或多个拦截器以及 Action 所组成的集合 ;action 元素定义了一个 Action 和其对应的类 ;result 元素定义了 Action 返回结果对应的 JSP 视图 struts.xml 关键元素分析 下面对 struts.xml 的相关内容进行详细介绍 1. 几个重要的元素 (1)package 元素 package 元素用来配置包 在 Struts 2 框架中, 包是一个独立的单位, 通过 name 属性 来唯一标识包 还可以通过指定 extends 属性让一个包继承另一个包,extends 属性值就是 被继承包的 name 属性值, 继承包可以从被继承包那里继承到拦截器 Action 等 此外,Struts 2 还提供了 abstract 属性, 表示该包是一个抽象包, 抽象包中不能有 Action 的定义 package 元素的属性如表 5.1 所示 表 5.1 package 元素属性 属性 说 明 name 这是一个必须属性, 标识包的名字, 以便在其他包中被引用 extends 可选属性, 指定该包继承自其他包 namespace 可选属性, 指定命名空间, 标识此包下的 Action 的访问路径 abstract 可选属性, 指定该包为抽象包 130

9 第 5 章解密 Struts 之核心文件 在表 5.1 中可以看到,package 元素有一个 namespace 属性, 该属性可以指定包对应的命名空间 由于在一个 Web 应用中可能出现同名的 Action 并存的情况, 为了避免命名冲突, 只要使同名 Action 位于不同的 namespace 下就可以了 如果 package 元素没有指定 namespace 属性, 则其下定义的所有 Action 都处于默认的命名空间下 下面以一个示例来说明 package 命名空间属性的用法 : <!-- 配置名为 A 的包, 继承了 struts-default, 命名空间为默认的命名空间 --> <package name="a " extends="struts-default"> <action name="login" class="com.action.loginaction"> <result name="login_success">/login_success.jsp</result> </action> </package> <!-- 配置名为 B 的包, 继承了 struts-default, 命名空间为 "/"--> <package name="b" namespace="/" extends="struts-default"> <action name="exit" class="com.action.exit Action"> <result name="exit_success">/exit_success.jsp</result> </action> </package> <!-- 配置名为 C 的包, 继承了 struts-default, 命名空间为 "/info"--> <package name="c" namespace="/info" extends="struts-default"> <action name="stu" class="com.action.stu Action"> <result name="stu_info">/stu_info.jsp</result> </action> </package> 在上面代码中, 配置了两个包 :A 和 B 对于包 A, 由于没指定命名空间, 则其命名空间为默认命名空间 ; 对于包 B, 其命名空间是根命名空间 ; 对于包 C, 其命名空间则是 info 当包指定命名空间后, 该包所包含的 Action 处理的 URL 应该就是命名空间 +Action 名 即包 A 下名为 login 的 Action 处理的 URL 是 包 B 下名为 exit 的 Action 处理的 URL 是 包 C 下名为 stu 的 Action 处理的 URL 是 其中 8080 是笔者的 Tomcat 服务器的端口号 对于 URL 中指定的 Action,Struts 2 是按一定的顺序来查找的 如果要访问 /C/stu_info.action,Struts 2 框架首先查找 /C 命名空间里名为 stu_info 的 Action, 如果该命名空间里找到对应的 Action, 则使用其对应的 Action 来处理请求 ; 否则,Struts 2 框架到默认命名空间查找名为 stu_info 的 Action, 如果找到, 则使用其对应的 Action 来处理请求 ; 如果两个命名空间里都找不到名为 stu_info 的 Action, 则系统出现错误 另外, 读者有两个要注意的地方 : 第一, 根命名空间和普通命名空间中的 Action 的查找是一样的, 即如果有请求 /stu_info.action, 则先查找根命名空间下的 Action, 如果不存在对应的 Action, 则查找默认命名空间里的 Action 第二, 对于多级别的命名空间,Struts 2 框架在最底层的命名空间里查找后, 如果不存在相应的 Action, 则会同样到默认命名空间里查找, 而不是到上一级命名空间里查找 即如果请求为 /A/A_Login/login.action 时,Struts 2 框架首先到 /A/A_Login 的命名空间里查找名为 login 的 Action, 如果找不到对应的 Action, 则会到默认命名空间里查找, 而不是到 /A 的命名空间里查找 (2)action 元素 Struts 2 框架通过 Action 对象来处理 HTTP 请求, 该请求的 URL 地址对应的 Action 即 131

10 第 2 篇表现层框架 Struts 技术 配置在 action 元素中, 如下代码所示 : <action name="useraction" class=" com.action.useraction"> <result>/user.jsp</result> </action> action 元素除了有 name 和 class 属性外, 还有 method 和 converter 属性, 表 5.2 列出了 action 元素的各个属性 表 5.2 action 元素属性 属性 说 明 name 这是一个必须属性, 标识 Acton, 指定了该 Action 所处理的请求的 URL class 可选属性, 指定 Action 对象对应的实现类 method 可选属性, 指定请求 Action 时调用的方法 converter 可选属性, 指定类型转换器的类 在配置 action 元素时, 如果没有指定 class 属性值, 则其默认值为类 com.opensymphony.xwork2.actionsupport, 该默认类会使用默认的处理方法 execute() 来处理请求 实际上,execute() 方法不会做任何处理而直接返回 success 值 在配置 action 元素时, 如果指定 method 属性值, 则该 Action 可以调用 method 属性中指定的方法, 而不是默认的 execute() 法 (3)result 元素当调用 Action 方法处理结束返回后, 下一步就是使用 result 元素来设置返回给浏览器的视图 配置 result 元素时常需指定 name 和 type 两个属性 name 属性对应从 Action 方法返回的值, success 为其默认值 type 属性指定结果类型, 默认的类型是 dispatcher,struts 2 支持的结果类型如表 5.3 所示 表 5.3 Struts2 支持的结果类型 结果类型 说 明 dispatcher 将请求 forward( 转发 ) 到指定的 JSP 页面 redirect 将请求重定向到指定的视图资源 chain 处理 Action 链 freemarker 指定使用 Freemarker 模板作为视图 httpheader 控制特殊的 HTTP 行为 redirect-action 直接跳转到其他 Action stream 向浏览器返回一个 InputStream( 一般用于文件下载 ) velocity 指定使用 velocity 模板作为视图 xslt 用于 XML/XSLT 整合 plaintext 显示某个页面的原始代码 读者需要注意的是 dispatcher 和 redirect 的区别, 也就是转发和重定向的区别, 重定向会丢失所有的请求参数, 而且会丢失 Action 的处理结果 此处先介绍 redirect 和 redirect-action 这两种结果类型, 其他一些常用类型会在后续章节进行介绍 1 redirect 类型 redirect 结果类型与 dispatcher 结果类型刚好是相反的, 初学者在使用时容易将它们混 132

11 第 5 章解密 Struts 之核心文件 淆 dispatcher 结果类型表示将 HTTP 请求转发到指定的 JSP 资源,redirect 结果类型则是将请求重定向到 JSP 资源, 而重定向的结果则会丢失所有的请求参数和 Action 的处理结果 2 redirect-action 类型 redirect-action 结果类型主要用于当一个 Action 处理结束后, 将请求重定向到另一个 Action 它和 redirect 结果类型一样, 会重新生成一个新请求, 而且 Action 处理结果及请求的所有参数都会丢失, 只是 redirect-action 结果类型生成的请求是一个 Action, 而 redirect 结果类型生成的请求是一个 JSP 资源 例 5-2 本例说明 redirect-action 结果类型的用法 (a) 在 Eclipse 创建一个 Java Web 项目, 将 Struts 2 框架所需的支持库添加到 WEB- INF 目录下的 lib 文件夹中, 然后在 WEB-INF 目录下添加 web.xml 文件, 并在其中注册过滤器和欢迎页面 web.xml 文件代码如下所示 : <?xml version="1.0" encoding="utf-8"?> <web-app id="webapp_9" version="2.4" xmlns=" xml/ns/j2ee" xmlns:xsi=" xsi: schemalocation=" <!-- 定义 Filter--> <filter> <filter-name>struts2</filter-name> <!-- 指定 Filter 的名字, 不能为空 --> <!-- 指定 Filter 的实现类, 此处使用的是 Struts 2 提供的过滤器类 --> <filter-class>org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- 定义 Filter 所拦截的 URL 地址 --> <filter-mapping> <!--Filter 的名字, 该名字必须是 filter 元素中已声明过的过滤器名字 --> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> <!-- 定义 Filter 负责拦截的 URL 地址 --> </filter-mapping> <!-- 欢迎页面 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> (b) 在 src 目录下创建包 com.action, 在该包下创建 LoginAction.java 和 UserAction.java 文件, 这两个文件的代码如下所示 LoginAction.java 代码如下 : package com.action; import com.opensymphony.xwork2.actionsupport; public class LoginAction extends ActionSupport{ private static final long serialversionuid = 1L; // 重载 execute() 方法, 返回 SUCCESS public String execute() throws Exception { return SUCCESS; //redirect() 方法, 返回 ERROR public String redirect() throws Exception { return ERROR; 133

12 第 2 篇表现层框架 Struts 技术 UserAction.java 代码如下 : package com.action; import com.opensymphony.xwork2.actionsupport; public class UserAction extends ActionSupport{ private static final long serialversionuid = 1L; // 重载 execute() 方法, 返回 SUCCESS public String execute() throws Exception { // TODO Auto-generated method stub return SUCCESS; (c) 在 src 目录下创建 struts.xml 文件, 代码如下 : <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" " <struts> <!-- 配置包 default, 该包继承了 struts-default --> <package name="default" extends="struts-default"> <!-- 配置名为 login 的 Action, 实现类为 LoginAction --> <action name="login" class="com.action.loginaction"> <!--redirectaction 返回类型 --> <result type="redirectaction"> <param name="actionname">userlogin</param> <!--Action 名参数 -> <param name="namespace">/user</param> <!-- 命名空间参数 --> </result> <!-- 返回值为 error,redirectaction 类型, 重定向到名为 error 的 Action--> <result name="error" type="redirectaction">error</result> </action> <!-- 配置名为 error 的 Action --> <action name="error"> <result>/error.jsp</result> </action> </package> <!-- 配置名为 user 的包, 命名空间为 /user--> <package name="user" extends="struts-default" namespace="/user"> <!-- 配置名为 userlogin 的 Action--> <action name="userlogin" class="com.action.useraction"> <result>/hello.jsp</result> </action> </package> </struts> (d) 在 WebContent 目录下创建文件 index.jsp hello.jsp 和 error.jsp, 核心代码如下所示 index.jsp 文件核心代码如下 : <body> <center> <s:a action="login">login</s:a><br/> <s:a action="login!redirect.action">redirect</s:a> </center> </body> hello.jsp 文件核心代码如下 : 134

13 第 5 章解密 Struts 之核心文件 <body> <center> <h2>hello</h2> </center> </body> error.jsp 文件核心代码如下 : <body> <center> <h2>error</h2> </center> </body> (e) 运行程序, 结果如图 5.3 所示, 单击 login 链接后, 返回如图 5.4 所示的页面 ; 单击 redirect 链接后, 返回如图 5.5 所示的页面 图 5.3 例 5-2 运行结果 图 5.4 单击 login 链接后 图 5.5 单击 redirect 链接后 135

14 第 2 篇表现层框架 Struts 技术 在这个例子中, 读者应该注意到 redirect 结果类型的运用有两种方式 : 一是直接在 <result> 标签后添加 Action 名称, 二是运用 <param> 标签的方式来指定 Action 这两种方式都可以达到同样的效果, 可以根据需要选用 (4)include 元素该元素用来在一个 struts.xml 配置文件中包含其他的配置文件 默认情况下, 当查找 Action 时,Struts 2 框架只会加载 struts.xml 配置文件, 但是当系统规模增大到一定的程度时, 系统中的 Action 数量也会大大增加, 这将会导致一个 struts.xml 配置文件中包含大量的 Action, 显然不方便开发者进行编辑 通过 <include../> 标签, 可以将 Action 以模块的方式来加以管理, 即将存在相关性的 Action 放到同一个 xml 文件中, 然后通过在 struts.xml 文件中配置 <include../> 标签来将它们组合在一起 使用 include 元素的 struts.xml 文件片段如下所示 : 136 <struts> <include file="a.xml"/> <include file="b.xml"/> <include file="c.xml"/> <include file="d.xml"/> </struts> 需要注意的是, 这些模块化的 xml 文件也必须是标准的 Struts 2 配置文件, 即必须包含头信息以及根元素等 通常,Struts 2 框架的所有配置文件都放在 WEB-INF/classes 路径下, 由于 struts.xml 文件中配置了 <include../> 标签, 则可以将其对应包含的文件信息加载进来 (5)global-results 元素该元素配置包中的全局结果, 其代码示例如下所示 在该代码示例中配置了一个全局结果, 这个全局结果的作用范围为包下面所有 Action 当一个 Action 处理用户请求后返回时, 会首先在该 Action 本身的局部结果中进行搜索, 如果局部结果中没有对应的结果, 则会查找全局结果 <struts> <!-- 配置包 default, 命名空间为 / --> <package name="default" namespace="/" extends="struts-default"> <!-- 全局结果 --> <glabal-results> <result name= success >/SUCCESS.jsp</result> </global-result> <!-- 配置名为 user 的 Action --> <action name="user" class="com.action.useraction"> <result name="hello">/hello.jsp</result> <!-- 返回 hello --> </action> </package> </struts> (6)default-action-ref 元素该元素用来配置默认的 Action, 即如果 Struts 2 找不到对应的 Action 时, 就会使用默认的 Action 来处理用户请求 <!-- 默认 Action 为 defaultaction--> <default-action-ref name="defaultaction"/> <action name="defaultaction" class="com.action.xxxaction">

15 第 5 章解密 Struts 之核心文件 <result../> </action> 在以上代码中,default-action-ref 元素仅有一个 name 属性, 该 name 属性指向一个 Action, 这个 Action 将成为默认的 Action 2.Action 的动态调用 (DMI) 在前面介绍的标签的使用中,Action 对象对 URL 请求的处理都是调用其默认的 execute() 方法, 对于单一的业务逻辑请求, 这种方式或许适合 但是, 在实际的项目开发中, 业务请求的类型的方法是多种多样的, 即对同一个 Action 可能有不同的请求, 通过创建多个 Action 能够解决这个问题, 但是会使程序更复杂, 且要编写更多的代码 如果请求的方式有很多种, 可以在 execute() 方法中通过判断请求的业务逻辑类型来转发到相应的处理方法中, 这也是一种解决方案 Struts 2 提供了这种包含多个处理逻辑的 Action 处理方式, 即 DMI(Dynamic Method Invocation, 动态方法调用 ) 通过动态请求 Action 对象中的方法, 可以实现对某一业务逻辑的处理 DMI 处理方式是通过请求 Action 对象中的一个具体的方法来实现动态的操作 具体说就是, 在请求 Action 的 URL 地址后加上请求方法字符串, 与 Action 对象中的方法进行匹配 其中,Action 对象名称和方法之间用! 隔开 即如果在 struts.xml 文件中配置了名为 user 的 Action, 为了请求 change() 方法, 请求方式应表示为 /user!change.action 例 5-3 本例创建一个工程来说明 DMI 的使用 (1) 在 Eclipse 中创建一个 Java Web 项目 DMIDemo, 将 Struts 2 框架所需的支持库添 加到 WEB-INF 目录下的 lib 文件夹中, 然后在 WEB-INF 目录下添加 web.xml 文件, 并在其中注册过滤器和欢迎页面 web.xml 文件代码如下所示 : <?xml version="1.0" encoding="utf-8"?> <web-app id="webapp_9" version="2.4" xmlns=" xml/ns/j2ee" xmlns:xsi=" xsi:schemalocation=" <!-- 定义 Filter--> <filter> <filter-name>struts2</filter-name> <!-- 指定 Filter 的名字, 不能为空 --> <!-- 指定 Filter 的实现类, 此处使用的是 Struts 2 提供的过滤器类 --> <filter-class>org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- 定义 Filter 所拦截的 URL 地址 --> <filter-mapping> <!--Filter 的名字, 该名字必须是 filter 元素中已声明过的过滤器名字 --> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> <!-- 定义 Filter 负责拦截的 URL 地址 --> </filter-mapping> <!-- 欢迎页面 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> 137

16 第 2 篇表现层框架 Struts 技术 (2) 在 src 目录下创建 com.action 包, 并在该包中创建类 UserAction, 其代码如下 : package com.action; import com.opensymphony.xwork2.actionsupport; public class UserAction extends ActionSupport{ private static final long serialversionuid=1l; private String info; //info 属性 //info 属性的 getter 方法 public String getinfo() { return info; //info 属性的 setter 方法 public void setinfo(string info) { this.info = info; // 重载 execute() 方法 public String execute() throws Exception { info="hello,world"; return "hello"; //update() 方法, 更新 info 属性 public String update()throws Exception{ info="ok,updated"; return "update"; (3) 在 WebContent 目录下创建 index.jsp hello.jsp 和 update.jsp 文件 index.jsp 文件 : <body> <center> <a href="user">hello</a><br> <a href="user!update.action">update</a> </center> </body> hello.jsp 文件 : <body> <center> <s:property value="info"/> </center> </body> update.jsp 文件 : <body> <center> <s:property value="info"/> </center> </body> (4) 在 src 目录下创建 struts.xml 文件 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" " <struts> 138

17 第 5 章解密 Struts 之核心文件 <!-- 配置包 default, 继承 struts-default--> <package name="default" namespace="/" extends="struts-default"> <!-- 配置名为 login 的 Action, 实现类为 com.action.useraction --> <action name="user" class="com.action.useraction"> <result name="hello">/hello.jsp</result> <!-- 返回 hello.jsp --> <result name="update">/update.jsp</result> <!-- 返回 update. jsp--> </action> </package> </struts> (5) 运行程序, 结果如图 5.6 图 5.7 和图 5.8 所示 图 5.6 test2 工程 图 5.7 单击 hello 页面 图 5.8 单击 update 页面 139

18 第 2 篇表现层框架 Struts 技术 注意 : 在单击 update 链接后, 请求交给 update() 方法进行处理, 这时浏览器的地址栏变为 由上例可以看到,Action 请求的处理方式并非一定要通过 execute() 方法来处理, 使用 DMI 方式常常更加方便灵活 实际上, 在现实的项目开发中, 可以将同模块的一些请求封装在同一个 Action 中, 使用 DMI 方式来处理不同的请求 3. 通配符 在实际的项目开发中, 会出现多个 Action 定义的绝大部分都是相同的情况, 这时就会产生大量冗余 对于这种情况,Struts 2 也给出了相应的解决方法, 即使用通配符 这种配置方式可以通过一定的命名约定来配置 Action 对象, 以达到简化定义的效果 在 struts.xml 文件中, 通配符主要指的是 * ** 和 \ 通配符 * 匹配 0 个或多个字符但不包含 / ; 通配符 ** 匹配 0 个或多个字符包含 / ; 通配符 \ 则是一个转义字符, 即匹配字符 \ 时, 用 \\ 来匹配 具体说明如表 5.4 所示 表 5.4 通配符说明 通配符 说 明 * 匹配 0 个或多个字符除了 / ** 匹配 0 个或多个字符包含 / \character 转义字符, \\ 匹配 \ ; \* 匹配 * 通配符 * 通常用在 <action> 标签的 name 属性中, 而在 class name 属性及 result 元素中使用 {N 的形式来代表前面第 N 个 * 所匹配的字符串,{0 来代表 URL 请求的整个 Action 字符串 下面举例来说明通配符的使用, 示例代码如下 : <package name="login" extends="struts-default"> <!-- 使用 * 通配符, 第一个 * 表示调用方法, 第二个 * 表示 Action --> < action name="*_*" class="com.coderdream.action.{2action" method="{1"> < result name="success">/{0suc.jsp </result> < /action> </package> 在上面的代码中, 当 URL 请求是 /update_login.action 时,<action> 的 name 属性中第一个 * 匹配 update, 第二个 * 匹配 Login, 所以对应的会调用 LoginAction 类中的 update() 方法 在结果映射中的记号是 {0, 则该记号会被整个 URL 代替, 所以返回页面是 update_loginsuc.jsp 读者需要注意的是 URL 请求时的匹配顺序, 即当有多个 Action 能和 URL 请求匹配时, 最后会调用哪个 Action 在 Struts 2 框架中, 在查找匹配的 Action 时, 首先会查找完全匹配的 Action, 然后会按照匹配的 Action 在 struts.xml 文件中出现的顺序来匹配, 即最前面的匹配的 Action 会被调用 例如,struts.xml 文件中配置了 3 个 Action, 其 name 属性值分别是 XAction *Action 和 *, 如果请求是 XAction, 则不管 name 属性值是 XAction 的 Action 出现的前后顺序, 都会调用该 Action 中对应的方法 ; 如果请求 YAction, 则会根据 name 属性值为 *Action 和 * 的这两个 Action 出现的顺序, 来决定最后调用的 Action 140

19 第 5 章解密 Struts 之核心文件 在 Struts 2 框架应用中, 通配符有一个常用的使用方式, 如下代码所示 : <!-- 不管调用哪个 Action, 默认返回名为 Action 名的 JSP--> < action name="*_*"> < result >{0.jsp </result> < /action> 上面代码中的 Action 没有指定 class 属性, 则该 Action 会使用 ActionSupport 类来处理请求 ( 后面会详细讲解 ), 而该 Action 类会直接返回 success 字符串, 则指定的 JSP 资源就是 {0.jsp 所代表的 JSP 资源 该 Action 的含义是不管请求哪个 Action, 都会返回与该 Action 名字相同的 JSP 页面 通过这种方式, 避免了用户直接访问系统的 JSP 页面, 而必须通过 Struts 2 框架来处理请求 4. 常量配置 在 5.2 节介绍过使用 struts.properties 文件来配置常量, 实际上, 在 struts.xml 中也能配置常量, 其配置方式如下代码所示 : <struts> <constant name="struts.i18n.encoding" value="utf-8" /> <!-- 配置默认编码集为 UTF-8 --> </struts> 上面代码配置了常量 struts.i18n.encoding, 指定其值为 UTF-8 struts.properties 文件能配置的常量都可以在 struts.xml 文件中用 <constant> 标签来配置 常量除了通过 struts.xml 文件和 struts.properties 文件来配置以外, 还可以通过 web.xml 文件来配置 下面代码使用了 web.xml 来配置常量 : <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter</filter-class> <!-- 配置默认编码集为 UTF-8 --> <init-param> <param-name>struts.i18n.encoding</param-name> <param-value>utf-8</param-value> </init-param> </filter> 上面的代码同样配置了常量 struts.i18n.encoding, 指定其值为 UTF-8 读者需要注意的是, 在 web.xml 文件中配置常量时,<init-param> 标签必须放在 <filter> 标签下 通常情况下,struts.properties struts.xml 和 web.xml 这 3 个文件都可用来配置常量, 但开发时一般的常量配置方式都是在 struts.xml 文件中来进行, 而不是在 struts.properties 文件或是 web.xml 文件中 在 Struts 2 框架中, 常量不仅仅存在于 struts.properties struts.xml 和 web.xml 这 3 个文件中, 还存在于一些支持 Struts 2 框架的 jar 包中, 如 struts-plugin.xml 文件以及 struts-default.xml 文件, 这些文件中都可以进行常量配置 通常,Struts 2 框架加载常量的顺序如下 : (1)struts-default.xml: 在 struts-core jar 文件中 (2)struts-plugin.xml: 在 struts-xxx jar 等 Struts 2 插件 jar 文件中 141

20 第 2 篇表现层框架 Struts 技术 (3)struts.xml (4)struts.properties (5)web.xml 在加载常量的过程中, 如果同一个常量出现在多个文件中, 则后者会覆盖前者的常量值 常量的配置方式是多种多样的, 但是都需要指定其 name 和对应的 value 5.4 Struts 之 Action 类文件 在前面介绍了 Struts 框架中的核心配置文件, 而在 Struts 项目开发中和这些核心配置文件同样重要的文件就是 Action 类文件 如果说,struts.xml struts.properties 和 web.xml 文件搭建起了 Struts 项目的结构, 那么 Action 类文件就实现了具体的业务逻辑处理,Action 类文件才是真正实现业务逻辑的文件 本节将详细介绍 Action 类文件的相关内容, 包括 Action 类的构造所需要的基类或接口 Action 类方法的实现所需访问的数据对象以及异常处理的配置, 并通过多个实例来讲解 Action 类的定义和具体使用方法 Action 接口和 ActionSupport 基类 在 Struts 2 框架中 Action 是其主要的业务逻辑处理对象,Struts 2 框架通过自动调用 Action 类的方法来实现相应的事件处理 一般的, 每个 Action 类都定义在一个单独的文件中, 实现不同的业务逻辑处理可以通过向该 Action 类中添加不同的方法来实现 因此, Action 类文件是 Struts 2 框架中非常重要的文件 下面来介绍 Action 类的构造所需要的 ActionSupport 基类以及 Action 接口 Struts 2 框架提供了一个 Action 接口, 该接口定义了 Struts 2 的 Action 类的实现规范 public interface Action{ public static final String ERROR="error"; public static final String SUCCESS="success"; public static final String INPUT="input"; public static final String LOGIN="login"; public static final String NONE="now"; public String execute() throws Exception; 由 Action 接口定义可以看到, 该接口定义了 5 个字符串常量和一个 execute() 方法 每个 Action 类都必须包含一个 execute() 方法, 该方法返回一个字符串 而接口中定义的 5 个常量用来统一 execute() 方法返回的值 实际上,ActionSupport 类实现了 Action 接口, 它是一个默认的 Aciton 实现类, 提供了很多默认方法, 包括数据校验方法 获取国际化信息方法等 实际应用中, 程序员定义的 Action 类都会继承 ActionSupport 类而不是实现 Action 接口, 这可以大大简化程序员的编码过程 值得一提的是, 由于自定义的 Action 类继承了 ActionSupport 类, 因此必须定义一个 142

21 第 5 章解密 Struts 之核心文件变量 serialversionuid 这是因为 ActionSupport 类实现了 Serializable 接口, 任何实现 Serializable 接口的类都必须声明变量 serialversionuid, 如下所示 : private static final long serialversionuid=1l; Action 与 Servlet API Struts 2 框架中的 Action 与 Servlet 是完全松耦合的, 这使得 Action 类更加方便进行测试 但对于 Web 应用来说,Servlet API 是不可忽略的 在 Java Web 应用中, HttpServletRequest HttpSession 和 ServletContext 这 3 个接口是最经常访问的 ( 这 3 个接口分别对应 JSP 内置对象中的 request session 和 application) 在 Struts 2 框架中访问 Servlet API 有如下几种方法 1. 通过 ActionContext 类访问 Strut 2 框架提供 ActionContext 类来访问 Servlet API, 几个常用方法如下 : void put(string key, Object value): 将 key-value 对放入 ActionContext 中, 模拟 Servlet API 中的 HttpServletRequest 的 setattribute() 方法 Object get(object key): 通过参数 key 来查找当前 ActionContext 中的值 Map getapplication(): 返回一个 Application 级的 Map 对象 Static ActionContext getcontext() : 获得当前线程的 ActionContext 对象 Map getparameters(): 返回一个包含所有 HttpServletRequest 参数信息的 Map 对象 Map getsession(): 返回一个 Map 类型的 HttpSession 对象 void put(object key,object value): 向当前 ActionContext 对象中存入名值对信息 void setapplication(map application): 设置 Application 上下文 void setsession(map session): 设置一个 Map 类型的 Session 值 要访问 Servlet API, 可以通过如下方式进行访问 : ActionContext context=actioncontext.getcontext(); context.put("name", "tom"); context.getapplication().put("name", "tom"); context.getsession().put("namme", "tom"); 在上面代码中, 通过 ActionContext 类中的方法调用, 分别在 request application 和 session 中放入了 ("name", "tom") 对 可以看到, 通过 ActionContext 类, 可以非常简单地访问 JSP 内置对象的属性 例 5-4 本例示范如何通过 ActionContext 类来访问 Servlet API (1) 在 Eclipse 创建一个 Java Web 项目 ActionContextDemo, 将 Struts 2 框架所需的支持库添加到 WEB-INF 目录下的 lib 文件夹中, 然后在 WEB-INF 目录下添加 web.xml 文件, 并在其中注册过滤器和欢迎页面, 代码如下所示 : <?xml version="1.0" encoding="utf-8"?> <web-app id="webapp_9" version="2.4" xmlns=" xml/ns/j2ee" xmlns:xsi=" xsi:schemalocation=" <!-- 定义 Filter--> 143

22 144 第 2 篇表现层框架 Struts 技术 <filter> <filter-name>struts2</filter-name> <!-- 指定 Filter 的名字, 不能为空 --> <!-- 指定 Filter 的实现类, 此处使用的是 Struts 2 提供的过滤器类 --> <filter-class>org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- 定义 Filter 所拦截的 URL 地址 --> <filter-mapping> <!--Filter 的名字, 该名字必须是 filter 元素中已声明过的过滤器名字 --> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> <!-- 定义 Filter 负责拦截的 URL 地址 --> </filter-mapping> <!-- 欢迎页面 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> (2) 在 src 目录下创建包 com.action, 在该包下创建 UserAction.java 类文件, 代码如下所示 : package com.action; import com.opensymphony.xwork2.actioncontext; import com.opensymphony.xwork2.actionsupport; public class UserAction extends ActionSupport{ private static final long serialversionuid = 1L; // 重载 execute() 方法 public String execute() throws Exception { ActionContext context=actioncontext.getcontext(); // 得到 ActionContext 实例 // 将 (name,"request:tom") 到 ActionContext 中 context.put("name", "request:tom"); // 得到 application 并将 (name,"application:tom") 放入 context.getapplication().put("name","application:tom"); // 得到 session 并将 (name,"session:tom") 放入 context.getsession().put("name", "session:tom"); return "hello"; // 返回 hello (3) 在 src 目录下创建 struts.xml 文件, 代码如下所示 : <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" " <struts> <!-- 配置包 default, 继承 struts-default --> <package name="default" namespace="/" extends="struts-default"> <!-- 配置名为 hello 的 Action, 实现类为 UserAction--> <action name="hello" class="com.action.useraction"> <result name="hello" >/hello.jsp</result> <!-- 返回 hello.jsp--> </action> </package> </struts> (4) 在 WebContent 目录下创建 index.jsp 和 hello.jsp 文件 index.jsp 文件核心代码 :

23 第 5 章解密 Struts 之核心文件 <body> <center> <s:a action="hello">hello</s:a> </center> </body> hello.jsp 文件核心代码 : <body> <center> ${applicationscope.name<br/> ${sessionscope.name<br/> ${requestscope.name </center> </body> (5) 运行该程序, 其结果如图 5.9 所示, 单击链接后结果如图 5.10 所示 图 5.9 例 5-4 运行结果 图 5.10 单击链接结果 由图 5.10 可以看到, 在 Action 中放入的 name-value 对都被取出来了, 这就证明 ActionContext 能够和 Servlet API 打交道 2. 通过特定接口访问 Struts 2 框架提供了 ActionContext 类来访问 Servlet API, 虽然这种方法可以访问 Servlet API, 但是无法直接访问到其实例 为了在 Action 中直接访问 Servlet API, 可以通过下面几个接口来实现 : ServletRequestAware: 实现该接口后, 可以直接访问 HttpServletRequest 实例 ServletResponseAware: 实现该接口后, 可以直接访问 HttpServletResponse 实例 ServletContextAware: 实例该接口后, 可以直接访问 ServletContext 实例 下面举一个 ServletContextAware 接口的例子, 来介绍如何在 Action 中访问 ServletContext 实例 : public class LoginAction implements Action, ServletContextAware{ private ServletContext context; //ServletContext 实例 //setter 方法 public void setservletcontext(servletcontext ctx) { context=ctx; public String execute() throws Exception { context.setattribute("user", "jim"); // 将 ( user,"jim") 放入 ActionContext 中 145

24 return SUCCESS; 第 2 篇表现层框架 Struts 技术 在上面代码中, 自定义的 LoginAction 类实现了 Action 和 ServletContextAware 接口 需要注意的是,LoginAction 类定义中必须实现 setservletcontext() 和 execute() 方法 通过 setservletcontext() 方法, 可以得到 ServletContext 的实例, 这是在调用 execute() 或其他自定义方法之前就调用的, 然后在 execute() 方法中, 就可以访问 ServletContext 的属性内容 通过 ServletContextAware 的例子, 读者应该可以猜到其他类似接口的用法 实际上, 如果一个 Action 实现了 ServletRequestAware 接口, 则必须实现 setservletrequest() 方法, 通过它来访问 HttpServletRequest 对象 ; 如果一个 Aciton 实现了 ServletResponseAware 接口, 则必须实现 setservletresponse() 方法, 通过它来访问 HttpServletResponse 对象 3. 通过 ServletActionContext 访问为了直接访问 Servlet API,Struts 2 框架还提供了 ServletActionContext 类, 该类的几个常用方法如下 : HttpServletResponse org.apache.struts2.servletactioncontext.getresponse() : 获得 HttpServletResponse 对象 HttpServletRequest org.apache.struts2.servletactioncontext.getrequest() : 获得 HttpServletRequest 对象 ServletContext org.apache.struts2.servletactioncontext.getservletcontext() : 获得 ServletContext 对象 通过 ServletActionServlet 方法的调用, 可以轻松获得相应的 JSP 内置对象,Action 能够更简单方便地访问 Servlet API ModelDriven 接口 用户在提交 HTTP 请求时, 一般有两种方式, 即 Get 方式和 Post 方式 ( 当然还有其他方式, 但不常用 ) Get 方式用来获取查询相关信息, 即向服务器索取数据, 而 Post 方式则用来更新信息, 即向服务器提交数据 通常情况下, 用 Get 方式向服务器查询信息时, 其附带的信息较少, 可以使用 Servlet API 来一一获取, 但当用 Post 方式提交数据时, 往往数据量大, 如果仍然用 Servlet API 的方式来一一获取数据, 代码就显得过于臃肿, 而且会降低程序员的工作效率 这时候,Struts 2 框架的强大作用就显现出来了 Struts 2 框架提供了 ModelDriven 接口, 对于实现了该接口的 Action 来说, 只需定义相应的 Model,Struts 2 框架就会自动将用户提交的 HTTP 信息赋给相应的 Model ModelDriven 接口的使用方式如以下代码所示 : 146 public class XxxAction extends ActionSupport implements ModelDriven <XXModel>{ private static final long serialversionuid = 1L; private XXModel x=new XXModel(); // 创建要使用的对象实例 //getter 方法, 必须实现 public XXModel getmodel() {

25 第 5 章解密 Struts 之核心文件 return x; public String execute() throws Exception { return SUCCESS; 上面代码中 XxxAction 类继承了 ModelDriven 接口, 这样用户提交的关于 XXModel 类的信息, 就会直接放入 x 对象中 读者需要注意的是 XXModel 对象必须实例化, 且 getmodel() 方法必须重写 例 5-5 本例示范 ModelDriven 接口的使用方式 (1) 使用 Eclipse 创建一个 Java Web 项目 ModelDrivenDemo, 将 Struts 2 框架所需的支持库添加到 WEB-INF 目录下的 lib 文件夹中, 然后在 WEB-INF 目录下添加 web.xml 文件, 并在其中注册过滤器和欢迎页面 <?xml version="1.0" encoding="utf-8"?> <web-app id="webapp_9" version="2.4" xmlns=" xml/ns/j2ee" xmlns:xsi=" xsi:schemalocation=" <!-- 定义 Filter--> <filter> <filter-name>struts2</filter-name> <!-- 指定 Filter 的名字 --> <!-- 指定 Filter 的实现类, 此处使用的是 Struts 2 提供的过滤器类 --> <filter-class>org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- 定义 Filter 所拦截的 URL 地址 --> <filter-mapping> <!--Filter 的名字, 该名字必须是 filter 元素中已声明过的过滤器名字 --> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> <!-- 定义 Filter 负责拦截的 URL 地址 --> </filter-mapping> <!-- 欢迎页面 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> (2) 在 src 目录下创建 com.action 包, 在该包下创建 LoginAction.java 文件 package com.action; import com.model.usermodel; import com.opensymphony.xwork2.actioncontext; import com.opensymphony.xwork2.actionsupport; import com.opensymphony.xwork2.modeldriven; public class LoginAction extends ActionSupport implements ModelDriven<UserModel>{ private static final long serialversionuid = 1L; private UserModel user=new UserModel(); // 创建 UserModel 实例 //getter 方法, 必须实现 public UserModel getmodel() { return user; // 重载 execute 方法 public String execute() throws Exception { 147

26 第 2 篇表现层框架 Struts 技术 ActionContext context=actioncontext.getcontext(); // 得到 ActionContext 实例 context.put("user", user); // 将 ("user",user) 放入 ActionContext 中 return SUCCESS; (3) 在 src 目录下创建 com.model 包, 在该包下创建 UserModel.java 文件 package com.model; public class UserModel { private String name; //name 属性 private String age; //age 属性 private String address; //address 属性 private String telephone; //telephone 属性 //name 属性的 getter 和 setter 方法 public String getname() { return name; public void setname(string name) { this.name = name; //age 属性的 getter 和 setter 方法 public String getage() { return age; public void setage(string age) { this.age = age; //address 属性的 getter 和 setter 方法 public String getaddress() { return address; public void setaddress(string address) { this.address = address; //telephone 属性的 getter 和 setter 方法 public String gettelephone() { return telephone; public void settelephone(string telephone) { this.telephone = telephone; (4) 在 src 目录下创建 struts.xml 文件 <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" " <struts> <!-- 配置 default 包 --> <package name="default" namespace="/" extends="struts-default"> <!-- 配置名为 user 的 Action, 实现类为 com.action.loginaction --> <action name="user" class="com.action.loginaction"> <result name="success" >/success.jsp</result> <!-- 返回 success.jsp--> </action> 148

27 第 5 章解密 Struts 之核心文件 </package> </struts> (5) 在 WebContent 目录下创建 index.jsp 和 success.jsp 文件 index.jsp 文件核心代码 : <body> <center> <!-- 定义表单 --> <s:form action="user"> <s:textfield label="name" name="name" /> <!-- 定义文本框 --> <s:textfield label="age" name="age" /> <s:textfield label="telephone" name="telephone" /> <s:textfield label="address" name="address" /> <s:submit/> <!-- 提交按钮 --> </s:form> </center> </body> success.jsp 文件核心代码 : <body> <center> <!-- 控制文本水平居中 --> <s:property value="#user.name"/><br/> <s:property value="#user.age"/><br/> <s:property value="#user.telephone"/><br/> <s:property value="#user.address"/><br/> </center> </body> (6) 运行该程序, 其结果如图 5.11 所示, 输入信息, 提交后显示如图 5.12 所示的页面 图 5.11 例 5-5 运行结果 图 5.12 提交后 ModelDriven 是一个经常在开发中用到的接口, 它大大简化了开发的时间, 对于开发者来说, 这是一个不可多得的福音 异常处理 读者可能遇到这样的情况, 在开发 Java Web 应用程序的时候, 由于程序的开发不太完善, 导致用户在使用的过程中出现程序崩溃的情况, 结果是在浏览器上面显示一大堆用户无法看懂的东西 对于商业应用来说, 这可能意味着成千上万的损失 Struts 2 框架的异常 149

28 150 第 2 篇表现层框架 Struts 技术 处理机制对于这种情况提供了有效的支持 Struts 2 框架的异常处理机制是十分成熟的, 只需简单的配置就可以实现 一般情况下, 开发者希望实现这样的功能 : 当处理用户请求时, 如果出现了异常, 就会转入指定的错误视图资源 ; 如果出现了另一种异常, 则系统会转入另一个指定的错误视图资源 下面的代码就实现了这种功能 : public class XXXAction extends ActionSupport{ private static final long serialversionuid = 1L; // 错误抛出异常 public String execute() throws Exception { try { return SUCCESS; catch (SQLException e) { e.printstacktrace(); return ERROR; //SQL 异常, 返回 ERROR catch (InvalidInputException e) { e.printstacktrace(); return ERROR; //InvalidInput 异常, 返回 ERROR catch(exception1 e1){ return result1; // 自定义异常 e1, 返回 result1 catch(exception2 e2){ return result2; // 自定义异常 e2, 返回 result2 上面的代码虽然可以满足我们提出的要求, 但实际上, 这种实现方式并不实用 上述代码是通过 try-catch 方式来捕获异常的, 当异常比较简单 种类较少时, 这种方式是可行的 但在企业级应用中, 由于系统的规模常常非常大, 如果仍采用 try-catch 方式来捕获异常, 将会降低代码的可维护性 Struts 2 框架提供了自己的异常处理机制, 只需在 struts.xml 文件中配置异常处理即可, 而不需要在 Action 方法中来捕捉异常 Struts 2 框架在 struts.xml 文件中配置异常通常有两种方式 : 全局异常配置和局部异常配置 分别通过 <global-exception-mappings../> 标签和 <exception-mapping../> 标签来配置 Struts 2 框架在 struts.xml 文件中配置异常的代码如下所示 : <struts> <package name="default"> <!-- 全局结果 --> <global-results> <result name="exception">/exception.jsp</result> <!-- 返回结果 Excetpion.jsp --> <result name="sqlexception">/sqlexception.jsp</result><!-- 返回结果 SQLExcetpion.jsp --> </global-results> <!-- 全局异常映射 --> <global-exception-mappings> <!--SQL 异常映射 --> <exception-mapping exception="java.sql.sqlexception" result= "SQLException"/> <!-- 一般异常 --> <exception-mapping exception="java.lang.exception" result= "Exception"/> </global-exception-mappings>

29 第 5 章解密 Struts 之核心文件... <action name="dataaccess" class="com.action.dataaccess"> <exception-mapping exception="com.action.securityexception" result="login"/> <result name="login" >/loginexception.jsp </result> <result>/dataaccess.jsp</result> </action>... </package> </struts> 上面的 struts.xml 文件中配置了 3 个异常, 其中 java.sql.sqlexception 和 java.lang. Exception 是全局异常,com.action.SecurityException 是局部异常 异常的 result 属性指的是当 Action 出现该异常时, 系统返回 result 属性值对应的名称 需要注意的是, 全局异常会对所有的 Action 起作用, 而局部异常只对其所在的 Action 其作用 出现异常后, 一般会在 JSP 页面中输出异常信息, 通常使用下面两种方式来输出异常信息 : <s:property value="exception.message"/>: 输出异常对象信息 <s:property value="exceptionstack"/>: 输出异常堆栈信息 例 5-6 本例示范 Struts 2 框架异常处理的配置 (1) 在 Eclipse 中创建一个 Java Web 项目 ExceptionDemo, 将 Struts 2 框架所需的支持库添加到 WEB-INF 目录下的 lib 文件夹中, 然后在 WEB-INF 目录下添加 web.xml 文件, 并在其中注册过滤器和欢迎页面 <?xml version="1.0" encoding="utf-8"?> <web-app id="webapp_9" version="2.4" xmlns=" ns/j2ee" xmlns:xsi=" xsi: schemalocation=" <!-- 定义 Filter--> <filter> <filter-name>struts2</filter-name> <!-- 指定 Filter 的名字, 不能为空 --> <!-- 指定 Filter 的实现类, 此处使用的是 Struts 2 提供的过滤器类 --> <filter-class>org.apache.struts2.dispatcher.ng.filter. StrutsPrepareAndExecuteFilter</filter-class> </filter> <!-- 定义 Filter 所拦截的 URL 地址 --> <filter-mapping> <!--Filter 的名字, 该名字必须是 filter 元素中已声明过的过滤器名字 --> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> <!-- 定义 Filter 负责拦截的 URL 地址 --> </filter-mapping> <!-- 欢迎页面 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> (2) 在 src 目录下创建 com.action 包, 在该包下创建 UserAction.java 和 Security Exception.java 文件, 代码如下所示 UserAction.java 文件代码如下 : package com.action; 151

30 第 2 篇表现层框架 Struts 技术 import com.opensymphony.xwork2.actionsupport; public class UserAction extends ActionSupport{ private static final long serialversionuid = 1L; private String name; //name 属性 private String age; //age 属性 private String tel; //tel 属性 //name 属性的 getter setter 方法 public String getname() { return name; public void setname(string name) { this.name = name; //age 属性的 getter setter 方法 public String getage() { return age; public void setage(string age) { this.age = age; //tel 属性的 getter setter 方法 public String gettel() { return tel; public void settel(string tel) { this.tel = tel; public String execute() throws Exception { // 根据输入值进行检测是否符合要求 if(!getname().equals("tom")) { throw new SecurityException("wrong name!!!!!!"); else if(!getage().equals("20")) { throw new Exception("wrong age!!!!!"); else if(!gettel().equals(" ")) { throw new java.sql.sqlexception(); else { return SUCCESS; 152 SecurityException.java 文件代码如下 : package com.action; public class SecurityException extends Exception{ private static final long serialversionuid = 1L; // 构造方法 public SecurityException() { super(); private String message; // 属性 message, 用于记录错误消息 public SecurityException(String messa ge){

31 第 5 章解密 Struts 之核心文件 this.message = message; public String getmessage() { return message; (3) 在 src 目录下创建文件 struts.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" " <struts> <!-- 配置包 default --> <package name="default" namespace="/" extends="struts-default"> <!-- 全局结果 --> <global-results> <result name="exception">/exception.jsp</result> <!-- 返回 Exception.jsp --> <result name="sqlexception">/sqlexception.jsp</result> <!-- 返回 SQLException.jsp --> </global-results> <!-- 全局异常映射 --> <global-exception-mappings> <!--Sql 异常 --> <exception-mapping exception="java.sql.sqlexception" result= "SQLException"/> <!-- 一般异常 --> <exception-mapping exception="java.lang.exception" result= "Exception"/> </global-exception-mappings> <!-- 配置名为 user 的 Action, 实现类为 com.action.useraction --> <action name="user" class="com.action.useraction"> <!-- 异常结果已设 --> <exception-mapping exception="com.action.securityexception" result="login"/> <result name="login" >/loginexception.jsp </result> <!-- 返回结果 login--> <result>/success.jsp</result> <!-- 返回结果 success--> </action> </package> </struts> ( 4 ) 在 WebContent 目录下创建 index.jsp Exception.jsp SQLException.jsp loginexception.jsp 和 success.jsp 文件, 代码如下所示, 其中 Exception.jsp SQLException.jsp 和 loginexception.jsp 文件代码相同 index.jsp 文件核心代码如下 : <body> <center> <!-- 定义表单 --> <s:form action="user"> <s:textfield label="name" name="name"/> <!-- 定义文本框 --> <s:textfield label="age" name="age" /> <s:textfield label="tel" name="texl"/> <s:submit></s:submit> <!-- 提交按钮 --> </s:form> 153

32 第 2 篇表现层框架 Struts 技术 </center> </body> Exception.jsp SQLException.jsp loginexception.jsp 文件核心代码如下 : <body> <center> <h2> <s:property value="exception.message"/> <s:property value="exceptionstack"/> </h2> </center> </body> success.jsp 文件核心代码如下 : <body> <h2> success </h2> </body> (5) 运行程序, 其结果如图 5.13 所示, 输入信息, 若不符合 Action 中的处理要求, 则产生如图 5.14 所示的结果, 若符合要求, 则进入 success.jsp 页面 图 5.13 例 5-6 运行结果 图 5.14 异常处理结果 154

33 第 5 章解密 Struts 之核心文件 5.5 本章小结 本章主要介绍了 Struts 2 框架中核心配置文件的作用及其具体配置 Action 类文件的具体格式以及访问 servlet API 的几种方法 web.xml struts.properties 以及 struts.xml 三大配置文件, 构成了 Struts 2 框架的配置基础, 其中 web.xml 文件主要是配置初始信息 过滤器等,struts.properties 主要进行常量的配置, 而 struts.xml 则主要进行 Action 的配置 这三个核心配置文件都可以配置常量, 如表 5.5 所示 表 5.5 三大配置文件的常量配置方式文件代码 <init-param> <param-name> struts.i18n.encoding </param-name> web.xml <param-value> UTF-8</param-value> </init-param> struts.properties struts.i18n.encoding=utf-8 struts.xml <constant name="struts.i18n.encoding" value="utf-8" /> 1.web.xml web.xml 文件是 Struts 2 框架中的一个重要配置文件, 是不可缺少的 其最重要的就是过滤器的配置, 这是其最常用的配置 2.struts.properties struts.properties 文件主要用来配置常量, 由于常量可以在 web.xml 或 struts.xml 中配置, 所以该文件有时可以略去不配置 实际上,Struts 2 框架按如下顺序来加载常量 : struts-default.xml: 在 struts-core jar 文件中 struts-plugin.xml: 在 struts-xxx jar 等 Struts 2 插件 jar 文件中 struts.xml struts.properties web.xml 上述是 Struts 2 框架搜索常量的顺序, 当同一个文件出现多个文件中时, 后出现的常量值会覆盖前面的值 3.struts.xml struts.xml 文件是 Struts 2 框架中最核心的配置文件, 是不可缺少的 读者应该注意其 Action package result 以及通配符等的配置方式 4.Action 类文件 Action 类是 Struts 2 框架中很重要的一个组成部分, 具体的业务逻辑都是它来进行处理的 读者须注意在 Action 中访问 Servlet API 的方法以及 ModelDriven 接口的使用 155

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

Microsoft Word - Hibernate与Struts2和Spring组合指导.doc 1.1 组合 Hibernate 与 Spring 1. 在 Eclipse 中, 新建一个 Web project 2. 给该项目增加 Hibernate 开发能力, 增加 Hibernate 相关类库到当前项目的 Build Path, 同时也提供了 hibernate.cfg.xml 这个配置文件 3. 给该项目增加 Spring 开发能力, 增加 spring 相关类库到当前项目的 Build

More information

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

本章学习目标 小风 Java 实战系列教程 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 本章学习目标 SpringMVC 简介 SpringMVC 的入门案例 SpringMVC 流程分析 配置注解映射器和适配器 配置视图解析器 @RequestMapping 注解的使用 使用不同方式的跳转页面 1. SpringMVC 简介 Spring web mvc 和 Struts2 都属于表现层的框架, 它是 Spring 框架的一部分, 我们可 以从 Spring 的整体结构中看得出来 :

More information

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP: ******************* * 关于 Java 测试试题 ******

エスポラージュ株式会社 住所 : 東京都江東区大島 東急ドエルアルス大島 HP:  ******************* * 关于 Java 测试试题 ****** ******************* * 关于 Java 测试试题 ******************* 問 1 运行下面的程序, 选出一个正确的运行结果 public class Sample { public static void main(string[] args) { int[] test = { 1, 2, 3, 4, 5 ; for(int i = 1 ; i System.out.print(test[i]);

More information

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

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit Tomcat Web JUnit Cactus JUnit Java Cactus JUnit 26.1 JUnit Java JUnit JUnit Java JSP Servlet JUnit Java Erich Gamma Kent Beck xunit JUnit boolean JUnit Java JUnit Java JUnit Java 26.1.1 JUnit JUnit How

More information

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复

获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取 Access Token access_token 是接口的全局唯一票据, 接入方调用各接口时都需使用 access_token 开发者需要进行妥善保存 access_token 的存储至少要保留 512 个字符空间 access_token 的有效期目前为 2 个小时, 需定时刷新, 重复 获取将导致上次获取的 access_token 失效 接入方可以使用 AppID 和 AppSecret

More information

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

在所有的项目开发中, 一定是多人协作的团队开发, 但是使用框架就会出现一个问题, 我们所 有的 Action 以及相关的路径都要求在我们的 struts.xml 文件中配置, 如果所有的人去修改一个 文件, 那么就会变得混乱, 而且有可能出现冲突, 那么在 struts.xml 文件中为了解决这个问 内置对象的取得和多人开发 一 内置对象的取得 在使用的 servlet 的时候可以通过 HttpServletResquest 获取到一些内置对象, 但是在 struts2 中为了方便取得内置对象, 专门提供了一个 ServletActionContext 这个类取得取得内置对象, 观察如下方法 public static javax.servlet.jsp.pagecontext() 取得 pagecontext

More information

EJB-Programming-4-cn.doc

EJB-Programming-4-cn.doc EJB (4) : (Entity Bean Value Object ) JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Session Bean J2EE Session Façade Design Pattern Session Bean Session

More information

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

基于CDIO一体化理念的课程教学大纲设计 Java 语 言 程 序 设 计 课 程 教 学 大 纲 Java 语 言 程 序 设 计 课 程 教 学 大 纲 一 课 程 基 本 信 息 1. 课 程 代 码 :52001CC022 2. 课 程 名 称 :Java 语 言 程 序 设 计 3. 课 程 英 文 名 称 :Java Programming 4. 课 程 类 别 : 理 论 课 ( 含 实 验 上 机 或 实 践 ) 5. 授

More information

拦截器(Interceptor)的学习

拦截器(Interceptor)的学习 二 拦截器 (Interceptor) 的学习 拦截器可以监听程序的一个或所有方法 拦截器对方法调用流提供了细粒度控制 可以在无状态会话 bean 有状态会话 bean 和消息驱动 bean 上使用它们 拦截器可以是同一 bean 类中的方法或是一个外部类 下面介绍如何在 Session Bean 类中使用外部拦截器类 @Interceptors 注释指定一个或多个在外部类中定义的拦截器 下面拦截器

More information

新・解きながら学ぶJava

新・解きながら学ぶJava 481! 41, 74!= 40, 270 " 4 % 23, 25 %% 121 %c 425 %d 121 %o 121 %x 121 & 199 && 48 ' 81, 425 ( ) 14, 17 ( ) 128 ( ) 183 * 23 */ 3, 390 ++ 79 ++ 80 += 93 + 22 + 23 + 279 + 14 + 124 + 7, 148, 16 -- 79 --

More information

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

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 odps-sdk 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基 开放数据处理服务 ODPS SDK SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基础功能的主体接口, 搜索关键词 "odpssdk-core" 一些

More information

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

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double

More information

untitled

untitled JavaEE+Android - 6 1.5-2 JavaEE web MIS OA ERP BOSS Android Android Google Map office HTML CSS,java Android + SQL Sever JavaWeb JavaScript/AJAX jquery Java Oracle SSH SSH EJB+JBOSS Android + 1. 2. IDE

More information

EJB-Programming-3.PDF

EJB-Programming-3.PDF :, JBuilder EJB 2.x CMP EJB Relationships JBuilder EJB Test Client EJB EJB Seminar CMP Entity Beans Value Object Design Pattern J2EE Design Patterns Value Object Value Object Factory J2EE EJB Test Client

More information

优迈科技教学大纲2009版本

优迈科技教学大纲2009版本 java 软 件 工 程 师 培 训 教 学 大 纲 1 JAVA 软 件 工 程 师 培 训 教 学 大 纲 深 圳 软 件 园 人 才 实 训 基 地 2009 年 3 月 目 录 java 软 件 工 程 师 培 训 教 学 大 纲 2 教 学 阶 段...3 第 一 章 JAVA 起 步...3 第 二 章 面 向 对 象 的 编 程...4 第 三 章 数 据 结 构 IO 线 程 网 络...5

More information

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

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6 www.brainysoft.net 1.JasperReport ireport...4 1.1 JasperReport...4 1.2 ireport...4 2....4 2.1 JDK...4 2.1.1 JDK...4 2.1.2 JDK...5 2.1.3 JDK...5 2.2 ant...6 2.2.1 ant...6 2.2.2 ant...6 2.3 JasperReport...7

More information

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

Microsoft PowerPoint - 05-Status-Codes-Chinese.ppt 2004 Marty Hall 服务器响应的生成 : HTTP 状态代码 JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: http://www.coreservlets.com

More information

无类继承.key

无类继承.key 无类继承 JavaScript 面向对象的根基 周爱 民 / aimingoo aiming@gmail.com https://aimingoo.github.io https://github.com/aimingoo rand = new Person("Rand McKinnon",... https://docs.oracle.com/cd/e19957-01/816-6408-10/object.htm#1193255

More information

Microsoft Word - 01.DOC

Microsoft Word - 01.DOC 第 1 章 JavaScript 简 介 JavaScript 是 NetScape 公 司 为 Navigator 浏 览 器 开 发 的, 是 写 在 HTML 文 件 中 的 一 种 脚 本 语 言, 能 实 现 网 页 内 容 的 交 互 显 示 当 用 户 在 客 户 端 显 示 该 网 页 时, 浏 览 器 就 会 执 行 JavaScript 程 序, 用 户 通 过 交 互 式 的

More information

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises)

09 (File Processes) (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) 09 (File Processes) 9-1 9-2 (mkdir) 9-3 (createnewfile) 9-4 (write) 9-5 (read) 9-6 (deletefile) 9-7 (deletedir) (Exercises) Java Servlet 9-1 Servlet (File Processes) Client Servlet Servlet Java Java (Stream)

More information

云数据库 RDS SDK

云数据库 RDS SDK 云数据库 RDS SDK SDK SDK 下载 SDK 下载 最新版本 java_sdk.zip python_sdk.zip php_sdk.zip c#_sdk.zip 历史版本 2015-11-3 java_sdk.zip python_sdk.zip php_sdk.zip c#_sdk.zip JAVA 教程 JAVA 创建 Access Key 登陆阿里云账号 打开 我的 Access

More information

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

resp.getwriter().print(j + * + i + = + j * i+ ); resp.getwriter().print(<br/>); protected void dopost(httpservletrequest req, HttpServletRespo 第三章补充案例 案例 3-1 HttpServlet 一 案例描述 1 考核知识点名称 :HttpServlet 编号 : 2 练习目标 掌握 HttpServlet 的 doget() 方法和 dopost() 方法 3 需求分析由于大多数 Web 应用都是通过 HTTP 协议和客户端进行交互, 因此, 在 Servlet 接口中, 提供了 一个抽象类 javax.servlet.http.httpservlet,

More information

res/layout 目录下的 main.xml 源码 : <?xml version="1.0" encoding="utf 8"?> <TabHost android:layout_height="fill_parent" xml

res/layout 目录下的 main.xml 源码 : <?xml version=1.0 encoding=utf 8?> <TabHost android:layout_height=fill_parent xml 拓展训练 1- 界面布局 1. 界面布局的重要性做应用程序, 界面是最基本的 Andorid 的界面, 需要写在 res/layout 的 xml 里面, 一般情况下一个 xml 对应一个界面 Android 界面布局有点像写 html( 连注释代码的方式都一样 ), 要先给 Android 定框架, 然后再在框架里面放控件,Android 提供了几种框架,AbsoluteLayout,LinearLayout,

More information

输入 project name 选择完成

输入 project name 选择完成 JAVA 程序访问 HighGo DB 的环境准备 山东瀚高科技有限公司版权所有仅允许不作任何修改的转载和转发 Hibernate 的配置 MyEclipse 中创建新项目 : 选择菜单栏 file---new---project 选择 web project 进行下一步 输入 project name 选择完成 4. 单击 " 添加 JAR/ 文件夹 ", 会如下图出现 JDBC 下载 Hibernate

More information

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

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

More information

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点

OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 4 月 19 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d

More information

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

D getinitparameternames() 9 下 列 选 项 中, 属 于 Servlet API 中 提 供 的 request 对 象 的 包 装 类 的 是 ( ) A HttpServletRequestWrapper B HttpServletRequest C HttpServ 第 四 章 Filter( 过 滤 器 ) 样 题 A 卷 一 选 择 题 ( 每 小 题 2 分, 共 20 分 ) 1 下 面 选 项 中, 用 于 实 现 初 始 化 过 滤 器 的 方 法 是 ( ) A init(filterconfig filterconfig) B dofilter(servletrequest req,servletresponse resp,filterchain

More information

Servlet

Servlet Servlet Allen Long Email: allen@huihoo.com http://www.huihoo.com 2004-04 Huihoo - Enterprise Open Source http://www.huihoo.com 1 Huihoo - Enterprise Open Source http://www.huihoo.com 2 GET POST Huihoo

More information

软件工程文档编制

软件工程文档编制 实训抽象类 一 实训目标 掌握抽象类的定义 使用 掌握运行时多态 二 知识点 抽象类的语法格式如下 : public abstract class ClassName abstract void 方法名称 ( 参数 ); // 非抽象方法的实现代码 在使用抽象类时需要注意如下几点 : 1 抽象类不能被实例化, 实例化的工作应该交由它的子类来完成 2 抽象方法必须由子类来进行重写 3 只要包含一个抽象方法的抽象类,

More information

Struts2自定义类型转换.doc

Struts2自定义类型转换.doc Struts2 自定义类型转换 原理 struts2 的自定义类型转换机制为复杂类型的输入输出处理提供了便捷.struts2 已经为我们提供了几乎所有的 primitive 类型以及常用类型 ( 如 Date) 的类型转换器, 我们也可以为我们自定义类添加自定义类型转化器. struts2 为我们提供了一个类型转化器的入口 : ognl.defaulttypeconverter, 或继承 org.apache.struts2.util.strutstypeconverter,

More information

设计模式 Design Patterns

设计模式 Design Patterns 丁勇 Email:18442056@QQ.com 学习目标 理解 Struts 框架的工作原理 掌握使用 Struts 框架开发 Web 应用的基本步骤 熟悉 MyEclipse 对 Struts 开发的支持 Web 框架事实标准 : Web 框架的事实标准 http://struts.apache.org Java EE 主流技术趋势图 主流 Web 框架趋势图 使用 Struts 实现加法器 使用开发的

More information

Microsoft Word - 第3章.doc

Microsoft Word - 第3章.doc 第 3 章 Struts2 框架是 Apache 开源社区原有的 Struts 框架和 Open Symphony 社区 WebWork2 框架的合并版本, 它集成了这两大流行的 MVC 框架各自的优点, 主要以 WebWork 的设计思想为核心, 提供了更加灵活的控制层和组件实现技术 Struts2 的体系结构 Struts2 的安装与配置 Struts2 框架的主要配置文件 3.1 Struts2

More information

Guava学习之Resources

Guava学习之Resources Resources 提供提供操作 classpath 路径下所有资源的方法 除非另有说明, 否则类中所有方法的参数都不能为 null 虽然有些方法的参数是 URL 类型的, 但是这些方法实现通常不是以 HTTP 完成的 ; 同时这些资源也非 classpath 路径下的 下面两个函数都是根据资源的名称得到其绝对路径, 从函数里面可以看出,Resources 类中的 getresource 函数都是基于

More information

Microsoft Word - D2Z

Microsoft Word - D2Z 第 章 Struts 2 基础 Struts 是 Apache 软件基金会赞助的一个开源项目, 它最初是 Jakarta 项目中的一个子项目 Struts 2 是以 Webwork 设计思想为核心, 吸收原 Struts 的优点而形成的, 旨在帮助程序员更方便地运用 MVC 模式来开发 Java EE 应用 2. 1 Struts 2 框架开发入门 2.1.1 MVC 基本思想 MVC 是一种通用的

More information

新美大酒店开放平台SDK(.NET版)使用说明.pages

新美大酒店开放平台SDK(.NET版)使用说明.pages SDK(.NET 版 ) 使 用说明 1 SDK 包说明 1.1 获取 SDK SDK 可以在数据平台下载, 也可直接通过下载地址获得 下载地址 : http://s3.meituan.net/v1/mss_de81c933e113413ea913a772b707b9c9/open-platform-sdk/mthotelopenplatform-sdk-1.0-net.zip 下载成功后, 解压后可获得

More information

J2EE MVC with Webwork2 Xwork, to J2EE MVC with Webwork2 Xwork

J2EE MVC with Webwork2 Xwork,  to J2EE MVC with Webwork2 Xwork MVC with Webwork2 Xwork Action...1 ActionContext...3 ActionProxyFactory Factory...4 ActionProxyFactory Proxy AOP...7 XworkInterceptor...8 Interceptor...9 LoginAction...10 LoginInterceptor...12 Action Result

More information

untitled

untitled Work Managers 什 Work Managers? WebLogic Server 9.x 行 (thread) 理 thread pool 數量 立 execute queues 來 量 理 thread count, thread priority 參數 理 thread pool 數量? WebLogic Server 9.x 理 行 (thread) (self-tuning) 句

More information

chp6.ppt

chp6.ppt Java 软 件 设 计 基 础 6. 异 常 处 理 编 程 时 会 遇 到 如 下 三 种 错 误 : 语 法 错 误 (syntax error) 没 有 遵 循 语 言 的 规 则, 出 现 语 法 格 式 上 的 错 误, 可 被 编 译 器 发 现 并 易 于 纠 正 ; 逻 辑 错 误 (logic error) 即 我 们 常 说 的 bug, 意 指 编 写 的 代 码 在 执 行

More information

使用Cassandra和Spark 2.0实现Rest API服务

使用Cassandra和Spark 2.0实现Rest API服务 使用 Cassandra 和 Spark 2.0 实现 Rest API 服务 在这篇文章中, 我将介绍如何在 Spark 中使用 Akkahttp 并结合 Cassandra 实现 REST 服务, 在这个系统中 Cassandra 用于数据的存储 我们已经见识到 Spark 的威力, 如果和 Cassandra 正确地结合可以实现更强大的系统 我们先创建一个 build.sbt 文件, 内容如下

More information

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 access_token=access_token (http

停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址   access_token=access_token (http 停止混流接口 请注意 : 该功能需要联系 ZEGO 技术支持开通 1 接口调用说明 http 请求方式 : POST/FORM, 需使用 https 正式环境地址 https://webapi.zego.im/cgi/stop-mix? access_token=access_token (https://webapi.zego.im/cgi/stop-mix? access_token=access_token)

More information

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

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-065Big5 Title : Sun Certified Programmer for the Java 2 Platform, SE 6.0 Version : Demo 1 / 14 1. 35. String #name = "Jane Doe"; 36. int

More information

北 风 网 讲 师 原 创 作 品 ---- 仅 供 学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见

北 风 网 讲 师 原 创 作 品 ---- 仅 供  学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见 北 风 网 讲 师 原 创 作 品 ---- 仅 供 www.ibeifeng.com 学 员 内 部 交 流 使 用 前 言 吾 尝 终 日 而 思 矣, 不 如 须 臾 之 所 学 也 ; 吾 尝 跂 而 望 矣, 不 如 登 高 之 博 见 也 登 高 而 招, 臂 非 加 长 也, 而 见 者 远 ; 顺 风 而 呼, 声 非 加 疾 也, 而 闻 者 彰 假 舆 马 者, 非 利 足 也,

More information

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

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6: Chapter 15. Suppressed Exception CH14 Finally Block Java SE 7 try-with-resources JVM cleanup try-with-resources JVM cleanup cleanup Java SE 7 Throwable getsuppressed Throwable[] getsuppressed() Suppressed

More information

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat

2. AOP 底层技术实现 小风 Java 实战系列教程 关键词 : 代理模式 代理模型分为两种 : 1) 接口代理 (JDK 动态代理 ) 2) 子类代理 (Cglib 子类代理 ) 需求 :CustomerService 业务类, 有 save,update 方法, 希望在 save,updat 本章学习目标 小风 Java 实战系列教程 AOP 思想概述 AOP 底层技术实现 AOP 术语介绍 SpringAOP 的 XML 方式 HelloWorld SpringAOP 的 XML 方式配置细节 SpringAOP 的注解方式 SpringAOP 的零配置方式 1. AOP 思想概述 1.1. AOP 思想简介 1.2. AOP 的作用 2. AOP 底层技术实现 小风 Java 实战系列教程

More information

IoC容器和Dependency Injection模式.doc

IoC容器和Dependency Injection模式.doc IoC Dependency Injection /Martin Fowler / Java Inversion of Control IoC Dependency Injection Service Locator Java J2EE open source J2EE J2EE web PicoContainer Spring Java Java OO.NET service component

More information

使用MapReduce读取XML文件

使用MapReduce读取XML文件 使用 MapReduce 读取 XML 文件 XML( 可扩展标记语言, 英语 :extensible Markup Language, 简称 : XML) 是一种标记语言, 也是行业标准数据交换交换格式, 它很适合在系统之间进行数据存储和交换 ( 话说 Hadoop H ive 等的配置文件就是 XML 格式的 ) 本文将介绍如何使用 MapReduce 来读取 XML 文件 但是 Had oop

More information

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

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 58 2016. 14 * LireSolr LireSolr CEDD Ajax CSpace LireSolr CEDD Abstract In order to offer better image support services it is necessary to extend the image retrieval function of our institutional repository.

More information

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例

帝国CMS下在PHP文件中调用数据库类执行SQL语句实例 帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例 这篇文章主要介绍了帝国 CMS 下在 PHP 文件中调用数据库类执行 SQL 语句实例, 本文还详细介绍了帝国 CMS 数据库类中的一些常用方法, 需要的朋友可以参考下 例 1: 连接 MYSQL 数据库例子 (a.php)

More information

在Spring中使用Kafka:Producer篇

在Spring中使用Kafka:Producer篇 在某些情况下, 我们可能会在 Spring 中将一些 WEB 上的信息发送到 Kafka 中, 这时候我们就需要在 Spring 中编写 Producer 相关的代码了 ; 不过高兴的是,Spring 本身提供了操作 Kafka 的相关类库, 我们可以直接通过 xml 文件配置然后直接在后端的代码中使用 Kafka, 非常地方便 本文将介绍如果在 Spring 中将消息发送到 Kafka 在这之前,

More information

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

Stateless Session Beans(无状态bean)的学习 一 Stateless Session Beans( 无状态 bean) 的学习 第一步 : 要定义一个会话 Bean, 首先需要定义一个包含他所有业务方法的接口 这个接口不需要任何注释, 就像普通的 java 接口那样定义 调用 EJB 的客户端通过使用这个接口引用从 EJB 容器得到的会话 Bean 对象 stub 接口的定义如下: HelloWorld.java package com.foshanshop.ejb3;

More information

Microsoft Word - ShkZw3.doc

Microsoft Word - ShkZw3.doc 第 3 章 Struts2 的高级组件 本章将介绍 Struts2 中比较常用的高级组件 通过对这些高级组件的学习, 将有助于进一步了解和使用 Struts2 框架 本章主要内容 : (1)Struts2 对国际化的支持 (2)Struts2 常用拦截器的使用 (3)Struts2 的数据验证功能 (4)Struts2 对文件上传和下载的支持 3.1 Struts2 的国际化 国际化 是指一个应用程序在运行时能够根据客户端请求所来自国家或地区语言的不同而显示不同的用户界面

More information

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课

OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 3: 3 月 29 日晚 9 点 4 月 1 日上课 复习 Java 包 创建包 : package 语句, 包结构与目录结构一致 使用包 : import restaurant/ - people/ - Cook.class - Waiter.class - tools/ - Fork.class

More information

epub 61-2

epub 61-2 2 Web Dreamweaver UltraDev Dreamweaver 3 We b We b We Dreamweaver UltraDev We b Dreamweaver UltraDev We b We b 2.1 Web We b We b D r e a m w e a v e r J a v a S c r i p t We b We b 2.1.1 Web We b C C +

More information

jsp

jsp JSP Allen Long Email: allen@huihoo.com http://www.huihoo.com 2004-04 Huihoo - Enterprise Open Source http://www.huihoo.com 1 JSP JSP JSP JSP MVC Huihoo - Enterprise Open Source http://www.huihoo.com 2

More information

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

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

More information

使用 Eclipse 开发 Java EE 应用 (Web 应用 ) 这里以开发一个简单的 Web 应用为例, 介绍使用 Eclipse 开发 Java EE 应用的一般步 骤 此处使用的 Eclipse 是 Eclipse IDE for Java EE Developers; 如果是使用的其他

使用 Eclipse 开发 Java EE 应用 (Web 应用 ) 这里以开发一个简单的 Web 应用为例, 介绍使用 Eclipse 开发 Java EE 应用的一般步 骤 此处使用的 Eclipse 是 Eclipse IDE for Java EE Developers; 如果是使用的其他 使用 Eclipse 开发 Java EE 应用 (Web 应用 ) 这里以开发一个简单的 Web 应用为例, 介绍使用 Eclipse 开发 Java EE 应用的一般步 骤 此处使用的 Eclipse 是 Eclipse IDE for Java EE Developers; 如果是使用的其他 Eclipse 插件 ( 比如 MyEclipse 插件 ), 其开发方式和步骤可能略有差异和不同 在该例中,

More information

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

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型 文 章 编 号 :1007-757X(2012)1-0036-04 领 域 驱 动 模 型 的 WEB 软 件 系 统 设 计 研 究 摘 要 : J2EE 3 JDK1.7 Tomcat WEB 关 键 词 : 中 图 分 类 号 :TP311 文 献 标 志 码 :A 0 引 言 Web 软 件 系 统 的 分 层 结 构 典 型 的 J2EE 软 件 系 统 开 发 方 法 分 为 三 层 结

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 Dalian MinZu University 实训单元 2 JSP 基础语法 李腾 信息与通信工程学院 目录 一 实训目的二 实训设备三 实训内容 一 实训目的 学习如何建立 JSP 页面, 实践 JSP 声明 表达式和注释 JSP 指令 JSP 动作等知识, 结合实际案例, 让学生进行知识的巩固 实训时长 : 2 课时 二 实训设备 PC 机 :Intel Core i3 CPU ; 4G 内存

More information

JSP基础编程

JSP基础编程 JSP 基础编程 报告人 : 包亮 邮箱 :rslab@lzb.ac.cn HTTP 基础 HTTP is a simple, stateless protocol. A client, such as a web browser, makes a request, the web server responds, and the transaction is done. Client 发出一个请求

More information

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10

1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 Java V1.0.1 2007 4 10 1 4 1.1 4 1.2..4 2..4 2.1..4 3.4 3.1 Java.5 3.1.1..5 3.1.2 5 3.1.3 6 4.6 4.1 6 4.2.6 5 7 5.1..8 5.1.1 8 5.1.2..8 5.1.3..8 5.1.4..9 5.2..9 6.10 6.1.10 6.2.10 6.3..10 6.4 11 7.12 7.1

More information

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

WebSphere Studio Application Developer IBM Portal Toolkit... 2/21 1. WebSphere Portal Portal WebSphere Application Server stopserver.bat -configfile.. WebSphere Studio Application Developer IBM Portal Toolkit... 1/21 WebSphere Studio Application Developer IBM Portal Toolkit Portlet Doug Phillips (dougep@us.ibm.com),, IBM Developer Technical Support Center

More information

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii

前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii 前言 C# C# C# C C# C# C# C# C# microservices C# More Effective C# More Effective C# C# C# C# Effective C# 50 C# C# 7 Effective vii C# 7 More Effective C# C# C# C# C# C# Common Language Runtime CLR just-in-time

More information

untitled

untitled 4.1AOP AOP Aspect-oriented programming AOP 來說 AOP 令 理 Cross-cutting concerns Aspect Weave 理 Spring AOP 來 AOP 念 4.1.1 理 AOP AOP 見 例 來 例 錄 Logging 錄 便 來 例 行 留 錄 import java.util.logging.*; public class HelloSpeaker

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Fortran Algol Pascal Modula-2 BCPL C Simula SmallTalk C++ Ada Java C# C Fortran 5.1 message A B 5.2 1 class Vehicle subclass Car object mycar public class Vehicle extends Object{ public int WheelNum

More information

untitled

untitled 1 Outline 數 料 數 數 列 亂數 練 數 數 數 來 數 數 來 數 料 利 料 來 數 A-Z a-z _ () 不 數 0-9 數 不 數 SCHOOL School school 數 讀 school_name schoolname 易 不 C# my name 7_eleven B&Q new C# (1) public protected private params override

More information

TopTest_Adminstrator.doc

TopTest_Adminstrator.doc 壹 前 言... 3 貳 系 統 簡 介... 4 一 TKB multimedia Top-Test 系 統 架 構...4 1. 使 用 者 介 面 層 (Presentation tier)...5 2. 商 業 邏 輯 層 (business logic tier)...5 3. 資 料 服 務 層 (data services tier)...5 二 TKB Multimedia Top-Test

More information

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

Microsoft Word - 第4章 Servlet开发—教学设计.doc 传智播客 JavaWeb 程序开发入门 教学设计 课程名称 : JavaWeb 程序开发入门 授课年级 : 2014 年级 授课学期 : 2014 学年第一学期 教师姓名 : 某某老师 2014 年 09 月 09 日 课题名称内容分析教学目标及基本要求重点及措施 计划第 4 章 Servlet 技术 6 课时学时随着 Web 应用业务需求的增多, 动态 Web 资源的开发变得越来越重要, 为此 Sun

More information

untitled

untitled 1 行 行 行 行.NET 行 行 類 來 行 行 Thread 類 行 System.Threading 來 類 Thread 類 (1) public Thread(ThreadStart start ); Name 行 IsAlive 行 行狀 Start 行 行 Suspend 行 Resume 行 行 Thread 類 (2) Sleep 行 CurrentThread 行 ThreadStart

More information

PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject("exception", writer.tostring()); mv.setviewname("error"); return

PrintWriter s = new PrintWriter(writer); ex.printstacktrace(s); mv.addobject(exception, writer.tostring()); mv.setviewname(error); return 本章学习目标 小风 Java 实战系列教程 SpringMVC 异常处理 SpringMVC 文件上传 SpringMVC 处理 JSON 格式数据 SpringMVC 拦截器 SpringMVC 对 restful 风格的支持 1. SpringMVC 异常处理 1.1. @ExceptionHandler 注解处理异常 @ExceptionHandler 该注解使用在异常处理方法上面 1.1.1.

More information

06-4.indd

06-4.indd 1 02 07 13 16 20 28 33 38 42 46 48 51 57 64 65 65 66 67 68 2 3 4 5 6 7 8 9 10 11 12 13 LL T : 14 LL T 15 16 扫描电子显微镜成像模拟的 MPI 及 OpenMP 并行化 17 18 19 20 21 22 ~ ~ ~ 23 24 ~ ~ ~ ~ ~ ~ ~ 25 26 27 28 29 图 3

More information

Spring3.x开发入门

Spring3.x开发入门 Spring Bean 管理 Spring 的工厂类 课程安排 Spring 的 Bean 管理 (XML 方式 ) Spring 的属性注入 (XML 方式 ) Spring 的 Bean 管理 ( 注解方式 ) Spring 的属性注入 ( 注解方式 ) Spring 的工厂类 Spring 的 Bean 管理 (XML 方式 ) 三种实例化 Bean 的方式 使用类构造器实例化 ( 默认无参数

More information

Microsoft Word - JavaWeb程序开发入门—教学大纲.doc

Microsoft Word - JavaWeb程序开发入门—教学大纲.doc JavaWeb 程序开发入门 课程教学大纲 ( 课程英文名称 ) 课程编号 : 201409210011 学分 : 5 学分学时 : 54 学时 ( 其中 : 讲课学时 :38 上机学时 :16) 先修课程 :Java 基础入门 MySQL 数据库入门后续课程 :JavaWeb 程序开发进阶教程适用专业 : 信息及其计算机相关专业开课部门 : 计算机系 一 课程的性质与目标 JavaWeb 程序开发入门

More information

FileMaker 16 ODBC 和 JDBC 指南

FileMaker 16 ODBC 和 JDBC 指南 FileMaker 16 ODBC JDBC 2004-2017 FileMaker, Inc. FileMaker, Inc. 5201 Patrick Henry Drive Santa Clara, California 95054 FileMaker FileMaker Go FileMaker, Inc. FileMaker WebDirect FileMaker Cloud FileMaker,

More information

untitled

untitled How to using M-Power Report API M-Power Report API 力 了 M-Power Report -- Java (Library) M-Power Report API 行 Java M-Power Report M-Power Report API ( 30 ) PDF/HTML/CSV/XLS JPEG/PNG/SVG 料 料 OutputStream

More information

Microsoft PowerPoint - ch6 [相容模式]

Microsoft PowerPoint - ch6 [相容模式] UiBinder wzyang@asia.edu.tw UiBinder Java GWT UiBinder XML UI i18n (widget) 1 2 UiBinder HelloWidget.ui.xml: UI HelloWidgetBinder HelloWidget.java XML UI Owner class ( Composite ) UI XML UiBinder: Owner

More information

untitled

untitled ArcGIS Server Web services Web services Application Web services Web Catalog ArcGIS Server Web services 6-2 Web services? Internet (SOAP) :, : Credit card authentication, shopping carts GIS:, locator services,

More information

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

KillTest 质量更高 服务更好 学习资料   半年免费更新服务 KillTest 质量更高 服务更好 学习资料 http://www.killtest.cn 半年免费更新服务 Exam : 310-055Big5 Title : Sun Certified Programmer for the Java 2 Platform.SE 5.0 Version : Demo 1 / 22 1. 11. public static void parse(string str)

More information

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

Microsoft PowerPoint - 02-Servlet-Basics-Chinese.ppt 2004 Marty Hall servlet 基础 JSP, Servlet, & Struts Training Courses: http://courses.coreservlets.com Available in US, China, Taiwan, HK, and Worldwide 2 JSP and Servlet Books from Sun Press: http://www.coreservlets.com

More information

XXXXXXXX http://cdls.nstl.gov.cn 2 26

XXXXXXXX http://cdls.nstl.gov.cn 2 26 [ ] [ ] 2003-7-18 1 26 XXXXXXXX http://cdls.nstl.gov.cn 2 26 (2003-7-18) 1...5 1.1...5 1.2...5 1.3...5 2...6 2.1...6 2.2...6 2.3...6 3...7 3.1...7 3.1.1...7 3.1.2...7 3.1.2.1...7 3.1.2.1.1...8 3.1.2.1.2...10

More information

D C 93 2

D C 93 2 D9223468 3C 93 2 Java Java -- Java UML Java API UML MVC Eclipse API JavadocUML Omendo PSPPersonal Software Programming [6] 56 8 2587 56% Java 1 epaper(2005 ) Java C C (function) C (reusability) eat(chess1,

More information

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

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, http://debut.cis.nctu.edu.tw/~chi Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0, : POSITIVE_INFINITY NEGATIVE_INFINITY

More information

Microsoft Word - PHP7Ch01.docx

Microsoft Word - PHP7Ch01.docx PHP 01 1-6 PHP PHP HTML HTML PHP CSSJavaScript PHP PHP 1-6-1 PHP HTML PHP HTML 1. Notepad++ \ch01\hello.php 01: 02: 03: 04: 05: PHP 06:

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

RunPC2_.doc

RunPC2_.doc PowerBuilder 8 (5) PowerBuilder Client/Server Jaguar Server Jaguar Server Connection Cache Thin Client Internet Connection Pooling EAServer Connection Cache Connection Cache Connection Cache Connection

More information

chapter 2 HTML5 目錄iii HTML HTML HTML HTML HTML canvas

chapter 2 HTML5 目錄iii HTML HTML HTML HTML HTML canvas Contents 目錄 chapter 1 1-1... 1-2 1-2... 1-3 HTML5... 1-3... 1-5 1-3... 1-9 Web Storage... 1-9... 1-10 1-4 HTML5... 1-14... 1-14... 1-15 HTML5... 1-15... 1-15... 1-16 1-5... 1-18 Apps... 1-18 HTML5 Cache

More information

Chapter 9: Objects and Classes

Chapter 9: Objects and Classes Java application Java main applet Web applet Runnable Thread CPU Thread 1 Thread 2 Thread 3 CUP Thread 1 Thread 2 Thread 3 ,,. (new) Thread (runnable) start( ) CPU (running) run ( ) blocked CPU sleep(

More information

Spark读取Hbase中的数据

Spark读取Hbase中的数据 Spark 读取 Hbase 中的数据 Spark 和 Flume-ng 整合, 可以参见本博客 : Spark 和 Flume-ng 整合 使用 Spark 读取 HBase 中的数据 如果想及时了解 Spark Hadoop 或者 Hbase 相关的文章, 欢迎关注微信公共帐号 :iteblog_hadoop 大家可能都知道很熟悉 Spark 的两种常见的数据读取方式 ( 存放到 RDD 中 ):(1)

More information

Microsoft Word - Learn Objective-C.doc

Microsoft Word - Learn Objective-C.doc Learn Objective C http://cocoadevcentral.com/d/learn_objectivec/ Objective C Objective C Mac C Objective CC C Scott Stevenson [object method]; [object methodwithinput:input]; output = [object methodwithoutput];

More information

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点

OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 OOP with Java Yuanbin Wu cs@ecnu OOP with Java 通知 Project 4: 5 月 2 日晚 9 点 复习 类的复用 组合 (composition): has-a 关系 class MyType { public int i; public double d; public char c; public void set(double x) { d =

More information

epub83-1

epub83-1 C++Builder 1 C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r C + + B u i l d e r 1.1 1.1.1 1-1 1. 1-1 1 2. 1-1 2 A c c e s s P a r a d o x Visual FoxPro 3. / C / S 2 C + + B u i l d e r / C

More information

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas

目录 1 IPv6 快速转发 IPv6 快速转发配置命令 display ipv6 fast-forwarding aging-time display ipv6 fast-forwarding cache ipv6 fas 目录 1 IPv6 快速转发 1-1 1.1 IPv6 快速转发配置命令 1-1 1.1.1 display ipv6 fast-forwarding aging-time 1-1 1.1.2 display ipv6 fast-forwarding cache 1-1 1.1.3 ipv6 fast-forwarding aging-time 1-3 1.1.4 ipv6 fast-forwarding

More information

目录 1 IPv6 PIM Snooping 配置命令 IPv6 PIM Snooping 配置命令 display pim-snooping ipv6 neighbor display pim-snooping ipv6 routing-ta

目录 1 IPv6 PIM Snooping 配置命令 IPv6 PIM Snooping 配置命令 display pim-snooping ipv6 neighbor display pim-snooping ipv6 routing-ta 目录 1 IPv6 PIM Snooping 配置命令 1-1 1.1 IPv6 PIM Snooping 配置命令 1-1 1.1.1 display pim-snooping ipv6 neighbor 1-1 1.1.2 display pim-snooping ipv6 routing-table 1-2 1.1.3 display pim-snooping ipv6 statistics

More information

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

基于ECO的UML模型驱动的数据库应用开发1.doc ECO UML () Object RDBMS Mapping.Net Framework Java C# RAD DataSetOleDbConnection DataGrod RAD Client/Server RAD RAD DataReader["Spell"].ToString() AObj.XXX bug sql UML OR Mapping RAD Lazy load round trip

More information

1 下列类头定义中, 正确的是 面向对象程序设计网络课程 A class x { } B public x extends y { } C public class x extends y {.} D class x extends y implements y1 { } 2 现有两个类 A B,

1 下列类头定义中, 正确的是 面向对象程序设计网络课程 A class x { } B public x extends y { } C public class x extends y {.} D class x extends y implements y1 { } 2 现有两个类 A B, 1 下列类头定义中, 正确的是 A class x B public x extends y C public class x extends y. D class x extends y implements y1 2 现有两个类 A B, 以下描述中表示 B 继承自 A 的是 (D ) A) class A extends B B) class B implements A C) class A

More information

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466>

<ADB6ADB1C25EA8FAA6DB2D4D56432E706466> packages 3-31 PART 3-31 03-03 ASP.NET ASP.N MVC ASP.NET ASP.N MVC 4 ASP.NET ASP.NE MVC Entity Entity Framework Code First 2 TIPS Visual Studio 20NuGetEntity NuGetEntity Framework5.0 CHAPTER 03 59 3-3-1

More information

雲端 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

雲端 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 CHAPTER 使用 Hadoop 打造自己的雲 8 8.3 測試 Hadoop 雲端系統 4 Nodes Hadoop Map Reduce Hadoop WordCount 4 Nodes Hadoop Map/Reduce $HADOOP_HOME /home/ hadoop/hadoop-0.20.2 wordcount echo $ mkdir wordcount $ cd wordcount

More information

untitled

untitled PowerBuilder Tips 利 PB11 Web Service 年度 2 PB Tips PB9 EAServer 5 web service PB9 EAServer 5 了 便 web service 來說 PB9 web service 力 9 PB11 release PB11 web service 力更 令.NET web service PB NVO 論 不 PB 來說 說

More information

PowerPoint 演示文稿

PowerPoint 演示文稿 The BitCoin Scripting Language 交易实例 交易结构 "result": { "txid": "921a dd24", "hash": "921a dd24", "version": 1, "size": 226, "locktime": 0, "vin": [ ], "vout": [ ], "blockhash": "0000000000000000002c510d

More information

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1

C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 5 月 3 日 1 C++ 程序设计 告别 OJ1 - 参考答案 MASTER 2019 年 月 3 日 1 1 INPUTOUTPUT 1 InputOutput 题目描述 用 cin 输入你的姓名 ( 没有空格 ) 和年龄 ( 整数 ), 并用 cout 输出 输入输出符合以下范例 输入 master 999 输出 I am master, 999 years old. 注意 "," 后面有一个空格,"." 结束,

More information