Java
应该怎么学?
Java
能做什么?什么是
Applet
?什么是
Servlet
、
Jsp
、
EJB
还有
Webspere
、
Weblogic
又是做什么的等等。之所以学员会有这些疑问,是因为大家普遍对
Java
相关概念听说的太多而了解的又相对少的缘故。
学通 Java 语言需要一个过程,所有 Java 相关的概念都会在学习的过程中逐渐变得清昕。这个过程的开始就是要先学会标准的 Java 技术 (J2SE) ,然后是学 Java 的简单 Web 运用,然后分布式运用 , 再以后对 Java 的移动技术运用就很容易理解了。
以下是 Java 标准技术的一些要点:
一、 Java 的跨平台性,即一次编译到处运行
简单地说 Java 的跨平台性就是指,编译后的 Java 程序可直接在不同的平台上运行而不用重新编译,这一特性使得 Java 随着 Web 应用的普及而迅速普及起来。而 Java 的跨平台性是如何实现的呢?这就要理解 Java 虚拟机和字节码的概念。
实际上,编译后的 Java 代码并不是传统的二进制代码(如 Windows 下的 .exe 文件),而是 Java 字节码,这种字节码文件是不能直接在操作系统上执行的。要想在一个操作系统上运行一个 Java 程序必须有一个中间环节来负责将 Java 字节码解释成二进制码,这个中间环节就是 Java 虚拟机(简称 JVM) 。由于目前大多数操作系统已经实现了 JVM ,所以 Java 轻松实现跨平台性。
二、面象对象技术
Java 全面支持面象对象技术,这体现在 Class (类)是 Java 程序构成的基本单元,一个 Java 程序通常由许多 Class 组成,而且这些 Class 还会有一定的继承关系, Java 支持 Class 的单继承,从而使类之间的继承关系更明确。继承的结果产生类的多态性,类的多态本质上讲就是可以用父类的引用访问继承类的实现(子类对象),类的这种多态性最终形成了组件对象模型的基础,即通过接口(父类)访问实现(子类)。
三、 Java 中的 I/O 操作
Java 中以字节流( InputStream 和 OutputStream) 、节符流( Reader 和 Writer) 来分别读写二进制数据和字符数据,使用非常简单有效。 Java 类库中的 File 类不仅提供文件操作而且还包含文件夹操作,如下面这几行代码可以列出 C 盘根目录下的所有文件:
File f=new File("c://");
String [] m_dir= f.list();
for(int i=0;i<m_dir.length;i++)
System.out.println(m_dir[i]);
四、 Java 中的图形及事件处理
可以用 awt 包或 swing 包的 Java 类来进行大部分的 Java 图形界面设计,下面的几行代码将产生一个 200*200 像素的窗体:
Frame f=new Frame("Welcome");
f.setSize(200,200);
f.setVisible(true);
默认情况下, Frame 窗体的关闭按钮不起作用,这也是 Java 初学者迷惑的地方。为了使用户按下关闭按钮时能关闭 Frame 窗体,需要让这个窗体响应一个 WindowEvent 事件,具体的做法就是给这个窗体添加一个事件监听器对象,这个事件监听器就是 WindowListener 接口的实现。在上面的代码中插入如下代码就可以关闭窗体:
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
这里用到一个无名内部类,无名内部类是 Java 中内部类的一种灵活运用方式。
五、 Java 中线程及同步控制
线程概念的引入是为了实现并行处理,从而提高程序的效率。 Java 中的线程实现非常简单,可以用两种方式来创建线程,一种是实现 Runnable 接口,另一种是继承 Thread 类重写 run() 方法。两种方式唯一的不同就是前者保留了继承一个类的可能(因为 Java 只支持类的单继承,但接口没有此限制)。
永远都用 start() 方法来启动一个线程,线程类中的 run() 可以被直接调用,但决不是启动一个线程,二者有着本质的区别。
用同步控制关键字 synchronized 来保护线程敏感数据, synchronized 块中的内容可以保证同一时刻只能被一个线程访问,所以其中的数据是线程安全的。
用 Object 类中的 wait() 和 notify() 方法可以实现线程间交互,但要记住 wait() 和 notify() 方法只有发生在同一个对象上才能真正实现线程间交互。被某一对象 wait() 方法阻塞的线程需要另外一个调用了同一对象 notify() 的线程干预才能恢复运行。 notify() 方法一次唤醒一个被 wait() 方法阻塞的线程, notifyAll() 方法可以一次唤醒所有被 wait() 方法阻塞的线程。
六、 Java 本地方法( native 方法)的实现
Java 不是完美的, Java 的不足除了体现在运行速度上要比传统的 C++ 慢许多之外, Java 无法直接访问到操作系统底层(如系统硬件等 ) ,为此 Java 使用 native 方法来扩展 Java 程序的功能。
可以将 native 方法比作 Java 程序同C程序的接口,其实现步骤:
1、在 Java 中声明 native() 方法,然后编译;
2、用 javah 产生一个 .h 文件;
3、写一个 .cpp 文件实现 native 导出方法,其中需要包含第二步产生的 .h 文件(注意其中又包含了 JDK 带的 jni.h 文件);
4、将第三步的 .cpp 文件编译成动态链接库文件;
5、在 Java 中用 System.loadLibrary() 方法加载第四步产生的动态链接库文件,这个 native() 方法就可以在 Java 中被访问了。
上述所提及的一些 Java 技术具有一定的普遍性,它们基本上是在 Java 各个方面的运用中都需要掌握的术。实际上 Java 的运用非常广泛,而且每个方面都需要遵循不同的规范。以下是对 Java 应用的简要介绍。
(一)理解 Java SDK 的三个版本:
Java SDK Micro Edition (J2ME)
用于开发掌上电脑、手机等移动通信设备上使用的应用程序。并不是所有的移动设备都支持 Java ,只有具备 J2ME 运行环境( JVM+J2ME API) 的设备才能运行 Java 程序。 J2ME 的集成开发工具(通常都有带有一些访真器)有 Sun 的 J2ME Wireless Toolkit 、 IBM 的 Visul Age Micro Edition 等。
Java SDK Standard Edition ( J2SE)
主要用于开发一般台式机应用程序。我们平时所说的 JDK 就指 J2SE ,而我们学 Java 就是从学习 J2SE 开始的。
Java SDK Enterprise Edition (J2EE)
用于开发分布式的企业级大型应用程序。其中的核心是 Entetprise Java Beans ( EJB ,分布式 Java 组件)的开发。
(二) Java 小程序 ( Applet)
Java 小程序是一个继承了 Applet 类并重写了 init() 、 paint() 、 stop() 等方法的的 Java 类,它被布署在 Web 服务器(如 IIS )上,当客户端请求 Web 页时,浏览器从 Web 服务器上将其下载到本地客户端,然后,浏览器创建该 Applet 类的实例并调用其 init() 方法,从安全角度考虑, Applet 没有访问本地文件的权限。由于 Applet 是被浏览器执行的,所以 Applet 不需要一个 main() 方法。实际上,除了 Java Application 之外,所有其它 Java 应用都不需要一个 main() 方法。
(三)服务器端 Java 小程序 ( Servlet )
Servlet 也是一个 Java 类,和 Applet 形成对比, Servlet 是运行于服务器端的 Java 小程序,而且 Servlet 需要一个单独的 Web 服务器(如 Tomcat )做容器。除此之外, Servlet 中用到的一些类(如 HttpServlet) 并不包含在 J2SE API 中,所以需要将 Servlet.jar (在 Tomcat 的 common/lib 文件夹下)加到环境变量中去。下面是一个简单的 Servlet 例子:
public class Myservlet extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response)
{
try{
response.setContentType("text/html");
PrintWriter out=response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("Hello world");
out.println("</body>");
out.println("</html>");
}catch(IOException e){}
}
}
将这个 Class 文件编译后放至 Tomcat/webapps/examples/WEB-INF/classes 下,然后在浏览器地址栏里输入 http://127.0.0.1:8080/examples/servlet/Myservlet 即可看到 Hello world 出现在浏览器中。
(四) Java Server Page ( JSP )
同 Servlet 相似的是, JSP 运行于 Web 服务器端,并且也需要 Tomcat 之类的容器。不同的是,由于 JSP 是将 Java 代码嵌在 html 标记里(同 ASP 一样用 <% ...%>) , JSP 的界面设计同后台开发人员的工作可以有效分离。可以想像让开发人员用 Servlet 写一个花捎的 Web 页面有多困难,所以 JSP+Servlet 混合 Web 应用是比较理想的选择。
看起来 JSP 同 ASP 的实现机制大同小异,其实也存在着本质的区别。所有的 ASP 页面都是解释运行的,而 JSP 页在第一次被请求时会被编译,再以后的客户请求都是直接运行服务器上的 .class 文件(在 Tomcat 的 Work 文件夹下),所以 JSP 要比 ASP 速度上快许多。
(五) Java Beans
Java Bean 是可复用的组件,对 Java Bean 并没有严格的规范,理论上讲,任何一个 Java 类都可以是一个 Bean 。但通常情况下,由于 Java Bean 是被容器所创建(如 Tomcat) 的,所以 Java Bean 应具有一个无参的构造器,另外,通常 Java Bean 还要实现 Serializable 接口用于实现 Bean 的持久性。
(六) Enterprise Java Beans ( EJB )
Java Bean 实际上相当于微软 COM 模型中的本地进程内 COM 组件,它是不能被跨进程访问的。 Enterprise Java Bean 相当于 DCOM ,即分布式组件。它是基于 Java 的远程方法调用( RMI )技术的,所以 EJB 可以被远程访问(跨进程、跨计算机)。但 EJB 必须被布署在诸如 Webspere 、 WebLogic 这样的容器中, EJB 客户从不直接访问真正的 EJB 组件,而是通过其容器访问。 EJB 容器是 EJB 组件的代理, EJB 组件由容器所创建和管理。客户通过容器来访问真正的 EJB 组件。
这种模型很像 COM+ 管理器,其实 EJB 容器正是起到 COM+ 管理器的作用,只是 EJB 组件相对 COM 组件来说更易用、更安全。
总的说来, Java 作为面象对象技术的一个代表,在当今商业应用中更容易开发出高效的、多层的分布式应用程序,而且,由于 Java 技术有很强的健壮性和易用性,加上同 UML 应用的结合,开发一个商业应用软件的周期会大大缩短,所以 Java 会有不错的前景。
学通 Java 语言需要一个过程,所有 Java 相关的概念都会在学习的过程中逐渐变得清昕。这个过程的开始就是要先学会标准的 Java 技术 (J2SE) ,然后是学 Java 的简单 Web 运用,然后分布式运用 , 再以后对 Java 的移动技术运用就很容易理解了。
以下是 Java 标准技术的一些要点:
一、 Java 的跨平台性,即一次编译到处运行
简单地说 Java 的跨平台性就是指,编译后的 Java 程序可直接在不同的平台上运行而不用重新编译,这一特性使得 Java 随着 Web 应用的普及而迅速普及起来。而 Java 的跨平台性是如何实现的呢?这就要理解 Java 虚拟机和字节码的概念。
实际上,编译后的 Java 代码并不是传统的二进制代码(如 Windows 下的 .exe 文件),而是 Java 字节码,这种字节码文件是不能直接在操作系统上执行的。要想在一个操作系统上运行一个 Java 程序必须有一个中间环节来负责将 Java 字节码解释成二进制码,这个中间环节就是 Java 虚拟机(简称 JVM) 。由于目前大多数操作系统已经实现了 JVM ,所以 Java 轻松实现跨平台性。
二、面象对象技术
Java 全面支持面象对象技术,这体现在 Class (类)是 Java 程序构成的基本单元,一个 Java 程序通常由许多 Class 组成,而且这些 Class 还会有一定的继承关系, Java 支持 Class 的单继承,从而使类之间的继承关系更明确。继承的结果产生类的多态性,类的多态本质上讲就是可以用父类的引用访问继承类的实现(子类对象),类的这种多态性最终形成了组件对象模型的基础,即通过接口(父类)访问实现(子类)。
三、 Java 中的 I/O 操作
Java 中以字节流( InputStream 和 OutputStream) 、节符流( Reader 和 Writer) 来分别读写二进制数据和字符数据,使用非常简单有效。 Java 类库中的 File 类不仅提供文件操作而且还包含文件夹操作,如下面这几行代码可以列出 C 盘根目录下的所有文件:
File f=new File("c://");
String [] m_dir= f.list();
for(int i=0;i<m_dir.length;i++)
System.out.println(m_dir[i]);
四、 Java 中的图形及事件处理
可以用 awt 包或 swing 包的 Java 类来进行大部分的 Java 图形界面设计,下面的几行代码将产生一个 200*200 像素的窗体:
Frame f=new Frame("Welcome");
f.setSize(200,200);
f.setVisible(true);
默认情况下, Frame 窗体的关闭按钮不起作用,这也是 Java 初学者迷惑的地方。为了使用户按下关闭按钮时能关闭 Frame 窗体,需要让这个窗体响应一个 WindowEvent 事件,具体的做法就是给这个窗体添加一个事件监听器对象,这个事件监听器就是 WindowListener 接口的实现。在上面的代码中插入如下代码就可以关闭窗体:
f.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
这里用到一个无名内部类,无名内部类是 Java 中内部类的一种灵活运用方式。
五、 Java 中线程及同步控制
线程概念的引入是为了实现并行处理,从而提高程序的效率。 Java 中的线程实现非常简单,可以用两种方式来创建线程,一种是实现 Runnable 接口,另一种是继承 Thread 类重写 run() 方法。两种方式唯一的不同就是前者保留了继承一个类的可能(因为 Java 只支持类的单继承,但接口没有此限制)。
永远都用 start() 方法来启动一个线程,线程类中的 run() 可以被直接调用,但决不是启动一个线程,二者有着本质的区别。
用同步控制关键字 synchronized 来保护线程敏感数据, synchronized 块中的内容可以保证同一时刻只能被一个线程访问,所以其中的数据是线程安全的。
用 Object 类中的 wait() 和 notify() 方法可以实现线程间交互,但要记住 wait() 和 notify() 方法只有发生在同一个对象上才能真正实现线程间交互。被某一对象 wait() 方法阻塞的线程需要另外一个调用了同一对象 notify() 的线程干预才能恢复运行。 notify() 方法一次唤醒一个被 wait() 方法阻塞的线程, notifyAll() 方法可以一次唤醒所有被 wait() 方法阻塞的线程。
六、 Java 本地方法( native 方法)的实现
Java 不是完美的, Java 的不足除了体现在运行速度上要比传统的 C++ 慢许多之外, Java 无法直接访问到操作系统底层(如系统硬件等 ) ,为此 Java 使用 native 方法来扩展 Java 程序的功能。
可以将 native 方法比作 Java 程序同C程序的接口,其实现步骤:
1、在 Java 中声明 native() 方法,然后编译;
2、用 javah 产生一个 .h 文件;
3、写一个 .cpp 文件实现 native 导出方法,其中需要包含第二步产生的 .h 文件(注意其中又包含了 JDK 带的 jni.h 文件);
4、将第三步的 .cpp 文件编译成动态链接库文件;
5、在 Java 中用 System.loadLibrary() 方法加载第四步产生的动态链接库文件,这个 native() 方法就可以在 Java 中被访问了。
上述所提及的一些 Java 技术具有一定的普遍性,它们基本上是在 Java 各个方面的运用中都需要掌握的术。实际上 Java 的运用非常广泛,而且每个方面都需要遵循不同的规范。以下是对 Java 应用的简要介绍。
(一)理解 Java SDK 的三个版本:
Java SDK Micro Edition (J2ME)
用于开发掌上电脑、手机等移动通信设备上使用的应用程序。并不是所有的移动设备都支持 Java ,只有具备 J2ME 运行环境( JVM+J2ME API) 的设备才能运行 Java 程序。 J2ME 的集成开发工具(通常都有带有一些访真器)有 Sun 的 J2ME Wireless Toolkit 、 IBM 的 Visul Age Micro Edition 等。
Java SDK Standard Edition ( J2SE)
主要用于开发一般台式机应用程序。我们平时所说的 JDK 就指 J2SE ,而我们学 Java 就是从学习 J2SE 开始的。
Java SDK Enterprise Edition (J2EE)
用于开发分布式的企业级大型应用程序。其中的核心是 Entetprise Java Beans ( EJB ,分布式 Java 组件)的开发。
(二) Java 小程序 ( Applet)
Java 小程序是一个继承了 Applet 类并重写了 init() 、 paint() 、 stop() 等方法的的 Java 类,它被布署在 Web 服务器(如 IIS )上,当客户端请求 Web 页时,浏览器从 Web 服务器上将其下载到本地客户端,然后,浏览器创建该 Applet 类的实例并调用其 init() 方法,从安全角度考虑, Applet 没有访问本地文件的权限。由于 Applet 是被浏览器执行的,所以 Applet 不需要一个 main() 方法。实际上,除了 Java Application 之外,所有其它 Java 应用都不需要一个 main() 方法。
(三)服务器端 Java 小程序 ( Servlet )
Servlet 也是一个 Java 类,和 Applet 形成对比, Servlet 是运行于服务器端的 Java 小程序,而且 Servlet 需要一个单独的 Web 服务器(如 Tomcat )做容器。除此之外, Servlet 中用到的一些类(如 HttpServlet) 并不包含在 J2SE API 中,所以需要将 Servlet.jar (在 Tomcat 的 common/lib 文件夹下)加到环境变量中去。下面是一个简单的 Servlet 例子:
public class Myservlet extends HttpServlet{
public void doGet(HttpServletRequest request,HttpServletResponse response)
{
try{
response.setContentType("text/html");
PrintWriter out=response.getWriter();
out.println("<html>");
out.println("<body>");
out.println("Hello world");
out.println("</body>");
out.println("</html>");
}catch(IOException e){}
}
}
将这个 Class 文件编译后放至 Tomcat/webapps/examples/WEB-INF/classes 下,然后在浏览器地址栏里输入 http://127.0.0.1:8080/examples/servlet/Myservlet 即可看到 Hello world 出现在浏览器中。
(四) Java Server Page ( JSP )
同 Servlet 相似的是, JSP 运行于 Web 服务器端,并且也需要 Tomcat 之类的容器。不同的是,由于 JSP 是将 Java 代码嵌在 html 标记里(同 ASP 一样用 <% ...%>) , JSP 的界面设计同后台开发人员的工作可以有效分离。可以想像让开发人员用 Servlet 写一个花捎的 Web 页面有多困难,所以 JSP+Servlet 混合 Web 应用是比较理想的选择。
看起来 JSP 同 ASP 的实现机制大同小异,其实也存在着本质的区别。所有的 ASP 页面都是解释运行的,而 JSP 页在第一次被请求时会被编译,再以后的客户请求都是直接运行服务器上的 .class 文件(在 Tomcat 的 Work 文件夹下),所以 JSP 要比 ASP 速度上快许多。
(五) Java Beans
Java Bean 是可复用的组件,对 Java Bean 并没有严格的规范,理论上讲,任何一个 Java 类都可以是一个 Bean 。但通常情况下,由于 Java Bean 是被容器所创建(如 Tomcat) 的,所以 Java Bean 应具有一个无参的构造器,另外,通常 Java Bean 还要实现 Serializable 接口用于实现 Bean 的持久性。
(六) Enterprise Java Beans ( EJB )
Java Bean 实际上相当于微软 COM 模型中的本地进程内 COM 组件,它是不能被跨进程访问的。 Enterprise Java Bean 相当于 DCOM ,即分布式组件。它是基于 Java 的远程方法调用( RMI )技术的,所以 EJB 可以被远程访问(跨进程、跨计算机)。但 EJB 必须被布署在诸如 Webspere 、 WebLogic 这样的容器中, EJB 客户从不直接访问真正的 EJB 组件,而是通过其容器访问。 EJB 容器是 EJB 组件的代理, EJB 组件由容器所创建和管理。客户通过容器来访问真正的 EJB 组件。
这种模型很像 COM+ 管理器,其实 EJB 容器正是起到 COM+ 管理器的作用,只是 EJB 组件相对 COM 组件来说更易用、更安全。
总的说来, Java 作为面象对象技术的一个代表,在当今商业应用中更容易开发出高效的、多层的分布式应用程序,而且,由于 Java 技术有很强的健壮性和易用性,加上同 UML 应用的结合,开发一个商业应用软件的周期会大大缩短,所以 Java 会有不错的前景。