收到PHP童鞋的反馈:

java体系基础

 

理论

  1. 编程语言:
  • 系统级: C, C++, go, erlang …
  • 应用级: C#, Java, Python, Perl, Ruby, php
    • 虚拟机: jvm(java虚拟机), pvm(python的虚拟机)
    • 动态网站: asp, .net, jsp, php
  1. 动态网站:
  2. 客户端动态: 数据处理在客户端进行, 早期是这样实现, 但非常不安全,
    现在基本已经废弃.
  3. 服务器动态: 用CGI协议将要处理的程序转交给语言运行。
    • CGI的部分实现:
    • webapp server:
      • jsp: tomcat, jboss, jetty
      • php: php-fpm
  4. java编程语言
  • SUN公司开发并开源
  • 作者: James Gosling
  • 项目: Green Project
  • 原名: Oak
  • 更名: 1995年更名为java, 在SunWorld大会正式发布Java 1.0版本
  • 特性: Write Once、Run Anywhere, 翻译过来就是一次编写, 到处运行。
  • java的历史
    • 1995: java 1.0
    • 1996: JDK(Java Development Kit, 翻译java开发工具箱),
      包含一个JVM(SUN Classic VM,经典的jvm),
      当时的jvm是纯解释运行,所以性能非常低。
    • 1997: SUN发布jdk 1.1
    • 1997: JDK 1.2
    • SUN把java技术分拆为三个方向:
      • J2SE: Standard Edition
      • J2EE: Enterprise Edition
      • J2ME: Mobile Edition
    • 代表性技术: EJB, JAVA Plug-in, Swing, JIT编译器(即时编译器)
    • 1999:HotSpot虚拟机
    • 2000:JDK 1.3
    • 2002: JDK 1.4, 此时jdk变得非常成熟了
    • 2006: Sun开源了java技术, 遵循GPL规范,
      并建立了OpenJDK组织管理此些代码;
    • 2007: 发布JDK 1.7, 里程碑
  • java虚拟机: JRockit, HotSpot;
  • Java体系结构:
    • java编程语言
    • Java Class文件格式
    • Java API
    • Java VM
  • java的执行流程:

    • .java: java的源代码
    • .class: java的类文件, 类文件必须遵循一定的规范,
      使得编译好的文件能在遵循规范的机器上运行, 最终都要在jvm上运行
    • java代码编译过程

      图片 1

    1. 首先 *.java 源码经过预先编译后, 会变为 *.class 文件。
    2. *.class 文件运行如果需要调用其他的类文件,比如上图, 1.class,
      2.class就会加载进来一起运行。
    • jvm的核心组成部分:
    • Class Loader
    • 执行引擎

    • 如图

      图片 2

      1. Class Loader,
        类加载器先加载需要执行的程序类文件(需要预先编译好)和Java
        API的类文件。
      2. 执行引擎就在操作系统上执行Class Loader加载的类文件。
  • Java编程语言的特性:

    • 面向对象、多线程、结构化错误处理
    • 垃圾手机、动态链接、动态扩展
    • GC: 垃圾回收器, 主要面向堆内存空间中的垃圾回收
  • 三个技术流派
    • J2SE ==> Java 2 SE, java标准版
    • J2EE ==> Java 2 EE, java企业版
    • J2ME ==> Java 2 ME, java微缩版
  1. jdk 1.5包含的技术
  • 图片 3
  • Java Language: JAVA语言
  • Dewelopment Tools & APIs: 开发工具和API
    • java: java语言
    • javac: java语言编译器
    • javadoc:
      java文档,支持从程序源代码中抽取类、方法、成员等注释形成一个和源代码配套的API帮助文档。
    • apt: 源代码文件进行检测找出其中的annotation后, 使用annotation
      processors来处理annotation。而annotation
      processors使用了一套反射API并具备对JSR175规范的支持。
    • jar: java归档命令
  • Deployment Technologles: 部署技术
    • Deployment, 冷部署
    • Java Web Start, 通过web页面部署
    • Java Plug-in, 通过java插件部署
  • User Interface Toolkits: 用户接口工具箱
  • Integration Libraries: 集成库
  • Other Base Libraries: 其他基本库
  • lang & util Base Libraries: 语言工具基本库
  • Java Virtual Machine: Java虚拟机
    • Java Hotspot Client Compiler
    • Java Hotspot Server Compiler
    • jvm支持混合模式, 既是客户端又是服务端
  • JDK与JRE
    • JDK包含jre, 但jre不包含JDK
    • JRE没有Java Language和Dewelopment Tools & APIs
    • JRE仅负责运行JAVA代码
    • JDK调试开发java代码
  1. JVM运行时区域, 运行为多线程
  • 图片 4
  • 方法区: 线程共享, 用于存储被虚拟机加载的类信息、变量、静态变量等;
    该方法区的变量是持久代的, 也就是随着进程的生命周期而结束。
  • 堆: java堆是jvm所管理的内存中最大的一部分, 也就是GC管理的主要区域;
    主流的算法都基于分代收集方式进行, 新生代和老年代, 线程共享;
  • Java栈:
    • 线程私有, 存放线程自己的局部变量等信息;
    • 线程私有, 生命周期与线程相同, 所以线程启动就自动为其创建一个栈,
      只不过虚拟机栈描述的是java方法执行内存模型,
      说白了就是每个方法被执行时, 都会给其创建一个栈针,
      用于存储线程自己的局部变量, 操作数, 动态连接, 方法出口等等;
  • PC寄存器(Program Counter Register)
    • PC寄存器也称程序计数器, 这段空间是一段非常小的内存空间,
      它的主要作用可以看作是当前线程所执行字节码行号的指示器。
      例如计算机执行任何一个程序时, 一段代码有N个指令,
      CPU取一条指令运行一条指令, 那么CPU必须有条指针是指向这条指令的,
      而这个指针就在CPU的寄存器中,
      里面保留了下一次我应该运行代码或指令所在内存空间的地址。这段空间就叫指针寄存器;
      对于java 而言, 它是运行在虚拟机上的,
      所以它需要自己组织一段内存空间,
      为每个线程在其jvm内部维持其程序计数器。所以说程序计数器是每个线程都独占的。
    • 它是一个很小的内存空间,
      里面保留了当前线程已经运行到的指针的行号(或者下一行)。
    • 线程独占的内存空间。
  • 本地方法栈: 用于在哪个主机上实行的特有方法的,
    所以具体的方法是依赖于平台的。
  • 每个线程都有自己独占的部分, 和共享的部分。
  1. JAVA 2 EE包含:
  • JAVA 2 SE
  • Servlet、JSP、EJB、JMS、JMX、JavaMail
    • Servlet: 用在server端的应用程序,
      可以通过CGI协议或其他协议与前端进行数据交互。
  • Servlet Contaier工作方式: Servlet容器, Servlet是一个类
    • println(‘<\h1>’)
    • html标签要硬编码在应用程序中; 后来出现jsp,
      jsp就简化了程序员要硬编码html的问题。
  • JSP的工作方式:

    <html>
    <body>
      <h1> .. </h1>
    <%
      内部java代码
    %>
    </body>
    </html>
    
    # jsp工作在Servlet的前端, 这样程序员在调用Servlet的时候就不用自己硬编码写html了。
    # jsp能让java代码内嵌在html中
    
  • JDK只提供了java 2 SE的标准实现

  • Web Container: 由三部分构成
    • JDK
    • Servlet
    • JSP
    • 其中Servlet和jsp是一种规范, JDK是SUM开源。
  • Web Container的实现
    • 实现: 就是将JDK、Servlet, JSP组织在一起
    • 商业实现:
    • WebSphere: IBM 企业级EE容器
    • WebLogic: (BEA –> Oracle)
    • Oc4j
    • Glassfish
    • Geronimo
    • JOnAS
    • JBoss
    • 开源实现
    • tomcat
    • jetty
    • resin
  • 三种开源实现的对比

    • 对比的版本tomcat 7, Jetty 7, Resin 3.1 – Compiler
    • tomcat:
    1. 可以做为独立的服务器运行。内置web server
    2. 支持远程部署及管理。
    3. 完全开源
    4. 编译所有Jsp, 大约需要8s左右。
    • jetty: 轻量级web容器
    • resin: 高性能J2EE Application server
    • 可以拿来学习或做开源项目可以, 但不允许做商业项目
  1. 开源JDK:
  2. Apache Harmony(2011年10月已经停止开发)
  3. OpenJDK
我觉得不用讲太基础的语法,基础语法大家自己去看,主要讲讲java web开发的一个流程,从开始写代码,到编译,发布,上线,回滚整个流程
大体上的环节,以及需要用到哪些工具
具体咋用…
还有java的东西太多了,什么j2ee j2me,什么tomcat, resin啥的,都是什么关系,我是搞不懂

 

 

看来上一篇写的讲的时候是用不上了。但是《极限编程》里提到的四个价值:沟通,简单,反馈和勇气。如果我不先写出一个样子来,客户自己可能也没有什么清晰的概念。我们必须敢于丢弃代码。编码和写作,在修改中走向成熟。

 

J2SE,J2ME,J2EE的2本来是指Java1.2以后的版本,因为这个版本有个质的飞越,其中包括双亲委派模型。但是大家现在基本都不知道2之前的版本长成什么样子,所以现在这三个方向已经改名为Java SE, Java ME, Java EE了。这其实是三个标准,我说我实现了J2SE就意味着我可以用J2SE的组件进行java程序的开发了。JAVA这些平台是java可伸缩性的一个提现。

Java SE

Java Standard Edition 标准版

主要用于桌面程序,控制台开发(JFC
Java foundation classes)。我理解就是由Java自己的组件去画出界面。AWT(Abstract Window Tookit),
Swing这些都是java用于画出图形界面的类库。做出来界面长成这种样子。也有界面长的好看的。比如说:eclipse。咱们用的这个集成开发环境就是Java
SE开发的。

 图片 5

 

Java ME

Java Micro Edition 微缩版

主要用于早期的手机,机顶盒。Java
SE是基础,将它精简一点,再增加一些为运行在资源非常有限的设备而专有的类。最初设计它是为各个厂商提供一个标准,各个厂商要用自己的方案支持Java ME。那么大家只要有Java ME就可以为厂商的产品开发java程序了。现在安卓出现之后,大家基本都在用Android SDK了。这个就过时了。

 图片 6

Java EE

Java Enterprise Edition 企业版

这是一组技术规范与指南。我们现在常说的SSH架构(struts+spring+hibernate)就是符合J2EE规范的。虽然咱们实际上用的不完全是这几种技术,架构核心是一样,就是说:咱们是做J2EE的。

 

Web容器

Tomcat, Resin, Jetty都是WEB容器,前几年JBoss,WebSphere,WebLogic也流行过来着。相当于PHP Web Server。想要完成的工作都差不多,实现上有不同。

 

 图片 7

图片 8

 

提Web容器就不得不从Servlet说起。Servlet是用Java编写的服务器端程序。主要功能是交互式的浏览和修改数据,生成动态Web内容。其实Servlet是可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。

这么说是不是比较抽象?从程序的角度说:Servlet是一个在javax.servlet包里定义的接口。它为Servlet的生命周期声明了三个基本方法:init(), service()和destroy()。每个Servlet都要事先这些方法并在他们的生命周期的特定时间由服务器来调用这些方法。

这么说是不是还是比较抽象?其实对于java出身的童鞋我会直接奉上下面两张图:

 图片 9

图片 10

 

简单来说:我们只需要关心业务逻辑的开发,不需要关心请求过来是怎么传到我们开发的类里的,这件事儿是servlet做的。PHP童鞋说:servlet是http协议的java实现库,也有道理。

 

那Web容器简单的说就是servlet的包装和实现。运行了web容器,一行代码不用写就可以通过http协议访问页面了。Tomcat, Resin, Jetty的区别简单来说就是实现方式不同,结果支持的并发数,响应请求速度都受影响。就好像三个java工程师A,B,C。来一个新需求,找谁都能做,但可能A干的比较快而已。

 

开发流程:

java web开发的流程,从开始写代码,到编译,发布。一个Eclipse就搞定。要放到线上环境:编译,发布,上线,回滚。这个一个Jenkins就搞定。

怎么写代码还是麻烦看看上一篇。编译是保存时自动执行的。因为eclipse都是默认勾选了自动build选项。

 图片 11

 

Debug或者是直接运行只要点击工程,右键Debug As –> Run with Jetty或者Run As –> Run with Jetty就OK了。

 图片 12

 

这个动手实验一下马上就能明白,关键先下载一个eclipse,官网上建议选择下图框中的版本。因为咱们做的是Java EE。这里面的插件会比较全,不然还要自己下载插件。下载下来eclipse把工程导进去,直接就可以运行哒。

 图片 13

 

PHP童鞋反馈说他们习惯人工打印调试,所以将java用命令行的方式来描述更好理解些:

  编译: javac命令 比如运行 javac HelloWorld.java
就会在目录下生成一个HelloWord.class文件,.class文件也叫字节码文件。这就是编译成功了。

     运行:  java命令  比如运行 java HelloWord.class
控制台上就会显示执行结果。

     在resin容器中运行的linux命令:

图片 14

  从上面看到只是用java启动了一个resin(resin.jar是一个.class文件集合的压缩包,里面有包含目录结构的说明文件,java会根据那个文件去找)。

   
 所有我们写的代码都将编译好的.class文件还有需要的类库文件,配置文件,JSP文件等等放在一个目录下。

图片 15

 

然后将这个文件路径配置到Resin配置文件里。

 图片 16

启动就可以了。

 

Jenkins嘛,运行一下就好了,一看就明白。

相关文章