第6章课后练习
? 选择题
1. 关于过滤器的描述,以下何者正确?
(A) Filter接口定义了init()、service()与destroy()方法 (B) 会传入ServletRequest与ServletResponse至Filter (C) 要执行下一个过滤器,必须执行FilterChaing的next()方法 (D) 如果要取得初始参数,要使用FilterConfig物件 答案:B、D
2. 关于以下web.xml的设定:
以下描述何者正确?
(A) 根据
URL请求
(B) 可以透过FilterConfig来读取USER与PASSWORD初始参数 (C) 初始参数设定位置错误,
标签之中
(D)
提示:由于初始参数的设定错误,无法透过FilterConfig取得初始参数。
21
3. 关于以下的web.xml设定:
以下描述何者正确?
(A) 当请求add.do时,只会套用SecurityFilter
(B) 当请求add.do时,过滤器的执行顺序为SecurityFilter、CharacterFilter
(C) 当请求list.view时,过滤器的执行顺序为SecurityFilter、CharacterFilter
(D) 当请求list.view时,只会套用SecurityFilter 答案:B、D
4. 关于FilterChain的描述,何者正确?
(A) 如果不呼叫FilterChain的doFilter()方法,则请求略过接
下来的过滤器而直接交给Servlet (B) 如果有下一个过滤器,呼叫FilterChain的doFilter()方法,
会将请求交给下一个过滤器
(C) 如果没有下一个过滤器,呼叫FilterChain的doFilter()方
法,会将请求交给Servlet
(D) 如果没有下一个过滤器,呼叫FilterChain的doFilter()方法没有作用
答案:B、C
5. 关于FilterConfig的描述,何者错误?
(A) 会在Filter界面的init()方法呼叫时传入 (B) 为web.xml中
(C) 可读取
22
答案:C
6. 以下的程序代码将实作请求包裹器:
public class MyRequestWrapper ________________ {
public MyRequstWrapper(HttpServletRequest request) { super(requset); } …. }
请问空白处应该填上哪个程序代码片段?
(A) implements ServletRequest
(B) extends ServletRequestWrapper (C) implements HttpServletRequest
(D) extends HttpServletRequestWrapper 答案:D
提示:因为建构式中直接使用传入的HttpServletRequest对象及super()来呼叫父类别建构式,所以一定是继承HttpServletRequestWrapper。
7. 关于请求包裹器,以下描述何者正确?
(A) 可以实作ServletRequest界面
(B) 可以继承ServletRequestWrapper类别 (C) 一定要继承ServletRequestWrapper类别 (D) HttpServletRequestWrapper是
ServletRequestWrapper的子类别
答案:A、B、D
提示:要自己实作ServletRequest接口来实作请求包裹器也是可以的,只是所有的方法都要自行实作。
8. 关于HttpServletRequestWrapper
HttpServletResponseWrapper的描述,何者有误? (A) 分别实作了HttpServletRequest界面
HttpServletResponse界面 (B) 分别继承了ServletRequestWrapper
ServletResponseWrapper类别
(C) 实作时,至少要重新定义一个父类别中的方法 (D) 实作时必须在建构式中呼叫父类别建构式 答案:C
23
与与与
9. 在开发过滤器时,以下何者是正确的观念? (A) (B) (C) (D) 答案:B、D
必须考虑前后过滤器之间的关系
挂上过滤器后不改变应用程序原有的功能
设计Servlet时必须考虑到未来加装过滤器的需求 每个过滤器要设计为独立互不影响的组件
10. 关于Filter界面上的doFilter()方法之说明,何者有误?
(A) 会传入两个参数HttpServletRequest
HttpServletResponse (B) 会传入三个参
数
HttpServletRequest
、、
HttpServletResponse、FilterChain
(C) 前一个过滤器呼叫FilterChain的doFilter()后,会执行目
前过滤器的doFilter()方法
(D) 前一个过滤器的doFilter()执行过后,会执行目前过滤器的
doFilter()方法
答案:A、B、D
提示:Filter的doFilter()方法上三个参数是ServletRequest、ServletResponse、FilterChain。前一个过滤器的doFilter()执行时,当中必须呼叫FilterChain的doFilter()方法,才会执行目前过滤器的doFilter()方法。
? 实作题
1. 模仿本单元综合练习,重构第4章元课后练习中的留言版程序,将从档案读
写留言版讯息的职责封装至一个MessageServlce类别中。。
2. 你的留言版程序不允许使用者输入HTML标签,但可以允许使用者输入一
些代码作些简单的样式。例如: ? [b]粗体[/b] ? [i]斜体[/i] ? [big]放大字体[/big]
? [small]缩小字体[/small]
HTML的过滤功能,你可以直接使用本章所开发的字符过滤器,并且请另行开发一个过滤器来完成代码替换的功能。
24