搜档网
当前位置:搜档网 › Tomcat 和Websphere类加载机制

Tomcat 和Websphere类加载机制

Tomcat 和Websphere类加载机制
Tomcat 和Websphere类加载机制

Tomcat 和Websphere类加载机制

1基本信息

摘要:分别介绍Tomcat和Webshpher类加载机制。

作者:戴小丹林晓咏

2Tomcat类加载机制

Tomcat Server在启动的时候将构造一个ClassLoader树,以保证模块的类库是私有的

Tomcat Server的ClassLoader结构图如下:

- Bootstrap - 载入JVM自带的类和/jre/lib/ext/*.jar

- System - 载入/*.class

- Common - 载入/common/...,它们对TOMCAT和所有的WEB APP都可见

- Catalina - 载入/server/...,它们仅对TOMCAT可见,对所有的WEB APP 都不可见

- Shared - 载入/shared/...,它们仅对所有WEB APP可见,对TOMCAT不可见(也不必见)

- WebApp - 载入ContextBase?/WEB-INF/...,它们仅对该WEB APP可见

每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类,系统默认的 contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、

$ JAVA_HOME/jre/lib/ext/中的类和/中的类,可以使用

Thread.currentThread(). setContextClassLoader(...);更改当前线程的contextClassLoader,来改变其载入类的行为ClassLoader被组织成树形,一般的工作原理是:

1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类

2) contextClassLoader请求它的父ClassLoader来完成该载入请求

3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入3Websphere类加载机制

Java应用程序运行时,在class执行和被访问之前,它必须通过类加载器加载使之有效,类加载器是JVM代码的一部分,负责在JVM虚拟机中查找和加载所有的Java 类和本地的lib库。类加载器的不同配置影响到应用程序部署到应用程序服务器上运行时的行为。JVM和WebSphere应用程序服务器提供了多种不同的类加载器配置,形成一个具有父子关系的分层结构。

WebSphere中类加载器的层次结构图1所示:

如上图所示,WebSphere中类加载器被组织成一个自上而下的层次结构,最上层是系统的运行环境JVM,最下层是具体的应用程序,上下层之间形成父子关系。

JVM Class loader:位于整个层次结构的最上层,它是整个类加载器层次结构的根,因此它没有父类加载器。这个类加载器负责加载JVM类,JVM 扩展类,以及定义在

classpath 环境变量上的所有的Java类。

?WebSphere Extensions Class loader:WebSphere 扩展类加载器, 它将加载WebSphere的一些runtime 类,资源适配器类等。

?WebSphere lib/app Class loader:WebSphere服务器类加载器,它将加载WebSphere 安装目录下$(WAS_HOME)/lib/app路径上的类。在WAS v4版本中,WAS使用这个路径在所有的应用程序之间共享jar包。从WAS v5开始,共享库功能提供了一种更好的方式,因此,这个类加载器主要用于一些原有的系统的兼容。

?WebSphere "server" Class loader:WebSphere应用服务器类加载器。它定义在这个服务器上的所有的应用程序之间共享的类。WAS v5中有了共享库的概念之后,可以为应用服务器定义多个与共享库相关联的类加载器,他们按照定义的先后顺序形成父子关系。

?Application Module Class Loader:应用程序类加载器,位于层次结构的最后一层,用于加载J2EE应用程序。根据应用程序的类加载策略的不同,还可以为Web模块定义自己的类加载器。

关于WebSphere的类加载器的层次结构,以下的几点说明可能更有助于进一步的理解类的查找和加载过程:

?每个类加载器负责在自身定义的类路径上进行查找和加载类。

?一个子类加载器能够委托它的父类加载器查找和加载类,一个加载类的请求会从子类加载器发送到父类加载器,但是从来不会从父类加载器发送到子类加载器。

?一旦一个类被成功加载,JVM 会缓存这个类直至其生命周期结束,并把它和相应的类加载器关联在一起,这意味着不同的类加载器可以加载相同名字的类。

?如果一个加载的类依赖于另一个或一些类,那么这些被依赖的类必须存在于这个类的类加载器查找路径上,或者父类加载器查找路径上。

如果一个类加载器以及它所有的父类加载器都无法找到所需的类,系统就会抛出ClassNotFoundExecption异常或者NoClassDefFoundError的错误。

类加载器的委托模式

类加载器有一个重要的属性:委托模式(Delegation Mode,有时也称为加载方式:Classloader mode)。委托模式决定了类加载器在查找一个类的时候,是先查找类加载器自身指定的类路径还是先查找父类加载器上的类路径。

类加载器的委托模式有两个取值:

?Parent_First:在加载类的时候,在从类加载器自身的类路径上查找加载类之前,首先尝试在父类加载器的类路径上查找和加载类。

?Parent_Last:在加载类的时候,首先尝试从自己的类路径上查找加载类,在找不到的情况下,再尝试父类加载器类路径。

有了委托模式的概念,我们可以更加灵活的配置在类加载器的层次结构中类的加载和查找方式。表1中给出了在WebSphere的类加载器层次结构中各个类加载器的委托模式的定义,并给出了不同的类加载器内类的生命周期。

注意:在上表中,"JVM Class loader" 因为在类加载器的最顶层,它没有父类加载器,因此其委托模式为N/A,"WebSphere Extensions Class loader"和"WebSphere lib/app Class loader"的委托模式固定为表中的取值,不可配置,其它的类加载器的委托模式都是可以配置的。

WebSphere中的类加载器策略

WebSphere中对类加载器有一些相关的配置,称为类加载器策略(class loader policy)。类加载器策略指类加载器的独立策略(class loader isolation policy),通过类加载器策略设置,我们可以为WAS和应用程序的类加载器进行独立定义。

每个WAS可以配置自己的应用程序类加载器策略,WAS中的每个应用程序也可以配置自己的Web模块类加载器策略,下面我们对这两种策略分别介绍。

1.应用服务器(WAS)配置:应用程序类加载器策略

应用服务器对应用程序类加载器策略有两种配置:

?Single:整个应用服务器上的所有应用程序使用同一个类加载器。在这种配置下,每个应用程序不再有自己的类加载器。

?Multiple:应用服务器上的每个应用程序使用自己的类加载器。

2.应用程序配置:Web模块类加载器策略

应用程序中对Web模块类加载器有两种配置:

?Application:整个应用程序内的所有的实用程序jar包和Web模块使用同一个类加载器。

?Module:应用程序内的每个Web模块使用自己的类加载器。应用程序的类加载器仍然存在,负责加载应用程序中Web模块以外的其它类,包括所有的实用程序jar包。

从上面的定义可以看出,不同的类加载器策略的配置下,类加载器的层次结构上的某些类加载器可能不存在。比如在应用程序服务器的应用程序类加载器策略定义为single的情况下,应用程序的类加载器将不存在,同一个应用服务器上的所有应用程序将共用同一个类加载器,这也就意味着不同的应用程序之间的类是共享的,应用程序间不能存在同名的类。

4Jboss启动及加载过程

详细参考:https://www.sodocs.net/doc/a77031357.html,/j/2007-06-27/200706271521984.shtml

1) org.jboss.Main.main(String[]) 为入口.

2) main 函数创建一个名叫”jboss”的线程组, 然后创建一个属于该组

的线程, 在线程中执行boot方法.

3) boot 方法首先处理main函数中的参数(及一些其它的系统环境设

置), 接着就用系统的属性创建了org.jboss.system.server.ServerLoader 实例[new ServerLoader(props)].

4) ServerLoader 注册Jboss相关的类路径, 包括XML解析器,

jboss-jmx.jar, concurrent.jar及其它的一些额外的类路径.

5) ServerLoader 通过load(ClassLoader)方法创建Jboss Server实

例. 参数ClassLoader是ClassLoader parentCL =

Thread.currentThread(). getContextClassLoader( )得到的当前线程的类加载器. 创建的Server实例是org.jboss.system.server.Server接口的实现. load(ClassLoader)方法的细节:

用jar包及在ServerLoader中注册的类路径创建一个URLClassLoader的实例, 把传入的ClassLoader作为该URLClassLoader的parent.

Server 接口的实现类由系统属性 jboss.server.type决定, 默认是org.jboss.system.server.ServerImpl.

URLClassLoader 通过无参构造函数加载Server接口实现的实例. 在加载前把当前线程的类加载器置为该URLClassLoader, 在加载完成后再

置回之前传入的ClassLoader.

6) Server 实例用系统属性进行初始化[server.init(props)].

7) 服务起动[server.start()]. 起动过程的默认实现如下:

把当前线程类型加载器置为加载该Server接口实现实例的ClassLoader.

在jboss域内, 通过MBeanServerFactory的createMBeanServer(String)方法创建MbeanServer实例.

在MBean Server上注册ServerImpl和ServerConfigImpl两个MBean.

初始化统一的类加载仓库(unified class loader repository), 用来装载服务器配置目录及其它可选目录下的jar文件. 对于每一个jar文件

和类目录都会创建一个相应的

org.jboss.jmx.loading.UnifiedClassLoader实例, 并且注册到统一

的仓库中. 其中一个UnifiedClassLoader实例会被设置为当前线程上

下文的ClassLoader. [?: This effectively makes

allUnifiedClassLoaders available through the thread context class loader.]

接下来创建org.jboss.system.ServiceController的MBean实例.

ServiceController管理JBoss MBean服务的生命周期.

Tomcat使用维护手册-河南

From: 编号: To: 版本号:1.1 Cc: 存档路径: Tomcat使用维护手册-河南 1现场tomcat的启动方法 1.1管理员页面启动方法 ●登录account1 ●su – blues ●su ●bash ●cd /home/soft/jakarta-tomcat-4.1.27/bin ●./shutdown.sh ●cd /home/soft/jakarta-tomcat-4.1.27/work ●rm -fr * ●等待2-3 ●/home/soft/jakarta-tomcat-4.1.27/bin/startup.sh访问: http://218.29.0.251/kuandai/index.jsp确认启动效果 1.2Enus自服务页面启动方法 ●登录account2 ●su – blues ●su ●bash ●cd /usr/local/tomcat/bin ●./shutdown.sh ●cd /usr/local/tomcat/work ●rm -fr * ●等待2-3分钟 ●/usr/local/tomcat/bin/startup.sh 访问:http://218.29.0.252:8080/kuandai/self.jsp确认启动效果

1.3统计的页面的启动方法 ●登录account1 ●su - stat ●cd /opt/stat/stattomcat/jakarta-tomcat-4.0.3/bin ●./shutdown.sh ●cd /opt/stat/stattomcat/jakarta-tomcat-4.0.3/work ●rm -fr * ●等待2-3分钟 ●/opt/stat/stattomcat/jakarta-tomcat-4.0.3/bin/startup.sh 访问:http://218.29.0.251:8088/stat/index.jsp确认启动效果 1.4Cnus 自维护页面的启动方法 ●登录Fep12 ●su – cnus13 ●cd /home/cnus13/tomcat/bin ●./shutdown.sh ●cd /home/cnus13/tomcat/work ●rm -fr * ●等待2-3分钟(netstat –an|grep 80) ●/home/cnus13/tomcat/bin/./startup.sh 访问:https://www.sodocs.net/doc/a77031357.html,输入用户名,密码,确认Cnus工作状态。 1.5监控页面的启动方法 ●登录Fep3 ●su – root ●cd /usr/local/tomcatjk/bin ●./shutdown.sh ●cd /usr/local/tomcatjk/work ●rm -fr * ●等待2-3分钟 ●/usr/local/tomcatjk/bin/startup.sh 访问:http://218.29.0.229:7123/kuandai/login.jsp确认启动效果。

字节跳动面试经验分享(非常详细)

字节跳动面试官一招差点KO我,一共面试了3轮(5年经验),艰难拿下2-2职级offer! 前言 我从大学毕业开始做Android开发,现在已经五年时间了,现在在山东老家济南做Android开发。这三年里面,也只是一心在做Android开发,其他语言接触的并不多,了解点JS之类的。现在感觉Android开始不像以前那样好做了,也可能是现在年纪慢慢大了,要考虑的事情变多了的缘故吧。 不知道以后应该何去何从,总是感觉做Android或者说做程序员一直处在一种不稳定之中,在一些中小公司里面,可能工作一年两年就因为各种各样的原因而离职。马上就要结婚了,该买房了。济南的房价一直在涨,而自己的收入还是这么不温不火的,加上这不稳定的工作,让人对于前途实在是乐观不起来。 再加上今年的大环境非常差,互联网企业裁员的现象比往年更严重了,可今年刚好是我的第一个“五年计划”截止的时间点,说什么也不能够耽搁了,所以早早准备的跳槽也在疫情好转之后开始进行了。但是,不得不说,这次字节的面试真的太难为我了,可以说是和面试官大战了3个回合,不过好在最后给了offer。 我个人情况是5年Android开发经验,字节跳动定级2-2(年薪是50-100w左右含加班费和股票折现,不含车餐房补)的样子,我是拿到了年薪60w+,13薪。下面是我的面试经历,与学习经验分享,希望能带来一些不一样的启发和帮助。 我与字节跳动面试官“大战”3回合,胜! 我的学习经验 1—4年大学 ?Java

无论什么级别的Android从业者,Java作为Android开发基础语言。不管是工作还是面试中,Java都是必考题。如果不懂Java的话,薪酬会非常吃亏(美团尤为重视Java基础) 详细介绍了Java泛型、注解、并发编程、数据传输与序列化、高效IO、容器集合、反射与类加载以及JVM重点知识线程、内存模型、JVM运行时内存、垃圾回收与算法、Java中四种引用类型、GC 分代收集算法 VS 分区收集算法、GC 垃圾收集器、JAVA IO/NIO 、JVM 类加载机制的各大知识点。 ?筑基必备 Android架构师筑基包括哪些内容呢: 1.深入 Java 泛型. 2.解深入浅出 3.并发编程 4.数据传输与序列化 5.Java 虚拟机原理 6.反射与类加载 7.高效 IO 8.Kotlin项目实战 大学1-4年架构师筑基必备 ?学习笔记整理 架构师筑基必备目录 架构师筑基必备第一章

(完整版)Tomcat6操作手册

Tomcat6操作手册 安装tomcat软件(此处用到的是tomcat的ZIP包,直接解压即可) 我在D盘下创建一个名为App的文件夹,然后将tomcat的ZIP包解压到此文件夹下 在D:\App\apache-tomcat-6.0.20\conf的文件夹下有个名为server.xml的文件,这是tomcat 的配置文件,里面有说明此软件的服务端口等信息,这些端口都可以修改,不过不要与其他的软件端口冲突了 Tomcat服务关闭的端口:8005 服务访问的端口:8080,还要在下面加一句话:URIEncoding="utf-8" 防止出现乱码 以及ajp的整合端口(tomcat与iis或者apache整合):8009,而Tomcat默认的SSL端口号是8443

项目的存放位置,默认在tomcat安装目录下的webapps内,也可以放在其他盘符下,只要将路径改为所要存放项目的路径即可 Webapps文件夹存放网站项目,或者说是网页文件,而webapps\ROOT目录是项目主应用程序,也是http: ip :8080访问时的主程序,一般情况下将除了ROOT的其他目录都删除,因为其他的目录都是放实例的,无用 lib文件夹用于存放java包,后缀名:.jar

看完这些文件后,要将tomcat的服务启动,以便访问网页,因为不是用.exe的安装程序安装的tomcat,所以服务不会自动加到系统里,我们要手动加入系统内 一种方法:启动tomcat的服务,只需要双击startup.bat即可,当出现“信息: Server startup in 511 ms”时,证明服务已经启动,也可以访问tomcat的页面了,但是这个cmd 框不能关掉,关掉后服务关闭 另一种方法:将服务加到系统内。先要进入到D:\App\apache-tomcat-6.0.20\bin目录下,然后执行service.bat install tomcat的命令(用法是:service.bat install/remove [service_name]),就会将tomcat的服务加到系统服务内,服务名称为Apache Tomcat tomcat 启动服务

win8中tomcat8.0配置以及sts中启动的说明讲解

关于win8系统tomcat配置以及在sts中启动的说明1.下载tomcat(下载地址:https://https://www.sodocs.net/doc/a77031357.html,/) 本人下载的是tomcat8.0版本。 2.点击tomcat8.0进入下载选择界面 3.下载之后将下载的zip文件解压存放到某磁盘根目录下(也可放在其他位置,

但是路径中不要出现中文,本人放在D盘根目录下了) 4.由于是免安装的文件,因此下一步需要进行的就是配置环境变量(前提是在已经配置好jdk的情况下,配置jdk可以参考网上的教程) (1)右键点击我的电脑(这台电脑),点击属性出现如下界面 (2)点击上图中的高级系统设置进入下面界面,之后点击环境变量

(3)点击环境变量之后进入一下界面

(4)点击如图所示的新建按钮新建一个CATALINA_BASE变量,一个CATALINA_HOME 变量,变量值为tomcat文件夹的位置,本人的tomcat存放在D:\apache-tomcat-8.0.32

(5)选中PATH点击编辑,在变量值最后加上;%CATALINA_HOME%\bin;(如果原来在最后有”;”,则不用再%前加入”;”,若没有则需要加入,另外”;”必须为英文字符 (6)这样环境变量就测试完毕,接下来测试是否配置成功,使用快捷键windows+r 打开cmd,回车,之后输入startup回车,之后出现如下两图则表示配置成功。之后右键我的电脑(这台电脑)打开管理,找到服务,启动Apache Tomcat 8.0.32 Server之后打开浏览器输入Http://localhost:8080测试是否出现一下界面,若出现则成功(若出现问题则配置出现问题,或者之前有过tomcat残留文件,需要清空注册表重新配置)

Java程序是如何运行的

Java程序是如何运行的 JVM是Java的运行时虚拟机,所有的Java程序都是在JVM沙箱中运行,每个Java程序就是一个独立的JVM进程。 谈到Java程序是如何运行的,首先需要理解的肯定是JVM是如何运行的,什么是JVM;要理解我们编写的Java程序,运行起来以后到底是什么样子,本质上就是弄清楚JVM是什么样子。 Java程序的代码是什么样的 Java诞生之初最大的卖点就是编写的代码跨平台可移植性,实现这种可移植性,是因为Java通过平台特定的虚拟机,运行中间的字节码,而不是直接编译成本地二进制代码实现,中间字节码也就是java文件编译后生成的.class文件,Jar包的话,实际上只是一系列.class文件的集合。 编写Java程序,首先需要一个入口点,在运行的时候通过指定MainClass来指定入口点,代码层面主类必须实现一个静态的main函数,运行时虚拟机会从MainClass.main开始执行指令,其他的逻辑只是import和函数调用了。 SDK自带的javac命令,负责将我们编程的Java代码,也就是.java文件,编译成平台无关的字节码;字节码可以在任何操作系统平台上,通过平台对应的JVM执行;JVM执行的时候,运行字节码,根据自己的平台特性,将字节码转换成平台相关的二进制码运行。 javac编译器运行的过程大致分为:词法分析(Token流)、语法分析(语法树)、语义分析(注解语法树),还有代码生成器,根据注解语法树,生成字节码, 语义分析阶段,编译器会做一些操作,将人类友好的代码,做一些处理,转换成更符合机器执行机制的代码,例如全局变量,魔法变量,依赖注入,注解这些魔法机制。大致分为以下步骤: 1. 给类添加默认构造函数 2. 处理注解 3. 检查语义的合法性并进行逻辑判断 4. 数据流分析 5. 对语法树进行语义分析(变量自动转换并去掉语法糖) JVM是什么 JVM = 类加载器 classloader + 执行引擎 execution engine + 运行时数据区域 runtime data area JVM就是运行编译好字节码的虚拟机,不同的操作系统和平台上,虚拟机将平台无关的字节码,编译成特定平台的指令去执行。我觉得,JVM首先是一个独立运行在操作系统上的进程。执行java命

java类加载机制

Java类加载机制(一) 译:ayi 第一次翻译,翻译得不是很好,请多多指点 我的邮箱:nonopo12345@https://www.sodocs.net/doc/a77031357.html, 原文:https://www.sodocs.net/doc/a77031357.html,/pub/a/onjava/2005/01/26/classloading.html 类加载是java特性的一个重量级的组成部分。尽管,java中“advanced topics”的发展,使java的类加载机制的地位有所下降。但每位编程着都应该知道这部分的工作机制,以及怎样去更好与其配合。这可以使我们节省很多时间,二不必要浪费在调试ClassNotFoundException, ClassCastException, 等。 这篇文章将从最基本的开始,比如代码和数据的关系和区别,以及他们怎么样关系起来形成一个实例或者对象。然后将会说到,java中怎样通过类加载器把代码加载到JVM中,以及java中实现的主要的几种类型的类加载器。然后在这篇文章中我们将会了解到java类加载机制的内幕,我们将使用最基本的代码来描述,这些代码执行与类加载器之后,但在加载一个类之前。在接下来的部分将使用一些例子来强调,对于开发者继承和开发自己的类加载器的必要性。接着将告诉你们怎样编写自己的类加载器,以及怎样使用它们去创建一个一般的能加载包括远程客户端辅助代码的类加载器引擎,以及怎样把它在JVM中定义,实例化,然后执行。习惯上,把J2EE-specific components 中说明的作为java类加载的规范,这篇文章正是从这本手册总结来的。 类和数据 一个类代表一段要执行的代码,然而数据则代表与这些代码相关联的某种状态。状态可以改变,代码不能改变。我们把一种特定状态与一个类关联起来时,就得到了这个类的一个实例。所以同一个类的不同实例有不同的状态,但都参照相同的代码。在java中,一个类通常它的代码就包含在一个 .class 文件中,虽然其中也包括异常。然而,在java运行时,每个类都会构造一个超类对象(first-class object),它们其实是https://www.sodocs.net/doc/a77031357.html,ng.Class的实例。不论何时编译一个java文件,编译器都会在编译后的字节码中嵌入一个public, static, final型的字段class,这个字段表示的就是一个https://www.sodocs.net/doc/a77031357.html,ng.Class型的实例。因为它是public类型的,我们可以通过标识符来访问它,像这样: https://www.sodocs.net/doc/a77031357.html,ng.Class klass = Myclass.class; 只要一个类被加载到JVM,相同的类(强调:相同的类)将不会被重复加载。这将产生一个问题,什么才是相同的类?一个对象有一种特定状态和标识,对象总是与它所属类联系在一起,与这种状况相似,一个被加载到JVM中类也有特定的标识,接下来我们就阐述: 在java中,一个类通过认证的类全名来唯一标识。认证的类全名是由包名和类名两部分组

java实验指导书

实验一java开发环境及语言基础 实验目的 (1)确保正确配置java开发环境。 (2)了解javac和java命令的使用。 (3)熟悉java中的运算符。 (4)掌握条件语句和循环语句的使用。 (5)掌握通过命令行参数接受数据。 (6)掌握用Scanner类接受数据。 实验内容 (1)在控制台中输入java命令,查看输入结果。 (2)编写一个java程序,计算半径为3.0的圆周长和面积并输出结果。 (3)求a+aa+aaa+...+a...a(n个)的和,其中a为1~9之间的整数。例如,当a=3、n=4时,求3+33+333+3333的和。 (4)给定一个正整数m,统计其位数,分别打印每一位数字,再按照逆序打印出各位数字。(5)用Scanner类方法输入三角形三边求三角形面积。 实验要求 (1)JDK的安装及配置。 (2)在DOS及eclipse下编辑、编译运行第一个java程序:hello world。 (3)求圆周长和面积用方法实现,主函数调用。 (4)从命令行输入1~9之间的整数a,当所求的和大与106时,输出相应的a值及所求的和值。 (5)用Scanner类的方法输入正整数m,m的值不应该超过99999,否则给出错误信息。应引入包:import java.util.Scanner,然后在需要的方法中实例化对象:Scanner sc = new Scanner(System.in),最后调用对象的next方法,如int n=nextInt(),接受整数。 实验二数组 实验目的 (1)掌握数组的定义和使用方法。 (2)熟悉数组的排序、查找的方法。 (3)巩固循环的使用。 实验内容 (1)使用for循环,将二维数组的行与列互换,即完成矩阵的转置。 (2)编写数组的排序程序。 (3)编写杨辉三角。 实验要求 (1)编写一个界面1 选择排序2 冒泡排序3插入排序4 快速排序5 退出 当选择1、2、3、4、5的时候完成相应的功能。 (2)杨辉三角形状为等腰三角形 实验三字符串 实验目的 (1)掌握正则表达式的使用。 (2)熟悉java的字符串。

Java开源架构技术学习重点(部分答案版)(1)

第一章 Strut2框架技术的入门 1、Struts2的是怎么产生的? Struts2是Struts的下一代产品,是在Struts1和WebWork的技术基础上进行了合并,全新的Struts2框架。其全新的Struts2的体系结构与Struts1的体系结构的差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts 2可以理解为WebWork的更新产品。因此Struts2和Struts 1有着太大的变化,但是相对于WebWork,Struts2只有很小的变化。 2、Struts2的设计模式是什么?采用这种设计模式有什么好处? MVC模式 MVC模式对于Web应用的开发无疑是一种非常先进的设计思想,无论选择 哪种语言,无论应用多复杂,它都能为理解分析应用模型提供最基本的分析方法, 为构造产品提供清晰的设计框架,为软件工程提供规范的依据。 1. 模型(Model) Model 部分包括业务逻辑层和数据库访问层。在Java Web 应用程序中,业务逻辑层一般由JavaBean或EJB构建。Model 部分就是业务流程或状态的处理以及业务规则的制定。业务流程的处理过程对其他层来说是黑箱操作,模型接受视图请求的数据,并返回最终的处理结果。业务模型的设计可以说是MVC最主要的组件。MVC并没有提供模型的设计方法,而只提供给用户应该组织管理这些模型,以便于模型的重构和提高重用性。 2. 视图(View) 在Java Web 应用程序中,View 部分一般用JSP 和HTML 构建,也可以是XHTML、XML、Applet和JavaScript。客户在View 部分提交请求,在业务逻辑层处理后,

JAVA笔试题1

知识点: (1) 1.面向对象的软件开发有哪些优点? (1) 2.什么叫对象?什么叫类?类和对象有什么关系。 (1) 3.什么是包?把一个类放在包里有什么作用? (2) 4.作用域public、private、protected以及不写时(default)有什么区别? (2) 5.什么是方法?方法的结构是怎样的?设计方法应考虑哪些因素? (2) 6.什么是方法的覆盖?与方法的重载有何不同?方法的覆盖与属性的隐藏有何不同? (3) 7.什么是成员变量、局部变量、类变量和实例变量? (3) 8.什么是继承?什么是父类?什么是子类?继承的特性可给面向对象编程带来什么好处? (3) 9.什么是多态?面向对象程序设计为什么要引入多态的特性? (4) 10.“子类的域和方法的数目一定大于等于父类的域和方法的数目”,这种说法是否正确?为什么? (4) 11.父类对象与子类对象相互转化的条件是什么?如何实现它们的相互转化? (4) 12.接口与抽象类有哪些异同点? (4) 13.区分接口与抽象类分别在什么场合使用? (5) 14.一个类如何实现接口?实现某接口的类是否一定要重载该接口中的所有抽象方法? (5) 15.进程与线程的区别与联系? (5) 编程: (6) 1.统计一个字符串中出现某个字母的次数(注意区分大小写)。 (6) 2.编写一个程序,在主类中创建和调用方法sumf(),方法sumf()的功能是进行两个浮点数的加法运算。6知识点: 1.面向对象的软件开发有哪些优点? 面向对象设计是一种把面向对象的思想应用于软件开发过程中,指导开发活动的系统方法,是建立在“对象”概念基础上的方法学。所谓面向对象就是基于对象概念,以对象为中心,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。 从面向过程到面向对象是程序设计技术的一个飞跃。人们之所以要采用面向对象的程序设计技术,其目的在于:按照与人类习惯思维方法一致的原则开发系统;提高代码的可重用性(或者称为复用性);提升程序的开发与运行效率;提高程序的可靠性与可维护性;提高程序的可扩展性;增强程序的可控制性。总之,面向对象的程序设计,能够有效分解、降低问题的难度与复杂性,提高整个求解过程的可控制性、可监视性和可维护性,从而获得较高的开发效率与可靠效果。 2.什么叫对象?什么叫类?类和对象有什么关系。 对象(Object)是一个应用系统中用来描述客观事物的实体,是具有特定属性(数据)和行为(方法)的基本运行单位,是类的一个特定状态下的实例。对象是一件事、一个实体、一个名词、一个可以想象为有自己的标识的任何东西。对象是类的实例化。概括来说:万物皆对象。对象具有状态,一个对象用数据值来描述它的状态。 类(Class)是Java代码的基本组织模块,是用以描述一组具有共同属性和行为的对象的基本原型,是对这组对象的概括、归纳与抽象表达。类是对象的模板,它定义了本类对象所应拥有的状态属性集及操作这组属性的行为方法集。是对一组有相同数据和相同操作的对象的定义,一个类所包含的方法和数据描述一组对象的共同属性和行为。

Tomcat(免安装版)的安装与配置

Tomcat(免安装版)的安装与配置 一、下载Tomcat Tomcat可以从https://www.sodocs.net/doc/a77031357.html,/网站下载,选择任意版本,在 Binary Distributions 下的zip包既是。 二、配置Tomcat 1、将下载Tomcat Zip压缩包解压。 2、修改\bin\startup.bat文件: 在第一行前面加入如下两行: SET JAVA_HOME=JDK目录 SET CATALINA_HOME=前面解压后Tomcat的目录或者%cd% 如果需要使用shutdown.bat关闭服务器的话,也按照上面加入两行。 3、这样,运行startup.bat就可以运行服务器,运行shutdown.bat就可以关闭服务器了。 4、修改\conf\tomcat-users.xml文件: 在标签内加入 这样才可以使用Tomcat的管理界面。 三、将Tomcat加入服务 1、修改bin目录中的service.bat: REM 添加下面的一行 set CATALINA_HOME=%cd% 如果从来没有安装过Tomcat,或者保证Services.msc启动服务管理器检查没有Apache Tomcat 系统服务,到此你就可以转到第二步了。否则继续往下走 REM 按照描述修改下面的几行 set SERVICE_NAME=Tomcat5 REM 上面一行,Tomcat5修改成你需要的服务名,这个将是一后使用net start/stop来操作的服务名称。

Spring中ApplicationContext加载机制

Spring中ApplicationContext加载机制。 加载器目前有两种选择:ContextLoaderListener和ContextLoaderServlet。 这两者在功能上完全等同,只是一个是基于Servlet2.3版本中新引入的Listener接口实现,而另一个基于Servlet接口实现。开发中可根据目标Web容器的实际情况进行选择。 配置非常简单,在web.xml中增加: org.springframework.web.context.ContextLoaderListener 或: context org.springframework.web.context.ContextLoaderServlet 1 通过以上配置,Web容器会自动加载/WEB-INF/applicationContext.xml初始化ApplicationContext实例,如果需要指定配置文件位置,可通过context-param加以指定: contextConfigLocation /WEB-INF/myApplicationContext.xml 配置完成之后,即可通过 WebApplicationContextUtils.getWebApplicationContext方法在Web应用中获取ApplicationContext引用。 如:ApplicationContext ctx=WebApplicationContextUtils.getWebApplicationContext(); LoginAction action=(LoginAction)ctx.getBean("action"); ============================= Spring中WebApplicationContext的研究 ApplicationContext是Spring的核心,Context我们通常解释为上下文环境,我想用“容器”来表述它更容易理解一些,ApplicationContext则是“应用的容器”了,Spring把Bean 放在这个容器中,在需要的时候,用getBean方法取出,虽然我没有看过这一部分的源代码,但我想它应该是一个类似Map的结构。 在Web应用中,我们会用到WebApplicationContext,WebApplicationContext继承自ApplicationContext,先让我们看看在Web应用中,怎么初始化WebApplicationContext,

Tomcat部署项目时启动报错总结

Tomcat部署项目时启动报错总结 1、虚拟机报错端口被占用 tomcat的默认端口是8080(或者其他自己设置的),可能已经被其他占用。 解决方法:在tomcat安装路径下conf文件夹中的server.xml中把断口号改掉!如果一台机 器上使用多个tomcat,则改掉所有相关的端口避免重复了,包括想如下 在server.xml中找到如下地方改掉port的值 ● ●(改完后看看和本机上正在用 的tomcat是不是有重复的port) 2、tomcat的启动窗口一闪而过 Tomcat启动的dos窗口一闪而过,如何看出错信息? 在DOS窗口运行STARTUP.BAT文件, 另外,吧startup.bat文件最后的 call "%EXECUTABLE%" start %CMD_LINE_ARGS% 改成: call "%EXECUTABLE%" run %CMD_LINE_ARGS% 分析原因1:jdk的环境变量没有配置好 解决方法:检查jdk环境变量的配置是否正确,或者重新配置jdk的系统环境变量JDK环境变量配置的步骤如下: 1.我的电脑-->属性-->高级-->环境变量. 2.配置用户变量: a.新建JAVA_HOME C:\Program Files\Java\j2sdk1.5.0(JDK的安装路径) b.新建 PATH (注意:把java的配置放在path的最前面) %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin c.新建CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar 3.测试环境变量配置是否成功: 开始-->运行--〉CMD 键盘敲入:JAVAC JAVA 出现相应的命令,而不是出错信息,即表示配置成功! 环境变量配置的理解: 1. PATH环境变量。作用是指定命令搜索路径,在i命令行下面执行命令如javac编译java程序时,它会到PATH变量所指定的路径中查找看是否能找到相应的命令程序。我们需要把jdk安装目录下的bin 目录增加到现有的PATH变量中,bin目录中包含经常要用到的可执行文件如javac/java/javadoc等待,设置好PATH变量后,就可以在任何目录下执行javac/java等工具了。 2. CLASSPATH环境变量。作用是指定类搜索路径,要使用已经编写好的类,前提当然是能够找到它们了,JVM就是通过CLASSPTH来寻找类的。我们需要把jdk安装目录下的lib子目录中的dt.jar和tools.jar设置到CLASSPATH中,当然,当前目录“.”也必须加入到该变量中。 3. JAVA_HOME环境变量。它指向jdk的安装目录,Eclipse/NetBeans/Tomcat等软件就是通过搜索JAVA_HOME变量来找到并使用安装好的jdk。

如何优化提高tomcat启动速度

如何优化提高tomcat启动速度 在tomcat启动的时候,我们可以做一些优化设置来使得tomcat的启动更快速,下面是一些常见的优化加速启动的方法建议(以tomcat-7.+为例说明)。 1、 Jars包 1.1、将一些不必要的jar包去掉,当tomcat启动加载jar包的时候,会去搜寻每个jar包里的class文件,这些都会耗费一些时间,如果你把不必要的jar 包去掉了,很显然会节省时间。 1.2、你可以将一些与TLD files、注解、网络碎片无关的jar包加入到属性 tomcat.util.scan.DefaultJarScanner.jarsToSkip的值中,这可以在 conf/catalina.properties中进行设置。 2、缓存 你可以在bin/catalina.sh中设置jvm所能使用到的缓存大小,如下:JAVA_OPTS=?-Xms1024m -Xmx1024m? 3、配置文件

Tomcat的配置比如server.xml是xml文件,而xml的解析也是要花时间的,如果我们能将xml配置文件尽可能地弄得简洁一些,比如去掉一些没有用到的节点,这也有助于减少启动的时间,虽然这个节省的时间看来很少。 4、应用程序 4.1、确保你程序在启动的时候没有一些处理很耗时的地方。 4.2、删除掉tomcat自带的目录webapps及下面的所有内容,不然的话每次启动的时候都会加载这些自带的例子。 4.3、修改WEB-INF/web.xml文件,在默认的情况下中的属性metadata-complete的值为false,也就是这样:,这种情况下,tomcat在启动时会去自动扫描是否有注解及网络碎片,如果你不想tomcat这样做,你可以将metadata-complete的值设为true。 5、并行启动多个应用程序 默认情况下,假设在一个tomcat下你有多个应用,那么启动的时候,这些应用程序都是依次启动的,除非所有应用全部启动完毕,tomcat才会启动完成,但从Tomcat 7.0.23+开始,你可以配置多个应用程序并行启动了!你可以通

WebLogic类加载过程简述

WebLogic类加载过程 王明杰 20061012 19:28-21:59 英文水平有限,翻译的肯定有不对的地方,欢迎指正。 希望能够各位同事在使用weblogic的过程中带来帮助。 小注: 2006-10-12 下午,在weblogic中部署一个启动类,部署了近2个小时,weblogic总是提示“找不到类的异常”。心情很是郁闷。

“大事问老婆,小事问goole”,一个字“搜”。 终于找到了WebLogic的官方文档,摘录下来,进行了翻译,终于对WebLogic的类的加载过程有了比较系统的了解。 希望该文档能够帮助和我有同样疑惑的人走出困境,共同进步!!! V ersion 0.1 msn:wangmingjie_2002@https://www.sodocs.net/doc/a77031357.html,

官方原版 (19:30开始)20061012开始 WebLogic Server Application Classloading The following sections provide an overview of Java classloaders, followed by details about WebLogic Server J2EE application classloading. 下面的部分概况的介绍了java的类装载器,接着详细的介绍了WebLogicJ2EE 应用服务器(WebLogic Server J2EE application )的类装载过程。 ?Java Classloader Overview java类转载器综述 ?WebLogic Server Application Classloader Overview WebLogic 应用服务器类装载器介绍。 ?Resolving Class References Between Modules and Applications Java Classloader Overview Classloaders are a fundamental module of the Java language. A classloader is a part of the Java virtual machine (JVM) that loads classes into memory; a classloader is responsible for finding and loading class files at run time. Every successful Java programmer needs to understand classloaders and their behavior. This section provides an overview of Java classloaders. 类装载器是java语言的一个基本模块,类装载器是java虚拟机的一部分,把相应的类装载到内存中,类装载器负责在运行期间找到类并载入类 。每个成功的java程序员都需要理解java类装载器及其行为。本部分综述了java类装载器。

2011JAVA程序设计A卷试卷(含答案)

华南农业大学期末考试试卷(A 卷) 2011-2012学年第 1 学期 考试科目: Java 程序设计 考试类型:(闭卷)考试 考试时间: 120 分钟 学号 姓名 年级专业 一、单项选择题(本大题共 25 小题,每小题 2 分,共 50 分) 1. 下列有关Java 程序的说法中正确的是___D_____: A. 由于Java 程序是解释执行的,所以执行前不需要进行编译 B. 一个.java 源程序编译后将产生一个.class 的字节码文件 C. 安装了JDK 后,安装程序会自动配置系统的环境变量path 和classpath D. 面向对象的解释型高级编程语言 2. 下列为合法变量名的是__C______。 A. false B. 0xabc C. iStudent D. cow ?s 3. 对于构造方法,下列叙述不正确的是__C______。 A. 构造方法是类的一种特殊函数,它的方法名必须与类名相同 B. 构造方法没有返回值类型 C. 子类不但可以继承父类的无参构造函数,也可以继承父类的有参构造函数。 D. 子类在创建构造方法是必须把调用父类构造方法放在第一条语句 4. 下列关于接口的说明正确的是__D______。 A. 接口和抽象类是同一回事 B. 一个类不可以实现多个接口 C. 接口间不能有继承关系 D. 实现一个接口必须实现接口的所有方法 5. Java 为移动设备提供的平台是__A______。 A . J2ME B .J2SE C .J2EE D .JDK5.0 6. 下列语句中,属于多分支语句的是__B______。 A .if 语句 B .switch 语句 C .do while 语句 D .for 语句

JVM加载class文件的原理机制

1.Java中的所有类,必须被装载到jvm中才能运行,这个装载工作是由jvm中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中 2.java中的类大致分为三种: 1.系统类 2.扩展类 3.由程序员自定义的类 3.类装载方式,有两种 1.隐式装载,程序在运行过程中当碰到通过new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中, 2.显式装载,通过class.forname()等方法,显式加载需要的类 隐式加载与显式加载的区别?两者本质是一样? 4.类加载的动态性体现 一个应用程序总是由n多个类组成,Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载,这样的好处是节省了内存的开销,因为java最早就是为嵌入式系统而设计的,内存宝贵,这是一种可以理解的机制,而用到时再加载这也是java动态性的一种体现 5.java类装载器 Java中的类装载器实质上也是类,功能是把类载入jvm中,值得注意的是jvm的类装载器并不是一个,而是三个,层次结构如下: Bootstrap Loader - 负责加载系统类 | - - ExtClassLoader - 负责加载扩展类 | - - AppClassLoader - 负责加载应用类 为什么要有三个类加载器,一方面是分工,各自负责各自的区块,另一方面为了实现委托模型,下面会谈到该模型 6. 类加载器之间是如何协调工作的 前面说了,java中有三个类加载器,问题就来了,碰到一个类需要加载时,它们之间是如何协调工作的,即java是如何区分一个类该由哪个类加载器来完成呢。 在这里java采用了委托模型机制,这个机制简单来讲,就是“类装载器有载入类的需求时,会先请示其Parent使用其搜索路径帮忙载入,如果Parent 找不到,那么才由自己依照自己的搜索路径搜索类”,注意喔,这句话具有递归性 下面举一个例子来说明,为了更好的理解,先弄清楚几行代码: Public class Test{ Public static void main(String[] arg){ ClassLoader c = Test.class.getClassLoader(); //获取Test类的类加载器 System.out.println(c); ClassLoader c1 = c.getParent(); //获取c这个类加载器的父类加载器

相关主题