JavaWeb 期末考--复盘
Javaweb 期末复习题目
1 | 单选 |
2 | 多选 |
3 | 问答与分析 |
4 | 程序填空 |
5 | 程序设计(该部分无) |
需要word版资料详见文章末尾,免费自提
0、学期知识点回顾
一、注释和注解
1、Java的三种注释:单行、多行和文档注释。
2、常用的元注解:
(1)当 @Retention 应用到一个注解上的时候,它解释说明了这个注解的存活时间。取值如下:
- RetentionPolicy.SOURCE 注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视。
- RetentionPolicy.CLASS 注解只被保留到编译进行的时候,它并不会被加载到 JVM 中。
- 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. 过滤HTML、Servlet等web资源
????????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.关于session和cookie说法正确的是(? ?)
????????????????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?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!