如何学好java

如何学好java,其实很简单,只要用心体会,慢慢积累!
posts - 106, comments - 7, trackbacks - 0, articles - 3
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

二叉树


posted @ 2011-04-29 12:04 哈希 阅读(128) | 评论 (0)编辑 收藏

一、oop唯一关心的是接口是什么,就像就像汽车销售商不需要管他是怎么制造的,只要关心他能不能燃烧燃料开动起来,只要知道(can or not)不要关心(how and      why):
1、多态性:(java对象多态,java中不支持多重继承)
     允许不同类的对象最统一消息做出响应。多态性包括参数化多态和包含性多态性,多态性语言具有灵活抽象,行为共享的优势,很好解决了应用函数同名问题.
2、封装:(隐藏细节)
     就是把把数据和行为结合在一起,并对对象使用者隐藏隐藏数据的实现过程,一个对象中的数据称为它的实例字段(instance);
3、继承:(扩展一个类)
    允许在已经存在的类上构建新的类,当你继承一个已经存在的类时候那么你就 复用了这个类的方法和字段,同时你可以在新类中添加心得方法和字段;
?4、class(oop最重要的思想,类中构建一个对象,即创建这个类的一个实例)
    为编写可动态操纵java代码的程序提供了强大的功能反射,这项功能为javaBeans特别所有,能够分析类能力的程序角反射器,java中提供的功能包叫java.lang.reflect反射机制十分强大。
5、接口:(不是一个类,对符合接口要求的类的一套规范)
    实现接口两个步骤:1、声明类需要实现的指定接口;
                      2、提供接口中所有接口的定义;
    接口是一个收集方法和常数的契约,当类执行一个接口,他就许诺在那个接口中声明的所有方法。接口是一个设备或者一个系统,它是用于交互的无关实体。根据这个定义,远程控制是一个你和电视的接口,而英语是两个人之间的接口。在java语言中接口是一种设备,它是用来与其他对象交互的设备。一个接口可能对一个协议是类似的,实际上其他语言也有接口,但是它们调用它的接口协议。
6、动态绑定调用对象方法的机制
    (1)编译器检查对象声明的类型和方法名;(2)编译器检查方法调用的参数类型;(3)静态绑定:若方法类型为private static final编译器会准确知道调用哪个方法;(4)程序需要调动一个方法时,那么虚拟机必须调用参数所指向的对象的实际类型相匹配的方法。
7、构造器(特殊的方法,构造对象并将其初始化)
   构造器可以有0个,一个或多个,构造器和类有相同的名字,一个类可以右多个构造器,构造器没有返回值,构造器总是和new字符一起运行的。
8、final类(系统级的类,不可扩展)
   防止派生新类
9、equal(判断两个对象是否相等)
10、toString()返回一个代表该对象的字符串,几乎每一个类都会重载该方法,返回当前状态的正确表示;
11、通用编程:
      任何类型的所有值都可以都可以用Object类型的变量来代替;
12、内部类:(定义在一个类的内部的类)
       1、一个内部类的对象能够访问创建它的对象的实现,包括私有数据;
       2、对于同一个包中的类,呢不累可以隐藏起来;
       3、匿名内部类可以很方便的进行回调;
       4、使用内部类可以很方便的编写事件驱动程序;
13、代理类:(proxy)
     A、指定接口要求所有代码;
     B、Object类定义的所有方法(equals,toString());

  


posted @ 2011-04-29 11:32 哈希 阅读(297) | 评论 (0)编辑 收藏

Java基础面试题系列一

dev.firnow.com    时间 : 2008-02-19  作者:佚名   编辑:本站 点击:  1796 [ 评论 ]

1、作用域public,private,protected,以及不写时的区别
答:区别如下:
作用域    当前类       同一package    子孙类       其他package
public     √          √             √             √
protected  √          √             √             ×
friendly   √          √             ×             ×
private    √          ×             ×             ×
不写时默认为friendly


2Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)
答:匿名的内部类是没有名字的内部类。不能extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现



3Static Nested Class Inner Class的不同
答:Nested Class (一般是C++的说法),Inner Class (一般是JAVA的说法)。Java内部类与C++嵌套类最大的不同就在于是否有指向外部的引用上。注: 静态内部类(Inner Class)意味着1创建一个static内部类的对象,不需要一个外部类对象,2不能从一个static内部类的一个对象访问一个外部类对象


4&&&的区别
答:&是位运算符,表示按位与运算,&&是逻辑运算符,表示逻辑与(and)


5Collection Collections的区别
答:Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作


6、什么时候用assert
答:assertion(断 言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表 达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,系统将给出警告或 退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布 后,assertion检查通常是关闭的



7String s = new String("xyz");创建了几个String Object
答:两个,一个字符对象,一个字符对象引用对象



8Math.round(11.5)等於多少? Math.round(-11.5)等於多少
:  Math.round(11.5)==12;Math.round(-11.5)==-11;round方法返回与参数最接近的长整数,参数加1/2后求其floor


9short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错
答:short s1 = 1; s1 = s1 + 1; (s1+1运算结果是int型,需要强制转换类型)short s1 = 1; s1 += 1;(可以正确编译)


10Java有没有goto
答:java中的保留字,现在没有在java中使用



11、数组有没有length()这个方法? String有没有length()这个方法
答:数组没有length()这个方法,有length的属性。String有有length()这个方法


12OverloadOverride的区别。Overloaded的方法是否可以改变返回值的类型
答:方 法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重 载Overloading是一个类中多态性的一种表现。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重 写 (Overriding)。子类的对象使用这个方法时,将调用子类中的定义,对它而言,父类中的定义如同被"屏蔽"了。如果在一个类中定义了多个同名 的方法,它们或有不同的参数个数或有不同的参数类型,则称为方法的重载(Overloading)。Overloaded的方法是可以改变返回值的类型


13Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别
答:Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判读两个Set是否相等
    equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值



14、给我一个你最常见到的runtime exception
答:常 见的运行时异常有如下这些 ArithmeticException, ArrayStoreException, BufferOverflowException, BufferUnderflowException, CannotRedoException, CannotUndoException, ClassCastException, CMMException, ConcurrentModificationException, DOMException, EmptyStackException, IllegalArgumentException, IllegalMonitorStateException, IllegalPathStateException, IllegalStateException, ImagingOpException, IndexOutOfBoundsException, MissingResourceException, NegativeArraySizeException, NoSuchElementException, NullPointerException, ProfileDataException, ProviderException, RasterFormatException, SecurityException, SystemException, UndeclaredThrowableException, UnmodifiableSetException, UnsupportedOperationException



15errorexception有什么区别
答:error 表示恢复不是不可能但很困难的情况下的一种严重问题。比如说内存溢出。不可能指望程序能处理这样的情况
    exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况



16List, Set, Map是否继承自Collection接口
答: List,Set是,Map不是


17abstract classinterface有什么区别
答:声 明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中 实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或 抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它 类可以在类中实现这些方法
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口 中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承 行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它 允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的 类是否实现了接口



18abstractmethod是否可同时是static,是否可同时是native,是否可同时是synchronized
都不能

 
19、接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承实体类(concrete class)
答:接口可以继承接口。抽象类可以实现(implements)接口,抽象类是否可继承实体类,但前提是实体类必须有明确的构造函数


20、构造器Constructor是否可被override
答:构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading


21、是否可以继承String
答:String类是final类故不可以继承


22try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后
答:会执行,在return前执行


23、用最有效率的方法算出2乘以8等於几
答:2 << 3


24、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对
答:不对,有相同的hash code


25、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
答:是值传递。Java 编程语言只有值传递参数。当一个对象实例作为一个参数被传递到方法中时,参数的值就是对该对象的引用。对象的内容可以在被调用的方法中改变,但对象的引用是永远不会改变的


26swtich是否能作用在byte上,是否能作用在long上,是否能作用在String
答:witch(expr1)中,expr1是一个整数表达式。因此传递给 switch 和 case 语句的参数应该是 int、 short、 char 或者 byte。long,string 都不能作用于swtich


27ArrayListVector的区别,HashMapHashtable的区别
答:就ArrayList与Vector主要从二方面来说.
一.同步性:Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的
二.数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一半
就HashMap与HashTable主要从三方面来说。
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value

28char型变量中能不能存贮一个中文汉字?为什么?
答:是能够定义成为一个中文的,因为java中以unicode编码,一个char占16个字节,所以放一个中文是没问题的


29GC是什么为什么要有GC
答:GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至 崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。


30floatfloat f=3.4是否正确?
:不正确。精度不准确,应该用强制类型转换,如下所示:float f=(float)3.4
 

posted @ 2011-04-28 18:02 哈希 阅读(162) | 评论 (0)编辑 收藏

3.求子数组的最大和
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。


第10题
翻转句子中单词的顺序。
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。

句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
例如输入“I am a student.”,则输出“student. a am I”。


第14题:
题目:输入一个已经按升序排序过的数组和一个数字,
在数组中查找两个数,使得它们的和正好是输入的那个数字。
要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。

 

第17题:
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。 
分析:这道题是2006年google的一道笔试题。

 

第20题:
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
例如输入字符串"345",则输出整数345。

 

第25题:
写一个函数,它的原形是int continumax(char *outputstr,char *intputstr)
功能:
在字符串中找出连续最长的数字串,并把这个串的长度返回,
并把这个最长数字串付给其中一个函数参数outputstr所指内存。
例如:"abcd12345ed125ss123456789"的首地址传给intputstr后,函数将返回9,
outputstr所指的值为123456789


26.左旋转字符串

题目:
定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。

如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。
要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。


37.
有n个长为m+1的字符串,
如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,
问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误。

 

45.雅虎:
1.对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)
某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。

2.一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值
  比如{3,2,4,3,6} 可以分成{3,2,4,3,6} m=1;
  {3,6}{2,4,3} m=2
  {3,3}{2,4}{6} m=3 所以m的最大值为3


48.微软:
一个数组是由一个递减数列左移若干位形成的,比如{4,3,2,1,6,5}
是由{6,5,4,3,2,1}左移两位形成的,在这种数组中查找某一个数。


51.和为n连续正数序列。
题目:输入一个正数n,输出所有和为n连续正数序列。

例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。
分析:这是网易的一道面试题。


53.字符串的排列。
题目:输入一个字符串,打印出该字符串中字符的所有排列。
例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串
abc、acb、bac、bca、cab和cba。

分析:这是一道很好的考查对递归理解的编程题,
因此在过去一年中频繁出现在各大公司的面试、笔试题中。

 

54.调整数组顺序使奇数位于偶数前面。

题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,
所有偶数位于数组的后半部分。要求时间复杂度为O(n)。


56.最长公共字串。
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,

则字符串一称之为字符串二的子串。

注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。
请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。

例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,
则输出它们的长度4,并打印任意一个子串。

分析:求最长公共子串(Longest Common Subsequence, LCS)是一道非常经典的动态规划题,
因此一些重视算法的公司像MicroStrategy都把它当作面试题。


63.在字符串中删除特定的字符。
题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。

例如,输入”They are students.”和”aeiou”,

则删除之后的第一个字符串变成”Thy r stdnts.”。

分析:这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,
因为写程序操作字符串能很好的反映我们的编程基本功。

 

69.旋转数组中的最小元素。
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,

输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。

    分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,
时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。

 

73.对策字符串的最大长度。
题目:输入一个字符串,输出该字符串中对称的子字符串的最大长度。
比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4。

分析:可能很多人都写过判断一个字符串是不是对称的函数,这个题目可以看成是该函数的加强版。

 

85.又见字符串的问题
1.给出一个函数来复制两个字符串A和B。
字符串A的后几个字节和字符串B的前几个字节重叠。
分析:记住,这种题目往往就是考你对边界的考虑情况。
2.已知一个字符串,比如asderwsde,寻找其中的一个子字符串比如sde的个数,
如果没有返回0,有的话返回子字符串的个数。


88.2005年11月金山笔试题。编码完成下面的处理函数。
函数将字符串中的字符'*'移到串的前部分,

前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。
如原始串为:ab**cd**e*12,
处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)

 

93.在一个int数组里查找这样的数,它大于等于左侧所有数,小于等于右侧所有数。
直观想法是用两个数组a、b。a[i]、b[i]分别保存从前到i的最大的数和从后到i的最小的数,

一个解答:这需要两次遍历,然后再遍历一次原数组,
将所有data[i]>=a[i-1]&&data[i]<=b[i]的data[i]找出即可。

给出这个解答后,面试官有要求只能用一个辅助数组,且要求少遍历一次。


94.微软笔试题
求随机数构成的数组中找到长度大于=3的最长的等差数列9 d- x' W) w9 ?" o3 b0 R
输出等差数列由小到大:
如果没有符合条件的就输出
格式:
输入[1,3,0,5,-1,6]
输出[-1,1,3,5]
要求时间复杂度,空间复杂度尽量小


96.08年中兴校园招聘笔试题
1.编写strcpy 函数
已知strcpy 函数的原型是
char *strcpy(char *strDest, const char *strSrc);
其中strDest 是目的字符串,strSrc 是源字符串。
不调用C++/C 的字符串库函数,请编写函数 strcpy。

 

----------------

1.关于本微软等公司数据结构+算法面试100题系列V0.1版的郑重声明
http://blog.csdn.net/v_JULY_v/archive/2010/12/02/6050133.aspx
2.完整100题,请参见,
[珍藏版]微软等数据结构+算法面试100题全部出炉[100题首次完整亮相]
http://blog.csdn.net/v_JULY_v/archive/2010/12/06/6057286.aspx
3.更多详情,请参见,本人博客:
My Blog:
http://blog.csdn.net/v_JULY_v
4.所有的资源(题目+答案)下载地址:
http://v_july_v.download.csdn.net/
5.本微软等100题系列V0.1版,永久维护(网友,思路回复)地址:
http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html

posted @ 2011-04-28 17:56 哈希 阅读(1311) | 评论 (0)编辑 收藏

目: 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。   但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。
  1. package com.sw.suanfa.first.ten;  
  2. /** 
  3.  * 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。   
  4.  *  但是要保证汉字不被截半个, 
  5.  *  如“我ABC”4,应该截为“我AB”, 
  6.  *  输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。  
  7.  * @author songwei 
  8.  * 
  9.  *我的处理方式:截取字符串的一个字符,加入StringBuffer中,并取其字节数,并入当前获取字符的总长度中, 
  10.  *如果总长度大于等于输入的长度,则返回StringBuffer的toString值。 
  11.  *getSubString方法传入encoding值。UTF-8中文占3个字节,GBK占2个。结果有所不同,所以还是传入较好。 
  12.  *没有通过判断charAt的值来判定是否为中文等特殊字符。 
  13.  *不知道我这种方式是否正确。【未经过详细测试】 
  14.  */ 
     public class SubStringWithChina {  
            
    public static void main(String[] args) throws Exception{  
                  
                String a 
    = "我ABC汉DEF" ;  
                
    int len = 6 ;  
                String encoding 
    = "UTF-8" ;  
                  
                System.out.println( getSubString(a, len,encoding) );  
                a 
    = "我ABC";  
                len 
    = 4 ;  
                encoding 
    = "gbk" ;  
                System.out.println( getSubString(a, len,encoding) );  
            }  
              
            
    /** 
             *  
             * 
    @param str 传入字符串 
             * 
    @param len 截取字节数 
             * 
    @param encoding 编码方式 
             * 
    @return 返回截取后的字符串 
             * 
    @throws Exception 
             
    */  
            
    public static String getSubString(String str,int len,String encoding) throws Exception{  
                
    if(str == null || str.length()<1return null ;  
                
    if(len<1return null ;  
                StringBuffer sb 
    = new StringBuffer();  
                
    int all = 0 ;  
                
    for(int i=0;i<str.length();i++){  
                    String tmp 
    = str.substring(i,i+1);  
                    sb.append(tmp);  
                    
    byte[] tmpB = tmp.getBytes(encoding);  
                    all 
    +=tmpB.length ;  
                    
    if(all>=len){  
                        
    break ;  
                    }  
                }  
                
    return sb.toString() ;  
            }  
        }
  15. 判断字符串中是否含有汉字:

     String str = "test中文汉字";
    String regEx = "[\\u4e00-\\u9fa5]";

    /**
    * 判断有没有中文
    */
    if (str.getBytes().length == str.length()) {
     System.out.println("无汉字");
    } else {
     System.out.println("有汉字");
    }

    /**
    * 如果有则打印出来
    */
    Pattern p = Pattern.compile(regEx);
    Matcher m = p.matcher(str);
    while (m.find()) {
     System.out.print(m.group(0) + "");
    }

    如题

posted @ 2011-04-28 16:31 哈希 阅读(363) | 评论 (0)编辑 收藏

     摘要: 以前的收藏,估计很少有这么全的面试题集了 ^_^ 基础知识: 1.C++或Java中的异常处理机制的简单原理和应用。   当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内 置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发 ...  阅读全文

posted @ 2011-04-28 15:20 哈希 阅读(84) | 评论 (0)编辑 收藏

如下分成5个步骤
1,建立xml文件
2,建立bean的接口
3,建立bean
4,写测试程序
5,测试

准备工作
环境配置如下,需要spring.jar和common-logging.jar两个jar文件

开始
1,建立xml文件
文件名:beans.xml
文件位置:src目录下
文件内容:
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

  <!-- the application context definition for the springapp DispatcherServlet -->

  <bean id="sayhello" class="test.service.impl.HelloBean"/>
   
</beans>

2,建立bean的接口
文件名:Hello.java
文件内容:
package test.service;

public interface Hello {

    public void sayHello();

}

3,建立bean
文件名:HelloBean.java
文件内容:
package test.service.impl;

import test.service.Hello;

public class HelloBean implements Hello {
   
    /* (non-Javadoc)
     * @see test.service.impl.Hello#sayHello()
     */
    public void sayHello() {
        System.out.println("这是一个测试程序");
    }

}

4,写测试程序
文件名:FirstSpring.java
文件内容:
package test.spring;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import test.service.Hello;

public class FirstSpring {
   
    public static void main(String[] args) {
        testHello();
    }
   
    public static void testHello() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
        Hello hello =(Hello) applicationContext.getBean("sayhello");
        hello.sayHello();
       
    }
}

5,测试
运行FirstSpring.java文件,得到输出结果如下:
2009-6-30 3:33:58 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [beans.xml]
2009-6-30 3:33:59 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
信 息: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@7259da]: org.springframework.beans.factory.support.DefaultListableBeanFactory@2e7820
2009-6-30 3:33:59 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
信 息: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@2e7820: defining beans [sayhello]; root of factory hierarchy
这是一个测试程序

上面红字是spring输出的调试信息,蓝字是hellobean实际输入的内容。

简单总结:
1,环境配置中不要忘记了common-logging.jar文件,我最开始忘记了,还是用junit测试的,结果就是不通过。出错的原因也不明白。后来直接改成普通的main方法测试,才明白原因。

2,bean的接口和实现的分离在spring中被贯彻执行。同时理解一下IOC(控制反转)的概念。
3,spring中的bean,应该指的是执行各种业务的业务bean才是。不同于strut的formbean和对应db表对象的valuebean。

posted @ 2011-04-28 12:19 哈希 阅读(171) | 评论 (0)编辑 收藏


MyEclipse 怎样手动编译整个项目

作者 Neot 写于 2008-12-31 | 3,737 次浏览

MyEclipse 菜单 Project->Build Automatically 选中后,项目的文件会被自动编辑。要想手动编译整个项目,可使用菜单 Project->Build All 或 Project->Build Project。还有个比较笨的方法,就是运行整个项目。运行项目时,MyEclipse 会先对项目进行编译。

但是有个问题,Build All、Build Project 菜单项常常是恢掉的,不可执行。其实,这是因为我们勾选了 Project->Build Automatically 项。取消掉 Project->Build Automatically 后,Build All 和 Build Project 菜单项就可以用了。

[ 标签: myeclipse, 编译 ]
[ 固定链接:http://blog.tanggaowei.com/2008/12/myeclipse-2.html ]

为什么取消 MyEclipse 验证后还是有许多红叉叉

作者 Neot 写于 2008-12-31 | 2,610 次浏览

在 MyEclipse 的 windows–>perferences–>myeclipse–>validation 下,把除了manual 下面的全部点掉,build下只留 classpath dependency Validator,这样设置后,MyEclipse就不会老是验证 xml、jsp、html 等文件了。参考如下文章:

Eclipse+MyEclipse的优化

但是,我设置好了,在 Package Explorer 窗口却还是有许多的红叉叉。翻来覆去弄了好几次,情况都一样。最后,终于发现,在 Package Explorer 窗口 对项目点击右键,在出现的菜单中执行“MyEclipse->Remove All Validation Markers”,所有的红叉叉就都不见了。

[ 标签: myeclipse, 优化, 验证 ]
[ 固定链接:http://blog.tanggaowei.com/2008/12/myeclipse.html ]

Eclipse 中怎样添加 Subversion 插件

作者 Neot 写于 2008-10-30 | 3,280 次浏览

Eclipse 中可以从菜单添加插件:[菜单]Help / Software Updates / Find and Install。在出现的 Install 窗口,选择“Search for new features to install”项,点击“Next”进入下一页。然后点击右侧的“New Remote Site”按钮,在出现的窗口中,设置“Name”项为“Subversion”,“URL”项为“http://subclipse.tigris.org/update/”,点击“OK”按钮。再点击“Finish”按钮,Ecplise 就会开始自动下载 Subversion 插件,并安装了。

像 MyEclipse、Carbide 这些基于 Eclipse 的开发工具,同样适用这个方法。

[ 标签: Carbide, eclipse, myeclipse, subversion ]
[ 固定链接:http://blog.tanggaowei.com/2008/10/eclipse-subversion.html ]

MyEclipse开发SSH(Struts+Spring+Hibernate)入门

作者 Neot 写于 2007-12-13 | 16,744 次浏览

(本文参考自 oksonic 的“Struts+Spring+Hibernate练习(完整)”)

源码下载:http://ishare.iask.sina.com.cn/cgi-bin/fileid.cgi?fileid=2857703

1. 准备

工具:MyEclipse 6.0.1 GAmysql-connector-java-5.0.4-bin.jarMySql GUI Tools 5.0(便于管理MySql数据库,不是必须)

环境:Tomcat 5.5MySql 5.0

1.1. 新建工程

操作:[Menu] File/New/Web Project

工程名:login

2. Struts 部分


2.1. 添加 Struts 功能支持

操作:[Menu] MyEclipse/Project Capabilities/Add Struts Capabilities

将 “yourcompany” 替换成 “login”。

2.2. 创建 ActionForm 类

操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Form

类名:LoginForm

在 “Use case” 里输入 “Login” 后,Name、Form type 等会自动填充。

在 “Form Properties” 选项卡为 loginForm 新增两个属性:username、password,”Type” 和 “JSP input type” 分别保持默认的 “java.lang.String” 和 “text”;

在 “JSP” 选项卡钩选 “Create JSP form” 选项,将新建路径改为 “/login.jsp”(login.jsp文件将被自动创建)。

2.3. 创建 Action 类

操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Action

类名:LoginAction

在 “Form” 选项卡的 “Name” 项选择 “loginForm”,”Input Source” 项输入 “/login.jsp”。

2.4. 创建 index.jsp 文件

如果没有,创建 index.jsp 文件,并添加一个指向 login.jsp 的链接:<a href = “login.jsp”>Login</a>

2.5. 创建Forword类

操作:[Ctrl+N] MyEclipse/Web-Struts/Struts 1.2 Forword

类名:indexForword

“Name” 项输入 “indexForword” ,”Path” 项选择 “/index.jsp” 。

2.6. 修改 LoginAction.java 文件

修改 LoginAction 类的 execute 方法:

public class LoginAction extends Action {

public ActionForward execute ( ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response ) {
LoginForm loginForm = ( LoginForm ) form;

String username = loginForm.getUsername();
String password = loginForm.getPassword();

if ( username.equals ( “test” ) && password.equals ( “test” ) ) {
return mapping.findForward ( “indexForword” );
} else {
return mapping.getInputForward();
}
}
}

2.7. 修改 login.jsp 文件

修改 <html:form> 标签:<html:form action=”/login”>

2.8. 测试

操作:[Menu] Run/Run,选择 MyEclipse Server Application 方式运行

要正常执行Run操作,需先安装 Tomcat5.5 。

点击 index.jsp 页面的 “Login” 链接,跳转到 login.jsp 页面。在 login.jsp 页面输入 “test/test”,应该会登录成功,然后跳转到 index.jsp 页面;输入 “test/123″ ,应该保持在 login.jsp 页面。

如果测试成功,证明 Structs 运行正常。

如果运行出错,请参考文章最后的“5. 问题集”。

3. Spring 部分


3.1. 添加 Spring 功能支持

操作:[Menu] MyEclipse/Project Capabilities/Add Spring Capabilities

Spring 版本( Spring version )选择 “Spring 1″;

开发包(libraries)选择 “Spring 1.2 AOP Libraries、Spring 1.2 Core Libraries、Spring 1.2 Persistence Core Libraries、Spring 1.2 Persistence JDBC Libraries” 四项;

JAR Library Installation 选择 “copy checked…” ,”Library Folder” 项选择 “/WebRoot/WEB-INF/lib”(这样的话所需的类库都将拷贝到项目目录,方便以后的布署)。

点击 “下一步(Next)” 创建配置文件,修改文件路径(Folder)到 “WebRoot/WEB-INF” 目录(以便和Struts配置文件一起管理),文件名称为默认的”applicationContext.xml”。

点击 “完成(Finish)” 。

3.2. 配置 struts-config.xml 文件

添加 Spring 插件(在 <message-resources> 标签后面添加):

<plug-in className=”org.springframework.web.struts.ContextLoaderPlugIn”>
<set-property property=”contextConfigLocation” value=”/WEB-INF/applicationContext.xml” />
</plug-in>

修改 LoginAction 的配置(只需修改 type 属性):

<action-mappings >
<action
attribute=”loginForm”
input=”/login.jsp”
name=”loginForm”
path=”/login”
scope=”request”
type=”org.springframework.web.struts.DelegatingActionProxy” />

</action-mappings>

绿色字体部份为被修改过的内容,这里将使用 spring 的代理器 DelegatingActionProxy 来对 Action 进行控制。

3.3. 修改 Spring 配置文件 applicationContext.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “http://www.springframework.org/dtd/spring-beans.dtd”>

<beans>
<bean name=”/login” class=”com.login.struts.action.LoginAction” singleton=”false”></bean>
</beans>

绿色字体是关于接受和处理 Action 控制权的配置内容,”com.login.struts.action.LoginAction” 即为原 struts 里的配置。

3.4. 测试

同上一次测试。测试成功证明 Spring 运行正常。

如果运行出错,请参考文章最后的“5. 问题集”。

4. Hibernate 部分

下面开始 Hibernate 部分,将原例修改为使用数据库进行用户名/密码验证。

4.1. 创建 mysql 数据库和表

添加表的代码如下:

CREATE TABLE user_table(
ID int NOT NULL auto_increment,
USERNAME varchar(45) NOT NULL default ”,
PASSWORD varchar(45) NOT NULL default ”,
PRIMARY KEY (ID)
)

再添加一条记录:

insert into user_table (USERNAME,PASSWORD) values (‘test’,'test’)

4.2. 创建 MyEclipse 数据库驱动(DB Driver)

操作:[Menu] MyEclipse/Prefrences/MyEclipse/Database Explorer/Database Driver/DB Brower

在 DB Brower 的菜单中选择 “New” ,”Driver Name” 项输入 “login-conn” ,”Connection URL” 项输入 “jdbc:mysql://localhost:3306/test” ,然后输入 MySql 的用户名(User Name)和密码(Password),按实际情况输入;

在 “Driver JARs” 项添加 “mysql-connector-java-5.0.4-bin.jar” (可从网上下载),在 “Driver classname” 里选择 “com.mysql.jdbc.Driver” ,其它自选。

点击 “完成(Finish)”。

4.3. 添加 Hibernate 功能支持

操作:[Menu] MyEclipse/Project Capabilities/Add Hibernate Capabilities

Hibernate 版本(Hibernate Specification)选择 “Hibernate 3.1″ ,开发包(libraries)选择 Hibernate 3.1 Core Libraries 一项;

JAR Library Installation 选择 “copy checked…” ,”Library Folder” 选择 “/WebRoot/WEB-INF/lib” 。

点击 “下一步(Next)” 设置配置文件:

选择 “Spring configuration file (applicationContext.xml)” 。

“下一步(Next)” 设置 Spring-Hibernate:

选择 “Existing Spring configuration file” ,”SessionFactory ID” 项输入 “sessionFactory” 。

“下一步(Next)” 创建数据源对象:

在 Bean Id 中输入 dataSource,”DataSource” 项选择 “Use JDBC Dirver” ,DB Driver 项选择 “login-conn” ,其余项会自动填充。

记得选中 “Copy DB driver jar(s) to project and add to buidpath” 项,以便将数据连接的库文件复制到项目,方便以后的布署。

“下一步(Next)” 创建 SessionFactory 类:

“Java package” 项设置为 “com.login.Hibernate” (如果没有,点击 “New” 按钮添加),”Class name” 项修改为 “SessionFactory” ,Java Compliance Level 选择和创建项目时选择的 Java 版本。(本例中并没有用到 SessionFactory 类,留作今后扩展)

点击 “完成(Finish)”。

4.4. 创建对象关系映射(ORM)的相关文件

操作:[Menu] Window/Open Perspective/MyEclipse Database Explorer

选中 user_table 表,点击右键,在出现的菜单中选择 “Hibernate Reverse Engnieering” 。

在弹出的窗口中保持 “Java package” 项为 “com.login” ;

选中 “Hibernate mapping file (*.hbm.xml) for each databases table” ,并保持 “Update hibernate…” 项选中;

选中 “Java Data Object” 项,并保持 “Create abstract class” 选中;

“Base persistent class” 项留空;

取消 “Java Data Access Object…” 项和 “Use custom templates” 项。

点击 “下一步(Next)” ,再点击 “下一步(Next)” ,在 “Configure reverse engineering details” 页选中 “user_table” 表,在右边出现的 “Class Name” 项中输入 “com.login.User”,其它不变。

点击 “完成(Finish)”。

完成此操作,会在 “com.login” 包下创建三个文件:AbstractUser.java、User.java、User.hbm.xml。

4.5. 创建 UserDAO.java 接口

操作:[Ctrl+N] Interface,点击 “下一步( Next )”

在出现的 “New Java Interface” 窗口中,将 “Source Folder” 设置为 “login/src”,将 “Package” 设置为 “com.login”, 将 “Name”  项设为 “UserDAO”,然后点击 “完成( Finish )” 按钮。

UserDAO.java 内容如下:

package com.login;

public interface UserDAO {
public abstract boolean isValidUser( String username, String password );
}

4.6. 创建 UserDAOImpl.java 类

操作:[Ctrl+N] Class,点击 “下一步( Next )”

在出现的 “New Java Class” 窗口中,将 “Source Folder” 设置为 “login/src”,将 “Package” 设置为 “com.login”, 将 “Name”  项设为 “UserDAOImpl”,在 “Supperclass” 项输入 “org.springframework.orm.hibernate3.support.HibernateDaoSupport”,在 “Interface” 项中添加 “com.login.UserDAO” 接口,然后点击 “完成( Finish )” 按钮。

UserDAOImpl 通过 Hibernate 访问数据库,做用户验证。

UserDAOImpl.java 内容如下:

package com.login;

import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

public class UserDAOImpl extends HibernateDaoSupport implements UserDAO {
private static String hql = “from User u where u.username=? “;

public boolean isValidUser( String username, String password ) {
// 验证用户
List userList = this.getHibernateTemplate().find( hql, username );
if ( userList.size() > 0 ) {
return true;
}
return false;
}
}

4.7. 修改 LoginAction.java 文件

使用 UseDAO 对象来验证:

package com.login.struts.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import com.login.struts.form.LoginForm;
import com.login.UserDAO;

public class LoginAction extends Action {
private UserDAO userDAO;

public UserDAO getUserDAO() {
return userDAO;
}

public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}

public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {

LoginForm loginForm = (LoginForm) form;
String username=loginForm.getUsername();
String password=loginForm.getPassword();

if( userDAO.isValidUser( username, password ) ){
return mapping.findForward( “indexForword” );
}else{
return mapping.getInputForward();
}
}
}

绿色字体为修改部分。

4.8. Spring 的最终配制文件 applicationContext.xml

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE beans PUBLIC “-//SPRING//DTD BEAN//EN” “
http://www.springframework.org/dtd/spring-beans.dtd”>

<beans>

<bean id=”dataSource” class=”org.apache.commons.dbcp.BasicDataSource”>
<property name=”driverClassName” value=”com.mysql.jdbc.Driver”></property>
<property name=”url” value=”jdbc:mysql://localhost:3306/test”></property>
<property name=”username” value=”root”></property>
<property name=”password” value=”root”></property>
</bean>

<!– 配置sessionFactory, 注意这里引入的包的不同 –>
<bean id=”sessionFactory” class=”org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
<property name=”dataSource”>
<ref local=”dataSource” />
</property>
<property name=”mappingResources”>
<list>
<value>com/login/User.hbm.xml</value>
</list>
</property>
<property name=”hibernateProperties”>
<props>
<prop key=”hibernate.dialect”>org.hibernate.dialect.MySQLDialect</prop>
<prop key=”hibernate.show_sql”>true</prop>
</props>
</property>
</bean>

<bean id=”transactionManager” class=”org.springframework.orm.hibernate3.HibernateTransactionManager”>
<property name=”sessionFactory”>
<ref local=”sessionFactory” />
</property>
</bean>

<bean id=”userDAO” class=”com.login.UserDAOImpl”>
<property name=”sessionFactory”>
<ref local=”sessionFactory” />
</property>
</bean>

<bean id=”userDAOProxy” class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”>
<property name=”transactionManager”>
<ref bean=”transactionManager” />
</property>
<property name=”target”>
<ref local=”userDAO” />
</property>
<property name=”transactionAttributes”>
<props>
<prop key=”insert*”>PROPAGATION_REQUIRED</prop>
<prop key=”get*”>PROPAGATION_REQUIRED,readOnly</prop>
<prop key=”is*”>PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>

<bean name=”/login” class=”com.login.struts.action.LoginAction” singleton=”false”>
<property name=”userDAO”>
<ref bean=”userDAOProxy” />
</property>
</bean>

</beans>

4.9. 测试

同第一次测试。

如果运行出错,请参考文章最后的“5. 问题集”。

5. 问题集

5.1. Console 错误信息: java.net.BindException: Address already in use: JVM_Bind:8080

  • 原因:有其它进程占用了 8080 端口,导致绑定失败。
  • 解决:如果是有 Tomcat 启动了,将其关闭,MyEclipse 会自己启动 Tomcat。

5.2. HTTP 错误信息:message Servlet action is not available

  • 原因:找不到相关类。可能配置文件中的某些类或文件的路径填写错误,或是缺少 jar 包。
  • 解决:如果是在添加 Spring 特性后产生的,可能是 /WEB-INF/lib/ 中缺少 spring.jar 包。从 MyEclipse 目录搜索出 1.2 版的 spring.jar,并将其复制到项目的 /WEB-INF/lib/ 目录下。

5.3. Console 错误信息:java.sql.SQLException: Access denied for user: ‘root@localhost’ (Using password: YES)

  • 原因:数据库访问被拒绝。可能由于 MySQL 密码被设置成空,而 MyEclipse 又不支持空密码。
  • 解决:将 MySQL 的 root 用户密码设置成非空,如 “root”,然后修改 MyEclipse 中刚才添加的 login-conn 数据源信息的密码项。
[ 标签: hibernate, j2ee, myeclipse, spring, struts ]
[ 固定链接:http://blog.tanggaowei.com/2007/12/myeclipsesshstrutsspringhibernate.html ]

订阅

 

手机访问

http://blog.tanggaowei.com/wap/

Google
 

posted @ 2011-04-28 09:39 哈希 阅读(178) | 评论 (0)编辑 收藏

public class TestClass {

    
public TestClass() {
        System.out.println(
"wll");
    }
     
     
    
    
public static void main(String[] args) {
        TestClass tc
=new TestClass();
    }
    
    
    
}

继承



排序




posted @ 2011-04-27 14:48 哈希 阅读(154) | 评论 (0)编辑 收藏


区别一:

  重定向时浏览器上的网址改变

  转发是浏览器上的网址不变

区别二:

  重定向实际上产生了两次请求

转发只有一次请求 

重定向: 

  发送请求 -->服务器运行-->响应请求,返回给浏览器一个新的地址与响应码-->浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址-->服务器运行-->响应请求给浏览器 

转发: 

  发送请求 -->服务器运行-->进行请求的重新设置,例如通过request.setAttribute(name,value)-->根据转发的地址,获取该地址的网页-->响应请求给浏览器 

区别三:

  重定向时的网址可以是任何网址

  转发的网址必须是本站点的网址

详解:

  重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

正文开始: 

  先是看上去不同,他们的调用分别如下:
request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp
response.sendRedirect("apage.jsp");//重定向到apage.jsp
在jsp页面中你也会看到通过下面的方式实现转发:
<jsp:forward page="apage.jsp" />
我在初学jsp的时候,对这两个概念非常模糊,看别人的例子的时候,也是一头雾水,不知道什么时候该用哪个。希望下面的解说能对你有所帮助。
提到转发和重定向就不得不提到request作用域。很多初学者都知道当我们提交一个表单时,就创建了一个新的请求。实际上,当我们点击一个链接时,也创建了一个新的请求。那么一个请求的作用于到底有多大呢?例如:
在页面a.jsp中有一个链接<a href="b.jsp?id=1">这是指向b的一个链接,而且还带了一个参数</a>。当我们点击这个连接的时候,就产生了一个请求,为了明确起见,我们把它叫做requestA->B。现在,在b.jsp页面中我们就可以从这个请求中获取信息了。在b.jsp中你可以写入out.println(request.getParameter("id"))进行测试。下面更复杂一点,我们在b.jsp页面中增加下面的语句:
request.setAttribute("name","funcreal");
out.println(request.getAttriblute("name"));//成功显示了name变量的值。
现在在b.jsp中再增加一个链接:<a href="c.jsp?age=23">这是指向c的一个链接,而且还带了一个参数</a>,当我们点击这个连接的时候,将产生一个新的请求,这时requestA-B也就安息了,新的请求叫做requestB-C。同样的道理,在c.jsp中,我们可以访问到的变量只有age,因为id,name这两个变量都属于requestA-B,此时他已经不存在了。下面是源代码:
a.jsp
<%@ page contentType="text/html; charset=GBK" %>
<html>
<body bgcolor="#ffffff">
<a href="b.jsp?id=1">指向b.jsp,而且还带了一个参数id=1。requestA-B现在诞生了</a>
</body>
</html> 

b.jsp
<%@ page contentType="text/html; charset=GBK" %>
<html>
<body bgcolor="#ffffff">
<%
out.println("id=" + request.getParameter("id"));
request.setAttribute("name","Func Real");
out.println("name=" + request.getAttribute("name"));
%>
<a href="c.jsp?age=23">requestA-B已经结束了。指向c.jsp,而且还带了一个参数age=23</a>
</body>
</html> 

c.jsp
<%@ page contentType="text/html; charset=GBK" %>
<html>
<body bgcolor="#ffffff">
<%
out.println("id=" + request.getParameter("id"));
out.println("name=" + request.getAttribute("name"));
out.println("age=" + request.getParameter("age"));
%>
</body>
</html> 

  那么转发又是怎么回事呢?现在增加一个页面叫做d.jsp,并且在c.jsp中</body>前面增加一句<jsp:forward page="d.jsp"/>
d.jsp
<%@ page contentType="text/html; charset=GBK" %>
<html>
<body bgcolor="#ffffff">
requestB-C的魔爪已经伸到了d.jsp页面
<%
out.println("age=" + request.getParameter("age"));
%>
</body>
</html>
运行程序,你会发现c页面中的内容没有显示出来,因为forward是自动执行的,地址栏中虽然是c.jsp但实际上,但浏览器中显示的已经是d.jsp的内容了,而且看到了从b.jsp传过来的参数。你可以简单得这样理解:转发,就是延长了requestB-C的作用域,<jsp:forward page="d.jsp"/>,这一句话实际上是把c.jsp和d.jsp粘到了一起,他们就像是在一个页面中。
如果你用过struts,那么你就知道为什么在Action中,最后一句几乎总是mapping.findForward("xxx");了。因为我们在这个Action中设置的请求作用域的变量都将会在下一个页面(也许是另一个Action)中用到,所以要用转发。 

总结:
用重定向和转发不是一个习惯问题。而是什么情况下必须用什么的问题。

posted @ 2011-04-26 23:13 哈希 阅读(176) | 评论 (0)编辑 收藏

仅列出标题
共11页: First 上一页 3 4 5 6 7 8 9 10 11 下一页