精华内容
下载资源
问答
  • 更何况,现在企业对java开发工程师的门槛要求也变高了,不仅要求你技术扎实,还一定要有项目经验。所以,学习的时候,必须参与几个企业级项目开发,以此锻炼自己的项目全局思维,学会如何从整个项目角度出发去思考,...

    不想做将军的士兵不是好士兵!

    相信没有人一开始学java,就是为了将来一直做一名初级java开发工程师。只需掌握一些简单代码技巧,别人告诉想要实现的效果,然后自己能用代码堆砌来实现。

    更何况,现在企业对java开发工程师的门槛要求也变高了,不仅要求你技术扎实,还一定要有项目经验。所以,学习的时候,必须参与几个企业级项目开发,以此锻炼自己的项目全局思维,学会如何从整个项目角度出发去思考,针对某个特定问题如何分析解决。掌握项目开发的基本步骤,面向对象的分析和设计技巧,项目核心问题的主流开发技术等。

    c2eb45f442cf84b1971a6b5295402971.png

    虽然,一直在强调学IT技术,项目实战经验很重要。目前几乎所有的IT培训机构,也都在打“实战”教育牌,都在强调自己的实战是多么强大。但事实上,很多培训机构只是停留在宣传层面而已。因此,在考察IT培训机构的项目实战方面,避免被虚假宣传欺骗,大家可以从这几方面重点去对比:

    1、项目实战占比达到多少?

    2、是否是真实企业级项目?

    3、项目是否有及时迭代更新?

    4、是否有前后端合作开发教学模式,有没有具体实施?

    5、项目教学是否注重提升解决问题的能力,而非傻瓜式的教学?

    记住,以上多方面都要考察清楚,不要光看有多少项目数量,而是要看综合质量如何。毕竟有的机构项目看起来是很多,但是很多都不是企业级真实项目,甚至还有的是多年前都搞一套的老项目。一定要注意甄别。

    我们来看一下,国信安一名初次参加项目实战学员的心得,大家感受下国信安“项目驱动学习”的魅力。

    968b202b4d9b704dd267ea04bac17959.png

    国信安“项目驱动式教学”

    经过五天的时间,我们的项目顺利竣工,这次我们组的项目是一个幼儿园的学生后台管理系统,我担任的是这次的CTO,需要完成数据模型的搭建,登陆页面的逻辑实现,页面的框架的搭建,以及分担组员不能及时完成的页面。

    说一下通过这次项目我的收获吧。

    1、因为这次是小组项目,组员的沟通无比重要,开会讨论的时候,有些组员就光听不提意见和疑问,我不确定他们有没有理解到我的意思,然后我们星期六和星期天是要求接着写代码的,这个时候我的任务已经做完了,在帮组员改BUG,但是周末只有邹**一个人给我看他的BUG,其他人一点消息都没有,到最后测试的时候全是BUG,我觉得这种时候我作为CTO不应该是等待他们提出问题,而是询问他们提出问题。

    1ecada0e029fc1eef59a0d025520abb2.png

    2、因为自己对时间的安排不是很好,比如没有经常的去了解他们的项目进度,以及对该BUG预留的时间不足,导致最后一天我改BUG改到了1点钟,未来的项目需要加强我对时间的管理

    我们小组的人数是最多的,有七个人,所以组长对我们的要求还是很高的,比如说需要实现数据的跨页面传输,以及发布的公告的两个状态(由校长管理员发布的校园公告所有人能看见,以及班主任发布的班级公告,只有该老师班上的学生、管理员和校长能看到),以及权限的操作(升级某个老师的权限,使他的账号可以登陆管理员的页面)。需要实现这个功能必然是困难的,同时也暴露出我们很多的缺点。

    当然,我们还是有认真负责的组员(吹爆我们的组长):

    1、所有样式上的问题都是由组长亲自操劳修改。

    2、组长亲自开会议,辅导组员一个一个修改自己的代码,直到凌晨一点。

    3、组长严格把关每一个细节,最后成功完成了一个可以进行储存数据的后台管理系统。

    4、组长担任的是AD,在完成自己的工作之余,还帮助组员修改BUG,尽管自己的任务繁重,还是会抽空回复组员们在群里提出的问题。

    总的来说,这次小组开发的项目让我们体验到更加贴近真实的开发环境,是一次宝贵的经验。

    展开全文
  • workwork\.classpathwork\.myeclipsework\.myhibernatedatawork\.mymetadatawork\.projectwork\.settingswork\.settings\...

    work

    work\.classpath

    work\.myeclipse

    work\.myhibernatedata

    work\.mymetadata

    work\.project

    work\.settings

    work\.settings\com.genuitec.eclipse.core.prefs

    work\.settings\com.genuitec.eclipse.j2eedt.core.prefs

    work\.settings\com.genuitec.jboss.ide.eclipse.xdoclet.run.prefs

    work\.settings\org.eclipse.core.resources.prefs

    work\.settings\org.eclipse.jdt.core.prefs

    work\.settings\org.eclipse.ltk.core.refactoring.prefs

    work\WebRoot

    work\WebRoot\META-INF

    work\WebRoot\META-INF\MANIFEST.MF

    work\WebRoot\WEB-INF

    work\WebRoot\WEB-INF\classes

    work\WebRoot\WEB-INF\classes\.struts-default.mex

    work\WebRoot\WEB-INF\classes\.struts.mex

    work\WebRoot\WEB-INF\classes\application.db.properties

    work\WebRoot\WEB-INF\classes\applicationContext-db.xml

    work\WebRoot\WEB-INF\classes\applicationContext.xml

    work\WebRoot\WEB-INF\classes\com

    work\WebRoot\WEB-INF\classes\com\work

    work\WebRoot\WEB-INF\classes\com\work\context

    work\WebRoot\WEB-INF\classes\com\work\context\applicationContext-log.xml

    work\WebRoot\WEB-INF\classes\com\work\context\applicationContext-menu.xml

    work\WebRoot\WEB-INF\classes\com\work\context\applicationContext-planinfo.xml

    work\WebRoot\WEB-INF\classes\com\work\context\applicationContext-role.xml

    work\WebRoot\WEB-INF\classes\com\work\context\applicationContext-sys.xml

    work\WebRoot\WEB-INF\classes\com\work\context\applicationContext-user.xml

    work\WebRoot\WEB-INF\classes\com\work\log

    work\WebRoot\WEB-INF\classes\com\work\log\Interceptor

    work\WebRoot\WEB-INF\classes\com\work\log\Interceptor\ClientInterceptor.class

    work\WebRoot\WEB-INF\classes\com\work\log\Interceptor\LogAfterAdvice.class

    work\WebRoot\WEB-INF\classes\com\work\log\Interceptor\LogBeforeAdvice.class

    work\WebRoot\WEB-INF\classes\com\work\log\Interceptor\LoggerInterceptor.class

    work\WebRoot\WEB-INF\classes\com\work\log\Interceptor\MyPreResultListener.class

    work\WebRoot\WEB-INF\classes\com\work\log\dao

    work\WebRoot\WEB-INF\classes\com\work\log\dao\LoggerDao.class

    work\WebRoot\WEB-INF\classes\com\work\log\dao\impl

    work\WebRoot\WEB-INF\classes\com\work\log\dao\impl\LoggerDaoImpl$1.class

    work\WebRoot\WEB-INF\classes\com\work\log\dao\impl\LoggerDaoImpl.class

    work\WebRoot\WEB-INF\classes\com\work\log\model

    work\WebRoot\WEB-INF\classes\com\work\log\model\Log4j.class

    work\WebRoot\WEB-INF\classes\com\work\log\model\Log4j.hbm.xml

    work\WebRoot\WEB-INF\classes\com\work\log\service

    work\WebRoot\WEB-INF\classes\com\work\log\service\LoggerService.class

    work\WebRoot\WEB-INF\classes\com\work\log\service\impl

    work\WebRoot\WEB-INF\classes\com\work\log\service\impl\LoggerServiceImpl.class

    work\WebRoot\WEB-INF\classes\com\work\log\web

    work\WebRoot\WEB-INF\classes\com\work\log\web\loggerAction.class

    work\WebRoot\WEB-INF\classes\com\work\menu

    work\WebRoot\WEB-INF\classes\com\work\menu\dao

    work\WebRoot\WEB-INF\classes\com\work\menu\dao\RgMenuDao.class

    work\WebRoot\WEB-INF\classes\com\work\menu\dao\impl

    work\WebRoot\WEB-INF\classes\com\work\menu\dao\impl\RgMenuDaoImpl$1.class

    work\WebRoot\WEB-INF\classes\com\work\menu\dao\impl\RgMenuDaoImpl$2.class

    work\WebRoot\WEB-INF\classes\com\work\menu\dao\impl\RgMenuDaoImpl$3.class

    work\WebRoot\WEB-INF\classes\com\work\menu\dao\impl\RgMenuDaoImpl.class

    work\WebRoot\WEB-INF\classes\com\work\menu\model

    work\WebRoot\WEB-INF\classes\com\work\menu\model\RgMenu.class

    work\WebRoot\WEB-INF\classes\com\work\menu\model\RgMenu.hbm.xml

    work\WebRoot\WEB-INF\classes\com\work\menu\service

    work\WebRoot\WEB-INF\classes\com\work\menu\service\RgMenuService.class

    work\WebRoot\WEB-INF\classes\com\work\menu\service\impl

    work\WebRoot\WEB-INF\classes\com\work\menu\service\impl\RgMenuServiceImpl.class

    work\WebRoot\WEB-INF\classes\com\work\menu\web

    work\WebRoot\WEB-INF\classes\com\work\menu\web\RgMenuAction.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao\PlaninfoDao.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao\PlansortDao.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao\impl

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao\impl\PlaninfoDaoImpl$1.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao\impl\PlaninfoDaoImpl$2.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao\impl\PlaninfoDaoImpl$3.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao\impl\PlaninfoDaoImpl.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao\impl\PlansortDaoImpl$1.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao\impl\PlansortDaoImpl$2.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao\impl\PlansortDaoImpl$3.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\dao\impl\PlansortDaoImpl.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\model

    work\WebRoot\WEB-INF\classes\com\work\planinfo\model\Planinfo.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\model\Planinfo.hbm.xml

    work\WebRoot\WEB-INF\classes\com\work\planinfo\model\Plansort.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\model\Plansort.hbm.xml

    work\WebRoot\WEB-INF\classes\com\work\planinfo\service

    work\WebRoot\WEB-INF\classes\com\work\planinfo\service\PlaninfoService.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\service\PlansortService.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\service\impl

    work\WebRoot\WEB-INF\classes\com\work\planinfo\service\impl\PlaninfoServiceImpl.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\service\impl\PlansortServiceImpl.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\web

    work\WebRoot\WEB-INF\classes\com\work\planinfo\web\planinfoAction.class

    work\WebRoot\WEB-INF\classes\com\work\planinfo\web\plansortAction.class

    work\WebRoot\WEB-INF\classes\com\work\role

    work\WebRoot\WEB-INF\classes\com\work\role\dao

    work\WebRoot\WEB-INF\classes\com\work\role\dao\RgMethodDao.class

    展开全文
  • 前言Java作为目前最受欢迎的语言,每年都会有很多转行、跨行等等地人加入到开发大军中来,但是Java开发也是会遇到瓶颈的,当我们遇到瓶颈的时候就会去寻求发展突破,尤其是从Java开发高级工程师向架构师迈进的时候,...

    前言

    Java作为目前最受欢迎的语言,每年都会有很多转行、跨行等等地人加入到开发大军中来,但是Java开发也是会遇到瓶颈的,当我们遇到瓶颈的时候就会去寻求发展突破,尤其是从Java开发高级工程师向架构师迈进的时候,需要大量的实战经验和知识的积累,而循着前人的脚步去学习就会起到一个事半功倍的效果!

    由于这份学习手册近1000页,目录就有几十页,没办法为大家详尽的展示,所以只能为大家展示部分内容,供大家看看有没有需求,如若需要免费获取方式我放在了文末,自行领取即可!如果您需要这份文档进行学习的话,可以点击这里查看获取方式!

    JavaOOP

    • 什么是B/S架构?什么是C/S架构
    • Java都有哪些开发平台?
    • 什么是JDK?什么是JRE?
    • Java语言有哪些特点
    • 面向对象和面向过程的区别
    • 什么是数据结构?
    • Java的数据结构有哪些?
    • 什么是OOP?
    • 类与对象的关系?
    • Java中有几种数据类型

    6b6e9ec5b4d3e5e1c631b92195547343.png

    Java集合/泛型

    • ArrayList和linkedList的区别
    • HashMap和HashTable的区别
    • Collection包结构,与Collections的区别
    • 泛型常用特点 (待补充)
    • 说说List,Set,Map三者的区别
    • Array与ArrayList有什么不一样?
    • Map有什么特点
    • 集合内存放于 Java.util 包中, 主要有几 种接口
    • 什么是list接口
    • 说说ArrayList(数组)

    8324c48a9133ba846633d8b4e448a793.png
    由于文档里的细节内容实在过多所以只编辑了部分知识点的章节粗略的介绍下,每个章节小节点里面都有更细化的内容!以下就是部分章节目录,由于头条的篇幅限制目录上的详细讲解也无法一一列出,文末底下有获取以下章节的所有详细知识讲解。

    Java异常

    • Java中异常分为哪两种?
    • 异常的处理机制有几种?
    • 如何自定义一个异常
    • try catch fifinally,try里有return,finally还执行么?
    • Excption与Error包结构
    • Thow与thorws区别
    • Error与Exception区别?
    • error和exception有什么区别

    d08278ebad7d80c6e3d4ca55bfd3aa4d.png

    Java中的IO与NIO

    • Java 中 IO 流?
    • Java IO与 NIO的区别
    • 常用io类有哪些
    • 字节流与字符流的区别
    • 阻塞 IO 模型
    • 非阻塞 IO 模型
    • 多路复用 IO 模型
    • 信号驱动 IO 模型
    • 异步 IO 模型
    • JAVA NIO

    0a0b5c4fc372d5912628954ab2ed6249.png

    Java反射

    • 除了使用new创建对象之外,还可以用什么方法创建对象?
    • Java反射创建对象效率高还是通过new创建对象的效率高?
    • java反射的作用
    • 哪里会用到反射机制?
    • 反射的实现方式:
    • 实现Java反射的类:
    • 反射机制的优缺点:
    • Java 反射 API
    • 反射使用步骤(获取 Class 对象、调用对象方法)
    • 获取 Class 对象有几种方法
    • 利用反射动态创建对象实例

    f263f3716738d0f9b7a50201be1520c3.png

    Java序列化

    • 什么是java序列化,如何实现java序列化?
    • 保存(持久化)对象及其状态到内存或者磁盘
    • 序列化对象以字节数组保持-静态成员不保存
    • 序列化用户远程对象传输
    • Serializable 实现序列化
    • writeObject 和 readObject 自定义序列化策略
    • 序列化 ID
    • 序列化并不保存静态变量
    • Transient 关键字阻止该变量被序列化到文件中
    • 序列化(深 clone 一中实现)

    db13f17d1df47879169fb3f9ebec360f.png

    多线程&并发

    JAVA 并发知识库

    • Java中实现多线程有几种方法
    • 继承 Thread 类
    • 实现 Runnable 接口。
    • ExecutorService、 Callable、 Future 有返回值线程
    • 基于线程池的方式
    • 4 种线程池
    • 如何停止一个正在运行的线程
    • notify()和notifyAll()有什么区别?
    • sleep()和wait() 有什么区别?
    • volatile 是什么?可以保证有序性吗?

    e180928aeeee1b5febed295f83cd388c.png

    JVM

    • java中会存在内存泄漏吗,请简单描述。
    • 64 位 JVM 中,int 的长度是多数?
    • Serial 与 Parallel GC 之间的不同之处?
    • 32 位和 64 位的 JVM,int 类型变量的长度是多数?
    • Java 中 WeakReference 与 SoftReference 的区别?
    • JVM 选项 -XX:+UseCompressedOops 有什么作用?为什么要使用
    • 怎样通过 Java 程序来判断 JVM 是 32 位 还是 64位?
    • 32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?
    • JRE、JDK、JVM 及 JIT 之间有什么不同?
    • 解释 Java 堆空间及 GC?

    560b35f8f7ae51b2674304560c308e23.png

    Mysql

    • 数据库存储引擎
    • InnoDB(B+树)
    • TokuDB( Fractal Tree-节点带数据)
    • Memory
    • 数据库引擎有哪些
    • InnoDB与MyISAM的区别
    • 索引
    • 常见索引原则有
    • 数据库的三范式是什么
    • 第一范式(1st NF - 列都是不可再分)

    2bf48231c476e31a3a09bea164000967.png

    Redis

    • 什么是 Redis?
    • Redis 与其他 key-value 存储有什么不同?
    • Redis 的数据类型?
    • 使用 Redis 有哪些好处?
    • Redis 相比 Memcached 有哪些优势?
    • Memcache 与 Redis 的区别都有哪些?
    • Redis 是单进程单线程的?
    • 一个字符串类型的智能存储最大容量是多少?
    • Redis持久化机制
    • 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题

    ad56ba91adf472b570d2032abc8425f1.png

    Memcached

    • Memcached 是什么,有什么作用?
    • memcached 服务在企业集群架构中有哪些应用场景?
    • Memcached 服务分布式集群如何实现?
    • Memcached 服务特点及工作原理是什么?
    • 简述 Memcached 内存管理机制原理?
    • memcached 是怎么工作的?
    • memcached 最大的优势是什么?
    • memcached 和 MySQL 的 query
    • memcached 和服务器的 local cache(比如 PHP 的 APC、mmap 文件等)相比,有什么优缺点?
    • memcached 的 cache 机制是怎样的?
    • memcached 如何实现冗余机制?

    70cd6e31a14cdc1964cbf62176ee671b.png

    MongoDB

    • mongodb是什么?
    • mongodb有哪些特点?
    • 你说的NoSQL数据库是什么意思?NoSQL与RDBMS直接有什么区别?为什么要使用和不使用NoSQL数据库?说一说NoSQL数据库的几个优点?
    • NoSQL数据库有哪些类型?
    • MySQL与MongoDB之间最基本的差别是什么?
    • 你怎么比较MongoDB、CouchDB及CouchBase?
    • MongoDB成为最好NoSQL数据库的原因是什么?
    • journal回放在条目(entry)不完整时(比如恰巧有一个中途故障了)会遇到问题吗?
    • 分析器在MongoDB中的作用是什么?
    • 名字空间(namespace)是什么?

    d702901e851b1c40f457941d73c233e1.png

    Spring

    • 不同版本的 Spring Framework 有哪些主要功能?
    • 什么是 Spring Framework?
    • 列举 Spring Framework 的优点。
    • Spring Framework 有哪些不同的功能?
    • Spring Framework 中有多少个模块,它们分别是什么?
    • 什么是 Spring 配置文件?
    • Spring 应用程序有哪些不同组件?
    • 使用 Spring 有哪些方式?
    • 什么是 Spring IOC 容器?
    • 什么是依赖注入?

    13391e9e3e993e9cfe3fd81561a66da4.png

    Spring Boot

    • 什么是 Spring Boot?
    • 为什么要用SpringBoot
    • Spring Boot 有哪些优点?
    • Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?
    • 运行Spring Boot有哪几种方式
    • 如何理解 Spring Boot 中的 Starters?
    • 如何在Spring Boot启动的时候运行一些特定的代码?
    • Spring Boot 需要独立的容器运行吗?
    • Spring Boot中的监视器是什么?
    • 如何使用Spring Boot实现异常处理?

    141f96423d7cb465d73dcb80159d6124.png

    Spring Cloud

    • 什么是 Spring Cloud?
    • 使用 Spring Cloud 有什么优势?
    • 服务注册和发现是什么意思?Spring Cloud 如何实现?
    • 负载平衡的意义什么?
    • 什么是 Hystrix?它如何实现容错?
    • 什么是 Hystrix 断路器?我们需要它吗?
    • 什么是 Netflix Feign?它的优点是什么?
    • 什么是 Spring Cloud Bus?我们需要它吗?
    • 什么是微服务
    • 什么是服务熔断?什么是服务降级

    10e01b39fbc3834e4726142edf16113a.png

    RabbitMQ

    • 什么是 rabbitmq
    • 为什么要使用 rabbitmq
    • 使用 rabbitmq 的场景
    • 如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?
    • 如何避免消息重复投递或重复消费?
    • 消息基于什么传输?
    • 消息如何分发?
    • 消息怎么路由?
    • 如何确保消息不丢失?
    • 使用 RabbitMQ 有什么好处?

    6587d6dfe3c1fc824f795c2407d901b6.png

    Dubbo

    • 为什么要用 Dubbo?
    • Dubbo 的整体架构设计有哪些分层?
    • 默认使用的是什么通信框架,还有别的选择吗?
    • 服务调用是阻塞的吗?
    • 一般使用什么注册中心?还有别的选择吗?
    • 默认使用什么序列化框架,你知道的还有哪些?
    • 服务提供者能实现失效提出是什么原理?
    • 服务上线怎么不影响旧版本?
    • 如何解决服务调用链过长的问题?
    • 说说核心的配置有哪些?

    a7e36e7f0ca004a4f3690abb2ace258f.png

    MyBatis

    • 什么是 Mybatis?
    • Mybaits 的优点
    • MyBatis 框架的缺点
    • MyBatis 框架适用场合
    • MyBatis 与 Hibernate 有哪些不同?
    • #{}和${}的区别是什么?
    • 当实体类中的属性名和表中的字段名不一样 ,怎么办 ?
    • 模糊查询 like 语句该怎么写?
    • 通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗?
    • 如何获取自动生成的(主)键值?

    8bab149f0dcf7e80c1704176da5fe5f9.png

    ZooKeeper

    • 什么是Zookeeper?
    • Zookeeper 如何保证了分布式一致性特性?
    • ZooKeeper 提供了什么?
    • Zookeeper 文件系统
    • ZAB 协议?
    • 四种类型的数据节点 Znode
    • Zookeeper Watcher 机制 -- 数据变更通知
    • 客户端注册 Watcher 实现
    • 服务端处理 Watcher 实现
    • 客户端回调 Watcher

    fe17f18c422dd6bd4c8de173dcda4b98.png

    数据结构

    • 栈(stack)
    • 队列(queue)
    • 链表(Link)
    • 散列表(Hash Table)
    • 排序二叉树
    • 前缀树
    • 红黑树
    • B-TREE
    • 位图

    df0b9b705078946b5f2353243c23471d.png

    Elasticsearch

    • elasticsearch 了解多少,说说你们公司 es 的集群架构,索引数据大小,分片有多少,以及一些调优手段 。
    • elasticsearch 的倒排索引是什么
    • elasticsearch 索引数据多了怎么办,如何调优,部署
    • elasticsearch 是如何实现 master 选举的
    • 详细描述一下 Elasticsearch 索引文档的过程
    • 详细描述一下 Elasticsearch 搜索的过程?
    • Elasticsearch 在部署时,对 Linux 的设置有哪些优化方法
    • lucence 内部结构是什么?
    • Elasticsearch 是如何实现 Master 选举的?
    • Elasticsearch 中的节点(比如共 20 个),其中的 10 个选了一个 master,另外 10 个选了另一个 master,怎么办?

    d6dfbe0a0c8bd1adbea92c97737e41b2.png

    Kafka

    • Kafka 是什么
    • partition 的数据文件(offset, MessageSize, data)
    • 数据文件分段 segment(顺序读写、分段命令、二分查找)
    • 负载均衡(partition 会均衡分布到不同 broker 上)
    • 批量发送
    • 压缩(GZIP 或 Snappy)
    • 消费者设计
    • Consumer Group
    • 如何获取 topic 主题的列表
    • 生产者和消费者的命令行是什么?

    15abb450e3d1217f6cf0c76141a742a3.png

    微服务

    • 微服务架构有哪些优势?
    • 微服务有哪些特点?
    • 设计微服务的最佳时间是什么?
    • 微服务架构如何运作?
    • 微服务架构的优缺点是什么?
    • 单片,SOA 和微服务架构有什么区别?
    • 在使用微服务架构时,您面临哪些挑战?
    • SOA 和微服务架构之间的主要区别是什么?
    • 微服务有什么特点?

    028c702a9fa72071a299af59db818647.png

    Linux

    • 绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示? 切换目录用什么命令?
    • 怎么查看当前进程?怎么执行退出?怎么查看当前路径?
    • 怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当
    • Ls 命令执行什么功能? 可以带哪些参数,有什么区别?
    • 查看文件有哪些命令
    • 列举几个常用的Linux命令
    • 你平时是怎么查看日志的?
    • 建立软链接(快捷方式),以及硬链接的命令
    • 目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?
    • 查看文件内容有哪些命令可以使用?

    fdf53331cf664f8030a593d62d63b4dd.png

    面试,难还是不难?最终结果好还是不好?取决于面试者的底蕴(气场+技能)、心态和认知以及沟通技巧。而一些主流的大型互联网公司面试(阿里巴巴、京东、美团、滴滴)更是需要你在面试时展现出自己的能力,从而获得面试官的欣赏和肯定。

    而程序员在应聘时更是需要经历层层面试。俗话说,磨刀不误砍柴工,做好面试前的准备工作可以帮助大家更好的应对面试官的问题以及面试中的突发情况。

    由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!如果您需要这份文档进行学习的话,可以点击这里查看获取方式!

    3957e3667e3d7c6ba3248527fe812a46.png

    c08f6a678eb6bf8ca5ceb01d2e8d4914.png

    213de2a3ea916ca1ced51a72958bfac1.png

    f6a6319b77b12aab1e21893a7d90af26.png

    4e1298f50981788fc278e3552d8bf180.png

    01bc8304355cf2aaed2cb41c3ee06db6.png
    展开全文
  • Java开发项目实例中的技术总结

    千次阅读 2017-10-16 14:54:38
    =#{exclude} 五:前端输入的form表单中提交后后台接受时中文出现乱码情况 处理方式: sendUserName = java.net.URLDecoder.decode(sender, "UTF-8"); 六:数据库中的分页操作(oracle数据库) 处理案例: SELECT p.*...

    一:前端的请求参数如下图所示:

    此时后台的处理方法为:直接使用request接受这个参数,通过JSON工具类转换成对应的对象即可获取对应的值,这种后台处理的方式适用于上图中的Query String Parameters

    二:前端的请求参数如下所示:与上图不同的是,请求的参数格式为红圈中所标记的,后台如果采取request.getParameter的方式获取也是不行的,(笔者通过@requestBody这个标签也是没获取到,不知道是不是使用的spring3的缘故)

    处理方法如下:通过ServletInputStream输入流的方式,将前端的请求参数传递到后台中,转换成对应的String字符串,就跟案例一中的类似了。下面是输入流的代码片段,最后的图片是json转换成对象

     

    public static String getStringFromStream(HttpServletRequest req) {
            ServletInputStream is;
            try {
                is = req.getInputStream();
                int nRead = 1;
                int nTotalRead = 0;
                byte[] bytes = new byte[10240];
                while (nRead > 0) {
                    nRead = is.read(bytes, nTotalRead, bytes.length - nTotalRead);
                    if (nRead > 0)
                        nTotalRead = nTotalRead + nRead;
                }
                String str = new String(bytes, 0, nTotalRead, "utf-8");
                is.close();
                return str;
            } catch (IOException e) {
                e.printStackTrace();
                return "";
            }
        }

     

    后台Contoller的处理方法为:List中存放的是String字符串的键值对映射的对象。(拿到字符串后,有很多种方法处理,提取参数,这里我选择的是阿里巴巴开源的JSON处理方式,其他的各位小伙伴可以自行尝试,最好分享一下哦laugh.gifuploading.4e448015.gif转存失败重新上传取消大笑)。

     

     

    三:(跨域)做过跨越多个网站的Ajax开发的朋友都知道,如果在A网站中,我们希望使用Ajax来获得B网站中的特定内容,如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题。Ajax的跨域访问问题是现有的Ajax开发人员比较常遇到的问题。
    处理方式:①前端请求的时候需要设置允许跨域请求,具体如何实施的(我不是前端,不太了解,自行百度哈),对于后台是这样处理的,配置一个过滤器即可(实现Filter接口)。过滤指定url的请求。允许该请求跨域。代码如下

     

     

     

    public class AjaxFilter implements Filter{
    
        private static Logger logger = LoggerFactory.getLogger(AjaxFilter.class);
        public AjaxFilter() {
            super();
        }
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            logger.info("跨域请求过滤器启动");
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletResponse httpServletResponse=(HttpServletResponse)servletResponse;
            httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
            httpServletResponse.setHeader("Access-Control-Max-Age", "2592000");
            httpServletResponse.setHeader("Access-Control-Allow-Headers", "authToken,content-type");
            httpServletResponse.setHeader("Access-Control-Allow-Methods","POST, GET");
            httpServletResponse.setHeader("Access-Control-Allow-Credentials","true");
            httpServletResponse.setContentType("text/html;charset=utf-8");
            filterChain.doFilter(servletRequest,httpServletResponse);
    
        }
    
        @Override
        public void destroy() {
    
        }
    }HttpServletResponse httpServletResponse=(HttpServletResponse)servletResponse;
            httpServletResponse.setHeader("Access-Control-Allow-Origin", "*");
            httpServletResponse.setHeader("Access-Control-Max-Age", "2592000");
            httpServletResponse.setHeader("Access-Control-Allow-Headers", "authToken,content-type");
            httpServletResponse.setHeader("Access-Control-Allow-Methods","POST, GET");
            httpServletResponse.setHeader("Access-Control-Allow-Credentials","true");
            httpServletResponse.setContentType("text/html;charset=utf-8");
            filterChain.doFilter(servletRequest,httpServletResponse);
    
        }
    
        @Override
        public void destroy() {
    
        }
    }

    四:数据库中时间转换(oracle数据库),发送该事件的环境为:页面的请求是String类型的时间,并且只有年月日,而数据库的时间为SYSDATE类型的。包含了时间分钟秒,如何进行时间上的匹配呢。
    处理方法:

     

     

     

     

    <select id="queryMessageCount" resultType="Integer" parameterType="HashMap">
            SELECT  count(RECORD_ID) FROM COM_T_SMS_RECORD a
            LEFT JOIN COM_T_USER b ON B.USER_ID= A.SENDER
            <where>
                <if test="messageType!=null and messageType!=''">
                    a.MESSAGE_TYPE=#{messageType}
                </if>
                <if test="phoneNo!=null and phoneNo!=''">
                    and a.sende_phone like concat(concat('%',#{phoneNo}),'%')
                </if>
                <if test="sendTime!=null and sendTime!=''">
                    AND substr(TO_CHAR(a.send_time,'yyyy-MM-DD HH:mm:SS'),0,10)=#{sendTime}
                </if>
                <if test="senderName!=null and senderName!=''">
                    and a.sender =(select user_id from com_t_user where user_name=#{senderName})
                </if>
                <if test="caseNo!=null and caseNo!=''">
                    and a.send_message like concat(concat('%',#{caseNo}),'%')
                </if>
                <if test="exclude!=null and exclude!=''">
                    a.MESSAGE_TYPE!=#{exclude}
                </if>
            </where>
        </select>   AND substr(TO_CHAR(a.send_time,'yyyy-MM-DD HH:mm:SS'),0,10)=#{sendTime}
                </if>
                <if test="senderName!=null and senderName!=''">
                    and a.sender =(select user_id from com_t_user where user_name=#{senderName})
                </if>
                <if test="caseNo!=null and caseNo!=''">
                    and a.send_message like concat(concat('%',#{caseNo}),'%')
                </if>
                <if test="exclude!=null and exclude!=''">
                    a.MESSAGE_TYPE!=#{exclude}
                </if>
            </where>
        </select>

    五:前端输入的form表单中提交后后台接受时中文出现乱码情况
    处理方式:

     

     

      sendUserName = java.net.URLDecoder.decode(sender, "UTF-8");
    


    六:数据库中的分页操作(oracle数据库)
    处理案例:

     

     

    <select id="queryAppInfos" resultMap="AppInfos">
            SELECT p.* FROM (select DISTINCT rownum as r,b.user_name,a.user_id,a.android_version,a.app_version,
            substr (a.phone_no,4) as phone_no,a.record_time,a.camera_version from com_t_app_version a
            inner join com_t_user b on a.user_id= b.user_id
            <where>
                <if test="userName!=null and userName!=''">
                    b.user_name like concat(concat('%',#{userName}),'%')
                </if>
                <if test="phoneNo!=null and phoneNo!=''">
                    and a.phone_no like concat(concat('%',#{phoneNo}),'%')
                </if>
                <if test="departId!=null and departId!=''">
                    and b.depart_id=#{departId}
                </if>
                and <![CDATA[ rownum <= #{pageEnd}]]>
            </where>
            ORDER BY record_time desc) p
            where  <![CDATA[ r> #{pageStart}]]>
        </select>


    简单解释一下:这种分页的效率比使用between and高,原因就是between是查询出来后再进行分页筛选。导致效率慢。这种方式是分页查询出来后再进行分页。效率明显高。因为不需要检索全文,只要在小于最大页数的结果集中进行筛选即可。
    基本的思路就是:将rownum作为一个字段显示在结果集中,而后在结果集中继续筛选,上述蓝色的字体代表的是结果集,红色字体代表的是分页的开始行数和结束行数。

     

     

     

     

     

    七:数据库分页查询不重复的数据(数据库中包含有重复的数据),当然也可以使用应用程序进行去重操作。本人习惯于查询的时候去重。
    处理方法事例:包括数据库中varchar2类型时间的处理,和分页的处理,模糊查询,思路就是将要查的数据单独的作为一个子查询,然后再用rownum进行查询,与查询的数据进行合并,同时进行分页处理(小于最大的行数),将查询的结果再一次当作一个子查询模块进行分页筛选(大于最小的行数)

    select id="queryAllTaskByApp" parameterType="HashMap" resultMap="Task">
            select * from (select rownum as r,p.* from (select DISTINCT a.task_id,a.task_status,
            c.case_no,c.car_id,a.create_time from sm_t_task a
            left join sm_t_taskcase_relation b on a.task_id = b.task_id
            left join sm_t_case c on b.case_id = c.case_id
            <where>
                a.is_delete=1
                <if test="userName != null and userName != ''">
                    and a.task_id in (select distinct x.task_id from sm_t_schedu_user_rel y
                    left join sm_t_task_record x on x.user_id=y.front_user_id
                    left join com_t_user z on z.user_id=y.front_user_id
                    where z.user_name like concat(concat('%',#{userName}),'%'))
                </if>
                <if test="followType!=null and followType!=''">
                    and a.follow_type=#{followType}
                </if>
                <if test="taskType !=null and taskType!=''">
                    and a.task_status=#{taskType}
                </if>
                <if test="caseNo!=null and caseNo!=''">
                    and c.case_no like concat(concat('%',#{caseNo}),'%')
                </if>
                <if test="startTime != null and startTime != ''">
                    <![CDATA[ and to_date(substr(a.create_time,1,10), 'yyyy-MM-dd')  >= to_date(#{startTime}, 'yyyy-MM-dd')]]></if>
                <if test="endTime != null and endTime != ''">
                    <![CDATA[ and to_date(substr(a.create_time,1,10), 'yyyy-MM-dd') <= to_date(#{endTime}, 'yyyy-MM-dd')]]></if>
                and c.case_no is not null and c.car_id is not null
            </where>
            order by a.create_time desc)p)
            where  <![CDATA[ r >= #{startPage}]]>  and  <![CDATA[ r <= #{endPage}]]>
        </select>                where z.user_name like concat(concat('%',#{userName}),'%'))
                </if>
                <if test="followType!=null and followType!=''">
                    and a.follow_type=#{followType}
                </if>
                <if test="taskType !=null and taskType!=''">
                    and a.task_status=#{taskType}
                </if>
                <if test="caseNo!=null and caseNo!=''">
                    and c.case_no like concat(concat('%',#{caseNo}),'%')
                </if>
                <if test="startTime != null and startTime != ''">
                    <![CDATA[ and to_date(substr(a.create_time,1,10), 'yyyy-MM-dd')  >= to_date(#{startTime}, 'yyyy-MM-dd')]]></if>
                <if test="endTime != null and endTime != ''">
                    <![CDATA[ and to_date(substr(a.create_time,1,10), 'yyyy-MM-dd') <= to_date(#{endTime}, 'yyyy-MM-dd')]]></if>
                and c.case_no is not null and c.car_id is not null
            </where>
            order by a.create_time desc)p)
            where  <![CDATA[ r >= #{startPage}]]>  and  <![CDATA[ r <= #{endPage}]]>
        </select>

     

    八:页面的表格显示,效果图如下:由于发送信息的内容较长,所以这里使用了隐藏的方法,超过单元格的内容通过“...”代替,鼠标放在单元格上就会出现图中画圈所示的内容,即完整的内容

     

    此页面分为两个模块,一个是form表单提交和重置,一个是查询显示的数据。

    form表单不作过多说明。这个简单的很,着重说一下这数据的展示效果。这单元格的展示采用的是EasyUI中的datagrid,链接为:http://www.jeasyui.net/plugins/183.html

    尤其关注的是列的属性。下面的代码块为页面的部分核心代码。蓝色的部分为显示的数据展示的部分,褐色部分为验证输入代码,其余紫色部分为辅助性的代码,红色部分为单元格显示的Div和样式,(客户那边竟然还是IE8浏览器,很多隐藏不兼容,只能想到这个字符串截取的方法显示了)

     

    define([
        'jquery',
        'underscore',
        'backbone',
        'page',
        /*'text!templates/general/device.html',*/
        'text!' + BASE_APP.path + '/system/message.do'
    ], function ($, _, Backbone, Page, tmpl) {
    
        return Page.view({
            template: _.template(tmpl),
            start: start
        });
    
        function start() {
    
            var self = this,
                wrap = self.$el;
    
            // 解析页面插件
            $.parsePlugins(wrap);
    
            // 查询
            $.numberCheck();
            self.$('#S_search').on('click', function () {
                var name = $('[name="sender"]').val(),
                    phone = $('[name="phoneNo"]').val();
                var m = $('[name="module"]').val();
                var ms = $('[name="messageType"]').val();
                if (name && !$.checkName(name)) {
                    $.tips({
                        content: "请输入正确的姓名!"
                    });
                } else if (phone && !$.checkPhone('[name="phoneNo"]')) {
                    $.tips({
                        content: "请输入一个正确的手机号码!"
                    });
                } else if ((m === "1" && ms === "5") || ((m === "2" && ms === "1")
                        || (m === "2" && ms === "2") || (m === "2" && ms === "3")
                        || (m === "2" && ms === "4"))) {
                    $.tips({
                        content: "选择的短信模块和短信类型不匹配!"
                    });
                }
                else {
                    var params = $.formQueryParams('[name=form-message]');
    
                    $('#messageList').datagrid('load', params);
                }
                return false;
            });
            // 重置表单
            $('[name=form-messgae]').form();
            self.$('#S_reset').on('click', function () {
                $('[name=form-message]').form('clear');
                return false;
            });
            // 列表
            $('#messageList').datagrid({
                url: BASE_APP.path + '/queryMessage.do',
                method: 'post',
                fitColumns: true,
                singleSelect: true,
                rownumbers: true,
                pagination: true,
                multiSort: true,
                nowrap: true,
                columns: [
                    [{
                        field: 'addressee',
                        title: '收件人',
                        sortable: true,
                        width: 37,
                        formatter: function (value) {
                            if(value.length>=17) {
                                return '<div title="' + value + '" style=" width:16em;' +
                                    '    position:relative;' +
                                    '    line-height:1.4em;' +
                                    '    height:1.4em;' +
                                    '    overflow:hidden;">' + value.substring(0,14)+"..."+ '</div>';
                            }
                            else {
                                return value;
                            }
                        }
                    },
                        {
                            field: 'module',
                            title: '短信模块',
                            width: 14,
                            sortable: true
                        },
                        {
                            field: 'messageType',
                            title: '短信类型',
                            width: 15,
                            sortable: true
                        },
    
                        {
                            field: 'sendMessage',
                            title: '发送信息',
                            sortable: true,
                            width: 70,
                            formatter: function (value) {
                                if(value.length>=30) {
                                    return '<div title="' + value + '" style=" width:30em;' +
                                        '    position:relative;' +
                                        '    line-height:1.4em;' +
                                        '    height:1.4em;' +
                                        '    overflow:hidden;">' + value.substring(0,30)+"..."+ '</div>';
                                }
                                else {
                                    return value;
                                }
                            }
                        },
                        {
                            field: 'returnMessage',
                            title: '返回信息',
                            sortable: true,
                            width: 70,
                            formatter: function (value) {
                                if(value.length>=30) {
                                return '<div title="' + value + '" style=" width:30em;' +
                                    '    position:relative;' +
                                    '    line-height:1.4em;' +
                                    '    height:1.4em;' +
                                    '    overflow:hidden;">' + value.substring(0,30)+"..."+ '</div>';
                                }
                                else {
                                    return value;
                                }
                            }
                        },
                        {
                            field: 'sendTime',
                            title: '发送时间',
                            sortable: true,
                            width: 28
                        },
                        {
                            field: 'messageStatus',
                            title: '发送状态',
                            sortable: true,
                            width: 27,
                            formatter: function (value, row, index) {
                                return formatStatus(value, false);
                            },
                            styler: function (value, row, index) {
                                return formatStatus(value, true);
                            }
                        }
                    ]
                ],
                loadFilter: function (data) {
                    return {
                        total: data.returnObject.pageMsg.totalNum,
                        rows: data.returnObject.messageInfos
                    }
                },
                onLoadSuccess: function () {
    
                    $.datagridResize('#messageList'); // 列表重置大小事件
                }
            });
        }
    
        //格式化状态
        function formatStatus(num, styler) {
            var status, cls;
            switch (num) {
                case "2":
                    status = "发送成功";
                    cls = {
                        cls: 'text-status text-success'
                    };
                    break;
                case "3":
                    status = "发送失败";
                    cls = {
                        cls: 'text-status text-danger'
                    };
                    break;
                case "1":
                    status = "正在发送";
                    cls = {
                        cls: 'text-status text-primary'
                    };
                    break;
            }
            if (styler) {
                return cls;
            }
            return status;
        }
    });
    
    
    
     $.numberCheck();
            self.$('#S_search').on('click', function () {
                var name = $('[name="sender"]').val(),
                    phone = $('[name="phoneNo"]').val();
                var m = $('[name="module"]').val();
                var ms = $('[name="messageType"]').val();
                if (name && !$.checkName(name)) {
                    $.tips({
                        content: "请输入正确的姓名!"
                    });
                } else if (phone && !$.checkPhone('[name="phoneNo"]')) {
                    $.tips({
                        content: "请输入一个正确的手机号码!"
                    });
                } else if ((m === "1" && ms === "5") || ((m === "2" && ms === "1")
                        || (m === "2" && ms === "2") || (m === "2" && ms === "3")
                        || (m === "2" && ms === "4"))) {
                    $.tips({
                        content: "选择的短信模块和短信类型不匹配!"
                    });
                }
                else {
                    var params = $.formQueryParams('[name=form-message]');
    
                    $('#messageList').datagrid('load', params);
                }
                return false;
            });
            // 重置表单
            $('[name=form-messgae]').form();
            self.$('#S_reset').on('click', function () {
                $('[name=form-message]').form('clear');
                return false;
            });
            // 列表
            $('#messageList').datagrid({
                url: BASE_APP.path + '/queryMessage.do',
                method: 'post',
                fitColumns: true,
                singleSelect: true,
                rownumbers: true,
                pagination: true,
                multiSort: true,
                nowrap: true,
                columns: [
                    [{
                        field: 'addressee',
                        title: '收件人',
                        sortable: true,
                        width: 37,
                        formatter: function (value) {
                            if(value.length>=17) {
                                return '<div title="' + value + '" style=" width:16em;' +
                                    '    position:relative;' +
                                    '    line-height:1.4em;' +
                                    '    height:1.4em;' +
                                    '    overflow:hidden;">' + value.substring(0,14)+"..."+ '</div>';
                            }
                            else {
                                return value;
                            }
                        }
                    },
                        {
                            field: 'module',
                            title: '短信模块',
                            width: 14,
                            sortable: true
                        },
                        {
                            field: 'messageType',
                            title: '短信类型',
                            width: 15,
                            sortable: true
                        },
    
                        {
                            field: 'sendMessage',
                            title: '发送信息',
                            sortable: true,
                            width: 70,
                            formatter: function (value) {
                                if(value.length>=30) {
                                    return '<div title="' + value + '" style=" width:30em;' +
                                        '    position:relative;' +
                                        '    line-height:1.4em;' +
                                        '    height:1.4em;' +
                                        '    overflow:hidden;">' + value.substring(0,30)+"..."+ '</div>';
                                }
                                else {
                                    return value;
                                }
                            }
                        },
                        {
                            field: 'returnMessage',
                            title: '返回信息',
                            sortable: true,
                            width: 70,
                            formatter: function (value) {
                                if(value.length>=30) {
                                return '<div title="' + value + '" style=" width:30em;' +
                                    '    position:relative;' +
                                    '    line-height:1.4em;' +
                                    '    height:1.4em;' +
                                    '    overflow:hidden;">' + value.substring(0,30)+"..."+ '</div>';
                                }
                                else {
                                    return value;
                                }
                            }
                        },
                        {
                            field: 'sendTime',
                            title: '发送时间',
                            sortable: true,
                            width: 28
                        },
                        {
                            field: 'messageStatus',
                            title: '发送状态',
                            sortable: true,
                            width: 27,
                            formatter: function (value, row, index) {
                                return formatStatus(value, false);
                            },
                            styler: function (value, row, index) {
                                return formatStatus(value, true);
                            }
                        }
                    ]
                ],
                loadFilter: function (data) {
                    return {
                        total: data.returnObject.pageMsg.totalNum,
                        rows: data.returnObject.messageInfos
                    }
                },
                onLoadSuccess: function () {
    
                    $.datagridResize('#messageList'); // 列表重置大小事件
                }
            });
        }
    
        //格式化状态
        function formatStatus(num, styler) {
            var status, cls;
            switch (num) {
                case "2":
                    status = "发送成功";
                    cls = {
                        cls: 'text-status text-success'
                    };
                    break;
                case "3":
                    status = "发送失败";
                    cls = {
                        cls: 'text-status text-danger'
                    };
                    break;
                case "1":
                    status = "正在发送";
                    cls = {
                        cls: 'text-status text-primary'
                    };
                    break;
            }
            if (styler) {
                return cls;
            }
            return status;
        }
    });
    
    
    
    


    九:采用注解的方式获取配置文件中的值

     

    处理方法:

    ①:配置文件如下图所示,获取三个值分别是灰色部分所示。
    ②:在配置文件xml中增加bean配置如下所示(至于maven依赖的包,如若报错的话,可以百度依赖的jar包是什么。这个bean可以配置在db配置的所在xml中)

     

    <!--创建properties工厂-->
    	<bean id="properties"
    		  class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    		<property name="locations">
    			<list>
    				<value>classpath:config.properties</value>
    			</list>
    		</property>
    	</bean>


    ③:在需要获取配置文件的类中添加注解的格式如下,这三步完成的话,就可以直接在类中引用变量的值了。很方便哦。

     

     

     @Value("#{properties[filepath]}")
        private String filePath;
    
        @Value("#{properties[uploadPath]}")
        private String uploadPath;

     

    十:采用注解的方式开启事务,事务生成的条件

    处理方法:

    ①:配置文件中配置相关的注解,开启事务如下图所示:

    ②:在需要开启注解的方式上增加注解,需要注意是:默认对RuntimeException()异常或是其子类进行事务回滚;checked异常,即Exception可try{}捕获的不会回滚,如果使用try-catch捕获抛出的unchecked异常后没有在catch块中采用页面硬编码的方式使用spring api对事务做显式的回滚,则事务不会回滚, “将异常捕获,并且在catch块中不对事务做显式提交=生吞掉异常” 。简单的说:如下图红框中的内容,设置一下就会对检查型异常进行回滚,(其实可以不设置,检查型异常都会报错的),还有就是,在catch中异常的时候,要对异常重新抛出才可以让事务生效,即 throw new  RuntimeException(“事务回滚了”);

    十一:sql语句中传人的是List集合的处理方法,请求的参数未list。 

    List<User> getUserListByUserIds(List<String> userIds);
    

    xml中的sql对应部分为

    <foreach collection="list" item="item" open="(" close=")" separator=",">
        #{item}
    </foreach>

    还有另外的一种情况 

     

    List<Area> queryArea(@Param("departId") List<String> departId);
    

    此时如果list的集合是空,可采用如下判断,而且请求的参数采用HashMap的形式进行,departId,如果是数组的话直接是数组的属性.length>0,传进来的是一个集合,故而是departId.size>0.

    <select id="queryArea" resultType="com.wisemax.common.dto.area.Area" parameterType="HashMap">
        select b.depart_name as areaName,b.depart_id as areaId FROM COM_T_AREA a
        LEFT JOIN com_t_depart b on a.area_id = b.area_id
        <where>
            <if test="departId!=null and departId.size()>0">
                depart_id in
                <foreach collection="departId" item="item" open="(" close=")" separator=",">
                    #{item}
                </foreach>
        </if>
        </where>
        ORDER by sort_id asc

     

     

     

    展开全文
  • Java项目开发实例

    2015-02-24 11:17:49
    Java项目开发实例
  • java项目开发实例

    2014-02-28 11:43:20
    java项目开发实例
  • Java项目开发实例自学手册
  • Java项目开发实例代码

    2013-04-10 09:59:17
    Java项目开发实例自学手册上的内容配套的代码。
  • java项目开发实例自学手册,包括环境配置录像,项目实例录像等
  • JAVA项目开发实例全程实录2
  • JAVA项目开发实例全程实录1
  • 实验五 Java 项目开发实例 实验目的 掌握运用 RAD 开发 Java 应用程序 目标要求 1. 掌握运用 Visual Editor 创建窗口应用程序 2. 掌握通过 JDBC 连接数据库 内容简介 本章将介绍 MyLibrary 的 GUI 应用程序 实验说明...
  • 实验五 Java 项目开发实例 实验目的 掌握运用 RAD 开发 Java 应用程序 目标要求 1. 掌握运用 Visual Editor 创建窗口应用程序 2. 掌握通过 JDBC 连接数据库 内容简介 本章将介绍 MyLibrary 的 GUI 应用程序 实验说明...
  • Java_项目开发实例

    2012-10-27 18:59:46
    java项目开发实例,包含图书馆管理系统开发全程实录及源代码
  • JAVA项目开发实例

    2011-03-01 12:32:56
    包里含有五个JAVA项目,分别有即时通信系统,讯友桌面通讯录,编程词典用户管理系统,宾馆管理系统,二手房担保业务系统,这都是学习JAVA的很有用程序,有需要的朋友可以下载,谢谢。
  • Java项目实例开发

    2014-11-30 04:07:13
    实例讲解进销存管理系统,附有源码,手把手讲解项目开发流程。
  • java项目开发实例自学手册(源码)

    热门讨论 2013-05-12 21:17:19
    java项目开发实例自学手册(源码)
  • Java项目开发实例图信息管理完整开发文档及源码个人收集整理 勿做商业用途个人收集整理 勿做商业用途PAGE / NUMPAGES个人收集整理 勿做商业用途图书信息管理系统系统功能概述:根据图书信息管理系统的特点,可以将本...
  • 到存在于样品的基团,SSH可以从在移动电话APP...和一般的应用程序开发背景最直接通JSON格式的数据(也未JSON格式,看所选的项目,但一般是JSON),直接少数回报HTML5页面 。另一个区别是,登录认证和数据加密,使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,232
精华内容 1,292
关键字:

java开发项目实例

java 订阅