??xml version="1.0" encoding="utf-8" standalone="yes"?>久久这里只有精品一区二区,91网页在线观看,av福利精品http://www.aygfsteel.com/badboy/category/8016.htmlzh-cnFri, 02 Mar 2007 05:06:07 GMTFri, 02 Mar 2007 05:06:07 GMT60JSP学习(fn)?j)?/title><link>http://www.aygfsteel.com/badboy/articles/33205.html</link><dc:creator>badboy</dc:creator><author>badboy</author><pubDate>Thu, 02 Mar 2006 06:23:00 GMT</pubDate><guid>http://www.aygfsteel.com/badboy/articles/33205.html</guid><wfw:comment>http://www.aygfsteel.com/badboy/comments/33205.html</wfw:comment><comments>http://www.aygfsteel.com/badboy/articles/33205.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/badboy/comments/commentRss/33205.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/badboy/services/trackbacks/33205.html</trackback:ping><description><![CDATA[<P>一、JSP工作原理</P> <P>在一个JSP文gW一ơ被hӞJSP引擎把该JSP文g转换成ؓ(f)一个servlet。而这个引擎本w也是一个servletQ在JSWDK或WEBLOGIC中,它就是JspServlet?JSP引擎先把该JSP文g转换成一个Java源文Ӟ在{换时如果发现jsp文g有Q何语法错误,转换q程中断,q向服务端和客户端输出出错信息;如果转换成功Q?JSP引擎用javac把该Java源文件编译成相应的class文g。然后创Z个该SERVLET的实例,该SERVLET的jspInit()Ҏ(gu)被执行,jspInit()Ҏ(gu)在servlet的生命周期中只被执行一ơ。然后jspService()Ҏ(gu)被调用来处理客户端的h。对每一个请求,JSP引擎创徏一个新的线E来处理该请求。如果有多个客户端同时请求该JSP文gQ则JSP引擎?x)创建多个线E。每个客L(fng)h对应一个线E。以多线E方式执行可大大降低对系l的资源需?提高pȝ的ƈ发量?qing)响应时?但应该注意多U程的编E限Ӟ׃该servlet始终M内存Q所以响应是非常快的?如果.jsp文g被修改了(jin)Q服务器根据设|决定是否对该文仉新编译,如果需要重新编译,则将~译l果取代内存?sh)的servletQƈl箋(hu)上述处理q程?虽然JSP效率很高Q但在第一ơ调用时׃需要{换和~译而有一些轻微的延迟?此外Q如果在M时候如果由于系l资源不的原因QJSP引擎以某种不确定的方式servlet从内存(sh)Ud。当q种情况发生时jspDestroy()Ҏ(gu)首先被调? 然后servlet实例便被标记加入"垃圾攉"处理?jspInit()?qing)jspDestory()格式如下Q可在jspInit()中进行一些初始化工作,如徏立与数据库的q接Q或建立|络q接Q从配置文g中取一些参数等Q在jspDestory()中释攄应的资源?</P><%!<BR>public void jspInit()<BR>{<BR>       System.out.println("jspinit"); <BR>}<BR> <BR>%><BR> <BR><%!<BR>public void jspDestory()<BR>{<BR>       System.out.println("jspDestory"); <BR>}<BR>%><BR><!----------------------- W二文? 服务端的输出~冲? -----------------------> <P>二、服务端的输出缓冲区</P> <P>~省情况?服务端要输出到客L(fng)的内?不直接写到客L(fng),而是先写C个输出缓冲区?只有在下面三中情况下Q才?x)把该缓冲区的内容输出到客户端上Q?BR> <OL> <LI>该JSP|页已完成信息的输出 <LI>输出~冲区已? <LI>JSP中调用了(jin)out.flush()或response.flushbuffer() </LI></OL>输出~冲区的大小可以? <%@page buffer="none"|"nkb"%>或response.setBufferSize()讄,如下Q? <OL> <LI>讄输出~冲区的大小?KB?<%@page buffer="1kb"%>或response.setBufferSize(1); <LI>讄输出~冲区的大小?Q即不缓册Ӏ?<%@page buffer="none" %>或response.setBufferSize(0); </LI></OL>用response.getBufferSize()或out.getBufferSize()可取的输出缓冲区的大?单位为字? 用response.isCommitted()可检查看服务端是否已数据输出到客户? 如果q回值是TRUE则已数据输出到客户?是FALSE则还没有. <P></P><!----------------------- W三文? 服务端输出重定向 -------------------> <P>三、服务端输出重定?/P> <P>有以?U方法可以做到输出重定向: <OL> <LI>RESPONSE.SETREDERECT("URL") 该方法通过修改HTTP协议的HEADER部分,Ҏ(gu)览器下达重定向指令的,使浏览器昄重定向网늚内容. response.sendRedirect("http://localhost:7001/index.html"); <LI>下面的方法也能改变HTTP HEADER属性,它的原理?1 是一L(fng). <BR><% <BR>response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); <BR>String newLocn="/index.html"; <BR>response.setHeader("Location",newLocn); <BR>% > <LI>采用<JSP:FORWORD> 该方法是利用服务器端先将数据输出到缓冲区的机?在把~冲区的内容发送到客户端之?原来的不发?改ؓ(f)发送该面的内?如果?lt;JSP:FORWORD>之前有很多输?前面的输出已使缓冲区?自动输出到客户?那么该语句将不v作用,q一点应该特别注? 如下面的例子?1)?x)输出index.html的内容,2 不会(x)输出index.html的内容,而是输出out.println("@@@@@@@@@@@@@@@@@"); 中的内容,q且在服务端?x)抛?java.lang.IllegalStateException: Response already committed 异常Q但客户端没有Q何错误输出?</LI></OL>(1)<BR><%@page buffer="1kb"%><BR> <BR><%<BR>long i=0;<BR> <BR>for(i=0;i<10;i++)<BR>{<BR>       out.println("@@@@@@@@@@@@@@@@@");<BR>}<BR>%><BR> <BR><jsp:forward page="./index.html" /><BR> <BR> <BR>(2)<BR><%@page buffer="1kb"%><BR> <BR><%<BR>long i=0;<BR> <BR>for(i=0;i<600;i++)<BR>{                 <BR>       out.println("@@@@@@@@@@@@@@@@@");<BR>}<BR>%><BR> <BR> <P>说明Q?BR>1. Ҏ(gu)(1),(2)可以使用变量表示重定向的地址;Ҏ(gu)(3)不能使用变量表示重定向的地址?BR>String add="./index.html"; <BR><jsp:forward page= add /> <BR>无法重定向到index.html中去 <BR><BR>String add=http://localhost:7001/index.html <BR>response.sendRedirect(add); <BR>可以重定向到http://localhost:7001/index.html中去?<BR><BR>2. 采用Ҏ(gu)(1),(2)request中的变量(通过request.setAttribute()保存到request中的?不能在新的页面中采用,采用Ҏ(gu)(3)? lg,我们应该采用(1),(2)重定向比较好. </P> <P></P><!----------------------- W四文? JSP中正应用类 -------------------> <P>四、JSP中正应用类: </P> <P>应该把类当成JAVA BEAN来用Q不要在<% %> 中直接? 如下的代?1)l过JSP引擎转化后会(x)变(sh)ؓ(f)代码(2):<BR>从中可看出如果把一个类在JSP当成JAVA BEAN 使用,JSP?x)根据它的作用范围把它保存到相应的内部对象?<BR>如作用范围ؓ(f)request,则把它保存到request对象?q且只在W一ơ调?对象的gؓ(f)null)它时q行实例? 而如果在<% %>中直接创cȝ一个对?则每ơ调用JSP?都要重新创徏该对??x)?jing)响性能. <P>代码(1)<BR><jsp:useBean id="test" scope="request" class="demo.com.testdemo"><BR></jsp:useBean><BR> <BR><%<BR>test.print("this is use java bean");<BR> <BR>testdemo td= new testdemo();<BR>td.print("this is use new");<BR>%><BR> <BR> <P class=MsoNormal><SPAN style="FONT-FAMILY: ?hu)?>代码</SPAN><SPAN lang=EN-US>(2)<BR>demo.com.testdemo test = (demo.com.testdemo)request.getAttribute("test"); <BR>if (test == null) <BR>{ <BR>       try <BR>       { <BR>                 test = (demo.com.testdemo) java.beans.Beans.instantiate(getClass().getClassLoader(),"demo.com.testdemo"); <BR>       } <BR>       catch (Exception _beanException) <BR>       {<BR>               throw new weblogic.utils.NestedRuntimeException("cannot instantiate 'demo.com.testdemo'",_beanException); <BR>       } <BR>       request.setAttribute("test", test); <BR>       out.print("\r\n");<BR>} <BR>out.print("\r\n\r\n\r\n");<BR>test.print("this is use java bean"); <BR> <BR>testdemo td= new testdemo();<BR>td.print("this is use new");<BR><BR> <BR></SPAN></P> <P></P><!----------------------- W五文? JSP的调? -------------------> <P><SPAN lang=EN-US>五、JSP的调?</SPAN></P> <P><SPAN lang=EN-US>JSP的调试比较麻?特别是当bean是在一个session中存在时Q更加困难。得从好几个面开始往里面走才行。通常是用out.println()或System.out.print()来打一大堆的信息来查问题。如果是用jbuilder做开?它能直接调试JSP.不过更重要的是知道错误生的原因?qing)解x(chng)法。下面对一些JSP~程常见错误q行分析?</SPAN> <P><SPAN lang=EN-US>(1).java.lang.NullPointerException异常<BR>一般是对一个ؓ(f)NULL值的变量q行操作引v?如下面的操作׃(x)抛出<BR>java.lang.NullPointerException<BR>String a = null; <BR>a.substring(0,1); <BR> <BR>为避免这U异常最好在对变量操作之前检查看它是否ؓ(f)NULL??<BR><% String ss=Session.getAttribute("NAME") <BR>if isnull(ss) <BR>{ <BR><BR>} <BR>else <BR>{ <BR><BR>} <BR>%> </SPAN></P> <P><SPAN lang=EN-US>(2).JSP是用JAVA写的Q所以它是大写敏感的,用过其他~程语言的h最Ҏ(gu)犯这个错误。另外在览器的地址栏中输入的访问JSP的地址也是区分大小写的.如http://localhost:7001/demo/t.jsp与http://localhost:7001/Demo/t.jsp是不一L(fng)</SPAN></P> <P><SPAN lang=EN-US>(3).在jsp中判断字W串要用compareToҎ(gu)Q不要用==Q因为在java中String变量不是一个简单的变量而是一个类实例Q不同的Ҏ(gu)?x)得?不同的结果,如下所C:(x) </SPAN></P> <OL><SPAN lang=EN-US>   </SPAN> <LI><SPAN lang=EN-US><BR>  String str1="ABCD"; <BR>  String str2="ABCD"; (?String str2="AB"+"CD"; ) <BR>  if (str1==str2) <BR>   out.print("yes"); <BR>  else <BR>   out.print("no"); <BR>  l果?yes"?<BR>  </SPAN> <LI><SPAN lang=EN-US><BR>  String str1,str2,str3; <BR>  str1="ABCD"; <BR>  str2="AB"; <BR>  str3=str2+"CD"; <BR>  if (str1==str3) <BR>   out.print("yes"); <BR>  else <BR>   out.print("no"); <BR>  l果?no"?<BR></SPAN> <LI><SPAN lang=EN-US><BR>String str1=new String("ABCD"); <BR>  String str2=new String("ABCD"); <BR>  if (str1==str2) <BR>   out.print("yes"); <BR>  else <BR>   out.print("no"); <BR>  l果?no"?<BR></SPAN> <LI><SPAN lang=EN-US><BR>String str1=new String("ABCD"); <BR>  String str2=new String("ABCD"); <BR>  if (str1.compareTo(str2)==0) <BR>   out.print("yes"); <BR>  else <BR>   out.print("no"); <BR>  l果?yes"?<BR></SPAN></LI></OL> <P><SPAN lang=EN-US>(4)防止JSP或SERVLET中的输出被浏览器保存在缓冲区?<BR>览器在默认情况下会(x)把浏览过的网保存在~冲Z,在调试时,一般不希望q样.把下面的脚本加入E序?可防止JSP或SERVLET中的输出被浏览器保存在缓冲区?<BR><% <BR>response.setHeader("Cache-Control","no-store"); //HTTP 1.1 <BR>response.setHeader("Pragma","no-cache"); //HTTP 1.0 <BR>response.setDateHeader ("Expires", 0); //prevents caching at the proxy server <BR>%> <BR>在IE中也可通过讄实现Q把/工具/INTERNET选项/常规/讄/的检察所存页面的较新版本,设ؓ(f)每次讉K该页旉(g)?</SPAN></P> <P></P><!----------------------- W六文? COOKIE -------------------> <P><SPAN lang=EN-US>六、COOKIE</SPAN></P> <P><SPAN lang=EN-US>HTTP COOKIE实质是服务端与在客户端之间传送的普通HTTP?可保存(sh)可不保存在客L(fng)盘?sh)?如果保存,每一个文件大不过4K的文本文?多个COOKIE可保存到同一个文件中. 如果从编E角度来?在JSP中COOKIE是JAVA提供的一个类.常用的方法如下所表示Q因为客L(fng)可能不接受COOKIEQ所以徏议不用它Q改用SESSION{其他方式?<BR></SPAN></P>public class cookie <BR>{ <BR>public String getDomain() //q回该COOKIE的有效域 <BR>public int getMaxAge() //q回该COOKIE的有效期,单位为秒 <BR>public String getName() //q回该COOKIE的名U?<BR>public String getPath() //q回该COOKIE的有效\?<BR>public boolean getSecure() //q回该COOKIE的安全设|?<BR>public String getValue() //q回该COOKIE的?<BR>public void setDomain(java.lang.String pattern) //讄该COOKIE的有效域 <BR>public void setMaxAge(int expiry) //讄该COOKIE的有效期,单位为秒 <BR>public void setPath(java.lang.String uri) //讄该COOKIE的有效\?<BR>public void setSecure(boolean flag) //讄该COOKIE的安全设|?<BR>public void setValue(java.lang.String newValue) //讄该COOKIE的?<BR>} <BR>一个COOKIE包含以下五部? <BR> <OL> <LI><SPAN lang=EN-US>NAME/VALUE?讄该COOKIE的名字及(qing)它保存的?</SPAN> <LI><SPAN lang=EN-US>COOKIE通常和服务器相关,如果域设ؓ(f)JAVA.SUN.COM,那么该COOKIE和q个域相?只对该网址起作?当浏览该|址?览器将把该COOKIE的内容发送给服务?COOKIE是作为HTTP HEADER的一部分被发送的Q如果没有设|域,那么COOKIE只和创COOKIE的服务器相关. </SPAN> <LI><SPAN lang=EN-US>路径用于指定服务器上可以使用该COOKIE的文件所在的路径,它只对该|址下的该\径下的应用v作用."/"表示服务器上所有目录都可以使用该COOKIE. </SPAN> <LI><SPAN lang=EN-US>COOKIE都有一个有效期,有效期默认gؓ(f)-1,q表C没有保存该COOKIE,当该览器退出时,该COOKIE立即失效. </SPAN> <LI><SPAN lang=EN-US>安全选项true/false,如果讄为true,那么在服务端与在客户端之间传送该COOKIE的内Ҏ(gu),采用HTTPS协议. </SPAN></LI></OL> <P><SPAN lang=EN-US>如何(g)查一个客L(fng)是否支持COOKIE的方? <BR>用下面的Ҏ(gu)写一个COOKIE到客L(fng),q确认成?<BR>try <BR>{ <BR>Cookie c = new Cookie("mycookie","COOKIE TEST"); <BR>response.addCookie(c); <BR>} <BR>catch(Exception e) <BR>{ <BR>      System.out.println(e); <BR>} <BR></SPAN></P> <P><SPAN lang=EN-US>然后在一个新的JSP文g?用下面的Ҏ(gu)取客L(fng)的COOKIE到cookies? 如果cookies.length ==0,说明该客L(fng)的浏览器不支持COOKIE <BR>try <BR>{ <BR>Cookie[] cookies = request.getCookies(); <BR>if(cookies.length ==0) <BR>{ <BR>      System.out.println("not support cookie"); <BR>} <BR>} <BR>catch(Exception e) <BR>{ <BR>      System.out.println(e); <BR>} <BR></SPAN></P> <P></P><!----------------------- W七文? COOKIE -------------------> <P><SPAN lang=EN-US>七、JSP和SERVLET的区?</SPAN></P> <P><SPAN lang=EN-US>SUN首先发展出SERVLETQ其功能比较强劲Q体p设计也很先q,只是Q它输出HTML语句q是采用?jin)老的CGI方式Q是一句一句输出,所以,~写和修改HTML非常不方ѝ?后来SUN推出?jin)类gASP的JSPQ把JAVA代码嵌套到HTML语句中,q样Q就大大化和方便?jin)网늚设计和修攏VASPQPHPQJSP都是嵌套型的SCRIPT语言?一个分布式pȝ应分Z层:(x)表示?业务逻辑?数据存取?在J2EE体系l构?SERVLET用来写业务逻辑层是很强大的Q但是对于写表示层就很不方便。JSP则主要是Z(jin)方便写表C层而设计的。ENTITY BEAN实现数据存取层,SESSION BEAN实现业务逻辑层。如果是单的应用pȝ,可采用JSP+BEANS的结构进行设?JSP中应该仅仅存放与表示层有关的东西Q也是_(d)只放输出HTML|页的部份。而所有的数据计算Q数据分析,数据库联l处理,l统是属于业务逻辑层,应该攑֜JAVA BEANS中。通过JSP调用JAVA BEANSQ实C层的整合?实际上,微Y的DNA技术,单说Q就是ASP+COM/DCOM技术。与JSP+BEANS完全cMQ所有的表示层由ASP完成Q所有的业务逻辑由COM/DCOM完成?Z么要采用q些lg技术呢Q因为单U的ASP/JSP语言是非怽效率执行的,如果出现大量用户点击Q纯SCRIPT语言很快到达了(jin)他的功能上限Q而组件技术就能大q度提高功能上限Q加快执行速度。另外一斚wQ纯SCRIPT语言表C层和业务逻辑层؜在一P造成修改不方便,q且代码不能重复利用Q采用组件技术就只改lg可以了(jin)?对于复杂的应用,应该采用ENTITY BEAN实现数据存取层,SESSION BEAN实现业务逻辑层,用JSP来调用SESSION BEANQ由SESSION BEAN调用ENTITY BEAN。即采用JSP+EJB来构Z个复杂的分布式系l。它比JSP+BEANh更高的吞吐量Q可靠性,安全性。综上所qͼ对简单应用,可采用JSP+BAENQ对复杂的应用系l,应采用JSP+EJBQSERVLET变的无轻重。用JSP完全可替代它?/SPAN></P><img src ="http://www.aygfsteel.com/badboy/aggbug/33205.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/badboy/" target="_blank">badboy</a> 2006-03-02 14:23 <a href="http://www.aygfsteel.com/badboy/articles/33205.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>~写U程安全的JSPE序http://www.aygfsteel.com/badboy/articles/33204.htmlbadboybadboyThu, 02 Mar 2006 06:22:00 GMThttp://www.aygfsteel.com/badboy/articles/33204.htmlhttp://www.aygfsteel.com/badboy/comments/33204.htmlhttp://www.aygfsteel.com/badboy/articles/33204.html#Feedback0http://www.aygfsteel.com/badboy/comments/commentRss/33204.htmlhttp://www.aygfsteel.com/badboy/services/trackbacks/33204.htmlJSP默认是以多线E方式执行的Q这是JSP与ASPQPHPQPERL{脚本语a不一L(fng)地方Q也是它的优势之一Q但如果不注意多U程中的同步问题Q会(x)使所写的JSPE序有难以发现的错误。下面以一个例子说明JSP中的多线E问题及(qing)解决Ҏ(gu)?

一、JSP的中存在的多U程问题Q?/P>

当客L(fng)W一ơ请求某一个JSP文gӞ服务端把该JSP~译成一个CLASS文gQƈ创徏一个该cȝ实例Q然后创Z个线E处理CLIENT端的h。如果有多个客户端同时请求该JSP文gQ则服务端会(x)创徏多个U程。每个客L(fng)h对应一个线E。以多线E方式执行可大大降低对系l的资源需?提高pȝ的ƈ发量?qing)响应时?对JSP中可能用的的变量说明如下:

  1. 实例变量
    实例变量是在堆中分配?q被属于该实例的所有线E共享,所以不是线E安全的.
  2. JSPpȝ提供?个类变量
    JSP中用到的OUT,REQUEST,RESPONSE,SESSION,CONFIG,PAGE,PAGECONXT是线E安全的,APPLICATION在整个系l内被?所以不是线E安全的.
  3. 局部变?BR>局部变量在堆栈中分?因ؓ(f)每个U程都有它自q堆栈I间,所以是U程安全?
  4. ?rn)态类
    ?rn)态类不用被实例化,可直接使用,也不是线E安全的.
  5. 外部资源:
    在程序中可能?x)有多个U程或进E同时操作同一个资??多个U程或进E同时对一个文件进行写操作).此时也要注意同步问题.

二、下面的例子存在的多U程问题Q?/P>

<%@ page import="
javax.naming.*,
java.util.*,
java.sql.*,
weblogic.common.*
" %>
 

<%
String name
String product;
long  quantity;


name=request.getParameter("name");
product=request.getParameter("product");
quantity=request.getParameter("quantity"); /*(1)*/
savebuy();
%>


<%!
public void  savebuy()
{
    /*q行数据库操作,把数据保存到表中*/
    try {
      Properties props = new Properties();
      props.put("user","scott");
      props.put("password","tiger");
      props.put("server","DEMO");  

      Driver myDriver = (Driver) iver").newInstance();
      conn = myDriver.connect("jdbc:weblogic:oracle", props);
      stmt = conn.createStatement();
   
      String inssql = "insert into buy(empid, name, dept) values (?, ?, ?,?)";
      stmt = conn.prepareStatement(inssql);

      stmt.setString(1, name);
      stmt.setString(2, procuct);   
      stmt.setInt(3, quantity);
      stmt.execute();
    }
    catch (Exception e)
    {
        System.out.println("SQLException was thrown: " + e.getMessage());
    }
    finally //close connections and     {
        try {
          if(stmt != null)
            stmt.close();
          if(conn != null)
            conn.close();
        } catch (SQLException sqle) {
            System.out.println("SQLException was thrown: " + sqle.getMessage());
        }
    }
}
%>

上面的程序模拟网上购物中的一部分,把用户在览器中输入的用户名,购买的物品名U?数量保存到表BUY中。在savebuy()函数中用C(jin)实例变量,所以它不是U程安全?因ؓ(f):E序中的每一条语句都不是原子操作,如name=request.getParameter("name");在执行是?x)对应多个机器指?在Q何时候都可能因系l调度而{入睡眠状?让其他的U程l箋(hu)执行.如果U程A在执行到(1)的时候{入睡眠状?U程B开始执行ƈ改变QUANTITY的?那么当又到A执行?它会(x)从调用savebuy()函数开始执行,q样它保存到表中的QUANTITY是被U程B改过的?那么U程A对应的用h实际购买的数量与保持到表中的数据不一?q是个很严重的问?

三、解x(chng)?/P>

  1. 采用单线E方?
    在该JSP文g中加? <%@ page isThreadSafe="false" %>,使它以单U程方式执行,q时Q仍然只有一个实例,所有客L(fng)的请求以串行?式执行。这样会(x)降低pȝ的性能.
  2. 对函数savebuy()加synchronizedq行U程同步,该JSP仍然以多U程方式执行Q但也会(x)降低pȝ的性能
    public synchronized void savebuy()
    {
           ......
    }
  3. 采用局部变量代替实例变?函数savebuy()声明如下:
    因ؓ(f)在savebuy()中用的是传l他的Ş?是在堆栈中分配的,所以是U程安全?
    public void savebuy(String name,String product, int quantity)
    {
          ......
    }

    调用方式改ؓ(f):
    <%
    String name
    String product;
    long quantity;

    name=request.getParameter("name");
    product=request.getParameter("product");
    quantity=request.getParameter("quantity");
    savebuy(name,product,quantity)
    %>

    如果savebuy的参数很?或这些数据要在很多地方用?也可声明一个类,q用他做参数,?

    public class buyinfo
    {
          String name;
          String product;
          long quantity;
    }

    public void savebuy(buyinfo info)
    {
          ......
    }

    调用方式改ؓ(f):
    <%
    buyinfo userbuy = new buyinfo();

    userbuy.name=request.getParameter("name");
    userbuy.product=request.getParameter("product");
    userbuy.quantity=request.getParameter("quantity");
    savebuy(userbuy);
    %>

所以最好是?,因ؓ(f)1,2?x)降低系l的性能.
多线E问题(sh)般只有在在大q发量访问时Q才有可能出玎ͼq且很难重复出现Q所以应在编E时时L意?



badboy 2006-03-02 14:22 发表评论
]]>
改善Java Servletq行性能http://www.aygfsteel.com/badboy/articles/33196.htmlbadboybadboyThu, 02 Mar 2006 06:02:00 GMThttp://www.aygfsteel.com/badboy/articles/33196.htmlhttp://www.aygfsteel.com/badboy/comments/33196.htmlhttp://www.aygfsteel.com/badboy/articles/33196.html#Feedback0http://www.aygfsteel.com/badboy/comments/commentRss/33196.htmlhttp://www.aygfsteel.com/badboy/services/trackbacks/33196.html   q是个老生常谈的问题,但是在写servlet的时候,很多人在输出htmlӞ
q样?BR>String a = "<html> ";
String b = "</html>";
String c = a + b;
应该使用StringBufferQ?BR>String a = "<html> ";
String b = "</html>";
StringBuffer sb = new StringBuffer(a);
sb.append(b);
String c = sb.toString();
最好用StringBuffer的带参数构造来代替默认的构造函敎ͼ因ؓ(f)StringBuffer的append()Ҏ(gu)q回
一个StringBuffer实例Q最好的写法是这P(x)
StringBuffer sb = new StringBuffer(256);
StringBuffer sb = new StringBuffer();
sb.append("<html> ").append("</html>");
2.不要使用StringTokenizer
  例如解析字符?BR>  import java.util.StringTokenizer;
public class TestStringTokenizer
{
public static void main(String[] args)
{
String s = "a,b,c,d";
StringTokenizer st = new StringTokenizer(s, ",");
while (st.hasMoreTokens())
{
String token = st.nextToken();
System.out.println(token);
}
}
}
可以使用String.indexOf()完成相同的功?BR>public class TestIndexOf
{
public static void main(String[] args)
{
String s = "a,b,c,d";
int begin = 0;
int end = s.indexOf(",");
while (true)
{
String token = null;
if (end == -1)
{
token = s.substring(begin);
}
else
{
token = s.substring(begin, end);
}
System.out.println(token);
// End if there are no more delimiters
if (end == -1) break;
begin = end + 1;
end = s.indexOf(",", begin);
}
}
}
3.一般不要log输出
   一般不要用System.out.println()作ؓ(f)日志输出Q最好用log4j,更易于打开和关闭输?BR>     if(logger.isDebugEnabled()){
            logger.debug("logging method handleRequestInternal()....");
        }
4.避免不必要同?BR>   servlet容器是个多线E的pȝQjava的关键字synchronized.避免某些情况的程序死锁,但是性能实大大的降低了(jin)?BR>除非特别必要Q否则不要用synchronized?BR>5.量使用PreparedStatement
多次使用相同的查询语句,PreparedStatement的效率很高,而且避免?jin)sql注入?BR>6.量使用q接?BR>使用q接池,可以减少建立q接的时_(d)而且可以减轻数据库的q接压力?BR>7.大量的用cache
对于l常查询相同数据的网站程序,使用cache是优化的不二法门Qoscache是个廉h(hun)的方案?BR>8.优化servlet容器
  关闭容器的loggingQ加大他的File read cache sizeQ加大容器的U程敎ͼ止servlet的重新加载?BR>9.优化jvmQ加大heap的初始化字节敎ͼ降低虚拟机的垃圾回收频率Q?BR>

badboy 2006-03-02 14:02 发表评论
]]>
面试试题http://www.aygfsteel.com/badboy/articles/33192.htmlbadboybadboyThu, 02 Mar 2006 05:56:00 GMThttp://www.aygfsteel.com/badboy/articles/33192.htmlhttp://www.aygfsteel.com/badboy/comments/33192.htmlhttp://www.aygfsteel.com/badboy/articles/33192.html#Feedback0http://www.aygfsteel.com/badboy/comments/commentRss/33192.htmlhttp://www.aygfsteel.com/badboy/services/trackbacks/33192.html很快毕业了(jin)Q之前去q面试两家公叔R考到一些javaQlinuxQSQLQ智力等的题目,今天惛_个ȝ把网上找到的面试题目整合一下,方便偶以后面试所用,也当复习(fn)一下基?br />java基础题:(x)

1、作用域public,private,protected,以及(qing)不写时的区别
{:(x)区别如下Q?
作用?当前c?同一package 子孙c?其他package
public ????
protected ???×
friendly ??× ×
private ?× × ×
不写旉认ؓ(f)friendly

2、ArrayList和Vector的区?HashMap和Hashtable的区?/font>
{:(x)ArrayList与Vector主要从二斚w来说.
一.同步?Vector是线E安全的Q也是说是同步的,而ArrayList是线E序不安全的Q不是同步的
?数据增长:当需要增长时,Vector默认增长为原来一培,而ArrayList却是原来的一?
HashMap与HashTable主要从三斚w来说?
一.历史原因:Hashtable是基于陈旧的DictionarycȝQHashMap是Java 1.2引进的Map接口的一个实?
?同步?Hashtable是线E安全的Q也是说是同步的,而HashMap是线E序不安全的Q不是同步的
?|(x)只有HashMap可以让你空gZ个表的条目的key或value

3、char型变量中能不能存贮一个中文汉?Z?
{:(x)是能够定义成Z个中文的Q因为java中以unicode~码Q一个char?6个字节,所以放一个中文是没问题的

4、多U程有几U实现方?都是什?同步有几U实现方?都是什?
{:(x)多线E有两种实现Ҏ(gu)Q分别是l承ThreadcM实现Runnable接口
同步的实现方面有两种Q分别是synchronized,wait与notify

5、(h)承时候类的执行顺序问?一般都是选择?问你会(x)打印Z?
{?父类Q?
package test;
public class FatherClass
{
public FatherClass()
{
System.out.println("FatherClass Create");
}
}
子类:
package test;
import test.FatherClass;
public class ChildClass extends FatherClass
{
public ChildClass()
{
System.out.println("ChildClass Create");
}
public static void main(String[] args)
{
FatherClass fc = new FatherClass();
ChildClass cc = new ChildClass();
}
}
输出l果Q?
C:\>java test.ChildClass
FatherClass Create
FatherClass Create
ChildClass Create

6、内部类的实现方?
{:(x)CZ代码如下Q?
package test;
public class OuterClass
{
private class InterClass
{
public InterClass()
{
System.out.println("InterClass Create");
}
}
public OuterClass()
{
InterClass ic = new InterClass();
System.out.println("OuterClass Create");
}
public static void main(String[] args)
{
OuterClass oc = new OuterClass();
}
}
输出l果:
C:\>java test/OuterClass
InterClass Create
OuterClass Create
再一个例题:(x)
public class OuterClass {
private double d1 = 1.0;
//insert code here
}
You need to insert an inner class declaration at line 3. Which two inner class declarations are

valid?(Choose two.)
A. class InnerOne{
public static double methoda() {return d1;}
}
B. public class InnerOne{
static double methoda() {return d1;}
}
C. private class InnerOne{
double methoda() {return d1;}
}
D. static class InnerOne{
protected double methoda() {return d1;}
}
E. abstract class InnerOne{
public abstract double methoda();
}
说明如下Q?
一.?rn)态内部类可以有静(rn)态成员,而非?rn)态内部类则不能有?rn)态成员??A、B ?
??rn)态内部类的非?rn)态成员可以访问外部类的静(rn)态变量,而不可访问外部类的非?rn)态变量;return d1 出错?

?D ?
?非静(rn)态内部类的非?rn)态成员可以访问外部类的非?rn)态变量??C 正确
?{案为C、E

7、垃圑֛收机?如何优化E序?
希望大家补上Q谢?

8、float型float f=3.4是否正确?
{?不正。精度不准确,应该用强制类型{换,如下所C:(x)float f=(float)3.4

9、介lJAVA中的Collection FrameWork(包括如何写自q数据l构)?
{:(x)Collection FrameWork如下Q?
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection是最基本的集合接口,一个Collection代表一lObjectQ即Collection的元素(ElementsQ?
Map提供key到value的映?

10、Java中异常处理机Ӟ事g机制Q?/font>

11、JAVA中的多Ş与(h)承?
希望大家补上Q谢?

12、抽象类与接口?
{:(x)抽象cM接口都用于抽象,但是抽象c?JAVA?可以有自q部分实现Q而接口则完全是一个标?同时有多重(h)承的功能)?

13、Java 的通信~程Q编E题(或问{?Q用JAVA SOCKET~程Q读服务器几个字W,再写入本地显C?/font>Q?
{?Server端程?
package test;
import java.net.*;
import java.io.*;

public class Server
{
private ServerSocket ss;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public Server()
{
try
{
ss=new ServerSocket(10000);
while(true)
{
socket = ss.accept();
String RemoteIP = socket.getInetAddress().getHostAddress();
String RemotePort = ":"+socket.getLocalPort();
System.out.println("A client come in!IP:"+RemoteIP+RemotePort);
in = new BufferedReader(new

InputStreamReader(socket.getInputStream()));
String line = in.readLine();
System.out.println("Cleint send is :" + line);
out = new PrintWriter(socket.getOutputStream(),true);
out.println("Your Message Received!");
out.close();
in.close();
socket.close();
}
}catch (IOException e)
{
out.println("wrong");
}
}
public static void main(String[] args)
{
new Server();
}
};
Client端程?
package test;
import java.io.*;
import java.net.*;

public class Client
{
Socket socket;
BufferedReader in;
PrintWriter out;
public Client()
{
try
{
System.out.println("Try to Connect to 127.0.0.1:10000");
socket = new Socket("127.0.0.1",10000);
System.out.println("The Server Connected!");
System.out.println("Please enter some Character:");
BufferedReader line = new BufferedReader(new

InputStreamReader(System.in));
out = new PrintWriter(socket.getOutputStream(),true);
out.println(line.readLine());
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
System.out.println(in.readLine());
out.close();
in.close();
socket.close();
}catch(IOException e)
{
out.println("Wrong");
}
}
public static void main(String[] args)
{
new Client();
}
};

14、用JAVA实现一U排序,JAVAcd现序列化的方?二种)Q?如在COLLECTION框架中,实现比较要实C么样的接口?
{?用插入法q行排序代码如下
package test;
import java.util.*;
class InsertSort
{
ArrayList al;
public InsertSort(int num,int mod)
{
al = new ArrayList(num);
Random rand = new Random();
System.out.println("The ArrayList Sort Before:");
for (int i=0;i<num ;i++ )
{
al.add(new Integer(Math.abs(rand.nextInt()) % mod + 1));
System.out.println("al["+i+"]="+al.get(i));
}
}
public void SortIt()
{
Integer tempInt;
int MaxSize=1;
for(int i=1;i<al.size();i++)
{
tempInt = (Integer)al.remove(i);
if(tempInt.intValue()>=((Integer)al.get(MaxSize-1)).intValue())
{
al.add(MaxSize,tempInt);
MaxSize++;
System.out.println(al.toString());
} else {
for (int j=0;j<MaxSize ;j++ )
{
if

(((Integer)al.get(j)).intValue()>=tempInt.intValue())
{
al.add(j,tempInt);
MaxSize++;
System.out.println(al.toString());
break;
}
}
}
}
System.out.println("The ArrayList Sort After:");
for(int i=0;i<al.size();i++)
{
System.out.println("al["+i+"]="+al.get(i));
}
}
public static void main(String[] args)
{
InsertSort is = new InsertSort(10,100);
is.SortIt();
}
}
JAVAcd现序例化的方法是实现java.io.Serializable接口
Collection框架中实现比较要实现Comparable 接口?Comparator 接口

15、编E:(x)~写一个截取字W串的函敎ͼ输入Z个字W串和字节数Q输Zؓ(f)按字节截取的字符丌Ӏ?但是要保证汉字不被截半个Q如“我ABC?Q应该截为“我AB”,输入“我ABC汉DEF”,6Q应该输Zؓ(f)“我ABC”而不是“我ABC+汉的半个”?/font>
{:(x)代码如下Q?
package test;

class SplitString
{
String SplitStr;
int SplitByte;
public SplitString(String str,int bytes)
{
SplitStr=str;
SplitByte=bytes;
System.out.println("The String is:?+SplitStr+"?SplitBytes="+SplitByte);
}
public void SplitIt()
{
int loopCount;

loopCount=(SplitStr.length()%SplitByte==0)?(SplitStr.length()/SplitByte):(SplitStr.length()/Split

Byte+1);
System.out.println("Will Split into "+loopCount);
for (int i=1;i<=loopCount ;i++ )
{
if (i==loopCount){

System.out.println(SplitStr.substring((i-1)*SplitByte,SplitStr.length()));
} else {

System.out.println(SplitStr.substring((i-1)*SplitByte,(i*SplitByte)));

Jsp斚w

1、jsp有哪些内|对?作用分别是什?
{?JSP共有以下9U基本内|组Ӟ可与ASP?U内部组件相对应Q:(x)
 request 用户端请求,此请求会(x)包含来自GET/POSTh的参?
response |页传回用户端的回应
pageContext |页的属性是在这里管?
session 与请求有关的?x)话?
application servlet 正在执行的内?
out 用来传送回应的输出
config servlet的构枉?
page JSP|页本n
exception 针对错误|页Q未捕捉的例?

2、jsp有哪些动?作用分别是什?
{?JSP共有以下6U基本动?
jsp:includeQ在面被请求的时候引入一个文件?
jsp:useBeanQ寻找或者实例化一?font color="#000000">JavaBean
?
jsp:setPropertyQ设|JavaBean的属性?
jsp:getPropertyQ输出某个JavaBean的属性?
jsp:forwardQ把h转到一个新的页面?
jsp:pluginQ根据浏览器cd为Java插g生成OBJECT或EMBED标记

3、JSP中动态INCLUDE与静(rn)态INCLUDE的区别?
{:(x)动态INCLUDE用jsp:include动作实现
<jsp:include page="included.jsp" flush="true" />它L?x)检查所含文件中的变化,适合用于包含动态页面,q且可以带参?
?rn)态INCLUDE用include伪码实现,定不?x)检查所含文件的变化Q适用于包含静(rn)态页?
<%@ include file="included.htm" %>

4、两U蟩转方式分别是什?有什么区?
{:(x)有两U,分别为:(x)
<jsp:include page="included.jsp" flush="true">
<jsp:forward page= "nextpage.jsp"/>
前者页面不?x){向include所指的面Q只是显C늚l果Q主面q是原来的页面。执行完后还?sh)(x)回来,相当于函数调用。ƈ且可以带参数.后者完全{向新面Q不?x)再回来。相当于go to 语句?

Servlet斚w (tng)

1、说一说Servlet的生命周? (tng)
{?servlet有良好的生存期的定义Q包括加载和实例化、初始化、处理请求以?qing)服务结束。这个生存期由javax.servlet.Servlet接口的init,service和destroyҎ(gu)表达。?br />
2、Servlet版本?忘(sh)(jin)问的是哪两个版本?的不? (tng)
希望大家补上Q谢谢?br />
3、JAVA (tng)SERVLET (tng)API中forward() (tng)与redirect()的区别? (tng)
{?前者仅是容器中控制权的转向Q在客户端浏览器地址栏中不会(x)昄?gu){向后的地址Q后者则是完全的跌{Q浏览器会(x)得到跌{的地址Qƈ重新发送请求链接。这P从浏览器的地址栏中可以看到跌{后的链接地址。所以,前者更加高效,在前者可以满需要时Q尽量用forward()Ҏ(gu)Qƈ且,q样也有助于隐藏实际的链接。在有些情况下,比如Q需要蟩转到一个其它服务器上的资源Q则必须使用sendRedirect()Ҏ(gu)。?br />
4、Servlet的基本架?/font> (tng)
public (tng)class (tng)ServletName (tng)extends (tng)HttpServlet (tng){ (tng)
public (tng)void (tng)doPost(HttpServletRequest (tng)request, (tng)HttpServletResponse (tng)response) (tng)throws (tng)
ServletException, (tng)I(yng)OException (tng){ (tng)
} (tng)
public (tng)void (tng)doGet(HttpServletRequest (tng)request, (tng)HttpServletResponse (tng)response) (tng)throws (tng)
ServletException, (tng)I(yng)OException (tng){ (tng)
} (tng)
} (tng)

Xml斚w

1、xml有哪些解析技?区别是什?
{?有DOM,SAX,STAX{?
DOM:处理大型文g时其性能下降的非常厉実뀂这个问题是由DOM的树(wi)l构所造成的,q种l构占用的内存较多,而且DOM必须在解析文件之前把整个文装入内存,适合对XML的随问SAX:不现于DOM,SAX是事仉动型的XML解析方式。它序dXML文gQ不需要一ơ全部装载整个文件。当遇到像文件开_(d)文l束Q或者标{ּ头与标签l束Ӟ它会(x)触发一个事Ӟ用户通过在其回调事g中写入处理代码来处理XML文gQ适合对XML的顺序访?
STAX:Streaming API for XML (StAX)

2、你在项目中用到?jin)xml技术的哪些斚w?如何实现?
{?用到?jin)数据存贮,信息配置两方面。在做数据交换^台时Q将不能数据源的数据l装成XML文gQ然后将XML文g压羃打包加密后通过|络传送给接收者,接收解密与解压羃后再同XML文g中还原相关信息进行处理。在做Y仉|时Q利用XML可以很方便的q行QY件的各种配置参数都存贮在XML文g中?

设计模式斚w

1、开发中都用C(jin)那些设计模式?用在什么场?
{:(x)每个模式都描qC(jin)一个在我们的环境中不断出现的问题,然后描述?jin)该问题的解x(chng)案的核心(j)。通过q种方式Q你可以无数ơ地使用那些已有的解x(chng)案,无需在重复相同的工作。主要用C(jin)MVC的设计模式。用来开发JSP/Servlet或者J2EE的相兛_用。简单工厂模式等?

2、UML斚w (tng)有哪五种图视 (tng)
{:(x)标准建模语言UML。用例图,?rn)态图(包括cd、对象图和包?,行ؓ(f)?交互?序?合作?,实现?

JavaScript斚w

1、如何校验数字型?
var re=/^\d{1,8}$|\.\d{1,2}$/;
var str=document.form1.all(i).value;
var r=str.match(re);
if (r==null)
{
sign=-4;
break;
}
else{
document.form1.all(i).value=parseFloat(str);
}

LINUX斚w

1、LINUX下线E,GDIcȝ解释?/font>
{:(x)LINUX实现的就是基于核?j)轻量q程?一对一"U程模型Q一个线E实体对应一个核?j)轻量q程Q而线E之间的理在核外函数库中实现?
GDIcMؓ(f)囑փ讑֤~程接口cd?br />
变态试题集

1。变态指?4
int x=4;
System.out.println("value is " +((x>4)?99.9:9));
{案 9.0 问号表达式的后面两个条g有要?因ؓ(f)前面的是float,所以后面{为float.
估计出题者才通过SCJP的考试?/font>
2.变态指?5
public class Test {

public static void main(String[] args) {
int x = 4;
java.util.Date date = (x > 4) ? new A() : new B();
}
}

class A extends java.util.Date {}
class B extends java.util.Date {}
{案 ~译不通过,
不知道出题(sh)h的意?/font>
3.变态指?6
String s=new String("abc");
创徏?jin)几个String对象Q?br />{案 2?
q样的公司最好不要去

4.变态指?7
const是不是java的关键字Q?br />{案 const是java的关键字,但是java没有实现?
一般hl对用不到它

5.变态指?8
Qshort s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
{案 1?对,1因ؓ(f)向上转型?最后导致类型不匚w错误 ,
因ؓ(f)s1?=是一个操作符Q能够自动{?
short s1 = 1;
s1 = s1+1;q句话在c++里面可以?
不知道出题(sh)h的意?/font>
6.变态指?9
上v贝尔的面试题:你认为效率最高的Ҏ(gu),实现?加到100.
{案 1-100的篏加相当于?0?01Q这样@环次C100ơ降?0ơ:(x)
int sun = 0
for(int i = 1,j = 100 ; i <= 50 ; i++,j--){
 (tng) (tng) (tng) sun = sun + i + j;
} (tng)
出题?sh)子有问?直接(1+100)*50不是最?..其实cMq样的优化应该不是程序员考虑的范畴吧
7.变态指?10
 (tng)System.out.println(5.0942*1000);
 (tng) (tng) (tng) (tng) System.out.println(5.0943*1000);
 (tng) System.out.println(5.0944*1000);的结?br />{案 :5094.2 5094.299999999999 5094.400000000001
原理和QҎ(gu)的计机表示方式有关 ,你不用上?q对了(jin),你最好去微Y,接替安d?dng)?



badboy 2006-03-02 13:56 发表评论
]]>
string和stringbuffer区别http://www.aygfsteel.com/badboy/articles/33190.htmlbadboybadboyThu, 02 Mar 2006 05:54:00 GMThttp://www.aygfsteel.com/badboy/articles/33190.htmlhttp://www.aygfsteel.com/badboy/comments/33190.htmlhttp://www.aygfsteel.com/badboy/articles/33190.html#Feedback0http://www.aygfsteel.com/badboy/comments/commentRss/33190.htmlhttp://www.aygfsteel.com/badboy/services/trackbacks/33190.html

 q是好友面试的一道题Q其实我知道使用的区别,StringBuffer必须new出来QStringBuffer的append的效率比string?=的效率高Q?BR>其实发现q有很大的区别,看了(jin)看以前scjp的考题
public class Test {
   public static void stringReplace (String text) {
   text = text.replace('j' , 'i');
   }
  
   public static void bufferReplace (StringBuffer text) {
   text = text.append("C");
   }
  
    public static void main (String args[]) {
    String textString = new String ("java");
    StringBuffer textBuffer = new StringBuffer ("java");
   
    stringReplace (textString);
    bufferReplace (textBuffer);
   
    System.out.println (textString + textBuffer);
    }
    }
{案?javajavaC
q是Java参数传?by value)造成?是不可变?immutable).,例如 基本cdQString传|复制?jin)g递过去;可变的(ObjectQ传|复制?jin)引用传递过厅R?

而题目中W七行text = text.append (“C?QappendҎ(gu)?x)改变text中的?BR>而这个text与main中的textBuffer是指向同一个对象,所以对应的输出是javac?BR>string的值永q不?x)改变?/FONT>


String a = "a";//假设a指向地址0x0001Q?BR>a = "b";//重新负值后a指向地址0x0002Q但0x0001地址中保存的"a"依旧存在Q但已经不再是a所指向的?BR>从表面上看Stringcd的对象改变(sh)(jin)|但事实是他不能改变|只能改变指向的地址


StringBuffer则不同,直接改变指向的地址中保留的?BR>q有
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2)//Z么是false

String s1 = new String("a");
String s2 = new String("a");
s1.equals(s2)//Z么是true
StringBuffercM没有重新定义equalsq个Ҏ(gu)Q因此这个方法就来自Objectc,
而ObjectcM的equalsҎ(gu)是用来比较地址的,所以等于false.

StringcM重新定义?jin)equalsq个Ҏ(gu)Q而且比较的是|而不是地址。所以会(x)?BR>true?BR>对于q样能不能面试出真正的水qI感到怀疑?/P>

badboy 2006-03-02 13:54 发表评论
]]>
վ֩ģ壺 | Դ| | | | ޶| ػ| ̫| ɽ| ̨| ɽ| | | | | | ˫| | DZ| | | Ҿ| ͷ| | ĵ| ˰| | | | | | | | | ɽ| | | ԣ| | | |