今天继续前面的话题,说说Java web开发的那点事。Java语言一直作为软件行业的热门语言,近几年在国内各个语言开发占的比重如下: ? 如今的互联网时代,Java已占据了半壁江山。 尤其大型互联网公司对Java开发人员的需求极大,也使得每年都有大批的人进入。但技术更新换代的又很快,好多在传统软件公司呆久了的Coder们,似乎已经与最新的技术脱节。 所以要想在这个行业长期混的伙伴们,务必跟上技术更新的步伐。那目前都流行那些技术呢,我大概梳理梳理下吧! 我们把Web端做成静态的Html项目并部署在独立的Tomcat上。后端服务的Java项目里只放控制层(Controller)和业务层(Service),然后Web端跟后端服务通过API通信。 看到这里,相信小伙伴们对分布式开发已经有了初步的认识和了解,今天就说这么多,如果想了解更多的分布式应用及涉及的技术,请关注我的公众号,我会继续分享更多的内容,与大家共同学习共同进步。
Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,成为Java架构师除了掌握Java语法,还要系统学习哪些Java相关的技术,今天分享一个,互联网最新Java技术学习路线图。 构成架构师的技能体系 ? 有了大牛的代码功底之后,接下来可以更好地学习分布式架构技术。 透彻理解分布式架构的好处和优点 必然性,适应市场需求,能够去找一些更大的平台发展,提升自己的综合技术能力和薪资。 从分布式架构原理,到分布式架构策略,再到分布式架构中间件,最后在加上分布式架构实战,让程序员可以在技术深度和技术广度上得到飞跃的提升,成为互联网行业所需要的T型人才。 四、微服务架构技能总汇 ? 以上八大知识体系是我从业多年总结出来的经验,都是当前最主流的技术。
会话跟踪技术 会话:用户打开浏览器,访问 wb 服务器的资源,会话建立,直到有一方断开连接,会话结束。 一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据 HTTP 协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享 实现方式:1.客户端会话跟踪技术:Cookie2.服务端会话跟踪技术:Session 一.Cookie 1.Cookie 基本使用 Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带 被销毁 3.零:删除对应 Cookie Cookie 存储中文 Cookie 不能直接存储中文 如需要存储,则需要进行转码:URL 编码 二.Session 1.Session 基本使用 服务端会话跟踪技术
注意:推荐能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring Web MVC环境下才能使用,因此Filter是最通用的 insert ... on duplicate语句,参考insert on duplicate语法) 普通索引 组合索引 使用@Async注解,可限定某个类的所有方法或者某个方法进行异步处理,属于对线程池技术的封装
下图为简略版的Web系统架构,本文围绕此图展开,简要介绍其中涉及组件的功能和应用场景。 [7xrcjrgmoc.jpeg] 回到最初,Web项目的源头几乎全来源于用户的请求(此处忽略运维相关的定时监控等任务),当海量的请求并发量超过Tomcat服务器的峰值时,Tomcat的集群化应运而生, JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发 像其他NoSQL数据库一样,它是一种非关系数据存储和处理技术。 使用Solr时需要整合中文分析器,例如IK Analyzer。 IK Analyzer 是一个开源的,基亍 java 语言开发的轻量级的中文分词工具包。
Java Web后端技术(一) 学习Java及其相关技术到现在也是第一次写博客,可能理解不是很深,但也是自己学的一个小的总结,也希望各位大神不吝赐教。 1.Tomcat服务器 1.1Java Web 在讨论Tomcat之前先说明一下Java Web。Java Web是用Java技术来解决相关Web领域的技术综合。 发布web流程:在Tomcat Server中的Development中添加web项目。 然后就可以启动Tomcat并且能访问页面了。 Cookie 与会话有关技术,用于存放浏览器缓存的cookie信息。 通过浏览器以下载方式解析正文 Set-Cookie 与会话相关技术。
lombok使用,参考:Lombok:让Java代码更优雅 //下面是类级别注解 @NoArgsConstructor //相当于定义1个无参构造函数 @Data //相当于定义了类里所有属性的get Java Web安全编码,参见:Web 安全问题总结 安全参数:HttpOnly、Secure Cookie 防止页面被嵌入iframe放到其他页面,在Header中添加如下代码 /* X-Frame-Options 参考资料:TypeReference;例子代码见:TypeReferenceExample 7.使用Java8的并行流,需要注意线程安全问题,参考:https://my.oschina.net/7001
在Java开发中,当某个变量需要在多个线程之间共享时,需要分析具体的场景:如果多个线程对该共享变量的读和写之间没有竞争关系,则可以考虑使用concurrent包下提供的并发数据结构,例如ConcurrentHashMap 原理:synchronized是Java的内置锁。JVM通过monitorenter和monitorexit指令实现内置锁。 分布式session服务的实现 在之前参加过的一个项目中,负责session服务的重写(C++转Java),站在更高的层面看,为什么需要这个session服务呢? 我一般遵循如下步骤排查: 通过ps -ef | grep 'java'命令找到jvm的PID,例如12345; 通过top -H -p12345命令查看每个线程的工作状态,截图; 通过jstack -
username=scott password=tiger url=jdbc:oracle:thin:@192.168.1.20:1521:ora9 poolSize=10 ConnectionPool.java 代码: package webbook.util; import java.io.FileInputStream; import java.sql.Connection; import java.sql.SQLException ; import java.util.Properties; import java.util.Vector; public class ConnectionPool { private Vector 代码: package webbook.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet ; import java.sql.Statement; public class ConnectionPoolTest { public static void main(String[] args
文章阅读——Java 8中的日期API,借鉴了Joda Time库的良好设计,在升级到Java 8后基本可以不用再使用Joda Time这个第三方库。 Java 8中的日期API主要包括以下六个方面:日期(java.time.LocalDate)、时间(java.time.LocalTime)、时间戳(java.time.Instant)、日期时间(java.time.LocalDateTime 代码可以参见:Learn Java Java并发包中有很多基础工具,其中包括阻塞队列。 文章阅读:使用 Java8 Optional 的正确姿势。 在java.util.functional包中,Java 8提供了一些常见的函数标识: Predicate:接受一个泛型(T)对象,并返回boolean。
Cause: java.lang.UnsupportedOperationException”,错误代码如下: <select id="getInPaging" resultType="<em>java</em>.util.List example_table WHERE id=#{id} ]]> </select> 在这里,resultType指的是查询到的每条记录的类型,因此应该用<em>java</em>.lang.String 必须做到以下几件事: 入参检查 异常处理 统一的结果生成 配套的单元测试和接口测试用例,防止代码修改引入新的bug 在ArrayList<Object>中去掉重复的对象(按照自定义的重复定义规则),如:[原创]<em>JAVA</em> 技巧:去除ArrayList<Object>里面的重复记录](http://www.cnblogs.com/jizha/p/<em>java</em>_arraylist_duplicate.html) 在通过URL参数传入时间时 mvc-context-hierarchy.png 最后,再重温下spring mvc的处理流程,在进行<em>Java</em> <em>Web</em>开发的时候,也时刻不要忘记对HttpRequest的处理流程。 ?
参考:Java 用自定义类型作为HashMap的键 在JavaWeb开发中,你需要掌握的MySQL知识,可以参考:MySQL总结这篇文章。
本文主要为《深入理解JVM虚拟机》一书的阅读笔记 Java堆内存溢出:在生产环境中,常常遇到各种Java内存问题,在分析JVM内存时,可以考虑使用MAT。 在Java语言中,可作为GC Roots的对象包括以下几种: 虚拟机栈(栈帧中的本地变量表)中引用的对象; 方法区中类静态属性引用的对象; 方法区中常量引用的对象; 本地方法栈中JNI(即一般说的Native 几种垃圾收集器的选择:(1)在吞吐量优先/CPU资源宝贵的场景下,适合使用Parallel Scanvenge收集器(年轻代) + Parallel Old收集器(老年代)组合;(2)在响应时间敏感的Web 读过的文章:JVM调优总结 阅读《Java核心技术(二)》的1.5节笔记,Java序列化包括的知识点:(1)ObjectOutputStream和ObjectInputStream连个类的writeObject ()/readObject()方法;(2)序列化/反序列化是Java对象与字节流之间的转换过程;(3)序列化生成的文件具备指定的格式,包含了恢复Java对象需要的全部信息;(4)对于不想/不能序列化的字段
使用Java读取文件时,要评估文件的大小,避免因为文件过大而造成OOM,参见:Java高效读取文件 RateLimiter可以用来限制请求的速率,有两种应用场景:针对一些核心接口,在参与大促(双十一) mybatis中,返回值为对象时,如果查不到对应的记录则返回Null,返回值为List<T>时,如果查不到记录则返回空数组 Java Web如何从HttpRequest中获取客户端的IP地址? 参考:JAVA【long值与ip地址互转】 - ip的判别
该系列的第一篇在此:Java Web技术经验总结一,主要包含我在日常工作中的经验和心得体会(如有不足之处欢迎指出)。 查看JVM进程:ps -ef|grep java 查看JVM内存占用信息: sudo -u admin /opt/taobao/java/bin/jstat -gccause ${PID} 1000 Mockito + Spring + AssertJ是Spring项目中写单元测试的最佳组合,优点有:轻量、简洁、可以测试web层(拦截器、过滤器等)、可以测试异常分支。 Java Web的最佳实践:Spring Boot + Thymeleaf,基础技术包括:Spring + HTML + CSS。 参考:Thymeleaf官网 数据库部分,企业级Java Web要求的知识架构很多,后端就包括数据技术,最常用的是关系型数据库MySQL,可以阅读下列文章补充一点知识点。
注意:推荐能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring Web MVC环境下才能使用,因此Filter是最通用的 insert ... on duplicate语句,参考insert on duplicate语法) 普通索引 组合索引 使用@Async注解,可限定某个类的所有方法或者某个方法进行异步处理,属于对线程池技术的封装
Git工作流:Git 工作流程 Maven版本管理:阅读Maven最佳实践:版本管理 lombok project,在Java开发中,我们常常需要写很多令人厌烦的getter/setter代码、需要自己覆盖 不过在我过去的开发中,如果需要定制自己的equals方法,我常常使用Apache Commons中提供的EqualsBuilder和HashCodeBuilder两个类,参考:Java 中正确使用 hashCode IDEA中使用lombok需要安装对应的插件,参考:lombok在IntelliJ IDEA下的使用 MySQL的主从延迟和解决方案:MySQL主从数据库同步延迟问题解决 来自《Effective Java 实现分布式锁的方法,这篇文章讲得很详细:分布式锁1 Java常用技术方案 使用Intelij IDEA中的git插件进行分支合并的步骤(例如:branch1合并到branch2): 切换到目标分支,branch2
通过Java Config代码启用default-servlet-handler: @Configuration @EnableWebMvc public class WebConfig extends 可以针对所有的请求或者指定URL匹配模式的请求进行拦截,如下是一个Java Config代码: @Configuration @EnableWebMvc public class WebConfig addPathPatterns("/secure/*"); } } 对应的XML配置代码如下: <mvc:interceptors> <bean class="org.springframework.<em>web</em>.servlet.i18n.LocaleChangeInterceptor ="/**"/> <mvc:exclude-mapping path="/admin/**"/> <bean class="org.springframework.<em>web</em>.servlet.theme.ThemeChangeInterceptor 8的话,可以直接使用<em>Java</em> 8提供的日期接口。
今天解决多线程问题的时候,用到了优先级队列模型,涉及到“按照优先级”从高到低遍历,因此查到这个问题:如何利用Java原因逆序便利一个TreeMap? 参考How to iterate TreeMap in reverse order in Java import java.util.*; class TreeMapDemo { public 参考一篇文章:Java多线程11:ReentrantLock的使用和Condition 预发/线上的远程debug利器greys:在Java开发中,如果服务部署在日常环境,我们可以通过IDEA 的远程 中的接口回调:深入浅出Java回调机制 和 回调函数。 这时候可以利用Java的回调机制,将具体的调用逻辑作为一个回调接口传入到L中。这样A和B可以自由选择自己对L的调用策略。
一、背景 Java Servlet可以说是一项非常久远的技术了,甚至可以说是Java Web应用的起源。 也就是说真正了解了这项技术的原理与实现细节,我们就掌握了Java Web的基础,也对以后能上手基于Java Servlet的框架起到事半功倍的作用。 本文旨在重温与Java Servlet密切相关的一些技术细节。 Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。 通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。