2013年10月15日

     摘要: PL/SQL Developer version 9.0.6.1665 无限用户注册码激活码 1 Product Code: 46jw8l8ymfmp2twwbuur8j9gv978m2q2du 2 serial Number:307254 3 password:xs374ca 4 License Numbe...  阅读全文

posted @ 2013-10-15 09:02 志成中国 阅读(4004) | 评论 (1)编辑 收藏


2013年1月5日

     摘要:  认识ExtJSextjs是使用javascript、css和html等技术实现的主要用于创建用户界面,且与后台技术无关的前端ajax框架。extjs来源于yui,开发理念来源于传统的桌面软件开发。1.下载extjs,解压,得到目录结构o builds:是extjs压缩后的代码,体积更小,加载更快o docs :extjs的文档o examples...  阅读全文

posted @ 2013-01-05 17:04 志成中国 阅读(1178) | 评论 (2)编辑 收藏


2012年11月9日

     摘要: 不同概率的抽奖今天为大家写个小程序。工作中有遇到一些抽奖的活动,但是你懂得,抽奖物品的概率肯定不是一样,你会发现好的东西很难抽到,经常抽到一些垃圾的东西,嘿嘿,这就是本文要说的,我们要控制抽奖物品的概率。还有顺便说一句,网上这种小程序几乎没有,很多都是等概率的抽奖balabala…需求很简单,为了更加形象,这里我们列一个表格来显示我们抽奖的物品和对应的概率(没有边框,大家凑合着看看吧,...  阅读全文

posted @ 2012-11-09 16:03 志成中国 阅读(466) | 评论 (2)编辑 收藏

Java中static、this、super、final用法

亲:本文具体讲解了Java中static的用法,具体内容有static的静态方法、静态变量、静态类。(⊙o⊙),你们觉得如何?
一、static
请先看下面这段程序:
public class Hello{
public static void main(String[] args){ //(1)
System.out.println("Hello,world!"); //(2)
}
}
 
看过这段程序,对于大多数学过Java 的从来说,都不陌生。即使没有学过Java,而学过其它的高级语言,例如C,那你也应该能看懂这段代码的意思。它只是简单的输出“Hello,world”,一点别的用处都没有,然而,它却展示了static关键字的主要用法。
在1处,我们定义了一个静态的方法名为main,这就意味着告诉Java编译器,我这个方法不需要创建一个此类的对象即可使用。你还得你是怎么运行这个程序吗?一般,我们都是在命令行下,打入如下的命令(加下划线为手动输入):
 
javac Hello.java
java Hello
Hello,world!
 
这就是你运行的过程,第一行用来编译Hello.java这个文件,执行完后,如果你查看当前,会发现多了一个Hello.class文件,那就是第一行产生的Java二进制字节码。第二行就是执行一个Java程序的最普遍做法。执行结果如你所料。在2中,你可能会想,为什么要这样才能输出。好,我们来分解一下这条语句。(如果没有安装Java文档,请到Sun的官方网站浏览J2SE API)首先,System是位于java.lang包中的一个核心类,如果你查看它的定义,你会发现有这样一行:public static final PrintStream out;接着在进一步,点击PrintStream这个超链接,在METHOD页面,你会看到大量定义的方法,查找println,会有这样一行:
 
public void println(String x)
 
好了,现在你应该明白为什么我们要那样调用了,out是System的一个静态变量,所以可以直接使用,而out所属的类有一个println方法。
静态方法
通常,在一个类中定义一个方法为static,那就是说,无需本类的对象即可调用此方法。如下所示:
class Simple{
static void go(){
System.out.println("Go...");
}
}
public class Cal{
public static void main(String[] args){
Simple.go();
}
}
 
调用一个静态方法就是“类名.方法名”,静态方法的使用很简单如上所示。一般来说,静态方法常常为应用程序中的其它类提供一些实用工具所用,在Java的类库中大量的静态方法正是出于此目的而定义的。
静态变量
静态变量与静态方法类似。所有此类实例共享此静态变量,也就是说在类装载时,只分配一块存储空间,所有此类的对象都可以操控此块存储空间,当然对于final则另当别论了。看下面这段代码:
 
class Value{
static int c=0;
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
public static void main(String[] args){
Value v1,v2;
v1=new Value();
v2=new Value();
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c);
}
}
 
结果如下:
 
v1.c=0 v2.c=0
v1.c=1 v2.c=1
 
由此可以证明它们共享一块存储区。static变量有点类似于C中的全局变量的概念。值得探讨的是静态变量的初始化问题。我们修改上面的程序:
 
class Value{
static int c=0;
Value(){
c=15;
}
Value(int i){
c=i;
}
static void inc(){
c++;
}
}
class Count{
public static void prt(String s){
System.out.println(s);
}
Value v=new Value(10);
static Value v1,v2;
static{
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1=new Value(27);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v2=new Value(15);
prt("v1.c="+v1.c+" v2.c="+v2.c);
}
public static void main(String[] args){
Count ct=new Count();
prt("ct.c="+ct.v.c);
prt("v1.c="+v1.c+" v2.c="+v2.c);
v1.inc();
prt("v1.c="+v1.c+" v2.c="+v2.c);
prt("ct.c="+ct.v.c);
}
}
 
运行结果如下:
v1.c=0 v2.c=0
v1.c=27 v2.c=27
v1.c=15 v2.c=15
ct.c=10
v1.c=10 v2.c=10
v1.c=11 v2.c=11
ct.c=11
 
这个程序展示了静态初始化的各种特性。如果你初次接触Java,结果可能令你吃惊。可能会对static后加大括号感到困惑。首先要告诉你的是,static定义的变量会优先于任何其它非static变量,不论其出现的顺序如何。正如在程序中所表现的,虽然v出现在v1和v2的前面,但是结果却是v1和v2的初始化在v的前面。在static{后面跟着一段代码,这是用来进行显式的静态变量初始化,这段代码只会初始化一次,且在类被第一次装载时。如果你能读懂并理解这段代码,会帮助你对static关键字的认识。在涉及到继承的时候,会先初始化父类的static变量,然后是子类的,依次类推。非静态变量不是本文的主题,在此不做详细讨论,请参考Think in Java中的讲解。
静态类
通常一个普通类不允许声明为静态的,只有一个内部类才可以。这时这个声明为静态的内部类可以直接作为一个普通类来使用,而不需实例一个外部类。如下代码所示:
 
public class StaticCls{
public static void main(String[] args){
OuterCls.InnerCls oi=new OuterCls.InnerCls();
}
}
class OuterCls{
public static class InnerCls{
InnerCls(){
System.out.println("InnerCls");
}
}
}
 
输出结果会如你所料。

posted @ 2012-11-09 16:01 志成中国 阅读(181) | 评论 (0)编辑 收藏

java try catch 谁先执行问题,你能说明白吗
问题1 
 try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 
也许你的答案是在return之前,但往更细地说,我的答案是在return中间执行,请看下面程序代码的运行结果: 
public  class Test {
public static void main(String[] args) {
System.out.println(new Test().test());;
}
static int test()
{
int x = 1;
try
{
return x;
}
finally
{
++x;
}
}
}
---------执行结果是什么  为什么 ---------
问题2
下面的程序代码输出的结果是多少?
public class  smallT
{
public static void  main(String args[])
{
smallT t  = new  smallT();
int  b  =  t.get();
System.out.println(b);
}
public int  get()
{
try
{
return 1 ;
}
finally
{
return 2 ;
}
}
}
       2012-6-19 16:23 满意回答 输出是1和2,
20705080 回答的很好了,只有几点补充下,首先代码例子用的是基本数据类型,他们进行传值就是传值,其次finally的用途是用来回收系统资源的,没有catch也是正常的使用(不catch,把异常throw回调用方法),再有finally和return是有关系的,而且经常有人提,就是finally的代码在return前运行,这就是我为什么先说你的例子是基本数据类型的原因,因为return x(1);被放入stack中,stack是后进先出的,等待finally运行完再运行,但他已经被赋值了就是1,如果你把代码改成这样试试看
public Something getSome(){
         Something s = new Something("Dog");
         try{
              return s;
        }finally{
             s.name ="cat";
         }}
加个类
class Something{
        public String name ;
        something(String name){
               this.name = name;}
}
因为相对于基本数据类型,引用传值传的值是个地址,return s(地址);放入stack中,又被取出时地址不变但地址那边的数据已经是cat了赞同0| 评论 
第1个
有finally的话
try 里的return    是先保存x的结果   等待finally走完   虽然x变2了  但是return的值还是1  
因为到return的时候已经把x的值取出来  等待finally走完  不管x怎么变  之前的1是不会变的
第2个
return     等待finally走完   但是finally里return了   所以返回的是2
    赞同0| 评论                2012-6-19 14:54 畅捷通丶稀饭 | 五级 
第一个是1,因为 x=1 try里面返回的是1 后面又执行了finally 后。X 是2 但是没有返回。所以 还是1
第二个是2,因为finally最后执行,返回的是2. 赞同0| 评论                2012-6-19 14:56 java2000_net | 
finally中的语句是一定要执行的,这点是肯定的。finally中的语句执行在try之后。通常try是要和catch(不捕获异常try就没意义了)。一般的用法是:
try{
1想要执行的代码
}catch(Exception e){
 2异常处理
}finally{
3最终执行的代码
}
1中代码没错执行的顺序就是1->3
1中代码有错执行的顺序是2->3
finally中的代码和return是没关系的,你可以把return写在任何地方。它只和try、catch有关。假如你把问题一种finally的代码写成:
finally{
return ++x;
}那么结果就是2了。
finally一定会执行,且在try或catch之后执行。
不知道这么说能明白吗~~~
不明白可以问,我再回答~~~ 赞同0| 评论                2012-6-19 15:22 黑夜也明亮 | 四级 
问题1:答案 1。因为return的值在执行finally之前已经确定下来了。所以即使在finally里怎么该值它始终是1,除非在finally里在return ++x重新修改返回的值。return x它不会直接返回值回去而是等程序执行完finaly后才返回。
你因该有听过有finaly的程序一定会执行finaly代码吧。
问题2:答案 2。根据一的结论二也是成立的。 赞同0| 评论                2012-6-19 16:41 iedgtg | 五级 
第一个问题:输出的是1,因为finally总是在try-catch执行之后执行,而且,一定是在return之前执行。第一个问题里应该是在return x;之前执行,但是,此时return的值已经固定了,就是说finally再执行也改变不了return的值,当然x的值成了2,但是return的值已经固定为1了。
第二个问题:输出的是2,因为finally一定是在return之前执行,本来程序return的值是1,即将要return了,但是有finally,所以finally先执行,所以return的值是2。
但是第二种情况不建议使用,就是说finally里不建议用return,因为这样finally就没有正常的执行完毕,这是不推荐的。 赞同0| 评论         

posted @ 2012-11-09 16:00 志成中国 阅读(184) | 评论 (0)编辑 收藏

GET与Post提交问题: ---------------------------------------------- 运行login.jsp点登陆时调用两次toLoginAction /WEB-INF/jsp/main/main.jsp /WEB-INF/jsp/user/login_form.jsp 所以取得结果在toLoginAction的execute里运行两次 String pass = iuserDao.findPassWordByEmail(email); System.out.println(email); System.out.println(pass); 也输出两次:条件不同,输出内容不同 当login_form.jsp里的表单 使用post方式提交时,控制台输出如下: root@root.com root null null 当login_form.jsp里的表单 使用get方式提交时,控制台输出如下: root@root.com root root@root.com root 解决方案一:加struts的token拦截器,只让表单提交一次。 解决方案二:转一个action,就是把他自动提交的那个请求通过action的转发取消掉。 问题: 为什么get和post的默认请求后取到的值会不同? 为什么在window的电脑里没有问题? ---------------------------------------------- 在window下,正常输出如下: root@root.com root ---------------------------------------------- 缓存问题(服务器缓存或者浏览器缓存或者浏览器bug),导致提交两次,与操作系统、程序、js提交是没关系! get:通过URL路传参,当页面再次提交,还会把URL中的值传递给action,所有属性再次被填充就不出现null值 post:URL路径没有信息,当再次提交,就出现属性就出现null值 你在学生机器上,把在tomcat中work目录删除、在把\webapps 中项目删除,把web容器缓存清空下! 或者把学生机器重新启动下,把服务器缓存彻底清除下! ---------------------------------------------- ---------------------------------------------- 图片:struts-user.xml配置如下: ---------------------------------------------- ToLoginAction类如下 : ---------------------------------------------- 进入主页面的URL如: ---------------------------------------------- 登陆的URL如: ---------------------------------------------- 登陆界面: ---------------------------------------------- windwo系统下提交输出如图: ---------------------------------------------- Linux系统下,采用get提交时 ---------------------------------------------- Linux系统下,采用post提交时 ---------------------------------------------- 最后在学生电脑上又试了几次,get方式提交正常和window系统下一样了,post方式 提交还是没改变,不知道为什么。 ---------------------------------------------- 邮件内容如下: 发件人:贾东坡 发送时间: 2012-11-08 09:37 收件人:zhaozq 主题: dang_get_post 赵老师: 您好。学生的程序有点问题,想听一下您的理解。问题描述如下: 进入当当网的main页面,点登陆输入用户名,密码后,点登陆会请求ToLoginAction, 进入main页面。在ToLoginAction里打印了email和pass,登陆之后输出结果在linux 系统下与window下不同。window系统下正常输出,而在linux系统下有输出两次,并且 login_form.jsp时表单提交方法为get时,两次都能正常输出;当提交方式为post里,第 二次为null。例如: 在window系统下: 我们在输入框,输入用户名:root@qq.com 密码root,会输出如下: root@qq.com root 在linux系统下 当login_form.jsp的表单提交为get时,输出root@qq.comroot时, 输出如下: root@qq.com root root@qq.com root 当login_form.jsp的表单提交为post时,输入root@qq.comroot时, 输出如下: root@qq.com root null null 原因分析:首先想的是submit按钮在使用js时,有自动提交功能,可是也没使用js啊, 还有在linux系统有自己的form机制。还有一个是程序有问题。 解决方案:我给这个action加了个token表单拦截器就可以。说明是表单提交两次。 问题是:1.为什么表单会提交两次,而在window下只提交一个。 2.为什么在linux下用get和post提交方式第二次取到的值会不一样。 3. form提交时在linux系统下与window有什么不一样。 附件内是程序源码,谢谢您的宝贵时间。 祝: 身体健康,工作顺利! 贾东坡北方区 北方基地项目部 项目经理 E-mail: jiadp@tarena.com.cn Address: 北京市昌平区北七家镇宏富创业园科技园综合楼3层 Mobile: 18301442726 Fax: 86-10-82823773 Website: www.tarena.com.cn ---------------------------------------------- 发件人:zhaozq 发送时间: 2012-11-08 11:21 收件人:jiadp 主题: 回复: dang_get_post 贾老师: 您好! 你们班的学生机器是不是采用的是云服务器? zhaozq ---------------------------------------------- 赵老师: 您好。我们班的机器都是普通主机,linux系统的,不是用核的,也不是云服务器。 谢谢您的宝贵时间。 ---------------------------------------------- 贾老师: 您好! 缓存问题(服务器缓存或者浏览器缓存或者浏览器bug),导致提交两次,与操作系统、程序、js提交是没关系! get:通过URL路传参,当页面再次提交,还会把URL中的值传递给action,所有属性再次被填充就不出现null值 post:URL路径没有信息,当再次提交,就出现属性就出现null值 你在学生机器上,把在tomcat中work目录删除、在把\webapps 中项目删除,把web容器缓存清空下! 或者把学生机器重新启动下,把服务器缓存彻底清除下! zhaozq ---------------------------------------------- 赵老师: 您好。您的分析很有道理,可是我用另外几台电脑,试了也不行,所以不该是缓存问题。 浏览器bug,这个还没测试,因为所有学生的电脑都是同样的系统,同样的浏览器,都是这个 情况。要是缓存问题,怎么可能用token拦截了,拦截下的是缓存的,还是我自己提交的,以及 在哪地方缓存。还有个问题就是,在web学习的时候也有表单提交,为什么就没有这种情况,是 不是和struts有关。 谢谢,您的宝贵时间。 ---------------------------------------------- 赵老师回复: 您好。您的分析很有道理,可是我用另外几台电脑,试了也不行,所以不该是缓存问题。 浏览器bug,这个还没测试,因为所有学生的电脑都是同样的系统,同样的浏览器,都是这个 情况。要是缓存问题,怎么可能用token拦截了,拦截下的是缓存的,还是我自己提交的,以及 token不是拦截了,而是令牌值相同不在提交,不是在window 系统提交没问题吗?那就与程序无关了,那就是系统 缓存或者浏览器缓存中,正常当浏览器关闭,缓存中数据就清除,但是如果机房比较热、服务器处于长期运营等情况都会导致缓存信息无法清空,而影响程序执行 在哪地方缓存。还有个问题就是,在web学习的时候也有表单提交,为什么就没有这种情况,是 缓存 不是和struts有关。 和struts没有关系,而是与计算机硬件设备有关,这个影响具体什么时候会造成,这个都不能预计,这种情况一般比较少见。 祝: 身体健康,工作顺利! ---------------------------------------------- 赵老师: 您好。谢谢您的详细解答,真是受益匪浅,这个问题可以划上句话了。同学们都很喜欢听 您讲课,风趣幽默、也易于接受,期待您更多的讲解。 谢谢,您的精神讲解。您辛苦了。 祝: 身体健康,工作顺利! ---------------------------------------------- ---------------------------------------------- Debug linux系统下截图如下: ---------------------------------------------- get方式时:正常情况下:输出和win一样了。 root@root.com root ---------------------------------------------- post方式时:输出如下: root@root.com root null null -------------------------------------------------------------------------------------------

posted @ 2012-11-09 15:49 志成中国 阅读(1185) | 评论 (0)编辑 收藏


2012年10月20日

 大多数程序员都知道Servlet的生命周期,简单的概括这就分为四步:servlet类加载--->实例化--->服务--->销 毁。对这个过程只是肤浅了解下,对于servlet何时被销毁,还是不太情楚。下面我们描述一下Tomcat与Servlet是如何工作的,首先看下面的 时序图.

1、Web Client 向Servlet容器(Tomcat)发出Http请求

2、Servlet容器接收Web Client的请求

3、Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中

4、Servlet容器创建一个HttpResponse对象

5、Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数

     传给 HttpServlet对象

6、HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息

7、HttpServlet调用HttpResponse对象的有关方法,生成响应数据

8、Servlet容器把HttpServlet的响应结果传给Web Client

 

对于Servlet容器(Tomcat)与HttpServlet是怎样进行交互的呢,看下类图

Servlet的框架是由两个Java包组成的:javax.servlet与javax.servlet.http。在javax.servlet包中 定义了所有的Servlet类都必须实现或者扩展的通用接口和类。在javax.servlet.http包中定义了采用Http协议通信的 HttpServlet类。Servlet的框架的核心是javax.servlet.Servlet接口,所有的Servlet都必须实现这个接口。

在Servlet接口中定义了5个方法,

其中3个方法代表了Servlet的生命周期:

1、init方法:负责初始化Servlet对象。

2、service方法:负责响应客户的请求。

3、destroy方法:当Servlet对象退出生命周期时,负责释放占用的资源。

 

一、创建Servlet对象的时机

1、Servlet容器启动时:读取web.xml配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,同时将ServletConfig对象作为参数来调用Servlet对象的init方法。

2、在Servlet容器启动后:客户首次向Servlet发出请求,Servlet容器会判断内存中是否存在指定的Servlet对象,如果没有则创建 它,然后根据客户的请求创建HttpRequest、       HttpResponse对象,从而调用Servlet

     对象的service方法。

3、Servlet的类文件被更新后,重新创建Servlet

      Servlet容器在启动时自动创建Servlet,这是由在web.xml文件中为Servlet设置的<load-on-startup>属性决定

      的。从中我们也能看到同一个类型的Servlet对象在Servlet容器中以单例的形式存在。

二、销毁Servlet对象的时机

1、Servlet容器停止或者重新启动:Servlet容器调用Servlet对象的destroy方法来释放资源。以上所讲的就是Servlet对象的生命周期。那么Servlet容器如何知道创建哪一个Servlet对象?

Servlet对象如何配置?实际上这些信息是通过读取web.xml配置文件来实现的。

我们来看一下web.xml文件中的Servlet对象的配置节信息

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

<servlet>

    <servlet-name>action<servlet-name>

    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>

    <init-param>

        <param-name>config</param-name>

        <param-value>/WEB-INF/struts-config.xml</param-value>

    </init-param>

    <init-param>

        <param-name>detail</param-name>

        <param-value>2</param-value>

    </init-param>

    <init-param>

        <param-name>debug</param-name>

        <param-value>2</param-value>

    </init-param>

    <load-on-startup>2</load-on-startup>

</servlet>

<servlet-mapping>

    <servlet-name>action</servlet-name>

    <url-pattern>*.do</url-pattern>

</servlet-mapping>

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

下面对上面的配置节信息进行解析

servlet-name:Servlet对象的名称

servlet-class:创建Servlet对象所要调用的类

param-name:参数名称

param-value:参数值

load-on-startup:Servlet容器启动时加载Servlet对象的顺序

servlet-mapping/servlet-name:要与servlet中的servlet-name配置节内容对应

url-pattern:客户访问的Servlet的相对URL路径

 

       当Servlet容器启动的时候读取<servlet>配置节信息,根据<servlet-class>配置节信息创建 Servlet对象,同时根据<init-param>配置节信息创建HttpServletConfig对象,然后执行Servlet对象 的init方法,并且根据<load-on-startup>配置节信息来决定创建Servlet对象的顺序,如果此配置节信息为负数或者没 有配置,那么在Servlet容器启动时,将不加载此Servlet对象。当客户访问Servlet容器时,Servlet容器根据客户访问的URL地 址,通过<servlet-mapping>配置节中的<url-pattern>配置节信息找到指定的Servlet对象,并 调用此Servlet对象的service方法。

 

为了验证下,我新建了一个web app工程,新建一个Servlet,如下:

Java代码  收藏代码
  1. package com.tdt.servlet;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import javax.servlet.ServletException;  
  6. import javax.servlet.http.HttpServlet;  
  7. import javax.servlet.http.HttpServletRequest;  
  8. import javax.servlet.http.HttpServletResponse;  
  9.   
  10. public class TestServlet extends HttpServlet {  
  11.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  12.             throws ServletException, IOException {  
  13.         this.doPost(request, response);  
  14.     }  
  15.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  16.             throws ServletException, IOException {  
  17.   
  18.         response.setContentType("text/html");  
  19.         PrintWriter out = response.getWriter();  
  20.         out.println("Hello,this is a test");  
  21.       
  22.         out.flush();  
  23.         out.close();  
  24.     }  
  25.   
  26.     public void destroy() {  
  27.         System.err.println(getServletName()+"生命周期结束");;  
  28.     }  
  29.       
  30.     public void init() throws ServletException {  
  31.         System.out.println(getServletName()+"执行初始化");  
  32.     }  
  33. }  

 当servlet被销毁时会在控制台上打印提示语句,不过我发现在tomcat中,只要不停止web容器,servlet是不会被销毁的。有没有什么方 法,当service方法执行完毕就销毁这个servlet呢,我问了下老师,他说写一个监听器,不过我不知道怎么去实现它,如果有朋友知道实现的过程, 还请赐教。

posted @ 2012-10-20 13:01 志成中国 阅读(244) | 评论 (0)编辑 收藏

     摘要: Oracle学习共享、基础加强学习  阅读全文

posted @ 2012-10-20 12:57 志成中国 阅读(56) | 评论 (0)编辑 收藏


仅列出标题  

posts - 9, comments - 5, trackbacks - 0, articles - 0

Copyright © 志成中国