目 录 1.简历模板 1 1.1 软件工程师简历 1 1.2 网页设计师简历 4 1.3 软件测试工程师简历 7 2.面试前准备 11 2.1 面试前准备了解企业 11 2.2 面试前准备确定路线 11 2.3 面试前准备:用品、着装 11 3.面试中注意事项 13 3.1 自我介绍 13 3.2 对加班的看法 13 3.3 介绍一下你做过的项目 13 3.4 问题不会回答时 14 4.常规人力面试题 14 5.常规技术面试题(数据库) 24 6.常规技术面试题(.NET) 34 6.1 .NET基础部分 34 6.2 .NET WinForm部分 55 6.3 .NET Web开发部分 56 6.4 数据访问部分 66 6.5 集群与分布式 68 6.6 其他部分 71 7.常规技术面试题(Java) 76 7.1 Java基础部分 76 7.2 Java web部分 97 7.3 数据持久化部分 103 7.4 流行框架与技术 117 8.常规技术面试题(Web前端) 127 8.1 HTML、CSS基础 127 8.2 JavaScript基础 136 8.3 Ajaxl\jquery 基础 138 8.4 前端开发晋级 141 8.5 CSS扩展 148 8.6 HTML扩展 151 8.7 JavaScript扩展 155 8.8 编程题 168 9.常用技术面试题(系统与软件实施) 186 9.1 计算机基础 186 9.2 Linux 操作系统 191 9.3 网络系统集成与信息安全 206 10.常用技术面试题(软件测试) 215 10.1 常规及职业选择问题 215 10.2 其他概括性问题 252 11 常用技术面试题(云计算与大据数) 254 1.简历模板 1.1 软件工程师简历 个人资料 姓 名 性 别 男 年 龄 21 籍 贯 湖北武汉 现 居 地 上海 政治面貌 党员 联系电话 1234567890 E - MAIL 12345@163.com 求职意向 目标职能 J2EE软件工程师 工作性质 全职 薪资待遇 面议 到岗时间 随时 教育背景 毕业院校 职业技术学院 专业 计算机应用技术 工作经验 工作时间 2016/07-----2018/07 公司名称 信息科技有限公司 工作职责 java软件工程师 专业技能 Java技术 熟练掌握java面向对象编程的思想。 熟练使用Hibernate、Struts、及Spring框架进行MVC模式应用的开发。 掌握JSP、ervlet、JDBC、Java Bean J2EE核心技术。 熟练运用MyEclipse开发工具,掌握Tomcat 6.0等Web容器的配置以及部署。 数据库 熟悉Oracle、Mysql等数据库操作。 能使用视图、事物、存储过程增加数据的安全性,提高数据存取的效率。 熟悉数据库设计规范,有一定的数据库设计经验。 其他 1. 熟悉HTML、DIV+CSS、JavaScript、XML等Web开发技术。 2. 具有一定的软件设计及文档编写能力,代码编写规范,具有较强的学习和沟通能力。 项目经验 武汉运捷酒店管理系统 开发周期 2017年3月—2017年6月 软件环境 Windows XP Oracle 11g JDK1.6 开发工具 MyEclipse,Dreamweaver 开发人数 6人 项目描述 武汉运捷酒店是一家集住宿、点餐、娱乐于一体的时尚精品商务酒店,为更好的对酒店进行管理,同时能够大大节省酒店的人力资源,特委托本公司为其量身打造一款软件。项目主要包括: 房间预订:信息录入、资料调出、取消预订 宾客入住:入住登记、房态图 业务管理:加床退床、宾客转房、用户留言 客房收费:退房结算、住客赔偿 员工管理:员工信息、添加功能 统计报表:收银数据、客房数据、历史数据 系统管理:用户管理、更改密码、系统设置 运用技术 该项目基于J2EE平台,B/S模式开发。采用Struts, Hibernate, Spring, Ajax, xml等技术,采用分层模式开发,降低了程序间的耦合性。 系统采用MVC设计模式,并把spring的AOP思想合理的使用在日志处理和 系统异常处理,使用Dom4j进行xml解析,使用Log4j实现日志管理。 表示层使用jsp+javascript实现页面特效,DIV+CSS样式表使页面布局更加规范。 Web层使用Struts 框架,结合EL表达式,使用AJAX技术实现无刷新提交。 控制层扩展Struts框架的Action设计理念,同时使用Spring整合来管理所有的Action。 DAO层使用抽象工厂模式和外观模式,同时使用Spring 提供的Hibernate 模板和 Hibernate API 访问持久层,这样可以进一步解决,在系统查询模块处大量使用正规表达式进行查询操作。 持久层使用轻量级框架技术Hibernate来实现ORM处理,同时使用Spring容器来管理持久层,通过Spring提供的HibernateTemplate和Hiberante API可以很好的解决代码的重复冗余问题。 责任描述 负责宾客入住部分的代码编写 武汉花店联盟销售网 开发周期 2016年9月—2016年11月 软件环境 Windows XP Mysql JDK1.6 开发工具 MyEclipse,Dreamweaver,Tomcate 6.0 开发人数 4人 项目描述 武汉市花店联盟电子商务有限公司以经营鲜花礼品电子商务网站为主,承诺本城2小时送货,全国24小时到货,为增加业务量,特委托我公司对其旗下鲜花礼品网重新开发.项目具体如下: 一.店面管理 1.前台管理:网站主页商品显示、用户注册/登陆/找回密码、查询/修改个人信息、商品搜索、订单管理、买家留言 2.商品浏览:对各种不同种类的商品信息的分类浏览 3.商品检索:对网店内所售商品的查询;可通过商品名、商品类型、花语等进行查询 4.购物车的实现:增加、修改、删除购物车中的数据以及提交购物车的数据生成订单号 二.后台管理 1.客户信息管理:通过管理员身份可以对系统的所有用户进行修改、删除、查看等操作,同时可以根据不同的信息查看用户的详细信息 2.鲜花信息管理:通过管理员的身份可以对网店的所有鲜花进行增删改查的操作 3.订单信息管理:通过管理员的身份可以对订单的信息进行处理,如修改状态等 运用技术 该项目基于J2EE平台,B/S模式开发。采用Struts, Hibernate, Spring, Ajax, xml等技术,采用分层模式开发,降低了程序间的耦合性 表示层使用jsp+javascript实现页面特效,DIV+CSS样式表使页面布局更加规范。 控制层扩展Struts框架的Action设计理念,同时使用Spring整合来管理所有的Action 数据层使用Spring 提供的Hibernate 模板和 Hibernate API 访问持久层。 使用正则表达式验证用户、校验业务数据。 责任描述 负责前台管理、商品检索部分的代码编写 麦德利航空公司武汉锻件厂工资结算与考勤系统 开发周期 2017年1月—2017年4月 软件环境 Windows XP Tomcat6.0 JDK1.6 开发工具 Visual Studio 2005、SQLServer 2008 2.使用JS实现了弹出对话框、滚动字幕、按钮渐变、自动换背景等页面特效。 使用EXT制作进度条,下拉菜单、树形结构、数据全选、批量删除、文件上传功 能。 使用了PS\FLASH提升了页面显示效果。 使用T-SQL语句进行数据查询、通过视图、事务、多表联合查询等方式实现数据的操作。 1.2 网页设计师简历 简????历 个人信息 姓????名: 性????别: 男 出生日期: 1997年10月1日 居?住?地: 上海-徐汇区 工作年限: 一年以上 电子邮件: 1234567@163.com 手????机: 1234567890 自我评价 本人具有良好的编程技巧和编码风格,熟悉网站制作;工作认真负责,积极主动,能吃苦耐劳,抗压力能 力极强,能够适应加班和出差;有较强的组织能力和团队协作精神,具有较强的适应能力;纪律性强, 工作积极配合;有较强的学习能力和接受新事物的能力;具有一定的审美观。 求职意向 到岗时间: 随时 工作性质: 全职 希望行业: 计计 目标地点: 上海 期望薪水: 面议/月 目标职能: 网页设计/制作/美工 工作经验 2016/11--2017/7:武汉市网络有限公司(少于50人) 所属行业: 互联网/电子商务 开发部????前台WEB工程师 为了提升对所学专业的技能,学校特安我们排进入武汉市新领域网络公司进行实习。加强我们的专业技能,培养我们的工作经验。 项目经验 2017/3 -- 2017/6 :长沙市古玩竞价拍卖系统 软件环境: WindowsXP + Dreamweaver 8+ photoshop + MyEclipse8.5 硬件环境: 电脑 开发工具: Dreamweaver 8 + MyEclipse8.5 项目描述: 竞价拍卖系统是一个C2C模式下的电子商务系统,为买方和卖方提供了网上拍卖市场,企业可以以拍卖的方式出售自己的产品。 详细功能如下: 前台: 1)首页:用户通过首页可以执行发布商品、对商品出价、登录、注册、浏览个人历史竞 拍等操作。 2)用户登录:在发布新商品或对商品竞价前,必须先登录。如果用户忘记密码,可以点 击忘记密码超链接,系统将弹出取回密码对话框。用户输入会员名和邮箱地址,密码 即会自动发送到指定邮箱中。 3)用户注册:只有会员注册成功后,才能发布新商品并对商品出价。 4)发布新商品:用户在首页上单击卖东西按钮,系统将弹出选择发布方式的对话框。 5)商品出价:商品出价是指买方对卖方参与竞拍的商品出价,以促使该商品成交。 6)我的竞拍:用户可以查询自己卖出、买进、竞拍、结束竞拍商品的信息。 后台: 1)管理用户:可以对用户进行管理,如锁定、解锁和删除等。 2)管理短消息:用户可以管理系统所有短消息。 3)商品类别管理:用户可以管理商品类别,如修改分类、删除分类、添加分类和分类 级别设定等。 项目技术描述: 使用div+css进行网页布局; 使用JavaScript制作动态效果; 使用正则表达式进行表单验证; 使用jsp+servlet+javabean搭建三层架构模式; 使用SQL Server数据库操作数据 责任描述: 本人主要负责首页、用户登录、用户注册页面的设计与实现,以及特效的设计与实现。 2016/11 -- 2017/2 :新领域网络公司游戏点卡销售充值系统 软件环境: WindowsXP + Dreamweaver 8+ photoshop + MyEclipse8.5 硬件环境: 电脑 开发工具: Dreamweaver 8 + MyEclipse8.5 项目描述: 游戏点卡销售系统是一个C2C模式下的电子商务系统,为买方和卖方提供了网上购买 点卡平台,玩家可以以拍卖的方式出售自己的奖品。 详细功能如下: 1).游戏点卡销售网站首页:网站logo要求定位在页面其他元素之上,根据浏览器窗口 大小自适应自身位置,页面中间实现广告图片轮换效果。 2).游戏点卡分类查询页面 :卡片介绍DIV大小根据内容自适应,设定最小高度 。 3).用户登录页面:用户名和密码用Javacript验证是否为空,实现提交按钮的动态效果。 4).购物车页面:计算购物车中商品的总金额。 5).个人信息管理页面:实现点击右侧链接时在右侧框架中显示链接内容。 6).我们钱包页面:显示账户余额以及相关提示信息。 7).用户购物记录页面:显示订单信息列表,每次只显示一个订单的详细信息。 8).新用户注册页面:验证表单数据的合法性,实现即时错误提示特效;用户输入数据 时,出 输入提示。 9).修改个人资料页面:输入元素只定义下边框样式,实现提交按钮动态效果。 10).后台管理页面:潜入框架用户显示链接页面的内容,右侧导航菜单高度自适应,背 景y轴 方向平铺。实现点击左侧链接时在右侧框架中显示链接内容。 11).账户充值页面:显示账户信息列表,点击“充值”链接时弹出一个窗口供管理员 输入数据。实现提交按钮的动态效果。 项目技术描述: 使用div+css进行网页布局; 使用JavaScript制作动态效果; 使用正则表达式进行表单验证; 使用SQL Server数据库操作数据 责任描述: 负责前端首页、点卡查询页面、注册页面、购物记录页面的设计与实现,以及特效的 设计与实现。 教育经历 2014/9 -- 2016/6 职业技术学院 计算机应用技术 大专 个人技能 1.熟练掌握了DIV+CSS布局的HTML代码编写,兼容主流浏览器,对W3C网页标准有较深理解。 2.熟练掌握了JavaScript特效以及表单验证的制作。 3.熟练使用photoshop、dreamweaver等设计软件。 4.熟悉在MVC设计模式进行JSP应用程序页面的开发。 5.熟悉jquery框架和SSH框架,ajax提高用户体验。 6.对Struts、Hibernate、Spring框架有了一定了解。 7.对SQL Server、MySQL、Oracle数据库的设计和操作有了一定了解。 1.3 软件测试工程师简历 姓 XXXXX 性 别: 男 年 龄: 22:: 毕业院校: XXXX 专 业: 计算机信息管理 在工作能力方面。学生工作在大学生活中是一项重要内容,在能力锻炼方面,我积极参加学生工作和社会实践活动,并取得了一定的成绩。我曾担任班长,在工作过程中我认真负责,积极工作,极大地锻炼了我的工作能力和交际能力,积累了许多宝贵的实践经验。获得“学生工作积极分子”、“优秀学生干部”称号 工作性质: 目标地点: : 期望薪水: 目标职: 熟悉软件测试基本理论、熟悉测试流程。 熟练掌握软件测试用例的设计方法,例如:等价划分、边界值、错误推断、因果法等 熟练使用测试用例管理工具Testlink。 熟悉Bugfree缺陷管理工具。 熟悉自动化测试工具selenium、QTP,以及LoadRunner性能测试工具。 熟悉Visio、Project、office等项目管理软件,具备一定的文档编写能力。 熟悉操作SQL Server2008数据库,以及SQL语句。 了解Java基础,有一定的项目开发经验(这句话最好加上)。 锐气实业(公司主页管理平台) 测试工具:TestLink,BugFree 软件环境:windows7、SQLSERVER2008、IIS7.0 测试周期:2014-05-12——2014-06-10 项目描述: 随着互联网技术的发展,利用强大的互联网技术所实施的应用也越来越多。 主要功能: 以上的三类内容自己模板的时候不要要有自己的风格,会给面试官留下较好的初印象 除了企业里的工作经验,其在学校里的主要经历、社会经历加到的。 2.面试前准备 2.1 面试前准备了解企业 面试前首先通过询问、网上查找等途径了解企业信息,包括:公司背景、主要产品、组织构架、主要业务、主要领导人、企业文化和信条等;接着要详细了解职位要求,特别是技术要求;最后要确认面试流程及面试官。 2.2 面试前准备确定路线 1.输入:登陆http://map.baidu.com/,点击公交 2. 输入起点和终点,可适当参考下拉菜单。 3. 得出相关路线指引后,点击发送到手机,收取短信。 4. 确定路线之后预算乘车时间,做好时间安排,保证可以准时到达,最好能够提前20分钟到达。 2.3 面试前准备:用品、着装 面试前整理用品,保证资料证件齐全,包括:身份证(及身份证复印件)、1寸免冠照片(4张以上)、简历、笔记本(或便签纸)、黑色水性笔、文凭(及文凭复印件,学历及技能证书,视具体情况而定) 共6件物品。 面试前整理好着装,正装、整洁大方,具体可以参考以下标准: 面试着装 (男性) 1.短发,清洁、整齐,不要太新潮; 2.精神饱满,面带微笑; 3.每天刮胡须,饭后洁牙; 4.白色或单色衬衫,领口、袖口无污迹; 5.领带紧贴领口,系得美观大方(颜色、长短、领带夹) 6.西装平整,有裤线; 7.西装口袋不放物品(笔); 8.短指甲,保持清洁; 9.皮鞋光亮,深色袜子; 10.全身三种颜色以内; 面试着装(女性): 1. 发型文雅、庄重,梳理整齐,长发要用发夹夹好,不扎马尾巴; 2. 化淡妆,面带微笑; 3. 着正装套装,大方、得体; 4. 指甲不宜过长,并保持清洁。涂指甲油时须自然色; 5. 裙子长度适宜; 6. 肤色丝袜,无破洞(备用袜); 7. 写字光亮、清洁; 8. 全身三种颜色以内。 备注:以上着装根据不同公司进行不同服装定位!凡事预则立,不预则废! 3.面试中注意事项 3.1 自我介绍 介绍内容要与个人简历一致 表达方式上尽量口语化 要切中要害,不谈无关、无用的内容,清楚简单地说出自己的背景和所申请的工作之间的联系是什么 [参考回答1]我叫×××,来自湖南长沙6年开始学习计算机应用技术专业。我为这样的职位已经准备两年了。这两年的学习过程中曾在公司有工作经验,在项目组做过3个重要项目。在做项目的过程中,我发现我自己特别喜欢开发工作,使我自己很满足。我相信在这里工作我的能力会得到发挥,我也相信可以为贵公司贡献自己的力量。 [参考回答2]我叫×××,来自湖北武汉。今天来应聘贵公司的软件工程师这一职位,该职位需要的技术正是我所具备的。我个人比较喜欢在软件开发方向发展(懂得的技术特长),我也曾参加过公司的真实项目开发,做起来比较顺手。申请贵公司主要考虑到公司从事的业务方向和我以前工作过的公司比较相似,给我一种很熟悉的感觉,我应该能很好的融入这样的氛围。 注:以上回答均根据简历中IT技能一栏于(懂得的技术特长)处增加自己技术特长的阐述 3.2 对加班的看法 IT企业中,技术人员的工作很多时候是跟着项目走的,因此阶段性的加班是非常正常 的事,因此企业要考察求职者是否能够承受加班。 说明自己工作中会是高效的,不会把应在工作时间内完成的任务拖到休息时间。 如果是工作需要,特别是项目进度的要求,是非常乐意加班的。 最好还能说明自己可以加班的条件,比如目前尚无家室或家庭比较支持,可以抽出较 多时间来工作。 [参考回答]从我个人的角度讲,我是很愿意加班的,第一说明我们公司的业务需求大,发展前景好,才会加班。而且我现在单身,能够在加班的时间不断提升自己技能还能和同事增加相处的时间培养感情,这对于一个年轻人来说,是更宝贵的财富。所以,我愿意加班。 3.3 介绍一下你做过的项目 列举做过的项目数量,以2-3个为宜,其中详细介绍1-2个,然后举例说明。 3.4 问题不会回答时 缓兵之计 您的意思是……?(进一步确认) 不知道您看出来没有,我太重视这次面试了,所以有些紧张,您能给我一分钟时间让我重新考虑一下这个问题好吗? 转移话题 (坦白地讲,我对这个问题不太了解。但我对××问题倒是有一些研究,我可以讲讲这方面的内容吗?或者说,我对这个技术不太了解,但是我在做项目的过程中,经常运用类似的技术,我可以讲讲这方面的知识吗? 给出解决问题的方法的所涉及的知识点(虽然不知道怎么解决,你会按照什么思路解决) (放慢语速 放慢语速的同时,思考对方提出的问题,进一步思考。 4.常规人力面试题 请你自我介绍一下 思路:你好,我叫,非常高兴能有机会来贵公司面试。大三时在软件公司实习了一年,期间参与开发了3个项目,包括管理系统项目和网站开发的项目。在技术方面我主要熟悉JAVA、JSP、SSH,数据库主要熟悉SQL和oracle,可以完成前台页面和后台业务逻辑功能,今天来贵公司面试,也希望能有一个好的结果。 谈谈你做的项目(部分示范) OA项目 OA项目主要是针企业的自动化办公,提高办公效率,减少人事理成本的项目类型。本项 目主要分为六大块:人事管理,日程管理,文档管理,消息传递,系统管理,考勤管理 人事管理:主要实现对机构部门员工增删改查,打印员工信息等操作. 日程管理:实现了公司部门及个人日程的管理.运用一个简单的日历显示日程,让人一目了然,有阳历转换阴历, 适合大众使用。 文档管理:实现了对公司文档增删改查,及上传下载文件等操作. 消息传递:实现了公司内部人员相互通信,及即使通报工作会议等操作.有即时消息通知。 系统管理:该功能主要用于管理者本身,可以对员工身份权限管理,日志等,进行更好的管理。 考勤管理:主要用于考察员工出勤情况,并统计员工出勤率。 酒店管理系统 武汉商务酒店是一家集住宿、点餐、娱乐于一体的商务酒店,为更好的对酒店进行管理,同时能够大节省酒店的人力资源,特委托本公司为其量身打造一款软件。项目主要包括: 一、房间预订:信息录入、资料调出、取消预订 二、宾客入住:入住登记、房态图 三、业务管理:加床退床、宾客转房、用户留言 四、客房收费:退房结算、住客赔偿 五、员工管理:员工信息、添加功能 六、统计报表:收银数据、客房数据、历史数据 七、系统管理:用户管理、更改密码、系统设置武汉市电子商务有限公司以经营鲜花礼品电子商务网站为主,承诺本城2小送货,全国24小时到货,为增加业务量,特委托我公司对其旗下鲜花礼品网重新开发。项目具体如下: 一.店面管理 1.前台管理:网站主页商品显示、用户注册/登陆/找回密码、查询/修改个人信息、商品搜索、订单管理、买家留言 2.商品浏览:对各种不同种类的商品信息的分类浏览 3.商品检索:对网店内所售商品的查询;可通过商品名、商品类型、花语等进行查询 4.购物车的实现:增加、修改、删除购物车中的数据以及提交购物车的数据生成订单号 二.后台管理 1.客户信息管理:通过管理员身份可以对系统的所有用户进行修改、删除、查看等操作,同时可以根据不同的信息查看用户的详细信息 2.鲜花信息管理:通过管理员的身份可以对网店的所有鲜花进行增删改查的操作 3.订单信息管理:通过管理员的身份可以对订单的信息进行处理,如修改状态等 篮球、羽毛球、乒乓球、徒步登山、攀爬登山、游泳、钓鱼、摄影写生等 你最崇拜谁? 思路:1、最崇拜的人能在一定程度上反映应聘者的性格、观念、心态,这是面试官问该问题的主要原因。2、不宜说自己谁都不崇拜。3、不宜说崇拜自己。4、不宜说崇拜一个虚幻的、或是不知名的人。5、不宜说崇拜一个明显具有负面形象的人。6、所崇拜的人最好与自己所应聘的工作能搭上关系。7、最好说出自己所崇拜的人的那些品质、哪些思想鼓舞着自己。 李彦宏、李想,我很崇拜他们的大胆创新精神,同时很佩服他们的博学和不断挑战自我的精神。 你的座右铭是什么? 思路:1、座右铭能在一定程度上反映应聘者的性格、观念、心态,这是面试官问这个问题的主要原因。2、不宜说容易引起不好联想的座右铭。3、不宜说太抽象的座右铭。4、不宜说太长的座右铭。5、座右铭最好能反映出自己的某种优秀品质。 1、只要地球没有停止转动,我就不会停止奋斗。2、知识是掌控未来的权利。3、在哪摔了,就在那哭完了再爬起来。4、自己选择的路,跪着也要走完。 谈谈你的缺点 思路:1、不亦说自己没有缺点。2、不宜把那些明显的优点说成缺点。3、不宜说出严重影响所应聘工作的缺点。4、不宜说出令人不放心、不舒服的缺点。5、说出一些对于所应聘工作无关紧要的缺点,甚至是一些表面上看是缺点,从工作的角度看却是优点的缺点. 1、我不太善于过多的交际,尤其是和陌生人交往有一定的难度。这虽然是缺点,但是说明你交友慎重;?2、我办事比较死板,有时容易和人较真。这虽然是缺点,但是说明你比较遵守单位既定的工作规范,有一定的原则性;?3、我什么知识或专业都想学,什么也没学精。这虽然是缺点,但是说明你比较爱学习,知识面比较广;?4、我对社会上新兴的生活方式或流行的东西接受比较慢。这虽然是缺点,但是说明你比较传统,不盲目跟随潮流;?5、我对我认为不对的人或事,容易提出不同意见,导致经常得罪人。这虽然是缺点,但是说明你比较有主见,有一定的原则性;?6、我办事比较急,准确性有时不够。这虽然是缺点,但是说明你完成工作速度较快;?7、对自己从事工作存在的困难,自己琢磨的多,向同事或领导请教的少。这虽然是缺点,但是说明你独立完成工作任务的能力较强 谈一谈你的一次失败的经历 思路:1、不宜说自己没有失败的经历。2、不宜把那些明显的成功说成失败。3、不宜说出严重影响所应聘工作的失败经历。4、所谈经历的结果应该是失败的。5、宜说明失败之前自己曾信心百倍,尽心尽力。6、说明仅仅是由于外在原因导致失败。7、失败后自己很快振作起来,以更加饱满的热情面对以后的工作。 人只要不放弃,信心,就可能战胜挫折取得成功。面对,我们要有毅力。 1、我觉得学校里我最大的收获是结交了很多非常好的朋友,建立了非常好的人际关系。2、一次兼职获得的成就感。3、第一次做出的项目模块等 你怎样影响其他人接受你的看法? 思路:1、判断一个人的人际沟通能力。 参考回对于好的想法,甚至是伟大的想法,人们有时并不接受。我现在认识到这样一个事实,那就是你表达想法的方式同想法本身一样重要。当我试图影响别人时,我一般会假设自己处在他们的位置上,让自己从他们的角度来看待问题。然后我就能够以一种更可能成功的方式向他们陈述我的想法。 你的好友怎样评价你? 思路:1、通过过这个问题可以了解求职者的个性。2、有关的故事听起来也必须真实,如果不真实就不要使用因为这不会奏效。 参考回答1:我的朋友对我很重要。在与朋友的交往中,最重要的是,彼此之间有相互依赖的感觉。我们都很忙,并不经常见面,但在我可以称之为亲密朋友的几个人中,我们都知道,大家可以相互依赖。 参考回答2:我的朋友都说我是一个可以信赖的人,因为我一旦答应别人的事情,我一定会做到;如果我做不到,就不会轻易许诺。 你为什么选择我们公司? 思路:1、面试官试图从中了解你求职的动机、愿望以及对此项工作的态度。2、建议从行业、企业和岗位三个角度来回答。 我十分看好贵公司所在的行业,我认为贵公司十分重视人才,而且这项工作很适合我,相信自己一定能做好。 你在找工作时最看重的是什么?为什么? 思路: 通过这个开放性的问题,面试人可以了解你的关注重点,通过这个关注点又可以反映出你的理性思考能力。1、一定要表明自己对未来工作的看法,说明哪些方面能给自己带来最大程度的满足,这是回答这个问题的关键,当然回答问题的方法也同样重要。2、回答问题尽量简洁,但要实现三个目的:突出了求职者的技能;表明了求职者明白个人与企业的关系;同时也说明求职者理解变化与发展的重要性。 参考回我希望找到的工作能发挥我的长处,比如(说出具体技能)我认为还有一件事也很重要,那就是我在企业中的作用要与企业目标联系在一起。如果工作中偶尔有些挑战,让我超越自己目前的技能水平,那就再好不过了。 在高薪、表彰和晋升之间,你认为哪种形式最有价值? 思路:1、这个问题是个陷阱。如果你顺着提问者的思路回答,那你就必败无疑。如果你选择金钱优于晋升,那就会被看成世俗和短见;相反,如果你认为金钱不重要,那你就会因为对金钱表现出的冷漠而被看做不真诚。2、回答要诚实,而且也不世俗。它反映了求职者的抱负,也反映了求职者对未来成功的合理推测。 参考回对我来说,这些东西都是紧密联系、不可分离的。尽管我对金钱并不着迷,但我认为,随着成功、晋升以及表彰的出现,它们一定也会给我带来更多的金钱回报。 对这项工作,你有哪些可预见的困难? 思路:1、不宜直接说出具体的困难,否则可能令对方怀疑应聘者不行。2、可以尝试迂回战术,说出应聘者对困难所持有的态度,工作中出现一些困难是正常的,也是难免的,但是只要有坚韧不拔的毅力、良好的合作精神以及事前周密而充分的准备,任何困难都是可以克服的。 如果我录用你,你将怎样开展工作? 思路:1、如果应聘者对于应聘的职位缺乏足够的了解,最好不要直接说出自己开展工作的具体办法。2、可以采用迂回战术来回答,如首先听取领导的指示和要求,然后就有关情况进行了解和熟悉,接下来制定一份近期的工作计划并报领导批准,最后根据计划开展工作。 如果可以在企业内自主选择工作,你想选择什么样的工作? 思路:1、这个问题旨在了解求职者是否了解现代职场的复杂性。它的目的是考查求职者是否清楚,面试人要招聘的是能为企业做出一系列贡献的人。招聘者认为招聘到的人应该具有相应的技能,他(她)的责任应该非常清楚,他(她)的潜力也应该非常大。 参考回首先我希望找到的工作能够发挥我的特长和技能,具体地说(提到一些具体技能)我还希望自己的工作能够得到企业的认可,也就是说,这份工作对实现企业目标却是很重要。如果有一定的发展空间或者有多样化的可能,那份工作就更理想了。 我们为什么要录用你? 思路:1、应聘者最好站在招聘单位的角度来回答。2、招聘单位一般会录用这样的应聘者:基本符合条件、对这份工作感兴趣、有足够的信心。3、如我符合贵公司的招聘条件,凭我目前掌握的技能、高度的责任感和良好的适应能力及学习能力,完全能胜任这份工作。我十分希望能为贵公司服务,如果贵公司给我这个机会,我一定能成为贵公司的栋梁! 你认为自己在什么样的条件下工作最有效? 思路:1、此问题考察的是应聘者对工作条件的要求。2、主考官可以从中获取应聘者的工作方式、影响工作效率的因素等信息,还可以知道应聘者的工作方式、影响工作效率的因素等信息,还可以知道应聘者的不足在哪里。3、如果回不管在什么条件下,我都会努力把工作做到最好,这样并不是十分妥当,至少有喊口号的嫌疑,显得不够成熟。为了对自己负责,可以具体谈谈自己期望的工作条件。 你能为我们做什么?你能给公司带来什么? 思路:1、基本原则上投其所好。2、回答这个问题前应聘者最好能先发制人,了解招聘单位期待这个职位所能发挥的作用。3、应聘者可以根据自己的了解,结合自己在专业领域的优势来回答这个问题。 参考回我可以做一个优秀的员工在组织中发挥能力,给组织带来高效率和更多的收益。 你是应届毕业生,缺乏经验,如何能胜任这项工作? 思路:1、如果招聘单位对应聘者提出这个问题,说明招聘单位并不在乎经验,关键看应聘者怎样回答。2、这个问题真正的回答最好要体现出应聘者的诚恳、机智、果断及敬业。 我也发现,实际工作远比书本知识丰富、复杂。但我有较强的责任心、适应能力和学习能力,而且比较勤奋,所以在兼职中均能圆满完成各项工作,从中获取的经验也令我受益匪浅。请贵公司放心,学校所学及兼职的工作经验也让我一定能胜任这个职位。 与上级意见不一时,你将怎么办? 思路:1、这是一个陷阱问题;2判断应聘者的沟通能力及执行力; 我绝不会和上级在公开场合发生激烈的争执。我和领导可能会存在意见不统一的时候,但是不会发生争执。如果我们的意见不一,我会和领导在一个私下的、只有2个人的场合进行诚挚的沟通,我会把问题事先想清楚,并表达出自己的看法,如果没有说服领导,我会坚持按照领导的指示执行,因为领导考虑问题的层次往往比下属高,所以意见不一时,很有可能是我错了,所以我要坚持执行。 你希望与什么样的上级共事? 思路:1、通过应聘者对上级的希望可以判断出应聘者对自我要求的意识,这既是一个陷阱又是一次机会。2、最好回避对上级具体的希望,多谈对自己的要求。 参考回作为步入社会的新人,我应该多要求自己尽快熟悉环境、适应环境,而不应该对环境提出什么要求,只能发挥我的专长就可以了。 上下级之间应该怎样交往? 思路:1、通过这个问题可以了解求职者在企业等级结构中的沟通方式。2、通过这一问题的回答,求职者可以展示自己在复杂领域工作的技能水平,求职者理解人际关系的复杂性以及多样性,求职者明确地表达了高效沟通技能的重要性,同时也显示了自己在这方面的自信。 我认为,能在企业各个层面上清楚地进行交流,这对企业的生存至关重要。我认为自己已经在这个方面培养了很强的能力。从上下级关系来说,我认为最重要的是应该意识到每个人以及每种关系都是不同的。对我来说最好的方式就是始终不带任何成见地来对待这种关系的发展。 你和同事们怎么相处? 思路:1、通过这个问题以及前面上下级关系和朋友关系的问题,面试人可以对求职者的有效沟通技能得出一个总体印象。2、与同事的有效沟通技能将减少面试人的担心,避免他(她)认为你是又一个不合适的人选。3、回答需表明求职者的心理是稳定的,且具有很高的人际协调能力。4、通过将问题和人格区分开来,求职者表明过去在人际关系方面也很成功。 参考回我一般都能与同事相处的很好。当然有时候也可能会和某人发生冲突。这时,我一般会注意寻找冲突的根源,而不是转移到与对方的攻击上。我发现这种方法非常有效,它可以使我同任何人都维持一种相互尊重的关系。另外,通过过这样做,我往往都能解决问题,甚至会促进与同事的关系。 你在前一家公司离职的原因是什么? 思路:1、最重要的是:应聘者要使招聘单位相信,应聘者在过往单位的离职原因在此家招聘单位不存在。2、避免把离职原因说的太详细、太具体。3、不能掺杂主观的负面感受。4、但也不能躲闪、回避,如个人原因等。5、不能涉及自己负面的人格特征,如不诚实、缺乏责任感等。6、尽量使解释的理由为应聘者个人形象添彩。7、如我离职时因为这家公司倒闭。我在公司工作了三年多,有较深的感情。从去年开始,由于市场形式突变,公司的局面急转直下。到眼下这一步我觉得很遗憾,但还要面对现实,重新寻找能发挥我能力的舞台。同一个面试问题并非只有一个答案,而同一个答案并不是在任何面试场合都有效,关键在于应聘者掌握了规律后,对面试的具体情况进行把握,有意识地揣摩面试官提出问题的心理背景,然后投其所好。 为了实现自己的目标你会怎样努力工作? 思路:1、面试人希望通过这个问题来确认求职者是否是一个努力工作的人。2、回答这个问题的关键在于,你一定要显示出自己履行责任的意愿和能力。它表明求职者有无限的能量,而且对工作也非常投入。它还表明,求职者解决问题是为了能更好地利用他(她)的资源这才是这个问题饿实质所在。 参考回对我来说,如何努力工作,不是问题。我的做事原则是,如果我制订了一个目标或者被分配了一项重要任务,我就会尽我所能地努力工作,实现预期目标。所以对我来说,重要的是怎样出色地完成工作,也就是说,怎样工作才能尽可能简单和顺利地完成任务,这样我就可以把精力转移到其他事情上。 就你申请的这个职位,你认为你还欠缺什么? 思路:1、他们想问求职者的弱点,但精明求职者一般不直接回答。 回答建议:继续重复自己的优势,然后说:对于这个职位和我的能力来说,我相信自己是可以胜任的,只是缺乏经验,这个问题我想我可以进入公司以后以最短的时间来解决,我的学习能力很强,我相信可以很快融入公司的企业文化,进入工作状态。 你期望的工资是多少? 思路:1、一般这样的企业工资水平是很灵活的,一般中小企业有很多仍以个人能力,面试评价作为议薪的标准。但这个问题却不能正面回答。2、依公司规定的回答是不被建议的,这样不但表示出自己对于工作的自信程度不高,在薪资无法符合个人要求时更会造成许多困扰。 参考回以我的能力和我的优势,我完全可以胜任这个职位,我相信我可以做的很好但是贵公司对这个职位的描述不是很具体,我想还可以延后再讨论。 出于工作晋升的考虑你打算继续深造吗? 思路:1、用来衡量你的雄心,也可以判断企业对你的重视程度是否会影响你对自己未来的重视程度。 参考回作为一名刚毕业的学生,我学到了很多知识。如果有合适的机会,我当然会考虑继续深造。但是,我会认真考虑这件事情,我觉得很多人回学校学习是很盲目的。如果我发现自己所做的工作确实有价值,而且也需要获得更多的教育才能在这一领域做的出色,我当然会毫不犹豫地去学习。 你是否认为大学的学习成绩能决定你在企业的成功程度? 思路:1、如果求职者在学校成绩很好,面试人希望通过这个问题让求职者知道,工作上的成功与学习上的成功并不一样。2、如果求职者在学校成绩不佳,面试人希望通过这个问题了解到,求职者是否认为自己解决问题的能力有所欠缺。 参考回(对那些成绩不佳的人)我认为有能力取得好成绩是很重要的。如果一个人在每个科目上成绩都不佳的话,那就会让人非常担心。然而,并非所有人都能在每一个科目上取得优异成绩。对我来说,重要的是在个人学习成绩中要有一些突出的地方,因为这些地方代表着一个人的潜力。 参考回(对于那些成绩较好的人)虽然规划学习生涯不会像管理高难度工作那么复杂,但是我认为两者之间存在着联系。我认为,取得优异的学习成绩的最大意义是它可以反映一个人追求卓越的决心。3、回答都以第三人称的形式进行了有效表达,从而避免使自己看起来过于谦卑或者过于傲慢。 经过这次面试,我们认为你不合适,决定不录用你,你自己认为有哪些原因? 思路:1、该题的出题意图在于考察应试者的应变能力,并非真的对你不满,要沉着应对;不要中了圈套,暴露自己的弱点,回答时可以虚一点;重点要放在弥补弱点上,这可以看出你积极进取的品质;要诚恳地向考官讨教,可以博取他们的好感。 参考回 第一、我认为面试向来是5分靠实力,5分靠运气的。我们不能指望一次面试就能对一个人的才能、品格有充分的了解。毕竟二十分钟时间太短,而要打分的项目很多; 第二、当然最大的原因可能是我的临场发挥不能得到各位的认可,比如我的心里的确感到紧张。吃一堑长一智,所以无论面试的结果如何,我的这段经历将为我提供一个自我审查的机会,发现自己的不足,其中既有临场经验的不足,希望以后能有机会向各位考官讨教; 第三、我会好好总结经验教训,加强学习,弥补不足。另外,希望考官能对我进行全面、客观的考察,我一定会努力,使自己尽量适应岗位的要求。 你认为你所受的教育对你生活的最大意义是什么? 思路:该题的出题意图在于考察应试者真实的教育程度及生活态度。 有意义,这样可以让人懂得一些做人的道理。如何去跟人相处,如何和人沟通。让人懂得很多道理。 1、可以谈一下工作、技术、生活等目标,切勿好高骛远,制定的目标要切实可行。 现在软件规模越来越庞大,开发人数越来越多,形成以团队开发,提出团队精神,请说出你认为团队精神的本质和意义。 思路:该题的出题意图在于考察应试者的团队精神及团队配合能力。 凝聚力、编码的规范化、一个人的力量是有限的等。 介绍一下你的课外活动。你为什么愿意从事那些课外活动?通过那些课外活动,你都学了些什么? 思路:该题的出题意图在于变向的考察应试者在学习中,是否有团队精神及很好的组织能力。 野炊、爬山、趣味运动会等。 你为什么选择软件行业,而不选择其他行业呢?? 思路:该题的出题意图在于考察应试者对于IT行业的关注度及了解度。 我个人对计算机比较感兴趣,但选择这个行业,我身边的家人朋友对我影响也很大。我的两个表哥都是从事这个行业的,做开发岗位三年多了。IT行业是薪水高的行业,掌握了高科技技术,对于以后的人生道路也是一种保障。个人的兴趣爱好加上家人朋友帮我对就业前景的客观分析,我选择了IT行业,并希望通过自己的努力在这个行业越做越好。 5.常规技术面试题(数据库) 触发器的作用? 触发器是一个特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。 什么是存储过程?用什么来调用? 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需创建一次,以后在程序中就可以调用多次。如果某次操作需要执行多次SQL,使用存储过程比单纯SQL语句执行要快。可以用一个“execute 存储过程名 索引的作用?和它的优点缺点是什么?。 索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。 主键和索引的区别? 1.主键是为了标识数据库记录唯一性,不允许记录重复,且键值不能为空,主键也是一个特殊索引;? 2.数据表中只允许有一个主键,但是可以有多个索引;? 3.使用主键数据库会自动创建主索引,也可以在非主键上创建索引,方便查询效率;? 4.索引可以提高查询速度,它就相当于字典的目录,可以通过它很快查询到想要的结果,而不需要进行全表扫描;? 5.唯一索引则标识该索引值唯一,可以由一个或几个字段组成,一个表可以有多个唯一索引。 什么是内存泄漏? 一般我们所说的内存泄漏指的是堆内存的泄漏。当应用程序用关键字new等创建对象时,就从堆中为它分配一块内存,使用完后由于某种原因程序未释放或无法释放,造成系统内存的浪费。导致程序运行速度减慢甚至系统崩溃等严重后果 维护数据库的完整性和一致性,你喜欢用触发器还是自写业务逻辑?为什么? 我是这样做的,尽可能使用约束,如check,主键,外键,非空字段等来约束,这样做效率最高,也最方便。其次是使用触发器,这种方法可以保证,无论什么业务系统访问数据库都可以保证数据的完整新和一致性。最后考虑的是自写业务逻辑,但这样做麻烦,编程复杂,效率低下。 什么是事务? 事务就是被绑定在一起作为一个逻辑工作单元的SQL语句组,如果任何一个语句操作失败那么整个操作就被失败,进而回滚到操作前状态,或者是上个节点。为了确保要么执行,要么不执行,就可以使用事务。要将一组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。 什么是锁? 在所有的DBMS中,锁是实现事务的关键,锁可以保证事务的完整性和并发性。与现实生活中锁一样,它可以使某些数据的拥有者,在某段时间内不能使用某些数据或数据结构。当然锁还分级别的。 什么叫视图? 视图是一种虚拟的表,具有和物理表相同的功能。可以对视图进行增,改,查,操作,视图通常是由一个表或者多个表的行或列的子集。它使得我们获取数据更容易,相比多表查询。 视图创建和使用语法? 1.首先判断是否存在 if exists (select from sysobjects where name = ''视图名'') drop view View_EdsProd Go 2. 创建视图 create view View_EdsProd as select from Tab_EdsProd where Mid>1(条件) go 3. 使用视图 select from View_EdsProd 游标是什么? 游标是SQL 的一种数据访问机制。可以将游标简单的看成是查询的结果集的一个指针,可以根据需要在结果集上面来回滚动,浏览需要的数据。 你能向我简要叙述一下SQL Server 中使用的一些数据库对象吗? 表、索引、视图、存储过程、触发器、用户定义函数、数据库关系图、全文索引。 NULL是什么意思? NULL(空)这个值表示UNKNOWN(未知):它不表示“”(空字符串)。不能把任何值与一个 UNKNOWN值进行比较,都会生产一个NULL值。您必须使用IS NULL操作符。 什么是索引,有哪些索引,具体怎么用? 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度。索引包含由表或视图中的一列或多列生成的键。这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行。 索引分为聚集索引和非聚集索引。 在数据库系统中建立索引主要有以下作用: (1)快速取数据; (2)保证数据记录的唯一性; (3)实现表与表之间的参照完整性; (4)在使用ORDER by、group by子句进行数据检索时,利用索引可以减少排序和分组的时间。 SQL Server 里有什么类型的索引? 在SQL Server里,它们有两种形式:聚集索引和非聚集索引。聚集索引在索引的叶级保存数据。每个表格只会有一个聚集索引。非聚集索引在索引的叶级有一个行标识符。每个表格有多个非聚集索引。 什么是主键? 主键是表格里的(一个或多个)字段,只用来定义表格里的行;主键里的值总是唯一的。 什么是外键? 外键是一个用来建立两个表格之间关系的约束。这种关系一般都涉及一个表格里的主键字段与另外一个表格(可能是同一个表格)里的一系列相连的字段。那么这些相连的字段就是外键。 什么是触发器? 触发器是一种专用类型的存储过程,它被捆绑到SQL Server 的表格或者视图上。 SQL Server 有什么不同类型的触发器? 有INSTEAD-OF和AFTER两种触发器。例如,如果有一个用于TableA的INSTEAD-OF-UPDATE触发器,同时对这个表格执行更新语句,那么INSTEAD-OF-UPDATE触发器里的代码会执行,而不是执行更新语句则不会执行操作。AFTER触发器要在DML语句在数据库里使用之后才执行。这些类型的触发器对于监视发生在数据库表格里的数据变化十分好用。 您如何确保一个带有名为Fld1字段的TableB表格里只具有Fld1字段里的那些值,而这些值同时在名为TableA的表格的Fld1字段里? 第一个答案是使用外键限制。外键限制用来维护引用的完整性。它被用来确保表格里的字段只允许有已经在另一表格里的某个字段里定义了的值。通常是另外一个表格的主键。 另外一种答案是触发器。触发器可以被用来保证以另外一种方式实现与限制相同的作用,但是它非常难设置与维护,而且性能一般都很糟糕。 对一个投入使用的在线事务处理表格有过多索引需要有什么样的性能考虑? 对一个表格的索引越多,数据库引擎用来更新、插入或者删除数据所需要的时间就越多,因为在数据操控发生的时候索引也必须要维护。 你可以用什么来确保表格里的字段只接受特定范围里的值? 可以使用Check约束,它在数据库表格里定义,用来限制输入该列的值。 触发器也可以被用来限制数据库表格里的字段能够接受的值,但是这种办法要求触发器在表格里被定义,可能会在某些情况下影响到性能。 概述存储过程及其优缺点。 存储过程是一个预编译的sql语句 ,编译后可多次使用 优势:响应时间上来说有优势,可以给我们带来运行效率提高的好处,且使用存储过程的系统更加稳定 缺点:维护性较差,相对于简单sql,存储过程并没有什么优势,并且在进行调试时比较困难 什么是相关子查询?如何使用这些查询? 相关子查询是一种包含子查询的特殊类型的查询。查询里包含的子查询会请求外部查询的值,从而形成一个类似于循环的状况。 什么是SQL注入式攻击? 所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。比如:攻击者在用户名字和密码输入框中输入"''或''1''=''1"之类的内容。最后得到的SQL命令可能变成:SELECT from Users WHERE login = '''' or ''1''=''1'' AND password = '''' or ''1''=''1''。这时,已经不能真正验证用户身份,所以系统会错误地授权给攻击者。 如何防范SQL注入式攻击? 只要在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内容可以按多种方式进行。 ⑴ 对于动态构造SQL查询的场合,可以使用下面的技术: 第一:替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。 第二:删除用户输入内容中的所有连字符。 第三:对于用来执行查询的数据库帐户,限制其权限。 ⑵ 用存储过程来执行所有的查询。 ⑶ 限制表单或查询字符串输入的长度。 ⑷ 检查用户输入的合法性,确信输入的内容只包含合法的数据。 ⑸ 将用户登录名称、密码等数据加密保存。 ⑹ 检查提取数据的查询所返回的记录数量。 默认的系统数据库有哪些? 1)master数据库(主);2)tempdb数据库(临时);3)model 数据库(模板);4)msdb数据库(计划任务); 默认创建一个数据库,会生成哪些文件? 1)主文件(.mdf),2)日志文件(.ldf),无次要文件(.ndf)。 创建数据库时,能不能把数据文件和日志文件分开? 可以分开,起到优化作用。把数据文件放到高速读写区,把日志文件放到低速读写区。 什么是索引覆盖(Index Covering)查询? 索引覆盖(Index Covering)查询是指数据可以只通过索引获取,而不用接触表。 存储过程和触发器的区别? ?触发器与存储过程的主要区别在于触发器的运行方式。存储过程必须有用户、应用程序或者触发器来显示的调用并执行,而触发器是当特定时间出现的时候,自动执行或者激活的,与连接用数据库中的用户、或者应用程序无关 存储过程和函数的区别? 存储过程是用户定义的一系列SQL语句的集合,,而函数通常是数据库已定义的方法,具体区别如下:? 1.对于存储过程来说可以返回参数,而函数只能返回值或者表对象.? 2.函数必须有返回值,存储过程可有可无? 3.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一部分来调用. 聚集索引和非聚集索引区别 聚集索引,数据按索引顺序存储,中子结点存储真实的物理数据? 非聚集索引,存储指向真正数据行的指针 索引的优缺点,什么时候使用索引,什么时候不能使用索引? 索引最大的好处是提高查询速度,? 缺点是更新数据时效率低,因为要同时更新索引? 对数据进行频繁查询进建立索引,如果要频繁更改数据不建议使用索引。 数据库的优化 1.创建适当的索引? 2.对sql语句优化? 使用exists或not exists代替in或not in 使用存储过程? ? 用union替换or(适用于索引列)? where代替having,having 检索完所有记录,才进行过滤? 使用select top或set rowcount来限制操作的行 避免嵌套查询? 对多个字段进行等值查询时,联合索引 数据库的主从复制 默认异步复制,容易造成主库数据和从库不一致? 一个数据库为Master,一个数据库为slave,通过Binlog日志来实现 slave两个线程,一个线程去读master binlog日志,写到自己的中继日志? 一个线程解析日志,执行sql? master启动一个线程,给slave传递binlog日志 半同步复制? 只有把master发送的binlog日志写到slave的中继日志,这时主库才返回操作完成的反馈,性能有一定降低 并行复制? slave 多个线程去请求binlog日志 long_query怎么解决 设置参数,开启慢日志功能,得到耗时超过一定时间的sql (1)slow_query_log 这句是开启记录慢查询功能,slow_query_log=0关闭;slow_query_log=1开启(这个1可以不写) (2)long_query_time = 1 这句是记录超过1秒的SQL执行语句 用来存储字符? varchar适用字符长度经常变的? char适用字符长度固定的 数据库连接池的作用 维护一定数量的连接,减少创建连接的时间? 更快的响应时间? 统一的管理 分库分表,主从复制,读写分离 读写分离,读从库,写主库? spring配置两个数据库,通过AOP(面向切面编程),在写或读方法前面进行判断得到动态切换数据源。 数据库三范式 1NF 属性不可分? 2NF 非主键属性,完全依赖于主键属性? 3NF 非主键属性无传递依赖 数据库中join的inner join, outer join, cross join? 以A,B两张表为例?A left join B? 选出A的所有记录,B表中没有的以null 代替? right join 同理 inner join? A,B的所有记录都选出,没有的记录以null代替 cross join (笛卡尔积)? A中的每一条记录和B中的每一条记录生成一条记录? 例如A中有4条,B中有4条,cross join 就有16条记录 有哪些锁,select时怎么加排它锁 乐观锁行级锁 乐观锁 共享锁: 允许并发事务在封闭式并发控制下读取资源。 更新锁:是共享锁和排他锁的结合。 行级锁:单独的一行记录加锁锁住整个表,可以同时读,写不行 死锁怎么解决 找到进程号,kill 进程 产生死锁的原因: 一是系统提供的资源数量有限,不能满足每个进程的使用;二是多道程序运行时,进程推进顺序不合理。 产生死锁的必要条件是: 1、互斥条件; 2、不可剥夺条件(不可抢占); 3、部分分配; 4、循环等待。 根据产生死锁的四个必要条件,只要使其中之一不能成立,死锁就不会出现。为此,可以采取下列三种预防措施: 1、采用资源静态分配策略,破坏"部分分配"条件; 2、允许进程剥夺使用其他进程占有的资源,从而破坏"不可剥夺"条件; 3、采用资源有序分配法,破坏"环路"条件。 解除死锁常常采用下面两种方法:1、资源剥夺法;2、撤消进程法 最左匹配原则 最左匹配原则是针对索引的? 举例来说:两个字段(name,age)建立联合索引,如果where age=12这样的话,是没有利用到索引的,这里我们可以简单的理解为先是对name字段的值排序,然后对age的数据排序,如果直接查age的话,这时就没有利用到索引了,查询条件where name=’xxx’ and age=xx 这时的话,就利用到索引了。因为创建复合索引的规则是首先会对复合索引的最左边的,也就是第一个name字段的数据进行排序,在第一个字段的排序基础上,然后再对后面第二个的字段进行排序。其实就相当于实现了类似 order by name age这样一种排序规则。所以:第一个name字段是绝对有序的,而第二字段就是无序的了。所以通常情况下,直接使用第二个字段进行条件判断是用不到索引的,当然,可能会出现上面的使用index类型的索引。这就是所谓的为什么要强调最左原则的原因。 它的所有数据都存储在数据文件中(.dbf),所以只要文件够大,SQLServer的存储容量是可以扩大的. SQL Server 数据库有三种类型的文件: 主要数据文件 主要数据文件是数据库的起点,指向数据库中文件的其它部分。每个数据库都有一个主要数据文件。主要数据文件的推荐文件扩展名是 .mdf。 次要数据文件 次要数据文件包含除主要数据文件外的所有数据文件。有些数据库可能没有次要数据文件,而有些数据库则有多个次要数据文件。次要数据文件的推荐文件扩展名是 .ndf。 日志文件 日志文件包含恢复数据库所需的所有日志信息。每个数据库必须至少有一个日志文件,但可以不止一个。日志文件的推荐文件扩展名是 .ldf。 sqlserver数据库中常用的聚合函数有哪些? Max(),Avg(),Count(),Min(),Sum()。 中文:最大值,平均值,数据条数,最小值,总和。 数据库主键、外键、约束、索引的作用是什么?有几种连表查询方式? 主键、外键及约束的作用:保证数据的完整性 索引的作用:索引是一个数据结构,用来快速访问数据库表格或者视图里的数据,加快数据库的搜索引擎对数据的检索效率 方式:左连接、右连接、内连接、自连接 增insert into 表名称 values delete from 表名 where update 表名 set A1=B1 where A>100 select from 表名 where 条件 利用select top 和select not in进行分 利用select top 和 select max(列)利用Row_number()给数据行加上索引 利用临时表及Row_number 6 6.1 .NET基础部分 Linq查询,lambda表达式 LINQ(Language Integrated Query,语言集成查询)提供了一种跨数据源和数据格式的统一模型,实现查询。主要包括三个部分:LINQ to Objects、LINQ to XML、LINQ enabled ADO.NET,而在LINQ enabled ADO.NET中又包括LINQ to DataSet、LINQ to SQL 和 LINQ to Entities。 “Lambda 表达式”是一种简化的匿名函数,在C#3.0中引入的,可用于创建委托或表达式目录树。也可以将 Lambda 表达式作为参数或者返回值使用。它的语法形式是: 输入参数 => 表达式或语句块,其中,=> 读作“goes to”,在LINQ查询中大量的使用到。 C#中的垃圾回收机制。 GC就是垃圾回收器,一般来说系统会自动检测不会使用的对象或变量进行内存的释放,不需要手动调用,用Collect()就是强制进行垃圾回收,使内存得到及时的释放,让程序效率更高。 Linq查询的优势。 无需复杂学习过程即可上手。 编写更少代码即可创建完整应用。 更快开发错误更少的应用程序。 无需求助奇怪的编程技巧就可合并数据源。 让新开发者开发效率更高。 任何对象或数据源都可以定制实现Linq适配器,为数据交互带来真正方便。 面向对象的主要思想包括什么? 在面向对象中,一切皆为对象,面向对象的三大特征: 1)封装:用抽象的数据类型将数据和基于数据的操作封装在一起,数据被保护在抽象数据类型内部,程序的其他部分只有通过被授权的操作(成员方法)才能对数据进行操作。 2)继承:继承可以解决代码复用问题,子类可以沿用父类方法和属性的一种方式。 3)多态:继承同一父类的不同子类,对父类方法的不同实现。分为方法的隐藏和重写。 C#中的接口和抽象类有什么异同? 从形态层面上 相同点 不同点 1)抽象类是类的部分实现可以包含已实现的成员 2)抽象类与普通类一样,可以继承类和实现接口,而接口只能继承接口,不能实现接口。 从设计层面上 不同点: 1)抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类局部(行为)进行抽象。 2)抽象类作为很多子类的父类,它是一种模板式设计。而接口是一种行为规范,它是一种辐射式设计。也就是说对于抽象类,如果需要添加新的方法,可以直接在抽象类中添加具体的实现,子类可以不进行变更;而对于接口则不行,如果接口进行了变更,则所有实现这个接口的类都必须进行相应的改动。 3)抽象类一般作为父类使用和实现类往往属于同一类事物而接口和实现类则不然只是一种实现关系例如演员和角色的关系 装箱就是把值类型到引用类型的转换 拆箱就是引用类型到值类型的转换 简述 private、protected、internal 、public 修饰符的访问权限。 private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 internal: 在同一程序集内可以访问。 public : 公共成员,完全公开,没有访问限制。 C#中的委托是什么?事件是不是一种委托? C#中的委托是一种引用类型,表示具有相同方法签名的方法的引用。类似于函数指针,也就是说它们是指向函数的“引用”,更加安全。 事件不是委托,是委托类型的变量。 int[][]myArray3=new int[3] []{new int[3]{5,6,2},new int[5]{6,9,7,8,3},new int[2]{3,2}};myArray3[2][1]的值是 答案:2 启动一个线程主要用什么方法_______ 创建Thread实例并调用Start方法启动线程 foreach遍历访问的对象需要实现 ______ 接口或声明____方法的类型。 能用foreach遍历访问的对象需要实现 IEnumerable 接口或声明GetEnumerator 方法的类型 请叙述const与readonly的区别。 const为静态常量,所谓静态常量就是在编译期间会对变量进行解析,再将常量的值替换成初始化的值。 readonly为动态常量,所谓动态常量就是编译期间会将变量标记只读常量,而不用常量的值代替,这样在声明时可以不初始化,可以延迟到构造函数初始化。 c#中的三元运算符是什么 C#中有一个三元运算符”?:”,语法为:条件表达式?表达式1:表达式2; 该操作首先求出条件表达式的值(bool类型),为true时调用表达式1,为false时调用表达式2。其逻辑为:”如果为真执行第一个,否则执行第二个。” 当整数a赋值给一个object对象时,整数a将会被什么? 装箱。 public static const int A=1;这段代码有错误么?是什么? const成员都是static所以应该去掉static 利用operator声明且仅声明了==,有什么错误么? 重载了“==” 就必须重载 “!=” 委托声明的关键字是什么? delegate 用sealed修饰的类有什么特点? 该类为密封类,不可被继承 在.Net中所有可序列化的类都被标记为什么? 使用Serializable特性标记 显式实现接口:实现类在实现接口中方法时,方法名前必须添加接口名,且不能添加访问修饰符。在调用时,显式实现接口的方法只能通过接口访问,不能通过类访问。 这样做的好处: 1)若一个类实现接口,而接口中的方法只需要在类的内部实现,则可以使用显式实现接口的方式,这样类的实例这无法使用该接口成员。 2)显式接口成员可以避免了成员之间因为同名而发生混淆。如果一个类希望对名称和返回类型相同的接口成员采用不同的实现方式,这就必须要使用到显式实现接口方式。 请解释.NET采用委托实现的事件模型与JAVA中采用接口实现的事件模型有什么区别, .net中的委托概念java中没有相同的,只有事件模式是一样的,java中有一个叫Obserable接口,可以添加IEventListener,使用内部类可以构建类似于委托的概念 override与重载的区别 Override:方法重写,子类对父类中的方法进行重新实现,要求,父类与子类之间、方法名和参数类型,数量,顺序一致。在C#允许子类对父类的抽象方法或虚方法进行重写,以适应新的需求。 重载:在同一类中,存在多个具有相同方法名,而不同参数列表的方法,在调用时根据实际参数确定执行哪个重载方法。 请描述一下ref和out在方法参数传递上的异同点?Ref和outref和out 相同点 1)在实参和形参上都必须添加关键字 2)在方法中对参数的设置和改变将会被保留。 不同点 1)ref修饰的参数在方法调用前必须初始化,而out修饰的参数在方法调用时候可以不初始化。 2)在方法中out修饰的参数必须进行赋值,而ref修饰的参数不需要。 3)out修饰的参数主要用于返回值ref修饰的参数主要用于修改.NET中所有类型的基类 .Net中所有类型的基类是System.Object 请列出C#中几种循环的方法,并指出他们的不同 for:一般用于循环次数已知的循环 while: 一般用于循环次数未知的循环,工作原理:先判断后执行 do...while:一般用于循环次数未知的循环,工作原理:先执行一次后判断 foreach:当一个序列实现IEnumerable接口或者GetEnumerator()方法时,可以用该循环方法,一般用于遍历集合或数组更加安全 在.NET中,配件的意思是? 配件就是Assembly(程序集),程序集由程序集清单,类型元数据,MSIL代码和资源组成。 .NET中读写文件需要用到那些方法?他们的作用? 1)File类: 使用场合:当读写文件大小不大,同时可以一次性进行读写操作的时候使用 使用方式:不同的方式可以读写文件类型不一样。 ReadAllBytes()? WriteAllByte():可以读写任意类型的文件 ReadAllLines()? ReadAllText():只能读写文本类型文件 2)FileStream类 使用场合:当读写大文件的时候使用,它可以自定义读写的数组大小 使用方式:一个流对象只能做一个事情:如果需要读和写那么就需要创建两个流 读取:将数据读取到数组? 写入:将数组的数据再写入到文件 3)StreamReader/StreamWrite类 使用场合:只能对文本文件进行读写操作 使用方式:它可以按行、按字符以及按块进行读取和写入 在C#中using和new这两个关键字有什么意义,请写出你所知道的意义? using 关键字有两个主要用途: 1)作为指令,用于为命名空间创建别名或导入其他命名空间中定义的类型。 2)作为语句,用于定义一个范围,在此范围的末尾将释放对象。 在 C# 中,new 关键字可用作运算符、修饰符或约束。 1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。 2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。 3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。 描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 不是。可以用任意类型。 NET中读写XML的类都归属于哪些命名空间? 答:System.Xml 私有程序集与共享程序集有什么区别? 一个私有程序集通常为单个应用程序所使用,并且存储于这个应用程序所在的目录之中,或此目录下面的一个子目录中。 共享程序集通常存储在全局程序集缓存(Global Assembly Cache)之中,这是一个由.NET运行时所维护的程序集仓库。共享程序集通常是对许多应用程序都有用的代码库,比如.NET Framework类。 New有几种用法 在 C# 中,new 关键字可用作运算符、修饰符或约束。 1)new 运算符:用于创建对象和调用构造函数。这种大家都比较熟悉,没什么好说的了。 2)new 修饰符:在用作修饰符时,new 关键字可以显式隐藏从基类继承的成员。 3)new 约束:用于在泛型声明中约束可能用作类型参数的参数的类型。 接口是否可继承接口?抽象类是否可实现接口?抽象类是否可继承类? 在C#中接口可以继承接口但不是实现接口因为接口中不能存在实现的成员 抽象类与普通类无差异只是不能被实例化而已因此抽象可以实现接口也可以继承类但抽象类一般作为父类使用什么是类和对象 对象:一种具有状态(属性)和行为(方法)的编程实体,用于描述现实世界的某个具体事物。 类 对象和类的关系 类是对象的抽象,而对象是类的具体实例。类是抽象的,不占用内存,而对象是具体的,占用存储空间。类与对象的关系就如模具和铸件的关系,类的实例化结果就是对象,而对一类对象的抽象就是类,类描述了一组有相同属性和相同方法的对象。 委托是否可以有返回值 委托可以是带有返回值的方法但多于一个带返回值的方法被添加到委托链中时程序员需要手动的调用委托链上的每一个方法否则委托使用者将只能得到委托链上最后一个被执行方法的返回值Array复制到ArrayList里 foreach( object o in array ){ arrayList.Add(o); } C#中,string str = null与string str =““,请尽量用文字说明区别。(要点:说明详细的内存空间分配) string str = null 是不分配内存空间,而string str = ““ 给它分配长度为空字符串的内存空间。 概述反射和序列化 反射就是为了在程序的运行过程中动态的获取类的方法和属性, 优点就是可以实现动态创建对象和编译,体现出很大的灵活性,缺点是对性能有影响。 如何理解委托 委托是一种特殊的引用类型,允许将方法作为参数进行传递。 委托在使用过程中的一般步骤:类型定义、对象创建和方法绑定,方法调用。 委托是一种引用方法类型,一旦委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的使用可以像其他任何方法一样,具有参数和返回值。委托可以看作是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体的函数。 C#中能使用指针吗,怎样使用指针? 能,我们可以使用unsafe关键词,开启不安全代码(unsafe code)开发模式直接操作内存,这样就可以使用指针了 概述三层结构体系? 表示层(UI),业务逻辑层(BLL),数据访问层(DAL)。 列举一下你所了解的XML技术及其应用? xml一般是用来做数据传输格式、软件配置的。可以用来做网页(xslt)、可以当作数据库、可以用于配置,用于保存静态数据类型,使用 值类型和引用类型的区别? C#数据类型分为两大类:值类型(数据存放在栈stack中)和引用类型(数据存放在堆heap中,地址存放在栈stack中)。值类型变量声明后,不管是否已经赋值,编译器为其分配内存。声明一个引用类时,只在栈中分配内存,用于存放地址,而并没有为其分配堆上的内存空间。 构造器Constructor是否可以被继承?是否可以被Override? Constructor不可以被继承,因此不能被重写(Overriding),但可以被重载(Overloading). 是否可以继承String类? 因为String类是密封类所以不可以继承string类。 当一个线程进入一个对象的方法后,其它线程是否可以进入该对象的方法? 取决于是否进行线程同步。如果进行了线程同步,只能一个线程进入。 用最有效的方法算出2乘以8等于几? 2<<3 C#是否可以对内存直接进行操作? C#是可以对内存进行直接操作的,虽然很少用到指针,但是C#是可以使用指针的,在用的时候需要在前边加unsafe。 sleep() 和 wait() 有什么区别? sleep()方法是将当前线程挂起指定的时间。 wait()释放对象上的锁并阻塞当前线程,直到它重新获取该锁。 short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? short s1 =1; s1 = s1 + 1;有错, s1是short型,s1+1是int型,不能显式转化为short型。可修改为s1=(short)(s1 + 1) 。short s1 = 1;s1 += 1正确。 什么是虚函数?什么是抽象函数? 虚函数:可由子类继承并重写的函数。 抽象函数:规定其非虚子类必须实现的函数,必须被重写。 什么是XML? XML即可扩展标记语言,主要用来做数据传输格式、软件配置。 C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里? 一个是属性,用于存取类的字段,一个是特性,用来标识类,方法等的附加性质 .net的错误处理机制是什么? .net错误处理机制采用try->catch->finally结构,发生错误时,层层上抛,直到找到匹配的Catch为止。 &和&&的区别 &是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and). 在c#中using和new这两个关键字有什么意义,请写出你所知道的意义? using 引入名称空间或者使用非托管资源 new 新建实例或者隐藏父类方法 String s = new String("xyz");创建了几个String Object? 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。 C#中,i++与++i,有什么区别? i++是使用完 i 之后再使 i 加一 ++i是在使用 i 之前便使 i 加一 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现public class MainClass { public static void Main(){ Console.WriteLine(Foo(30)); } public static int Foo(int i) { if (i <= 0) return 0; else if(i > 0 && i <= 2) return 1; else return Foo(i -1) + Foo(i - 2); } }? 什么是Code-Behind技术? 。 int、DateTime、string是否可以为null? int、DateTime不能,因为其为值类型,值类型不能为null,只有引用类型才能被赋值null。string可以为null。 传入某个属性的set方法的隐含参数的名称是什么? value,它的类型和属性所声名的类型相同。 string、String;int、Int32;Boolean、bool的区别 String、Int32、Boolean等都属于.Net中定义的类,而string、int、bool相当于C#中对这些类定义的别名。 不是说字符串是不可变的吗?string s="abc";s="123"不就是变了吗? String是不可变的在这段代码中,s原先指向一个String对象,内容是 "abc",然后我们将s指向"123",那么s所指向的那个对象是否发生了改变呢?答案是没有。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"123",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。 是否可以从一个static方法内部发出对非static方法的调用? 不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。 说出一些常用的类、接口,请各举5个 常用的类:StreamReader、WebClient、Dictionary、StringBuilder、SqlConnection、FileStream、File、Regex、List 常用的接口:IDisposable、IEnumerable、IDbConnection、IComparable、ICollection、IList、IDictionary如果不用VisualStudio,用哪个命令行编译C#程序? csc.exe。 你对泛型了解吗?简单说明一下泛型的有什么好处? 泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用?好处是——可以复用代码,降低耦合性,而且还提高了代码的可读性以及安全性。 DateTime.Parse(myString); 这行代码有什么问题? 有问题,当myString不能满足时间格式要求的时候,会引发异常,建议使用DateTime.TryParse()? XML 与 HTML的主要区别? 2. 在HTML中,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略结束标记。在XML中,绝对不能省略掉结束标记。 3. 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个 / 字符作为结尾。这样分析器就知道不用 查找结束标记了。 4. 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的。 5. 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值。 和类的区别 2、存储不同:结构使用栈存储,而类使用堆存储。栈的空间相对较小.但是访问效率相对较高.堆的空间相对较大.但是访问效率相对较低。 3、作用不同:类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体不具备类的继承多态特性。 4、初始化不同:类可以在声明的时候初始化,结构不能在申明的时候初始化(不能在结构中初始化字段),否则报错。 用接口或父类作为输入的参数有什么好处?返回值如果是接口是为了什么? 接口或父类作为参数,所有继承了此接口或父类的类都可以使用,即你给此方法传参数的时候,可以把继承了这个接口或父类的类的实例传给这个方法。可以一次性传入多种字段、方法等而不用定义多个形参接口作为返回值,返回的是实现接口的对象。 和 == 的区别 = 是赋值运算符 ==是关系运算符等值判断 数组是没有length这个方法的,有length这个属性,可以计算数组的长度 String是有length这个方法的,用来计算字符串的长度。 泛型集合只能放定义类型的元素,会自动增大,取出时不用做类型转换 数组只能放定义类型的元素,不会自动增大,取出时不用做类型转换 System.Object中有什么方法?有什么用? 1.ToString():是获取对象的字符串表示的一种快捷方式 2.Finalize():允许对象在垃圾回收该对象之前尝试并执行释放资源并执行其他清理操作 3.GetType():获取当前实例的确切运行时类型 4.GetHashCode():用作特定类型的哈希函数 5.构造函数方法:主要用来在创建对象时初始化对象 Linq中concat union intersect的区别 Concat :连接两个序列。 Union : 通过使用默认的相等比较器生成两个序列的并集。 Intersect : 通过使用默认的相等比较器对值进行比较生成两个序列的交集。 请问哈希表(hashtable)是如何存储数据的? 以哈希表的形式存储数据,数据的形式是键值对。 .NET中的CTS、CLS和CLR CLS通用语言规范 CTS通用类型系统 NET和C#的区别 .NET一般指.Net Framework框架,是Microsoft为开发应用程序而创建的一个具有革命意义的平台,运行在.NET(CLR)上的,用于创建应用程序的一种高级编程语言 1.单例设计模式 2.工厂设计模式 3.代理设计模式 4.观察者设计模式 5.适配器模式 模式 String是不可变化的字符,它只能赋值一次,每一次内容发生改变,都会生成一个新的对象 StringBuilder是可以变化的字符,每次操作都是对自身对象进行操作,而不是生成新的对象,其所占空间会随着内容的增加而扩充 Linq与SQL语句的执行速度哪个更快? SQL语句的执行速度更快 C#代码编译成中间语言有什么作用? 优点:一是可以实现平台无关性,既与特定CPU无关;二是只要把.NET矿建某种语言编译成IL代码,就实现.NET矿建中语言之间的交互操作。 IL是.NET矿建中的中间语言(Intermediate Language)的缩写。 6.2.NET Web开发部分 Page_Onload里面一般会写什么代码? 通过判断IsPostBack属性判断是否首次加载。在页面首次加载时,编写控件初始化代码和页面变量初始化代码 什么时候会用到cookie,session?它们的区别分别是什么? Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。 1.session 在服务器端,cookie 在客户端(浏览器) 2.session 默认被存在服务器的一个文件里(不是内存) 3.session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id) 4.session 可以放在 文件、数据库、或内存中都可以。 5.用户验证这种场合一般会用 session 因此,维持一个会话的核心就是客户端的唯一标识,即 session id ASP.NET的WebPage的生命周期? 初始化-》加载视图状态-》处理回发数据-》加载-》发送回发更改通知-》处理回发事件-》预呈现-》保存状态-》呈现-》处置-》卸载 页面之间传值的几种方式? 页面间传值: 1.使用QueryString变量。 2.PostBackUrl()方法。 3.使用Server.Transfer方法。 应用程序范围内传值: 1.Cookie对象变量。 2.使用Session变量。 3.使用Application对象变量。 Ajax异步交互数据。 使用AJAX实现异步刷新就是在用户“无察觉”的情况下“偷偷”访问了远程服务器进行工作,然后将结果返回后由JS提供在客户端,让用户感受好像B/S架构的程序和C/S的差不多的感觉。 IIS如何进行配置 1.打开IIS管理器。 2.展开“本地计算机”-“网站”目录,选中“默认网站”节点,右键“属性”,设置主目录。 3.右键“默认网站”图标,选择“新建”-“虚拟目录”命令。IIS将启动“虚拟目录创建向导”对话框帮助我们完成创建虚拟目录的步骤。 4.单击对话框的“下一步”按钮以显示虚拟目录别名页,如HelloWorld。别名是我们用来标识该目录中的资源的名称。在VS.NET中,别名是用来指定项目位置的名称。 5.单击“下一步”按钮,以显示Web站点内容目录页。在此,输入包含此网站内容的目录的路径。 6.单击“下一步”按钮,打开虚拟目录访问权限设置页面。选中“读取”复选框和“运行脚本”复选框。 7.单击“下一步”按钮,再单击“完成”按钮创建虚拟目录并终止向导。查看IIS管理器中虚拟目录的创建结果,可以发现,默认网站中多了一个齿轮状图标的HelloWorld节点。 如果当前还不是齿轮状,右键节点,打开属性页,在虚拟目录中的应用程序设置中创建应用程序名为HelloWorld的应用程序就可以了 MVC中的视图是用来干什么的? MVC是三个单词的首字母缩写,它们是Model(模型)、View(视图)和Controller(控制) 从结构上看,可以分成三层, 1)最上面的一层,是直接面向最终用户的"视图层"(View)。它是提供给用户的操作界面,是程序的外壳。 2)最底下的一层,是核心的"数据层"(Model),也就是程序需要操作的数据或信息。 3)中间的一层,就是"控制层"(Controller),它负责根据用户从"视图层"输入的指令,选取"数据层"中的数据,然后对其进行相应的操作,产生最终结果。 这三层是紧密联系在一起的,但又是互相独立的,每一层内部的变化不影响其他层。每一层都对外提供接口(Interface),供上面一层调用。这样一来,软件就可以实现模块化,修改外观或者变更数据都不用修改其他层,大大方便了维护和升级。 asp.net状态管理技术中可用于保存与传递数据的方法的是 所谓 “状态管理”,是指使用ASP.NET中的ViewState、Cookie、Session和Application等对象实现页面数据缓存和传递的技术。 post和get的区别。 1. get/post均可 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。 3. 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。 4. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。 5. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Post数据提交方式; 2、在做数据查询时,建议用Get方式;而在做数据添加、修改或删除时,建议用Post方式; 某aspx页面中有一用户控件UserCtrl1,以及一web服务器控件Button1,用户控件内有uiAdd()方法用来动态添加显示效果,此页面AutoEventWireup="true",在页面page_load事件内有调用uiAdd()方法的代码,Button1点击后将触发Button1_Click事件。假设现在浏览该页面后点击了Button1,请列出页面page_load,按钮Button1_Click,用户控件uiAdd()以及用户控件的page_load的触发先后顺序。 1.aspx页面中的page_load 2.UserCtrl1中的page_load 3.用户控件uiAdd() 4.Button1点击后将触发Button1_Click事件 简述WebServices? WebService 就是web服务。是微软主推的一种跨平台的分布式应用程序。他使用SOAP协议通讯,用XML封装数据,所以是跨平台的。任何客户端只要按照WebService发布的格式发送数据就都可以得到结果。 在Asp.net中所有的自定义用户控件都必须继承自哪个类? Control:所有控件的基类。 在.Net中,类System.Web.UI.Page 可以被继承么? 可以,每个页的cs文件中定义的类就是继承这个类的 什么情况用HTML控件,什么情况用WEB控件,并比较两者差别 Html控件: 1.Html控件就是我们通常说的Html语言标记,Html是以Input为前缀的。不能在服务器端控制。如果Html想要在服务器端控制,就加上”Runat="Server"”这句话,就构成了Html服务器控件。Html服务器控件可也运行在服务器端,能够在后台对其进行设置修改。 2.Html控件直接发送给浏览器,不灵耗费服务器资源。 Web控件: 1.Web控件是构成ASP.Net服务器控件的一部分,Web控件是以Asp:为前缀的 他不像Html需要加上”Runat="Server"”才可以运行在服务器端,它本身隐身包含这句话。 2.Web控件需要通过服务器处理后译为Html控件在发送给浏览器,所以比较耗费服务器资源,并由于有VIEWSTATE,所以在会送的时候会保持控件状态(也可以不保存),也因此增加了回送信息量。 请解释ASP.NET中的数据绑定与传统数据绑定有什么区别? ASP.NET的数据绑定:控件中数据的变化不会自动同步到数据源中,传统数据绑定可以自动同步。 如果出现ASP.NET中的事件不能触发可能由于什么原因造成? 如果在web窗体中使用了验证控件,那么当验证控件中的验证逻辑没有通过时一般会使事件不能触发执行。 如果使用了诸如Textchange、Checkchange、Selectedindexchanged这类事件并在 服务器端进行了事件处理,但是没有设置AutoPostBack=true属性时会使事件不能触发执行。 请解释转发与跳转的区别? 转发的特点:forward 1.转发地址栏路径不变 2.转发只能访问当前服务器下的资源 3.转发是一次请求,可以使用request对象来共享数据 4.请求来源:服务器内部使用,不需要加虚拟目录。 跳转(重定向)的特点:redirect (浏览器响应头:302,即重定向) 1.地址栏发生变化 2.重定向可以访问其他站点(服务器)的资源 3.重定向是两次请求。不能使用request对象来共享数据 4.请求来源不同:客户端浏览器发起,需要加虚拟目录,动态获取request.getContextPath() 请解释什么是上下文对象,在什么情况下要使用上下文对象 上下文对象HttpContext。如果需要在网页类之外的其他 请解释一个WEB页面中代码执行次序。 常用事件执行次序:Init(初始化) -> Load(加载) -> Event(控件事件) -> PreRender(呈现之前) -> UnLoad(卸载) 当发现不能读取页面上的输入的数据时很有可能是什么原因造成的?怎么解决 可能情况: 1)可能事件没有关联 2)根本就没有写读取代码 3)写错了事件 4)在Load事件中有清空代码,但没有写 if (!IsPostBack) 什么是viewstate,能否禁用?是否所用控件都可以禁用? Web页面是没有状态的,ViewState(视图状态)可用来保存Web页面在客户端和服务器端往返过程的状态 说简单点ViewState只不过是Hidden控件,加上微软写上的一些代码而已 可以禁用,有三种方法: 1)禁用单个控件:控件.EnableViewState = false。 2)禁用单个页面:在@Page指令中设置这个属性以达到页面级禁用ViewState的目的。 3)禁用整个程序:修改Web.config中相应元素的属性即可。 最后,禁用服务器全局的ViewState,修改.Net Framework安装目录下的machine.config即可。 请解释ASP.NET中的web页面与其隐藏类之间的关系? ASP.NET中的页面由两部分组成,页面显示(aspx文件)和代码逻辑(aspx.cs文件)通过Page指令联系在一起,如下:所以关系为:Web页面会继承隐藏类。 WEB控件及HTML服务端控件能否调用客户端方法?如果能,请解释如何调用? 可以,其调用过程大致如下:用户使用WEB控件或者html服务端控件,控件的调用方法事件被激发,于是服务器开始自动寻找所匹配的方法代码,当在客户端找到后解释执行客户端的方法代码,完毕后继续返回服务器执行剩余代码. WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回。 在web控件发生事件时,客户端采用提交的形式将数据交回服务端,服务端先调用Page_Load事件,然后根据传回的状态信息自动调用服务端事件自动传回是当我们在点击客户端控件时,采用提交表单的形式将数据直接传回到务端 只有通过自动传回才能实现服务端事件的机制,如果没有自动回传机制就只能调用客户端事件,而不能调用服务端事件 请解释ASP.NET中以什么方式进行数据验证? .net中提供了几个数据验证控件,可以在服务器端或者客户端进行验证。 什么是WEB控件?使用WEB控件有那些优势? WEB控件是能拖放在WEB页面上的控件 WEB控件分为:内部控件, 列表控件, 复杂控件, 验证控件 WEB控件优势:Web 控件是对象 –与对象一样,Web 控件拥有方法和属性,并且响应事件 –一旦将 Web 控件包括在 Web 页中,就可以设置其属性并调用其方法 –可以为 Web 控件编写服务器端代码以响应在客户端上发生的事件 常用的调用Webservice方法有哪些? 1.使用WSDL.exe命令行工具。 2.使用VS.NET中的Add Web Reference菜单选项 Session有什么重大BUG,微软提出了什么方法加以解决?? 是iis中由于有进程回收机制,系统繁忙的话Session会丢失,可以用Sate server或SQL Server数据库的方式存储Session不过这种方式比较慢,而且无法捕获Session的END事件。 请解释ASP.NET中的Web页面与其隐藏类之间的关系? 就是asp的升级版,asp之前是C#代码与html在一起写的,美工人员不容易维护,因为他看不懂C#代码,所以才有了asp.net这样的有了隐藏类,html与代码进行了分离,但这是紧耦合,一但没有了隐藏类,就会报错,MVC就解决了这一现象,视图、控制器分离 什么是ASP.NET中的用户控件 用户控件就是扩展名为.ascx的特殊页面,它不能像.aspx页面一样直接访问,用户控件用以在同一应用程序中实现功能和外观的重用。 什么是Code-Behind技术。 代码后置, 即HTML代码与C#代码写在不同的文件中,使得代码更整洁和便于维护. ASP.NET的身份验证方式有哪些?分别是什么原理? Windows: 使用IIS验证方式 Forms: 使用基于窗体的验证方式 Passport: 采用Passport cookie验证模式 None: 不采用任何验证方式 在.Net中,类System.Web.UI.Page 可以被继承么? 可以。 <%# %> 和 <% %> 有什么区别? <%# %>表示绑定的数据源,<% %>是服务器端代码块 session喜欢丢值且占内存,Cookis不安全,请问用什么办法代替这两种原始的方法 使用用户配置Profile,或者自行编程存储在数据库中 动态创建的控件PostBack后是否可以保存下来,为什么? 不可以,因为页面的每一次生命周期页面对象都是重新实例化的。 .O/R Mapping 的原理? 利用反射,配置将对象和数据库表映射。 Request类:1.getSession():获取Session对象 2.getCookies():获取所有的Cookie,返回一个Cookie数组 3.getMethod():获取请求类型 Response类:1.setHeader():设置消息头 2.addCookie():添加Cookie 3.setContentType():告知浏览器数据类型 <%%>与<%#%>的区别 前者是服务器端代码块,后者表示绑定的数据源 MVC与webform相比有什么优势? MVC的优点: 1.通过把项目分成Model、View和Controller,使得复杂项目更加容易维护,减少项目之间的耦合。 2.没有服务器表单控件,可以更方便的控制应用程序的行为 3.应用程序通过Controller来控制程序请求,并提供了原生的UrlRouting功能来重写Url。 4.使Web程序对单元测试的支持更加出色 5.强类型view实现,更安全,更高效。 webapi与webservice的区别? 答:webapi用的是http协议,webservice用的是soap协议 webapi无状态,相对webservice更轻量级。webapi支持如get,post等http操作有12种,最主要的是ActionResult类,它是一个基础类,它有11个子类型。 ViewResult??-?给响应流渲染指定的视图 PartialViewResult??-?给响应流渲染指定的局部视图 EmptyResult??-?返回空的响应结果。 RedirectResult??-?执行一个HTTP转向到指定的URL。 RedirectToRouteResult??-执行一个HTTP转向到一个URL,这个URL由基于路由数据的路由引擎来决定 JsonResult??-?序列化一个ViewData对像到JSON格式。 JavaScriptResult??-?返回一段Javascript代码,它可以在客户端执行。 ContentResult??-?写内容到响应流,不需要视图支持。 FileContentResult??-?返回一个文件到客户端。 FileStreamResult??-?返回一个文件到客户端,它提供的是流。 FilePathResult??-?返回一个文件到客户端。 ActionFilter(方法过滤器):接口名为[IActionFilter],在控制器方法调用前/后执行 ResultFilter(结果过滤器):接口名为[IResultFilter],在控制器方法调用完,跳转至view页面前/后执行 AuthorizationFilter(授权过滤器):接口名为[IuthorizationFilter],所有过滤器中最先执行的 ExceptionFilter(异常处理过滤器):接口名为[IExceptionFilter],在控制器方法抛出异常时执行 6.4 数据访问部分 连接数据库的字符串应该写在哪儿? 写在配置文件中ADO.NET中的使用Connetion对象的Close()和Dispose()的区别。 Close()表示关闭连接pen()打开Dispose()表示销毁onnectionString清空了,但此时Connection对象还在。 如果程序中没有向连接池发出请求说要Connection对象,Connection对象便会销毁,这也是连接池存在的意义。 DataReader和DataSet的异同 DataReader和DataSet最大的区别在于,DataReader使用时始终占用Connection对象,DataReader是只进的..你读了第一条后就不能再去读取第一条了.. DataSet则是将数据一次性加载在内存中.抛弃数据库连接,读取完毕即放弃数据库连接,比较消耗内存,但是却比DataReader要灵活,可以动态的添加行,列,数据.对数据库进行回传更新操作 从数据库读取记录,你可能用到的方法有哪些 通常有两种方式 SqlDataReader(非断开式连接) 和SqlDataAdapter|DataSet(断开式连接)方式。 ADO.NET相对于ADO等主要有什么改进? ADO.NET不依赖于ole db提供程序,而是使用.net托管提供的程序; ADO.NET不使用com ADO.NET不再支持动态游标和服务器端游 ADO.NET可以断开connection而保留当前数据集可用 ADO.NET强类型转换 ADO.NET xml支持异同 O/R mapping (ORM)及其原理 ORM,Object-Relationl Mapping即为对象-关系映射。它的作用是在关系型数据库和对象之间作一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了 原理SQL,将业务对象持久化到关系数据库中。 ADO.NET中常用的对象有哪些?分别描述一下。 DataSet对象:数据集,表示内存中数据的缓存,可以把它想像成一个临时的数据库,它里可以存多个表(DataTable),而且是断开式的,不用每进行一次操作就对数据库进行更新,从而提高了效率。 DataReader对象:读取器,它与DataSet最大的不同是有连接式的,每次对数据库进行存取都会影响到数据库。 Connection对象:连接池,用于连接数据库的对象,表示到数据源的一个唯一的连接。 Command对象:命令对象,表示要对数据库执行的一个SQL语句或一个存储过程。 DataAdapter对象:适配器,该对象是与DataSet配合使用的对象,用于把表填充到DataSet,和更新DataSet等。 对数据的并发采用什么办法进行处理较好。 可以控制连接池的连接数量,条件好的话可以用负载平衡 编写数据库查询分页SQL。 假设每页显示X条用pagesize表示当前要显示第X页用currentPage表示select top pagesize from tablename where id not in (select top (currentPage-1)pagesize id from tablename) 或 select top pagesize from (select ROW_NUMBER() over (order by asc) as rownumber, from (select from tablename) as oo) as o where rownumber>(currentPage-1)pagesize mysql中select from tablename limit (currentPage-1)pagesize,pagesize Oracle中select from (select rownum rn,t. from tablename ) t where t.rn>(currentPage-1)pagesezie and t.rn<=currentPagepagesezie 6.5 其他部分 堆和栈的区别 数据结构的堆和栈 : 1. 栈是一种可以实现“先进后出”(或者称为“后进先出”)的存储结构。 2. 堆则是一种经过排序的树形数据结构,常用来实现优先队列等 内存分配中的堆和栈 1. 栈空间的内存是由系统自动分配,一般存放局部变量,比如对象的地址等值,不需要程序员对这块内存进行管理 2. 堆空间的内存是动态分配的,一般存放对象,并且需要手动释放内存。 什么叫做SQL注入,如何防止?请举例说明。 利用现有应用程序,将(恶意)的SQL命令注入到后台数据库引擎执行的能力,这是SQL注入的标准释义。就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。在某些表单中,用户输入的内容直接用来构造(或者影响)动态SQL命令,或作为存储过程的输入参数,这类表单特别容易受到SQL注入式攻击。 防止SQL注入: 1、对输入内容进行过滤,去掉有可能的威胁 2、对于用来执行查询的数据库帐户,限制其权限。 3、在查询语句中使用参数。 4、用存储过程来执行所有的查询。 5、将用户登录名称、密码等数据加密保存。 float f=-123.567F;int i=(int)f;i的值现在是? -123。 分层式结构究竟其优势何在? 1、开发人员可以只关注整个结构中的其中某一层; 2、可以很容易的用新的实现来替换原有层次的实现; 3、可以降低层与层之间的依赖; 4、有利于标准化; 5、利于各层逻辑的复用。 概括来说,分层式设计可以达至如下目的:分散关注、松散耦合、逻辑复用、标准定义。 分层式结构也不可避免具有一些缺陷 1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。 2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。 答: 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。区分层次的目的即为了”高内聚,低耦合”的思想。 1、表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。 2、业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。 3、数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。 MVC与三层架构比最主要的优势是什么? 三层是:? UI 界面层 ???? ?? BLL 业务逻辑层?? DAL数据访问层 (特殊的Model实体层) MVC是: ???????? ? ?? M? Model(模型层)????? 业务逻辑以及数据库的交互??????????????? ??????? ??? ? V? View(视图层)???????? 显示数据和提交数据 ?????? C Controller(控制器)??负责从视图读取数据,控制用户输入,并向模型发送数据。? 两者的区别 ??? ?? ???? 三层的 UI??? =??? MVC的 View ??????????? 三层的 Model+ BLL+DAL =??? MVC的 Model MVC优点 易于进行单元测试 易于进行测试驱动开发 低耦合性、高重用性、可适用性 较低的生命周期成本 快速的部署 可维护性 有利于软件工程化管理 MVC缺点 内部结构复杂 MVC的生命周期是怎样的? Request?请求到来 IIS?根据请求特征将处理权移交给?ASP.NET UrlRoutingModule将当前请求在?Route Table中进行匹配 UrlRoutingModule在RouteCollection中查找Request匹配的RouteHandler,默认是MvcRouteHandler MvcRouteHandler?创建?MvcHandler实例. MvcHandler执行?ProcessRequest. MvcHandler?使用?IControllerFactory?获得实现了IController接口的实例,找到对应的HomeController 根据Request触发HomeController的Index方法 Index将执行结果存放在ViewData HomeController的Index方法返回?ActionResult Views/Home/Index.aspx将?ViewData呈现在页面上 Index.aspx执行ProcessRequest方法 Index.aspx执行Render方法?输出到客户端 启用一个线程是用run()还是start() start() 7.常规技术面试题(Java) 7.1 Java基础部分 Java 的 “一次编写,处处运行”如何实现? JAVA之所以能实现?一次编译,到处运行,是因为JAVA在每个系统平台上都有?JAVA虚拟机(JVM),JAVA编译的中间文件class是由JAVA虚拟机在运行时动态转换为对应平台的机器代码. ?Java平台由Java虚拟机和Java应用程序接口搭建,Java语言则是进入这个平台的通道,用Java语言编写并编译的程序可以运行在这个平台上。这个平台的结构如下图所示:???运行期环境代表着Java平台,开发人员编写Java代码(.java文件),然后将之编译成字节码(.class文件),再然后字节码被装入内存,一旦字节码进入虚拟机,它就会被解释器解释执行,或者是被即时代码发生器有选择的转换成机器码执行。 ava没有全局变量? Global variables(全局变量) 是指可以全局访问的变量, Java不支持全局变量,原因如下: 1. 全局变量破坏了引用的透明性。 2. 全局变量制造了命名空间冲突。 可以使用properties类将想要全局有效的变量值写在properties文件中,那么在何处用时都从此properties文件中读取这个变量的值就可以了,此值在任何时候都可以修改的 :平时在类中声明的只是相对类而言是全局变量,不是真正意义的全局变量 Public 是一个访问权限(访问修饰符) static 修饰的成员称为类成员或者静态成员 当方法定义时用void修饰时,表示没有返回值 类来创建和操作字符串 "= ="除了比较基本数据之外都是比较的内存地址 "equals"除了没有没有重写equals方法的类之外都是比较的内容 Java中有几种类型的流 Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStream,Reader,Writer。构造器(constructor)是否可被重写(override) 构造器(构造方法)Constructor不能被继承,因此不能重写Override,但可以被重载Overload参数即可。 每一个类必须有自己的构造函数,创建对象时调用如果添加有参函数后,默认无参构造函数则被覆盖。子类不会覆盖父类的构造函数,在创建子类对象的时候,会自动调用父类构造函数。 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。 如何将String类型转化成Number类型。 Integer类的valueOf方法可以将String转成Number 什么是值传递和引用传递? 对象被值传递,意味着传递了对象的一个副本。因此,就算是改变了对象副本,也不会影响源对象的值。 对象被引用传递,意味着传递的并不是实际的对象,而是对象的引用。因此,外部对引用对象所做的改变会反映到所有的对象上。 Java的访问修饰符是什么? ?在Java编程语言中有四种权限访问控制符,这四种访问权限的控制符能够控制类中成员的可见性。? public是公共的,被public所修饰的成员可以在任何类中都能被访问到。 protected是受保护的,受到该类所在的包所保护。? friendly是友好的,即在成员的前面不写任何的访问修饰符的时候,默认就是友好的。所谓友好的,是对同一package的类友好。?? private是私有的,即只能在当前类中被访问到,它的作用域最小。 Java byte(字节)short(短整型) int(整型) long(长整型) float(浮点型) double(双精度) char(字符型) boolean(布尔型) hashCode()和equals()方法的重要性体现在什么地方? Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。 switch 中用于判断的表达式,可以用哪些数据类型? char型变量中能不能存贮一个中文汉字?为什么? Java里采用了Unicode编码格式,Unicode编码中一个char型占用2个字节,而一个汉字也是占用2个字节,所以可以存储中文汉字。 备注:C语言里,char占用1个字节,不用存汉字。 静态变量和实例变量的区别? 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。 在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变量才会被分配空间,才能使用这个实例变量。静态变量不属于某个实例对象,而是属于类,所以也称为类变量,不用创建任何实例对象,静态变量就会被分配空间,静态变量就可以被使用了。总之,实例变量必须创建对象后才可以通过这个对象来使用,静态变量则可以直接使用类名来引用。 是否可以从一个static方法内部发出对非static方法的调用? 不可以。因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时不需要创建对象,可以直接调用。也就是说,当一个static方法被调用时,可能还没有创建任何实例对象,如果从一个static方法中发出对非static方法的调用,那个非static方法是关联到哪个对象上的呢?这个逻辑无法成立,所以,一个static方法内部发出对非static方法的调用。 Integer与int的区别? 1、int是基本数据类型,Integer是包装类; 2、int的默认值是0,Interger的默认值是null; Overload和Override的区别。参数列表相同,返回值不同的方法,是否是重载方法? Overload是重载的意思,Override是覆盖的意思,也就是重写。 重载是指在一个类里,方法名相同,参数不同; 重写是指子类继承父类,子类里重新编写了父类中的同名(同参数)方法,也就是覆盖了父类的方法; 不是!因为重载必须要求参数列表不同! 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 接口可以继承多个接口。抽象类可以实现(implements)接口,抽象类是可继承具体类。 备注:只要明白了接口和抽象类的本质和作用,这些问题都很好回答。 只有记住抽象类与普通类的唯一区别就是不能创建实例对象和允许有abstract方法。 面向对象有哪三大特性? 1、面向对象有三大特性,分别是:封装、继承和多态。 2、封装:面向对象的封装就是把描述一个对象的属性和行为的代码封装在一个类中,有些属性是不希望公开的,或者说被其他对象访问的,所以我们使用private修饰该属性,使其隐藏起来;类中提供了方法(用public修饰),常用的是get、set方法,可以操作这些被隐藏的属性,其他类可以通过调用这些方法,改变隐藏属性的值! 封装是保证软件部件具有优良的模块性的基础,封装的目标就是要实现软件部件的“高内聚、低耦合”,防止程序相互依赖性而带来的变动影响。在面向对象的编程语言中,对象是封装的最基本单位,面向对象的封装比传统语言的封装更为清晰、更为有力。 3、继承:在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,使用extends关键字实现继承;子类中可以加入若干新的内容,或修改原来的方法使之更适合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一种关系,提高了软件的可重用性和可扩展性。 4、多态:多态就是在声明时使用父类,在实现或调用时使用具体的子类;即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性,多态增强了软件的灵活性和扩展性。这里可以举个例子,比如声明时使用的是动物类,调用时传递的是一个猫类(动物类的子类)的对象,具体执行父类里动物——吃的方法时,实际执行的是猫——吃的方法。 abstract class和interface有什么区别? 1、抽象类里面可以用普通方法,而接口中的方法全部都是抽象的; 2、在应用范围上来说,接口往往在程序设计的时候,用来定义程序模块的功能,方便各模块协同工作;抽象类是对相似类进行抽象,形成一个抽象的父类可供重用! ava中的Serialization和Deserialization。 串行化(serialization)是指将一个对象的当前状态转换成字节流(a stream of bytes)的过程, 而反串行化(deserialization)则指串行化过程的逆过程,将字节流转换成一个对象,打回原形。 String是最基本的数据类型吗? 1、String是个类,不是基本数据类型; 2、基本数据类型包括byte、int、char、long、float、double、boolean和short。 String s = new String("xyz");创建了几个字符串对象 两个对象,要理解这个,就要知道string类的工作原理public?class?StringTest?{?? ????public?static?void?main(String[]?args){?? ????????String?s1="Hello";?? ?? ????????String?s2="Hello";?? ?? ????????String?s3=new?String("Hello");?? ?? ????????System.out.println("s1和s2?引用地址是否相同:"+(s1?==?s2));?? ????????System.out.println("s1和s2?值是否相同:"+s1.equals(s2));?? ?? ????????System.out.println("s1和s3?引用地址是否相同:"+(s1?==?s3));?? ????????System.out.println("s1和s3?值是否相同:"+s1.equals(s3));?? ????}?? }?? 输出结果: s1和s2 引用地址是否相同:true s1和s2 值是否相同:true s1和s3 引用地址是否相同:false s1和s3 值是否相同:true String 和StringBuffer的区别。 1、String是个不可变长度的字符串,而StringBuffer是个可变长度的字符串; 2、在对String类进行操作的时候(例如增加字符),实际上是在内存中产生了一个新的String对象; 而StringBuffer是给原对象增加字符,不是新创建一个对象; 数组有没有length()这个方法? String有没有length()这个方法? 数组没有length()这个方法,有length的属性。String有length()这个方法。 final, finally, finalize的区别。 final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。 finally是异常处理语句结构的一部分,表示总是执行。 finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。JVM不保证此方法总被调用 Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally分别如何使用 throws是获取异常 throw是抛出异常 try是将会发生异常的语句括起来,从而进行异常的处理, catch是如果有异常就会执行他里面的语句, 而finally不论是否有异常都会进行执行的语句。 throw和throws有什么区别? throws是用来声明一个方法可能抛出的所有异常信息,而throw则是指抛出的一个具体的异常类型 请说一下你常用的几种异常? 空指针异常; 数组下标越界; 类型转换异常; 算数异常,例如除数为零; IO异常,比如说找不到文件; 找不到类异常; sql异常,例如sql语句不能正常运行; … Set和List的区别,List和Map的区别? 1、Set是无序的,元素不可重复;List是有序的,元素可以重复; 2、List存储的是单个对象的集合(有序的),Map存储的是键值对为对象的集合(无序的); 1.同步方法? 即有synchronized关键字修饰的方法。? ? ? 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,? 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。 2.同步代码块? ? ? 即有synchronized关键字修饰的语句块。? ? ? 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步 1、HashMap和Hashable都键值数据结构,了Map接口存储的元素; 2、HashMap非线程安全的,而HashTable是线程安全的HashTable里面的方法使用Synchronize关键字修饰所以ashMap的效率高于ashTable。 3、HashMap允许空空值ashTable则不允许 相同点:单列存储不可 不同点:底层数据结构不同ashSet===哈希表结构reeSet===二叉树结构 2、数据唯一性不同(ashSet通过重写hashcode和equals TreeSet通过compareable接口) 3有序性不同,ashSet无TreeSet有序 1、ArrayList和LinkedListector都了List接口; 2、ArrayListector底层是用数组实现的,而LinkedList使用链表实现的在插入、删除时,ArrayList需要移动数组元素性能较差;但是在查询时,因为是连续的数组,所以查询速度快;LinkedList正好相反。 容量增长上,rrayList增长原来0%,ector集合增加容量原来的一。 安全性方面ector能够保证线程安全,效率比rrayList要低。 1、泛型 2、For-Each循环 3、自动装包/拆包 4、枚举 5、静态导入 6、Annotation(框架配置,代码生成 的里程 8、字符串格式化器(java.util.Formatter) 9、新的线程模型和并发库 Thread Frameword 1、引入了一个支持脚本引擎的新框架 2、UI的增强 3、对WebService支持的增强(JAX-WS2.0和JAXB2.0) 4、一系列新的安全相关的增强 5、JDBC4.0 6、Compiler?API 7、通用的Annotations支持 1.switch中可以使用字串了 2.运用List tempList = new ArrayList<>(); 即泛型实例化类型自动推断 3.语法上支持集合,而不一定是数组 4.新增一些取环境信息的工具方法 5.Boolean类型反转,空指针安全,参与位运算 6.两个char间的equals? 7.安全的加减乘除? 8.map集合支持并发请求,且可以写成 Map map = {name:"xxx",age:18}; 1.Lambda 表达式?? Lambda允许把函数作为一个方法的参数用更简洁的语法实现复杂的功能 2.方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。 中可以使用default关键字声明一个默认方法。 4.新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。 新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。 6.加强对日期与时间的处理。 7.Optional 类用来解决空指针异常。 Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。 ? ?代理模式是常用的java设计模式,java中的代理实现主要有基于接口的jdk动态代理类的cglib动态代理代理的特点就是会对象产生代理对象,从而在调用实际目标对象实现无侵入式的代码扩展一些中的拦截器机制、springAOP切面是基于动态代理模式实现的其次也可以安全的保护目标对象。代理的目的主要就是为了解决一些安全性问题(客户调用目标对象的,而是相当于通过中介)其次就是可以在调用目标功能方法之前、之后添加一些功能,比如日志、事务等,并且还能阻止调用功功能,从而实现权限控制等。 1、避免在开发程序的时候,创建出一个类的多个实例(占用空间,性能问题),所以使用单例模式,保证该类只创建一个对象; //构造方法私有化,让外界无法创建对象 private Test() { } //当前类中声明对象,并提供公共静态方法外界调用获取对象 private static Test t; public static Test getInstance(){ if(t==null){ t=new Test(); } return t; } ava中有哪些常用排序方式, 排序主要用于将一组无需数据进行升序/排列,Java中有很多排序方法,:排序,选择排序,插入排序,快速排序其中数据中效率最高的属于快速排序比如工作中如果需要对数据排序,我们可以借助自带的rrays.sort方法它内部采用了快速排序,效率非常高,当然也可以自己实现 冒泡排序代码如下: import java.util.Arrays; public class BubbleSort { public static void BubbleSort(int[] arr) { int temp;//定义一个临时变量 for(int i=0;i for(int j=0;j if(arr[j+1] temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } } public static void main(String[] args) { int arr[] = new int[]{1,6,2,2,5}; BubbleSort.BubbleSort(arr); System.out.println(Arrays.toString(arr)); } } 如何实现对象克隆。 实现对象克隆有两种方式: 1). 实现Cloneable接口并重写Object类中的clone()方法;?? 2). 实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。?? Java中设计模式,我觉得理解设计模式对我们程序中的类和类的、依赖关系,扩展性,灵活性起着非常重要的作用,spring框架中都大量使用了设计,我比较熟悉的设计模式有: 1.单例设计模式 2.工厂设计模式工厂、抽象工厂、工厂方法 3.代理设计模式 4.观察者设计模式 5.适配器模式 模式 GC是垃圾回收的意思(gabage collection),内存处理器是编程人员容易出现问题的地方,忘记或者错误的内存回收导致程序或者系统的不稳定甚至崩溃,java的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,java语言没有提供释放已分配内存的操作方法。 Java中的String类提供了支持正则表达式操作的方法,包括:matches()、replaceAll()、replaceFirst()、split()。此外,Java中可以用Pattern类表示正则表达式对象,它提供了丰富的API进行各种正则表达式操作 Math.round(11.5) 等于多少?Math.round(-11.5)等于多少? 11.5+0.5后是12再向下取整是12;-11.5+0.5后是-11再向下取整-11 JDBC是java连接及数据库的一种技术使用步骤如下: 1、加载JDBC驱动程序;lass.forName(“com.mysql.jdbc.Driver”) 2、创建数据库的连接; Connection conn = DriverManager.getConnection(“jdbc:mysql://localhost:3306/数据库名”,”root”,”123456” 3、创建一个sql命令的CallableStatement对象 4、执行SQL语句;操作(返回int 查询操作executeQuery()(结果集ResultSet 5、返回并处理结果;是查询需要对结果集处理:rst.next()) 6、关闭连接;conn.close() Class.forName()方法有什么作用? 通过一个字符串加载一个类到java虚拟机中,返回与给定的字符串名称相关联类或接口的Class对象该方法使用时抛出lassNotFoundException,即无法找到异常。 事务是为了保证一个业务下的多条更新语句同一个不可分割的单元,要么都成功要么都取消,目的是保证数据的。 JDBC对事务进行了很好的支持,因为JDBC是开启事务的,所以需要通过数据库连接对象的然后在执行完相关操作之后调用连接对象的commit()方法提交事务,如果出现异常则调用rollback()进行回滚 一般在实际应用中,建议使用存储过程来进行事务的控制,因为存储过程更安全,高效。 1、PreparedStatement是Statement的子接口; 2、PreparedStatement支持SQL语句中使用占位符 3、PreparedStatement对SQL语句有预编译的功能,所以性能更好; 怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串? 代码如下所示: String s1 = "你好"; String s2 = new String(s1.getBytes("GB2312"), "ISO-8859-1"); List、Set、Map是否继承自Collection接口? List、Set 是,Map 不是。Map是键值对映射容器,与List和Set有明显的区别,而Set存储的零散的元素且不允许有重复元素(数学中的集合也是如此),List是线性结构的容器,适用于按数值索引访问元素的情形。 Java中如何实现序列化,有什么意义? Java中将一个类实现Serializable(是空接口,标识作用)则该类的对象被序列化。 是将类的对象进行流化,被流化后的对象可以在网络传输或者文件的形式进行保存,在需要的时候可以进行反序列化,将流化的对象还原原始对象并且数据都保持原来的状态操作是使用()方法进行写,然后使用时通过readObject(方法进行还原 获得一个类的类对象有哪些方式? - 方法1:类型.class,例如:String.class - 方法2:对象.getClass(),例如:”hello”.getClass() - 方法3:Class.forName(),例如:Class.forName(“java.lang.String”) 如何通过反射创建对象? - 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance() - 方法2:通过类对象的getConstructor()或getDeclaredConstructor()方法获得构造器(Constructor)对象并调用其newInstance()方法创建对象,例如: String.class.getConstructor(String.class).newInstance(“Hello”); 7.2 Java web部分 B/S是Brower/Server(浏览器/服务器模式)的缩写,客户机上只要安装一个浏览器,实现与服务器交互; Client/Server(客户端/服务器模式)的缩写,客户机需安装专用客户端,实现与服务器交互,如数据库产品; B/S代表,淘宝网、京东网站。 C/S代表, .主要区别如下: /S使用浏览器访问,维护的成本很小。 C/S需要安装客户端软件,安装成本较大。 1、在web.xml里为每一个Servlet配置初始化参数; Ajax是什么? 1、Ajax是采用了异步请求的方式,解决了页面无刷新式提交的问题,改善了页面的用户体验效果;常用自动完成提示,注册时用户名重复性校验。 query中的ajax 答题技巧:解释概念,说明用途,举例 Get和Post都是提交表单的方式之一; 1、get方式提交后,数据会在地址栏中显示出来,而post方式不会,所以post更安全; 2、[]get方式在提交数据的时候,数据长度是有限制的;而post方式在理论上对提交数据的大小是无限制的; 说一说Servlet的生命周期? Servlet里常用的方法有哪些? 1、Servlet生命周期包括加载和实例化、初始化、处理请求以及2、Servlet被服务器实例化,容器运行其init方法进行初始化,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。 1、forward是请求转发,而redirect是重定向; 2、请求转发是服务器将客户端的请求转发到另一个地址去处理,然后将响应返回给客户端;实际上是1次请求,1次响应,对客户端而言是透明的;而重定向是服务器根据客户端发来的请求,返回给客户端一个新的地址,客户端根据这个返回的地址再发送请求,得到响应;实际上是2次请求,2次响应,而且客户端的地址是第二次访问的地址; 3、转发只能转发到自己的资源,重定向无限制。 转发的效率高于重定向 转发核心代码:r“资源地址”.forward(request,response); 重定向核心代码:response.sendRedirect(“地址”);JSP是Java Server Page的简称是由Sun公司倡导简历的一种动态网页技术标准 jsp有哪些内置对象? JSP共有以下9个内置的对象: page、config、application、request、response、session、out、exception、pageContext pageContext:通过该对象可以获取其他对象; out:输出服务器响应的输出流对象; config:Web应用的配置对象; exception:封装页面抛出异常的对象。 讲解JSP中的四种作用域。 JSP的四大作用域:page、request、session、applicationpage:变量只能在当前页面上生效 request:变量能在一次请求中生效,一次请求可能包含一个页面,也可能包含多个页面,比如页面A请求转发到页面B session:代表变量能在一次会话中生效,基本上就是能在web项目下都有效。一般来说,只要浏览器不关闭,session的使用就不会受到影响。 application:代表应用程序范围。 数据:对象“名字”,数据); 取出数据:对象“名字”); Session和Cookie的区别? 1、Session和Cookie都是会话跟踪技术; 2、Session是保存在服务器端的技术(保持用户登录状态的检查常用Session),而Cookie是保存在客户端的技术; 常用的Web服务器有哪些 1.Tomcat 目前非常流行的Tomcat服务器是Apache-Jarkarta开源项目中的一个子项目,是一个小型、轻量级的支持JSP和Servlet 技术的Web服务器,也是初学者学习开发JSP应用的首选。 2.JBoss JBoss是一个种遵从JavaEE规范的、开放源代码的、纯Java的EJB服务器,对于J2EE有很好的支持。JBoss采用JML API实现软件模块的集成与管理,其核心服务又是提供EJB服务器,不包含Servlet和JSP的Web容器,不过它可以和Tomcat完美结合 3.WebLogic WebLogic 是BEA公司的产品(现在已经被Oracle收购)。WebLogic 支持企业级的、多层次的和完全分布式的Web应用,并且服务器的配置简单、界面友好。 什么是Servlet。 在Java Web程序中,Servlet主要负责接收用户请求 HttpServletRequest,在doGet(),doPost()中做相应的处理,并将回应HttpServletResponse反馈给用户。Servlet 可以设置初始化参数,供Servlet内部使用。一个Servlet类只会有一个实例,在它初始化时调用init()方法,销毁时调用destroy()方法。Servlet需要在web.xml中配置,一个Servlet可以设置多个URL访问。 JSP和Servlet是什么区别和联系。 1.jsp经编译后就变成了Servlet. (JSP的本质就是Servlet,Web容器将JSP的代码编译成java类) 2.jsp更擅长表现于页面显示Servlet更擅长于逻辑控制. 3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到。 答题技巧:可根据个人实际情况,增加各类框架在web.xml内的配置代码,如struts2 过滤器配置,spring 监听器配置,springmvc Servlet配置等. EL的隐式对象包括: pageContext、 initParam(访问上下文参数)、 param(访问请求参数)、 paramValues、 header(访问请求头)、 headerValues、 cookie(访问cookie)、 applicationScope(访问application作用域)、 sessionScope(访问session作用域)、 requestScope(访问request作用域)、 pageScope(访问page作用域)。 使用标签库的好处包括以下几个方面: - 分离JSP页面的内容和逻辑,简化了Web开发; - 开发者可以创建自定义标签来封装业务逻辑和显示逻辑; - 标签具有很好的可移植性、可维护性和可重用性; <% Java代码 %> 表达式语言(EL)支持哪些运算符。 EL表达式的操作符主要有: 算术运算符、关系运算符、逻辑运算符、验证运算符empty、条件运算符 算术运算符主要有平时常用的“+”、“-”、“”、“/”、“%”?。 关系运算符主要有“==”、“!=”、“<”、“>”、“<=”、“>=” &&”、“||”、“!”?。 验证运算符“empty” 条件运算符“?:” 答题技巧: 先说明支持分类,然后对每一类运行符说明具体运算符, 表达式控制标签:out、set、remove、catch 流程控制标签:if、choose、when、otherwise 循环标签:forEach、forTokens URL操作标签:import、url、redirect 答题技巧:不要求写出全部标签,写自己真实用过,理解最深的标签,适当附上示例代码 1、静态包含属于编译期包含(包含页面和被包含的页面在编译期形成一个jsp文件),动态包含属于运行期包含(包含页面和被包含的页面分别编译成两个文件,然后运行时把两个文件组装起来); 如何设置请求的编码以及响应内容的类型。 通过请求对象(ServletRequest)的setCharacterEncoding(String)方法可以设置请求的编码,其实要彻底解决乱码问题就应该让页面、服务器、请求和响应、Java程序都使用统一的编码,最好的选择当然是UTF-8;通过响应对象(ServletResponse)的setContentType(“text/html;charset=utf-8”)方法可以设置响应内容的类型,当然也可以通过HttpServletResponse对象的setHeader(String, String)方法来设置。7.3 数据持久化部分 ORM是对象-关系映射(Object-Relational Mapping,简称ORM) 是java中框架的一种思想这种思想常见的框架有yBatis、ibernate等。其是建立java中类(类)数据表之间的映射关系,然后通过反射的思想,动态获取类中的属性,此时属性对应了表中的列,所以能够动态产生从而达到操作数据库目的。 dao全称是data access object,数据库访问对象,主要的功能就是用于进行数据操作的,在程序的标准开发架构中属于数据层的操作 DAO组成 在整个DAO中实际上都是以接口为操作标准的,即:客户端依靠DAO实现的接口进行操作,而服务端要将接口进行具体的实现。DAO由以下几个部分组成。 1.DatabaseConnection:专门负责数据库的打开与关闭操作的类 2.VO:主要由属性、setter、getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录; 3.DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如:增加、修改、删除、按ID查询等; 4.Impl : DAO接口的真实实现类,完成具体的数据库操作,但是不负责数据库的打开和关闭; 5 ?Proxy :代理实现类,主要完成数据库的打开和关闭,并且调用真实实现类对象的操作 6 ?Factory :工厂类,通过工厂类取得一个DAO的实例化对象 例如:商品和订单、学生和课程都是典型的多对多关系。首先在数据库表中需要通过第三关系表来进行的维护,该关系表中主要包含了两个外键。代码中实现根据框架的不同也有不同的实现方式,比如 谈一下你对继承映射的理解。 继承关系的映射策略有三种: ① 每个继承结构一张表(table per class hierarchy),不管多少个子类都用一张表。 ② 每个子类一张表(table per subclass),公共信息放一张表,特有信息放单独的表。 ③ 每个具体类一张表(table per concrete class),有多少个子类就有多少张表。 第一种方式属于单表策略,其优点在于查询子类对象的时候无需表连接,查询速度快,适合多态查询;缺点是可能导致表很大。后两种方式属于多表策略,其优点在于数据存储紧凑,其缺点是需要进行连接查询,不适合多态查询。 什么是Mybatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。 1.#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。 2.$将传入的数据直接显示生成在sql中。 3.#方式能够很大程度防止sql注入。 4.$方式无法防止Sql注入。 5.$方式一般用于传入数据库对象 6.一般能用#的就别用$ 注意: 如果将表名、列名作为参数的动态功能操作时必须使用而不能使用如MyBatis排序时使用order?by?动态参数时需要 MyBatis中的动态SQL是什么意思? MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑一般我们的apper.xml映射文件中使用MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach N+1问题主要是表中的问题,在查询的时候了association标签进行关联数据时如果使用了的select方式,则造成问题解决方案是: 第一种方法是使用一条关联的SQL语句一次性查询出需要的数据。 第二种方法是使用MyBatis的延迟加载机制在具体使用到的时候再去数据 Mybatis 动态SQL相关标签作用及含义? 1.MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 2.MyBatis中用于实现动态SQL的元素主要有 if choose(when,otherwise) trim where set foreach 可以看出MyBatis的动态SQL的标签元素和接近JSP中的JSTL语法,下面我就分别详细的介绍一下 3.动态SQL中if的用法 4.动态SQL中choose用法 5.动态SQL中where语句的作用主要是简化SQL语句中where中的条件判断的 注意: where元素的作用是给SQL语句添加一个条件判断. 如果输出后是and 开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上 6.动态SQL中set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的 7.动态SQL中foreach 主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。 foreach元素的属性主要有item,index,collection,open,separator,close 8.动态SQL中trim语句 JDBC是java进行数据库操作时技术统称,提供了很多但是编写的代码非常繁琐麻烦,创建一个以JDBC连接数据库的程序,包含7个步骤: 1、加载JDBC驱动程序: Class“com.mysql.jdbc.Driver”) 2、提供JDBC连接的URL “jdbc:mysql://localhost:3306/数据库名” 3、创建数据库的连接 Connection conn = DriverManager.getConnection(“URL”,”root”,”123456”) 4、创建一个sql命令的Statement PreparedStatement pstmt = conn.prepareStatement(sql); 5、执行SQL语句 pstmt.executeUpdate() (返回int为影响的行数 2(返回ResultSet为查询的结果集 6、读取结果 while(rst.next()) 7、关闭JDBC对象 1)数据库连接池技术主要是提高应用程序和数据库交互时性能问题,因为连接数据库是非常耗费资源的,如果每个操作都去频繁连接和断开,则会造成巨大的开销,连接池技术即系统初始化时就创建一系列的连接对象放入集合中,需要连接数据库时连接池中取出使用,使用完毕归给连接池,这样的目的是提高同一个的可重用性。 java中很多框架,比如dbcp、c3p0我个人比较喜欢使用阿里的druid连接池性能稳定,功能强大。 一般使用时添加maven引用 1、MySQL:3306 2、Oracle:1521 3、SQL Server:1433 atis中如何实现分页 分页的目的是减少一次性查询出数据的额外开销,提高应用的性能。 Mybatis中可以使用如下几种方案: sql语句分页,利用传递的页码和每页显示数,使用limit分页 mybatis拦截器分页 atis中如何实现 Mybatis要求我们自己完成sql语句对查询的类进行映射,默认情况下如果类和实体属性一致,则可以直接使用reusltType进行关联映射,如果,则需要自定义resultMap进行映射说明。当然数据库列是下划线,而java中是驼峰命名,则可以在mybatis主配置中添加驼峰命名的全局setting配置即可。 atis中使用流程 首先项目中加入mybatis的依赖如maven的pom.xml中添加 并mybatis-config.xml核心配置文件(全局属性、别名、数据库连接、注册的apepr等) 实体类和数据表映射 功能操作接口,完成方法 抽象方法完成对应的apper.xml中的映射或者使用注解实现 时配置,产生qlSessionFactory对象,然后调用openSession方法获取qlSession,然后拿到appper接口代理对象,方法完成操作。 会话 atis中如何实现 一般使用 association>标签进行的对象映射 collection>标签进行一对多的集合关联映射 映射时候可以采用一次性查询出结果()映射,也可以采用嵌套的select查询方式。 描述atis中 MyBatis的:屏蔽jdbc api的底层访问细节;定制sql自定义映射,和将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。mybatis很好的跟spring。 Mybatis的缺点: 请描述atis如何进行批量操作 mybatis中提供了foreach>标签,可以对集合、数组进行循环,从而实现动态的批量操作。 描述atis如何获取自增的主键值 Mybatis中可以在insert>标签中添加usegeneratedkeys=”true” keyproperty=” id”获取自增后的主键值比如操作时的实体对象没有id,调用带有该属性的增加操作后,则会将自增主键放入实体对象中 也可以在标签中使用selectKey>标签查询获取自增主键列数据。 描述atis的Mapper功能方法参数 Mybatis如果参数是一个,或者实体对象,则直接可以使用的数据,那么如果是实体对象,但是多个参数,实现如下: 使用ap集合封装传递的多个参数,map有键名称 使用@Param注解实现名的标注。 MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 MyBatis中用于实现动态SQL的元素主要有: if choose(when,otherwise) trim where set foreach Session加载实体对象的步骤是:? Session在调用数据库查询功能之前,首先会在一级缓存中通过实体类型和主键进行查找,如果一级缓存查找命中且数据状态合法,则直接返回;? 如果一级缓存没有命中,接下来Session会在当前NonExists记录(相当于一个查询黑名单,如果出现重复的无效查询可以迅速做出判断,从而提升性能)中进行查找,如果NonExists中存在同样的查询条件,则返回null;? 如果一级缓存查询失败则查询二级缓存,如果二级缓存命中则直接返回;? 如果之前的查询都未命中,则发出SQL语句,如果查询未发现对应记录则将此次查询添加到Session的NonExists中加以记录,并返回null;? 根据映射配置和SQL语句得到ResultSet,并创建对应的实体对象;? 将对象纳入Session(一级缓存)的管理;? 如果有对应的拦截器,则执行拦截器的onLoad方法;? 如果开启并设置了要使用二级缓存,则将数据对象纳入二级缓存;? 返回数据对象。 第一种方法是使用一条SQL语句?第二种方法是使用MyBatis的延迟加载机制1.MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。 2.MyBatis中用于实现动态SQL的元素主要有 if choose(when,otherwise) trim where set foreach 可以看出MyBatis的动态SQL的标签元素和接近JSP中的JSTL语法,下面我就分别详细的介绍一下 3.动态SQL中if的用法4.动态SQL中choose用法5.动态SQL中where语句的作用主要是简化SQL语句中where中的条件判断的注意: where元素的作用是给SQL语句添加一个条件判断. 如果输出后是and 开头的,MyBatis会把第一个and忽略,当然如果是or开头的,MyBatis也会把它忽略;此外,在where元素中你不需要考虑空格的问题,MyBatis会智能的帮你加上6.动态SQL中set元素主要是用在更新操作的时候,它的主要功能和where元素其实是差不多的7.动态SQL中foreach主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。 foreach元素的属性主要有item,index,collection,open,separator,close8.动态SQL中trim语句创建一个以JDBC连接数据库的程序,包含7个步骤: 1、加载JDBC驱动程序: Class“com.mysql.jdbc.Driver”) 2、提供JDBC连接的URL “jdbc:mysql://localhost:3306/名” 3、创建数据库的连接 Connection conn = DriverManager.getConnection(“URL”,”root”,”123456”) 4、创建一个Statement PreparedStatement pstmt = conn.prepareStatement(sql); 5、执行SQL语句 pstmt.executeUpdate() (int 查询 pstmt.executeQuery()(ResultSet 6、处理结果 while(rst.next()) 7、关闭JDBC对象 1、事务是一系列的数据库操作,是数据库应用的基本逻辑单位,事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。 ?原子性(atomicity) 一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。 一致性(consistency) 事务必须是使数据库从一个一致性状态变到另一个一致性状态。 隔离性(isolation) 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 持久性(durability) 持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 1、数据库连接池技术,就是数据库启动时会建立一定数量的数据库连接(也称为池连接),并一直维持不少于此数目的池连接。 2、客户端程序需要连接数据库时,数据库连接池会返回一个未使用的池连接给数据库使用。如果当前没有空闲连接,数据库连接池就新建一定数量的连接。当使用的池连接调用完成后,连接池将此连接表记为空闲,其他调用就可以使用这个连接。这样做的目的是提高了应用程序访问数据库的性能。 7.4 流行框架与技术 Maven是一个项目管理工具,它包含了一个项目对象模型 (Project Object Model),一组标准集合,一个项目生命周期(Project Lifecycle),一个依赖管理系统(Dependency Management System),和用来运行定义在生命周期阶段(phase)中插件(plugin)目标(goal)的逻辑。当你使用Maven的时候,你用一个明确定义的项目对象模型来描述你的项目,然后Maven可以应用横切的逻辑,这些逻辑来自一组共享的(或者自定义的)插件。 Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉 Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。遍历生命周期旅途中的一个影响就是,Maven 运行了许多默认的插件目标,这些目标完成了像编译和创建一个 JAR 文件这样的工作。 此外,Maven能够很方便的帮你管理项目报告,生成站点,管理JAR文件,等等。 什么是SVN。 SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。 什么是GIT。 Git(读音为/g?t/。)是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。[1] Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Java常用构建工具区别(ant,maven,gradle区别)。 Java世界中主要有三大构建工具:Ant、Maven和Gradle 目前:Ant已经销声匿迹、Maven也没落了,而Gradle的发展则如日中天。 Maven的主要功能主要,分别是依赖管理系统、多模块构建、一致的项目结构、一致的构建模型和插件机制。 Maven为Java世界引入了一个新的依赖管理系统。在Java世界中,可以用groupId、artifactId、version组成的Coordination(坐标)唯一标识一个依赖。任何基于Maven构建的项目自身也必须定义这三项属性,生成的包可以是Jar包,也可以是war包或者ear包。一个典型的依赖引用如下所示: Gradle在设计的时候基本沿用了Maven的这套依赖管理体系。不过它在引用依赖时还是进行了一些改进。首先引用依赖方面变得非常简洁。 第二,Maven和Gradle对依赖项的scope有所不同。在Maven世界中,一个依赖项有6种scope,分别是complie(默认)、provided、runtime、test、system、import。而grade将其简化为了4种,compile、runtime、testCompile、testRuntime。那么如果想在gradle使用类似于provided的scope怎么办?别着急,由于gradle语言的强大表现力,我们可以轻松编写代码来实现类似于provided scope的概念(例如How to use provided scope for jar file in Gradle build?)。 第三点是Gradle支持动态的版本依赖。在版本号后面使用+号的方式可以实现动态的版本管理。 第四点是在解决依赖冲突方面Gradle的实现机制更加明确。 其实Git和SVN还是挺像的,都有提交,合并等操作,看来这是源码管理工具的基本操作。 1. Git是分布式的,SVN是集中式的,好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,一段时间后再提交、合并,也可以不用联网在本地提交; 2. Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网; 3. Git鼓励分Branch,而SVN,说实话,我用Branch的次数还挺少的,SVN自带的Branch merge我还真没用过,有merge时用的是Beyond Compare工具合并后再Commit的; 4. Tortoise也有出Git版本,真是好东西; 5. SVN在Commit前,我们都建议是先Update一下,跟本地的代码编译没问题,并确保开发的功能正常后再提交,这样其实挺麻烦的,有好几次同事没有先Updata,就 Commit了,发生了一些错误,耽误了大家时间,Git可能这种情况会少些。 1、M:Model 模型层 主要用来处理业务逻辑,承载数据; 2、V:View 视图层 主要用来做页面显示的 3、C:Control 控制层 主要用来进行业务流程控制; 4、常用的MVC框架包括:Struts、Struts2、SpringMVC; 1、客户端发送一个指向Servlet容器(例如Tomcat)的请求 2、这个请求经过一系列的过滤器(Filter) 3、接着控制器FilterDispatcher被调用是trutsPrepareAndExecuteFilter过滤器,将request中所携带的数据放入值栈(ValueStack); 4、 询问ActionMapper来决定这个请求是否需要调用某个Action,把请求的处理交给ActionProxy; 5、 ActionProxy通过Configuration Manager询问框架的配置文件(struts.xml),找到调用的Action类; 6、 ActionProxy创建一个ActionInvocation的实例; 7、 ActionInvocation在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用; 8、 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果(JSP显示结果)。 1.AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种思想。 2利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 当项目中需要编写大量相同功能重复代码时,可以考虑使用AOP的形式来实现。如声明式事务管理、权限校验等。 备注:如果面试官问你是否用过AOP,一定要说用过(Spring的事务处理机制就是AOP的思想来实现的)——非常重要!!! 1.IOC是控制反转,DI是依赖注入,其基本含义差不多。 2IOC:原来创建对象的控制权是由我们自己来创建的,现在不再是由程序员创建了,由IOC容器为我们提供,这样带来的好处是,降低代码的耦合度,更加符合开闭原则; 备注:学生需要知道怎么在配置文件里配置相关信息,面试官可能会问。 1.Set注入 2构造器注入 在WebApp中获得XMLWebApplicationContext的步骤 1.在Web.xml中配置上下文载入器. 2.指定上下文载入器的配置文件. 3.获得应用上下文. springAOP主要通过Java 动态代理方式进行实现。 ? GCLIB代理 cglib(Code Generation Library)是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。 cglib封装了asm,可以在运行期动态生成新的class。 cglib用于AOP,jdk中的proxy必须基于接口,cglib却没有这个限制。 原理区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。 1如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP? 2如果目标对象实现了接口,可以强制使用CGLIB实现AOP? 3如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换 1.?IoC容器:IoC容器帮助应用程序管理对象以及对象之间的依赖关系,对象之间的依赖关系如果发生了改变只需要修改配置文件而不是修改代码,因为代码的修改可能意味着项目的重新构建和完整的回归测试。有了IoC容器,程序员再也不需要自己编写工厂、单例,这一点特别符合Spring的精神“不要重复的发明轮子”。 2.?AOP:面向切面编程,将所有的横切关注功能封装到切面(aspect)中,通过配置的方式将横切关注功能动态添加到目标代码上,进一步实现了业务逻辑和系统服务之间的分离。另一方面,有了AOP程序员可以省去很多自己写代理类的工作。 3.?MVC:Spring的MVC框架是非常优秀的,从各个方面都可以甩Struts?2几条街,为Web表示层提供了更好的解决方案。 4.?事务管理:Spring以宽广的胸怀接纳多种持久层技术,并且为其提供了声明式的事务管理,在不需要任何一行代码的情况下就能够完成事务管理。 用户请求首先发送到前端控制器DispatcherServlet,DispatcherServlet根据请求的信息来决定使用哪个页面控制器Controller(也就是我们通常编写的Controller)来处理该请求。找到控制器之后,DispatcherServlet将请求委托给控制器去处理。接下来页面控制器开始处理用户请求,页面控制器会根据请求信息进行处理,调用业务层等等,处理完成之后,会把结果封装成一个ModelAndView返回给DispatcherServlet。前端控制器DispatcherServlet接到页面控制器的返回结果后,根据返回的视图名选择相应的试图模板,并根据返回的数据进行渲染。最后前端控制器DispatcherServlet将结果jsp)返回给用户。 1. 事务简介: 事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性 事务就是一系列的动作,它们被当作一个单独的工作单元。这些动作要么全部完成,要么全部不起作用 2. 事务的四个关键属性(ACID) 原子性(atomicity):事务是一个原子操作,有一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用 一致性(consistency):一旦所有事务动作完成,事务就被提交。数据和资源就处于一种满足业务规则的一致性状态中 隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事物都应该与其他事务隔离开来,防止数据损坏 持久性(durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响。通常情况下,事务的结果被写到持久化存储器中 作为企业级应用程序框架,Spring在不同的事务管理API之上定义了一个抽象层。而应用程序开发人员不必了解底层的事务管理API,就可以使用Spring的事务管理机制。 Spring既支持编程式事务管理(也称编码式事务),也支持声明式的事务管理 编程式事务管理:将事务管理代码嵌入到业务方法中来控制事务的提交和回滚,在编程式事务中,必须在每个业务操作中包含额外的事务管理代码 声明式事务管理:大多数情况下比编程式事务管理更好用。它将事务管理代码从业务方法中分离出来,以声明的方式来实现事务管理。事务管理作为一种横切关注点,可以通过AOP方法模块化。Spring通过Spring AOP框架支持声明式事务管理。 如何在Spring配置文件中定义事务管理器: 声明对本地事务的支持: a)JDBC及iBATIS、MyBatis框架事务管理器 描述Spring 事务的属性。 在Spring中,声明式事务是通过事务属性来定义的,事务属性描述了事务策略如何应用到方法上。尽管Spring提供了多种声明式事务的机制,但是所有的方式都依赖这五个参数来控制如何管理事务策略。声明式事务通过传播行为,隔离级别,只读提示,事务超时及回滚规则来进行定义。 Spring事务的传播行为: 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。 事务的传播行为可以由传播属性指定。Spring定义了7种传播行为: 1Propagation.REQUIRED 方法被调用时自动开启事务,在事务范围内使用则使用同一个事务,否则开启新事务。? ?? ?? 2Propagation.REQUIRES_NEW 无论何时自身都会开启事务 3Propagation.SUPPORTS 自身不会开启事务,在事务范围内则使用相同事务,否则不使用事务 4Propagation.NOT_SUPPORTED 自身不会开启事务,在事务范围内使用挂起事务,运行完毕恢复事务 5Propagation.MANDATORY 自身不开启事务,必须在事务环境使用否则报错 6Propagation.NEVER 自身不会开启事务,在事务范围使用抛出异常 7Propagation.NESTED 如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按TransactionDefinition.PROPAGATION_REQUIRED 属性执行。需要JDBC3.0以上支持。 ?1. ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别另外四个与JDBC的隔离级别相对应 ?2. ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。 ?3. ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据 ?4. ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。 ????? 它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。 ?5. ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。 ????? 除了防止脏读,不可重复读外,还避免了幻像读。 Spring事务的只读 “只读事务”并不是一个强制选项,它只是一个“暗示”,提示数据库驱动程序和数据库系统,这个事务并不包含更改数据的操作,那么JDBC驱动程序和数据库就有可能根据这种情况对该事务进行一些特定的优化,比方说不安排相应的数据库锁,以减轻事务对数据库的压力,毕竟事务也是要消耗数据库的资源的。“只读事务”仅仅是一个性能优化的推荐配置而已,并非强制你要这样做不可。 Spring事务的事务超时 为了使应用程序更好的运行,事务不能运行太长的时间。因此,声明式事务的第四个特性就是超时。 Spring事务的回滚规则 默认情况下,事务只有在遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚,但是也可以声明事务在遇到特定的检查型异常时像遇到运行期异常那样回滚。同样,你还可以声明事务遇到特定的异常不回滚,即使这些异常是运行期异常。 1.创建独立的Spring应用程序 2.嵌入式的Tomcat,不需要部署war包 3.简化Maven配置 4.自动配置Spring 5.提供生产就绪型功能,如指标,健康检查,和外部配置 6.开箱即用,没有代码生成,也无需XML配置 - no:不进行自动装配,手动设置Bean的依赖关系。 - byName:根据Bean的名字进行自动装配。 - byType:根据Bean的类型进行自动装配。 - constructor:类似于byType,不过是应用于构造器的参数,如果正好有一个Bean与构造器的参数类型相同则可以自动装配,否则会导致错误。 - autodetect:如果有默认的构造器,则通过constructor的方式进行自动装配,否则使用byType的方式进行自动装配。 Spring中的自动装配有哪些限制? - 如果使用了构造器注入或者setter注入,那么将覆盖自动装配的依赖关系。 - 基本数据类型的值、字符串字面量、类字面量无法使用自动装配来注入。 - 优先考虑使用显式的装配来进行更精确的依赖注入而不是使用自动装配。 Spring JavaConfig 与Xml配置优缺点。 xml配置 优势:集中配置,代码配置分离更加方便管理 劣势:繁杂,编译期不容易发现错误 javaConfig配置 优势:代码简洁, 劣势:国内xml配置方式比较多,不容易被人接受 singleton prototype 多例即原型 Request 和http请求关联 S 会话 应用程序 ① Spring IoC容器找到关于Bean的定义并实例化该Bean。 ② Spring IoC容器对Bean进行依赖注入。 方法被调用。 ⑧ 当销毁Bean实例时,如果Bean实现了DisposableBean接口,则调用其destroy方法。 8.常规技术面试题(Web前端) 8.1 HTML、CSS基础 简述html、http、www、URL、web、W3C的意思 Html:超文本标记语言 http:超文本传输协议 www: 是环球信息网(World Wide Web)的缩写,也可以简称为Web,中文名字为“万维网”。 URL:统一资源定位器 web: 万维网 W3C:万维网联盟(World Wide Web Consortium,简称W3C) 介绍一下HTML的基本结构 标题 ...... 谈谈你了解的图片格式 主要有:jpg、gif、bmp、png等等,其中jpg的颜色最丰富,gif支持动态图片,png支持透明 HTML有哪些基本标签? 格式标签:段落、居中
、编号列表、项目列表、自定义列表、预定义格式、环绕标签、文本:h1-h6、font等等、图像: 、超链接 : marquee标签的作用?如何使用? marquee标签的主要作用是做滚动字幕,格式如下:…… 但是现在网页中很少使用marquee标签了,都会是使用js脚本或是前端的框架实现,效果会比marquee好的多。 HTML表格的基本结构与常用属性有哪些? 布局基本结构如下: 标题 列标题 ......单元格内容 ..... .....
常用属性如下: 1)border:边框 2)bordercolor:边框的颜色 3)width:宽度 4)height:高度 5)background:背景图片 6)bgcolor:背景颜色 7)align:水平对齐:可以取left|center|right 8)valign:垂直对齐:可以取top|middle|bottom 9)colspan:跨列合并 10)rowspan:跨行合并 11)cellpadding:内容与边框之间的距离,边距 12)cellspacing:边框与边框之间的距离,间距 CSS是什么?使用CSS有哪些优势? CSS是Cascading Style Sheets的英文缩写,即层叠样式表 CSS的优势: 1.实现了内容与表现的分离 2.实现了许多网页一起更新 3.减少网页的代码量,增加网页的浏览速度 CSS样式规则有哪几个部分组成? 由选择器、属性名、属性值组成 eg: p / 选择器 / { color:red; / 一条样式规则 / font-size:20px;/ 一条样式规则 / } 注意:样式规则之间用;隔开,属性名和属性值用:隔开 写CSS有哪几个位置? 写CSS有3个位置, (1)行内样式:<标签名 style=”属性1:值1; 属性2:值2;…”> (2)内部样式:在head标签里写 (3)外部样式: CSS样式的优先级 1.按 2.按 CSS样式文件引入的方式有哪些? link和@import的区别是? link连接方式和import导入方式,两者区别如下: 1)link链接时,不用写 2)import导入时,一定要写 3)一般而言,链接的效率要高于导入(因为导入样式表相当于是将所有的样式规则原样复制到当前源文件中,增加了代码量,从而影响了加载的速度) 边框样式常用属性有哪些? border-width:边框宽度 border-style:边框样式(虚线、实线、双线等) border-color:边框颜色 display属性有什么作用?它有哪些值? display:none 隐藏标签元素 display:inline 在同一行显示 display:block 以块状方式独占一行显示 常见的页面布局方式有哪些? 表格布局、框架布局、DIV+CSS布局 什么是框架布局?如何进行框架布局? 框架布局是采用frameset将浏览器窗口分成几个独立的窗口,分别显示不同的页面的布局方式。格式如下(假定做一个上下框架,并将下框架拆分为左右框架): 什么是DIV布局?DIV+CSS布局有哪些优点? DIV布局用DIV盒模型结构给各部分内容划分到不同的区块,然后用css来定义盒模型的位置、大小、边框、内外边距、排列方式等 优点如下: 表现和内容相分离 提高搜索引擎对网页的索引效率 代码简洁,提高页面浏览速度 易于维护和改版 分别介绍一下页面元素定位中的绝对定位、相对定位、流动定位、浮动定位,并阐述他们的区别 1)流动定位: 保持在标准文档流中原有的位置,元素是按从左往右,从上往下的顺序摆放, left,top等属性无效 2)相对定位: 相对定位是指相对于盒子元素原有的位置进行偏移,不会脱离标准文档流,也不对其他元素产生任何影响。需设定垂直方向和水平向的偏移量,分别是left、top、right、bottom。 3)绝对定位: 绝对定位是以某一个点为基准进行偏移。绝对定位是以最近的一个已定位的父级元素为基准,如果父级元素没有定位或没有父级元素,则以浏览器窗口为基准;会脱离标准文档流,不影响同一级的盒子元素位置。 4)浮动定位:只能设置水平方向上的定位,指内容停靠在容器的左边还是右边。垂直方向上不能设浮动定位。 盒子模型由哪几个部分组成? 盒子模型包含:margin(外补丁)、border(边框)、padding(内补丁)、content(内容) 谈一下DIV+CSS常见的背景特效? 鼠标悬停时使用background属性动态改变背景。滑动门特效 ,CSS Sprites等等,除了常见的特效外,H5和各种前端框架中也包含大量的背景特效并且实现也比较简单。 GBK,gb2312,UTF-8的区别 utf-8是基于unicode的国际化的场合适合使用 gb2312和gb2312都是国标码,出现的较早。主要用于编解码常用汉字。gb2312和gbk 的一个区别是 :gb2312出来得比较早,所以有一些汉字和繁体好象不支持。gbk是一个改进版。所以能用gbk的时候一般不用gb2312 谈谈你见过的浏览器不兼容问题?如何使用IETest? 1)以火狐代表的浏览器不支持如下用法: 1.document.all 2.unload事件 3.innerText属性 2)很多版本的浏览器不支持clear:both来清除浮动 3)各浏览器默认的margin和padding不同 {margin:0;padding:0;} 4)对盒子的解析标准不同 IETest安装之后,即可以使用,可用来检查当前代码在不同浏览器版本中的兼容性 一个200200的div在不同分辨率屏幕上下左右居中,用css实现 body{margin: 0;} #div1{ width:200px;height: 200px;position: absolute;background-color: aqua; left: 50%;top:50%;margin-left: -100px;margin-top: -100px;} display:none和visibility:hidden的区别是 1.display:none是彻底消失,不在文档流中占位,浏览器也不会解析该元素;visibility:hidden是视觉上消失了,可以理解为透明度为0的效果,在文档流中占位,浏览器会解析该元素; 2.使用visibility:hidden比display:none性能上要好,display:none切换显示时visibility,页面产生回流(当页面中的一部分元素需要改变规模尺寸、布局、显示隐藏等,页面重新构建,此时就是回流。所有页面第一次加载时需要产生一次回流),而visibility切换是否显示时则不会引起回流。 cellpadding:表示单元格边框与单元格内容的距离 cellspacing:表示单元格边框与另一个单元格边框的距离 html5有哪些新特性,如何处理html5对低版本的兼容问题 1. 拖拽释放(Drag and drop) API 2. 语义化更好的内容标签(header,nav,footer,aside,article,section) 3. 音频、视频API(audio,video) 4. 画布(Canvas) API 5. 地理(Geolocation) API 6. 本地离线存储 localStorage 长期存储数据,浏览器关闭后数据不丢失; 7. sessionStorage 的数据在浏览器关闭后自动删除 8. 表单控件,calendar、date、time、email、url、search 9. 新的技术webworker, websocket, Geolocation HTML5标签的兼容性解决方式: 1. 使用document.createElement(tag)来解决 2. 使用html5shiv库来兼容 JSON的理解 JSON:JavaScript Object Notation(JavaScript对象表示法) JSON是存储和交换文本信息的语法类似XML。 JSON比XML更小、更快、更容易解析。 图片懒加载,在页面上的未可视区域可以添加一个滚动条事件,判断图片位置与浏览器顶端的距离与页面的距离,如果前者小于后者,优先加载。 如果图片为css图片,可以使用CSSsprite,SVGsprite,Iconfont、Base64等技术。 如果图片过大,可以使用特殊编码的图片,加载时会先加载一张压缩的特别厉害的缩略图,以提高用户体验 如果图片展示区域小于图片的真实大小,则因在服务器端根据业务需要先行进行图片压缩,图片压缩后大小与展示一致。 CSS选择器 1.标签名选择器 div { color:Red;} /即页面中的各个标签名的css样式 2.类选择器 .divClass {color:Red;} /即定义的每个标签的class 中的css样式 3.ID选择器 #myDiv {color:Red;} /即页面中的标签的id 4.后代选择器(类选择器的后代选择器) .divClass span { color:Red;} /即多个选择器以逗号的格式分隔 命名找到准确的标签 5.群组选择器 div,span,img {color:Red} /即具有相同样式的标签分组显示 行类样式ID选择器标签选择器 1.减少代码量,提高网页的浏览速度 2.内容与表现分离,便于更新 3.有利于搜索引擎的搜索 表单的method方法有哪2种,解释他们的区别? post:可以发送大量数据,安全。 get :只能发送少量数据,不够安全,但是速度快。 font-size:大小 color:颜色 font-family:字体 font-weight:粗细 font-style:样式 行级标签和块状标签的区别? 行级标签:不会独占一行;大小根据内容自适应,设置width属性和height属性无效 块状标签:独占一行;可以设置width属性和height属性 HTML及CSS注释怎么表示? html注释: css注释:/ 注释内容 / css中内补丁和外补丁是什么意思,有什么作用 内补丁指:padding,对应内边距 外补丁指:margin,对应外边距 在HTML中,创建提交按钮、重置按钮和普通按钮的语句分别是? 提交按钮: 重置按钮: 普通按钮: 在HTML中,样式规则:margin:1px 2px;表示什么意思? margin表示修饰元素的外边距 上下外边距为1px,左右外边距为2px 在HTML中,样式规则:padding:1px 2px 3px 4px;表示什么意思? padding:表示修饰元素的 上内间距为1px,右内间距为2px,下内间距为3px,左内间距为4px 在HTML中,样式规则:margin:1px 2px 3px;表示什么意思? margin表示修饰元素的外边距8.2 JavaScript基础 JS有哪些数据类型 Number Boolean Null Undefined 谈一下你对JS的理解 特点: 1)寄生虫语言,必须嵌套在HTML中,以HTML为宿主 2)弱类型语言 3)基于对象(不是完全的OOP语言) 作用: 1)将以前必须在服务器端做的验证处理放在客户端运行,从而减轻了服务器的负担 2)增强了页面的交互性 说一下你对浏览器模型的理解 浏览器对象模型是用于描述对象与对象之间层次关系的模型,该对象模型提供了独立于内容的、可以与浏览器窗口进行互动的对象结构层次如下: JavaScript获取页面元素有哪四种常见的访问形式? 方法一:document.all.页面元素名称 方法二:document.表单名.元素名称 方法三:document.getElementBId("ID名称") 方法四:document.getElementsByName("元素名称") alert和confim有什么区别? 答:Alert是弹出提示消息框;Confirm是弹出确认框,根据用户的选择将返回ture或false 什么是JS内存泄露?如何处理? 答:内存泄露是指一块被分配的内存既不能使用,又不能回收,直到浏览器进程结束,由于浏览器垃圾回收方法有bug,会产生内存泄露。 常见的处理方法如下: 对浏览器对优化 对大规模的循环代码进行优化 尽量避免过多的引用层级和不必要的多次方法调用 尽量使用语言本身的构造和内建函数 尽量减少不必要的对象创建 谈一下你知道的JS事件,做项目时一般你在什么时候使用这些事件? 1.onload和onunload事件 ,页面加载和页面卸载时使用 2.onfocus、onblur、onsubmit和onchange事件,得到焦点,失去焦点,提交,内容改变时使用 3.onmouseover和onmouseout事件,鼠标进入和移出时使用 4.onClick事件,单击时使用 8.3 Ajaxl\jquery 基础 什么是ajax,为什么要使用Ajax(请谈一下你对Ajax的认识) 什么是ajax:AJAX直译为异步的JavaScript和XML,是一种异步提交、局部刷新的网页编程技术。 Ajax应用程序的优势在于: 1. 通过异步模式,提升了用户体验。 2. 优化了浏览器和服务器之间的传输,减少不必要的数据往返,减少了带宽占用。 3. Ajax引擎在客户端运行,承担了一部分本来由服务器承担的工作,从而减少了大用户量下的服务器负载。 Ajax的最大的特点是什么。 Ajax可以实现异步提交、局部刷新,这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。 HTTP状态 100-199用于指定客户端相应的某些动作。 200-299用于表示请求成功 300-399用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息 400-499用于支出客户端的错误 500-599用于支持服务错误 200服务器成功返回页面 404请求的网页不存在 503服务不可用 请介绍一下XmlHttpRequest对象? Ajax的核心是JavaScript对象XmlHttpRequest,它是一种支持异步请求的技术。XmlHttpRequest可以使得程序员使用JavaScript向服务器进行请求并处理响应,而不阻塞用户。通过XMLHttpRequest对象,Web开发人员可以在页面加载以后进行页面的局部更新。 Ajax技术体系的组成部分有哪些? HTML,css,dom,xml,xmlHttpRequest,javascript AJAX应用和传统Web应用有什么不同? 在传统的Web应用的请求/响应为同步模式。即当服务器端在处理客户端请求时,客户端需要等待,直到服务器端响应返回后,客户端才能继续执行。 而AJAX应用的请求/响应为异步模式,即当服务器端在处理客户端请求时,客户端无须等待可以继续执行;当服务器端响应返回后,客户端进行局部刷新。 AJAX请求总共有多少种CALLBACK Ajax请求总共有八种Callback onSuccess onFailure onUninitialized onLoading onLoaded onInteractive onComplete onException Ajax和javascript的区别? javascript是一种在浏览器端执行的脚本语言,Ajax是一种创建交互式网页应用的开发技术 ,它是利用了一系列相关的技术其中就包括javascript。 在浏览器端如何得到服务器端响应的XML数据 XMLHttpRequest对象的responseXMl属性 XMLHttpRequest对象在IE和Firefox中创建方式有没有不同? IE中通过new ActiveXObject()创建,Firefox中通过new XMLHttpRequest()创建 介绍一下XMLHttpRequest对象的常用方法和属性(回答的越多越好) open()方法:建立对服务器的调用。 send()方法:发送具体请求 abort()方法:停止当前请求 readyState属性:返回请求的状态 responseText属性:服务器端响应的文本 reponseXML属性:服务器端响应的XML Status:服务器的HTTP状态码 Ajax的优点和缺点 优点: 1、改善用户体验 2、减少带宽占用,及降低服务器端处理开销 缺点: 1、破坏了浏览器的前进、后退功能 2、对搜索引擎不友好 3、存在浏览器兼容性问题 什么是XML XML是可扩展标记语言,用于跨平台的数据存储和交互。 XML文件格式是纯文本格式,在许多方面类似于HTML,XML由XML元素组成,每个XML元素包括开始标记结束标记以及两个标记之间的内容。 XML与HTML区别 (1)可扩展性方面:HTML不允许用户自行定义他们自己的标识或属性,而在XML中,用户能够根据需要自行定义新的标识及属性名,以便更好地从语义上修饰数据。 (2)结构性方面:HTML不支持深层的结构描述,XML的文件结构嵌套可以复杂到任意程度,能表示面向对象的等级层次。 (3)可校验性方面:HTML没有提供规范文件以支持应用软件对HTML文件进行结构校验,而XML文件可以包括一个语法描述,使应用程序可以对此文件进行结构校验。 如果熟悉某种ajax框架,他可能会问到怎样在程序中使用这种框架 ASP.NETAjax集成了一套客户端脚本库使得与功能丰富的、基于服务器开发平台的ASP.NET结合在一起。其服务器端编程模型相对于客户端编程模型较为简单,而且容易与现有的ASP.NET程序相结合,通常实现复杂的功能只需要在页面中拖几个控件,而不必了解深层次的工作原理,除此之外服务器端编程的ASP.NETAJAXControlToolkit含有大量的独立AJAX控件和对ASP.NET原有服务器控件的AJAX功能扩展。 16,介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用? $() 方法是在DOM中使用过于频繁的 document.getElementById() 方法的一个便利的简写,就像这个DOM方法一样,这个方法返回参数传入的id的那个元素。 $F()函数是另一个大收欢迎的“快捷键”,它能用于返回任何表单输入控件的值,比如text box,drop-down list。这个方法也能用元素id或元素本身做为参数。 $A()函数能把它接收到的单个的参数转换成一个Array对象。 介绍一下XMLHttpRequest对象 通过XMLHttpRequest对象,Web开发人员可以在页面加载以后进行页面的局部更新。 AJAX开始流行始于Google在2005年使用的”Google Suggest”。 “Google Suggest”就是使用XMLHttpRequest对象来创建动态的Web接口: 当用户开始输入google的搜索框,Javascript发送用户输入的字符到服务器,然后服务器返回一个建议列表。 XMLHttpRequest对象在IE5.0+, Safari 1.2, Mozilla 1.0/Firefox, Opera 8+ 和NetScapt7 开始被支持。 AJAX应用和传统Web应用有什么不同? 在传统的Javascript编程中,如果想得到服务器端数据库或文件上的信息,或者发送客户端信息到服务器,需要建立一个HTML form然后GET或者POST数据到服务器端。用户需要点击”Submit”按钮来发送或者接受数据信息,然后等待服务器响应请求,页面重新加载。 因为服务器每次都会返回一个新的页面, 所以传统的web应用有可能很慢而且用户交互不友好。 使用AJAX技术, 就可以使Javascript通过XMLHttpRequest对象直接与服务器进行交互。 通过HTTP Request, 一个web页面可以发送一个请求到web服务器并且接受web服务器返回的信息(不用重新加载页面),展示给用户的还是通一个页面,用户感觉页面刷新,也看不到到Javascript后台进行的发送请求和接受响应。 8.4 前端 图片默认有间距几个img标签放在一起的时候,有些浏览器会有默认的间距。 解决: 使用float属性为img布局 标签最低高度设置min-height不兼容因为min-height本身就是一个不兼容的CSS属性,所以设置min-height时不能很好的被各个浏览器兼容 如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-height:200px; height:auto !important; height:200px; overflow:visible;}透明度的兼容CSS设置IE:filter:alpha(opacity=50) 非E:opacity:0.5 IE ol的序号全为1, 不递增解决: li设置样式{display: list-item}文件合并 文件最小化/文件压缩 使用 CDN 托管 缓存 css文件放置在head,js放置在文档尾 css sprites 图片延迟加载 书写代码的时候注意优化 现在的主要浏览器:IE、Firefox、Safari、Chrome、Opera。它们的浏览器内核(渲染引擎): IE--Trident、 FF(Mozilla)--Gecko、 Safari--Webkit、 Chrome--Blink(WebKit的分支)、 Opera--原为Presto,现为Blink。 文件加载顺序 浏览器加载页面上引用的CSS、JS文件、图片时,是按顺序从上到下加载的,每个浏览器可以同时下载文件的个数不同,因此经常有网站将静态文件放在不同的域名下,这样可以加快网站打开的速度。 reflow 在加载JS文件时,浏览器会阻止页面的渲染,因此将js放在页面底部比较好。因为如果JS文件中有修改DOM的地方,浏览器会倒回去把已经渲染过的元素重新渲染一遍,这个回退的过程叫reflow。 CSS文件虽然不影响js文件的加载,但是却会造成阻塞。因为js代码执行前,浏览器必须保证css文件已下载和解析完成。 办法:当js文件不需要依赖css文件时,可以将js文件放在头部css的前面。 repaint repaint(重绘)和reflow相似,在元素改变样式的时候触发,这个比reflow造成的影响要小,所以能触发repaint解决的时候就不要触发reflow 为什么利用多个域名来请求网络资源会更有效? 动静分离需求使用不同的服务器处理请求处理动态内容的只处理动态内容,提高效率。 突破浏览器并发限制:浏览器同一时间针对同一域名下的请求有一定数量限制超过限制数目的请求会被阻止。 Cookieless节省带宽。的每次,都会带上自己的cookie 。 节约主域名的连接数,从而提高客户端网络带宽的利用率,优化页面响应。 避免不必要的安全问题( 上传js窃取主站cookie之类的)前端开发的优化问题: ? ? (1)减少http请求次数:css spirit,data uri ? ? ? ?(2)JS,CSS源码压缩 ? ? ? ?(3)前端模板 JS+数据,减少由于HTML标签导致的带宽浪费,前端用变量保存AJAX请求结果,每次操作本地变量,不用请求,减少请求次数 ? ? ? ?(4)用innerHTML代替DOM操作,减少DOM操作次数,优化javascript性能 ? ? ? ?(5)用setTimeout来避免页面失去响应 ? ? ? ?(6)用hash-table来优化查找 ? ? ? ?(7)当需要设置的样式很多时设置className而不是直接操作style? ? ? ? ?(8)少用全局变量 ? ? ? ?(9缓存DOM节点查找的结果 ? ? ? ?(10)避免使用CSS Expression ? ? ? ?(11)图片预载 ? ? ? ?(12)避免在页面的主体布局中使用table,table要等其中的内容完全下载之后才会显示出来,显示比div+css布局慢 如何控制网页在网络传输过程中的数据量 ? ? ?? (1)启用GZIP压缩 ? ? ?? (2)保持良好的编程习惯,避免重复的CSSJavaScript代码多余的HTML标签和属性 Ajax的优势 (1) 可搜索型 (2) 开放性 () 易用性 () 易于开发 Flash的优势 ()多媒体处理 (2) 兼容性 (3) 矢量图形比SVG,Canvas优势大很多 (4) 客户端资源调度,比如麦克风,摄像头 不同浏览器的标签默认的外补丁和内补丁不同. ?即随便写几个标签, 在不加样式控制的情况下, 各自的margin和padding差异较大. 解决方法: CCS里: ? {margin:0; padding:0}行内属性标签,设置display:block后采用float布局,又有横行的margin的情况,IE6间距bug在display:block;后面加入display:inline;display:table;图片默认有间距几个img标签放在一起的时候,有些浏览器会有默认的间距,加了问题一中提到的通配符也不起作用。 解决: 使用float属性为img布局 标签最低高度设置min-height不兼容因为min-height本身就是一个不兼容的CSS属性,所以设置min-height时不能很好的被各个浏览器兼容 如果我们要设置一个标签的最小高度200px,需要进行的设置为:{min-height:200px; height:auto !important; height:200px; overflow:visible;} 透明度的兼容CSS设置IE filter:alpha(opacity=0-100) 非E opacity:0-1 ie6,7不支持display:inline-block 解决方法: 设置inline并触法haslayout display:inline-block; display:inline; zoom:1?前端:负责View和Controller层。 后端:只负责Model层,业务处理/数据等。 porxy代理 (2)CORS 【Cross-Origin Resource Sharing】 (3) json 8.5 CSS扩展 CSS3新特性 新增各种CSS选择器 ? 圆角border-radiuis 多列布局 阴影和反射 文字特效 线性渐变 旋转缩放定位倾斜动画多背景 什么是无样式内容闪烁?如何避免? 如果使用import方法对CSS进行导入,会导致某些页面在Internet Explorer以无样式显示页面内容的瞬间闪烁这种现象称之为文档样式短暂失效简称为FOUC。 原因当样式表晚于结构性html加载,当加载到此样式表时,页面将停止之前的渲染。此样式表被下载和解析后,将重新渲染页面,也就出现了短暂的花屏现象。 使用LINK标签将样式表放在文档HEAD中。 浮动可以理解为让某个div元素脱离标准流,漂浮在标准流之上,和标准流不是一个层次。 假如某个div元素A是浮动的,如果A元素上一个元素也是浮动的,那么A元素会跟随在上一个元素的后边(如果一行放不下这两个元素,那么A元素会被挤到下一行);如果A元素上一个元素是标准流中的元素,那么A的相对垂直位置不会改变,也就是说A的顶部总是和上一个元素的底部对齐。 清除浮动是为了清除使用浮动元素产生的影响。浮动的元素,高度会塌陷,而高度的塌陷使页面后面的布局不能正常显示。清除浮动?clear: none | left | right |?both。这个只能影响使用清除的元素本身,不能影响其他元素。 在浮动元素后面添加空标签 clear:both 给父标签使用overflow: hidden/auto;zoom:1 父级div定义, 使用伪类:after和zoom zoom是IE浏览器设置或检索对象的缩放比例。当设置了zoom的值之后,所设置的元素就会扩大或缩小,高度宽度就会重新计算了也就解决了IE下子元素浮动时候父元素不随着自动扩大的问题。 CSS Sprites其实就是把网页中一些背景图片整合到一张图片文件中,再利用CSS的“background-image”,“background- repeat”,“background-position”的组合进行背景定位,background-position可以用数字能精确的定位出背景图片的位置。 功能限制的浏览器, 比如低版本IE, 手机浏览器, 等会在很多功能上不符合Web标准, 而应对方式主要有: 只提供符合Web标准的页面 提供另一个符合那些浏览器标准的页面 兼容: 两种思路: 渐进增强:?提供一个可用的原型,后来再为高级浏览器提供优化 优雅降级:?据高级浏览器提供一个版本,然后有功能限制的浏览器只需要一个刚好能用的版本 针对打印机的样式: @media print{...} 优点:? 结构清晰, 便于扩展 可以方便屏幕浏览器私有语法差异 可以轻松实现多重继承 完全兼容css代码 图片替代 web : fonts在线字库 @font-face 从后往前判断浏览器先产生一个元素集合,这个集合往往由最后一个部分的索引产生(如果没有索引就是所有元素的集合)。然后向上匹配,如果不符合上一个部分,就把元素从集合中删除,直到个选择器都匹配完,还在集合中的元素就匹配这个选择器了。 reset.css能够重置浏览器的默认属性。不同的浏览器具有不同的样式,重置能够使其统一。比如说ie浏览器和FF浏览器下button显示不同,通过reset能够统一样式,显示相同的效果。 block元素会独占一行, inline元素不会独占一行, 宽度随元素的内容而变化 block元素可以设置width, height属性inline元素设置width, height无效 block元素可以设置margin和padding属性inline元素的margin和padding属性方向 block可以包含inline和block元素而inline元只能包含inline元素 display: inline-block, 则是将对象呈现为inline对象, 但是对象的内容作为block对象呈现比如我们可以给一个link(a元素)inline-block的属性, 使其既有block的高宽特性又有inline的同行特性 css动画和js动画的优缺点 CSS3的动画 优点: 1.在性能上会稍微好一些,浏览器会对CSS3的动画做一些优化 2.代码相对简单 缺点: 1.在动画控制上不够灵活 2.兼容性不好 3.部分动画功能无法实现(如滚动动画,视差滚动等) JavaScript的动画 优点: 1.控制能力很强,可以单帧的控制、变换 2.兼容性好,且功能强大。 缺点: 1.计算没有css快,另外经常需要依赖其他的库。 通过媒体查询可以为不同大小和尺寸的媒体定义不同的css,适合相应的设备显示;即响应式布局 @media screen and (min-width: 400px) and (max-width: 700px) { … } @media handheld and (min-width: 20em), screen and (min-width: 20em) { … } display:none或者visibility:hidden,overflow:hidden。 alt是img的特有属性, 或与 配合使用,规定图像的替代文本如果无法显示图像, 浏览器将显示替代文本。 itle为元素提供附加的提示信息,用于鼠标滑到元素上的时候显示。其值可以比alt属性值设置的更长 8.6 HTML扩展 文档类型(DOCTYPE) 作用:?doctype声明位于文档中最前面的位置,处于标签之前,告知浏览器使用的是哪种规范。 类型:?三种:?Strict、Transitional?以及?Frameset? 如果不声明:?浏览器不引入w3c的标准,那么早期的浏览器会按照自己的解析方式渲染页面。 XHTML较为严格,标签必须闭合,必须要body,head等 如果页面使用 ''application/xhtml+xml''?一些老的浏览器并不兼容 采用统一编码utf-8模式 data-为前端开发者提供自定义的属性,这些属性集可以通过对象的dataset属性获取,不支持该属性的浏览器可以通过 getAttribute方法获取。 1)Web Storage API 2)基于位置服务LBS 3)无插件播放音频视频 4)调用相机和GPU图像处理单元等硬件设备 5)拖拽和Form API cookie: cookie是网站为了标示用户身份而储存在用户本地上的数据cookie数据始终在同源的http请求中携带(即使不需要),会在浏览器和服务器间来回传递。 sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。 存储大小: cookie数据大小不能超过4k。 sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。 有时间: localStorage? ? 存储持久数据,浏览器关闭后数据不丢失除非主动删除数据; sessionStorage??数据在当前浏览器窗口关闭后自动删除。 cookie? ?? ?? ? 设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭 作用域不同: sessionStorage不在不同的浏览器窗口中共享,即使是同一个页面; localStorage 在所有同源窗口中都是共享的;cookie也是在所有同源窗口中都是共享的。 Web?Storage 支持事件通知机制,可以将数据更新的通知发送给监听者。 Web?Storage?的?api 接口使用更方便。 服务器端保存数据服务器端的,而浏览器端保存则把不同用户需要的数据分布保存在用户各自的浏览器中。 浏览器端一般只用来存储小数据,而服务器可以存储大数据。 服务器存储数据安全,浏览器只适合存储一般数据。 页面中一般的 js对象或数据的生存期是仅在当前页面有效,因此刷新页面或转到另一页面这样的重新加载页面的情况,数据就不存在了。 而sessionStorage 只要同源的同窗口(或tab)中,刷新页面或进入同源的不同页面,数据始终存在。 SVG是一种使用XML描述2D图形的语言 Canvas通过js来绘制2D图形 区别 Canvas支持分辨率, SVG不支持 Canvas不支持事件处理器, SVG支持 Canvas是基于位图的图像,它不能够改变大小, 只能缩放显示; SVG是基于矢量的, 所以它能够很好地处理图形大小的改变 Canvas适合像素处理, 动态渲染和大数据量绘制; SVG适合静态图片显示, 高保真文档查看和打印的应用场景 绘制Canvas对象后, 不能使用脚本和CSS对它进行修改; 而SVG对象是文档对象模型的一部分, 所以可以随时使用脚本和CSS修改它们 src指向外部资源的位置, 用于替换当前元素, 比如js脚本, 图片等元素 href指向网络资源所在的位置, 用于在当前文档和引用资源间确定联系, 加载css8.7 JavaScript扩展 apply和call的用法和区别: JavaScript中的每一个function对象都会有call和apply方法 举例: B.apply(A, arguments);即A对象B对象的方法 B.call(A, args1,args2);即A对象B对象的方法 apply最多只能有两个参数——新this对象和一个数组argArray call则可以传递多个参数,第一个参数和apply一样,是用来替换的对象,后边是参数列表 在js中,变量的并不是以代码块作为作用域的,而是以函数作为作用域。 全局作用域定义在所有函数之外的变量或者在函数中没有用var(不是重新赋值)的变量 变量局部作用域在函数体内部申明 局部变量的优先级高于同名的全局变量。如果在函数内声明一个局部变量或者函数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖 bind函数的兼容性 用法: bind()函数会创建一个新函数, 为绑定函数。当调用这个绑定函数时,绑定函数会以创建它时传入bind方法的第一个参数作为this,传入bind方法的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数. 一个绑定函数也能使用new操作符创建对象:这种行为就像把原函数当成构造器。提供的?this?值被忽略,同时调用时的参数被提供给模拟函数。 事件代理又称之为事件委托。是JavaScript中绑定事件的常用技巧,“事件代理”即是把原本需要绑定在子元素的响应事件(click、keydown......)委托给父元素,让父元素担当事件监听的职务。事件代理的原理是DOM元素的事件冒泡 解释下js中this是怎么工作的? this 在 JavaScript 中主要以下五种使用场景。 作为函数调用,this 绑定全局对象,浏览器环境全局对象为 window 。 内部函数的 this 也绑定全局对象,应该绑定到其外层函数对应的对象上,这是 JavaScript的缺陷,用that替换。 作为构造函数使用,this 绑定到新创建的对象。 作为对象方法使用,this 绑定到该对象。 使用apply或call调用 this 将会被显式设置为函数调用的第一个参数。 1. commonjs的目标是制定一个js模块化的标准,它的目标制定一个可以同时在客服端和服务端运行的模块 . AMD是为了弥补commonjs规范在浏览器中目前无法支持ES6的一种解决方案。异步模块定义规范(AMD)制定了定义模块的规则,这样模块和模块的依赖可以被异步加载 . cmd是commonjs另外的一种模块加载方案,这个规范本身偏向于common js的规范以一个文件就是一个模块和ES6中标准的commonjs规范类似 闭包是指有权访问另一个函数作用域中的变量的函数. 创建闭包常见方式,就是在一个函数内部创建另一个函数. 作用:? 匿名自执行函数??(function (){ ... })();???创建了一个匿名的函数,并立即执行它,由于外部无法引用它内部的变量,因此在执行完后很快就会被释放,关键是这种机制不会污染全局对象。 缓存, 可保留函数内部的值 实现封装 实现模板 伪数组 具有length属性 按索引方式存储数据 不具有数组的方法 伪数组存在的意义,是可以让普通的对象也能正常使用数组的很多算法 我们可以通过Array.prototype.slice.call(fakeArray)将伪数组转变为真正的Array对象: 返回新数组而不会修改原数组 null表示没有对象, 即此处不该有此值. 典型用法: (1) 作为函数的参数,表示该函数的参数不是对象。 (2) 作为对象原型链的终点。 ()ull可以作为空指针只要意在保存对象的值还没真正保存对象,就应该明确地让该对象保存null值. undefined表示缺少值, 即此处应该有值, 但还未定义. (1)变量被声明了,但没有赋值时,就等于undefined。 (2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。 (3)对象没有赋值的属性,该属性的值为undefined。 (4)函数没有返回值时,默认返回undefined。 undeclared即为被污染的命名, 访问没有被声明的变量, 则会抛出异常, 终止执行. 即undeclared是一种语法错误 从目标元素开始,往顶层元素传播。途中如果有节点绑定了相应的事件处理函数,这些函数都会被一次触发。如果想阻止事件起泡,可以使用e.stopPropagation()(Firefox)或者e.cancelBubble=true(IE)来组织事件的冒泡传播。 以function关键字开头的语句会被解析为函数声明,而函数声明是不允许直接运行的。 只有当解析器把这句话解析为函数表达式,才能够直接运行 (function foo(){ // code.. })() Attribute就是dom节点自带的属性,例如html中常用的id、class、title、align等它的值只能够是字符串 Property是这个DOM元素作为对象,其附加的内容,例如childNodes、firstChild等是JavaScript里的对象 执行时间不同 ready,表示文档结构已经加载完成(不包含图片等非文字媒体文件) onload,指示页面包含图片等文件在内的所有元素都加载完成 ready()可以在JavaScript代码中出现多次 load()只能在JavaScript代码中出现一次 执行的效率不同 如要在dom的元素节点中添加onclick属性节点,这时用$(document).ready()就要比用$(window).load()的效率高 什么是use strict? 其好处坏处分别是什么? 在所有的函数 (或者所有最外层函数) 的开始处加入 "use strict"; 指令启动严格模式。"严格模式"有两种调用方法 1)将"use strict"放在脚本文件的第一行,则整个脚本都将以"严格模式"运行。如果这行语句不在第一行,则无效,整个脚本以"正常模式"运行。如果不同模式的代码文件合并成一个文件,这一点需要特别注意。 2)将整个脚本文件放在一个立即执行的匿名函数之中。 好处 - 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为; - 消除代码运行的一些不安全之处,保证代码运行的安全; - 提高编译器效率,增加运行速度; - 为未来新版本的Javascript做好铺垫。 坏处 同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行 核心( ECMAScript) , 文档对象模型(DOM), 浏览器对象模型(BOM) DOM是针对HTML和XML文档的一个API(应用程序编程接口). DOM描绘了一个层次化的节点树, 允许开发人员添加, 移除和修改页面的某一部分. Node对象 NodeList对象 Element对象 attribute对象 常用的DOM方法: getElementById(id) getElementsByTagName() appendChild(node) removeChild(node) replaceChild() insertChild() createElement() createTextNode() getAttribute() setAttribute() 常用的DOM属性 innerHTML ?节点(元素)的文本值 parentNode ?节点(元素)的父节点 childNodes? attributes ? 节点(元素)的属性节点 Undefined, Null, Boolean, Number, String 基本类型与引用类型有什么区别? 基本类型如上题所示. 引用类型则有: Object, Array, Date, RegExp, Function 存储 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中 引用类型的值是对象, 保存在堆内存中. 包含引用类型的变量实际上包含的并不是对象本身, 而是一个指向改对象的指针 复制 从一个变量向另一个变量复制基本类型的值, 会创建这个值的一个副本 从一个变量向另一个变量复制引用类型的值, 复制的其实是指针, 因此两个变量最终都指向同一个对象 检测类型 确定一个值是哪种基本类型可以用typeof操作符, 而确定一个值是哪种引用类型可以使用instanceof操作符 js是一门具有自动垃圾回收机制的编程语言,开发人员不必关心内存分配和回收问题 离开作用域的值将被自动标记为可以回收, 因此将在垃圾收集期间被删除 "标记清除"是目前主流的垃圾收集算法, 这种算法的思路是给当前不使用的值加上标记, 然后再回收其内存 另一种垃圾收集算法是"引用计数", 这种算法的思想是跟踪记录所有值被引用的次数. js引擎目前都不再使用这种算法, 但在IE中访问非原生JS对象(如DOM元素)时, 这种算法仍然可能会导致问题 当代码中存在循环引用现象时, "引用计数" 算法就会导致问题 解除变量的引用不仅有助于消除循环引用现象, 而且对垃圾收集也有好处. 为了确保有效地回收内存, 应该及时解除不再使用的全局对象, 全局对象属性以及循环引用变量的引用 方法调用模型 ? ?var obj = { func : function(){};} ? ?obj.func() 函数调用模式 var func = function(){} ? ?func(); 构造器调用模式 ? apply/ call调用模式 三种事件模型: 1.原始事件模型(DOM0) 2.DOM2事件模型 3.IE事件模型 区别: 1.原始事件模型(没有兼容性问题) 2.主要特点:有一个事件的传播过程捕获->处于目标->冒泡 . IE事件模型:Event对象不是事件处理程序的函数参数,而是window的全局变量 三种分别为:setTimeout、setInterval、requestAnimationFrame requestAnimationFrame方法是h5提供的一种专门解决动画更新的API,浏览器会自动以最合适的频率去刷新动画 还有什么实现动画的方法?。 CSS3: animation HTML5: canvas元素结合JS CSS3结合Jquery实现 如何判断属性来自自身对象还是原型链? hasOwnPrototype 如何获取某个DOM节点,节点遍历方式 获取DOM节点 getElementsByClassName getElementsByTagName getElementById 节点遍历 1.用firstChild,lastChild 2.使用firstElementChild,nextElementSibling 使用jQuery图片预加载插件Lazy Load 加载jQuery, 与jquery.lazyload.js 设置图片的占位符为data-original, 给图片一个特别的标签,比如class=".lazy" 然后延迟加载: $(''img.lazy'').lazyload();这个函数可以选择一些参数:? 图片预先加载距离:threshold,通过设置这个值,在图片未出现在可视区域的顶部距离这个值时加载。 事件绑定加载的方式:event 图片限定在某个容器内:container 使用js实现图片加载: 就是new一个图片对象, 绑定onload函数, 赋值url 用CSS实现图片的预加载 写一个CSS样式设置一批背景图片,然后将其隐藏 改进: 使用js来推迟预加载时间, 防止与页面其他内容一起加载 用Ajax实现预加载 其实就是通过ajax请求请求图片地址. 还可以用这种方式加载css,js文件等 1. 直接调用function,每一个类的实例都会拷贝这个函数,弊端就是浪费内存(如上)。prototype方式定义的方式,函数不会拷贝到每一个实例中,所有的实例共享prototype中的定义,节省了内存。 2. 但是如果prototype的属性是对象的话,所有实例也会共享一个对象(这里问的是函数应该不会出现这个情况),如果其中一个实例改变了对象的值,则所有实例的值都会被改变。同理的话,如果使用prototype调用的函数,一旦改变,所有实例的方法都会改变。——不可以对实例使用prototype属性,只能对类和函数用。 typeof(obj) === "string" typeof obj === "string" obj.constructor === String 请用js去除字符串空格? 方法一:使用replace正则匹配的方法 去除所有空格: str = str.replace(/\s/g,""); ? ? ? 去除两头空格: str = str.replace(/^\s|\s$/g,""); 去除左空格: str = str.replace( /^\s/, “”); 去除右空格: str = str.replace(/(\s$)/g, ""); str为要去除空格的字符串,实例如下: var str = " 23 23 ";var str2 = str.replace(/\s/g,""); console.log(str2); // 2323 方法二:使用str.trim()方法 str.trim()局限性:无法去除中间的空格,实例如下: var str = " xiao ming ";var str2 = str.trim(); console.log(str2); //xiao ming 同理,str.trimLeft(),str.trimRight()分别用于去除字符串左右空格。 方法三:使用jquery,$.trim(str)方法 $.trim(str)局限性:无法去除中间的空格,实例如下: var str = " xiao ming ";var str2 = $.trim(str) console.log(str2); // xiao ming 我这里只是列举了常用的字符串函数 concat() – 将两个或多个字符的文本组合起来,返回一个新的字符串。 indexOf() – 返回字符串中一个子串第一处出现的索引。如果没有匹配项,返回 -1 。 charAt() – 返回指定位置的字符。 lastIndexOf() – 返回字符串中一个子串最后一处出现的索引,如果没有匹配项,返回 -1 。 match() – 检查一个字符串是否匹配一个正则表达式。 substr() 函数 -- 返回从string的startPos位置,长度为length的字符串 substring() – 返回字符串的一个子串。传入参数是起始位置和结束位置。 slice() – 提取字符串的一部分,并返回一个新字符串。 replace() – 用来查找匹配一个正则表达式的字符串,然后使用新字符串代替匹配的字符串。 search() – 执行一个正则表达式匹配查找。如果查找成功,返回字符串中匹配的索引值。否则返回 -1 。 split() – 通过将字符串划分成子串,将一个字符串做成一个字符串数组。 length – 返回字符串的长度,所谓字符串的长度是指其包含的字符的个数。 toLowerCase() – 将整个字符串转成小写字母。 toUpperCase() – 将整个字符串转成大写字母。 怎样添加、移除、移动、复制、创建和查找节点? 1)创建新节点 createDocumentFragment() //创建一个DOM片段 createElement() //创建一个具体的元素 createTextNode() //创建一个文本节点 2)添加、移除、替换、插入 appendChild() //添加 removeChild() //移除 replaceChild() //替换 insertBefore() //插入 3)查找 getElementsByTagName() //通过标签名称 getElementsByName() //通过元素的Name属性的值 getElementById() //通过元素Id,唯一性 比较typeof与instanceof? 相同点:JavaScript 中 typeof 和 instanceof 常用来判断一个变量是否为空,或者是什么类型的。 区别: 1.typeof判断所有变量的类型,返回值有number,boolean,string,function,object,undefined。 2.typeof对于丰富的对象实例,只能返回"Object"字符串。 3.instanceof可以对不同的对象实例进行判断 Array 对象属性 constructor 返回对创建此对象的数组函数的引用。 length 设置或返回数组中元素的数目。 prototype 使您有能力向对象添加属性和方法。 Array 对象方法 concat() 连接两个或更多的数组,并返回结果。 join() 把数组的所有元素放入一个字符串。元素通过指定的分隔符进行分隔。 pop() 删除并返回数组的最后一个元素。 ? shift() 删除并返回数组的第一个元素 push() 向数组的末尾添加一个或更多元素,并返回新的长度。 unshift() 向数组的开头添加一个或更多元素,并返回新的长度。 reverse() 颠倒数组中元素的顺序。 slice() 从某个已有的数组返回选定的元素 sort() 对数组的元素进行排序 splice() 删除元素,并向数组添加新元素。 toSource() 返回该对象的源代码。 toString() 把数组转换为字符串,并返回结果。 toLocaleString() 把数组转换为本地数组,并返回结果。 valueOf() 返回数组对象的原始值 jQuery 库中的 $() 是什么? $() 函数是 jQuery() 函数的别称。$() 函数用于将任何对象包裹成 jQuery 对象,接着你就被允许调用定义在 jQuery 对象上的多个不同方法。你可以将一个选择器字符串传入 $() 函数,它会返回一个包含所有匹配的 DOM 元素数组的 jQuery 对象。 $(this) 和 this 关键字在 jQuery 中有何不同? $(this) 返回一个 jQuery 对象 this 代表上下文中的当前 DOM 元素 jquery怎么移除标签onclick属性? 获得a标签的onclick属性: $("a").attr("onclick") 删除onclick属性:$("a").removeAttr("onclick"); 设置onclick属性:$("a").attr("onclick","test();"); jquery中addClass,removeClass,toggleClass的使用。 $(selector).addClass(class):为每个匹配的元素添加指定的类名 $(selector).removeClass(class):从所有匹配的元素中删除全部或者指定的类,删除class中某个值; $(selector).toggleClass(class):如果存在(不存在)就删除(添加)一个类 JQuery有几种选择器? (1)、基本选择器:#id,class,element,; (2)、层次选择器:parent > child,prev + next ,prev ~ siblings (3)、基本过滤器选择器::first,:last ,:not ,:even ,:odd ,:eq ,:gt ,:lt (4)、内容过滤器选择器: :contains ,:empty ,:has ,:parent (5)、可见性过滤器选择器::hidden ,:visible (6)、属性过滤器选择器:[attribute] ,[attribute=value] ,[attribute!=value] ,[attribute^=value] ,[attribute$=value] ,[attribute=value] (7)、子元素过滤器选择器::nth-child ,:first-child ,:last-child ,:only-child (8)、表单选择器: :input ,:text ,:password ,:radio ,:checkbox ,:submit 等; (9)、表单过滤器选择器::enabled ,:disabled ,:checked ,:selected jQuery中的Delegate()函数有什么作用? delegate()会在以下两个情况下使用到: ?1、如果你有一个父元素,需要给其下的子元素添加事件,这时你可以使用delegate()了,代码如下: $("ul").delegate("li", "click", function(){ $(this).hide(); }); ?2、当元素在当前页面中不可用时,可以使用delegate() jquery中$.get()提交和$.post()提交有区别吗? 相同点:都是异步请求的方式来获取服务端的数据; 异同点: 1、请求方式不同:$.get()?方法使用GET方法来进行异步请求的。$.post()?方法使用POST方法来进行异步请求的。 2、参数传递方式不同:get请求会将参数跟在URL后进行传递,而POST请求则是作为HTTP消息的实体内容发送给Web服务器的,这种传递是对用户不可见的。 3、数据传输大小不同:get方式传输的数据大小不能超过2KB?而POST要大的多 4、安全问题:?GET?方式请求的数据会被浏览器缓存起来,因此有安全问题。 Ajax的优缺点及工作原理? 定义和用法: AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。Ajax 是一种用于创建快速动态网页的技术。Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。 传统的网页(不使用 Ajax)如果需要更新内容,必须重载整个网页页面。 优点: 1.减轻服务器的负担,按需取数据,最大程度的减少冗余请求 2.局部刷新页面,减少用户心理和实际的等待时间,带来更好的用户体验 3.基于xml标准化,并被广泛支持,不需安装插件等,进一步促进页面和数据的分离 缺点: 1.AJAX大量的使用了javascript和ajax引擎,这些取决于浏览器的支持.在编写的时候考虑对浏览器的兼容性. 2.AJAX只是局部刷新,所以页面的后退按钮是没有用的. 3.对流媒体还有移动设备的支持不是太好等 AJAX的工作原理: 1.创建ajax对象(XMLHttpRequest/ActiveXObject(Microsoft.XMLHttp)) 2.判断数据传输方式(GET/POST) 3.打开链接 open() 4.发送 send() 5.当ajax对象完成第四步(onreadystatechange)数据接收完成,判断http响应状态(status)200-300之间或者304(缓存)执行回调函数 8.8 编程题 题目1 var obj = {a : 1}; (function (obj) { obj = {a : 2}; })(obj); //问obj怎么变? 答: 外部的obj不变. 因为匿名函数中obj传入参数等于是创建了一个局部变量obj, 里面的obj指向了一个新的对象 . 如果改成(function () { obj = {a : 2}; })(obj); ?就会变了 var obj = { a:1, ?func: function() { (function () { a=2; }(); }} ; obj.fun() ? //a 怎么变? 匿名函数里的this 是什么? 答: obj里的a不会变. 匿名函数里的this指向全局对象window. ?这等于是给window加了一个名为a的属性 要改变obj中a的值 , 应当: (function() { this.a = 2}).call(this); 或者obj中定义func : ? ?func: function() { var self = this; (function(){self.a=2;})();} 题目3 编写JavaScript代码,判断一个字符串中出现次数最多的字符,统计这个次数 var str = ''asdfssaaasasasasaa'';var json = {}; for (var i = 0; i < str.length; i++) { if(!json[str.charAt(i)]){ json[str.charAt(i)] = 1; }else{ json[str.charAt(i)]++; } }; var iMax = 0;var iIndex = ''''; for(var i in json){ if(json[i]>iMax){ iMax = json[i]; iIndex = i; } } console.log(''出现次数最多的是:''+iIndex+''出现''+iMax+''次'');4 编写JavaScript代码,点击一个ul的五个li元素,分别弹出他们的序号,怎么做? 方法1 :? 1 2 3 4 5 6 7 for(var?i=0; i ????oLis[i].onclick = (function(j){ ????????return?function(){ ????????????alert(j); ????????} ????})(i); } 这样的话, 给每个li绑定onclick事件时, 其实绑的是一个立即执行函数, 这个立即执行函数的参数是i, 因为它是立即执行的, 循环时已经把i的值赋给了li的onclick事件, 所以在外部函数里的i改变后并不会影响i的值 1 2 3 4 5 6 7 for(var?i=0; i ????(function(j){ ????????oLi[j].onclick =?function(){ ????????????alert(j); ????????}; ????})(i); } 另一种实现方法:(立即执行函数) 或者不用闭包 方法2:? var oLi = document.getElementsByTagName(''li''); function func(obj,i){ obj.onclick = function(){ alert (i); } } for (var i = 0; i func(oLi[i], i); } ?方法3: 设置属性 1 2 3 4 var?oLi = document.getElementsByTagName(''li''); for(var?i=0; i ????oLi[i].setAttribute("onclick",?"alert("+i+");"); } 方法4: 设置index保存 1 2 3 4 5 6 for(var?i=0; i ????oLi[i].index = i; ????oLi[i].onclick =?function(){ ????????alert(this.index); ????} } 题目5 js实现数组去重怎么实现? 方法1. 创建一个新的临时数组来保存数组中已有的元素 1 2 3 4 5 6 7 8 9 10 11 12 var?a =?new?Array(1,2,2,2,2,5,3,2,9,5,6,3); Array.prototype.unique1 =?function(){ ????var?n = [];?????//一个新的临时数组 ????for(var?i=0; i ????????//如果把当前数组的第i已经保存进了临时数组, 那么跳过 ????????if(n.indexOf(this[i]) == -1){ ????????????n.push(this[i]); ????????} ????} ????return?n; } console.log(a.unique1()); 方法2.?使用哈希表存储已有的元素 1 2 3 4 5 6 7 8 9 10 11 Array.prototype.unique2 =?function(){ ????var?hash = {}; ????var? n = [];?????//hash 作为哈希表, n为临时数组 ????for(var?i=0; i ????????if(!hash[this[i]]){?????????//如果hash表中没有当前项 ????????????hash[this[i]] =?true;???//存入hash表 ????????????n.push(this[i]);????????//当前元素push到临时数组中 ????????} ????} ????return?n; } 方法3. 使用indexOf判断数组元素第一次出现的位置是否为当前位置 1 2 3 4 5 6 7 8 9 10 11 12 Array.prototype.unique3 =?function(){ ????var?n = [this[0]];? ????for(var?i=1; i ????{ ????????//如果当前数组元素在数组中出现的第一次的位置不是i ????????//说明是重复元素 ????????if(this.indexOf(this[i]) == i){ ????????????n.push(this[i]); ????????} ????} ????return?n; } 方法4.?先排序再去重 1 2 3 4 5 6 7 8 9 10 Array.prototype.unique4 =?function(){ ????this.sort(function(a, b){?return?a - b;}); ????var?n = [this[0]]; ????for(var?i=1; i ????????if(this[i] !=?this[i-1]){ ????????????n.push(this[i]); ????????} ????} ????return?n; } 第一种方法和第三种方法都使用了indexOf(), 这个函数的执行机制也会遍历数组 第二种方法使用了一个哈希表, 是最快的.? 第三种方法也有一个排序的复杂度的计算. 然后做了个测试, 随机生成100万个0-1000的数组结果如下: 第三种方法总是第二种方法的将近两倍, 而第四种方法与数组的范围有关, 如果是0-100的数组 而如果是0-10000, 方法四看着就效果还不错了 而第二种方法永远是最好的, 但是是以空间换时间 全部代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 var?a = []; for(var?i=0; i<1000000; i++){ ????a.push(Math.ceil(Math.random()10000)); } ? Array.prototype.unique1 =?function(){ ????var?n = [];?????//一个新的临时数组 ????for(var?i=0; i ????????//如果把当前数组的第i已经保存进了临时数组, 那么跳过 ????????if(n.indexOf(this[i]) == -1){ ????????????n.push(this[i]); ????????} ????} ????return?n; } ? Array.prototype.unique2 =?function(){ ????var?hash = {}, ????????n = [];?????//hash 作为哈希表, n为临时数组 ????for(var?i=0; i ????????if(!hash[this[i]]){?????????//如果hash表中没有当前项 ????????????hash[this[i]] =?true;???//存入hash表 ????????????n.push(this[i]);????????//当前元素push到临时数组中 ????????} ????} ????return?n; } ? Array.prototype.unique3 =?function(){ ????var?n = [this[0]];? ????for(var?i=1; i ????{ ????????//如果当前数组元素在数组中出现的第一次的位置不是i ????????//说明是重复元素 ????????if(this.indexOf(this[i]) == i){ ????????????n.push(this[i]); ????????} ????} ????return?n; } ? Array.prototype.unique4 =?function(){ ????this.sort(function(a, b){?return?a - b;}); ????var?n = [this[0]]; ????for(var?i=1; i ????????if(this[i] !=?this[i-1]){ ????????????n.push(this[i]); ????????} ????} ????return?n; } var?begin1 =?new?Date(); a.unique1(); var?end1 =?new?Date(); ? var?begin2 =?new?Date(); a.unique2(); var?end2 =?new?Date(); ? var?begin3 =?new?Date(); a.unique3(); var?end3 =?new?Date(); ? var?begin4 =?new?Date(); a.unique4(); var?end4 =?new?Date(); ? console.log("方法一执行时间:"?+ (end1 - begin1)); console.log("方法二执行时间:"?+ (end2 - begin2)); console.log("方法三执行时间:"?+ (end3 - begin3)); console.log("方法四执行时间:"?+ (end4 - begin4)); 题目6 写出一个简单的$.ajax()的请求方式? $.ajax({ url:''http://www.baidu.com'', 请求地址 type:''POST'', --Post请求 data:data, cache:true, --是否高速缓存此页 headers:{}, dataType:’json’, --返回数据类型xml/json/html/script… beforeSend:function(){}, success:function(){}, --请求成功后的回调函数 error:function(){}, --请求失败时调用的函数 complete:function(){} --请求完成后回调函数 }); 题目7 编写一个方法 去掉一个数组的重复元素 法一: var arr = [0,2,3,4,4,0,2];var obj = {};var tmp = [];for(var i = 0 ;i< arr.length;i++){ if( !obj[arr[i]] ){ obj[arr[i]] = 1; tmp.push(arr[i]); } } console.log(tmp); 果如下:?[0, 2, 3, 4] ?方法二: var arr = [2,3,4,4,5,2,3,6], arr2 = [];for(var i = 0;i< arr.length;i++){ if(arr2.indexOf(arr[i]) < 0){ arr2.push(arr[i]); } } console.log(arr2); 果为:[2, 3, 4, 5, 6] ?方法三: var arr = [2,3,4,4,5,2,3,6]; var arr2 = arr.filter(function(element,index,self){ return self.indexOf(element) === index; }); console.log(arr2); 果为:[2, 3, 4, 5, 6] 判断一个字符串中出现次数最多的字符,统计这个次数var str = ''asdfssaaasasasasaa'';var json = {};for (var i = 0; i < str.length; i++) { if(!json[str.charAt(i)]){ json[str.charAt(i)] = 1; }else{ json[str.charAt(i)]++; } };var iMax = 0;var iIndex = '''';for(var i in json){ if(json[i]>iMax){ iMax = json[i]; iIndex = i; } } console.log(''出现次数最多的是:''+iIndex+''出现''+iMax+''次''); 题目9 点击一个ul的五个li元素,分别弹出他们的序号,怎么做? 方法1 :? 1 2 3 4 5 6 7 for(var?i=0; i ????oLis[i].onclick = (function(j){ ????????return?function(){ ????????????alert(j); ????????} ????})(i); } 这样的话, 给每个li绑定onclick事件时, 其实绑的是一个立即执行函数, 这个立即执行函数的参数是i, 因为它是立即执行的, 循环时已经把i的值赋给了li的onclick事件, 所以在外部函数里的i改变后并不会影响i的值. 另一种实现方法:(立即执行函数) 1 2 3 4 5 6 7 for(var?i=0; i ????(function(j){ ????????oLi[j].onclick =?function(){ ????????????alert(j); ????????}; ????})(i); } 或者不用闭包 方法2:? var oLi = document.getElementsByTagName(''li''); function func(obj,i){ obj.onclick = function(){ alert (i); } } for(var i = 0; i func(oLi[i], i); } ? 方法3: 设置属性: 1 2 3 4 var?oLi = document.getElementsByTagName(''li''); for(var?i=0; i ????oLi[i].setAttribute("onclick",?"alert("+i+");"); } 方法4: 设置index保存 1 2 3 4 5 6 for(var?i=0; i ????oLi[i].index = i; ????oLi[i].onclick =?function(){ ????????alert(this.index); ????} } 或者也可以用事件代理来做. js实现数组去重怎么实现? 方法1. 创建一个新的临时数组来保存数组中已有的元素 1 2 3 4 5 6 7 8 9 10 11 12 var?a =?new?Array(1,2,2,2,2,5,3,2,9,5,6,3); Array.prototype.unique1 =?function(){ ????var?n = [];?????//一个新的临时数组 ????for(var?i=0; i ????????//如果把当前数组的第i已经保存进了临时数组, 那么跳过 ????????if(n.indexOf(this[i]) == -1){ ????????????n.push(this[i]); ????????} ????} ????return?n; } console.log(a.unique1()); 方法2.?使用哈希表存储已有的元素 1 2 3 4 5 6 7 8 9 10 11 Array.prototype.unique2 =?function(){ ????var?hash = {}, ????????n = [];?????//hash 作为哈希表, n为临时数组 ????for(var?i=0; i ????????if(!hash[this[i]]){?????????//如果hash表中没有当前项 ????????????hash[this[i]] =?true;???//存入hash表 ????????????n.push(this[i]);????????//当前元素push到临时数组中 ????????} ????} ????return?n; } 方法3. 使用indexOf判断数组元素第一次出现的位置是否为当前位置 1 2 3 4 5 6 7 8 9 10 11 12 Array.prototype.unique3 =?function(){ ????var?n = [this[0]];? ????for(var?i=1; i ????{ ????????//如果当前数组元素在数组中出现的第一次的位置不是i ????????//说明是重复元素 ????????if(this.indexOf(this[i]) == i){ ????????????n.push(this[i]); ????????} ????} ????return?n; } 方法4.?先排序再去重 1 2 3 4 5 6 7 8 9 10 Array.prototype.unique4 =?function(){ ????this.sort(function(a, b){?return?a - b;}); ????var?n = [this[0]]; ????for(var?i=1; i ????????if(this[i] !=?this[i-1]){ ????????????n.push(this[i]); ????????} ????} ????return?n; } 第一种方法和第三种方法都使用了indexOf(), 这个函数的执行机制也会遍历数组 第二种方法使用了一个哈希表, 是最快的.? 第三种方法也有一个排序的复杂度的计算. 然后做了个测试, 随机生成100万个0-1000的数组结果如下: 第三种方法总是第二种方法的将近两倍, 而第四种方法与数组的范围有关, 如果是0-100的数组 而如果是0-10000, 方法四看着就效果还不错了 而第二种方法永远是最好的, 但是是以空间换时间 全部代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 var?a = []; for(var?i=0; i<1000000; i++){ ????a.push(Math.ceil(Math.random()10000)); } ? Array.prototype.unique1 =?function(){ ????var?n = [];?????//一个新的临时数组 ????for(var?i=0; i ????????//如果把当前数组的第i已经保存进了临时数组, 那么跳过 ????????if(n.indexOf(this[i]) == -1){ ????????????n.push(this[i]); ????????} ????} ????return?n; } ? Array.prototype.unique2 =?function(){ ????var?hash = {}, ????????n = [];?????//hash 作为哈希表, n为临时数组 ????for(var?i=0; i ????????if(!hash[this[i]]){?????????//如果hash表中没有当前项 ????????????hash[this[i]] =?true;???//存入hash表 ????????????n.push(this[i]);????????//当前元素push到临时数组中 ????????} ????} ????return?n; } ? Array.prototype.unique3 =?function(){ ????var?n = [this[0]];? ????for(var?i=1; i ????{ ????????//如果当前数组元素在数组中出现的第一次的位置不是i ????????//说明是重复元素 ????????if(this.indexOf(this[i]) == i){ ????????????n.push(this[i]); ????????} ????} ????return?n; } ? Array.prototype.unique4 =?function(){ ????this.sort(function(a, b){?return?a - b;}); ????var?n = [this[0]]; ????for(var?i=1; i ????????if(this[i] !=?this[i-1]){ ????????????n.push(this[i]); ????????} ????} ????return?n; } var?begin1 =?new?Date(); a.unique1(); var?end1 =?new?Date(); ? var?begin2 =?new?Date(); a.unique2(); var?end2 =?new?Date(); ? var?begin3 =?new?Date(); a.unique3(); var?end3 =?new?Date(); ? var?begin4 =?new?Date(); a.unique4(); var?end4 =?new?Date(); ? console.log("方法一执行时间:"?+ (end1 - begin1)); console.log("方法二执行时间:"?+ (end2 - begin2)); console.log("方法三执行时间:"?+ (end3 - begin3)); console.log("方法四执行时间:"?+ (end4 - begin4)); 题目11 写出一个简单的$.ajax()的请求方式? $.ajax({ url:''http://www.baidu.com'', type:''POST'', data:data, cache:true, headers:{}, beforeSend:function(){}, success:function(){}, error:function(){}, complete:function(){} }); 9.常用技术面试题(系统与软件实施) 9.1 计算机基础 你熟悉的远程有哪些方法?各种方法应该怎么配置? (1)最简单的QQ上有,打开对话框 上边有个 “应用”图标 点击“远程协助”。 (2)系统自带的远程桌面服务,右击我的电脑—属性,点远程,把两个够都打上去。 (3)远程协助软件,在要远程的主机安装代理程序后,即可使用远程服务。 (4)专业通信系统,即时通、 OA之类的。 在你进行实施的过程中,公司制作的一款软件系统缺少某一项功能,而且公司也明确表示不会再为系统做任何的修改或添加任何的功能,而客户也坚决要求需要这一项功能!对于实施人员来说,应该怎么去合理妥善处理这个问题? 先看客户要求合不合理,不合理就可以坚决退还需求。如果需求合理的话,可以考虑做以下: (2)、如果软件产品比较简单,就可以直接一步一步的教他怎么操作,一直操作熟练就行了。 当你觉得工作的付出和你的收入不成正比的时候你会怎么想? 无论干什么工作,必须干一行爱一行,脚踏实地、用心去钻研, 只要真正有能力,只要有思想和技术,终会出头。砖石总会发光的。接受你不能接受的,改变你能改变的。会争取到更高的薪水的。 如果当初进来的时候公司有晋升调薪的承诺,那就看你的表现是否达到了要求,可以主动和相关领导沟通。 系统启动后,不能连接数据库,可能是哪些方面的原因? (1)和数据库有关的服务没启动; (2)防火墙可能阻挡了数据库的端口; (3)如数据库可以启动,而登陆不了,可能是密码错误或连接参数配置错误; (4)数据库文件已被破坏或不存在; 你认为客户服务的重点是什么? 随着市场的竞争进一步加剧,服务已经成为企业核心竞争力的要素之一,服务的重点是沟通,沟通可以消除客户的误会和不满,沟通可以提高客户的感知度。因此,我认为我们客户服务管理工作就应该从做好沟通的管理开始。 自己一定要理解服务,理解服务能干什么,能做到什么,结合公司的业务能给客户提供什么服务。服务过程中是否能给客户提供优秀的服务,倾听客户的意见,持续改进服务方式。尽量在事件发生之前,避免或杜绝客户的投诉,投诉发生后,认真处理。 说明静态路由和动态路由的区别? 静态路由:就是由管理员在路由器中手工设置的固定的路由信息,静态路由不能对网络的改变做出反映,一般用于规模不大、拓扑结构固定的网络中,其优点是设置简单、高效,在所有路由中,静态路由优先级最高,当动态路由与静态路由发生冲突时,以静态路由为准。 动态路由:就是由网络中的路由器之间互相通信,传递路由信息,利用收到的路由信息更新路由表的过程,它能实时地适应网络结构的变化。主要用于规模大、拓扑结构复杂的网络。 简述有哪些的机 Vmware、VirtualBox、 简要说明Active Directory(活动目录)是面向Windows Standard Server、Windows Enterprise Server以及 Windows Datacenter Server的目录服务 Active Directory域内的 directory database(目录数据库)被用来存储用户账户、计算机账户、打印机与共享文件夹等对象,而提供目录服务的组件就是 Active Directory域服务(Active Directory Domain Services,ADDS),它负责目录数据库的存储、添加、删除、修改与査询等操作 简要说明站点联系和区别说明 Server系统中用户权限哪几个特点 (2)权限可以累加。例如,A自身的权限为“”,业务部权限为“”,经理组权限为“执行”则有效权限为: (3)“拒绝”权限的优先级比较高。虽然用户对某个文件的有效权限是其所有权限来源的总和,但是只要其中有一个权限来源被设置为 “拒绝”权限的优先级比较高示例表 组组拒绝组读取权限为: Server脱机文件的好处是什么?由于的是本地计算机资源,因此访问速度比访问的网络计算机要快 网络计算机的文件夹必须是共享文件夹才具备被脱机使用的功能。 在网络计算机端设置脱机文件的步骤是: Windows Server内置的和还原是哪个?有哪几种形式 Server内置的和还原是备份形式有:备份、备份 说明 Server组策略。组策略有哪两种形式? Server组策略是Microsoft Windows系统管理员为计算机和用户定义的,用来控制应用程序、系统设置和管理模板的一种机制。通俗一点说,是介于控制面板和注册表之间的一种修改系统、设置程序的工具。 组策略有两种形式: (2)用户配置 当用户登录时,系统会根据用户配置的内容来设置计算机环境。包括应用程序配置、桌面配置、应用程序分配和计算机启动和关机脚本运行等。 简要说明ftp、smtp、pop3、telnet (1)ftp ftp(File Transfer Protocol,文件传输协议)是TCP/IP 协议组中的协议之一。默认情况下FTP协议使用TCP端口中的 20和21这两个端口,其中20用于传输数据,21用于传输控制信息 (2)smtp smtp是一种提供可靠且有效的电子邮件传输的协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知端口25 (3)pop3 pop协议支持“离线”邮件处理。其具体过程是:邮件发送到服务器上,电子邮件客户端调用邮件客户机程序以连接服务器,并下载所有未阅读的电子邮件。smtp负责发送邮件,pop读取邮件。pop3协议默认的端口号为110 telnet协议Internet远程登录服务的标准协议和主要方式它为用户提供了在本地计算机上完成远程主机工作的能力telnet默认端口为 mysql用户管理常用相关ml由本机连接数据库,登录密码123@#” create user ''finley''@''localhost'' identified by ''123@#'' (2)创建用户jack,该用户由192.168.6.82连接数据库,登录密码123@#” create user ''jack''@''192.168.6.82'' identified by ''123@#'' ()将grant all privileges on . to ''finley''@''localhost'' with grant option with grant option选项表示该用户可以将自己拥有的权限授权给别人。 注意:经常有人在创建操作用户的时候不指定with grant option,选致后来该用户不能使用grant命令创建用户或者给其它用户授权。 (4)创建用户smith,该用户reload和process权限,登录密码123@#” grant reload,process on . to ''smith''@''localhost'' identified by ''123@#'' (5)创建用户keme,该用户登录密码123@#” grant select(id) on test.temp to keme@''localhost'' identified by ''123@#'' (6)创建用户sherry,该用户product表具有select、insert权限,登录密码123@#” grant select,insert on test.product to sherry@''localhost'' identified by ''123@#'' (7)查看用户admin的权限信息show grants for admin@''localhost'' (8)通过revoke命令收回用户admin在所有库所有表process权限 revoke process on . from admin@''localhost'' 简要说明的原理MySQL复制是主数据库的DDL和DML操作二进制日志从服务器上,然后在从服务器上将这些文件重新执行,从而从服务器与主服务器的数据保持同步9.2 Linux 操作系统 /proc/version # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # hostname # 查看计算机名 # lspci -tv # 列出所有PCI设备 # lsusb -tv # 列出所有USB设备 # lsmod # 列出加载的内核模块 # env # 查看环境变量资源 # free -m # 查看内存使用量和交换区使用量 # df -h # 查看各分区使用情况 # du -sh <目录名> # 查看指定目录的大小 # grep MemTotal /proc/meminfo # 查看内存总量 # grep MemFree /proc/meminfo # 查看空闲内存量 # uptime # 查看系统运行时间、用户数、负载 # cat /proc/loadavg # 查看系统负载磁盘和分区 # mount | column -t # 查看挂接的分区状态 # fdisk -l # 查看所有分区 # swapon -s # 查看所有交换分区 # dmesg | grep IDE # 查看启动时IDE设备检测状况网络 # ifconfig # 查看所有网络接口的属性 # iptables -L # 查看防火墙设置(centos7版本以下) # firewall-cmd --list-all # 查看防火墙规则(centos7版本及以上) # route -n # 查看路由表 # netstat -lntp # 查看所有监听端口 # netstat -antp # 查看所有已经建立的连接 # netstat -s # 查看网络统计信息进程 # ps -ef # 查看所有进程 # top # 实时显示进程状态用户(q键退出当前状态) # w # 查看活动用户 # id <用户名> # 查看指定用户信息 # last # 查看用户登录日志 # cut -d: -f1 /etc/passwd # 查看系统所有用户 # cut -d: -f1 /etc/group # 查看系统所有组 # crontab -l # 查看当前用户的计划任务服务 # chkconfig –list # 列出所有系统服务(centos7版本以下) # systemctl list-unit-files # 列出所有系统服务(centos7版本及以上) # chkconfig –list | grep on # 列出所有启动的系统服务程序(centos7版本以下) # systemctl list-units --type=service #列出所有启动的系统服务程序(centos7版本及以上) # rpm -qa # 查看所有安装的软件包 # rpm -qa | grep <软件包名> # 查看是否安装了某rpm包软件 # Pwd # 该命令用于显示用户当前所在的工作目录位置 # Cd # 该命令用于切换工作目录 # Ls # 列表显示目录 -l # 以长格式显示文件或目录的详细信息 -a # 显示所有文件,包括隐藏文件 -d # 显示目录本身的属性而不是显示目录的内容 -h # 以K,M,G等单位显示文件大小提高可读性 # Mkdir # 创建目录 -p创建多个目录 # Touch # 建立空文件或修改时间戳 # rm # 删除文件或目录 -r # 删除目录时必须使用此选项表示递归删除整个目录 -f # 强制删除,不需要用户确认 # cp # 复制文件或目录 -r # 复制目录必须使用此选项表示递归复制所有文件及子目录 # mv # 移动文件或目录 # cat # 显示文件内容 -n :-n或 --number # 由 1 开始对所有输出的行数编号 # more/less # 分页显示文件内容 # head/tail # 查看文件开头或末尾的部分内容 # wc # 文件内容统计 -l # 统计行数 # find #文件或目录查找 -name # 按名称查找 -type # 按类型查找 -size # 按大小查找 # grep #文件内容查询命令 -v # 反转查找即输出与查找条件不相符的行 -I # 忽略大小写 # which # 查找外部命令所对应的程序文件 # ln # 为文件或目录建立链接 -s # 创建软链接 # alias # 设置命令别名 # history # 查看历史命令 # man/help # 查看命令帮助手册 在Linux中有一文件列表内容格式如下: 63 lrwxrwxrwx 1 hawkeye users 6 Jul 18 09:41 nurse2 -> nurse1 问题一:要完整显示如上文件列表信息,应该使用什么命令。请写出完整的命令行。 问题二:上述文件列表内容的第一列内容“63”是什么含义? 问题三:上述文件列表内容的第二列内容“lrwxrwxrwx”中的“l”是什么含义?对于其它类型的文件或目录等还可能会出现什么字符,它们分别表示什么含义? 问题四:上述文件列表内容的第二列内容“lrwxrwxrwx”中的第一、二、三个“rwx”分别代表什么含义?其中的“r”、“w”、“x”分别表示什么含义? 问题五:上述文件列表内容的第三列内容“1”是什么含义? 问题六:上述文件列表内容的第四列内容“hawkeye”是什么含义? 问题七:上述文件列表内容的第五列内容“users”是什么含义? 问题八:上述文件列表内容的第六列内容“6”是什么含义? 问题九:上述文件列表内容中的“Jul 18 09:41”是什么含义? 问题十:上述文件列表内容的最后一列内容“nurse2>nurse1”是什么含义? 答 安装Linux系统有哪些方式? 答:图形安装或文本终端安装。 管道的作用 答:管道就是把一个程序(进程)的输出连接到另一个程序(进程)的输入。 简述标准的Linux运行级? 答:linux下有7个 这些运行级别是通过init调用不同的脚本来切换的。 CentOS 7 运行级别的切换 由命令行级别切换到窗口级别的命令未变:init 5或startx 由窗口级别切换到命令行级别的命令未变:init 3 新版本的运行级别都定义在 /lib/systemd/system下: 运行级别 systemctl target 0 poweroff.target 1 rescure.target 2 multi-user.target 3 multi-user.target 4 multi-user.target 5 graphical.target 6 reboot.target GRUB是什么,它有什么作用? 答:在Linux系统安装中,GRUB 已经在 MBR 中写入引导代码,使得 RHEL 获得系统的控制权 引导代码加载启动分区 boot 或在 / 分区中加载boot 目录,读取第二阶段引导代码 第二阶段引导代码加载系统内核 内核在引导过程中加载系统所需的模块 内核最后执行/sbin/init程序(系统根进程) init根据/etc/inittab文件,运行系统进行初始化程序(/etc/rc.d/rc.sysinit) rc.sysinit根据/etc/inittab决定操作系统运行的级别,并且根据运行级别启动相应的服务,然后根据/etc/fstab加载系统分区 标准运行级别通长在最后运行本地初始化脚本 (/etc/rc.d/rc.local) 显示登录信息 如何设置自动挂载文件系统? 答:利用vi编辑器修改/etc/fstab文件 在最下面一行增加所挂载文件、所要挂载到的目录、文件类型,使用mount -a自动挂载 centos7的启动顺序 什么是Shell,它的作用是什么? 答:Shell是人机交互用的一个程序。其实就是字面意思--壳. 一个系统有内核(Kernel)自然就有外壳(Shell). 在 Linux 上广义的 Shell 就是与用户交互的界面, 图形化界面是 Shell, 命令行界面也是 Shell. 狭义上的 Shell 就是 Linux 上的命令行界面. 一般发行版上的命令行界面是 bash, 而 debian 的是 dash. 下面的讨论基于侠义的 Shell. Shell 是用来执行计算机程序的. 例如执行 mkdir 就是创建一个文件夹, 执行 touch 就是创建一个文件. 执行 ps 就是查看进程信息. 其中 mkdir, touch, ps 都是用 C 语言编写编译后的程序 简述Swap分区的作用? 答:当系统执行的任务临时要求大内存而得不到满足时,将部分不活跃的内存内容移到硬盘上的一个缓存区域,这个专门预留的区域就是swap分区(相当于Windows的页面文件)。内存够用的情况下,如果不用睡眠功能,则swap分区可以小一点,甚至没有;如果要使用睡眠功能,则swap分区尽量不要比内存小。 简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程。 Linux通过i节点表将文件的逻辑结构和物理结构进行转换。i节点是一个64字节长的表,表中包含了文件的相关信息,其中有文件的大小、文件所有者、文件的存取许可方式以及文件的类型等重要信息,在i节点表中最主要的内容是磁盘地址表。在磁盘地址表中有13个块号,文件将以块号在磁盘地址表中出现的顺序依次读取相应的块。Linux文件系统通过把i节点和文件名进行连接,当需要读取该文件时,文件系统在当前目录表中查询该文件名对应的项,由于此得到该文件相对应的i节点号,通过该i节点的磁盘地址表把分散存放的文件物理块连接成文件的逻辑结构。 简述进程的启动、终止的方式以及如何进行进程的查看。 在Linux中启动一个进程有手工启动和调度启动两种方式: (1)手工启动用户在输入端发出命令,直接启动一个进程的启动方式。可以分为: ①前台启动:直接在SHELL中输入命令进行启动。 ②后台启动:启动一个目前并不紧急的进程,如打印进程。 (2)调度启动系统管理员根据系统资源和进程占用资源的情况,事先进行调度安排,指定任务运行的时间和场合,到时候系统会自动完成该任务。 经常使用的进程调度命令为:at、batch、crontab。 Linux系统中软件安装方法有哪些?简述优缺点。 有三种方法:源代码安装,rpm包安装,yum安装 源码安装:通过源码安装,用户可以获得最新的应用程序,可以定制灵活,丰富的功能,而且使软件可以跨越计算机平台,在所有版本的Linux系统中都能使用。但是这种安装方式过于复杂,耗时又长,对用户的软件开发能力要求也比较高。 rpm软件包只能在RPM机制的Linux操作系统中使用,如RHEL,Fdeora,Suse等,RPM安装包现在基本成为Linux系统中软件安装包事实上的标准但是RPM也有一个很大的缺点,即RPM软件包之间存在复杂的依赖关系。在多数情况下,一个软件都是由多个相互依赖的RPM软件包组成,也就是安装一个软件需要使用到许多软件包,而大部分的RPM又有相互之间的依赖关系。例如安装A软件包需要B软件包的支持,安装B需要C的支持 yum是一个基于RPM却胜于RPM的软件管理工具,它的最大优点是可以自动解决RPM软件包的依赖性问题,从而可以更轻松的管理Linux系统中的软件。 如何安装和卸载rpm格式的软件包? 利用rpm安装首先必须进入存放rpm软件包的目录. rpm -ivh 软件包名(-i安装软件包,-v显示安装过程,-h显示安装进度,rpm每2%就会显示一个#号) rpm -e 软件名(删除一个已安装的软件,当删除成功时,没有任何提示;当再次删除时,会提示软件包没有安装) 简述安装RHEL6的步骤。 准备RHEL6镜像从光盘引导在引导界面选择第一项“Install or upgrade an existing system”然后检查光盘兼容性这里选择Skip跳过安装语言选择中文简体键盘选择美国英语式存储设备选择基本存储设备弹出存储设备警告提示是否要将整个硬盘重新分区格式化这里选择是定义主机名和时间为用户设置密码将硬盘分区然后进行软件包的定制最后完成安装。 yum源的配置方式有哪些?说明以下yum命令的作用。 如果是合法的RHEL用户会自动使用RHN作为默认yum源,也就是说安装的所有软件都可以直接来自红帽官网。但这要缴纳一定的费用,所以更多的情况下需要自己来配置yum源,由于在RHEL6的系统光盘中已经集成了绝大多数应用软件的rpm包因此一般可以指定系统光盘作为yum源,或者是指定网络中的某台ftp或web服务器作为yum源 yum list 列出软件清单 yum info 查看软件包的信息 yum install 安装软件 yum remove 卸载软件 yum clean all 清除yum缓存 企业使用最多的Linux操作系统有哪些? RHEL、Centos、ubuntu, Debian, suse、目前中国企业用的比较多的linux操作系统。 简述DNS进行域名正向解析的过程。 首先,客户端发出DNS请求翻译IP地址或主机名。DNS服务器在收到客户机的请求后: (1)检查DNS服务器的缓存,若查到请求的地址或名字,即向客户机发出应答信息; (2)若没有查到,则在数据库中查找,若查到请求的地址或名字,即向客户机发出应答信息; (3)若没有查到,则将请求发给根域DNS服务器,并依序从根域查找顶级域,由顶级查找二级域,二级域查找三级,直至找到要解析的地址或名字,即向客户机所在网络的DNS服务器发出应答信息,DNS服务器收到应答后现在缓存中存储,然后,将解析结果发给客户机。 (4)若没有找到,则返回错误信息。 系统管理员的职责包括那些?管理的对象是什么? 系统管理员的职责是进行系统资源管理、设备管理、系统性能管理、安全管理和系统性能监测。管理的对象是服务器、用户、服务器的进程及系统的各种资源等。 简述安装Slackware Linux系统的过程。 (1)对硬盘重新分区。 (2)启动Linux系统(用光盘、软盘等)。 (3)建立Linux主分区和交换分区。 (4)用setup命令安装Linux系统。 (5)格式化Linux主分区和交换分区 (6)安装Linux软件包 (7)安装完毕,建立从硬盘启动Linux系统的LILO启动程序,或者制作一张启动Linux系统的软盘。重新启动Linux系统。 什么是静态路由,其特点是什么?什么是动态路由,其特点是什么? 静态路由是由系统管理员设计与构建的路由表规定的路由。适用于网关数量有限的场合,且网络拓朴结构不经常变化的网络。其缺点是不能动态地适用网络状况的变化,当网络状况变化后必须由网络管理员修改路由表。 动态路由是由路由选择协议而动态构建的,路由协议之间通过交换各自所拥有的路由信息实时更新路由表的内容。动态路由可以自动学习网络的拓朴结构,并更新路由表。其缺点是路由广播更新信息将占据大量的网络带宽。 进程的查看和调度分别使用什么命令? 进程查看的命令是ps和top。 进程调度的命令有at,crontab,batch,kill。 Linux系统中用户的分类?区别? 分类:超级用户、普通用户、虚拟用户 区别:超级用户:对本主机有至高无上的完全权限 普通用户:由root用户或其他管理员用户创建,拥有的权限受到一定限制,一般只有在用户自己的宿主目录中有完全权限 虚拟用户:不能登陆系统,主要是为了方便系统管理,用于维持系统或某个程序的正常运行,大多是在安装系统及部分应用程序时自动添加的。 当文件系统受到破坏时,如何检查和修复系统? 成功修复文件系统的前提是要有两个以上的主文件系统,并保证在修复之前首先卸载将被修复的文件系统。 使用命令fsck对受到破坏的文件系统进行修复。fsck检查文件系统分为5步,每一步检查系统不同部分的连接特性并对上一步进行验证和修改。在执行 fsck命令时,检查首先从超级块开始,然后是分配的磁盘块、路径名、目录的连接性、链接数目以及空闲块链表、i-node。 解释i节点在文件系统中的作用。 在linux文件系统中,是以块为单位存储信息的,为了找到某一个文件在存储空间中存放的位置,用i节点对一个文件进行索引。i节点包含了描述一个文件所必须的全部信息。所以i节点是文件系统管理的一个数据结构。 什么是符号链接,什么是硬链接?符号链接与硬链接的区别是什么? 链接分硬链接和符号链接。 符号链接可以建立对于文件和目录的链接。符号链接可以跨文件系统,即可以跨磁盘分区。符号链接的文件类型位是l,链接文件具有新的i节点。 硬链接不可以跨文件系统。它只能建立对文件的链接,硬链接的文件类型位是-,且硬链接文件的i节点同被链接文件的i节点相同。 在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则。 磁盘簇(或i节点密度)是文件系统调度文件的基本单元。磁盘簇的大小,直接影响系统调度磁盘空间效率。当磁盘分区较大时,磁盘簇也应选得大些;当分区较小时,磁盘簇应选得小些。通常使用经验值。 简述网络文件系统NFS,并说明其作用。 网络文件系统是应用层的一种应用服务,它主要应用于Linux和Linux系统、Linux和Unix系统之间的文件或目录的共享。对于用户而言可以通过 NFS方便的访问远地的文件系统,使之成为本地文件系统的一部分。采用NFS之后省去了登录的过程,方便了用户访问系统资源。 某/etc/fstab文件中的某行如下: /dev/had5 /mnt/dosdata msdos defaults, usrquota 1 2 请解释其含义。 (1)第一列:将被加载的文件系统名; (2)第二列:该文件系统的安装点; (3)第三列:文件系统的类型; (4)第四列:设置参数; (5)第五列:供备份程序确定上次备份距现在的天数; (6)第六列:在系统引导时检测文件系统的顺序。 Apache服务器的配置文件httpd.conf中有很多内容,请解释如下配置项: (1)MaxKeepAliveRequests 200 (2)UserDir public_html (3)DefaultType text/plain (4)AddLanguare en.en (5)DocumentRoot“/usr/local/httpd/htdocs” (6)AddType application/x-httpd-php.php.php.php4 答 简述Linux文件权限的表现,以及如何和文件夹的权限Linux文件的基本权限分别是owner/group/others三种身份各有的read/write/execute权限。文件的权限字符为-rwxrwxrwx],这九个权限是三个一组可以使用数字来代表各个权限,各权限的分数如下: r:4 2)w:2 3)x:1 每种身份owner/group/others)各自的三个权限r/w/x)分数是需要累加的,例如当权限为[-rwxrwx---]分数 1)owner = rwx = 4+2+1 = 7 2)group = rwx = 4+2+1 = 7 3)others= --- = 0+0+0 = 0 因此根据上述权限,设定权限的变更时,该文件的权限数字就是770 1)采用数文件属性 例如,chmod 765 .bashrc,则文件.bashrc权限字符为-rwxrw-r-x]。 2)采用更改文件属性.u表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体group)者,o 表示其他以外的人,a 表示这三者皆是。 + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 ,chmod ugo+rw .bashrcchmod a+rw .bashrc, chmod a+r file1.txt 简述RPM的作用和使用方法 软件包说明见表 rpm常用选项的说明 a 查询所有的软件包e 删除指定的软件包h 软件包安装时列出标记i 显示软件包的相关信息l 显示软件包的文件列表q 使用询问模式,当遇到任何问题时,rpm指令会先询问用户v 显示指令执行过程rpm命令安装如下: rpm -ivh mypackage 使用rpm命令安装如下: rpm --force -ivh mypackage 使用rpm命令安装mypackage如下 # rpm -ql mypackage 使用rpm命令mypackage(如果存在mypackage如下 # rpm -e mypackage 简述YUM的作用和使用方法 y Yum常用命令如下: 简述在Linux上安装 (2)卸载CentOS-7中MySQL相关的依赖。 (3)分别安装MySQL服务端和客户端,命令如下: # rpm -ivh MySQL-server-5.1.73-1.glibc23.x86_64.rpm # rpm -ivh MySQL-client-5.1.73-1.glibc23.x86_64.rpm (4)启动MySQL服务,命令如下: # service mysql start (5)登录MySQL,命令如下(初次使用时MySQL是没有密码的) # mysql –u root (6)修改root账号的密码为“123456”,命令如下: set password for ‘root’@’localhost’ =password(‘123456’); (7)支持root用户允许远程连接MySQL数据库,命令如下: grant all privileges on . to ''root''@''%'' identified by ''123456'' with grant option; flush privileges; 写出在Linux上启动、停止和重启的命令启动:service Tomcat start 停止:service Tomcat stop 重启:service Tomcat restart 9.3 10.常用技术面试题(软件测试) 10.1 常规及职业选择问题你的测试职业发展是什么? 测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按如何做好测试工程师的要点去要求自己,不断更新自己改正自己,做好测试任务。 你认为测试人员需要具备哪些素质 做测试应该要有一定的协调能力,因为测试人员经常要与开发接触处理一些问题,如果处理不好的话会引起冲突,这样的话工作上就会不好做。还有测试人员要有一定的耐心,有的时候做测试很枯燥乏味。除了耐心,测试人员不能放过每一个可能的错误。 你为什么能够做测试这一行 虽然我的测试技术还不是很成熟,但是我觉得我还是可以胜任软件测试这个工作的,因为做软件测试不仅是要求技术好,还有有一定的沟通能力,耐心、细心等外在因素。综合起来看我认为我是胜任这个工作的。 测试的目的是什么? 测试的目的是找出软件产品中的错误,是软件尽可能的符合用户的要求。当然软件测试是不可能找出全部错误的。 测试分为哪几个阶段? 一般来说分为5个阶段:单元测试、集成测试、确认测试、系统测试、验收测试 单元测试的测试对象、目的、测试依据、测试方法? 测试对象是模块内部的程序错误,目的是消除局部模块逻辑和功能上的错误和缺陷。测试依据是模块的详细设计,测试方法是采用白盒测试。 怎样看待加班问题 加班的话我没有太多意见,但是我还是觉得如果能够合理安排时间的话,不会有太多时候加班的。 结合你以前的学习和工作经验,你认为如何做好测试。 根据我以前的工作和学习经验,我认为做好工作首先要有一个良好的沟通,只有沟通无障碍了,才会有好的协作,才会有更好的效率,再一个就是技术一定要过关,做测试要有足够的耐心,和一个良好的工作习惯,不懂的就要问,实时与同事沟通这样的话才能做好测试工作。 你为什么选择软件测试行业 因为之前了解软件测试这个行业,觉得他的发展前景很好。 根据你以前的工作或学习经验描述一下软件开发、测试过程,由哪些角色负责,你做什么 要有架构师、开发经理、测试经理、程序员、测试员。我在里面主要是负责所分到的模块执行测试用例。 根据你的经验说说你对软件测试/质量保证的理解 软件质量保证与测试是根据软件开发阶段的规格说明和程序的内部结构而精心设计的一批测试用例(即输入数据和预期的输出结果),并根据这些测试用例去运行程序,以发现错误的过程。它是对应用程序的各个方面进行测试以检查其功能、语言有效性及其外观排布。 软件测试的流程是什么? 需求调查:全面了解系统概况、应用领域、软件开发周期、软件开发环境、开发组织、时间安排、功能需求、性能需求、质量需求及测试要求等。根据系统概况进行项目所需的人员、时间和工作量估计以及项目报价。 制定初步的项目计划。 测试准备:组织测试团队、培训、建立测试和管理环境等。 测试设计:按照测试要求进行每个测试项的测试设计,包括测试用例的设计和测试脚本的开发等。 测试实施:按照测试计划实施测试。 测试评估:根据测试的结果,出具测试评估报告。 你对SQA的职责和工作活动(如软件度量)的理解? SQA就是独立于软件开发的项目组,通过对软件开发过程的监控,来保证软件的开发流程按照指定的CMM规程(如果有相应的CMM规程),对于不符合项及时提出建议和改进方案,必要时可以向高层经理汇报以求问题的解决。通过这样的途径来预防缺陷的引入,从而减少后期软件的维护成本。SQA主要的工作活动包括制定SQA工作计划,参与阶段产物的评审,进行过程质量、功能配置及物理配置的审计等;对项目开发过程中产生的数据进行度量等等。 说说你对软件配置管理的理解 项目在开发过程中要用相应的配置管理工具对配置项(包括各个阶段的产物)进行变更控制,配置管理的使用取决于项目规模和复杂性及风险的水平。软件的规模越大,配置管理就越显得重要。还有在配置管理中,有一个很重要的概念,那就是基线,是在一定阶段各个配置项的组合,一个基线就提供了一个正式的标准,随后的工作便基于此标准,并只有经过授权后才能变更这个标准。配置管理工具主要有CC,VSS,CVS,SVN等,我只用过SVN,对其他的工具不是很熟悉。 怎样写测试计划和测试用例 简单点,测试计划里应有详细的测试策略和测试方法,合理详尽的资源安排等,至于测试用例,那是依赖于需求(包括功能与非功能需求)是否细化到功能点,是否可测试等。 你在测试中发现了一个 ?bug ,但是开发经理认为这不是一个 ?bug 你应该怎样解决。 首先,将问题提交到缺陷管理库里面进行备案。然后,要获取判断的依据和标准:根据需求说明书、产品说明、设计文档等,确认实际结果是否与计划有不一致的地方,提供缺陷是否确认的直接依据;如果没有文档依据,可以根据类似软件的一般特性来说明是否存在不一致的地方,来确认是否是缺陷;根据用户的一般使用习惯,来确认是否是缺陷;与设计人员、开发人员和客户代表等相关人员探讨,确认是否是缺陷;合理的论述,向测试经理说明自己的判断的理由,注意客观、严谨,不参杂个人情绪。等待测试经理做出最终决定,如果仍然存在争议,可以通过公司政策所提供的渠道,向上级反映,并有上级做出决定。 给你一个网站,你如何测试? 首先,查找需求说明、网站设计等相关文档,分析测试需求。制定测试计划,确定测试范围和测试策略,一般包括以下几个部分:功能性测试;界面测试;性能测试;数据库测试;安全性测试;兼容性测试 设计测试用例,链接测试提交功能的测试界面测试性能测试 数据库测试要具体决定是否需要开展。数据库一般需要考虑连结性,对数据的存取操作,数据内容的验证等方面。 安全性测试: 1 基本的登录功能的检查 2 是否存在溢出错误,导致系统崩溃或者权限泄露 3 相关开发语言的常见安全性问题检查,例如 SQL 注入等。 4 如果需要高级的安全性测试,确定获得专业安全公司的帮助,外包测试,或者获取支持兼容性测试,根据需求说明的内容,确定支持的平台组合:浏览器的兼容性;操作系统的兼容性;软件平台的兼容性;数据库的兼容性开展测试,并记录缺陷。 软件生存周期及其模型是什么? 软件生存周期是软件开发全部过程、活动和任务的结构框架,是从可行性研究到需求分析、软件设计、编码、测试、软件发布维护的过程。在经历需求、分析、设计、实现、部署后,软件将被使用并进入维护阶段,直到最后由于缺少维护费用而逐渐消亡。这样的一个过程,称为"生命周期模型"(Life Cycle Model)。 什么是软件测试?软件测试的目的与原则 使用人工或自动手段,来运行或测试某个系统的过程。其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 软件测试的目的: 测试是程序的执行过程,目的在于发现错误软件测试的原则: 软件测试应尽早执行,并贯穿于整个软件生命周期 软件测试应追溯需求 3必须确定预期输出(或结果) 必须彻底检查每个测试结果 严格执行测试计划,排除测试的随意性 注意合法合理的输入,也要注意非法的非预期的输入 检查程序是否做了不该做的 测试应从“小规模”开始,逐步转向“大规模” 反复使用同样的测试会使软件具有抵抗力 0、关注缺陷的修复 软件配置管理的作用?软件配置包括什么? 软件配置管理作为软件开发过程的必要环节和软件开发管理的基础,贯穿整个软件生命周期,同时对软件开发过程的宏观管理即项目管理也有重要的支持作用。一个软件开发组织真正有效的实施软件配置管理,将会使软件开发过程有更好的可预测性,使系统具有可重复性,大大提高软件组织的竞争力。 软件配置包括如下内容:配置项识别工作空间管理版本控制变更控制状态报告配置审计 什么是软件质量? 软件质量:软件产品的特性可以满足用户的功能、性能需求的能力。目前主要的测试用例设计方法是什么? 白盒测试: 逻辑覆盖循环覆盖基本路径覆盖 黑盒测试: 边界值分析法等价类划分错误猜测法因果图法状态图法测试大纲法随机测试场景法 软件的安全性应从哪几个方面 去测试? 软件安全性测试包括程序、数据库安全性测试。 根据系统安全指标不同测试策略也不同。用户认证安全的测试要考虑问题: 明确区分系统中不同用户权限系统中会不会出现用户冲突系统会不会因用户的权限的改变造成混乱 2、用户登陆密码是否是可见、可复制是否可以通过绝对途径登陆系统(拷贝用户登陆后的链接直接进入系统)用户退出系统后是否删除了所有鉴权标记,是否可以使用后退键而不通过输入口令进入系统 系统网络安全的测试要考虑问题测试采取的防护措施是否正确装配好,有关系统的补丁是否打上模拟非授权攻击,看防护系统是否坚固 采用成熟的网络漏洞检查工具检查系统相关漏洞(即用最专业的黑客攻击工具攻击试一下,现在最常用的是 NBSI 系列和 IPhacker IP ) 采用各种木马检查工具检查系统木马情况采用各种防外挂工具检查系统各组程序的外挂漏洞 6数据库安全考虑问题: 系统数据是否机密(比如对银行系统,这一点就特别重要,一般的网站就没有太高要求) 系统数据的完整性 系统数据可管理性 系统数据的独立性 系统数据可备份和恢复能力(数据备份是否完整,可否恢复,恢复是否可以完整) 什么是测试用例 什么是测试脚本 两者的关系是什么? 为实施测试而向被测试系统提供的输入数据、操作或各种环境设置以及期望结果的一个特定的集合。测试脚本是为了进行自动化测试而编写的脚本。测试脚本的编写必须对应相应的测试用例 简述什么是静态测试、动态测试、黑盒测试、白盒测试、α测试 β测试 静态测试不运行程序本身而寻找程序代码中可能存在的错误或评估程序代码的过程。 动态测试是实际运行被测程序,输入相应的测试实例,检查运行结果与预期结果的差异,判 定执行结果是否符合要求,从而检验程序的正确性、可靠性和有效性,并分析系统运行效率 和健壮性等性能。 黑盒测试一般用来确认软件功能的正确性和可操作性,目的是检测软件的各个功能是否能得 以实现,把被测试的程序当作一个黑盒,不考虑其内部结构,在知道该程序的输入和输出之间 的关系或程序功能的情况下,依靠软件规格说明书来确定测试用例和推断测试结果的正确 性。 白盒测试根据软件内部的逻辑结构分析来进行测试,是基于代码的测试,测试人员通过阅读 程序代码或者通过使用开发工具中的单步调试来判断软件的质量,一般黑盒测试由项目经理 在程序员开发中来实现。 α测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环 境下进行的受控测试,Alpha 测试不能由程序员或测试员完成。 β测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在 测试现场,Beta 测试不能由程序员或测试员完成。 软件产品质量特性是什么? ? 功能性:适应性、准确性、互操作性、依从性、安全性。 可靠性:成熟性、容错性、以恢复性。 可使用性:易理解性、易学习性、易操作性。 效率:时间特性、资源特性。 可维护性:易分析性、易变更性、稳定性、易测试性。 可移植性: 适应性、易安装性、遵循性、易替换性。 软件测试的策略是什么? ? 软件测试策略:在一定的软件测试标准、测试规范的指导下,依据测试项目的特定环境约束 而规定的软件测试的原则、方式、方法的集合。 测试策略有Beta测试的策略)。 软件测试分为几个阶段 软件测试按阶段划分可以分为单元测试、集成测试、系统测试和验收测试个阶段 测试人员在软件开发过程中的任务是什么? 寻找 Bug; 2、避免软件开发过程中的缺陷; 3、衡量软件的品质; 4、关注用户的需求。 总的目标是:确保软件的质量。 黑盒测试和白盒测试是软件测试的两种基本方法,请分别说明各自的优点和缺点 黑盒测试的优点有: 1比较简单,不需要了解程序内部的代码及实现;与软件的内部实现无关; 从用户角度出发,能很容易的知道用户会用到哪些功能,会遇到哪些问题; 基于软件开发文档,所以也能知道软件实现了文档中的哪些功能; 在做软件自动化测试时较为方便。 黑盒测试的缺点有: 不可能覆盖所有的代码,覆盖率较低,大概只能达到总代码量的 30%; 自动化测试的复用性较低。 白盒测试的优点有: 1帮助软件测试人员增大代码的覆盖率,提高代码的质量,发现代码中隐藏的问题 白盒测试的缺点有: 1程序运行会有很多不同的路径,不可能测试所有的运行路径; 测试基于代码,只能测试开发人员做的对不对,而不能知道设计的正确与否,可能会漏掉一 些功能需求; 系统庞大时,测试开销会非常大。 如何测试一个纸杯? 功能度:用水杯装水看漏不漏;水能不能被喝到 2、安全性:杯子有没有毒或细菌 3、可靠性:杯子从不同高度落下的损坏程度 4、可移植性:杯子在不同的地方、温度等环境下是否都可以正常使用 5、兼容性:杯子是否能够容纳果汁、白水、酒精、汽油等 6、易用性:杯子是否烫手、是否有防滑措施、是否方便饮用 7、用户文档:使用手册是否对杯子的用法、限制、使用条件等有详细描述 8、疲劳测试:将杯子盛上水(案例一)放 24 小时检查泄漏时间和情况;盛上汽油(案例二)放 24 小时检查泄漏时间和情况等 压力测试:用根针并在针上面不断加重量,看压强多大时会穿透 测试计划工作的目的是什么?测试计划文档的内容应该包括什么?其中哪些是最重要的? 答案:软件测试计划是指导测试过程的纲领性文件。 包含了产品概述、测试策略、测试方法、测试区域、测试配置、测试周期、测试资源、测试 交流、风险分析等内容。借助软件测试计划,参与测试的项目成员,尤其是测试管理人员, 可以明确测试任务和测试方法,保持测试实施过程的顺畅沟通,跟踪和控制测试进度,应对 测试过程中的各种变更。 测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划 测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。 所以其中最重要的是测试测试策略和测试方法(最好是能先评审)。 黑盒测试的测试用例常见设计方法都有哪些? 等价类划分 划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.等价类划分可有两种不同的情况:有效等价类和无效等价类. 边界值分析法 边界值分析方法是对等价类划分方法的补充。测试工作经验告诉我,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部.因此针对各种边界情况设计测试用例,可以查出更多的错误.使用边界值分析方法设计测试用例,首先应确定边界情况.通常输入和输出等价类的边界,就是应着重测试的边界情况.应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据. 3)错误猜测法 基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法 4)因果图方法 前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件 之间的联系, 相互组合等. 考虑输入条件之间的相互组合,可能会产生一些新的情况. 但要 检查输入条件的组合不是一件容易的事情, 即使把所有输入条件划分成等价类,他们之间的 组合情况也相当多. 因此必须考虑采用一种适合于描述对于多种条件的组合,相应产生多个 动作的形式来考虑设计测试用例. 这就需要利用因果图(逻辑模型). 因果图方法最终生成 的就是判定表. 它适合于检查程序输入条件的各种组合情况. 5)正交表分析法 有时候,可能因为大量的参数的组合而引起测试用例数量上的激增,同时,这些测试用例并 没有明显的优先级上的差距,而测试人员又无法完成这么多数量的测试,就可以通过正交表 来进行缩减一些用例,从而达到尽量少的用例覆盖尽量大的范围的可能性。 6)场景分析方法 指根据用户场景来模拟用户的操作步骤,这个比较类似因果图,但是可能执行的深度和可行 性更好。 7)状态图法 通过输入条件和系统需求说明得到被测系统的所有状态,通过输入条件和状态得出输出条 件;通过输入条件、输出条件和状态得出被测系统的测试用例。 详细的描述一个测试活动完整的过程。 项目经理通过和客户的交流,完成需求文档 开发人员和测试人员共同完成需求文档的评审, 项目经理通过综合开发人员,测试人员以及客户的意见,完成项目计划。 SQA 进入项目,开始进行统计和跟踪开发人员根据需求文档完成需求分析文档,测试人员进行评审,评审的主要内容包括是否有遗漏或者双方理解不同的地方。测试人员完成测试计划文档,测试计划包括的内容上面有描述。 写测试用例,同时开发人员完成概要设计文档,详细设计文档。此两份文档成为测试人员撰写测试用例的补充材料。 测试用例完成后,测试和开发需要进行评审。 测试人员搭建环境开发人员提交第一个版本,可能存在未完成功能,需要说明。测试人员进行测试,发现 BUG后提交 开发提交第二个版本测试人员进行测试。重复上面的工作,一般是 3-4 个版本后 BUG 数量减少,达到出货的要求。如果有客户反馈的问题,需要测试人员协助重现并重新测试。软件验收测试包括 ___ 、 ___ 、 ____ 三种类型。 软件验收测试包括正式验收测试、alpha 测试、beta 测试三种测试。 系统测试的策略有 _________等 ?15 ?种方法。(该题15 ?个空) 性能测试、负载测试、强度测试、易用性测试、安全测试、配置测试、安装测试、文档测试、故障恢复测试、用户界面测试、恢复测试、分布测试、可用性测试。 设计系统测试计划需要参考的项目文档有 ___ 、 ___ 和 ____ 。 软件测试计划、软件需求工件、和迭代计划。 软件测试项目从什么时候开始?为什么? 软件测试应该在需求分析阶段就介入,因为测试的对象不仅仅是程序编码,应该对软件开发过程中产生的所有产品都测试,并且软件缺陷存在放大趋势.缺陷发现的越晚,修复它所花费的成本就越大.什么是回归测试? ? 回归测试: (regression testing): 回归测试有两类:用例回归和错误回归; 用例回归是过一段时间以后再回头对以前使用过的用例在重新进行测试,看看会重新发现问题。 错误回归,就是在新版本中,对以前版本中出现并修复的缺陷进行再次验证,并以缺陷为核心,对相关修改的部分进行测试的方法。 单元测试、集成测试、系统测试的侧重点是什么? 1单元测试针对的是软件设计的最小单元--程序模块(面向过程中是函数、过程;面向对象中是类),进行正确性检验的测试工作,在于发现每个程序模块内部可能存在的差错.一般有两个步骤:人工静态检查\动态执行跟踪 集成测试针对的是通过了单元测试的各个模块所集成起来的组件进行检验,其主要内容是各个单元模块之间的接口,以及各个模块集成后所实现的功能.3、系统测试针对的是集成好的软件系统,作为整个计算机系统的一个元素,与计算机硬件\外设\某些支持软件\数据和人员等其他系统元素结合在一起,要在实际的运行环境中,对计算机系统进行一系列的集成测试和确认测试. 设计用例的方法 白盒测试用例设计有如下方法:逻辑覆盖、循环覆盖和基本路径覆盖 黑盒测试用例设计方法:等价类划分、边界值分析、错误猜测、因果图、状态图、测试大纲、场景法、正交策略表。 一个测试工程师应具备那些素质? 责任心 2、沟通能力 3、团队合作精神 4、耐心、细心、信心 5、时时保持怀疑态度,并且有缺陷预防的意识 6、具备一定的编程经验 集成测试通常都有那些策略? 基于分解的集成:大爆炸集成\自顶向下集成\自底向上集成\ 三明治集成\基于调用图的集成\基于路径的集成\分层集成\基于功能的集成\高频集成\基于进度的集成\基于风险集成\基于事件集成\基于使用的集成\C/S 集成 你所了解的的软件测试类型都有哪些,简单介绍一下。 按测试 策略分类:1、静态与动态测试 2、黑盒与白盒测试 3、手工和自动测试 4、冒烟测试 5、回归测试; 按测试阶段分类:单元测试、集成测试、系统测试; 其他常见测试方法:1、功能测试 2、性能测试 3、压力测试 4、负载测试 5、易用性测试 6、安装测试 7、界面测试 8、配置测试 9、文档测试 10、兼容性测试 11、安全性测试 12、恢复测试 分别概述创建测试计划与测试详细规格、测试用例 应把详细的测试技术指标包含到独立创建的测试详细规格文档,把用于指导测试小组执行测试过程的测试用例放到独立创建的测试用例文档或测试用例管理数据库中。测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。 您认为做好测试用例设计工作的关键是什么? 白盒测试用例设计的关键是以较少的用例覆盖尽可能多的内部程序逻辑结果黑盒法用例设计的关键同样也是以较少的用例覆盖模块输出和输入接口。不可能做到完全测试,以最少的用例在合理的时间内发现最多的问题 性能测试工作的目的是什么?做好性能测试工作的关键是什么? 性能测试的目的主要是发现在并发多用户和大数据量操作时是否会出现与需求有差异的地方。性能测试工作的关键是做好系统分析和功能分析,确定系统瓶颈所在你的测试职业发展目标是什么? 测试经验越多,测试能力越高。所以我的职业发展是需要时间累积的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前 3 年累积测试经验,不断的更新自己改正自己,做好测试任务。测试结束的标准是什么? 从微观上来说,在测试计划中定义,比如系统在一定性能下平稳运行 72 小时,目前中,本版本中没有一般严重的 BUG,普通 BUG 的数量在 3 以下,BUG 修复率 90%以上等等参数,然后由开发经理,测试经理,项目经理共同签字认同版本 Release。如果说宏观的,则是当这个软件彻底的消失以后,测试就结束了。软件测试分为黑盒和白盒,分别适合什么情况? 白盒测试又称为结构测试、逻辑驱动测试或基于程序本身的测试,它着重于程序的内部结构及算法,通常不关心功能与性能指标; 黑盒测试又被称为功能测试、数据驱动测试或基于规格说明的测试,它实际上是站在最终用户的立场,检验输入输出信息及系统性能指标是否符合规格说明书中有关功能需求及性能需求的规定。 一套完整的测试应该由哪些阶段组成? 可行性分析、需求分析、概要设计、详细设计、编码、单元测试、集成测试、系统测试、验收测试 测试用例通常包括那些内容? 软件测试用例的基本要素包括测试用例编号、测试标题、重要级别、测试输入、操作步骤、预期结果。 你的测试职业发展目标是什么? 测试经验越多,测试能力越高。所以我的职业发展是需要时间累积的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前 3 年累积测试经验,按如何做好测试工程师的要求自己,不断的更新自己改正自己,做好测试任务。 请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。 黑盒测试:已知产品的功能设计规格,可以进行测试证明每个实现了的功能是否符合要求。 这种方法是把测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据程序的需求规格说明书,检查程序的功能是否符合它的功能说明。因此黑盒测试又叫功能测试或数据驱动测试黑盒测试主要是为了发现以下几类错误: 1、是否有不正确或遗漏的功能? 2、在接口上,输入是否能正确的接受?能否输出正确的结果? 3、是否有数据结构错误或外部信息(例如数据文件)访问错误? 4、性能上是否能够满足要求? 5、是否有初始化或终止性错误? 白盒测试:已知产品的内部工作过程,可以通过测试证明每种内部操作是否符合设计规格要求,所有内部成分是否以经过检查。软件的白盒测试是对软件的过程性细节做细致的检查。这种方法是把测试对象看做一个打开的盒子,它允许测试人员利用程序内部的逻辑结构及有关信息,设计或选择测试用例,对程序所有逻辑路径进行测试。通过在不同点检查程序状态,确定实际状态是否与预期的状态一致。因此白盒测试又称为结构测试或逻辑驱动测试。白盒测试主要是想对程序模块进行如下检查: 1、对程序模块的所有独立的执行路径至少测试一遍。 2、对所有的逻辑判定,取“真”与取“假”的两种情况都能至少测一遍。 3、在循环的边界和运行的界限内执行循环体。 4、测试内部数据结构的有效性,等等。 单元测试(模块测试)是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。 集成测试(也叫组装测试,联合测试)是单元测试的逻辑扩展。它的最简单的形式是:两个已经测试过的单元组合成一个组件,并且测试它们之间的接口。从这一层意义上讲,组件是指多个单元的集成聚合。在现实方案中,许多单元组合成组件,而这些组件又聚合成程序的更大部分。方法是测试片段的组合,并最终扩展进程,将您的模块与其他组的模块一起测试。最后,将构成进程的所有模块一起测试。 系统测试是将经过测试的子系统装配成一个完整系统来测试。它是检验系统是否确实能提供系统方案说明书中指定功能的有效方法。(常见的联调测试)系统测试的目的是对最终软件系统进行全面的测试,确保最终软件系统满足产品需求并且遵循系统设计。 验收测试是部署软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。验收测试是向未来的用户表明系统能够像预定要求那样工作。经集成测试后,已经按照设计把所有的模块组装成一个完整的软件系统,接口错误也已经基本排除了,接着就应该进一步验证软件的有效性,这就是验收测试的任务,即软件的功能和性能如同用户所合理期待的那样。 当开发人员说不是bug时,你如何应付? 开发人员说不是 bug,有 2 种情况 一是需求没有确定,所以我可以这么做,这个时候可以找来产品经理进行确认,需不需要改动,3 方商量确定好后再看要不要改。 二是这种情况不可能发生,所以不需要修改,这个时候,我可以先尽可能的说出是 BUG 的依据是什么,如果被用户发现或出了问题,会有什么不良结果,程序员可能会给你很多理由,你可以对他的解释进行反驳。 为什么要在一个团队中开展软件测试工作? 因为没有经过测试的软件很难在发布之前知道该软件的质量,就好比 ISO 质量认证一样,测试同样也需要质量的保证,这个时候就需要在团队中开展软件测试的工作。在测试的过程发现软件中存在的问题,及时让开发人员得知并修改问题,在即将发布时,从测试报告中得出软件的质量情况。 如果有机会转成开发人员,你会去做开发工作吗? 如果公司确实需要我可以从事开发,但我还是喜欢做测试,我认为我更适合做测试。 软件测试分哪些阶段?各阶段的含义? 分为单元测试、集成测试、确认测试、系统测试、验收测试。单元测试是最小单位的测试,测试独立模块;集成测试主要测试模块之间的接口是否正常,确认测试类似于冒烟测试通常在大规模系统测试之前验证版本主要功能是否实现,版本的稳定性是否可以进入系统测试,系统测试是全面测试验证系统是否满足用户需求包括功能、性能、兼容性等等。验收测试是用户参与的测试。 一份测试计划应该包括哪些内容? 背景、项目简介、目的、测试范围、测试策略、人员分工、资源要求、进度计划、参考文档、常用术语、提交文档、风险分析。 针对于软件的行业背景,你如何理解软件的业务? 阅读用户手册了解软件的功能和操作流程;看一些业务的专业书籍补充业务知识;如果有用户实际的数据,可以拿实际的数据进行参考;参考以前的用例和 BUG 报告;在使用软件的过程中多思考;多与产品经理交流。 测试用例应包括哪些内容? 编号、模块名称、编写人、日期、操作说明、输入数据、预期结果等。 。 。 对某软件进行测试,发现在 WIN98 ?上运行得很慢,怎么判别是该软件存在问题还是其软硬件运行环境存在问题? 看软件的运行环境要求。如果符合要求则是程序存在问题,若不符合要求则是硬件系统存在问题 CPU资源的服务; 4、如果是C/S或者B/S结构的软件,需要检查是不是因为与服务器的连接有问题,或者访问有问题造成的; 5、在系统没有任何负载的情况下,查看性能监视器,确认应用程序对CPU/内存的访问情况。 正交表测试用例设计方法的特点是什么? 用最少的实验覆盖最多的操作,测试用例设计很少,效率高,但是很复杂; 对于基本的验证功能,以及二次集成引起的缺陷,一般都能找出来;但是更深的缺陷,更复杂的缺陷,还是无能为力的;具体的环境下,正交表一般都很难做的。大多数,只在系统测试的时候使用此方法。 描述使用bugzilla缺陷管理工具对软件缺陷(BUG)跟踪的管理的流程? 就是Bugzilla的状态转换图。 你觉得bugzilla在使用的过程中,有什么问题? 界面不稳定; 根据需要配置它的不同的部分,过程很烦琐。 流程控制上,安全性不好界定,很容易对他人的Bug进行误操作; 没有综合的评分指标,不好确认修复的优先级别。 描述测试用例设计的完整过程? 需求分析 + 需求变更的维护工作; 根据需求 得出测试需求; 设计测试方案,评审测试方案; 方案评审通过后,设计测试用例,再对测试用例进行评审; 单元测试的策略有哪些? 逻辑覆盖、循环覆盖、同行评审、桌前检查、代码走查、代码评审、景泰数据流分析 LoadRunner分哪三部分? 用户动作设计;场景设计;测试数据分析; LoadRunner进行测试的流程? 测试测试 创建虚拟用户脚本 创建运行场景 运行测试脚本 监视场景 分析测试的结果 以上,最好是结合一个案例,根据以上流程来介绍。 什么是并发?在LoadRunner中,如何进行并发的测试?集合点失败了会怎么样? 在同一时间点,支持多个不同的操作。 LoadRunner中提供IP伪装,集合点,配合虚拟用户的设计,以及在多台电脑上设置,可以比较好的模拟真实的并发。 集合点,即是多个用户在某个时刻,某个特定的环境下同时进行虚拟用户的操作的。集合点失败,则集合点的才操作就会取消,测试就不能进行。 使用QTP做功能测试,录制脚本的时候,要验证多个用户的登录情况/查询情况,如何操作? 分析用户登录的基本情况,得出一组数据,通过性测试/失败性测试的都有(根据TC来设计这些数据),然后录制登录的脚本,将关键的数据参数化,修改脚本,对代码进行加强,调试脚本。 QTP中的Action有什么作用?有几种? Action的作用 用Action可以对步骤集进行分组 步骤重组,然后被整体调用 拥有自己的sheet 组合有相同需求的步骤,整体操作 具有独立的对象仓库 Action的种类 可复用Action 不可复用Action 外部Action TestDirector有些什么功能,如何对软件测试过程进行管理? 需求管理 定义测试范围 定义需求树 描述需求树的功能点 测试计划 定义测试目标和测试策略。 分解应用程序,建立测试计划树。 确定每个功能点的测试方法。 将每个功能点连接到需求上,使测试计划覆盖全部的测试需求。 描述手工测试的测试步骤 指明需要进行自动测试的功能点 测试执行 定义测试集合。 为每个测试人员制定测试任务和测试日程安排。 运行自动测试。 缺陷跟踪 记录缺陷 查看新增缺陷,并确定哪些是需要修正的 相关技术人员修改缺陷 回归测试 分析缺陷统计图表,分析应用程序的开发质量。 软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录? 5C标准 Beta测试与Alpha测试有什么区别? Beta testing(β测试),测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场 Alpha testing (α测试),是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试 人员:用户、客户或有关部门开发人员,测试人员,需求分析师都可以,就看处于评审那个阶段 测试活动中,如果发现需求文档不完善或者不准确,怎么处理? 测试需求分析 发现需求文档不完善或者不准确,应该立即和相关人员进行协调交流。 阶段评审与项目评审有什么区别? 阶段评审 对项目各阶段评审:对阶段成果和工作 项目评审 对项目总体评审:对工作和产品 阐述工作版本的定义? 构造号: BUILD 什么是桩模块?什么是驱动模块? 桩模块:被测模块调用模块 驱动模块 调用被测模块 什么是扇入?什么是扇出? 扇入:被调次数,扇出:调其它模块数目 你认为做好测试计划工作的关键是什么? 软件测试计划就是在软件测试工作正式实施之前明确测试的对象,并且通过对资源、时间、风险、测试范围和预算等方面的综合分析和规划,保证有效的实施软件测试; 做好测试计划工作的关键 :目的,管理,规范 1. 明确测试的目标,增强测试计划的实用性 编写软件测试计划得重要目的就是使测试过程能够发现更多的软件缺陷,因此软件测试计划的价值取决于它对帮助管理测试项目,并且找出软件潜在的缺陷。因此,软件测试计划中的测试范围必须高度覆盖功能需求,测试方法必须切实可行,测试工具并且具有较高的实用性,便于使用,生成的测试结果直观、准确 2.坚持“5W”规则,明确内容与过程 “5W”规则指的是“What(做什么)”、“Why(为什么做)”、“When(何时做)”、“Where(在哪里)”、“How(如何做)”。利用“5W”规则创建软件测试计划,可以帮助测试团队理解测试的目的(Why),明确测试的范围和内容(What),确定测试的开始和结束日期(When),指出测试的方法和工具(How),给出测试文档和软件的存放位置(Where)。 3.采用评审和更新机制,保证测试计划满足实际需求 测试计划写作完成后,如果没有经过评审,直接发送给测试团队,测试计划内容的可能不准确或遗漏测试内容,或者软件需求变更引起测试范围的增减,而测试计划的内容没有及时更新,误导测试执行人员。 4. 分别创建测试计划与测试详细规格、测试用例 应把详细的测试技术指标包含到独立创建的测试详细规格文档,把用于指导测试小组执行测试过程的测试用例放到独立创建的测试用例文档或测试用例管理数据库中。测试计划和测试详细规格、测试用例之间是战略和战术的关系,测试计划主要从宏观上规划测试活动的范围、方法和资源配置,而测试详细规格、测试用例是完成测试任务的具体战术。软件配置管理贯穿于软件开发活动的始终,覆盖了开发活动的各个环节,它的重要作用之一就是要全面的管理保存各个配置项,监控各配置项的状态,并向项目经理及相关的人员报告,从而实现对软件过程的控制。MS SourceSafe、Rational ClearCase 而负载测试是压力相对较大的测试,主要是测试系统在一种或者集中极限条件下的相应能力,是性能测试的重要部分。100个用户对系统进行连续半个小时的访问可以看作压力测试,那么连续访问8个小时就可以认为负载测试,1000个用户连续访问系统1个小时也可以看作是负载测试。 实际上压力测试和负载测试没有明显的区分。测试人员应该站在关注整体性能的高度上来对系统进行测试。 什么是系统瓶颈? 瓶颈主要是指整个软硬件构成的软件系统某一方面或者几个方面能力不能满足用户的特定业务要求,“特定”是指瓶颈会在某些条件下会出现,因为毕竟大多数系统在投入前。 严格的从技术角度讲,所有的系统都会有瓶颈,因为大多数系统的资源配置不是协调的,例如CPU使用率刚好达到100%时,内存也正好耗尽的系统不是很多见。因此我们讨论系统瓶颈要从应用的角度讨论:关键是看系统能否满足用户需求。在用户极限使用系统的情况下,系统的响应仍然正常,我们可以认为改系统没有瓶颈或者瓶颈不会影响用户工作。 因此我们测试系统瓶颈主要是实现下面两个目的: -发现“表面”的瓶颈。主要是模拟用户的操作,找出用户极限使用系统时的瓶颈,然后解决瓶颈,这是性能测试的基本目标。 -发现潜在的瓶颈并解决,保证系统的长期稳定性。主要是考虑用户在将来扩展系统或者业务发生变化时,系统能够适应变化。满足用户目前需求的系统不是最好的,我们设计系统的目标是在保证系统整个软件生命周期能够不断适应用户的变化,或者通过简单扩展系统就可以适应新的变化。 文档测试主要包含什么内容? 在国内软件开发管理中,文档管理几乎是最弱的一项,因而在测试工作中特别容易忽略文档测试也就不足为奇了。要想给用户提供完整的产品,文档测试是必不可少的。文档测试一般注重下面几个方面: 文档的完整性:主要是测试文档内容的全面性与完整性,从总体上把握文档的质量。例如用户手册应该包括软件的所有功能模块。 描述与软件实际情况的一致性:主要测试软件文档与软件实际的一致程度。例如用户手册基本完整后,我们还要注意用户手册与实际功能描述是否一致。因为文档往往跟不上软件版本的更新速度。 易理解性:主要是检查文档对关键、重要的操作有无图文说明,文字、图表是否易于理解。对于关键、重要的操作仅仅只有文字说明肯定是不够的,应该附有图表使说明更为直观和明了。 文档中提供操作的实例:这项检查内容主要针对用户手册。对主要功能和关键操作提供的应用实例是否丰富,提供的实例描述是否详细。只有简单的图文说明,而无实例的用户手册看起来就像是软件界面的简单拷贝,对于用户来说,实际上没有什么帮助。 印刷与包装质量:主要是检查软件文档的商品化程度。有些用户手册是简单打印、装订而成,过于粗糙,不易于用户保存。优秀的文档例如用户手册和技术白皮书,应提供商品化包装,并且印刷精美。 功能测试用例需要详细到什么程度才是合格的? 这个问题也是测试工程师经常问的问题。有人主张测试用例详细到每个步骤执行什么都要写出来,目的是即使一个不了解系统的新手都可以按照测试用例来执行工作。主张这类写法的人还可以举出例子:欧美、日本等软件外包文档都是这样做的。 另外一种观点就是主张写的粗些,类似于编写测试大纲。主张这种观点的人是因为软件开发需求管理不规范,变动十分频繁,因而不能按照欧美的高标准来编写测试用例。这样的测试用例容易维护,可以让测试执行人员有更大的发挥空间。 实际上,软件测试用例的详细程度首先要以覆盖到测试点为基本要求。举个例子:“用户登陆系统”的测试用例可以不写出具体的执行数据,但是至少要写出五种以上情况(),如果只用一句话覆盖了这个功能是不合格的测试用例。覆盖功能点不是指列出功能点,而是要写出功能点的各个方面(如果组合情况较多时可以采用等价划分)。 另一个影响测试用例的就是组织的开发能力和测试对象特点。如果开发力量比较落后,编写较详细的测试用例是不现实的,因为根本没有那么大的资源投入,当然这种情况很随着团队的发展而逐渐有所改善。测试对象特点重点是指测试对象在进度、成本等方面的要求,如果进度较紧张的情况下,是根本没有时间写出高质量的测试用例的,甚至有些时候测试工作只是一种辅助工作,因而不编写测试用例。 因此,测试用例的编写要根据测试对象特点、团队的执行能力等各个方面综合起来决定编写策略。最后要注意的是测试人员一定不能抱怨,力争在不断提高测试用例编写水平的同时,不断地提高自身能力。 配置和兼容性测试的区别是什么? 配置测试的目的是保证软件在其相关的硬件上能够正常运行,而兼容性测试主要是测试软件能否与不同的软件正确协作。 配置测试的核心内容就是使用各种硬件来测试软件的运行情况,一般包括: (1)软件在不同的主机上的运行情况,例如Dell和Apple; (2)软件在不同的组件上的运行情况,例如开发的拨号程序要测试在不同厂商生产的Modem上的运行情况; (3)不同的外设; (4)不同的接口; (5)不同的可选项,例如不同的内存大小; 兼容性测试的核心内容: (1)测试软件是否能在不同的操作系统平台上兼容; (2)测试软件是否能在同一操作系统平台的不同版本上兼容; (3)软件本身能否向前或者向后兼容; (4)测试软件能否与其它相关的软件兼容; (5)数据兼容性测试,主要是指数据能否共享; 配置和兼容性测试通称对开发系统类软件比较重要,例如驱动程序、操作系统、数据库管理系统等。具体进行时仍然按照测试用例来执行。 软件文档测试主要包含什么? 随着软件文档系统日益庞大,文档测试已经成为软件测试的重要内容。文档测试对象主要如下: -包装文字和图形; -市场宣传材料、广告以及其它插页; -授权、注册登记表; -最终用户许可协议; -安装和设置向导; -用户手册; -联机帮助; -样例、示范例子和模板; -…… 文档测试的目的是提高易用性和可靠性,降低支持费用,因为用户通过文档就可以自己解决问题。因文档测试的检查内容主要如下: -读者对象——主要是文档的内容是否能让该级别的读者理解; -术语——主要是检查术语是否适合读者; -内容和主题——检查主题是否合适、是否丢失、格式是否规范等; -图标和屏幕抓图——检查图表的准确度和精确度; -样例和示例——是否与软件功能一致; -拼写和语法; -文档的关联性——是否与其它相关文档的内容一致,例如与广告信息是否一致; 文档测试是相当重要的一项测试工作,不但要给予充分的重视,更要要认真的完成,象做功能测试一样来对待文档测试。 没有产品说明书和需求文档地情况下能够进行黑盒测试吗? 这个问题是国内测试工程师经常遇到的问题,根源就是国内软件开发文档管理不规范,对变更的管理方法就更不合理了。实际上没有任何文档的时候,测试人员是能够进行黑盒测试的,这种测试方式我们可以称之为探索测试,具体做法就是测试工程师根据自己的专业技能、领域知识等不断的深入了解测试对象、理解软件功能,进而发现缺陷。 在这种做法基本上把软件当成了产品说明书,测试过程中要和开发人员不断的进行交流。尤其在作项目的时候,进度压力比较大,可以作为加急测试方案。最大的风险是不知道有些特性是否被遗漏。 测试中的“杀虫剂怪事”是指什么? “杀虫剂怪事”一词由BorisBeizer在其编著的《软件测试技术》第二版中提出。用于描述测试人员对同一测试对象进行的测试次数越多,发现的缺陷就会越来越少的现象。就像老用一种农药,害虫就会有免疫力,农药发挥不了效力。这种现象的根本原因就是测试人员对测试软件过于熟悉,形成思维定势。 为了克服这种现象,测试人员需要不断编写新的测试程序或者测试用例,对程序的不同部分进行测试,以发现更多的缺陷。也可以引用新人来测试软件,刚刚进来的新手往往能发现一些意想不到的问题。 在配置测试中,如何判断发现的缺陷是普通问题还是特定的配置问题? 在进行配置测试时,测试工程师仍然会发现一些普通的缺陷,也就是与配置环境无关的缺陷。因此判断新发现的问题,需要在不同的配置中重新执行发现软件缺陷的步骤,如果软件缺陷不出现了,就可能是配置缺陷;如果在所有的配置中都出现,就可能是普通缺陷。 需要注意的是,配置问题可以在一大类配置中出现。例如,拨号程序可能在所有的外置Modem中都存在问题,而内置的Modem不会有任何问题。 完全测试程序是可能的吗? 软件测试初学者可能认为拿到软件后需要进行完全测试,找到全部的软件缺陷,使软件“零缺陷”发布。实际上完全测试是不可能的。主要有以下一个原因: -完全测试比较耗时,时间上不允许; -完全测试通常意味着较多资源投入,这在现实中往往是行不通的; -输入量太大,不能一一进行测试; -输出结果太多,只能分类进行验证; -软件实现途径太多; -软件产品说明书没有客观标准,从不同的角度看,软件缺陷的标准不同; 因此测试的程度要根据实际情况确定。 软件测试的风险主要体现在哪里? 我们没有对软件进行完全测试,实际就是选择了风险,因为缺陷极有可能存在没有进行测试的部分。举个例子,程序员为了方便,在调试程序时会弹出一些提示信息框,而这些提示只在某种条件下会弹出,碰巧程序发布前这些代码中的一些没有被注释掉。在测试时测试工程师又没有对其进行测试。如果客户碰到它,这将是代价昂贵的缺陷,因为交付后才被客户发现。 因此,我们要尽可能的选择最合适的测试量,把风险降低到最小。 发现的缺陷越多,说明软件缺陷越多吗? 这是一个比较常见的现象。测试工程师在没有找到缺陷前会绞尽脑汁的思考,但是找到一个后,会接二连三的发现很多缺陷,颇有个人成就感。其中的原因主要如下: -代码复用、拷贝代码导致程序员容易犯相同的错误。类的继承导致所有的子类会包含基类的错误,反复拷贝同一代码意味可能也复制了缺陷。 -程序员比较劳累是可以导致某些连续编写的功能缺陷较多。程序员加班是一种司空见惯的现象,因此体力不只时容易编写一些缺陷较多的程序。而这些连续潜伏缺陷恰恰时测试工程师大显身手的地方。 “缺陷一个连着一个”不是一个客观规律,只是一个常见的现象。如果软件编写的比较好,这种现象就不常见了。测试人员只要严肃认真的测试程序就可以了。 如何减少测试人员跳槽带来的损失? 在IT行业里跳槽已经是一种司空见惯的现象,而且跳槽无论给公司还是给个人都会带来一定的损失。测试队伍也无疑会面临跳槽的威胁,作为测试经理管理者,只有从日常工作中开始做起,最能最大限度的减少损失。建议我们从以下两个方面做起: -加强部门内员工之间的互相学习,互相学习是建立学习型组织的基本要求,是知识互相转移的过程。在此基础上,可以把个人拥有的技术以知识的形式沉积下来,也就完成了隐性知识到显性知识的转化。 -通常情况下,企业能为员工提供足够大的发展空间时,如果不是待遇特别低,员工都不会主动离开企业。因此我们要想留住员工,管理者就应该把员工的个人成长和企业的发展联系起来,为员工设定合理发展规划并付诸实现。不过这项要求做起来比较,要有比较好的企业文化为依托。 测试产品与测试项目的区别是什么? 习惯上把开发完成后进行商业化、几乎不进行代码修改就可以售给用户使用的软件成为软件产品,也就是可以买“卖拷贝”的软件,例如Windows2000。而通常把针对一个或者几个特定的用户而开发的软件成为软件项目,软件项目是一种个性化的产品,可以是按照用户要求全部重新开发,也可以修改已有的软件产品来满足特定的用户需求。项目和产品的不同特点,决定我们测试产品和测试项目仍然会有很多不同的地方: -质量要求不同。通常产品的质量要高一些,修复发布后产品的缺陷成本较高,甚至会带来很多负面的影响。而做项目通常面向某一用户,虽然质量越高越好,但是一般只要满足用户要求就可以了。 -测试资源投入多少不同。做软件产品通常是研发中心来开发,进度压力要小些。同时由于质量要求高,因此会投入较多的人力、物力资源。 -项目最后要和用户共同验收测试,这是产品测试不具有的特点。 此外,测试产品与测试项目在缺陷管理方面、测试策略制定都会有很大不同,测试管理者应该结合具体的环境,恰如其分的完成工作。 用户共同测试(UAT测试)的注意点有哪些? 软件产品在投产前,通常都会进行用户验收测试。如果用户验收测试没有通过,直接结果就是那不到“Money”,间接影响是损害了公司的形象,而后者的影响往往更严重。根据作者的经验,用户验收测试一定要让用户满意。 实际上用户现场测试更趋于是一种演示。在不欺骗用户的前提下,我们向用户展示我们软件的优点,最后让“上帝”满意并欣然掏出“银子”才是我们的目标。因此用户测试要注意下面的事项: (1)用户现场测试不可能测试全部功能,因此要测试核心功能。这需要提前做好准备,这些核心功能一定要预先经过测试,证明没有问题才可以和用户共同进行测试。测试核心模块的目的是建立用户对软件的信心。当然如果这些模块如果问题较多,不应该进行演示。 (2)如果某些模块确实有问题,我们可以演示其它重要的业务功能模块,必要时要向用户做成合理的解释。争得时间后,及时修改缺陷来弥补。 (3)永远不能欺骗用户,蒙混过关。道理很简单,因为软件是要给用户用的,问题早晚会暴露出来,除非你可以马上修改。 和用户进行测试还要注意各种交流技巧,争取不但短期利益得到了满足,还要为后面得合作打好基础。 如何编写提交给用户的测试报告? 随着测试工作越来越受重视,开发团队向客户提供测试文档是不可避免的事情。很多人会问:“我们可以把工作中的测试报告提供给客户吗?”答案是否定的。因为提供内部测试报告,可能会让客户失去信心,甚至否定项目。 测试报告一般分为内部测试报告和外部测试报告。内部报告是我们在测试工作中的项目文档,反映了测试工作的实施情况,这里不过多讨论,读者可以参考相关教材。这里主要讨论一下外部测试报告的写法,一般外部测试报告要满足下面几个要求: -根据内部测试报告进行编写,一般可以摘录; -不可以向客户报告严重缺陷,即使是已经修改的缺陷,开发中的缺陷也没有必要让客户知道; -报告上可以列出一些缺陷,但必须是中级的缺陷,而且这些缺陷必须是修复的; -报告上面的内容尽量要真实可靠; -整个测试报告要仔细审阅,力争不给项目带来负面作用,尤其是性能测试报告。 总之,外部测试报告要小心谨慎的编写。 测试工具在测试工作中是什么地位? 国内的很多测试工程师对测试工具相当迷恋,尤其是一些新手,甚至期望测试工具可以取代手工测试。测试工具在测试工作中起的是辅助作用,一般用来提高测试效率。自动化测试弥补了手工测试的不足,减轻一定的工作量。实际上测试工具是无法替代大多数手工测试的,而一些诸如性能测试等自动化测试也是手工所不能完成的。 对于自动测试技术,应当依据软件的不同情况来分别对待,一般自动技术会应用在引起大量重复性工作的地方、系统的压力点、以及任何适合使用程序解决大批量输入数据的地方。然后再寻找合适的自动测试工具,或者自己开发测试程序。一定不要为了使用测试工具而使用。 简述负载测试与压力测试的区别。 压力测试(Stress Testing) 压力测试的主要任务就是获取系统正确运行的极限,检查系统在瞬间峰值负荷下正确执行的能力。例如,对服务器做压力测试时就可以增加并发操作的用户数量;或者不停地向服务器发送请求;或一次性向服务器发送特别大的数据等。看看服务器保持正常运行所能达到的最大状态。人们通常使用测试工具来完成压力测试,如模拟上万个用户从终端同时登录,这是压力测试中常常使用的方法。 负载测试(Volume Testing) 用于检查系统在使用大量数据的时候正确工作的能力,即检验系统的能力最高能达到什么程度。例如,对于信息检索系统,让它使用频率达到最大;对于多个终端的分时系统,让它所有的终端都开动。在使整个系统的全部资源达到“满负荷”的情形下,测试系统的承受能力。 写出bug报告流转的步骤,每步的责任人及主要完成的工作。 (要结合自己实际的工作经验进行回答,不同公司略有区别) 测试人员提交新的Bug入库,错误状态为New。 高级测试员/测试经理验证错误,如果确认是错误,分配给开发组。设置状态为Open。如果不是错误,则拒绝,设置为Declined状态。 开发经理分配bug至对应的模块开发人员。 开发人员查询状态为Open的Bug,如果不是错误,则置状态为Declined;如果是Bug则修复并置状态为Fixed。不能解决的Bug,要留下文字说明及保持Bug为Open状态。 对于不能解决和延期解决的Bug,不能由开发人员自己决定,一般要通过某种会议(评审会)通过才能认可。 测试人员查询状态为Fixed的Bug,然后验证Bug是否已解决,如解决,置Bug的状态为Closed,如没有解决,置bug状态为Reopen。 写出bug报告当中一些必备的内容。 硬件平台和操作系统 测试应用的硬件平台(Platform),通常选择“PC”。 测试应用的操作系统平台(OS)。 版本 提交缺陷报告时通过该字段标识此缺陷存在于被测试软件的哪个版本。 Bug报告优先级 Bug状态 Bug的编号 发现人 提交人 指定处理人 概述 从属关系 详细描述 严重程度 所属模块 附件 提交日期 开发人员老是犯一些低级错误怎么解决? 这种现象在开发流程不规范的团队里特别常见,尤其是一些“作坊式”的团队里。解决这种问题一般从两个方面入手: 一方面从开发管理入手,也就是从根源来解决问题。可以制定规范的开发流程,甚至可以制定惩罚制度,还有就是软件开发前做好规划设计。 另一方面就是加强测试,具体做法就是加强开发人员的自己测试,把这些问题“消灭”在开发阶段,这是比较好的做法,读者可以参考第13章试案例分析的“13.1.2缺陷反复出现,谁的责任”小节,13.1.2专门讨论了这类问题的方法。 此外,还可以通过规范的缺陷管理来对开发人员进行控制,比如测试部门整理出常见的缺陷,让开发人员自己对照进行检查,以减少这类低级错误的发生。 开发人员犯错误是正常的现象,作为测试人员一定不能抱怨,要认认真真的解决问题才是上策。 画出软件测试的V模型图。 为什么要在一个团队中开展软件测试工作? 因为没有经过测试的软件很难在发布之前知道该软件的质量,就好比ISO质量认证一样,测试同样也需要质量的保证,这个时候就需要在团队中开展软件测试的工作。在测试的过程发现软件中存在的问题,及时让开发人员得知并修改问题,在即将发布时,从测试报告中得出软件的质量情况。 您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作? (根据项目经验不同,灵活回答即可) 我曾经做过web测试,后台测试,客户端软件,其中包括功能测试,性能测试,用户体验测试。最擅长的是功能测试 请以您以往的实际工作为例,详细的描述一次测试用例设计的完整的过程。 就说最近的这次网站功能的测试吧 首先:得到相关文档(需求文档和设计文档),理解需求和设计设计思想后,想好测试策略(测试计划简单点就OK了),考虑到测试环境,测试用例,测试时间等问题。 第二步:设计测试用例,测试策略是:把网站部分的功能点测试完,然后在进行系统测试(另外个模块呢有另一个测试人员负责,可以进行联调测试),网站模块的测试基本是功能测试和界面测试(用户并发的可能性很小,所以不考虑):这次的网站的输入数据呢是使用数据库中的某张表记录,如果表中某一数据记录中新加进来的(还没有被处理的,有个标志位),网站启动后会立刻去刷那张表,得到多条数据,然后在进行处理。处理过程中,会经历3个步骤,网站才算完成了它的任务。有3个步骤呢,就可以分别对 这3个步骤进行测试用例的设计,尽量覆盖到各种输入情况(包括数据库中的数据,用户的输入等),得出了差不多50个用例。界面测试,也就是用户看的到的地方,包括发送的邮件和用户填写资料的页面展示。 第三步:搭建测试环境(为什么这个时候考虑测试环境呢?因为我对网站环境已经很熟了,只有有机器能空于下来做该功能测试就可以做了),因为网站本身的环境搭建和其他的系统有点不同,它需要的测试环境比较麻烦,需要web服务器(Apache,tomcat),不过这次需求呢,网站部分只用到了tomcat,所以只要有tomcat即可 第四步:执行测试 您以往是否曾经从事过性能测试工作?如果有,请尽可能的详细描述您以往的性能测试工作的完整过程。 (以自己最熟悉的性能测试项目为例) 是的,曾经做过网站方面的性能测试,虽然做的时间并不久(2个月吧),当时呢,是有位网站性能测试经验非常丰富的前辈带着我一起做。 性能测试类型包括负载测试,强度测试,容量测试等 负载测试:负载测试是一种性能测试指数据在超负荷环境中运行,程序是否能够承担。 强度测试: 强度测试是一种性能测试,他在系统资源特别低的情况下软件系统运行情况 容量测试:确定系统可处理同时在线的最大用户数? ? 在网站流量逐渐加大的情况下,开始考虑做性能测试了,首先要写好性能测试计划,根据运营数据得出流量最大的页面(如果是第一次的话,一般是首页,下载页,个人帐户页流量最大,而且以某种百分比), Web服务器指标指标: Avg Rps: 平均每秒钟响应次数=总请求时间 / 秒数; Successful Rounds:成功的请求; Failed Rounds :失败的请求; Successful Hits :成功的点击次数; Failed Hits :失败的点击次数; Hits Per Second :每秒点击次数; Successful Hits Per Second :每秒成功的点击次数; Failed Hits Per Second :每秒失败的点击次数; Attempted Connections :尝试链接数; 你对测试最大的兴趣在哪里?为什么? 最大的兴趣就是测试有难度,有挑战性!做测试越久越能感觉到做好测试有多难。曾经在无忧测试网上看到一篇文章,是关于如何做好一名测试工程师。一共罗列了11,12点,有部分是和人的性格有关,有部分需要后天的努力。但除了性格有关的1,2点我没有把握,其他点我都很有信心做好它。 你以前工作时的测试流程是什么? (灵活回答) 公司对测试流程没有规定如何做,但每个测试人员都有自己的一套测试流程。我说下我1年来不断改正(自己总结,吸取同行的方法)后的流程吧。需求评审(有开发人员,产品经理,测试人员,项目经理)->需求确定(出一份确定的需求文档)->开发设计文档(开发人员在开始写代码前就能输出设计文档)->想好测试策略,写出测试用例->发给开发人员和测试经理看看(非正式的评审用例)->接到测试版本->执行测试用例(中间可能会补充用例)->提交bug(有些bug需要开发人员的确定(严重级别的,或突然发现的在测试用例范围之外的,难以重现的),有些可以直接录制进TD)->开发人员修改(可以在测试过程中快速的修改)->回归测试(可能又会发现新问题,再按流程开始跑)。 当开发人员说不是BUG时,你如何应付? 开发人员说不是bug,有2种情况,一是需求没有确定,所以我可以这么做,这个时候可以找来产品经理进行确认,需不需要改动,3方商量确定好后再看要不要改。二是这种情况不可能发生,所以不需要修改,这个时候,我可以先尽可能的说出是BUG的依据是什么?如果被用户发现或出了问题,会有什么不良结果?程序员可能会给你很多理由,你可以对他的解释进行反驳。如果还是不行,那我可以给这个问题提出来,跟开发经理和测试经理进行确认,如果要修改就改,如果不要修改就不改。其实有些真的不是bug,我也只是建议的方式写进TD中,如果开发人员不修改也没有大问题。如果确定是bug的话,一定要坚持自己的立场,让问题得到最后的确认。 10.2 其他概括问题 ——考查点:基本的测试知识,对测试是否认可 谈一谈过去自己的工作 ——考查点:了解经历、提供进一步提问的素材,表达能力、测试技能 测试设计的方法并举例说明 ——考查点:测试技术的使用 测试工具 ——考查点:熟悉程度,能否与当前工作匹配? 如何做计划?如何跟踪计划? ——考查点:日常工作能力 如果开发人员提供的版本不满足测试的条件,如何做? ——考查点:与开发人员协作的能力 熟悉unix系统、oracle数据库吗? ——考查点:是否具备系统知识 做过开发吗?写过哪些代码? ——考查点:开发技能 阅读英语文章,给出理解说明? ——考查点:部分英语能力 文档的意义 ——考查点:是否善于思考?(最简单的概念,不同层次的理解) 假如进入我们公司,对我们哪些方面会有帮助? ——考查点:讲讲自己的特长 随便找一件物品,让其测试 ——考查点:测试的实际操作能力 有一个新的软件,假如你是测试工程师,该如何做 ——考查点:实际项目经验、是否有带领测试团队的经验和潜力 11 常用技术面试题() HDFS有 namenode、secondraynamenode、datanode 组成。 namenode 负责管理 datanode 和记录元数据 secondraynamenode 负责合并日志 datanode 负责存储数据 mapreduce开发中使用过哪些算法 单词统计pv 数据去重uv topn 最受欢迎的排序 使用mapreduce处理数据,数据倾斜指什么? map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完,此称之为数据倾斜。 mapreduce的原理 "Map(映射)"和"Reduce(归约),以及中间的shuffle过程 HDFS读写数据的过程 读: 1、跟namenode通信查询元数据,找到文件块所在的datanode服务器 2、挑选一台datanode(就近原则,然后随机)服务器,请求建立socket流 3、datanode开始发送数据(从磁盘里面读取数据放入流,以packet为单位来做校验) 4、客户端以packet为单位接收,现在本地缓存,然后写入目标文件 写: 1、根namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在 2、namenode返回是否可以上传 3、client请求第一个 block该传输到哪些datanode服务器上 4、namenode返回3个datanode服务器ABC 5、client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端 6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答 7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。 RDD中reduceBykey与groupByKey哪个性能好,为什么 reduceByKey:reduceByKey会在结果发送至reducer之前会对每个mapper在本地进行merge,有点类似于在MapReduce中的combiner。这样做的好处在于,在map端进行一次reduce之后,数据量会大幅度减小,从而减小传输,保证reduce端能够更快的进行结果计算。 groupByKey:groupByKey会对每一个RDD中的value值进行聚合形成一个序列(Iterator),此操作发生在reduce端,所以势必会将所有的数据通过网络进行传输,造成不必要的浪费。同时如果数据量十分大,可能还会造成OutOfMemoryError。 通过以上对比可以发现在进行大量数据的reduce操作时候建议使用reduceByKey。不仅可以提高速度,还是可以防止使用groupByKey造成的内存溢出问题。 spark2.0的了解 更简单:ANSI SQL与更合理的API 速度更快:用Spark作为编译器 更智能:Structured Streaming rdd 怎么分区宽依赖和窄依赖 宽依赖:父RDD的分区被子RDD的多个分区使用 例如 groupByKey、reduceByKey、sortByKey等操作会产生宽依赖,会产生shuffle 窄依赖:父RDD的每个分区都只被子RDD的一个分区使用 例如map、filter、union等操作会产生窄依赖 kafka的数据存在内存还是磁盘 Kafka最核心的思想是使用磁盘,而不是使用内存,可能所有人都会认为,内存的速度一定比磁盘快,我也不例外。在看了Kafka的设计思想,查阅了相应资料再加上自己的测试后,发现磁盘的顺序读写速度和内存持平。 而且Linux对于磁盘的读写优化也比较多,包括read-ahead和write-behind,磁盘缓存等。如果在内存做这些操作的时候,一个是JAVA对象的内存开销很大,另一个是随着堆内存数据的增多,JAVA的GC时间会变得很长,使用磁盘操作有以下几个好处: 磁盘缓存由Linux系统维护,减少了程序员的不少工作。 磁盘顺序读写速度超过内存随机读写。 JVM的GC效率低,内存占用大。使用磁盘可以避免这一问题。 系统冷启动后,磁盘缓存依然可用。 采集数据为什么选择kafka 采集层 主要可以使用Flume, Kafka两种技术。 Flume:Flume 是管道流方式,提供了很多的默认实现,让用户通过参数部署,及扩展API. Kafka:Kafka是一个可持久化的分布式的消息队列。 Kafka 是一个非常通用的系统。你可以有许多生产者和很多的消费者共享多个主题Topics。相比之下,Flume是一个专用工具被设计为旨在往HDFS,HBase发送数据。它对HDFS有特殊的优化,并且集成了Hadoop的安全特性。所以,Cloudera 建议如果数据被多个系统消费的话,使用kafka;如果数据被设计给Hadoop使用,使用Flume。 怎么解决kafka的数据丢失 producer端: 宏观上看保证数据的可靠安全性,肯定是依据分区数做好数据备份,设立副本数。 broker端: topic设置多分区,分区自适应所在机器,为了让各分区均匀分布在所在的broker中,分区数要大于broker数。 分区是kafka进行并行读写的单位,是提升kafka速度的关键。 Consumer端 consumer端丢失消息的情形比较简单:如果在消息处理完成前就提交了offset,那么就有可能造成数据的丢失。由于Kafka consumer默认是自动提交位移的,所以在后台提交位移前一定要保证消息被正常处理了,因此不建议采用很重的处理逻辑,如果处理耗时很长,则建议把逻辑放到另一个线程中去做。为了避免数据丢失,现给出两点建议: enable.auto.commit=false 关闭自动提交位移 在消息被完整处理之后再手动提交位移 怎样快速的杀死一个job 1、执行hadoop job -list 拿到job-id 2、Hadoop job kill hadoop-id flume不采集Nginx日志,通过log4j采集日志,优缺点是什么? 在nginx采集日志时无法获取session的信息,然而logger4j则可以获取session的信息,logger4j的方式比较稳定,不会宕机。缺点:不够灵活,logger4j的方式和项目结合过滤紧密,二flume的方式就比较灵活,便于插拔式比较好,不会影响项目的性能。 flume和kafka有集日志区别,采集日志时中间停了,怎么记录之前的日志 Flume 采集日志是通过流的方式直接将日志收集到存储层,而 kafka 试讲日志缓存在 kafka 集群,待后期可以采集到存储层。Flume 采集中间停了,可以采用文件的方式记录之前的日志,而 kafka 是采用 offset(偏移量) 的方式记录之前的日志。 kafka的message包括哪些信息 一个Kafka的Message由一个固定长度的header和一个变长的消息体body组成 header部分由一个字节的magic(文件格式)和四个字节的CRC32(用于判断body消息体是否正常)构成。当magic的值为1的时候,会在magic和crc32之间多一个字节的数据:attributes(保存一些相关属性,比如是否压缩、压缩格式等等);如果magic的值为0,那么不存在attributes属性 body是由N个字节构成的一个消息体,包含了具体的key/value消息 16 个人信息 自我评价 求职意向 个人技能 项目经验 16 98 97