??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲AV无码一区二三区,亚洲熟女乱综合一区二区,91亚洲导航深夜福利http://m.tkk7.com/libin2722/category/25732.html虚其心,可解天下之问Q专其心Q可d下之学;静其心,可悟天下之理Q恒其心Q可成天下之业?/description>zh-cnSun, 02 Aug 2009 02:04:13 GMTSun, 02 Aug 2009 02:04:13 GMT60利用开源组件制作验证码 Captchahttp://m.tkk7.com/libin2722/articles/288850.htmlC物C物Wed, 29 Jul 2009 02:37:00 GMThttp://m.tkk7.com/libin2722/articles/288850.htmlhttp://m.tkk7.com/libin2722/comments/288850.htmlhttp://m.tkk7.com/libin2722/articles/288850.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/288850.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/288850.html

jsp验证码制?/p>

 

  介绍两个功能强大的开源制作验证码lgSimpleCaptchaQJCAPTCHA?/p>

 

  一、SimpleCaptcha搜狐邮箱注册时就使用了该lgQ主?
  http://simplecaptcha.sourceforge.net/index.html

 

example


 1.配置
  下载的jar文g攄工程的lib目录下,打开工程的web.xml文g加上相应的配|?br /> <servlet>
  <servlet-name>Captcha</servlet-name>
  <servlet-class>nl.captcha.servlet.CaptchaServlet</servlet-class>
  <!--Ҏ昄参数-->
  <init-param>
   <param-name>cap.border</param-name>
   <param-value>yes</param-value>
  </init-param>

  <!-- 讄囄Ҏ?-->
  <init-param>
   <param-name>cap.border.c</param-name>
   <param-value>green</param-value>
  </init-param>

  <!-- Ҏ_细-->
  <init-param>
   <param-name>cap.border.th</param-name>
   <param-value>1</param-value>
  </init-param>

  <!-- the image producer. Currently only one-->
  <init-param>
   <param-name>cap.cap.producer</param-name>
   <param-value>
    nl.captcha.obscurity.imp.DefaultCaptchaIml
   </param-value>
  </init-param>

  <!-- 讄验证码的内容 -->
  <init-param>
   <param-name>cap.text.producer</param-name>
   <!--<param-value>Default</param-value>-->
   <!-- 此处是我自定义的一个显CZ文的c?-->
   <param-value>org.ChineseTextProducer</param-value>
  </init-param>

  <!-- 此处可不定义Q可在自定义cM定义所有的要显C的内容 -->
  <init-param>
   <param-name>cap.char.arr</param-name>
   <param-value>
    2,3,4,6,7,8,9,a,b,c,d,e,f,g,h,j,k,l,m,n,o,p,q,r,s,t,u,v,x,y,z
   </param-value>
  </init-param>

  <!-- 讄囄昄内容长度 -->
  <init-param>
   <param-name>cap.char.arr.l</param-name>
   <param-value>4</param-value>
  </init-param>

  <init-param>
   <param-name>cap.font.arr</param-name>
   <!-- 如果使用中文时设|成中文的字?-->
   <param-value>
    Arial,Helvetica,Courier,TimesRoman,宋体,黑体
   </param-value>
  </init-param>

  <!-- 讄字体大小 -->
  <init-param>
   <param-name>cap.font.size</param-name>
   <param-value>30</param-value>
  </init-param>

  <!-- 讄囄字体?-->
  <init-param>
   <param-name>cap.font.color</param-name>
   <param-value>white</param-value>
  </init-param>
  
  <!-- 扭曲; 曲解; 变Ş begin -->
  <!-- 囄效果1
  <init-param>
   <param-name>cap.obscurificator</param-name>
   以下任选一
   <param-value>nl.captcha.obscurity.imp.ShadowGimpyImp</param-value>
   <param-value>nl.captcha.obscurity.imp.WaterRiple</param-value>
   <param-value>nl.captcha.sandbox.TestGimpyImp</param-value>
  </init-param>
  -->
  <init-param>
   <param-name>cap.obscurificator</param-name>
   <param-value>org.FishEyeGimpyImp</param-value>
  </init-param>

  <init-param>
   <param-name>cap.border</param-name>
   <param-value>no</param-value>
  </init-param>

  <init-param>
   <param-name>cap.char.arr.l</param-name>
   <param-value>6</param-value>
  </init-param>

  <init-param>
   <param-name>cap.background.c.to</param-name>
   <param-value>white</param-value>
  </init-param>
  
  <init-param>
   <param-name>cap.background.c.from</param-name>
   <param-value>white</param-value>
  </init-param>
  <!--扭曲; 曲解; 变Ş end 不想要这U效果可注释以上代码-->


  <init-param>
   <param-name>cap.distortionImp</param-name>
   <param-value />
  </init-param>

  <init-param>
   <param-name>cap.backgroundImp</param-name>
   <param-value />
  </init-param>

  <!-- 此处色ؓ渐变的色 -->
  <init-param>
   <param-name>cap.background.c.to</param-name>
   <param-value>black</param-value>
  </init-param>

  <!-- 囄左边?-->
  <init-param>
   <param-name>cap.background.c.from</param-name>
   <param-value>black</param-value>
  </init-param>

  <!--q扰U实现类-->
  <init-param>
   <param-name>cap.noiseImp</param-name>
   <param-value>nl.captcha.obscurity.imp.DefaultNoiseImp</param-value>
  </init-param>

  <!-- q扰U色
  <init-param>
   <param-name>cap.noise.c</param-name>
   <param-value>255,245,219</param-value>
  </init-param>
   -->
 </servlet>
 <servlet-mapping>
  <servlet-name>Captcha</servlet-name>
  <url-pattern>/Captcha.jpg</url-pattern>
 </servlet-mapping>
  以上配置可根据喜好设|?/p>

 

 2、调用显C?/p>

 在要昄验证码的面中加?lt;img src="Captcha.jpg">卛_昄生成的验证码

 

 3、后台验?br /> 验证非常单,通过session.getAttribute(nl.captcha.servlet.Constants.SIMPLE_CAPCHA_SESSION_KEY);卛_得到lg生成
的验证码Q然后与前台传递的用户填写的内Ҏ较即可?br /> 
 注:如果要自定义验证码的内容可以l承DefaultTextCreatorc,覆写getText()Ҏ卛_Q方法返回的是一个字W串?/p>

 

  二、JCAPTCHAQ该lg功能非常强大Q可以生成word、图片、声音等验证码。主:
 http://forge.octo.com/jcaptcha/confluence/display/general/Home
 http://jcaptcha.sourceforge.net/

 

example
 更多实例可以查看Q?a >http://forge.octo.com/jcaptcha/confluence/display/general/Samples+tests


 1、配|?br /> 下蝲JCAPTCHA后将jcaptcha.jar和commons-collections-2.1以上.jar(单独下蝲Q地址Q?a >http://commons.apache.org/collections/)攄工程lib目录下?/p>

 

 2、Implement a CaptchaService

 import com.octo.captcha.service.image.ImageCaptchaService;
 import com.octo.captcha.service.image.DefaultManageableImageCaptchaService;

 public class CaptchaServiceSingleton {

     private static ImageCaptchaService instance = new DefaultManageableImageCaptchaService();

     public static ImageCaptchaService getInstance(){
         return instance;
       }
 }

 

 3、编写一个生验证码?span class="hilite4">servlet
 
 public class ImageCaptchaServlet extends HttpServlet {
 
 protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse)
       throws ServletException, IOException {

        byte[] captchaChallengeAsJpeg = null;
     
        ByteArrayOutputStream jpegOutputStream = new ByteArrayOutputStream();
        try {
        String captchaId = httpServletRequest.getSession().getId();
       
         BufferedImage challenge =
                    CaptchaServiceSingleton.getInstance().getImageChallengeForID(captchaId,
                            httpServletRequest.getLocale());
            JPEGImageEncoder jpegEncoder = JPEGCodec.createJPEGEncoder(jpegOutputStream);
            jpegEncoder.encode(challenge);
        } catch (IllegalArgumentException e) {
            httpServletResponse.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        } catch (CaptchaServiceException e) {
            httpServletResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            return;
        }

        captchaChallengeAsJpeg = jpegOutputStream.toByteArray();

        httpServletResponse.setHeader("Cache-Control", "no-store");
        httpServletResponse.setHeader("Pragma", "no-cache");
        httpServletResponse.setDateHeader("Expires", 0);
        httpServletResponse.setContentType("image/jpeg");
        ServletOutputStream responseOutputStream =
                httpServletResponse.getOutputStream();
        responseOutputStream.write(captchaChallengeAsJpeg);
        responseOutputStream.flush();
        responseOutputStream.close();
    }
}


 4、将servletd到web.xml文g?br /> <servlet>
         <servlet-name>jcaptcha</servlet-name>
         <servlet-class>ImageCaptchaServlet</servlet-class>
         <load-on-startup>0</load-on-startup>
        </servlet>

 <servlet-mapping>
         <servlet-name>jcaptcha</servlet-name>
         <url-pattern>/jcaptcha</url-pattern>
 </servlet-mapping>

 

 5、在面中显C?br /> <img src="jcaptcha">
 <input type='text' name='captcha_code' value=''>

 

 6、后台验?br /> Boolean isResponseCorrect =Boolean.FALSE;
        String captchaId = httpServletRequest.getSession().getId();
        String response = httpServletRequest.getParameter("captcha_code");
        try {
                isResponseCorrect = CaptchaServiceSingleton.getInstance().validateResponseForID(captchaId,response);
        } catch (CaptchaServiceException e) {
  //TODO
        }
 最单的开发过E结束,试运行一下效果!
 
 注:要实现自q验证引擎可以l承ListImageCaptchaEngine实现抽象ҎbuildInitialFactories()?/p>

C物 2009-07-29 10:37 发表评论
]]>
java 国际?资源文g的?(i18n)http://m.tkk7.com/libin2722/articles/207836.htmlC物C物Sat, 14 Jun 2008 03:01:00 GMThttp://m.tkk7.com/libin2722/articles/207836.htmlhttp://m.tkk7.com/libin2722/comments/207836.htmlhttp://m.tkk7.com/libin2722/articles/207836.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/207836.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/207836.htmlJava国际化——资源包的?/h3>
本文是由JRL写作的《J2SEq阶》一书的部分章节整理而成Q《J2SEq阶》正在写作、完善阶Dc您阅读后,有Q何徏议、批评,?a class="l2" href="mailto:ok_winnerboy@sina.com" target="_blank">和我联系Q或?a ?>http://www.javaresearch.org/forum/thread.jsp?column=376&thread=7576' target='_blank' class='l2'>q儿留言。《J2SEq阶》写作项目组感谢您阅L文?/u>

在当今这个信息社会,其是随着互联|的出现和普及,Z之间的距L以往M时候都更加接近Q同时交往也更加频J,时下最旉的概念就是地球村Q而我时候只知道我出生的那个乡村。距近Q交往频繁Qh们就不得不考虑如何M各个不同U族、不同区域的Z打交道。对人如此,Ҏ们的软g亦是如此Q你需要考虑如何让处于世界不同地方的使用者都能够很好C用你的Y件。于是,在每个Y件开始之前,~写者都可能需要考虑q样一个问题——国际化?br />
我们知道Q在Java中可以通过java.util.LocalecL唯一地确定特定语a和国家的l合Q即抽象最l用L使用环境。同时将用户相关的一些信息置于资源包中,通过资源包来动态地获得最l的用户昄。资源包可以p源文件或者资源子cL具体实现?br />
注意Q本文只打算讨论国际化过E中资源包的使用技巧,更多更精彩的内容Q请期待《J2SEq阶》一书?/strong>

资源?/h4>
在编写应用程序的时候,需要面对的一个问题是如何来处理与locale相关的一些信息。比如,面上的一些静态文本就希望能够以用户习惯的语言昄。最原始的做法是这些信息硬~码到程序中Q可能是一大串判断语句Q,但是q样将E序代码和易变的locale信息捆绑在一P以后如果需要修改locale信息或者添加其它的locale信息Q你׃得不重新修改代码。而资源包可以帮助你解册个问题,它通过可变的locale信息攑օ资源包中来达C者分ȝ目的。应用程序可以自动地通过当前的locale讄到相应的资源包中取得所要的信息。资源包的概늱gWindows~程人员使用的资源文Ӟrc文gQ?br />
一般来_资源包需要完成两个功能:和具体的localeq行l定以及dlocale相关信息?br />

ResourceBundlec?/h5>
你可以把资源包看作ؓ一个由许多成员Q子c)l成的大家庭Q其中每个成员关联到不同的locale对象Q那它是如何完成兌功能的呢Q?br />
资源包中的每个成员共享一个被UC基名Qbase nameQ的名称Q然后在此基上根据一定的命名规范q行扩展。下面就列出了一些成员的名称Q?br />     LabelResources
         LabelResources_de
         LabelResources_de_CH
         LabelResources_de_CH_UNIX
可见q些子类依据q样的命名规范:baseName_language_country_variantQ其中language{几个变量就是你在构造LocalecL所使用的。而资源包正是通过q个W合命名规范的名U来和localeq行兌的,比如LabelResource_de_CH对应于由d语(deQ和瑞士QCHQ组成的locale对象?br />
当你的应用程序需要查扄定locale对象兌的资源包Ӟ它可以调用ResourceBundle的getBundleҎQƈlocale对象作ؓ参数传入?br />
  1. Locale currentLocale = new Locale("de""CH""UNIX");
  2. ResourceBundle myResources =
  3.       ResourceBundle.getBundle("LabelResources", currentLocale);

如果该locale对象匚w的资源包子类找不刎ͼgetBundle试着查找最匚w的一个子cR具体的查找{略是这LQgetBundle使用基名Qlocale对象和缺省的locale来生成一个候选资源包名称序列。如果特定locale对象的语a代码、国家代码和可选变量都是空|则基名是唯一的候选资源包名称。否则的话,具体locale对象Qlanguage1Qcountry1和variant1Q和~省localeQlanguage2Qcountry2和variant2Q将产生如下的序列:

  • baseName + "_" + language1 + "_" + country1 + "_" + variant1
  • baseName + "_" + language1 + "_" + country1 
  • baseName + "_" + language1 
  • baseName + "_" + language2 + "_" + country2 + "_" + variant2 
  • baseName + "_" + language2 + "_" + country2 
  • baseName + "_" + language2 
  • baseName 

然后QgetBundleҎ按照产生的序列依ơ查扑֌配的资源包子cdƈ对结果子cd始化。首先,它将Lcd匚w候选资源包名称的类Q如果找到将创徏该类的一个实例,我们UC为结果资源包。否则,getBundleҎ寻扑֯应的资源文gQ它通过候选资源包名称来获得资源文件的完整路径Q将其中?#8220;.”替换?#8220;/”Qƈ加上“.properties”后缀Q,如果扑ֈ匚w文gQgetBundleҎ利用该资源文g来创Z个PropertyResourceBundle实例Q也是最l的l果资源包。与此同ӞgetBundleҎ会将q些资源包实例缓存v来供以后使用?br />
如果没有扑ֈl果资源包,该方法将抛出MissingResourceException异常。所以ؓ了防止异常的抛出Q一般来说都需要至实C个基名资源包子类?br />
注意Q基名参数必L一个完整的cdUͼ比如LabelResourcesQresource.LabelResources{)Q就相当于你引用一个类旉要指定完整的c\径。但是,Z和以前的版本保持兼容Q在使用PropertyResourceBundles时也允许使用“/”来代?#8220;.”表示路径?/strong>

比如你有以下q些资源cd资源文gQMyResources.classQ?nbsp;MyResources_fr_CH.propertiesQ?nbsp;MyResources_fr_CH.classQ?nbsp;MyResources_fr.propertiesQ?nbsp;MyResources_en.propertiesQ?nbsp;MyResources_es_ES.class。你利用以下的locale讄来调用getBundleҎQ你会得到不同的结果资源包Q假讄省locale为Locale(“en”, “UK”)Q,请参考表13.4?br />        ?3.4 locale讄与结果资源包
locale讄        l果资源?br /> Locale("fr", "CH")    MyResources_fr_CH.class
Locale("fr", "FR")        MyResources_fr.properties
Locale("de", "DE")        MyResources_en.properties
Locale("en", "US")        MyResources_en.properties
Locale("es", "ES")        MyResources_es_ES.class

创徏了具体的资源包子cd例以后,需要获得具体的信息。信息在资源包中是以键值对的方式存储的Q表13.5列出的是LabelResources.properties文g的内宏V?br />
?3.5 LabelResources.properties
  1. # This is LabelResources.properties file
  2. greetings = 您好Q?
  3. farewell = 再见?
  4. inquiry = 您好吗?

其中{号左边的字W串表示主键Q它们是唯一的。ؓ了获得主键对应的|你可以调用ResourceBundlecȝgetStringҎQƈ主键作为参数。此外,文g中以“#”号开头的行表C注释行?br />
ListResourceBundle和PropertyResourceBundle子类

抽象cResourceBundleh两个子类QListResourceBundle和PropertyResourceBundleQ它们表C源包子类两种不同的实现方式?br />
PropertyResourceBundle是和资源文g配对使用的,一个属性文件就是一个普通的文本文gQ你只需要ؓ不同的locale讄~写不同名称的资源文件。但是,在资源文件中只能包含字符Ԍ如果需要存储其它类型对象,你可以用ListResourceBundle?br />
ListResourceBundle是将键值对信息保存在类中的列表中,而且你必d现ListResourceBundle的具体子cR?br />
如果ListResourceBundle和PropertyResourceBundle不能够满你的需要,你可以实现自qResourceBundle子类Q你的子cd覆盖两个方法:handleGetObject和getKeys?br />
使用资源文g

使用资源包最单的Ҏ是利用资源文gQ利用资源文件一般需要以下几个步骤:
1、创Z个缺省的资源文g
Z防止找不到资源文Ӟ你最好实C个缺省的资源文gQ该文g的名UCؓ资源包的基名加上.properties后缀?br /> 2、创建所需的资源文?br /> Z准备支持的locale讄~写对应的资源文件?br /> 3、设|locale
你必dE序中的某个地方提供locale的设|或者切换功能,或者将其放入配|文件中?br /> 4、根据locale讄创徏资源?br /> ResourceBundle resource =
        ResourceBundle.getBundle("LabelBundle",currentLocale);
5、通过资源包获取locale相关信息
String value = resource.getString("welcome");

注意Q在使用基名的时候,特别要注意给出完整的cdQ或者\径名Q,比如你的应用E序所在的cd为org.javaresearch.j2seimproved.i18nQ而你的资源文件在你的应用E序下的resource子目录中Q那你的基名应该是org.javaresearch.j2seimproved.i18n.resource.LabelBundleBundle而不是resource.LabelBundleBundle?br />

使用ListResourceBundle

使用ListResourceBundle和用资源文件的步骤基本上一P只不q你需要用ListResourceBundle子类来替换相应的资源文g。比如你的应用程序的基名是LabelBundleQ而且准备支持Locale("en","US")和Locale("zh","CN")Q那你需要提供以下几个Java文gQ注意类名和locale的对应关pR?br /> LabelBundle_en_US.java
LabelBundle_zh_CN.java
LabelBundle.javaQ缺省类Q?br />
代码13.3列出的是LabelBundle_zh_CN.java的源代码Q相对于资源文g?#8220;key = value”的写法,在此文g中你首先利用键值对来初始化一个二l数l,q在getContentsҎ中返回该数组?br />       
代码13.3QLabelBundle_zh_CN.java
  1. package org.javaresearch.j2seimproved.i18n;import 
  2. java.util.ListResourceBundle;
  3. public class LabelBundle_zh_CN extends ListResourceBundle {   
  4.   public Object[][] getContents() {     
  5.     return contents;   
  6.   }   
  7.   private Object[][] contents = {      
  8.     {"title""U谓"},      
  9.     {"surname""?},      
  10.     {"firstname""?},   
  11.   };
  12. }


创徏完资源类以后Q同样需要设|locale以及Ҏlocale来创源包。在通过资源包获取具体值的时候,你不能再使用getStringҎQ而应该调用getObjectҎQ而且׃getObjectҎq回一个Object对象Q你q需要进行正的cd转换。其实,Z你的E序通用性,我们在用资源文件的时候你也应该调用getObjectҎQ而不是getStringҎ?br />
  1.     String title = (String)resource.getObject("title");

关于ListResourceBundle的详l用,可以参考本书所附代码中国际化一节的ListResourceBundleSample.javaE序?br />
MessageFormatc?/h5>
上面我们讲到利用资源文g来分M码和可变的信息。但是在实际q程中,有些信息q不能够完全事先定义好,其中可能会用到运行时的一些结果,最典型例子的就是错误提CZ码,比如提示某个输入必须在一定范围内。利用上面所讲的资源文gq不能够很好地解册个问题,所以Java中引入了MessageFormatcR?br />
MessageFormat提供一U语a无关的方式来l装消息Q它允许你在q行时刻用指定的参数来替换掉消息字符串中的一部分。你可以为MessageFormat定义一个模式,在其中你可以用占位符来表C变化的部分Q比如你有这样一句话Q?br />
您好Q?u>peachpi
Q欢q来到Java研究l织|站Q当前时间是Q?u>2003-8-1 16:43:12?/u>

其中斜体带下划线的部分ؓ可变化的Q你需要根据当前时间和不同的登录用h军_最l的昄。我们用占位W来表示q些变化的部分,可以得到下面q个模式Q?br />
您好Q{0}Q欢q来到Java研究l织|站Q当前时间是Q{1,date} {1,time}?br />
占位W的格式为{ ArgumentIndex , FormatType , FormatStyle }Q详l说明可以参考MessageFormat的API说明文档。这里我们定义了两个占位W,其中的数字对应于传入的参数数l中的烦引,{0}占位W被W一个参数替换,{1}占位W被W二个参数替换,依此cL?br /> 最多可以设|?0个占位符Q而且每个占位W可以重复出现多ơ,而且格式可以不同Q比如{1,date}和{1,time}。而通过这些模式定义放C同的资源文g中,p够根据不同的locale讄Q得C同的模式定义Qƈ用参数动态替换占位符?br />
下面我们׃MessageFormatSample.javaE序Q源文g见本书所附代码)ZQ来详细说明其中的每个步骤?br /> 1、找出可变的部分Qƈ据此定义模式Q将模式攑օ不同的资源文件中?br /> 比如针对上面的模式,定义了下面两个资源文Ӟ
MessagesBundle_en_US.properties
Welcome = Hi, {0}! Welcome to Java Research Organization!
MessagesBundle_zh_CN.properties
Welcome = 您好Q{0}Q欢q来到Java研究l织|站Q?br />
2、创建MessageFormat对象Qƈ讄其locale属性?br />
  1.       MessageFormat formatter = new MessageFormat("");
  2.       formatter.setLocale(currentLocale);

3、从资源包中得到模式定义Q以及设|参数?br />
  1. messages =     ResourceBundle.getBundle(
  2.   "org.javaresearch.j2seimproved.i18n.resource.MessagesBundle",currentLocale);
  3. Object[] testArgs = {"peachpi",new Date()};

4、利用模式定义和参数q行格式化?br />
  1.       System.out.println(formatter.format(messages.getString("welcome"),testArgs));


关于资源包的l织

一般来_你是按照资源的用途来l织资源包的Q比如会把所有的面按钮的信息放入一个名为ButtonResources的资源包中。在实际的应用过E中Q以下几个原则可以帮你决定如何组l资源包Q?br /> 1、要易于l护?br /> 2、最好不要将所有的信息都放入一个资源包中,因ؓq样资源包蝲入内存时会很耗时?br /> 3、最好将一个大的资源包分ؓ几个的资源包,q样可以在用的时候才导入必须的资源,减少内存消耗?

C物 2008-06-14 11:01 发表评论
]]>提升JSP面响应速度的七大秘c绝?/title><link>http://m.tkk7.com/libin2722/articles/192507.html</link><dc:creator>C物</dc:creator><author>C物</author><pubDate>Sun, 13 Apr 2008 01:02:00 GMT</pubDate><guid>http://m.tkk7.com/libin2722/articles/192507.html</guid><wfw:comment>http://m.tkk7.com/libin2722/comments/192507.html</wfw:comment><comments>http://m.tkk7.com/libin2722/articles/192507.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/libin2722/comments/commentRss/192507.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/libin2722/services/trackbacks/192507.html</trackback:ping><description><![CDATA[你时常被客户抱怨JSP面响应速度很慢吗?你想q当客户讉Kơ数剧增Ӟ你的WEB应用能承受日益增加的讉K量吗Q本文讲qC调整JSP? servlet的一些非常实用的ҎQ它可你的servlet和JSP面响应更快Q扩展性更强。而且在用h增加的情况下Q系l负载会呈现出^滑上? 的趋ѝ在本文中,我将通过一些实际例子和配置Ҏ使得你的应用E序的性能有出人意料的提升?br /> <br /> 其中Q某些调优技术是在你的编E工作中实现的。而另一些技术是与应用服务器的配|相关的。在本文中,我们详l地描述怎样通过调整servlet和JSP面Q来提高你的应用E序的M性能。在阅读本文之前Q假设你有基本的servlet和JSP的知识?br /> <br /> <strong>Ҏ一Q在servlet的init()Ҏ中缓存数?br /> </strong><br /> 当应用服务器初始化servlet实例之后Qؓ客户端请求提供服务之前,它会调用q个servlet的init()Ҏ。在一个servlet的生命周 期中Qinit()Ҏ只会被调用一ơ。通过在init()Ҏ中缓存一些静态的数据或完成一些只需要执行一ơ的、耗时的操作,可大大地提高系l性能?br /> <br /> 例如Q通过在init()Ҏ中徏立一个JDBCq接池是一个最佳例子,假设我们是用jdbc2.0的DataSource接口来取得数据库q接Q在? 常的情况下,我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中,如果每次SQLh都要执行一ơJNDI查询的话Q那pȝ性能? 会急剧下降。解x法是如下代码Q它通过~存DataSourceQ得下一ơSQL调用时仍然可以l利用它Q?br /> <br /> <center> <table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"> <tbody> <tr> <td class="code"> <pre>public class ControllerServlet extends HttpServlet<br /> <br /> {<br /> <br /> private javax.sql.DataSource testDS = null; <br /> <br /> public void init(ServletConfig config) throws ServletException<br /> <br /> {<br /> <br /> super.init(config); <br /> <br /> Context ctx = null;<br /> <br /> try<br /> <br /> { <br /> <br /> ctx = new InitialContext();<br /> <br /> testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");<br /> <br /> }<br /> <br /> catch(NamingException ne)<br /> <br /> {<br /> <br /> ne.printStackTrace(); <br /> <br /> }<br /> <br /> catch(Exception e)<br /> <br /> {<br /> <br /> e.printStackTrace();<br /> <br /> }<br /> <br /> }<br /> <br /> public javax.sql.DataSource getTestDS()<br /> <br /> {<br /> <br /> return testDS;<br /> <br /> }<br /> <br /> ...<br /> <br /> ... <br /> <br /> }</pre> </td> </tr> </tbody> </table> </center> <p>  <strong>Ҏ 2:止servlet和JSP 自动重蝲(auto-reloading)</strong> <br /> <br /> Servlet/JSP提供了一个实用的技术,卌动重载技术,它ؓ开发h员提供了一个好的开发环境,当你改变servlet和JSP面后而不必重启应 用服务器。然而,q种技术在产品q行阶段对系l的资源是一个极大的损耗,因ؓ它会lJSP引擎的类装蝲?classloader)带来极大的负担。因? 关闭自动重蝲功能对系l性能的提升是一个极大的帮助?/p> <p>  <strong>Ҏ 3: 不要滥用HttpSession</strong> <br /> <br /> 在很多应用中Q我们的E序需要保持客? 端的状态,以便面之间可以怺联系。但不幸的是׃HTTPh天生无状态性,从而无法保存客L的状态。因此一般的应用服务器都提供了session 来保存客L状态。在JSP应用服务器中Q是通过HttpSession对像来实现session的功能的Q但在方便的同时Q它也给pȝ带来了不的? 担。因为每当你获得或更新sessionӞpȝ者要对它q行Ҏ的序列化操作。你可以通过对HttpSession的以下几U处理方式来提升pȝ的? 能?br /> <br /> 如果没有必要Q就应该关闭JSP面中对HttpSession的缺省设|?如果你没有明指定的话,每个JSP面都会~省地创Z个HttpSession。如果你的JSP中不需要用session的话Q那可以通过如下的JSP面指示W来止它:</p> <center> <table bordercolordark="#ffffff" bordercolorlight="black" align="center" border="1" cellpadding="2" cellspacing="0" width="400"> <tbody> <tr> <td class="code"> <pre>Q?@ page session="false"%Q?/pre> </td> </tr> </tbody> </table> </center> <p>  不要在HttpSession中存攑֤的数据对像:如果你在HttpSession中存攑֤的数据对像的话,每当对它q行dӞ应用服务器都 对其进行序列化Q从而增加了pȝ的额外负担。你在HttpSession中存攄数据对像大Q那pȝ的性能׃降得快?<br /> <br /> ? 你不需要HttpSessionӞ快地释攑֮Q当你不再需要sessionӞ你可以通过调用HttpSession.invalidate()Ҏ 来释攑֮。尽量将session的超时时间设得短一点:在JSP应用服务器中Q有一个缺省的session的超时时间。当客户在这个时间之后没有进行Q? 操作的话Q系l会相关的session自动从内存中释放。超时时间设得越大,pȝ的性能׃低Q因此最好的Ҏ是量使得它的g持在一个较低的? q?<br /> <br /> Ҏ 4: 页面输行压~?<br /> <br /> 压羃是解x据冗余的一个好的方法,特别是在|络带宽不够发达的今天。有的浏 览器支持gzip(GNU zip)q行来对HTML文gq行压羃Q这U方法可以戏剧性地减少HTML文g的下载时间。因此,如果你将servlet或JSP面生成的HTML面 q行压羃的话Q那用户׃觉得面览速度会非常快。但不幸的是Q不是所有的览器都支持gzip压羃Q但你可以通过在你的程序中查客L览器是否支 持它。下面就是关于这U方法实现的一个代码片D: </p> <ccid_nobr> </ccid_nobr> <pre>public void doGet(HttpServletRequest request, <br /> <br /> HttpServletResponse response)<br /> <br /> throws IOException, ServletException <br /> <br /> {<br /> <br /> OutputStream out = null<br /> <br /> String encoding = request.getHeader("Accept-Encoding"); <br /> <br /> if (encoding != null && encoding.indexOf("gzip") != -1)<br /> <br /> {<br /> <br /> request.setHeader("Content-Encoding" , "gzip");<br /> <br /> out = new GZIPOutputStream(request.getOutputStream());<br /> <br /> }<br /> <br /> else if (encoding != null && encoding.indexOf("compress") != -1)<br /> <br /> {<br /> <br /> request.setHeader("Content-Encoding" , "compress");<br /> <br /> out = new ZIPOutputStream(request.getOutputStream());<br /> <br /> } <br /> <br /> else<br /> <br /> {<br /> <br /> out = request.getOutputStream();<br /> <br /> }<br /> <br /> ...<br /> <br /> ... <br /> <br /> }</pre> <img src ="http://m.tkk7.com/libin2722/aggbug/192507.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/libin2722/" target="_blank">C物</a> 2008-04-13 09:02 <a href="http://m.tkk7.com/libin2722/articles/192507.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp 70 问答http://m.tkk7.com/libin2722/articles/158058.htmlC物C物Sun, 04 Nov 2007 04:59:00 GMThttp://m.tkk7.com/libin2722/articles/158058.htmlhttp://m.tkk7.com/libin2722/comments/158058.htmlhttp://m.tkk7.com/libin2722/articles/158058.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/158058.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/158058.html 1. 问:在JAVA与JSP中要调用一个LINUX上的脚本E序,或WINDOWS上的脚本E序,该怎么写?
{:System.getRuntime().exec("bash < aaa.sh");

2. 问:java中用什么表C双引号
{:"""

3. 问:如何在JSPE序里另起一个线E?
{:
JSP本n是独立U程q行而不象CGI都是独立q程.
一?
Thread t = new Thread("你的对象");
t.start();可以了.
要求你这个对象要实现runnable接口或承thread.

4. 问:jsp如何获得客户端的IP地址Q?br /> {:
request.getRemoteAddr()
看看各个webserver的API文档说明Q一般都有自带的Qresin和tomcat都有

5. 问:E序l止与输出终?br /> {:
E序中止:return;
输出中止out.close();q一句相当于ASP的response.end

6. 问:jsp中如何得C늚URLQ?br /> {:request.getHeader("referer");

7. 问:提交|页的网过期功能是怎么做的Q?br /> {:response.setHader("Expires","0");

8. 问:在JSP|页中如何知道自已打开的页面的名称
{:
request.getRequestURI() ;//文g?br /> request.getRequestURL() ;//全部QRQ?br />
9. 问:提交表单后验证没有通过Q返回提交页面,如何使原提交面中的数据保留Q?br /> {:javascript的go(-1)可以把上늚表单内容重新昄出来,但password域没?br />
10. 问:如何取得http的头信息Q?br /> {:request.getHader(headerName);

11. 问:&&?amp;的区别?
{:
&&是短路的与操作,也就是当C个条件是false的时候,W二个条件不用执?br /> &相反Q两个条件L执行?br />
12. 问:?以正弦曲U的一个周期显C出?br /> {:
public void paint(Graphics g)
{
for(int i=0;i<200;i++)
g.drawString("*",i,(int)(Math.sin(i)*20)+50);
}
}

13. 问:点数相乘后l果不精如100.0 * 0.6 l果{于 60.0004
{:
q不叫错?float和double是这样实现的.如果要精计,java提供了一个strictfp,它的计算遵@IEEE 754标准.而普通的float和double?br />
由地q_点格式或硬件提供的额外_ֺ或表C围?br />
14. 问:如何获得当前用的cursors的位|?
{:
int row = rs.getRow()是当前指针行数,q有isFrist();isBeforeFist();isLast();isAfterLast();可以试是不是在Ҏ名所说的位置

15. 问:表单成功提交了,点后退昄|页q期
{:
?lt;head></head>里面加以下代?br /> <META HTTP-EQUIV="Pragma" CONTENT="no-cache">
<META HTTP-EQUIV="Cache-Control" CONTENT="no-cache">
<META HTTP-EQUIV="Expires" CONTENT="0">
或者在表单中加上
<%
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires",0);
%>

16. 问:接口的简单理?br /> {:接口Z规范,比如我在接口中定义了一个方?
getData()
q是用来从不同的数据库中取数据的,是JDBC的实现对于用?我不要知道每U数据库是如何做?但我知道如何它们要实现这个接口就一定有

q个Ҏ可以供我调用.q样SUN把q个接口l各个数据库开发商,让他们自己实? 但ؓ什么不用承而用接口?因ؓl承只能从一个你c?br />
l承,而接口可以实现多?是说我实现的子cL多个规定好的接口中的功能. q只是简单的理解,{你深入理解抽象的时候就知道抽象到抽?br />
cLZ么还要再抽象到接?

17. 问:怎样~写一个取消按钮(怎样q回上一个页面,象工h的后退按钮Q?
{:
javascript把每ơ浏览过的location都压C一个栈?q个栈就是history,然后你如果要回到W几个页面它做几次POP操作,把最后POP出来

的那个LOCATIONl你. q就是JAVASCRIPT在实现history.go(-x)的原?

18. 问:什么是回调Q?br /> {:
单说,回调用不是让你去监听谁做完了什么事,而是谁做完了什么事报告给? q就是回调用的思想.例子太多?AWT的事?SWING事g模型

都是q样? q有多线E中,如果要控制线E数,不能L查询每个U程是否l束,要在每个U程l束时让U程自己告诉ȝE我l束?你可?br />
开新的U程?

19. 问:要介l一下compareToҎ
{:
compareToҎ是Comparable 接口必需实现的方?只要实现Comparable

可以用Arrays.srot()排序p实现Runnable接口的runpThread()一?

20. 问:如何可以从别的Web服务器检索页, 然后把检索到的网늚HTML代码储存在一个变量中q回q来
{:q是一个简单的WEB ROBOT实现,用URLcdC|页中抓内容,然后自己写一个分析程序从中找出新的URL,不断递归下去p?

21. 问:applet中如何获得键盘的输入
{:application的System.in是当前系l的标准输入,applet因ؓ安全的原因不可能d当前pȝ(客户?的标准输?只能从它的ROOTlg?br />
事g?比如键盘事g中取得键?

22. 问:怎样计算代码执行所p的时_
{:
代码开始取旉Q结束后取时_相减
long t1 = System.currentTimeMillis();
///////////////// your code
long t2 = System.currentTimeMillis() ;
long time = t2-t1;

23. 问:如何获在E序中获得一个文件的ContentTypeQ?br /> {:
URL u = new URL("file:///aaa.txt");
URLConnection uc = u.openConnection();
String s = uc.getContentType();

24. 问:q接池的使用是徏立很多连接池Q还是一个连接池里用多个q接Q?br /> {:
只有在对象源不同的情况下才会发生多个池化,如果你只q一l一个数据源,永远不要用多个连l池. 所以连l池的初始化一定要做成静态的,?br />
且应该在构造对象之?也就是只有在cLOAD的时?别的时候不应该有Q何生成新的连l池的时候?br />
25. 问:JavaMail要怎么安装Q?br /> {:下蝲两个包,一个是javamail包,另一个是jaf包。下载完直接把这两个包不解压加到CLASSPATH?br />
26. 问:怎样把地址栏里的地址锁定Q?br /> {:把你的服务器的可讉K目录索引选项关闭p?M服务器都有一个conf文g,里面都有q个选项?br />
27. 问:在JAVA中怎么取得环境变量啊。比如: TEMP = CQTEMP Q?br /> {:String sss = System.getProperty(key)

28. 问:怎样实现四舍五入Q保留小数点后两位小敎ͼ
{:
import java.text.*;
...
NumberFormat nf=NumberFormat.getNumberInstance();
nf.setMaximumFractionDigits(2);
nf.setMinimumFractionDigits(2);
nf.format(numb);

29. 问:Applet和form如何通信Q?br /> {:
取得的参C到param里面
<%
String xxx = request.getParameter("xxx");
%>
<applet>
<param value="<%=xxx%>">
</applet>


30. 问:java-plug-in是什么?
{:Java Runtime Environment的插件。用来运行javaE序。不需要什么特别的讄。等于你的机器里面有了jvm?br />
31. 问:WEB上面怎么栯接上一个EXCEL表格Q?br /> {:
定义面得contentType="application/vnd.ms-excel"Q让面以excel得Ş式打开。同样也可以以word得Ş式打开Qapplication/msword?br />
32. 问:怎样才能避免textarea字数限制Q?br /> {:是用了FORM的默认方法的~故,如果什么也不写默认是GET改用Post卛_Q在Form中定义mothod="post"?br />
33. 问:Z么加?lt;%@page contentType="text/html;charset=gb2312" %>插入数据库的中文Q依然是qQ?br /> {:
q要从环境看,能显C明你的JSP引擎没有问题,但写入数据库时你的JDBC能不能处理中?同一公司不同版本的JDBC都有支持中文和不支持?br />
文的情况,RESIN自带的MYSQL JDBC׃支持,MM的就支持,q有你的数据库类型是否支持中?CHAR的一般支?但是否用binary存储双字节码

34. 问:对于JFrameQhide()Qshow()与setVisibel()有什么区别吗Q?br /> {:
setVisible()从Componentl承q来Q而hide(),show()从Window里面l承q来?br /> Makes the Window visible. If the Window and/or its owner are not yet displa yable, both are made displayable. The Window will

be validated prior to being made visible. If t he Window is already visible, this will bring the Window to the front. 区别?br />
q?br /> 36. 问:sendRedirectZ么不可以转到mms协议的地址的?response.sendRedirect("mms://missiah.adsldns.org:9394");
{:javaq_目前实现的protocol中ƈ没有mms,你可以取pȝ属性java.protocol.handler.pkgs看看它的g有没有mms,所以如果要想重定向

到mms://hostq样和URL,只有生成客户端的JAVASCRIPT让它来重定向

37. 问:JTable中怎样定义各个Columns和Width和怎样讄表格的内定w做靠x居中Q?br /> {:
TableColumn tc = table.getColumn("Name");//取得列名?Name"的列Handle
int currentWidth = tc.getPreferredWidth(); //取得该列当前的宽?br /> tc.setPreferredWidth(200); //讄当前列宽
tc.setMaxWidth(200); //讄该列最大宽?br /> tc.setMinWidth(50); //讄该列最宽?br />
38. 问:Ҏ作是否可用于select语句Q?br /> {:Ҏ作其实是指成批理更新的操?l对不可能用于select操作?br />
39. 问:Z么jsp路径太深文g名太长就无法d文gQ?br /> {:path不能过255长度,不然找不到?q是作业pȝ的事?br />
40. 问:如何让页面不保留~存Q?br /> {:
<%
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
response.setDateHeader("Expires", 0);
%>

41. 问:我的applet code 中用到jbutton 时就出错是否׃ie不支持swing package 请问应怎么办?
{:JBUTTON是SWING基本包啊,只要把jdk/jre/lib/rt.jar攑֜classpathp?不要加蝲M别的库?br />
42. 问:不知道java是否支持midi格式Q如果支持,应该怎么把wave格式转换成midi格式Q?br /> {:目前q不?可以看一下JMF三个版中对MIDI的格式支持是read only,而WAVE是read/write,MIDI只能播放,不能生成?br />
43. 问:在jsp里面防止用户直接输入urlq去面Q应该怎么做呢Q?br /> {:
一是从web服务器控?Ҏ一目录的所有访问要通过验证.
二是在要讉K的页面中加入控制.q个一般用session,也可以用h状态码实现

44. 问:
例如后台有一计算应用E序Q此E序q算h很慢Q可持箋几分钟到几小Ӟq不,主要是能ȀzdQ,客户d提交后,服务器对?br />
务进行检无误后向服务器后台程序发送信息,q将其激zR要求如下:
1Q首先将后台E序Ȁz,让它执行此Q务(比如Q前台将计算的C代码提交上后Q后台程序程序能马上调用Qƈ其q行Q?br /> 2Q要在前台JSP面中显C行过E信息(׃q行旉长,希望让客L到运行过E中产生的信息)如何完成Q?br />
{:
zL可以?q行一个shell让它去运行后台就?但不可能取出q行信息,因ؓHTTP的超旉制不可能永远{你后台q行?而且信息如果要动?br />
实时推出来就得用SERVER PUSH技术?br />
45. 问:数据库是datetime ?Q插入当前时间到数据库?
{:
java.sql.Date sqlDate = new java.sql.Date();
PreparedStatement pstmt = conn.prepareStatement("insert into foo(time) values(?)");
pstmt.setDate(1,sqlDate);
pstmt.executeUpdate();

46. 问:怎样L字符串前后的I格?br /> {:String.trim()

47. 问:session怎样存取intcd的变量?
{:
session.setAttribute("int", i+"");
int i = Integer.parseInt(session.getAttribute("int"));

48. 问:在javascript中如何输出的floatcd的数据保留两位小数?br /> {:Math.round(aaaaa*100)/100?br />
49. 问:在beanU如何调用session
{:
你可把session对象作ؓ一个参Clbean
在BEAN中定义HttpServletRequest request;HttpSession session;
然后
session = request.getSession(false);
false为如果session为空,不徏立新的session
session作ؓ参数传入.其实只要request传入可?br />
50. 问:如何把txt或word文g按原格式昄在jsp面或servlet上?
{:
其实一个非常简单的解决Ҏ是在服务器的MIME中指点定TEXT和WORD的解释方?然后用JSP或SERVLET生成它就行了,客户端就会自动调用相

应程序打开你的文档?br /> 如果是希望按原格式的昄在页面上Q而不是调用其他程序打开那么你可以试试用WEBDEV协议,可以说这是MS的一个亮?它是在WEB方式下打开

文档,和共享一?完全W合的要求?br />
51. 问:object的cloneҎZ么不能直接调用?
{:
q个Ҏ在object中是protected
Z么要把这个方法定义ؓprotected,q是一个折?它的目的是想知道你这个方法在Object里只是一个标?而不是一个实?比如

public class Object
{
.............
protected Object clone()
{}
}

所以直接承的clone()Ҏq不能做M?你要使用q个Ҏp重蝲q个Ҏq放宽访问权限ؓpublic,或实现cloneable接口. 但它没法

q样告诉你它没有真的实现,只好用protected Ҏ加以警示

52. 问:一个页面中如何h另外一个页面?
{:
要求是这些面必L兌,一是它们都有一个共同的层?也就是说是一个内的分面,当然可以是Q意,帧内再分帧也可以,另一个可

能是当前H口弹出的窗?如果没有联系,那就不可能用一个页面刷新另一个页? 帧内只要一U一U引用就行了.

比如在左帧中一个页面中写top.right.location.reload();那么名ؓright的右帧中的页面就会刷? 弹出的一?用open时的名称h子窗?

子窗口用openerhȝ?br />
53. 问:如何在jsp中怎么样向客户端写cookiesQ?br /> {:
Cookie coo = new Cookie(name, value);
HttpServletResponse.addCookie(name);

54. 问:Z么jTextField1.setText("aaabbb");jTextField2.setText("AAABBB"); 得到的字体宽度不一P
{:是说如果不是指定ؓ{宽字体,每个字体的宽度都是不一L.因此JAVA中用FontMetrics cL取字W宽度?br />
55. 问:String kk=application/octet-stream; name="G:/SMBCrack.exe";如何得到SMBCrack.exeQ?br /> {:
q应该是解析上传时候的二进制流得到的这一行里面格式是固定的,取到name="后面的字W串Q然后把";L。然后取最后一?后面的所有字

W组成一个新字符串就行了?br />
56. 问:如何传值ƈ不刷新页面?
{:
弹出一个页面进行值的选择或者输入,ok后用将gl原H口Q用javascript关闭打开的窗口即可:
window.close();opener.focus();

57. 问:有一个字W串Q?EF0C114EA4"Q如何变为a[0] = 0xEF a[1] = 0x0C a[2] = 0x11 a[3] = 0x4E a[4] = 0xA4Q?br /> {:
String str="EF0C114EA4F";
out.print(str+"<br>");
int l=str.length()/2+str.length()%2,j=0,k=0;
String[] a=new String[l];
for(int i=0;i<l;i++){
if(str.length()-j==1)
k=str.length();
else
k=j+2;
a="0x"+str.substring(j,k);
out.print("a["+Integer.toString(i)+"]="+a+"<br>");
j+=2;
}

58. 问:怎样一个int转换成一个四字节的byte数组Q?br /> {:
int x = 1234567;
byte[] b = new byte[4];
for(int i=0;i<b.length;i++)
{
b = (x >>( i*8)) & 0xFF;
}

59. 问:indexOf()的用需要注意什么?
{:参数是指从第几位Q?Q?Q?Q?..Q开始搜索,而返回值是指搜索到的位|(0Q?Q?Q?.......Q注意是从零v的?br />
60. 问:在Java应用E序中如何动态的d一个按钮?
{:
q里涉及一个组仉l的问题,lg要先于panel被显CZ处存?如果一panel已经昄?那么加在上面你能看到?但如果在同一个panel?

先有button A,假如按下它加了butt on B,q时你如果整个panel重给,那么A本n要重l?它的事g监听没有了,当然也就加不成B?所以如

果要先有另一个panel,当按A时把B加在q个panel上ƈ重绘q个paenl,其实更好的方法是先把B加在panel?同一个也?把它setVisiable(flas

e),按A时设?true?br />
61. 问:book mybook=new book(bookid);book是servlet,出错?br /> {:
book是servlet,能book mybook=new book(bookid);
说明自己实现了servlet容器?不然,servlet能让你自己去调用? servlet如果调用其实和EJBq?%的区别都没有,它们都是自己l承或实C些接

?在这些父cL接口中实C如果和容?打交?的方?然后容器调用q些Ҏ来管理它,让它生成实例,池化,钝化,销?再生{?所以这?br />
写是错误的?br />
62. 问:l定一个字W串5*(5+9)/7怎样计算出结果?
{:
可有两种Ҏ
1。用堆栈完成
2。最单的ҎQ不用编E,如果有Q何一个数据库的化Q用select (5*(5+9)/7) from oneTable

63. 问:如何实现递交表单内容的加密解密?
{:
如果你用IE目前只能用SSL协议,q一层不要你考虑,否则只你用你自己的工具加密传?接收后再解密?至于如何加解,如果要和公认的系l结

?q通用的MD5,RAS{公开法,如果你只是自׃自己?你随便按你的x把数据加上一些东?取回来按规则减掉q些东西,我敢保证?br />
你自己没有Q何h能知道解密方?

64. 问:Z么Integer.parseInt("+1");会抛出NumberFormatException的异常?
{:因ؓ"+"q行在JAVA中被重蝲.pȝ无法定你用的是术加还是字W??br /> q一点可以在JAVASCRIPT中更好地理解:
<form name="t"><input name=s value=1234></form>
var a = document.t.s.value+1;
q时a = 12345,因ؓdocument.t.s.value作ؓ字符?但var a = document.t.s.value-1;
a 是1233,因ؓpȝ知道-q算肯定是算术运?所以把document.t.s.value转换成数?


65. 问:hashCode() 有什么用Z么有时候需要覆盖Object里的hashcode()ҎQ?br /> {:q就是这个对象的w䆾证啊,要不如何区分哪个对象?br />
66. 问:怎样在tomcat中实C个定时执行的东东Q?br /> {:
在应用程序启动时自动q行。servlet2.3中定义了ServletListener,监听Servlet Con text的启动或则关闭(可在配置文g中配|)Q启动时

触发一个守护程序的q行(可以实现java.util.Timer或则 javax.swing.Timer).

67. 问:E序可以输出自己吗?
{:孔d悖论q个非常有名的法?是说Q何程序都不可能输?

68. 问:能够把字W{化成ASCII码?比如?A 转化?65Q?br /> {:
int a='A';
out.println(a);

69. 问:如何区分输入的文字中的全角与半角Q?br /> {:׃不能分L出全角和半角字符的值有什么规?只好把全角符L丑և来了.

70. 问:用户注册后的自动发信E序该怎么做?
{:
q种发信E序不考虑性能,因ؓ不可?U就有一个h注册,我们说的考虑性能的发信程序是指上百万信在队列里要不停发送的那种,象你q个

随便怎么写一个程序都?没有必要用JAVAMAIL.只要指定一个发信的服务器然后用cocketq它?5口就行了.自己用SOCKETqSMTP?5口发一?br />
信就好象两个d之间送一样东?直接递过d?用JAVAMAIL,消息机制是你把q个东西从邮局寄给你的d?  


C物 2007-11-04 12:59 发表评论
]]>
提升JSP应用E序的七大绝?http://m.tkk7.com/libin2722/articles/144154.htmlC物C物Tue, 11 Sep 2007 02:08:00 GMThttp://m.tkk7.com/libin2722/articles/144154.htmlhttp://m.tkk7.com/libin2722/comments/144154.htmlhttp://m.tkk7.com/libin2722/articles/144154.html#Feedback0http://m.tkk7.com/libin2722/comments/commentRss/144154.htmlhttp://m.tkk7.com/libin2722/services/trackbacks/144154.html处理 SSI 文g时出?/strong>
提升JSP应用E序的七大绝?img src="http://www.raqu.com/article/uploadfiles/tr.gif" alt="" />提升JSP应用E序的七大绝?006-7-19 23:30:55提升JSP应用E序的七大绝?006-7-19 23:30:55提升JSP应用E序的七大绝?/div>     你时常被客户抱怨JSP面响应速度很慢吗?你想q当客户讉Kơ数剧增Ӟ你的WEB应用能承受日益增加的讉K量吗Q本文讲qC调整JSP和servlet的一些非常实用的ҎQ它可你的servlet和JSP面响应更快Q扩展性更强。而且在用h增加的情况下Q系l负载会呈现出^滑上长的势。在本文中,我将通过一些实际例子和配置Ҏ使得你的应用E序的性能有出人意料的提升。其中,某些调优技术是在你的编E工作中实现的。而另一些技术是与应用服务器的配|相关的。在本文中,我们详l地描述怎样通过调整servlet和JSP面Q来提高你的应用E序的M性能。在阅读本文之前Q假设你有基本的servlet和JSP的知识?br />
  Ҏ一Q在servlet的init()Ҏ中缓存数?br />
  当应用服务器初始化servlet实例之后Qؓ客户端请求提供服务之前,它会调用q个servlet的init()Ҏ。在一个servlet的生命周期中Qinit()Ҏ只会被调用一ơ。通过在init()Ҏ中缓存一些静态的数据或完成一些只需要执行一ơ的、耗时的操作,可大大地提高系l性能?br />
  例如Q通过在init()Ҏ中徏立一个JDBCq接池是一个最佳例子,假设我们是用jdbc2.0的DataSource接口来取得数据库q接Q在通常的情况下Q我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中,如果每次SQLh都要执行一ơJNDI查询的话Q那pȝ性能会急剧下降。解x法是如下代码Q它通过~存DataSourceQ得下一ơSQL调用时仍然可以l利用它Q?br />


 
 
 public class ControllerServlet extends HttpServlet
{
 private javax.sql.DataSource testDS = null; 
 public void init(ServletConfig config) throws ServletException
 {
  super.init(config); 
  Context ctx = null;
  try
  { 
   ctx = new InitialContext();
   testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");
  }
  catch(NamingException ne)
  {
   ne.printStackTrace(); 
  }
  catch(Exception e)
  {
   e.printStackTrace();
  }
 }

 public javax.sql.DataSource getTestDS()
 {
  return testDS;
 }
 ...
 ... 


  Ҏ 2:止servlet和JSP 自动重蝲(auto-reloading)

  Servlet/JSP提供了一个实用的技术,卌动重载技术,它ؓ开发h员提供了一个好的开发环境,当你改变servlet和JSP面后而不必重启应用服务器。然而,q种技术在产品q行阶段对系l的资源是一个极大的损耗,因ؓ它会lJSP引擎的类装蝲?classloader)带来极大的负担。因此关闭自动重载功能对pȝ性能的提升是一个极大的帮助?br />
  Ҏ 3: 不要滥用HttpSession 

  在很多应用中Q我们的E序需要保持客L的状态,以便面之间可以怺联系。但不幸的是׃HTTPh天生无状态性,从而无法保存客L的状态。因此一般的应用服务器都提供了session来保存客L状态。在JSP应用服务器中Q是通过HttpSession对像来实现session的功能的Q但在方便的同时Q它也给pȝ带来了不的负担。因为每当你获得或更新sessionӞpȝ者要对它q行Ҏ的序列化操作。你可以通过对HttpSession的以下几U处理方式来提升pȝ的性能Q?br />
  ? 如果没有必要Q就应该关闭JSP面中对HttpSession的缺省设|: 如果你没有明指定的话,每个JSP面都会~省地创Z个HttpSession。如果你的JSP中不需要用session的话Q那可以通过如下的JSP面指示W来止它:



 
 
 Q?@ page session="false"%Q?nbsp; 

  ? 不要在HttpSession中存攑֤的数据对像:如果你在HttpSession中存攑֤的数据对像的话,每当对它q行dӞ应用服务器都对其进行序列化Q从而增加了pȝ的额外负担。你在HttpSession中存攄数据对像大Q那pȝ的性能׃降得快?br />
  ? 当你不需要HttpSessionӞ快地释攑֮Q当你不再需要sessionӞ你可以通过调用HttpSession.invalidate()Ҏ来释攑֮?br />
  ? 量session的超时时间设得短一点:在JSP应用服务器中Q有一个缺省的session的超时时间。当客户在这个时间之后没有进行Q何操作的话,pȝ会将相关的session自动从内存中释放。超时时间设得越大,pȝ的性能׃低Q因此最好的Ҏ是量使得它的g持在一个较低的水^?br />

  Ҏ 4: 页面输行压~?br />
  压羃是解x据冗余的一个好的方法,特别是在|络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)q行来对HTML文gq行压羃Q这U方法可以戏剧性地减少HTML文g的下载时间。因此,如果你将servlet或JSP面生成的HTML面q行压羃的话Q那用户׃觉得面览速度会非常快。但不幸的是Q不是所有的览器都支持gzip压羃Q但你可以通过在你的程序中查客L览器是否支持它。下面就是关于这U方法实现的一个代码片D:



 
 
 public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException 
{
 OutputStream out = null
 String encoding = request.getHeader("Accept-Encoding"); 
 if (encoding != null && encoding.indexOf("gzip") != -1)
 {
  request.setHeader("Content-Encoding" , "gzip");
  out = new GZIPOutputStream(request.getOutputStream());
 }
 else if (encoding != null && encoding.indexOf("compress") != -1)
 {
  request.setHeader("Content-Encoding" , "compress");
  out = new ZIPOutputStream(request.getOutputStream());
 } 
 else
 {
  out = request.getOutputStream();
 }
 ...
 ... 
}  

  Ҏ 5: 使用U程?br />
  应用服务器缺省地为每个不同的客户端请求创Z个线E进行处理,qؓ它们分派service()ҎQ当service()Ҏ调用完成后,与之相应的线E也随之撤消。由于创建和撤消U程会耗费一定的pȝ资源Q这U缺省模式降低了pȝ的性能。但所q的是我们可以通过创徏一个线E池来改变这U状c另外,我们q要个线E池讄一个最线E数和一个最大线E数。在应用服务器启动时Q它会创建数量等于最线E数的一个线E池Q当客户有请求时Q相应地从池从取Z个线E来q行处理Q当处理完成后,再将U程重新攑օ到池中。如果池中的U程不够地话Q系l会自动地增加池中线E的数量Q但总量不能过最大线E数。通过使用U程池,当客Lh急剧增加Ӟpȝ的负载就会呈现的qx的上升曲U,从而提高的pȝ的可伸羃性?br />
  Ҏ 6: 选择正确的页面包含机?br />
  在JSP中有两种Ҏ可以用来包含另一个页面:1、用include指示W?Q?@ includee file=”test.jsp” %Q??、用jsp指示W?Qjsp:includee page=”test.jsp” flush=”true”/Q?。在实际中我发现Q如果用第一U方法的话,可以使得pȝ性能更高?br />
  Ҏ 7:正确地确定javabean的生命周?br />
  JSP的一个强大的地方是对javabean的支持。通过在JSP面中用<jsp:useBeanQ标{,可以javabean直接插入C个JSP面中。它的用方法如下:



 
 
 Qjsp:useBean id="name" scope="page|request|session|application" class=
"package.className" type="typeName"Q?br /> Q?jsp:useBeanQ?nbsp;

  其中scope属性指Zq个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话,它将影响pȝ的性能?br />
  举例来说Q如果你只想在一ơ请求中使用某个beanQ但你却这个bean的生命周期设|成了sessionQ那当这ơ请求结束后Q这个bean仍然保留在内存中,除非session时或用户关闭浏览器。这样会耗费一定的内存Qƈ无谓的增加了JVM垃圾攉器的工作量。因此ؓbean讄正确的生命周期,q在bean的命结束后快地清理它们,会用系l性能有一个提高?br />
  其它一些有用的Ҏ 

  ? 在字W串q接操作中尽量不使用“Q?#8221;操作W:在java~程中,我们常常使用“Q?#8221;操作W来几个字W串q接hQ但你或总来没有想到过它居然会对系l性能造成影响吧?׃字符串是帔RQ因此JVM会生一些时的对像。你使用?#8220;Q?#8221;多Q生成的临时对像p多,q样也会l系l性能带来一些媄响。解决的Ҏ是用StringBuffer对像来代?#8220;Q?#8221;操作W?br />
  ? 避免使用System.out.println()ҎQ由于System.out.println()是一U同步调用,卛_调用它时Q磁盘I/O操作必须{待它的完成Q因此我们要量避免对它的调用。但我们在调试程序时它又是一个必不可的方便工具Qؓ了解册个矛盾,我徏议你最好用Log4j工具(http://Jakarta.apache.org )Q它既可以方便调试,而不会生System.out.println()q样的方法?br />
  ? ServletOutputStream ?nbsp;PrintWriter的权?使用PrintWriter可能会带来一些小的开销Q因为它所有的原始输出都{换ؓ字符来输出Q因此如果用它来作为页面输出的话,pȝ要负担一个{换过E。而用ServletOutputStream作ؓ面输出的话׃存在一个问题,但它是以二进制进行输出的。因此在实际应用中要权衡两者的利弊?br />
  ȝ

  本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能Qƈ因此提升整个J2EE应用的性能。通过q些调优技术,你可以发现其实ƈ不是某种技术^収ͼ比如J2EE?NET之争Q决定了你的应用E序的性能Q重要是你要对这U^台有一个较为深入的了解Q这样你才能从根本上对自q应用E序做一个优化!

C物 2007-09-11 10:08 发表评论
]]> վ֩ģ壺 ޳ɵӰ߹ۿ| avպavӰƬƷ| ݺɫþþ޾Ʒ| þþþùƷվ| þþƷۺר| þѸƵ| ϺɫϺҳa| ߹ۿwwwձվ| һƬ߹ۿ| ߳Ƶ| պ޲߹ۿ| ts߹ۿƵ| պa| ޾Ʒ91רֻ| hƵѹۿ| ޳AVƬ߲| þѾƵ| ҹav2019| һѹۿ | 69Ƶ| ˾þô߽AV| ƷѵĻվ| þþƷվ| þþþAvר| ݺݾþѹۿ| h߿Ƶվ| ޹ۺһ | һ| þѸƵ| ŷ Ƶ С˵| ˳ɫ7777߹ۿ| òѸԴվ| պþۺĻ| պƷ| ѹվ߹ۿƵ| ҹƬ߹ۿ| ۺŮþþ30p| վ| ˾ƷƵȫ| ޹Ʒר| ۺɫƵ߹ۿ|