1 项目撰写
注意:在写下面的项目经验之前;应该在简历前面的个人描述那里把自己在传智播客学的技术点都描述清楚。
项目名称 |
XX国税局协同办公平台 |
项目描述 |
纳税服务系统是XX国税局协同办公平台中的一个子系统。纳税服务系统包括移动客户端和后台管理端。 1、 客户端 客户端的功能包括会员注册登录、个人信息维护、查询信息、我要咨询、我要投诉、我要预约、查看易告知信息并可填写调查问卷。(客户端包括有android和ios客户端) 注册/登录:用户可以使用手机号注册系统并可以使用动态验证码和静态密码登录; 个人信息维护:用户可以修改名称、头像、单位、密码等个人信息; 查询信息:可以查询信息发布管理模块发布的是发布状态的信息; 我要咨询:注册用户可以在移动端通过填写咨询信息,然后提交到系统的纳税咨询管理中由后台管理员进行处理;如果有处理结果则用户可以查看回复结果; 我要投诉:注册用户可以在移动端通过填写投诉内容,然后提交到系统的投诉受理管理中由后台管理员进行处理;如果有处理结果则用户可以查看回复结果; 我要预约:注册用户可以在移动端通过填写预约事项、预约内容、地点、时间,然后提交预约到系统的服务预约管理中由后台对应事项的处理人员进行处理;如果有处理结果则用户可以查看回复结果; 易告知:可以查看由系统定时发送的催办和催缴税的信息; 调查问卷:可以查看由系统推送的调查问卷和自己填写过的调查问卷内容。 2、 后台端 后台端的功能包括会员管理、信息发布管理、纳税咨询管理、投诉受理管理、预约服务管理、易告知管理、服务调查管理。在后台开发中以SSH作为开发框架。在会员管理中利用POI导入大量的初始会员数据和导出系统的会员记录到Excel;在日期输入上选用了WDatePicker作为日期组件高度自定义日期输入功能;灵活使用Struts的各类标签,如复选框标签Checkboxlist将List/Map等集合的数据迭代并显示;充分使用ajax的同步与异步方式进行系统功能处理;巧妙的利用Spring中提供的工具类进行业务逻辑操作,如HibernateDaoSupport,WebApplicationContextUtils。信息发布管理引入兼容性极佳、配置简易的富文本编辑器UEditor来处理系统的多格式文本内容、图表、地图等;熟练使用PowerDesigner工具进行数据库建模并逆向工程开发功能模块;自定义灵活度较高的查询工具类QueryHelper可自由组合查询并相应降低出错机率。在异步获取二级联动Json数据时分别利用输出流直接输出和利用Struts框架自动输出方式实现;在系统的定时任务调度中利用配置和开发使用都方便的Quartz并无缝融入Sping中并精确制定任务的执行时间。在系统的投诉数统计图上充分考虑到移动端Flash显示的局限性而使用跨终端的Fusioncharts来展示系统的2d/3d柱状图、饼图、曲线图、块图等几十种统计图表。 会员管理:可以对手机注册的会员信息进行管理并导入导出; 信息发布管理:在后台端可以添加信息,然后由特定管理人员进行信息审核并发布,发布后的信息可在移动端展示; 纳税咨询管理:管理由移动端用户提交的一些咨询纳税信息的问题并可以在后台端进行回复; 投诉受理管理:管理由移动端用户提交的投诉信息并可以在后台端进行受理回复;自动受理历史待受理的投诉;生成年度投诉数3D统计图表; 预约服务管理:由预约事项和预约服务组成;其中事项对应有特定的处理人,当用户预约了事项后由该事项对应的处理人进行预约受理。预约的受理情况将在移动端可查看; 易告知管理:主要是在后台端做一个定时对批量手机号用户进行信息的推送和告知其纳税信息;易告知的信息类型包含催办和催缴,当系统定时任务到发布时机将自动推送信息给移动端用户; 服务调查管理:可以制定系统的调查问卷;问卷形式主要由单选和多选题构成,当问卷制定并发布后用户可以在移动端填写调查问卷;管理员可以在系统管理中查看某一问卷的统计情况。 |
项目团队组成 |
后台开发人员3名;客户端开发人员2名(包含android和ios);测试人员1名。 |
开发时间与计划 |
鉴于同学们往往写1年的工作经验;所以项目一在简历中的时间跨度大概可以到4-5个月;周期可以如下分配: 需求调研与分析时间:3周 界面设计、美工与数据库、详细设计:3周 开发:4周 测试:1周 上线部署、需求变更修改:4周 |
项目开发环境 |
操作系统:windows server 2008 数据库:Oracle 10g 应用服务器:tomcat/weblogic 开发工具:MyEclipse/Eclipse;Rational Rose;Edraw Max;Power Designer |
项目职责 |
Team Leader版本: 前期需求收集和整理需求文档;辅助系统设计师设计系统原型;配合美工根据系统原型进行切图;根据需求文档进行详细设计、数据库设计;协调项目组开发人员进行开发。在系统功能上开发了会员管理、信息发布管理、投诉受理管理、预约服务管理,编写客户端调用接口和文档;安排测试计划和整合系统的各个功能模块并编写系统相关文档。 非Team Leader版本: 参与并完善需求、设计文档中负责开发的功能模块的UML图形和功能描述、进行数据库设计。在开发阶段按照项目组的要求独立完成会员管理、信息发布管理、纳税咨询管理、投诉受理管理、预约服务管理等功能模块的开发与测试。配合开发团队进行联合调试和编写系统相关文档。 |
2 项目面试问题
1、 请描述下你做的项目
纳税服务系统是国税协同办公平台的一个子系统;主要目的是给用户在移动端上可快速查询国税相关信息并可以在后台对发布的信息进行管理。整个系统包括了移动端和后台端:在移动端主要是查看国税局发布的信息、通知、维护个人信息等;而后台管理功能包括:会员管理、信息发布管理、纳税咨询管理、投诉受理管理、预约服务管理、易告知管理、服务调查管理。我做了其中的xxx。。。等模块。
spring和hibernate管理事务有啥区别
1、从编码上说,hibernate的事务管理是硬编码,是写在程序之中的。这就造成了,如果需要调整,就要修改源码,重新编译。
2、从事务控制的位置来说: hibernate是持久层框架,事务是控制在持久层的,这样就造成了越权操作。事务应放在业务层,而非持久层
3、从代码维护上来说:hibernate控制事务,需要在每个需要事务支持的地方编写代码,后期维护不便。
简单介绍一下你对spring的理解?
任何框架在植入项目之中都不能带来效率的提升,反而是会带来效率的下降。因为java核心机制的问题,内存中多创建一个对象,就会造成性能降低。
但是,spring带来的好处还是显而易见的:
1、它的核心之一IoC控制反转,降低了我们程序的耦合度,使我们可以把项目设计成为一个可插拔的组件式工程。
2、它的另一大核心AOP面向切面,使我们在开发过程中,精力得到释放,可以更专注的去理解客户的需求。并且在后期维护时,可以只维护很少的一部分。
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,可以更专注的去理解客户的需求同时提高了开发的效率。
3、它提供的事务管理机制,采用声明的方式来配置事务,从而在维护时无需改动源码,解决了程序硬编码的弊端。
4、它提供的DAO模板使我们的持久层开发又多了一种途径。
5、它可以整合其他时下流行的框架,使我们在管理项目时,更加清晰,明确。
并且以现在计算机的水平,使用spring框架造成的这点下降对程序的影响是微乎其微的。
所以,总体来说spring框架的使用还是利大于弊的。
Spring是干嘛的?
它是一个full-stack框架,提供了从表现层到业务层再到持久层的一套完整的解决方案。我们在项目中可以只使用spring一个框架,它就可以提供表现层的mvc框架,持久层的Dao框架。
它的两大核心IoC和AOP更是为我们程序解耦和代码简洁易维护提供了支持。
你知道依赖注入么?简单介绍一下
首先,明确依赖注入是实现控制反转的一种思想(另一种是依赖查找)。
其次,在开发过程中,我们需要某个类的实例时,是由使用者为我们提供该类的实例。而不是自己去获取。
最后,实现依赖注入的方式可以是使用构造方法注入或者set方法注入两种方式。
在spring中注入的方式就有很多了,比如constructor-arg元素,property元素,p名称空间等等。
你知道控制反转么?简单介绍一下
它是spring的核心之一。或者说是spring的基础核心,spring的其余核心功能都必须有IoC的支持。
控制反转指的是,我们在获取对象的时候,由之前的主动出击,变成了被动接收。也就是说,在编写某个类时,只需要提供一个接口类型的类成员,并不需要关系具体的实现类,而是由使用者在使用时提供。这就降低了类和类之间的耦合度。
2、 结合项目谈谈你对MVC的理解
MVC是Model—View—Controler的简称。即模型—视图—控制器。MVC是一种设计模式,它强制性的把应用程序的输入、处理和输出分开。
MVC中的模型、视图、控制器它们分别担负着不同的任务。
视图: 该部分采用JSP实现,视图是用户看到并与之交互的界面。视图向用户显示相关的数据,并接受用户的输入。视图不进行任何业务逻辑处理。
模型: Model部分:由JavaBean组成,ActionForm用于封装用户的请求参数,封装成ActionForm对象,该对象被ActionServlet转发给Action,Action根据ActionFrom里面的请求参数处理用户的请求。JavaBean则封装了底层的业务逻辑,包括数据库访问等。
一个模型能为多个视图提供数据。这提高了应用程序的重用性
控制器: 控制器接受请求并调用相应的模型去处理请求。
然后根据处理的结果调用相应的视图来显示处理的结果。
MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。
如在项目中要对应MVC的话:View 对应项目中Jsp,Controler对应Action,Model 对应service+dao层的业务逻辑和持久层的操作。
3、 项目中为什么使用SSH
1. 使用Struts是因为struts是基于MVC模式的,很好的将应用程序进行了分层,使开发者更关注于业务逻辑的实现;struts有着丰富的标签库,能大大提高开发效率。
2. 使用Hibernate:因为hibernate为Java应用提供了一个易用的、高效率的对象关系映射框架(ORM)。hibernate是个轻量级的持久性框架,功能丰富。
3. 使用Spring:因为spring基于IoC(Inversion of Control,反向控制)和AOP构架多层j2ee系统的框架。
4、 挑选一个你做的功能说明SSH框架的应用原理
① 在表现层中,首先通过JSP页面实现交互界面,负责传送请求(Request)和接收响应(Response),然后Struts根据配置文件(*-struts.xml)将ActionServlet接收到的Request委派给相应的Action处理。
② 在业务层中,管理服务组件的Spring IoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。
③ 在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。
结合上面的概述;然后可以把我们做的信息发布管理模块用上述的方式实例化描述一遍。
5、 Struts工作原理
-----------------------------------按照Struts工作原理图地说:
1.客户端发出一个指向servlet容器的请求;
2.请求会经过StrutsPrepareAndExecuteFilter过滤器;
3.过滤器和请求将访问struts2的底层框架结构。在web容器启动时,struts2框架会自动加载配置文件里相关参数,并转换成相应的类。
如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一些基本信息,ActionMapper存有action的配置信息。在请求过程中所有的对象(Action,Results,Interceptors,等)都是通过ObjectFactory来创建的。过滤器会通过询问ActionMapper类来查找请求中需要用到的Action。
4.如果找到需要调用的Action,过滤器会把请求的处理交给ActionProxy。ActionProxy为Action的代理对象。ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类。
5.ActionProxy创建一个ActionInvocation的实例。ActionInvocation在ActionProxy层之下,它表示了Action的执行状态,或者说它控制的Action的执行步骤。它持有Action实例和所有的Interceptor。
6.ActionInvocation实例使用命名模式来调用,1. ActionInvocation初始化时,根据配置,加载Action相关的所有Interceptor。2. 通过ActionInvocation.invoke方法调用Action实现时,执行Interceptor。在调用Action的过程前后,涉及到相关拦截器(intercepetor)的调用。
7. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。
---------------------------------通俗地说:
è发送http请求
èWeb服务器(tomcat/weblogic...)
è执行struts核心过滤器StrutsPrepareAndExecuteFilter
è加载struts配置文件中配置信息,找到对应的Action类并实例化
è执行各类拦截器和Action中对应方法
è配置文件中找到返回结果
è转发到具体页面或其它操作
(9)Spring的隔离级别:Default默认的事务隔离级别
READ_UNCOMMITTED读未提交,一个事务可以操作另外一个未提交的事务,不能避免脏读,不可重复读,幻读,隔离级别最低,并发性 能最高
READ_COMMITTED读已提交,一个事务不可以操作另外一个未提交的事务, 能防止脏读,不能避免不可重复读,幻读。
repeatable_read能够避免脏读,不可重复读,不能避免幻读
SERIALIZABLE隔离级别最高,消耗资源最低,代价最高,能够防止脏读, 不可重复读,幻读。
6. Struts的工作流程;
工作流程:
(1)客户端提交一个HttpServletRequest请求(action或JSP页面)。
(2)请求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等。
(3)FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器.
(4)请求被发送到FilterDispatcher后,FilterDispatcher询问ActionMapper时候需要调用某个action来处理这个Request。
(5)如果ActionMapper决定需要调用某个action,FilterDispatcher则把请求交给ActionProxy进行处理.
(6)ActionProxy通过Configuration Manager询问框架的配置文件struts.xml,找到调用的action类。
(7)ActionProxy创建一个ActionInvocation实例,通过代理模式调用Action。
(8)action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Intercepter拦截器。
(9)最后ActionInvocation实例,负责根据struts.xml中配置result元素,找到与之相对应的result,决定进一步输出。
基本简要流程:
I.客户端浏览器发出HTTP请求。
II.根据web.xml配置,该请求被FilterDispatcher接收。
III.根据struts.xml配置,找到需要调用的Action类和方法, 并通过IoC方式,将值注入给Aciton。
IV.Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证。
VI.Action执行完毕,根据struts.xml中的配置找到对应的返回结果result,并跳转到相应页面。VI.返回HTTP响应到客户端浏览器。
6、 Struts有什么优缺点
优点:
1. 实现MVC模式,结构清晰;
2. 丰富的struts的标记库,利用好能大大提高开发效率;
3. 全局结果与声明式异常;
4. 可使用OGNL进行参数传递
5. 各个类方便使用的拦截器
缺点:
在并发量比较大的场景中,.每次请求都要创建一个Action,资源消耗比较大.
1. 转到表现层时,需要配置结果页面;页面多了比较繁杂;
2. 对Servlet的依赖性过强
3. struts标签稍微比el表达式繁重
使用场景
SSH对于中小型项目提供了一套完整的解决方案.在表关系相对简单,数据量不大,并发量不高的项目中,能够极大的提高开发效率.
表关系复杂或数据量比较大时,可以使用Mybatis替换Hibernate.
并发量很高时可以使用SpringMVC替换struts
Spring优缺点:
Spring是一个轻量级的控制反转(IoC)、面向切面(AOP)、面向接口、事务管理、包容促进其它框架;使系统中用到的其它框架耦合程度大大降低,拓展性强、简单易用好管理。
1、它的核心之一IoC,降低了我们程序的耦合度,使我们可以把项目设计成为一个可插拔的组件式工程。
2、它的另一大核心AOP,使我们在开发过程中,精力得到释放,可以更专注的去理解客户的需求。并且在后期维护时,可以只维护很少的一部分。
3、它提供的事务管理机制,采用声明的方式来配置事务,从而在维护时无需改动源码,解决了程序硬编码的弊端。
4、它提供的DAO模板使我们的持久层开发又多了一种途径。
5、它可以整合其他时下流行的框架,使我们在管理项目时,更加清晰,明确。
并且以现在计算机的水平,使用spring框架造成的这点下降对程序的影响是微乎其微的。
所以,总体来说spring框架的使用还是利大于弊的。
7、 spring在项目中如何充当粘合剂
1、在项目中利用spring的IOC(控制反转或依赖注入),明确地定义组件接口(如UserDAO),开发者可以独立开发各个组件, 然后根据组件间的依赖关系组装(UserAction依赖于UserService,UserService依赖于UserDAO)运行,很好的把Struts(Action)和hibernate(DAO的实现)结合起来;
2、spring的事务管理把hibernate对数据库的操作进行了事务配置
8、 描述在系统中如何使用了Spring的事务控制
Spring事务包括编程式事务和声明式事务。在系统中使用了声明式的事务管理是用Spring的AOP来实现的;配置了只读事务和回滚事务(传播行为为REQUIRED)当出现错误后进行回滚操作。在项目中通过aop切入事务到serivce层,这样做能使一次业务逻辑操作如果包括几个数据库操作都控制在一个事务中。
9、 Hibernate工作原理及为什么要用
原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Session 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory
Hibernate优点: 1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。 2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作 3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。 4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。
(7) 简洁的HQL编程
(8) ‘(6) 缓存机制,提供一级缓存和二级缓存
hibernate框架是一个ORM的持久层框架,ORM的含义是对象关系映射,简单理解就是通过对象和关系型数据库之间建立映射信息,以后再操作对象就相当于操作数据库了。hibernate框架是对JDBC进行了轻量级的封装,可以更方便简单的对数据库完成增删改查的操作。同时也提供了查询的方式和查询的策略。例如HQL和QBC的查询方式等。还提供了缓存的策略,效率会更高。
Hibernate缺点:
(1) Hibernate在批量数据处理时有弱势
10、 Hibernate在系统中使用的优化策略
Hibernate 对数据的缓存包括两个级:一级缓存,在Session的级别上进行,主要是对象缓存,以其id为键保存对象,在Session的生命期间存在;二级缓存, 在SessionFactory的级别上进行,有对象缓存和查询缓存,查询缓存以查询条件为键保存查询结果,在SessionFactory的生命期间存 在。默认地,Hibernate只启用一级缓存。
关于这个问题答系统使用了Hibernate的二级缓存就好。
11、 列举你在开发中常用的Struts标签
property、iterator、if、date、form、a、url、textfiled、textarea、select、radio、checkboxlist、hidden、param
12、 Jquery异步获取数据的方式有几种?有何区别?
1、load 载入远程 HTML 文件代码并插入至 DOM 中
2、get
3、post
4、ajax
5、getJSON
6、getScript 通过 GET 方式请求载入并执行一个 JavaScript 文件
13、 简述UML并说明你使用Rose常于什么情况,画什么图?
Unified Modeling Language (UML) 统一建模语言;用于在软件开发各个阶段中用图形的方式描述流程和功能需求;IBM Rational Rose是uml建模工具之一比较多的在需求阶段,常用于画用例图、类图、时序图。
14、 请简述导入导出的工具类;并说明你导出过的最大数据量
POI(合并单元格对象和背景色的应用)
15、 统计图的实现方式
Fusioncharts 图表采用SVG(可缩放矢量图形)实现,无需Flash;跨终端
16、 易告知信息推送方式;如何实现?
在后台填写推送信息和推送名单后,系统将自动推送;后台EE开发人员只实现定时的调用由客户端开发人员写的接口推送信息。
17、 简述调查问卷的制作
不在你填写的开发功能内的;只需要描述下功能。可以制定调查题目和提供单选和多选两种类型的选项;并可对调查结果进行统计。
18、 系统的并发量如何?如何解决大并发量的请求?
系统并发量不大;但有在应用服务器中间件Weblogic上做负载均衡的配置。
19、 项目中遇到问题如何解决?
自行解决——网络搜索——团队讨论解决
20、 简述你在项目中的开发流程
项目课中的设计和开发都是比较贴近实际开发的,做了的话按照当时的开发情况描述。
3 拓展
1、 使用一种排序算法排序一组数字
冒泡、直接插入、选择
2、 编写一个可以体现多线程的例子
3、 编写一个Singleton类
12. 如何将1个g的数据最快速度放进C盘中?
(1)public class Test01 {
public static void main(String[] args) throws Exception{
getInputStream("C:\\setup.log","D:\\a.txt");
}
private static void getInputStream(String pathName,String copyName)throws Exception{
File file = new File(pathName);
if(!file.exists())
throw new RuntimeException("文件不存在呀,你Copy个屁!");
else{
getCopy(copyName,new BufferedInputStream(new FileInputStream(file)));
}
}
private static void getCopy(String copyName,BufferedInputStream bis)throws Exception{
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(copyName));
BufferedInputStream biss = bis;
byte[] b = new byte[biss.available()];
int len = 0;
while((len = biss.read(b))!=-1){
bos.write(b, 0, len);
}
bos.close();
biss.close();
System.out.println(copyName+"复制成功!");
}
冒泡排序:
public static void bubbleSort(int[] numbers) {
int temp; // 记录临时中间值
int size = numbers.length; // 数组大小
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < size; j++) {
if (numbers[i] < numbers[j]) { // 交换两数的位置
temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}
}
}
选择排序:
public static void selectSort(int[] numbers) {
int size = numbers.length, temp;
for (int i = 0; i < size; i++) {
int k = i;
for (int j = size - 1; j >i; j--) {
if (numbers[j] < numbers[k]) k = j;
}
temp = numbers[i];
numbers[i] = numbers[k];
numbers[k] = temp;
}
}
原文地址:https://www.cnblogs.com/shan1393/p/9245365.html