今天继续前面的话题,说说Java web开发的那点事。Java语言一直作为软件行业的热门语言,近几年在国内各个语言开发占的比重如下: ? 如今的互联网时代,Java已占据了半壁江山。 尤其大型互联网公司对Java开发人员的需求极大,也使得每年都有大批的人进入。但技术更新换代的又很快,好多在传统软件公司呆久了的Coder们,似乎已经与最新的技术脱节。 所以要想在这个行业长期混的伙伴们,务必跟上技术更新的步伐。那目前都流行那些技术呢,我大概梳理梳理下吧! 我们把Web端做成静态的Html项目并部署在独立的Tomcat上。后端服务的Java项目里只放控制层(Controller)和业务层(Service),然后Web端跟后端服务通过API通信。 看到这里,相信小伙伴们对分布式开发已经有了初步的认识和了解,今天就说这么多,如果想了解更多的分布式应用及涉及的技术,请关注我的公众号,我会继续分享更多的内容,与大家共同学习共同进步。
虽然说 html 和 css 等前端技术,是对于 Web 来说不可或缺的技术,但是毕竟更为简单一些,所以就不详细介绍了,没有基础的同学可以去菜鸟教程或者W3school进行自主学习,最好的方式还是做一做简单的项目 Java平台 Micro Edition ME 用于手机和其他小型设备的Java平台 Java 2 J2 一个过时的术语,用于描述1998年~2006年之间的Java版本 Software Development :http://www.oracle.com/technetwork/java/javase/downloads/index.html 最新的JDK已经升级到了9.0,而且据说10.0都快出来了,可能对于一些新学 pan.baidu.com/s/1i-H4SUMcn2y5_arluK923A 密码:1n04 xampp 是一套 Web 开发套件,里面包含了 mysql、apache、tomcat 等常用组件 ---- 至此,Java Web 的开发环境就已经全部搭建好了,关于为什么选择 Eclipse 而不选择 IDEA ,是因为这学期开的 Java Web 课程中使用的也是 Eclipse ,为了避免麻烦
Java是现阶段中国互联网公司中,覆盖度最广的研发语言,掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,成为Java架构师除了掌握Java语法,还要系统学习哪些Java相关的技术,今天分享一个,互联网最新Java技术学习路线图。 构成架构师的技能体系 ? 有了大牛的代码功底之后,接下来可以更好地学习分布式架构技术。 透彻理解分布式架构的好处和优点 必然性,适应市场需求,能够去找一些更大的平台发展,提升自己的综合技术能力和薪资。 从分布式架构原理,到分布式架构策略,再到分布式架构中间件,最后在加上分布式架构实战,让程序员可以在技术深度和技术广度上得到飞跃的提升,成为互联网行业所需要的T型人才。 四、微服务架构技能总汇 ? 以上八大知识体系是我从业多年总结出来的经验,都是当前最主流的技术。
会话跟踪技术 会话:用户打开浏览器,访问 wb 服务器的资源,会话建立,直到有一方断开连接,会话结束。 实现方式:1.客户端会话跟踪技术:Cookie2.服务端会话跟踪技术:Session 一.Cookie 1.Cookie 基本使用 Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带 Cookie 数据进行访问 基本使用 发送 Cookie 1.创建 Cookie 对象,设置数据 Cookie dookie = new Cookie("key","value"); 2.发送 到时间自动删除 2.负数:默认值,Cookie 在当前浏览器内存中,当浏览器关闭,则 Cookie 被销毁 3.零:删除对应 Cookie Cookie 存储中文 Cookie 不能直接存储中文 如需要存储 使用:1.获取 Session 对象 HttpSession session = request.getSession(); 2.Session 对象功能: void setAttribute(
下图为简略版的Web系统架构,本文围绕此图展开,简要介绍其中涉及组件的功能和应用场景。 [7xrcjrgmoc.jpeg] 回到最初,Web项目的源头几乎全来源于用户的请求(此处忽略运维相关的定时监控等任务),当海量的请求并发量超过Tomcat服务器的峰值时,Tomcat的集群化应运而生, JMS(Java Messaging Service)是Java平台上有关面向消息中间件的技术规范,它便于消息系统中的Java应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的接口简化企业应用的开发 像其他NoSQL数据库一样,它是一种非关系数据存储和处理技术。 使用Solr时需要整合中文分析器,例如IK Analyzer。 IK Analyzer 是一个开源的,基亍 java 语言开发的轻量级的中文分词工具包。
注意:推荐能使用servlet规范中的过滤器Filter实现的功能就用Filter实现,因为HandlerInteceptor只有在Spring Web MVC环境下才能使用,因此Filter是最通用的 insert ... on duplicate语句,参考insert on duplicate语法) 普通索引 组合索引 使用@Async注解,可限定某个类的所有方法或者某个方法进行异步处理,属于对线程池技术的封装 需要通过日志打印验证@Async确实起作用了,可能有三个坑:(1)内部调用不能异步;(2)不能重复扫描,确保带@Async注解的方法所在的类只被Component-Scan扫一次;(3)必须是public 单元测试,推荐使用Mockito框架,理由有三:(1)可专注于被测试对象;(2)不需要建立复杂的bean依赖关系;(3)DSL描述性语言简单易懂。
Java Web后端技术(一) 学习Java及其相关技术到现在也是第一次写博客,可能理解不是很深,但也是自己学的一个小的总结,也希望各位大神不吝赐教。 1.Tomcat服务器 1.1Java Web 在讨论Tomcat之前先说明一下Java Web。Java Web是用Java技术来解决相关Web领域的技术综合。 2.HTTP协议 HTTP协议:超文本传输协议(HTTP,HyperText Transfer Protocol)是在互联网中普遍的网络协议,用于定于web浏览器和服务器之间的传输过程。 2POST请求:请求参数显示请求体处,比较安全;对于请求数据大小也没有限制。 通过浏览器以下载方式解析正文 Set-Cookie 与会话相关技术。
文章阅读——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并发包中有很多基础工具,其中包括阻塞队列。 Optional的使用:(1)调用get()方法之前要先判断某个值是否被提供,A get() not preceded by a call to isPresent() is a bug;(2)最近Stuart 使用Optional的错误姿势: 调用 isPresent()方法时 调用 get()方法时 Optional 类型作为类/实例属性时 Optional 类型作为方法参数时 在J2EE项目中,利用MyBatis
Cause: java.lang.UnsupportedOperationException”,错误代码如下: <select id="getInPaging" resultType="<em>java</em>.util.List PS:MappingJackson<em>2</em>HttpMessageConverter和MappingJacksonHttpMessageConverter的区别在于,Spring 4版本都用前一个。 常用Git作为代码管理工具,除了熟练使用IDEA中提供的图形化Git管理功能,也需要了解这些GUI背后对应的指令,那么久需要看如下资料: 猴子都能懂的Git入门 Pro Git(V<em>2</em>) Spring MVC Spring 容器(Spring 的上下文)这篇文章给出了详细解释:在Spring MVC项目中,这两个父子容器的角色不同:(1)父容器中保存数据源、服务层、DAO层、事务的Bean;(<em>2</em>)子容器中保存 mvc-context-hierarchy.png 最后,再重温下spring mvc的处理流程,在进行<em>Java</em> <em>Web</em>开发的时候,也时刻不要忘记对HttpRequest的处理流程。 ?
在Java开发中,当某个变量需要在多个线程之间共享时,需要分析具体的场景:如果多个线程对该共享变量的读和写之间没有竞争关系,则可以考虑使用concurrent包下提供的并发数据结构,例如ConcurrentHashMap 作用:(1)确保多线程之间互斥访问共享变量;(2)确保共享变量的修改能够及时可见;(3)有效解决重排序问题。 原理:synchronized是Java的内置锁。 分布式session服务的实现 在之前参加过的一个项目中,负责session服务的重写(C++转Java),站在更高的层面看,为什么需要这个session服务呢? 在Spring的容器中,对bean的处理分为两步:(1)读取元数据配置(XML文件、JavaConfig或者注解),生成BeanDefinition对象;(2)通过各种BeanDefinitionParser 我一般遵循如下步骤排查: 通过ps -ef | grep 'java'命令找到jvm的PID,例如12345; 通过top -H -p12345命令查看每个线程的工作状态,截图; 通过jstack -
解决XSS攻击,有两种解决方法:1)服务端对提交上来的留言内容做过滤,把恶意代码过滤掉;2)让恶意javascript代码读取不到我们种的cookie。httpOnly的角色是第二种。 lombok使用,参考:Lombok:让Java代码更优雅 //下面是类级别注解 @NoArgsConstructor //相当于定义1个无参构造函数 @Data //相当于定义了类里所有属性的get //声明log4j2注解,会自动为该类创建1个 log属性,避免手动创建,lombok还支持slf4j,log4j1.x commons log ,jdk原生的log,都会有相应的注解支持 . Java Web安全编码,参见:Web 安全问题总结 安全参数:HttpOnly、Secure Cookie 防止页面被嵌入iframe放到其他页面,在Header中添加如下代码 /* X-Frame-Options 参考资料:TypeReference;例子代码见:TypeReferenceExample 7.使用Java8的并行流,需要注意线程安全问题,参考:https://my.oschina.net/7001
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
本文主要为《深入理解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 用自定义类型作为HashMap的键 在JavaWeb开发中,你需要掌握的MySQL知识,可以参考:MySQL总结这篇文章。 insertOrUpdate语句,通过Insert...values() on duplicate key update ....语句实现,这里有两点需要注意: 影响行数:insert 1、update 2、 通过正则表达式匹配正确的IP4地址,参考link正则表达式如下: ^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]? (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s\n", add, subs, loc
使用Java读取文件时,要评估文件的大小,避免因为文件过大而造成OOM,参见:Java高效读取文件 RateLimiter可以用来限制请求的速率,有两种应用场景:针对一些核心接口,在参与大促(双十一) mybatis中,返回值为对象时,如果查不到对应的记录则返回Null,返回值为List<T>时,如果查不到记录则返回空数组 Java Web如何从HttpRequest中获取客户端的IP地址? 参考:JAVA【long值与ip地址互转】 - ip的判别
Git工作流:Git 工作流程 Maven版本管理:阅读Maven最佳实践:版本管理 lombok project,在Java开发中,我们常常需要写很多令人厌烦的getter/setter代码、需要自己覆盖 :MySQL主从数据库同步延迟问题解决 来自《Effective Java》中的第6条规则:内存泄漏的另一个来源是缓存。 实现分布式锁的方法,这篇文章讲得很详细:分布式锁1 Java常用技术方案 使用Intelij IDEA中的git插件进行分支合并的步骤(例如:branch1合并到branch2): 切换到目标分支,branch2 在右下角git快捷窗口——>branch1——>merge,就会将branch1合并到branch2。 我的经验是:(1)只有某个业务要求同时修改两张以上的表的数据的时候,再使用事务,并且要在方法级别使用;(2)事务和同步代码块不可嵌套使用。
该系列的第一篇在此:Java Web技术经验总结一,主要包含我在日常工作中的经验和心得体会(如有不足之处欢迎指出)。 1s查看gc发生的原因 观察gc.log的时候:(1)GC开头的都是Young GC;(2)CMS-initial-mark标识,且没有full字样的,是old区的GC;(3)带full字样的是fgc } 线上机器每隔一个小时full gc问题排查 参考文章 1. tomcat 7.0中full gc频繁 2. 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注解,可限定某个类的所有方法或者某个方法进行异步处理,属于对线程池技术的封装 需要通过日志打印验证@Async确实起作用了,可能有三个坑:(1)内部调用不能异步;(2)不能重复扫描,确保带@Async注解的方法所在的类只被Component-Scan扫一次;(3)必须是public 单元测试,推荐使用Mockito框架,理由有三:(1)可专注于被测试对象;(2)不需要建立复杂的bean依赖关系;(3)DSL描述性语言简单易懂。
一、背景 Java Servlet可以说是一项非常久远的技术了,甚至可以说是Java Web应用的起源。 也就是说真正了解了这项技术的原理与实现细节,我们就掌握了Java Web的基础,也对以后能上手基于Java Servlet的框架起到事半功倍的作用。 本文旨在重温与Java Servlet密切相关的一些技术细节。 Servlet API中提供了一个Filter接口,开发web应用时,如果编写的Java类实现了这个接口,则把这个java类称之为过滤器Filter。 通过Filter技术,开发人员可以实现用户在访问某个目标资源之前,对访问的请求和响应进行拦截。
今天解决多线程问题的时候,用到了优先级队列模型,涉及到“按照优先级”从高到低遍历,因此查到这个问题:如何利用Java原因逆序便利一个TreeMap? 参考How to iterate TreeMap in reverse order in Java import java.util.*; class TreeMapDemo { public )); // Put elements to the map treemap.put("Key1", "Jack"); treemap.put("Key2" 参考一篇文章:Java多线程11:ReentrantLock的使用和Condition 预发/线上的远程debug利器greys:在Java开发中,如果服务部署在日常环境,我们可以通过IDEA 的远程 中的接口回调:深入浅出Java回调机制 和 回调函数。