JavaWeb 期末考--复盘

Javaweb 期末复习题目

1

单选

2

多选

3

问答与分析

4

程序填空

5

程序设计(该部分无)

需要word版资料详见文章末尾,免费自提

0、学期知识点回顾

一、注释和注解

1、Java的三种注释:单行、多行和文档注释

2、常用的元注解:

(1)当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的存活时间。取值如下:

  1. RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
  2. RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
  3. RetentionPolicy.RUNTIME 注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们。

(2) @Target 指定了注解运用的地方

二、Java Web开发入门

1、Java的3个版本

(1)Java SE:用于桌面应用软件的开发

(2)Java EE:用于开发高访问量、大数据量、高并发量的网站

(3)Java ME:用于嵌入式系统和移动平台的开发

2、B/S架构

(1)优点:客户端无需安装,有Web浏览器即可;B/S架构无需升级多个客户端,升级Web服务器即可。

(2)缺点:在跨浏览器上,B/S架构不尽如人意;表现要达到C/S程序的程度需要花费不少精力;在速度和安全性上需要花费较大的设计成本

3、常见的Java web服务器

        Tomcat服务器、Resin服务器、JBoss服务器、WebSphere服务器、WebLogic服务器

4、常见的Java IDE

        Jcreator、netbeans、IDEA、Eclipse 、MyEclipse

5、HTTP请求的两种方式:GET和POST。

        只有一种情况可以发送POST请求:<form method=“POST”>;其余情况,都是GET请求。

6、GET和POST的区别

(1)GET在请求行中提交数据,发送的数据会显示在地址栏上POST在请求体中提交数据,发送的数据不会显示在地址栏

(2)GET无法发送大数据量;POST可以发送大数据量,理论上没有限制。

(3)GET只能发送字符串数据;POST可以发送任何类型的数据,包括字符串、视频、声音、图片等。

(4)W3C的建议:GET请求适合从服务器端获取数据;POST请求适合向服务器端传送数据

7、如何选择使用GET请求和POST请求?

(1)如果是从服务器获取资源,比如搜索,建议使用GET;如果是向服务器提交数据,建议使用POST。

(2)有敏感数据,比如登录,使用POST

(3)传送数据不是字符串,比如文件上传,必须POST。

(4)传送的数据很多,使用POST。                 

三、Servlet

1、Servlet运行在Servlet容器(Web应用服务器/Tomcat)中,负责与客户端进行通信。

2、静态页面开发技术:HTML、css、javascrpit

3、动态页面开发技术:JSP/Servlet、ASPX、PHP

4、Srevlet的配置

(1)基于XML文件的方式:在web.xml中配置

(2)基于注解的方式:@WebServlet

5、Servlet的生命周期方法

(1)无参构造函数:当servlet第一次被访问时,调用构造方法创建对象。只调用一次

(2)init:只调用一次(在第一次访问Servlet时被调用一次),初始化对象。

(3)service:调用N次,执行业务逻辑方法。该方法在访问servlet时,都会被调用。

(4)destory:只调用一次,在servlet对象被销毁之前调用,完成清理资源等工作

四、JSP基本语法

1、JSP(Java Server Pages)主要作用:代替Servlet程序回传html页面。

2、JSP的本质是一个Servlet。 当第一次访问 jsp页面的时候,Tomcat 服务器会把jsp 页面翻译成为一个java源文件,并将它编译成为.class文件。

3、JSP将Java代码嵌入到静态的HTML中,从而产生动态的输出;在客户端的HTM源代码中无法看到JSP页面中的Java代码。

4、JSP中嵌入java程序有三种方式:JSP程序段、JSP声明、JSP表达式

5、JSP程序段

(1)作用:执行 Java 逻辑代码

(2)格式:<%   Java代码    %>     

(3)特点:JSP程序段翻译之后在_jspService ()方法中、

6、JSP声明

(1)作用:     给jsp翻译出来的java类定义方法、属性。

(2)格式:     <%!  声明java代码 %>

(3)特点:     JSP声明翻译之后会在放在Java类中。

7、JSP表达式

(1)作用:     在jsp页面上输出数据。

(2)格式:     <%= 表达式 %>

(3)特点:JSP表达式会被翻译到 _jspService()方法中;JSP表达式会被翻译成为out.print()输出到页面上;JSP表达式不能以分号结束。

8、out.print()和out.write()

(1)print()在子类JspWriter中定义,write()是Writer类的方法。

(2)print()可将各种类型的数据转换成字符串输出,而write()只能输出字符、字符数组和字符串等与字符相关的数据

(3)使用print()和write()都可以输出字符串,但是,如果字符串对象的值为null时,print方法将输出内容为“null”的字符串,而write方法则是抛出NullPointerException异常。

六、JSP内置对象(一)

1、request是HttpServletRequest类型,常用方法:

(1)String getContextPath():获取当前web应用的上下文路径,比如/web6

(2)String getMethod():返回客户端请求方式,一般是GET/POST

(3)String[] getParameterValues(String key) :通过key获取value

(4)String getParameter(String key) :通过key获取value一维数组中的首元素

(5)void setCharacterEncoding(String charset):设置为setCharacterEncoding(“utf-8”),用于解决post请求的中文乱码。

(6)void setAttribute(String key,Object value) :通过键值对的形式保存数据。

(7)Object getAttribute(String key) :通过key取出value

(8)RequestDispatcher getRequestDispatcher(String path) :返回一个RequestDispatcher对象,该对象的forward方法用于请求转发。

2、response 是HttpServletResponse类型,常用方法:

(1)void setCharacterEncoding(String charset):指定服务器响应给浏览器的编码。

        服务器发给浏览器的数据默认是按照ISO-8859-1编码,浏览器接收到数据后按照默认的字符集(通常是GBK)解码后显示。

(2)void setContentType(String type) :指定服务器响应给浏览器的编码,同时浏览器也是根据这个参数对其接收到的数据进行重新编码(或者称为解码)。常见的用法为setContentType(“text/html;charset=UTF-8”); 

(3)PrintWriter getWriter():获取通向浏览器的字符流

(4)ServletOutputStream getOutputStream():获取通向浏览器的字节流。例如,ImageIO.write(image, "jpg", response.getOutputStream())作用为将图片输出在浏览器上。

(5)void sendRedirect(String path):重定向页面
(6)void addCookie(Cookie cookie):添加Cookie

3、Web中的资源跳转包括两种方式:转发和重定向

     (1)转发: request.getRequestDispatcher("/b").forward(request, response);

      转发是服务器内部的资源跳转,使用的是服务器端路径

     (2)重定向:response.sendRedirect(request.getContextPath()+"/b");

      重定向使用的是客户端路径。

4、转发和重定向的区别:

(1)转发request触发;重定向response触发

(2)转发一次请求浏览器地址不变重定向两次请求浏览器的地址发生变化

(3)转发只能服务器端完成资源的跳转重定向还可以实现跨app的资源跳转

5、什么时候使用转发,什么时候用重定向?

(1)想实现跨app的资源跳转,必须使用重定向

(2)如果两个页面之间需要通过 request来传值,则必须使用转发

(3)重定向可以防止“浏览器刷新导致用户重复提交表单”的问题。

6、表单

(1)表单最基本的标签是<input>,它的属性type决定了表单元素的类型。

text:文本框;password:密码框;radio:单选按钮;checkbox:复选框;reset:重置按钮;button:普通按钮;submit:提交按钮

(2)<textarea>:多行文本框

(3)<select>:下拉菜单

七、JSP内置对象(二)

1、session对象是HttpSession类型,代表着服务器和客户端一次会话的过程。session对象存储于服务器中,用来保存特定用户会话所需的数据。在一次会话中,当用户在 Web页之间跳转时,存储在session对象中的变量将不会丢失。

2、session对象通常用于保存跨请求的数据: 验证码、登录用户信息、购物车

3、服务器采用“超时机制”来判断客户端的会话是否结束。

4、session的强制失效:调用HttpSession对象的invalidate()方法

5、自定义session的失效时间

(1)在程序中手动设置session的失效时间

session.setMaxInactiveInterval(30 * 60);//失效时间单位为秒

(2)在项目的web.xml文件中配置session的失效时间

<!—失效时间单位:分钟-->

<session-config>

      <session-timeout>30 </session-timeout> 

  </session-config>

(3)在<Tomcat安装目录>\conf\web.xml文件中配置session的失效时间

6、 JSP的四大域对象

(1)page 作用域:内置对象是 pageContext,类型为PageContext,只在当前jsp页面使用

(2)request 作用域:内置对象是 request,类型为HttpServletRequest,在一次请求内有效

(3)session 作用域:内置对象是session,类型为HttpSession,在一次会话内有效。

(4)application 作用域:内置对象是application,类型为ServletContext,对应整个web应用,被所有会话共享。

八、Cookie

1、cookie不是JSP的内置对象。

2、session和cookie的区别

(1)session服务器端的会话技术数据保存在服务器;保存的数据是 Object;随着会话的结束而销毁

(2)cookie客户端的会话技术数据保存在客户端;保存的数据是 String;可以长期保存在客户端的电脑中

3、Cookie的生命指的是,cookie在客户端的有效时间。

(1)setMaxAge(-1):cookie的maxAge属性的默认值就是-1,表示只在浏览器内存中存活。一旦关闭浏览器,cookie就会消失。

(2)setMaxAge(60*60)表示cookie对象可存活1小时。当生命大于0时,浏览器会把cookie保存到硬盘上就算关闭浏览器或者重启客户端电脑,cookie也会存活1小时

(3)setMaxAge(0): 如果浏览器已经保存了cookie,那么可以通过cookie的setMaxAge(0)来删除cookie。无论是在浏览器内存中,还是在客户端硬盘上都会删除这个Cookie。

4、特殊字符以及中文的cookie处理

(1)使用URLEncodor.encode()方法,将中文存放到Cookie中。

        String name = URLEncoder.encode("姓名", "UTF-8");

        String value = URLEncoder.encode("张三", "UTF-8");

        Cookie c = new Cookie(name, value);

        response.addCookie(c);

(2)在获取Cookie时,需要先使用URLDecoder.decode()方法解码。

Cookie[] cookies = request.getCookies();

if (cookies != null) {

                 for (Cookie cookie : cookies) {

                        String name = URLDecoder.decode(cookie.getName(), "UTF-8");

                        String value = URLDecoder.decode(cookie.getValue(), "UTF-8");

                        out.print(name + ": " + value + "<br/>");

             }

}

5、Cookie的路径的作用是决定浏览器访问服务器的某个资源时,需要将浏览器端保存的哪些Cookie带给服务器

★★★6、如果没有设置Cookie的路径,默认是当前资源的所在路径。例如,http://localhost:8084/web8/a/AServlet  的所在路径为:web8/a

    这样当访问以下资源时,只有在web8/a这个路径下的,才会带上AServlet保存的cookie:

        http://localhost:8084/web8/a/AServlet(相同路径)

        http://localhost:8084/web8/a/xxxxx(同目录)

        http://localhost:8084/web8/a/xxxxx/xxxx(子目录)

★★★ 7、通过void setPath(String uri)设置Cookie的路径。

      1)、 cookie.setPath("/");//设置cookie的路径为当前服务器 

           比如:  http://localhost:8084/web8/a/AServlet,这个路径,只要是在http://localhost:8084

路径下的,都会带上ASerlet保存的cookie。  

          http://localhost:8084/web8/a/AServlet(相同路径)

          http://localhost:8084/web8/a/xxxxx(同目录)

          http://localhost:8084/web8/a/xxxxx/xxxx(子目录)

          http://localhost:8084/web8/b/xxxxx/(不同目录)

          http://localhost:8084/web9/a/xxxxx(不同路径)

      2)、 cookie.setPath(request.getContextPath());//设置cookie的路径为当前web应用

            比如:  http://localhost:8084/web8/a/AServlet,这个路径,只要是在web8路径下的,都会带上ASerlet保存的cookie。    

          http://localhost:8084/web8/a/AServlet(相同路径)

          http://localhost:8084/web8/a/xxxxx(同目录)

          http://localhost:8084/web8/a/xxxxx/xxxx(子目录)

          http://localhost:8084/web8/b/xxxxx/(不同目录)

九、JDBC连接mysql

1、使用 Statement 进行开发有两个问题:

(1)需要频繁拼接 String 字符串,出错率较高。

(2)存在 SQL 注入的风险。

2、PreparedStatement(预处理)是Statement 的子类,提供了 SQL 占位符的功能。PreparedStatement使用“?”占位符,提升了代码的可读性和可维护性,并且这种绑定参数的方式可以有效地防止SQL注入攻击。

1、单选题

        1. (单选题)以下Java版本中,用于开发高访问量、大数据量、高并发量的网站的是( 

                A. J2SE        B. J2EE        C. J2ME              D. J2WE

        2. (单选题)设有如下代码:

        与上述代码等价的注解语句为(       )

                A. @WebServlet("/t")              B. @WebServlet("/test")

               C. @WebService("/t")              D. @WebService("/test")

        3. (单选题)为了使得注解保留到程序运行的时候,则应设置@Retention取值为( 

                A. RetentionPolicy.SOURCE               B. RetentionPolicy.CLASS

                C. RetentionPolicy.RUNTIME             D. RetentionPolicy.JVM

        4. (单选题)用于指定注解运用地方的元注解为(     

                A. @Target                              B. @Retention

                C. @Documented                    D. @Inherited

        5. (单选题)关于JSP的说法错误的是(   

                A. JSP程序段翻译之后在_jspService ()方法中

                B. JSP声明翻译之后会在放在Java类中

                C. JSP表达式翻译之后在 _jspService()方法中

                D. <%=msg%>翻译后的代码为:out.write(msg)

        6. (单选题)以下代码的输出结果为

                A. str=                                      B. str=null

                C. 运行时抛出异常                 D. 编译出错,不能运行

        7. (单选题)JSP内置对象application的数据类型为(    

                A. Appliction                                   B. ServletConfig

                C. ServletContext                            D. ServletAppliction

        8. (单选题)JSP页面在第一次运行的时候被JSP引擎转换为(   

                A. CSS文件                            B. HTML文件

                C. Java文件                             D. Javascript文件

                9. (单选题)JSP的本质上是一个(   

                A. HTML     B. Servlet     C. Filter        D. Javascript

        10. (单选题)以下代码的输出结果为(       

<% 
     String str = null;   
     out.write(str);  
%>

                A. 浏览器中输出:null                B. 浏览器中显示空白

                C. 运行时抛出空指针异常           D. 编译出错,不能运行

        11. (单选题)当传送给服务器的数据不是字符串时,需要将<form>标签的method属性设置为

                A. hidden            B. post          C. get           D. submit

        12. (单选题)定义JSP程序段的代码为(     

                A. <%= JSP程序段 %>                B. <% JSP程序段%>

                C. <%! JSP程序段%>                    D. <% -- JSP程序段 %>

        13. (单选题)在Servlet生命周期方法中,用于执行业务逻辑的方法是(    )

                A. 无参构造函数                           B. init()

                C. service()                                      D. destroy()

        14. (单选题)与out.print(msg)等价的JSP代码为(   )

                A. <%=msg%>                                B. <%msg%>

                C. <%--msg%>                                D. <% msg%>

        15. (单选题)将count变量的值存储于属性名为“count”的application对象中,使用的代码为

                A. application.setAttribute("count", count)

                B. application.setAttribute(count,"count")

                C. application.getAttribute(count,"count")

                D. application.getAttribute("count", count)

        16. (单选题) 以下程序的执行结果为:

                A. 99

                    a的值为:99

                B. c
                    a的值为:99

                C. 99

                     a的值为:c

                D.c

                   a的值为:c

        17. (单选题)表单中的<select>标签表示(          )

                A. 单选框                            B. 复选框

                C. 下拉菜单                        D. 多行文本框

        18. (单选题)表单中的<input type="radio">标签表示(     )

                A. 重置按钮                        B. 提交按钮

                C. 复选框                            D. 单选框

        19. (单选题)@Override注解只在源码阶段保留,它的@Retention取值为( )

                A. RetentionPolicy.SOURCE            B. RetentionPolicy.CLASS

                C. RetentionPolicy.RUNTIME          D. RetentionPolicy.JVM

        20. (单选题)要在浏览器的地址栏上隐藏传输给服务器的参数,需要将<form>标签的method属性设置为

                A. hide         B. get    C. post   D. submit

        21. (单选题)关于POST和GET,说法错误的是(  )

                A. POST在请求体中提交数据

                B. GET在请求行中提交数据

                C. 传送的数据不是字符串,应该使用GET

                D. 传送的数据有敏感数据,应该使用POST

        22. (单选题)单击“提交”按钮,服务器资源edit能够获取到参数“index=<%=index%>”,则下划线处应填写的代码为(   )

                A. method = "post"                          B. method = "get"

                C. method = "hide"                          D. method = "submit"

        23. (单选题)JSP中,定义JSP表达式的代码为(   

                A. <%=JSP表达式%>                   B. <% JSP表达式%>

                C. <%! JSP表达式%>                    D. <%--JSP表达式%>

        24. (单选题)表单中的<textarea>标签表示(  )

                A. 单行文本框                               B. 多行文本框

                C. 单选按钮                                   D. 复选框

        25. (单选题)已知网站的上下文路径为“/demo”,重定向到当前网站下的welcome.jsp应使用代码

                A. response.sendRedirect(request.getContextPath() + "/welcome.jsp");

                B. request.getRequestDispatcher("/welcome.jsp").forward(request, response);

                C. response.sendRedirect("/welcome.jsp");

                D. response.sendRedirect("welcome.jsp");

        26. (单选题)语句response.setCharacterEncoding("utf-8")的作用为(    )

                A. 设置请求体的编码方案为utf-8

                B. 设置服务器响应给浏览器的编码为utf-8

                C. 设置浏览器对其接收到的数据的解码方案为utf-8

                D. 设置服务器响应给浏览器的编码以及浏览器的解码方案为utf-8

        27. (单选题)当post请求数据中有中文时,则在获取中文数据前应使用代码(   )

                A. request.setCharacterEncoding("utf-8")

                B. response.setCharacterEncoding("utf-8")

                C. request.setContentType("text/html;charset=utf-8")

                D. response.setContentType("text/html;charset=utf-8")

        28. (单选题)为了让session的失效时间对Tomcat服务器的所有Web应用生效,应修改的配置文件为

                A. <Tomcat安装目录>\conf\server.xml

                B. <Tomcat安装目录>\conf\tomcat-users.xml

                C. <Tomcat安装目录>\conf\context.xml

                D. <Tomcat安装目录>\conf\web.xml

        29. (单选题)JSP的主要作用为( )

                A. 设计网页特效                    B. 代替Servlet程序回传html页面

                C. 美化网页                            D. 过滤HTMLServletweb资源

        30. (单选题)Web服务器用于判断客户端的会话是否结束的机制为(

                A. 自主存储机制             B. 超时机制

                C. 加密机制                     D. 死锁机制

        31. (单选题)定义session的失效时间为30分钟的正确代码为(         )

                A. session.setMaxInactiveInterval(30*60)

                B. session.setMaxInactiveInterval(30)

                C. session.setMaxAge(30*60)

                D. session.setMaxAge(30)

        32.Emoji表情的字符编码方案为(   

                A.utf-8                               B.gbk

                C.big5                                D.iso8859-1

        33.[单选题] 设有如下代码,page1.jsp

        page2.jsp:

当用户打开page1.jsp后,不在页面中进行任何操作,直接点击提交按钮,则page2.jsp的输出结果为

                A.

                        姓名为:

                        性别为:male

                        第一项兴趣为:sport

                B.

                        姓名为:null

                        性别为:null

                        第一项兴趣为:sport

                C.

                        姓名为:null

                        性别为:null

                        第一项兴趣为:null

                D.

                        姓名为:

                        性别为:

                        第一项兴趣为:sport

        34.点击我要注册,跳转到当前网站下的register.jsp,则下划线处应填写的代码为(      )。

                <a href="<%=_________________%>/register.jsp" >我要注册</a>

                A.request.getContextPath() ;                  B.request.getContextPath() 

                C.response.getContextPath() ;               D.response.getContextPath() 

        35.语句response.setContentType("text/html;charset=utf-8")的功能完整表达为(         )        

                A.设置请求体的编码方案为utf-8

                B.设置服务器响应给浏览器的编码为utf-8

                C.设置浏览器对其接收到的数据的解码方案为utf-8

                D.设置服务器响应给浏览器的编码以及浏览器的解码方案为utf-8

        36.设置图片的来源为当前网站下的/checkCodeServlet,则下划线处应填写的代码为

                 <img id="vCode" src="_______________________/checkCodeServlet">

                A.<%=request.getContextPath() ; %>    B.<%=request.getContextPath()%>

                C.<%=response.getContextPath() ; %>  D.<%=response.getContextPath()%>

        37.将图片image输出到浏览器的页面中,应使用的代码为(   

                A.ImageIO.write(image, "jpg", request.getOutputStream());

                B.ImageIO.write(image, "jpg", request.getWriter());

                C.ImageIO.write(image, "jpg", response.getWriter());

                D.ImageIO.write(image, "jpg", response.getOutputStream());

        存储用户登录时的验证码文本,应使用的JSP内置对象为(     

                A.pageContext                                B.request

                C.session                                          D.appliction

        38.程序中自定义session的失效时间的方法为(     

                A.session.setMaxInactiveInterval()        B.session.setMaxAge()

                C.session.setMaxLife()                           D.session.setMaxTime()

        39.关于cookie的说法正确的是(         

                A.Cookie保存的数据存储于服务器

                B.关闭浏览器,Cookie保存的数据就丢失了

                C.Cookie被称为客户端的会话技术

                D.Cookie中保存的数据为Object

        40[单选题]删除cookie使用的正确代码为(           

                A.cookie.setMaxAge(0);  request.addCookie(cookie);

                B.cookie.setMaxAge(0);  response.addCookie(cookie);

                C.cookie.setMaxAge(-1);  request.addCookie(cookie);

                D.cookie.setMaxAge(-1);  response.addCookie(cookie);

        41.设有如下代码:

则当sname参数值为( )时,上述代码将删除student表中的全部记录。

               A.' or '1'='1   B.' or '1'='1'       C.' and '1'='1       D.' and '1'='1'

2、多选题

        1. (多选题)动态页面开发技术包括(    )

                A. JSP  B. Servlet  C. HTML  D. CSS  E. ASPX

        2. (多选题)Servlet的生命周期方法包括(   )

                A. 无参构造函数  B. init()  C. destroy()  D. service()  E. doFilter()

        3. (多选题)属于java IDE的软件包括(          )

                A. netbeans   B. eclipse  C. idea   D. mysql  E. sql server

        4. (多选题)以下情况中,属于向服务器发送get请求的情况为(      )

                A. 在浏览器地址栏上直接输入URL,回车

                B. 在浏览器上点击超链接

                C. 使用form表单提交数据时,form标签中,没有写method属性

                D. 在form标签中,指定method属性为:method=“get”

                E. 在form标签中,指定method属性为:method=“post”

        5. (多选题)静态页面开发技术包括(    )

                A. JSP          B. Servlet     C. HTML            D. CSS         E. Javascript

        6. (多选题)在Servlet的生命中,只执行一次的方法包括(     )        

                A. 无参构造函数  B. init()  C. destroy()    D. service()   E. servlet()

        7. (多选题) 已知sage字段在student表中定义为int型。以下代码用于:根据用户输入的年龄,查询学生的学号sno和姓名sname。

        当输入的年龄为( )时,将输出student表中的全部记录的sno和sname。

                A. 1 or 1=1   B. ' or '1'='1   C. 1 or true   D. 12 or 2=2   E. 2 or true

        8.关于请求转发和重定向说法正确的是(      )。

                A.请求转发使用的是客户端路径

                B.重定向使用的是服务器端路径

                C.想实现跨app的资源跳转,必须使用重定向

                D.如果两个页面之间需要通过 request来传值,则必须使用转发

                E.重定向可以防止“浏览器刷新,导致用户重复提交表单的问题

        9.被称为域对象的JSP内置对象包括(     

                A.application  B.session  C.response  D.request  E.pageContext

        10.关于session说法错误的是(

                A.session对象存储于服务器中

                B.当浏览器关闭,存储于浏览器的sessionID消失,服务器中的session对象也同时消失

                C.如果Servlet是浏览器访问的第一个资源,则服务器默认会为此次会话创建session对象

                D.session.setMaxInactiveInterval(60)的作用为:设置session的失效时间为60分钟

                E.session对象中的数据只能在一次请求内使用,不能被不同的请求共享

        11.关于sessioncookie说法正确的是(   

                A.session和cookie都是会话技术

                B.session的数据保存在服务器端,cookie的数据保存在客户端

                C.session保存的数据是String

                D.session随着会话的结束而销毁,cookie可以长期保存在客户端电脑中

                E.cookie保存的数据是Object

        12.已知AServlet中与cookie相关的代码为:

     Cookie c = new Cookie(“name”,”lucy”);
     cookie.setPath("/");
     request.addCookie(c);

        其中,AServlet对应的网站的上下文路径为:/web8,浏览器访问AServlet的路径为:http://localhost:8084/web8/a/AServlet ,那么,能够获取AServlet中保存的数据name=lucy的资源路径为(  

                A.http://localhost:8084/web8/a/AServlet

                B.http://localhost:8084/web8/a/BServlet

                C.http://localhost:8084/web8/a/bbb/CServlet

                 D.http://localhost:8084/web8/b/DServlet

                E.http://localhost:8084/web9/EServlet

3、问答与分析题

【例1】为什么“请求转发”会导致通过刷新重复提交表单信息,而重定向不会?请简述理由。

答:(1)请求转发,不会改变浏览器中的地址,即使中间经过了很多其他资源路径,浏览器中仍会保持最初始的访问路径。一旦刷新浏览器,浏览器就会将现在浏览器中的地址,再次发送给服务器。这与点击表单的“提交”按钮没有区别。所以,请求转发会导致用户重复提交表单。

(2)重定向,会改变浏览器中的地址。每次重定向,都会将浏览器地址,变为最后访问资源的路径。所以,浏览器即使不断刷新,也只是在不停的访问这个最终资源而不是像请求转发的刷新一样,在不断的发送初始访问路径。因此,重定向不会导致表单的重复提交。 


【例2】为什么关闭浏览器,会话结束?请简述原因。

答:关闭浏览器,浏览器中缓存中的sessionID消失。浏览器再次向服务器发送请求时,由于已经没有sessionID服务器无法找到对应的session对象。session对象找不到等同于会话结束。


【例3】浏览器访问服务端的第一个资源是JSP文件, 服务器是否都会立即创建一个 HttpSession 对象?

答:不一定若当前的 JSP 是客户端访问的第一个资源,但 JSP 的 page 指令的 session 属性值为 false,则服务器就不会为 JSP 创建一个 HttpSession 对象。


【例4】为什么preparestatement能够防止sql注入攻击?

答:因为prepareStatement采用预编译机制。在创建prepareStatement对象时即对SQL语句进行了预编译,然后传入参数。这时传递过来的参数只被认为是某个字段的值而不会被识别成一个sql指令。例如,' or '1'='1 这样的参数不会被看成是or指令,而只是某个字段的值。


【例5】某商城,在未登录的情况下,向购物车中放几件商品。关闭浏览器后,再次打开浏览器访问该商城时,购物车中的商品还在,这是怎么做的?

答:将购物车中的商品编号放到cookie中cookie保存在客户端的硬盘文件中。这样即使关闭浏览器。硬盘上的cookie还在。再次打开商城,查看购物车的时候,服务器读取客户端硬盘中存储的cookie,拿到商品编号,动态展示购物车中的商品。


【例6】cookie.jsp文件作用为:在页面中输出浏览器存储的所有cookie的名和值。请简述以下代码可能出现的问题,并给出解决方法。

 cookie.jsp代码:
  <%
     Cookie[] cookies = request.getCookies();
     for (Cookie cookie : cookies) {
        out.println(cookie.getName() + ":" + cookie.getValue() + "<br/>");
      }           

   %>

答:(1)问题:当浏览器中不存储任何cookie时,语句for (Cookie cookie : cookies) {}会报空指针异常

        (2)解决方法:在遍历cookies数组之前进行空指针的判断

if (cookies != null) {
  for (Cookie cookie : cookies) {
                    …
          }
  }

 【例7】login.jsp中,定义了一个复选框,代码如下:

                 <input type="checkbox" name="reb" id="reb" value="y">记住我

                LoginServlet.java中,判断是否选中复选框的Java代码为:

String reb = request.getParameter("reb");

if (reb.equals("y")) {

    System.out.println("用户选择了记住我!") ;  

else {

    System.out.println("用户没有选择记住我!");

}

请简述LoginServlet.java的代码在运行时的问题,以及相应的解决方法。

答:(1)问题:当用户没有选中“记住我”复选框时,reb.equals("y")会报空指针异常。

       (2)解决方法:将reb.equals("y")修改为"y".equals(reb)


【例8】      有如下两段代码:

page1.jsp:

       <form action="page2.jsp" method="post">

            用户名:<input type="text" name="username"><br>

            密码:<input type="password" name="userpass"><br>

            <input type="checkbox" name="remember" value="yes">记住我<br>                                    

            <input type="submit" value="登录">                     

        </form>
page2.jsp:

<%

        String username = request.getParameter("username");

        String userpass= request.getParameter("userPass");

        String remember = request.getParameter("remember");

%>

若不输入用户名和密码,且未选中“记住我”,单击“登录”按钮,则username、userpass、remember的值分别是多少?

答:""、null、null   

【分析】不输入用户名和密码,且未选中“记住我”,则传递给page2.jsp的参数为:username=&userpass=

        因此:

                  String username = request.getParameter("username");  // 返回 ""

                String userpass= request.getParameter("userPass");  //参数名大小写错误,没有与userPass对应的数据,返回null

                String remember = request.getParameter("remember"); //没有选中复选框,则参数中没有remember,因此也返回null


【例9】设有如下代码。

page1.jsp:

      <form action="page2.jsp" method="post">

            用户名:<input type="text" name="username"><br>

            密码:<input type="password" name="userpass"><br>

            性别:<input type="radio" name="gender" value="male">男

                 <input type="radio" name="gender" value="female">女<br>

            爱好:<input type="checkbox" name="interests" value="sport" checked>体育

                <input type="checkbox" name="interests" value="music">音乐<br>

            <input type="submit" value="提交">                     

        </form>                    

 page2.jsp:

        <% // 以下代码的getParameter()中填写的参数名均正确

            out.println("用户名为:"+request.getParameter("username")+"<br>");

            out.println("密码为:"+request.getParameter("userpass")+"<br>");

            out.println("性别为:"+request.getParameter("gender")+"<br>");

            out.println("第一项爱好为:"+request.getParameter("interests"));

        %>

当用户打开page1.jsp后,不在页面中进行任何操作,直接点击“提交”按钮,则page2.jsp的输出结果是什么?

答:

用户名为:
密码为:
性别为:null   

第一项爱好为:sport


【例10】在mysql数据库中创建users表的代码以及users表中的数据如下所示

create table users

(user_id int primary key auto_increment,

username varchar(20) unique,

userpass varchar(20),

salary decimal(18,2)

);

现通过以下java代码,获取前端传送的用户名和密码;验证成功后,将显示该用户的薪水。请说明代码中出现的SQL注入攻击,并给出解决注入攻击的方法。

Class.forName("com.mysql.jdbc.Driver");
String url ="jdbc:mysql://localhost:3306/my_db";
String user = "root";  String password = "123456";
Connection connection = DriverManager.getConnection(url, user, password);

//接收前端数据:用户名username和密码userpass
String username = req.getParameter("username");
String userpass = req.getParameter("userpass");
String sql = " select salary from users where username='" + username + "'"
                                        +" and userpass='"+userpass+"'" ;
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
resp.setContentType("text/html;charset=utf-8");
if (resultSet.next()) {
    BigDecimal salary = resultSet.getBigDecimal("salary");

//salary在mysql为decimal类型,在java中对应的数据类型为BigDecimal
    resp.getWriter().println("您的薪水为:"+salary);
}else{
    resp.getWriter().println("用户名或密码不正确!无权查看薪水");
}

答:(1)SQL注入举例:通过前端输入用户名username:lisa '#,密码userpass随意填入,就能查看用户lisa的薪水。

(以下为解释,答题时无需填写:

       # 是mysql的注释符号,因此在username为:lisa '# 时,#后面的代码全部无效,那么被执行的sql语句为:

                select salary from users where username=' lisa'

        即实现根据用户名查找记录的操作。同理,要查看susan的薪水,只需前端输入用户名:susan'# 即可。通过上述形式的用户名,成功绕过了密码校验,因此这种用户名也被称作“万能密码”。

        感兴趣的同学,可以自行构建前端界面,并在上面提供的后端代码的基础上加上异常处理等代码,从而验证本例的“万能密码”)

        (2)解决方法:使用PreparedStatement代替Statement。

                将7-10行的代码替换为:

String sql = "select username,salary from users where username=? and userpass=?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1,username);
preparedStatement.setString(2,userpass);
ResultSet resultSet = preparedStatement.executeQuery();

4、程序填空

★★★

1. (填空题)第一次访问product.jsp的显示结果如图1所示,每个超链接代表一个商品类别。单击任何一个超链接时,将把对应的商品类别存入cookie中。下一次,在7天内访问product.jsp时,则会在页面中显示上一次访问的商品类别,如图2所示。

        

         (1) request.getCookies()                      (2) cookie.getName()

         (3) cookie.getValue()                             (4) request

         (5) !item.contains(item)                          (6) URLEncoder.encode(item, "utf-8")

          (7) response.addCookie(c)


★★★ 

2. (填空题) Dbutils为访问数据库的通用类。

(1) this                        (2) conn               (3) sql                         (4) pstmt

(5) i + 1                      (6) params[i]         (7) executeUpdate()   (8) null


★★★

3. (填空题) 使用上一题定义好的Dbutils,实现用户的登录。

注:注册时,密码经过了md5加密后存入数据库中。md5算法的特点是,环境相同,同一字符串加密的结果也相同。


        (1) new Dbutils()                             (2) stringToMD5(userpass)

        (3) executeQuery(sql, params)        (4) resultSet.next()

        (5) resp                                            (6) req


 4.LoginServlet用于实现登录功能。当用户名和密码正确时,将用户名存储到session中,跳转到welcome.jsp页面;否则将出错信息转发到login.jsp页面。请在下划线处填写正确代码。

1 req

2 HttpSession

3 getSession() getSession(true) getSession(false)

4 username

5 /welcome.jsp

6 req,resp


★★★

5、在一个JSP或者Servlet中,实现网站访问次数的统计。

        注意:

                (1)在JSP中,直接通过application访问ServletContext对象。

                (2)在HttpServlet的子类的doGet() / doPost()中,获取ServletContext对象的代码为:

public class CountServlet extends HttpServlet{
protected void doGet(HttpServletRequest req, 
          HttpServletResponse resp) throws ServletException, IOException {
   ServletContext application = getServletContext();
  //或者:ServletContext application = req.getServletContext();
    }
}

★★★ 6、记录上次登入时间

import java.io.IOException;
import java.util.Date;
import java.text.SimpleDateFormat; 
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;  
@WebServlet("/LastAccessServlet")
public class LastAccessServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
   	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//指定服务器输出内容编码方式为UTF-8
   		response.setContentType("text/html;charset=utf-8");
   		String LastAccessTime = null;   		
   		//获取所有的cookie,并将这些cookie存放在数组中
   		Cookie[] cookies = request.getCookies();   		
   		//遍历cookie数组
   		for(int i=0;cookies!=null && i<cookies.length;i++) {
   			//如果cookie的名称为lastAccess,则获取该cookie的值
   			if("lastAccess".equals(cookies[i].getName())) {
   				LastAccessTime = cookies[i].getValue();
   				break;
   			}
   		}
   		if(LastAccessTime==null) {
   			response.getWriter().print("您是首次访问本站!!!!");
   		}else {
   			response.getWriter().print("您上次的访问时间是"+LastAccessTime);
   		}		
   		//创建cookie,将当前时间作为cookie的值发送给客户端
   		String currentTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
   		Cookie cookie = new Cookie("lastAccess", currentTime);   		
   		//发送cookie
   		response.addCookie(cookie);
	} 
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	} 
}

★★★

7、使用数据库访问通用类Dbutils,实现数据的伪删除。

     (1)什么是伪删除?

          在数据库中,通过delete 语句删除的记录,无法“一键找回”。为了让网站用户能够快速“找回”误删除的数据,则需要实现数据的伪删除。

        伪删除指的是,数据库中不是真正删除数据,而是通过标记将数据标记为已删除。这在需要保留数据历史记录的情况下非常有用。伪删除的实现思路:

        在表中增加字段: is_deleted (boolean型),并设置is_deleted的默认值为0(逻辑假)

        一旦删除记录,则设置该记录的is_deleted的值为1(逻辑真)

           update student set is_deleted=1 where sno='99001' and is_deleted=0 # 删除99001的学生记录

        选择记录的时候,加上限制条件is_deleted =0

              select * from student where is_deleted = 0  #浏览student表中的全部记录

        (2)Mysql数据库代码(供同学自行操作时使用,读懂即可)

create table student

(sno char(5) primary key,

sname varchar(50),

sage int,

is_deleted boolean default 0);

insert into student(sno,sname,sage) 
values('99001','lisa',20),('99002','mary',21);

(3)Servlet的核心代码

Dbutils dbutils = new Dbutils();
String sql = "update student set is_deleted=1 where sno=? and is_deleted=0";
String sno = req.getParameter("sno"); 
Object [] params = {sno};//将前端输入的学号作为sql参数
int i =dbutils.executeUpdate(sql,params);
resp.setContentType("text/html;charset=utf-8");
if (1==i) {
    resp.getWriter().println("成功删除学号为:"+sno+" 学生的记录");
}else {
    resp.getWriter().println("该生不存在,删除失败");
}

5、资料自提(若过期,请留言)

链接:https://pan.baidu.com/s/1Fpi28ZTNnZD1LRNXvem--Q?pwd=ugn2 
提取码:ugn2 

猜你喜欢

转载自blog.csdn.net/qq_52495761/article/details/135424420