1、1Servletcharset=UTF-8“);PrintWriter out = response._;out.println(“);.(A) getPrintWriter()(B) getWriter()(C) getBufferedWriter()(D) getOutputWriter()答案:B2. 请问以下的 Servlet 程序片段输出结果为何?out.println(“第一个 Servlet 程序“);out.flush();request.getRequestDispatcher(“message.jsp“).forward(request,response);out.prin
2、tln(“Hello!World!“); (A) 显示“ 第一个 Servlet 程序“后转发 message.jsp(B) 显示“ 第一个 Servlet 程序“与“Hello!World!“(C) 直接转发给 message.jsp 进行响应(D) 丢出 IllegalStateException答案:A提示:在 flush()之后响应已确认,此时再 forward()就会发生IllegalStateException。3. 你将 secret.jsp 档案放在 WEB-INF 目录中,哪个方式或程序片段可以正确让 secret.jsp 进行响应?(A) 使用浏览器请求/WEB-INF/s
3、ecret.jsp(B) request.getRequestDispatcher(“/WEB-INF/secret.jsp“)并进行 forward()9(C) 使用 response.sendRedirect(“/WEB-INF/secret.jsp“)(D) 使用 response.sendError(“/WEB-INF/secret.jsp“)答案:B4. 如果想知道使用者所使用的浏览器版本等相关讯息,可以执行哪一段程序代码:(A) request.getHeaderParameter(“User-Agent“)(B) request.getParameter(“User-Agent“
4、)(C) request.getHeader(“User-Agent“)(D) request.getRequestHeader(“User-Agent“)答案:C5. 如果想取得输出串流对象对浏览器输出位数据,应该撰写哪一段程序代码?(A) ResponseStream out = response.getResponseStream();(B) ResponseStream out = response.getStream();(C) ResponseStream out = response.getOutputStream();(D) ServletOutputStream out =
5、response.getOutputStream();答案:D6. 哪几个程序代码可以取得 password 请求参数的值?(A) request.getParameter(“password“);(B) request.getParameters(“password“)0;(C) request.getParameterValues(“password“)0;(D) request.getRequestParameter(“password“);答案:A、C提示:getParameterValues()会用字符串数组传回指定的请求参数值,如果请求参数只有一个值,则透过指定索引值 0 也可取得
6、该值。7. 下面这个程序代码片段会输出什么结果?PrintWriter writer = response.getWriter();writer.println(“第一个 Servlet 程序“);OutputStream stream = response.getOutputStream();stream.println(“第一个 Servlet 程序“.getBytes();(A) 浏览器会看到两段“第一个 Servlet 程序“的文字(B) 浏览器会看到一段“第一个 Servlet 程序“的文字(C) 丢出 IllegalStateException(D) 由于没有正确地设定内容类型(c
7、ontent-type) ,浏览器会提示另存新档10答案:C提示:同一个请求周期中,HttpServletResponse 的 getWriter()与getOutputStream()只能择一使用,否则会丢出IllegalStateException。8. 如果要设置响应的内容类型标头,哪几个选项是正确的作法?(A) response.setHeader(“Content-Type“, “text/html“);(B) response.setContentType(“text/html“);(C) response.addHeader(“Content-Type“, “text/html“
8、);(D) response.setContentHeader(“text/html“);答案:A、B、C9. 下面哪个选项,可以正确地追加自订标头“MyHead“的值?(A) response.setHeader(“MyHeader“, “Value2“);(B) response.appendHeader(“MyHeader“, “Value2“);(C) response.addHeader(“MyHeader“, “Value2“);(D) response.insertHeader(“MyHeader“, “Value2“);答案:C10. 哪几个方法是定义在 HttpServlet
9、Request 中,而非由ServletRequet 中继承而来?(A) getMethod()(B) getHeader()(C) getParameter()(D) getCookies()答案:A、B、C提示:与 HTTP 请求有关的方法,是定义在 HttpServletRequest 中,与通用请求有关的,是定义在 ServletRequest 中,例如 getParameter()。 实作题:1. 请实作一个 Web 应用程序,可以将使用者所发送的 name 请求参数值画在一张图片上(参考下图,底图可任选) 。提示:可在搜寻引擎下关键词动态产生图片寻找解答。参考http:/ 以及利用
10、搜寻引擎寻找解答的能力。11图 3.20 根据使用者输入动态产生图片内容2. 请实作一个 Web 应用程序,可动态产生使用者登入密码(参考下图,仅需先确作出动态产生密码图片的功能即可,送出窗体后的密码验证功能还不用实现) 。提示:主要是上一题练习的延伸,随机产生四个数字,再画到图片上。这个练习可结合 Session 属性的运用,就可实作出登入的部份,在第 5 章讲到Session 对象时会再要求实作登入的机制。图 3.21 动态产生登入密码12第 4 章课后练习课后练习 选择题1. 如果是整个应用程序会共享的数据,则适合存放在哪个对象之中成为属性?(A) ServletConfig(B) Se
11、rvletContext(C) ServletRequest(D) Session答案:B2. 如果要取得 ServletContext 初始参数,则可以执行哪个方法?(A) getContextParameter()(B) getParameter()(C) getInitParameter()(D) getAttribute()答案:C3. 假设一段程序代码如下,其中 PARAM 为设定于 web.xml 中的初始参数:public class SomeServlet extends HttpServlet private String param;public SomeServlet()
12、 param = getInitParameter(“PARAM“);以下何者正确?(A) param 被设定为 web.xml 中的初始参数值(B) 无法通过编译(C) 应该改用 getServletParameter()方法(D) 发生 NullPointerException答案:D13提示:getInitParameter()也是透过 ServletConfig 来取得初始参数,在建构式执行时,由于尚未进行 Servlet 初始化,ServletConfig 尚未经由init()方法传入 Servlet 之中,所以建构式中尝试取得初始参数时就会发生NullPointerExceptio
13、n。4. 继承 HttpServlet 之后,若要进行 Servlet 初始化,重新定义哪个方法才是正确的作法?(A) public void init(ServletConfig config) throws ServletException;(B) public void init() throws ServletException(C) public String getInitParameter(String name)(D) public Enumeration getInitParameterNames()答案:B5. 关于 ServletContext 初始参数,以下哪两项是 w
14、eb.xml 中正确的设定?(A) PARAMVALUE(B) PARAMVALUE(C) PARAM1VALUE1PARAM1VALUE1(D) PARAM1VALUE1PARAM2VALUE214答案:B、D6. 若要读取 WEB-INF/data.txt 档案的数据,以下哪个是正确的作法?(A) FileInputStream input = new FileInputStream(“/WEB-INF/data.txt“);(B) FileInputStream input = new FileInputStream(new File(“/WEB-INF/data.txt“);(C) I
15、nputStream input = getResourceAsStream(“/WEB-INF/data.txt“);(D) FileInputStream input =getResourceAsStream(“/WEB-INF/data.txt“);答案:C7. ServletContext 定义与属性 相关的方法是哪三个?(A) getAttribute();(B) setAttribute();(C) deleteAttribute()(D) removeAttribute();答案:A、B、D8. 若 web.xml 中有以下的设定:Somecc.openhome.SomeServ
16、letparam11param22而某个 Servlet 撰写了以下的程序代码:public void init() throws ServletException super.init();int param1 = getInitParameter(“param1“);int param2 = getInitParameter(“param2“);15以下何者描述正确?(A) 第二对、可以直接撰写在第一个之中(B) param1 的值为 1,param2 的值为 1(C) 应该在建构式中进行初始参数的取得(D) Servlet 类别原始档无法通过编译答案:D提示:getInitParamet
17、er()取得的是字符串。9. 哪几个对象提供有 getAttribute()方法?(A) ServletRequest(B) HttpServlet(C) ServletConfig(D) ServletContext答案:A、D提示:事实上还有一个,HttpSession 对象。只不过到本章还没介绍到HttpSession 的使用。10. 在 web.xml 中有以下的设定:cc.openhome.SomeListener.以下何者正确?(A) SomeListener 类别要实作 ServletContextListener 接口(B) 每生成一个 Servlet 实例就会呼叫 Servl
18、etContextListener的 init()方法(C) Web 应用程序初始化之后,会呼叫ServletContextListener 的 contextInitialized()方法(D) 不需要这个标签答案:A、C 实作题1. 请使用目前所学得的 Servlet 相关技巧,实作一个在线留言版程序,其中16必须包括以下的功能:(1). 有个档案会储存留言,应用程序初始时,必须从该档案中加载留言记录。(2). 观看留言功能,每笔留言中包括了留言者的头像、名称与留言讯息。下图是个简单的示范。图 4.8 观看留言(3). 动态留言窗体功能,新增留言时使用的窗体。其中包括了输入留言者名称、留言
19、的字段,并可以让使用者选取头像。头像存放的目录可以由 Servlet 初始参数设定。窗体必须可以自动显示头像存放目录中的图片,有多少图片就显示多少个头像。若新增留言失败也会将请求转发回窗体,此时要显示错误讯息以及使用者先前填写的名称与留言。下图是个简单的示范。17图 4.9 新增留言窗体(4). 新增留言功能,必须作基本的请求参数检查。留言失败及成功的URL,必须可以由 Servlet 初始参数来设定。留言成功时必须显示留言成功讯息、使用者名称、留言与头像。下图是个简单的示范。图 4.10 新增留言成功提示:这个练习可以让学生模仿书中在线书签的制作流程与方式。可建议学生先如第 3 章实作简单的
20、观看留言及新增留言功能。再进一步根据第 4章改写,利用 ServletConfig 读取 Servlet 初始参数,利用ServletContext 读取应用程序初始参数等。18第 5 章课后练习 选择题1. 在浏览器禁用 Cookie 的情况下,哪些机制仍可以用于会话管理?(A) HttpSession(B) URL 重写(C) 隐藏字段(D) Cookie API答案:B、C2. 如何设定 Cookie 的有效期限?(A) 使用 setMaxAge()(B) 使用 setMaxInactive()(C) 使用 setMaxInactiveInterval()(D) 在 web.xml 中设
21、定答案:A3. web.xml 中 的设定单位是?(A) 时(B) 分(C) 秒(D) 毫秒答案:B4. 何者可以实作使用者的自动登入机制?(A) HttpSession(B) Cookie(C) HttpServletRequest(D) URL 重写答案:B5. 关于 HttpSession 的 setMaxInactiveInterval()方法,以下描述何者错误?(A) 设定的单位是分(B) 用来设定 HttpSession 在浏览器多久没活动后失效(C) 用来设定 Cookie 的失效时间19(D) 会覆盖 web.xml 中 的设定答案:A、C6. 关于 HttpSession 的
22、描述,以下何者错误?(A) 关闭浏览器后 HttpSession 就会被回收(B) 可以执行 invalidate()使之失效(C) 不同的浏览器使用相同的 Session ID,也会取得不同的HttpSession 对象(D) HttpSession 的 setMaxInactiveInterval()方法设定为-1将永不失效答案:A、C提示:关闭浏览器后立即失效的是储存 Session ID 的 Cookie,不是HttpSession 对象。7. 哪几个对象提供有 setAttribute()方法?(A) ServletRequest(B) HttpSession(C) ServletC
23、onfig(D) ServletContext答案:A、B、D8. 关于 ServletJSP 的 Session ID,何者正确?(A) 预设使用 Cookie 来储存 Session ID(B) Cookie 的名称是 JSESSIONID(C) 在禁用 Cookie 时,可以使用 URL 重写来发送 Session ID(D) 必须自行呼叫 HttpSession 的 getId()方可产生答案:A、C提示:Session ID 的 Cookie 名称是厂商各自实作的, JSESSIONID 在Tomcat 上的实作名称。容器会自动帮你产生 Session ID。9. 哪几个对象的属性设
24、定可以跨越请求范围?(A) ServletRequest(B) HttpSession(C) ServletConfig(D) ServletContext答案:B、D10. HttpSession 失效的时机为何?20(A) 执行 invaliate()方法(B) 下次请求超过 web.xml 中 的设定时间(C) 存活时间超过 setMaxInactiveInterval()方法设定的时间(D) 关闭浏览器答案:A、B提示:无论是或 setMaxInactiveInterval()所设定的时间,都是指浏览器没有再次请求活动的时间,而不是指 HttpSession本身的存活时间。 实作题1.
25、 请实作一个 Web 应用程序,可动态产生使用者登入密码,送出窗体后必须通过密码验证才可观看到使用者页面。提示:此题仍第 3 章课后练习第 2 个实作题之延伸。图 5.10 图片验证2. 实作一个登入窗体,如果使用者核取记住名称、密码 ,则下次造访窗体时,将会自动在名称、密码字段填入上次登入时所使用的值。图 5.11 记住名称、密码21第 6 章课后练习 选择题1. 关于过滤器的描述,以下何者正确?(A) Filter 接口定义了 init()、service()与 destroy()方法(B) 会传入 ServletRequest 与 ServletResponse 至 Filter(C)
26、要执行下一个过滤器,必须执行 FilterChaing 的 next()方法(D) 如果要取得初始参数,要使用 FilterConfig 物件答案:B、D2. 关于以下 web.xml 的设定:SecurityFiltercc.openhome.SecurityFilterSecurityFilter*.doUSERcaterpillarPASSWORD123456以下描述何者正确?(A) 根据,过滤器会套用在所有以.do 结尾的URL 请求(B) 可以透过 FilterConfig 来读取 USER 与 PASSWORD 初始参数(C) 初始参数设定位置错误,等标签应放在标签之中(D) 应改
27、为才是正确设定答案:A、C提示:由于初始参数的设定错误,无法透过 FilterConfig 取得初始参数。223. 关于以下的 web.xml 设定:SecurityFilter/add.doSecurityFilter*.viewCharacterFilter/add.do以下描述何者正确?(A) 当请求 add.do 时,只会套用 SecurityFilter(B) 当请求 add.do 时,过滤器的执行顺序为SecurityFilter、CharacterFilter(C) 当请求 list.view 时,过滤器的执行顺序为SecurityFilter、CharacterFilter(D
28、) 当请求 list.view 时,只会套用 SecurityFilter答案:B、D4. 关于 FilterChain 的描述,何者正确?(A) 如果不呼叫 FilterChain 的 doFilter()方法,则请求略过接下来的过滤器而直接交给 Servlet(B) 如果有下一个过滤器,呼叫 FilterChain 的 doFilter()方法,会将请求交给下一个过滤器(C) 如果没有下一个过滤器,呼叫 FilterChain 的 doFilter()方法,会将请求交给 Servlet(D) 如果没有下一个过滤器,呼叫 FilterChain 的 doFilter()方法没有作用答案:B、
29、C5. 关于 FilterConfig 的描述,何者错误?(A) 会在 Filter 界面的 init()方法呼叫时传入(B) 为 web.xml 中设定的代表对象(C) 可读取标签中所设定的初始参数(D) 可使用 getInitParameter()方法读取初始参数23答案:C6. 以下的程序代码将实作请求包裹器:public class MyRequestWrapper _ public MyRequstWrapper(HttpServletRequest request) super(requset);.请问空白处应该填上哪个程序代码片段?(A) implements ServletRe
30、quest(B) extends ServletRequestWrapper(C) implements HttpServletRequest(D) extends HttpServletRequestWrapper答案:D提示:因为建构式中直接使用传入的 HttpServletRequest 对象及 super()来呼叫父类别建构式,所以一定是继承 HttpServletRequestWrapper。7. 关于请求包裹器,以下描述何者正确?(A) 可以实作 ServletRequest 界面(B) 可以继承 ServletRequestWrapper 类别(C) 一定要继承 ServletR
31、equestWrapper 类别(D) HttpServletRequestWrapper 是ServletRequestWrapper 的子类别答案:A、B、D提示:要自己实作 ServletRequest 接口来实作请求包裹器也是可以的 ,只是所有的方法都要自行实作。8. 关于 HttpServletRequestWrapper 与HttpServletResponseWrapper 的描述,何者有误?(A) 分别实作了 HttpServletRequest 界面与HttpServletResponse 界面(B) 分别继承了 ServletRequestWrapper 与ServletR
32、esponseWrapper 类别(C) 实作时,至少要重新定义一个父类别中的方法(D) 实作时必须在建构式中呼叫父类别建构式答案:C249. 在开发过滤器时,以下何者是正确的观念?(A) 必须考虑前后过滤器之间的关系(B) 挂上过滤器后不改变应用程序原有的功能(C) 设计 Servlet 时必须考虑到未来加装过滤器的需求(D) 每个过滤器要设计为独立互不影响的组件答案:B、D10. 关于 Filter 界面上的 doFilter()方法之说明,何者有误?(A) 会传入两个参数HttpServletRequest、HttpServletResponse(B) 会传入三个参数HttpServle
33、tRequest、HttpServletResponse、FilterChain(C) 前一个过滤器呼叫 FilterChain 的 doFilter()后,会执行目前过滤器的 doFilter()方法(D) 前一个过滤器的 doFilter()执行过后,会执行目前过滤器的doFilter()方法答案:A、B、D提示:Filter 的 doFilter()方法上三个参数是ServletRequest、ServletResponse、FilterChain。前一个过滤器的doFilter()执行时,当中必须呼叫 FilterChain 的 doFilter()方法,才会执行目前过滤器的 doFi
34、lter()方法。 实作题1. 模仿本单元综合练习,重构第 4 章元课后练习中的留言版程序,将从档案读写留言版讯息的职责封装至一个 MessageServlce 类别中。 。2. 你的留言版程序不允许使用者输入 HTML 标签,但可以允许使用者输入一些代码作些简单的样式。例如: b粗体 /b i斜体 /i big放大字体/big small缩小字体/smallHTML 的过滤功能,你可以直接使用本章所开发的字符过滤器,并且请另行开发一个过滤器来完成代码替换的功能。25第 7 章课后练习 选择题1. 以下哪几个倾听器,必须在 web.xml 中设定?(A) HttpSessionListener
35、(B) RequestListener(C) ServletContextListener(D) ServletAttributeListener答案:A、C提示:没有 B、D 这两种倾听器。2. 以下何者为倾听器的事件类型之一?(A) HttpSessionEvent(B) RequestAttributeEvent(C) ServletContextAttributeEvent(D) ServletContextEvent答案:A、C、D3. 以下倾听器中,不需要在 web.xml 中设定的是?(A) HttpSessionListener(B) HttpSessionBindingLis
36、tener(C) ServletContextListener(D) ServletAttributeListener答案:B4. 以下哪几个事件类型,拥有 getName()与 getValue()方法?(A) HttpSessionEvent(B) ServletRequestAttributeEvent(C) ServletContextAttributeEvent(D) HttpSessionBindingListener答案:B、C、D。5. 你有一段程序代码片段:HttpSession session = request.getSession();User user = new U
37、ser();session.setAttrubute(“user“, user);26以下何种作法,可以让你在不修改程序代码的情况下,实作统计在线人数?(A) 实作 HttpSessionBindingListener(B) 实作 HttpSessionListener(C) 实作 HttpSessionActivationListener(D) 以上皆非答案:B提示:题目要求不修改原有的程序代码,所以 B 是唯一的可能性。6. 在 web.xml 中有以下的设定:Somecc.openhome.SomeServlet1Othercc.openhome.OtherServlet1AnOther
38、cc.openhome.AnOtherServlet2请问以下描述何者正确?(A) 容器会产生两个 AnotherServlet 实例(B) 容器会先初始化 SomeServlet,再初始化 OtherServlet(C) 容器会先初始化 AnOtherServlet,然后才是其它 Servlet(D) 容器在请求来到时,才会初始化对应的 Servlet答案:B7. 哪个 URL 模式设定方式,可以符合/guest/list.view 的请求?(A) *.view(B) /guest/*.view(C) /guest/*(D) /guest/list.view27答案:A、C、D8. 如果想要
39、请求 guest 目录时,自动显示欢迎档案,则以下空格可以填上什么?_(A) /guest/index.html(B) /index.html(C) default.jsp(D) default.*答案:C9. 关于以下 web.xml 中的设定,何者描述正确?NullPointerExceptionreport.view(A) 发生 NullPointerException 时会转发 report.view 处理(B) 例外型态必须指定完全符合名称(Full Qualified Name)(C) report.view 必须改为/report.view(D) 例外类型不可以指定特定的例外类别
40、名称答案:B、C10. 在过滤器设定中,哪个 URL 模式设定方式,在/guest/list.view 的请求时会触发过滤器?(A) *.view(B) /guest/*.view(C) /guest/*(D) /guest/list.view答案:A、C、D提示:过滤器的 设定原则与 Servlet 相同。 实作题281. 请扩充 7.1.1 节中的范例,不仅统计在线人数,还可以在页面上显示目前登入使用者的名称、浏览器信息、最后活动时间。图 7.14 在线使用者信息2. 在 7.1.3 节中,使用 HttpSessionBindingListener 来实作使用者登入、注销的日志记录功能,请
41、改用 HttpSessionAttributeListener来实作这个功能。29第 8 章课后练习 选择题1. 关于 JSP 的描述,哪个正确?(A) JSP 是直译式的网页,与 Servlet 无关(B) JSP 会先转译为.java,然后编译为.class 载入容器(C) JSP 会直接由容器动态生成 Servlet 实例,无需转译(D) JSP 是丢到浏览器端,由浏览器进行直译答案:B2. 关于 JSP 的描述,哪个正确?(A) 要在 JSP 中撰写 Java 程序代码,必须重新定义_jspService()(B) 重新定义 jspInit()来作 JSP 初次载入容器的初始化动作(C
42、) 重新定义 jspDestroy()来作 JSP 从容器销毁时的结尾动作(D) 要在 JSP 中撰写 Java 程序代码,必须重新定义 service()答案:B、C3. 如果想要在 JSP 中定义方法,应该使用哪个 JSP 元素?(A) (B) (C) (D) 答案:C4. 当 JSP 中有撰写中文时,而执行结果出现乱码,必须检查 page 指示元素的哪些属性设定是否正确?(A) contentType(B) language(C) extends(D) pageEncoding答案:A提示:基本上还得检查一下编辑器的预设编码与 pageEncoding 是否一致。305. 哪个 JSP
43、隐含对象,转译后对应 ServletContext 物件?(A) pageContext(B) config(C) page(D) application答案:D6. 在 Session 范围中以名称 “bean“放置了一个 JavaBean 属性,JavaBean上有个 getMessage()方法,请问以下哪个方式呼叫 getMessage()以取得讯息并显示出来?(A) (B) $requestScope.bean.message(C) (D) $bean.message答案:B、D提示:前必须先使用并指定 scope为 request,否则只会在 page 范围中寻找属性。7. 在 Web 应用程序中有以下的程序代码,执行后转发至某个 JSP 网页:Map map = new HashMap();map.put(“user“, “caterpillar“);map.put(“role“, “admin“);request.setAttribute(“login“, map);以下哪个选项可以正确地使用 EL 取得 map 中的值?(A) $map.user(B) $map“role“(C) $login.user(D) $loginrole答案:C提示:选项 D 必须改为$login“role“ 才是正确。