简单的用 Java Socket 编写的 HTTP 服务器应用,帮助学习HTTP协议

/**
 * SimpleHttpServer.java
 
*/

import  java.io. * ;
import  java.net. * ;
import  java.util.StringTokenizer;

/**
 * 一个简单的用 Java Socket 编写的 HTTP 服务器应用, 演示了请求和应答的协议通信内容以及
 * 给客户端返回 HTML 文本和二进制数据文件(一个图片), 同时展示了 404, 200 等状态码.
 * 首先运行这个程序,然后打开Web浏览器,键入http://localhost,则这个程序能够显示出浏览器发送了那些信息
 * 并且向浏览器返回一个网页和一副图片, 并测试同浏览器对话.
 * 当浏览器看到 HTML 中带有图片地址时, 则会发出第二次连接来请求图片等资源.
 * 这个例子可以帮您理解 Java 的 HTTP 服务器软件是基于 J2SE 的 Socket 等软件编写的概念, 并熟悉
 * HTTP 协议.
 * 相反的用 Telnet 连接到已有的服务器则可以帮忙理解浏览器的运行过程和服务器端的返回内容.
 *
 * 

 *       当用户在Web浏览器地址栏中输入一个带有http://前缀的URL并按下Enter后,或者在Web页面中某个以http://开头的超链接上单击鼠标,HTTP事务处理的第一个阶段--建立连接阶段就开始了.HTTP的默认端口是80.
 *    随着连接的建立,HTTP就进入了客户向服务器发送请求的阶段.客户向服务器发送的请求是一个有特定格式的ASCII消息,其语法规则为:
 * < Method > < URL > < HTTP Version > 
 * { 
: }*
 * 
 * { Entity Body }
 *    请求消息的顶端是请求行,用于指定方法,URL和HTTP协议的版本,请求行的最后是回车换行.方法有GET,POST,HEAD,PUT,DELETE等.
 * 在请求行之后是若干个报头(Header)行.每个报头行都是由一个报头和一个取值构成的二元对,报头和取值之间以":"分隔;报头行的最后是回车换行.常见的报头有Accept(指定MIME媒体类型),Accept_Charset(响应消息的编码方式),Accept_Encoding(响应消息的字符集),User_Agent(用户的浏览器信息)等.
 *    在请求消息的报头行之后是一个回车换行,表明请求消息的报头部分结束.在这个/n之后是请求消息的消息实体(Entity Body).具体的例子参看httpRequest.txt.
 *     Web服务器在收到客户请求并作出处理之后,要向客户发送应答消息.与请求消息一样,应答消息的语法规则为:
 * < HTTP Version>  []
 * { 
:  } *
 * 
 * { Entity Body }
 *    应答消息的第一行为状态行,其中包括了HTTP版本号,状态码和对状态码进行简短解释的消息;状态行的最后是回车换行.状态码由3位数字组成,有5类: 
 * 参看:HTTP应答码及其意义 
 * 
 * 1XX 保留 
 * 2XX 表示成功 
 * 3XX 表示URL已经被移走 
 * 4XX 表示客户错误 
 * 5XX 表示服务器错误 
 * 例如:415,表示不支持改媒体类型;503,表示服务器不能访问.最常见的是200,表示成功.常见的报头有:Last_Modified(最后修改时间),Content_Type(消息内容的MIME类型),Content_Length(内容长度)等.
 *    在报头行之后也是一个回车换行,用以表示应答消息的报头部分的结束,以及应答消息实体的开始.
 *    下面是一个应答消息的例子:
 * HTTP/1.0 200 OK
 * Date: Moday,07-Apr-97 21:13:02 GMT
 * Server:NCSA/1.1
 * MIME_Version:1.0
 * Content_Type:text/html
 * Last_Modified:Thu Dec 5 09:28:01 1996
 * Coentent_Length:3107
 * 
 * <img src="http://img.e-com-net.com/image/info8/cf2297c5d37a4a768ec1be02efd856dd.gif" alt="" width="0" height="0"></HTML><br> * <br> * 在用Java语言实现HTTP服务器时,首先启动一个java.net.ServerSocket在提供服务的端口上监听连接.向客户返回文本时,可以用PrintWriter,但是如果返回二进制数据,则必须使用OutputStream.write(byte[])方法,返回的应答消息字符串可以使用String.getBytes()方法转换为字节数组返回,或者使用PrintStream的print()方法写入文本,用write(byte[])方法写入二进制数据.<br> * <br> * </pre><br> * </span> <span style="color:#808080;">@author</span> <span style="color:#008000;"> 刘长炯<br> * </span> <span style="color:#808080;">@version</span> <span style="color:#008000;"> 1.0 2007-07-24 Sunday<br> </span> <span style="color:#008000;">*/</span> <span style="color:#000000;"><br></span> <span style="color:#0000ff;">public</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">class</span> <span style="color:#000000;"> SimpleHttpServer </span> <span style="color:#0000ff;">implements</span> <span style="color:#000000;"> Runnable {<br>    </span> <span style="color:#008000;">/**</span> <span style="color:#008000;"><br>     * <br>     </span> <span style="color:#008000;">*/</span> <span style="color:#000000;"><br>    ServerSocket serverSocket;</span> <span style="color:#008000;">//</span> <span style="color:#008000;">服务器Socket</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">    <br>    </span> <span style="color:#008000;">/**</span> <span style="color:#008000;"><br>     * 服务器监听端口, 默认为 80.<br>     </span> <span style="color:#008000;">*/</span> <span style="color:#000000;"><br>    </span> <span style="color:#0000ff;">public</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">static</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">int</span> <span style="color:#000000;"> PORT</span> <span style="color:#000000;">=</span> <span style="color:#000000;">80</span> <span style="color:#000000;">;</span> <span style="color:#008000;">//</span> <span style="color:#008000;">标准HTTP端口</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">    <br>    </span> <span style="color:#008000;">/**</span> <span style="color:#008000;"><br>     * 开始服务器 Socket 线程.<br>     </span> <span style="color:#008000;">*/</span> <span style="color:#000000;"><br>    </span> <span style="color:#0000ff;">public</span> <span style="color:#000000;"> SimpleHttpServer() {<br>        </span> <span style="color:#0000ff;">try</span> <span style="color:#000000;"> {<br>            serverSocket</span> <span style="color:#000000;">=</span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> ServerSocket(PORT);<br>        } </span> <span style="color:#0000ff;">catch</span> <span style="color:#000000;">(Exception e) {<br>            System.out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">无法启动HTTP服务器:</span> <span style="color:#000000;">"</span> <span style="color:#000000;">+</span> <span style="color:#000000;">e.getLocalizedMessage());<br>        }<br>        </span> <span style="color:#0000ff;">if</span> <span style="color:#000000;">(serverSocket</span> <span style="color:#000000;">==</span> <span style="color:#0000ff;">null</span> <span style="color:#000000;">)  System.exit(</span> <span style="color:#000000;">1</span> <span style="color:#000000;">);</span> <span style="color:#008000;">//</span> <span style="color:#008000;">无法开始服务器</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">        </span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> Thread(</span> <span style="color:#0000ff;">this</span> <span style="color:#000000;">).start();<br>        System.out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">HTTP服务器正在运行,端口:</span> <span style="color:#000000;">"</span> <span style="color:#000000;">+</span> <span style="color:#000000;">PORT);<br>    }<br>    <br>    </span> <span style="color:#008000;">/**</span> <span style="color:#008000;"><br>     * 运行服务器主线程, 监听客户端请求并返回响应.<br>     </span> <span style="color:#008000;">*/</span> <span style="color:#000000;"><br>    </span> <span style="color:#0000ff;">public</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">void</span> <span style="color:#000000;"> run() {<br>        </span> <span style="color:#0000ff;">while</span> <span style="color:#000000;">(</span> <span style="color:#0000ff;">true</span> <span style="color:#000000;">) {<br>            </span> <span style="color:#0000ff;">try</span> <span style="color:#000000;"> {<br>                Socket client</span> <span style="color:#000000;">=</span> <span style="color:#0000ff;">null</span> <span style="color:#000000;">;</span> <span style="color:#008000;">//</span> <span style="color:#008000;">客户Socket</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                client</span> <span style="color:#000000;">=</span> <span style="color:#000000;">serverSocket.accept();</span> <span style="color:#008000;">//</span> <span style="color:#008000;">客户机(这里是 IE 等浏览器)已经连接到当前服务器</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                </span> <span style="color:#0000ff;">if</span> <span style="color:#000000;">(client</span> <span style="color:#000000;">!=</span> <span style="color:#0000ff;">null</span> <span style="color:#000000;">) {<br>                    System.out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">连接到服务器的用户:</span> <span style="color:#000000;">"</span> <span style="color:#000000;">+</span> <span style="color:#000000;">client);<br>                    </span> <span style="color:#0000ff;">try</span> <span style="color:#000000;"> {<br>                        </span> <span style="color:#008000;">//</span> <span style="color:#008000;"> 第一阶段: 打开输入流</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                        BufferedReader in</span> <span style="color:#000000;">=</span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> BufferedReader(</span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> InputStreamReader(<br>                                client.getInputStream()));<br>                        <br>                        System.out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">客户端发送的请求信息:/n***************</span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>                        </span> <span style="color:#008000;">//</span> <span style="color:#008000;"> 读取第一行, 请求地址</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                        String line</span> <span style="color:#000000;">=</span> <span style="color:#000000;">in.readLine();<br>                        System.out.println(line);<br>                        String resource</span> <span style="color:#000000;">=</span> <span style="color:#000000;">line.substring(line.indexOf(</span> <span style="color:#000000;">'</span> <span style="color:#000000;">/</span> <span style="color:#000000;">'</span> <span style="color:#000000;">),line.lastIndexOf(</span> <span style="color:#000000;">'</span> <span style="color:#000000;">/</span> <span style="color:#000000;">'</span> <span style="color:#000000;">)</span> <span style="color:#000000;">-</span> <span style="color:#000000;">5</span> <span style="color:#000000;">);<br>                        </span> <span style="color:#008000;">//</span> <span style="color:#008000;">获得请求的资源的地址</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                        resource</span> <span style="color:#000000;">=</span> <span style="color:#000000;">URLDecoder.decode(resource, </span> <span style="color:#000000;">"</span> <span style="color:#000000;">UTF-8</span> <span style="color:#000000;">"</span> <span style="color:#000000;">);</span> <span style="color:#008000;">//</span> <span style="color:#008000;">反编码 URL 地址</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                        String method </span> <span style="color:#000000;">=</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> StringTokenizer(line).nextElement().toString();</span> <span style="color:#008000;">//</span> <span style="color:#008000;"> 获取请求方法, GET 或者 POST<br><br>                        </span> <span style="color:#008000;">//</span> <span style="color:#008000;"> 读取所有浏览器发送过来的请求参数头部信息</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                        </span> <span style="color:#0000ff;">while</span> <span style="color:#000000;">( (line </span> <span style="color:#000000;">=</span> <span style="color:#000000;"> in.readLine()) </span> <span style="color:#000000;">!=</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">null</span> <span style="color:#000000;">) {<br>                            System.out.println(line);<br>                            <br>                            </span> <span style="color:#0000ff;">if</span> <span style="color:#000000;">(line.equals(</span> <span style="color:#000000;">""</span> <span style="color:#000000;">)) </span> <span style="color:#0000ff;">break</span> <span style="color:#000000;">;<br>                        }<br>                        <br>                        </span> <span style="color:#008000;">//</span> <span style="color:#008000;"> 显示 POST 表单提交的内容, 这个内容位于请求的主体部分</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                        </span> <span style="color:#0000ff;">if</span> <span style="color:#000000;">(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">POST</span> <span style="color:#000000;">"</span> <span style="color:#000000;">.equalsIgnoreCase(method)) {<br>                            System.out.println(in.readLine());<br>                        }<br>                        <br>                        System.out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">请求信息结束/n***************</span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>                        System.out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">用户请求的资源是:</span> <span style="color:#000000;">"</span> <span style="color:#000000;">+</span> <span style="color:#000000;">resource);<br>                        System.out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">请求的类型是: </span> <span style="color:#000000;">"</span> <span style="color:#000000;"> </span> <span style="color:#000000;">+</span> <span style="color:#000000;"> method);<br><br>                        </span> <span style="color:#008000;">//</span> <span style="color:#008000;"> GIF 图片就读取一个真实的图片数据并返回给客户端</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                        </span> <span style="color:#0000ff;">if</span> <span style="color:#000000;">(resource.endsWith(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">.gif</span> <span style="color:#000000;">"</span> <span style="color:#000000;">)) {<br>                            fileService(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">images/test.gif</span> <span style="color:#000000;">"</span> <span style="color:#000000;">, client);<br>                            closeSocket(client);<br>                            </span> <span style="color:#0000ff;">continue</span> <span style="color:#000000;">;<br>                        }<br>                        <br>                        </span> <span style="color:#008000;">//</span> <span style="color:#008000;"> 请求 JPG 格式就报错 404</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                        </span> <span style="color:#0000ff;">if</span> <span style="color:#000000;">(resource.endsWith(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">.jpg</span> <span style="color:#000000;">"</span> <span style="color:#000000;">)) {<br>                                                    PrintWriter out</span> <span style="color:#000000;">=</span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> PrintWriter(client.getOutputStream(),</span> <span style="color:#0000ff;">true</span> <span style="color:#000000;">);<br>                        out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">HTTP/1.0 404 Not found</span> <span style="color:#000000;">"</span> <span style="color:#000000;">);</span> <span style="color:#008000;">//</span> <span style="color:#008000;">返回应答消息,并结束应答</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                        out.println();</span> <span style="color:#008000;">//</span> <span style="color:#008000;"> 根据 HTTP 协议, 空行将结束头信息</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                        out.close();<br>                        closeSocket(client);<br>                        </span> <span style="color:#0000ff;">continue</span> <span style="color:#000000;">;<br>                        } </span> <span style="color:#0000ff;">else</span> <span style="color:#000000;"> {<br>                            </span> <span style="color:#008000;">//</span> <span style="color:#008000;"> 用 writer 对客户端 socket 输出一段 HTML 代码</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                            PrintWriter out</span> <span style="color:#000000;">=</span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> PrintWriter(client.getOutputStream(),</span> <span style="color:#0000ff;">true</span> <span style="color:#000000;">);<br>                            out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">HTTP/1.0 200 OK</span> <span style="color:#000000;">"</span> <span style="color:#000000;">);</span> <span style="color:#008000;">//</span> <span style="color:#008000;">返回应答消息,并结束应答</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                            out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">Content-Type:text/html;charset=GBK</span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>                            out.println();</span> <span style="color:#008000;">//</span> <span style="color:#008000;"> 根据 HTTP 协议, 空行将结束头信息</span> <span style="color:#008000;"><br></span> <span style="color:#000000;"><br>                            out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;"><h1> Hello Http Server</h1></span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>                            out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">你好, 这是一个 Java HTTP 服务器 demo 应用.<br></span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>                            out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">您请求的路径是: </span> <span style="color:#000000;">"</span> <span style="color:#000000;"> </span> <span style="color:#000000;">+</span> <span style="color:#000000;"> resource </span> <span style="color:#000000;">+</span> <span style="color:#000000;"> </span> <span style="color:#000000;">"</span> <span style="color:#000000;"><br></span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>                            out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">这是一个支持虚拟路径的图片:<img src='abc.gif'><br></span> <span style="color:#000000;">"</span> <span style="color:#000000;"> </span> <span style="color:#000000;">+</span> <span style="color:#000000;"><br>                                    </span> <span style="color:#000000;">"</span> <span style="color:#000000;"><a href='abc.gif'>点击打开abc.gif, 是个服务器虚拟路径的图片文件.</a></span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>                            out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;"><br>这是个会反馈 404 错误的的图片:<img src='test.jpg'><br><a href='test.jpg'>点击打开test.jpg</a><br></span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>                            out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;"><form method=post action='/'>POST 表单 <input name=username value='用户'> <input name=submit type=submit value=submit></form></span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>                            out.close();<br><br>                            closeSocket(client);<br>                        }<br>                    } </span> <span style="color:#0000ff;">catch</span> <span style="color:#000000;">(Exception e) {<br>                        System.out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">HTTP服务器错误:</span> <span style="color:#000000;">"</span> <span style="color:#000000;">+</span> <span style="color:#000000;">e.getLocalizedMessage());<br>                    }<br>                }<br>                </span> <span style="color:#008000;">//</span> <span style="color:#008000;">System.out.println(client+"连接到HTTP服务器");</span> <span style="color:#008000;">//</span> <span style="color:#008000;">如果加入这一句,服务器响应速度会很慢</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">            } </span> <span style="color:#0000ff;">catch</span> <span style="color:#000000;">(Exception e) {<br>                System.out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">HTTP服务器错误:</span> <span style="color:#000000;">"</span> <span style="color:#000000;">+</span> <span style="color:#000000;">e.getLocalizedMessage());<br>            }<br>        }<br>    }<br>    <br>    </span> <span style="color:#008000;">/**</span> <span style="color:#008000;"><br>     * 关闭客户端 socket 并打印一条调试信息.<br>     * </span> <span style="color:#808080;">@param</span> <span style="color:#008000;"> socket 客户端 socket.<br>     </span> <span style="color:#008000;">*/</span> <span style="color:#000000;"><br>    </span> <span style="color:#0000ff;">void</span> <span style="color:#000000;"> closeSocket(Socket socket) {<br>        </span> <span style="color:#0000ff;">try</span> <span style="color:#000000;"> {<br>            socket.close();<br>        } </span> <span style="color:#0000ff;">catch</span> <span style="color:#000000;"> (IOException ex) {<br>            ex.printStackTrace();<br>        }<br>                            System.out.println(socket </span> <span style="color:#000000;">+</span> <span style="color:#000000;"> </span> <span style="color:#000000;">"</span> <span style="color:#000000;">离开了HTTP服务器</span> <span style="color:#000000;">"</span> <span style="color:#000000;">);        <br>    }<br>    <br>    </span> <span style="color:#008000;">/**</span> <span style="color:#008000;"><br>     * 读取一个文件的内容并返回给浏览器端.<br>     * </span> <span style="color:#808080;">@param</span> <span style="color:#008000;"> fileName 文件名<br>     * </span> <span style="color:#808080;">@param</span> <span style="color:#008000;"> socket 客户端 socket.<br>     </span> <span style="color:#008000;">*/</span> <span style="color:#000000;"><br>        </span> <span style="color:#0000ff;">void</span> <span style="color:#000000;"> fileService(String fileName, Socket socket)<br>    {<br>            <br>        </span> <span style="color:#0000ff;">try</span> <span style="color:#000000;"><br>        {<br>            PrintStream out </span> <span style="color:#000000;">=</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> PrintStream(socket.getOutputStream(), </span> <span style="color:#0000ff;">true</span> <span style="color:#000000;">);<br>            File fileToSend </span> <span style="color:#000000;">=</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> File(fileName);<br>            </span> <span style="color:#0000ff;">if</span> <span style="color:#000000;">(fileToSend.exists() </span> <span style="color:#000000;">&&</span> <span style="color:#000000;"> </span> <span style="color:#000000;">!</span> <span style="color:#000000;">fileToSend.isDirectory())<br>            {<br>                out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">HTTP/1.0 200 OK</span> <span style="color:#000000;">"</span> <span style="color:#000000;">);</span> <span style="color:#008000;">//</span> <span style="color:#008000;">返回应答消息,并结束应答</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">Content-Type:application/binary</span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>                out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">Content-Length:</span> <span style="color:#000000;">"</span> <span style="color:#000000;"> </span> <span style="color:#000000;">+</span> <span style="color:#000000;"> fileToSend.length());</span> <span style="color:#008000;">//</span> <span style="color:#008000;"> 返回内容字节数</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                out.println();</span> <span style="color:#008000;">//</span> <span style="color:#008000;"> 根据 HTTP 协议, 空行将结束头信息</span> <span style="color:#008000;"><br></span> <span style="color:#000000;">                <br>                FileInputStream fis </span> <span style="color:#000000;">=</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> FileInputStream(fileToSend);<br>                </span> <span style="color:#0000ff;">byte</span> <span style="color:#000000;"> data[] </span> <span style="color:#000000;">=</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">byte</span> <span style="color:#000000;">[fis.available()];<br>                fis.read(data);<br>                out.write(data);<br>                out.close();<br>                fis.close();<br>            }<br>        }<br>        </span> <span style="color:#0000ff;">catch</span> <span style="color:#000000;">(Exception e)<br>        {<br>            System.out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">传送文件时出错:</span> <span style="color:#000000;">"</span> <span style="color:#000000;"> </span> <span style="color:#000000;">+</span> <span style="color:#000000;"> e.getLocalizedMessage());<br>        }<br>    }<br>    <br>    </span> <span style="color:#008000;">/**</span> <span style="color:#008000;"><br>     * 打印用途说明.<br>     </span> <span style="color:#008000;">*/</span> <span style="color:#000000;"><br>    </span> <span style="color:#0000ff;">private</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">static</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">void</span> <span style="color:#000000;"> usage() {<br>        System.out.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">Usage: java HTTPServer <port>/nDefault port is 80.</span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>    }<br>    <br>    <br>    </span> <span style="color:#008000;">/**</span> <span style="color:#008000;"><br>     * 启动简易 HTTP 服务器<br>     * </span> <span style="color:#808080;">@param</span> <span style="color:#008000;"> args <br>     </span> <span style="color:#008000;">*/</span> <span style="color:#000000;"><br>    </span> <span style="color:#0000ff;">public</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">static</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">void</span> <span style="color:#000000;"> main(String[] args) {<br>        </span> <span style="color:#0000ff;">try</span> <span style="color:#000000;"> {<br>            </span> <span style="color:#0000ff;">if</span> <span style="color:#000000;">(args.length </span> <span style="color:#000000;">!=</span> <span style="color:#000000;"> </span> <span style="color:#000000;">1</span> <span style="color:#000000;">) {<br>                usage();<br>            } </span> <span style="color:#0000ff;">else</span> <span style="color:#000000;"> </span> <span style="color:#0000ff;">if</span> <span style="color:#000000;">(args.length </span> <span style="color:#000000;">==</span> <span style="color:#000000;"> </span> <span style="color:#000000;">1</span> <span style="color:#000000;">) {<br>                PORT </span> <span style="color:#000000;">=</span> <span style="color:#000000;"> Integer.parseInt(args[</span> <span style="color:#000000;">0</span> <span style="color:#000000;">]);<br>            }<br>        } </span> <span style="color:#0000ff;">catch</span> <span style="color:#000000;"> (Exception ex) {<br>            System.err.println(</span> <span style="color:#000000;">"</span> <span style="color:#000000;">Invalid port arguments. It must be a integer that greater than 0</span> <span style="color:#000000;">"</span> <span style="color:#000000;">);<br>        }<br>        <br>        </span> <span style="color:#0000ff;">new</span> <span style="color:#000000;"> SimpleHttpServer();<br>    }<br>    <br>}</span>  </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1291227611636244480"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(java)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1950232820773351424.htm" title="移动端城市区县二级联动选择功能实现包" target="_blank">移动端城市区县二级联动选择功能实现包</a> <span class="text-muted">good2know</span> <div>本文还有配套的精品资源,点击获取简介:本项目是一套为移动端设计的jQuery实现方案,用于简化用户在选择城市和区县时的流程。它包括所有必需文件:HTML、JavaScript、CSS及图片资源。通过动态更新下拉菜单选项,实现城市到区县的联动效果,支持数据异步加载。开发者可以轻松集成此功能到移动网站或应用,并可基于需求进行扩展和优化。1.jQuery移动端解决方案概述jQuery技术简介jQuery</div> </li> <li><a href="/article/1950228031117258752.htm" title="深入解析JVM工作原理:从字节码到机器指令的全过程" target="_blank">深入解析JVM工作原理:从字节码到机器指令的全过程</a> <span class="text-muted"></span> <div>一、JVM概述Java虚拟机(JVM)是Java平台的核心组件,它实现了Java"一次编写,到处运行"的理念。JVM是一个抽象的计算机器,它有自己的指令集和运行时内存管理机制。JVM的主要职责:加载:读取.class文件并验证其正确性存储:管理内存分配和垃圾回收执行:解释或编译字节码为机器指令安全:提供沙箱环境限制恶意代码二、JVM架构详解JVM由三个主要子系统组成:1.类加载子系统类加载过程分为</div> </li> <li><a href="/article/1950226517397139456.htm" title="JVM 内存模型深度解析:原子性、可见性与有序性的实现" target="_blank">JVM 内存模型深度解析:原子性、可见性与有序性的实现</a> <span class="text-muted">练习时长两年半的程序员小胡</span> <a class="tag" taget="_blank" href="/search/JVM/1.htm">JVM</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%89%96%E6%9E%90%EF%BC%9A%E4%BB%8E%E9%9D%A2%E8%AF%95%E8%80%83%E7%82%B9%E5%88%B0%E7%94%9F%E4%BA%A7%E5%AE%9E%E8%B7%B5/1.htm">深度剖析:从面试考点到生产实践</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B/1.htm">内存模型</a> <div>在了解了JVM的基础架构和类加载机制后,我们需要进一步探索Java程序在多线程环境下的内存交互规则。JVM内存模型(JavaMemoryModel,JMM)定义了线程和主内存之间的抽象关系,它通过规范共享变量的访问方式,解决了多线程并发时的数据一致性问题。本文将从内存模型的核心目标出发,详解原子性、可见性、有序性的实现机制,以及volatile、synchronized等关键字在其中的作用。一、J</div> </li> <li><a href="/article/1950225785054883840.htm" title="Java | 多线程经典问题 - 售票" target="_blank">Java | 多线程经典问题 - 售票</a> <span class="text-muted">Ada54</span> <div>一、售票需求1)同一个票池2)多个窗口卖票,不能出售同一张票二、售票问题代码实现(线程与进程小总结,请戳:Java|线程和进程,创建线程)step1:定义SaleWindow类实现Runnable接口,覆盖run方法step2:实例化SaleWindow对象,创建Thread对象,将SaleWindow作为参数传给Thread类的构造函数,然后通过Thread.start()方法启动线程step3</div> </li> <li><a href="/article/1950225381961297920.htm" title="SpringMVC的执行流程" target="_blank">SpringMVC的执行流程</a> <span class="text-muted"></span> <div>1、什么是MVCMVC是一种设计模式。MVC的原理图如下所示M-Model模型(完成业务逻辑:有javaBean构成,service+dao+entity)V-View视图(做界面的展示jsp,html……)C-Controller控制器(接收请求—>调用模型—>根据结果派发页面2、SpringMVC是什么SpringMVC是一个MVC的开源框架,SpringMVC=Struts2+Spring,</div> </li> <li><a href="/article/1950224616647618560.htm" title="JAVA接口机结构解析" target="_blank">JAVA接口机结构解析</a> <span class="text-muted">秃狼</span> <a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a><a class="tag" taget="_blank" href="/search/%E5%85%AB%E8%82%A1%E6%96%87/1.htm">八股文</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>什么是接口机在Java项目中,接口机通常指用于与外部系统进行数据交互的中间层,负责处理请求和响应的转换、协议适配、数据格式转换等任务。接口机的结构我们的接口机的结构分为两个大部分,外部接口机和内部接口机,在业务的调度上也是通过mq来实现的,只要的目的就是为了解耦合和做差异化。在接口机中主要的方法就是定时任务,消息的发送和消费,其他平台调用接口机只能提供外部接口机的方法进行调用,外部接口机可以提供消</div> </li> <li><a href="/article/1950223497875746816.htm" title="最新阿里四面面试真题46道:面试技巧+核心问题+面试心得" target="_blank">最新阿里四面面试真题46道:面试技巧+核心问题+面试心得</a> <span class="text-muted">风平浪静如码</span> <div>前言做技术的有一种资历,叫做通过了阿里的面试。这些阿里Java相关问题,都是之前通过不断优秀人才的铺垫总结的,先自己弄懂了再去阿里面试,不然就是去丢脸,被虐。希望对大家帮助,祝面试成功,有个更好的职业规划。一,阿里常见技术面1、微信红包怎么实现。2、海量数据分析。3、测试职位问的线程安全和非线程安全。4、HTTP2.0、thrift。5、面试电话沟通可能先让自我介绍。6、分布式事务一致性。7、ni</div> </li> <li><a href="/article/1950218946015719424.htm" title="图论算法经典题目解析:DFS、BFS与拓扑排序实战" target="_blank">图论算法经典题目解析:DFS、BFS与拓扑排序实战</a> <span class="text-muted">周童學</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95/1.htm">数据结构与算法</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E4%BC%98%E5%85%88/1.htm">深度优先</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E8%AE%BA/1.htm">图论</a> <div>图论算法经典题目解析:DFS、BFS与拓扑排序实战图论问题是算法面试中的高频考点,本博客将通过四道LeetCode经典题目(均来自"Top100Liked"题库),深入讲解图论的核心算法思想和实现技巧。涵盖DFS、BFS、拓扑排序和前缀树等知识点,每道题配有Java实现和易错点分析。1.岛屿数量(DFS遍历)问题描述给定一个由'1'(陆地)和'0'(水)组成的二维网格,计算岛屿的数量。岛屿由水平或</div> </li> <li><a href="/article/1950218818781507584.htm" title="【异常】使用 LiteFlow 框架时,提示错误ChainDuplicateException: [chain name duplicate] chainName=categoryChallenge" target="_blank">【异常】使用 LiteFlow 框架时,提示错误ChainDuplicateException: [chain name duplicate] chainName=categoryChallenge</a> <span class="text-muted">本本本添哥</span> <a class="tag" taget="_blank" href="/search/002/1.htm">002</a><a class="tag" taget="_blank" href="/search/-/1.htm">-</a><a class="tag" taget="_blank" href="/search/%E8%BF%9B%E9%98%B6%E5%BC%80%E5%8F%91%E8%83%BD%E5%8A%9B/1.htm">进阶开发能力</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>一、报错内容Causedby:com.yomahub.liteflow.exception.ChainDuplicateException:[chainnameduplicate]chainName=categoryChallengeatcom.yomahub.liteflow.parser.helper.ParserHelper.lambda$null$0(ParserHelper.java:1</div> </li> <li><a href="/article/1950218314064130048.htm" title="Java并发核心:线程池使用技巧与最佳实践! | 多线程篇(五)" target="_blank">Java并发核心:线程池使用技巧与最佳实践! | 多线程篇(五)</a> <span class="text-muted">bug菌¹</span> <a class="tag" taget="_blank" href="/search/Java%E5%AE%9E%E6%88%98%28%E8%BF%9B%E9%98%B6%E7%89%88%29/1.htm">Java实战(进阶版)</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Java%E9%9B%B6%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8/1.htm">Java零基础入门</a><a class="tag" taget="_blank" href="/search/Java%E5%B9%B6%E5%8F%91/1.htm">Java并发</a><a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E6%B1%A0/1.htm">线程池</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B%E7%AF%87/1.htm">多线程篇</a> <div>本文收录于「Java进阶实战」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows10+IntelliJIDEA2021.3.2+Jdk1.8本文目录前言摘要正文何为线程池?为什么需要线程池?线程池的好处线程池使用场景如何创建线程池?线程池的常见配置源码解析案例分享案例代码演示案例运行</div> </li> <li><a href="/article/1950217936077647872.htm" title="Java 队列" target="_blank">Java 队列</a> <span class="text-muted">tryxr</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E9%98%9F%E5%88%97/1.htm">队列</a> <div>队列一般用什么哪种结构实现队列的特性数据入队列时一定是从尾部插入吗数据出队列时一定是从头部删除吗队列的基本运算有什么队列支持随机访问吗队列的英文表示什么是队列队列从哪进、从哪出队列的进出顺序队列是用哪种结构实现的Queue和Deque有什么区别Queue接口的方法Queue中的add与offer的区别offer、poll、peek的模拟实现如何利用链表实现队列如何利用顺序表实现队列什么叫做双端队列</div> </li> <li><a href="/article/1950215540215705600.htm" title="JVM 内存分配与回收策略:从对象创建到内存释放的全流程" target="_blank">JVM 内存分配与回收策略:从对象创建到内存释放的全流程</a> <span class="text-muted"></span> <div>在JVM的运行机制中,内存分配与回收策略是连接对象生命周期与垃圾收集器的桥梁。它决定了对象在堆内存中的创建位置、存活过程中的区域迁移,以及最终被回收的时机。合理的内存分配策略能减少GC频率、降低停顿时间,是优化Java应用性能的核心环节。本文将系统解析JVM的内存分配规则、对象晋升机制,以及实战中的内存优化技巧。一、对象优先在Eden区分配:新生代的“临时缓冲区”大多数情况下,Java对象在新生代</div> </li> <li><a href="/article/1950214657335685120.htm" title="代码随想录算法训练营第三十五天" target="_blank">代码随想录算法训练营第三十五天</a> <span class="text-muted"></span> <div>01背包问题二维题目链接01背包问题二维题解importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intM=sc.nextInt();intN=sc.nextInt();int[]space=newint[M];int[]value=new</div> </li> <li><a href="/article/1950207097413103616.htm" title="微信公众号回调java_处理微信公众号消息回调" target="_blank">微信公众号回调java_处理微信公众号消息回调</a> <span class="text-muted">weixin_39607620</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7%E5%9B%9E%E8%B0%83java/1.htm">微信公众号回调java</a> <div>1、背景在上一节中,咱们知道如何接入微信公众号,可是以后公众号会与咱们进行交互,那么微信公众号如何通知到咱们本身的服务器呢?咱们知道咱们接入的时候提供的url是GET/mp/entry,那么公众号以后产生的事件将会以POST/mp/entry发送到咱们本身的服务器上。html2、代码实现,此处仍是使用weixin-java-mp这个框架实现一、引入weixin-java-mpcom.github.</div> </li> <li><a href="/article/1950200667587014656.htm" title="学C++的五大惊人好处" target="_blank">学C++的五大惊人好处</a> <span class="text-muted"></span> <div>为什么要学c++学c++有什么用学习c++的好处有1.中考可以加分2.高考可能直接录取3.就业广且工资高4.在未来30--50年c++一定是一个很受欢迎的职业5.c++成功的例子deepsick等AI智能C++语言兼备编程效率和编译运行效率的语言C++语言是C语言功能增强版,在c语言的基础上添加了面向对象编程和泛型编程的支持既继承了C语言高效,简洁,快速和可移植的传统,又具备类似Java、Go等其</div> </li> <li><a href="/article/1950198522972270592.htm" title="Java8 Stream流的sorted()的排序【正序、倒序、多字段排序】" target="_blank">Java8 Stream流的sorted()的排序【正序、倒序、多字段排序】</a> <span class="text-muted">Tony666688888</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>针对集合排序,java8可以用Stream流的sorted()进行排序。示例Bean以下我们会使用这个Bean来做示例。publicclassOrder{privateStringweight;privateDoubleprice;privateStringdateStr;//忽略getter、setter、构造方法、toString}字段排序首先是比较器Comparator,形式如下:Compa</div> </li> <li><a href="/article/1950194742100815872.htm" title="用代码生成艺术字:设计个性化海报的秘密" target="_blank">用代码生成艺术字:设计个性化海报的秘密</a> <span class="text-muted"></span> <div>本文围绕“用代码生成艺术字:设计个性化海报的秘密”展开,先概述代码生成艺术字在海报设计中的独特价值,接着介绍常用的代码工具(如HTML、CSS、JavaScript等),详细阐述从构思到实现的完整流程,包括字体样式设计、动态效果添加等,还分享了提升艺术字质感的技巧及实际案例。最后总结代码生成艺术字的优势,为设计师提供打造个性化海报的实用指南,助力提升海报设计的独特性与吸引力,符合搜索引擎SEO标准</div> </li> <li><a href="/article/1950194728943284224.htm" title="java实习生40多天有感" target="_blank">java实习生40多天有感</a> <span class="text-muted">别拿爱情当饭吃</span> <div>从5月15日开始,我开始第一步步入社会,我今年大三,在一家上市互联网公司做一名实习生,主要做java后端开发。开始的时候,觉得公司的环境挺不错的,不过因为公司在CBD,所以隔壁的午饭和晚饭都要20+RMB,而且还吃不饱,这让我感觉挺郁闷的。一到下午,我就会犯困(因为饿)。因此,我又不得不买一些干粮在公司屯着。关于技术,有一个比较大的项目在需求调研当中,我们做实习生,就是辅助项目经理,测试功能,并且</div> </li> <li><a href="/article/1950183016382918656.htm" title="大学生入门:初识方法及其易踩坑的点" target="_blank">大学生入门:初识方法及其易踩坑的点</a> <span class="text-muted"></span> <div>在java学习过程中,我们不难发现有很多重复使用的功能代码块,每次使用如果都要重新写一遍,岂不是很麻烦,就算是“cv”大法,感觉也不是很方便,那么,有什么办法可以解决这个问题呢?方法!java中,一段可重用的,用于执行特定功能的代码块叫做方法,它可以接收参数、返回结果,并且可以被多次使用。一、方法的基本结构[修饰符]返回值类型方法名([参数列表])[throws异常类型]{//方法体}[throw</div> </li> <li><a href="/article/1950181126731526144.htm" title="[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;" target="_blank">[Ljava.lang.Object; cannot be cast to [Ljava.lang.String;</a> <span class="text-muted">这些不会的</span> <div>解释:这个错误是很常见的错误,错误的提示已经很清楚了就是java的Object数组不能转换成为String[]数组,这就说明你要转换的数组它本身是Object类型的数组,但是你却非要把它转换为String类的数组,这当然是错误的。示例:[java]viewplaincopypackagecom.dada;importjava.util.ArrayList;importjava.util.List;</div> </li> <li><a href="/article/1950180118609588224.htm" title="HikariCP调试日志深度解析:生产环境故障排查完全指南" target="_blank">HikariCP调试日志深度解析:生产环境故障排查完全指南</a> <span class="text-muted"></span> <div>HikariCP调试日志深度解析:生产环境故障排查完全指南更新时间:2025年7月4日|作者:资深架构师|适用版本:HikariCP5.x+|难度等级:中高级前言在生产环境中,数据库连接池往往是系统性能的关键瓶颈。HikariCP作为当前最流行的Java连接池,其调试日志包含了丰富的运行时信息,能够帮助我们快速定位和解决各种连接池相关问题。本文将深入解析HikariCP的日志体系,提供一套完整的故</div> </li> <li><a href="/article/1950179866523529216.htm" title="大学社团管理系统(11831)" target="_blank">大学社团管理系统(11831)</a> <span class="text-muted">codercode2022</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/echarts/1.htm">echarts</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/cloud/1.htm">cloud</a><a class="tag" taget="_blank" href="/search/sentinel/1.htm">sentinel</a><a class="tag" taget="_blank" href="/search/java-rocketmq/1.htm">java-rocketmq</a> <div>有需要的同学,源代码和配套文档领取,加文章最下方的名片哦一、项目演示项目演示视频二、资料介绍完整源代码(前后端源代码+SQL脚本)配套文档(LW+PPT+开题报告)远程调试控屏包运行三、技术介绍Java语言SSM框架SpringBoot框架Vue框架JSP页面Mysql数据库IDEA/Eclipse开发四、项目截图有需要的同学,源代码和配套文档领取,加文章最下方的名片哦!</div> </li> <li><a href="/article/1950178809030438912.htm" title="今年校招竞争真激烈" target="_blank">今年校招竞争真激烈</a> <span class="text-muted">12_05</span> <div>程序员满大街,都要找不到工作了。即使人工智能满大街,我也后悔当初没学机器学习,后悔当初没学Java。C++真难找工作。难道毕了业就失业吗?好担心!</div> </li> <li><a href="/article/1950177847956008960.htm" title="【免费下载】 Aspose for Java:解锁无水印、无限制的文档处理能力" target="_blank">【免费下载】 Aspose for Java:解锁无水印、无限制的文档处理能力</a> <span class="text-muted">房征劲Kendall</span> <div>AsposeforJava:解锁无水印、无限制的文档处理能力【下载地址】AsposeforJava-去除水印和数量限制AsposeforJava-去除水印和数量限制Aspose是一个著名的文档处理库,专为Java应用程序设计,支持多种文档格式的操作,如Word、Excel、PDF等项目地址:https://gitcode.com/open-source-toolkit/56c82项目介绍在现代企业</div> </li> <li><a href="/article/1950177721669709824.htm" title="微服务日志追踪,Skywalking接入TraceId功能" target="_blank">微服务日志追踪,Skywalking接入TraceId功能</a> <span class="text-muted">Victor刘</span> <a class="tag" taget="_blank" href="/search/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/skywalking/1.htm">skywalking</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>文章目录一、借助skywalking追加traceIdlogbacklog4j2效果二、让skywalking显示日志内容版本差异logback配置文件log4j2配置文件一、借助skywalking追加traceId背景:在微服务或多副本中难以观察一个链路的日志,需要通过唯一traceId标识来查找,下面介绍Skywalking-traceId在Java中的配置方法。介绍两种java日志的配置方</div> </li> <li><a href="/article/1950169524384886784.htm" title="【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)" target="_blank">【Java Web实战】从零到一打造企业级网上购书网站系统 | 完整开发实录(三)</a> <span class="text-muted">笙囧同学</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E7%8A%B6%E6%80%81%E6%A8%A1%E5%BC%8F/1.htm">状态模式</a> <div>核心功能设计用户管理系统用户管理是整个系统的基础,我设计了完整的用户生命周期管理:用户注册流程验证失败验证通过验证失败验证通过用户名已存在用户名可用失败成功用户访问注册页面填写注册信息前端表单验证显示错误提示提交到后端后端数据验证返回错误信息用户名唯一性检查提示用户名重复密码加密处理保存用户信息保存成功?显示系统错误注册成功跳转登录页面登录认证机制深度解析我实现了一套企业级的多层次安全认证机制:认</div> </li> <li><a href="/article/1950160194403102720.htm" title="Java:数据结构-ArrayList和顺序表(2)" target="_blank">Java:数据结构-ArrayList和顺序表(2)</a> <span class="text-muted">blammmp</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一ArrayList的使用1.ArrayList的构造方法第一种(指定容量的构造方法)创建一个空的ArrayList,指定容量为initialCapacity。publicArrayList(intinitialCapacity){if(initialCapacity>0){this.elementData=newObject[initialCapacity];}elseif(initialCap</div> </li> <li><a href="/article/1950155533302427648.htm" title="CMS垃圾回收器和G1垃圾回收器区别_g1cms垃圾回收器区别" target="_blank">CMS垃圾回收器和G1垃圾回收器区别_g1cms垃圾回收器区别</a> <span class="text-muted">2401_89191885</span> <a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a> <div>该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例;加载该类的ClassLoader已经被回收;该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。3.常见的垃圾回收算法1、Mark-Sweep(标记-清除算法):(1)思想:标记清除算法分为两个阶段,标记阶段和清除阶段。标记阶段任务是标记出所有需要回收的对象,清除阶段就是清除被标</div> </li> <li><a href="/article/1950154524572315648.htm" title="每日面试题15:如何解决堆溢出?" target="_blank">每日面试题15:如何解决堆溢出?</a> <span class="text-muted">℡余晖^</span> <a class="tag" taget="_blank" href="/search/%E6%AF%8F%E6%97%A5%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">每日面试题</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>在Java应用运行过程中,"java.lang.OutOfMemoryError:Javaheapspace"是最常见的错误之一。无论是高并发的电商大促场景,还是持续运行的后台服务,堆内存溢出都可能导致服务不可用、数据丢失,甚至引发系统崩溃。本文将结合实际排查经验,系统讲解堆溢出的底层逻辑、应急处理流程及长效预防策略。一、堆溢出的本质:内存分配的"收支失衡"Java堆是JVM管理的内存区域,用于存</div> </li> <li><a href="/article/1950153513166237696.htm" title="记录自己第n次面试(n>3)" target="_blank">记录自己第n次面试(n>3)</a> <span class="text-muted">Warren98</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a> <div>1.Spring Boot可执行JAR的内存分配答:“在Spring Boot可执行JAR中,JVM的内存通常分为两大块:堆(Heap)和栈(Stack)。堆内存:存放对象实例和数组,通过-Xms(初始)和-Xmx(最大)控制。比如java-Xms512m-Xmx1024m-jarapp.jar,表示启动时给512 MB堆,最大可以到1 024 MB。栈内存:每个线程有独立的栈帧,用来保存方法调用</div> </li> <li><a href="/article/85.htm" title="ztree异步加载" target="_blank">ztree异步加载</a> <span class="text-muted">3213213333332132</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/ztree/1.htm">ztree</a> <div>相信新手用ztree的时候,对异步加载会有些困惑,我开始的时候也是看了API花了些时间才搞定了异步加载,在这里分享给大家。 我后台代码生成的是json格式的数据,数据大家按各自的需求生成,这里只给出前端的代码。 设置setting,这里只关注async属性的配置 var setting = { //异步加载配置 </div> </li> <li><a href="/article/212.htm" title="thirft rpc 具体调用流程" target="_blank">thirft rpc 具体调用流程</a> <span class="text-muted">BlueSkator</span> <a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">中间件</a><a class="tag" taget="_blank" href="/search/rpc/1.htm">rpc</a><a class="tag" taget="_blank" href="/search/thrift/1.htm">thrift</a> <div>Thrift调用过程中,Thrift客户端和服务器之间主要用到传输层类、协议层类和处理类三个主要的核心类,这三个类的相互协作共同完成rpc的整个调用过程。在调用过程中将按照以下顺序进行协同工作:         (1)     将客户端程序调用的函数名和参数传递给协议层(TProtocol),协议</div> </li> <li><a href="/article/339.htm" title="异或运算推导, 交换数据" target="_blank">异或运算推导, 交换数据</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E5%BC%82%E6%88%96/1.htm">异或</a><a class="tag" taget="_blank" href="/search/%5E/1.htm">^</a> <div>/* * 5 0101 * 9 1010 * * 5 ^ 5 * 0101 * 0101 * ----- * 0000 * 得出第一个规律: 相同的数进行异或, 结果是0 * * 9 ^ 5 ^ 6 * 1010 * 0101 * ---- * 1111 * * 1111 * 0110 * ---- * 1001 </div> </li> <li><a href="/article/466.htm" title="事件源对象" target="_blank">事件源对象</a> <span class="text-muted">周华华</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a> <div><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml&q</div> </li> <li><a href="/article/593.htm" title="MySql配置及相关命令" target="_blank">MySql配置及相关命令</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a> <div>        MySQL安装完毕后我们需要对它进行一些设置及性能优化,主要包括字符集设置,启动设置,连接优化,表优化,分区优化等等。           一 修改MySQL密码及用户      </div> </li> <li><a href="/article/720.htm" title="[简单]poi删除excel 2007超链接" target="_blank">[简单]poi删除excel 2007超链接</a> <span class="text-muted">53873039oycg</span> <a class="tag" taget="_blank" href="/search/Excel/1.htm">Excel</a> <div>      采用解析sheet.xml方式删除超链接,缺点是要打开文件2次,代码如下:      public void removeExcel2007AllHyperLink(String filePath) throws Exception { OPCPackage ocPkg = OPCPac</div> </li> <li><a href="/article/847.htm" title="Struts2添加 open flash chart" target="_blank">Struts2添加 open flash chart</a> <span class="text-muted">云端月影</span> <div>准备以下开源项目: 1. Struts 2.1.6 2. Open Flash Chart 2 Version 2 Lug Wyrm Charmer (28th, July 2009) 3. jofc2,这东西不知道是没做好还是什么意思,好像和ofc2不怎么匹配,最好下源码,有什么问题直接改。 4. log4j 用eclipse新建动态网站,取名OFC2Demo,将Struts2 l</div> </li> <li><a href="/article/974.htm" title="spring包详解" target="_blank">spring包详解</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div> 下载的spring包中文件及各种包众多,在项目中往往只有部分是我们必须的,如果不清楚什么时候需要什么包的话,看看下面就知道了。 aspectj目录下是在Spring框架下使用aspectj的源代码和测试程序文件。Aspectj是java最早的提供AOP的应用框架。 dist 目录下是Spring 的发布包,关于发布包下面会详细进行说明。 docs&nb</div> </li> <li><a href="/article/1101.htm" title="网站推广之seo概念" target="_blank">网站推广之seo概念</a> <span class="text-muted">antonyup_2006</span> <a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/%E6%90%9C%E7%B4%A2%E5%BC%95%E6%93%8E/1.htm">搜索引擎</a><a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a> <div>   持续开发一年多的b2c网站终于在08年10月23日上线了。作为开发人员的我在修改bug的同时,准备了解下网站的推广分析策略。     所谓网站推广,目的在于让尽可能多的潜在用户了解并访问网站,通过网站获得有关产品和服务等信息,为最终形成购买决策提供支持。     网站推广策略有很多,seo,email,adv</div> </li> <li><a href="/article/1228.htm" title="单例模式,sql注入,序列" target="_blank">单例模式,sql注入,序列</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/1.htm">单例模式</a><a class="tag" taget="_blank" href="/search/%E5%BA%8F%E5%88%97/1.htm">序列</a><a class="tag" taget="_blank" href="/search/sql%E6%B3%A8%E5%85%A5/1.htm">sql注入</a><a class="tag" taget="_blank" href="/search/%E9%A2%84%E7%BC%96%E8%AF%91/1.htm">预编译</a> <div>  序列在前面写过有关的博客,也有过总结,但是今天在做一个JDBC操作数据库的相关内容时 需要使用序列创建一个自增长的字段  居然不会了,所以将序列写在本篇的前面    1,序列是一个保存数据连续的增长的一种方式; 序列的创建; CREATE SEQUENCE seq_pro 2 INCREMENT BY 1 -- 每次加几个 3 </div> </li> <li><a href="/article/1355.htm" title="Mockito单元测试实例" target="_blank">Mockito单元测试实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a><a class="tag" taget="_blank" href="/search/mockito/1.htm">mockito</a> <div>Mockito单元测试实例: public class SettingServiceTest { private List<PersonDTO> personList = new ArrayList<PersonDTO>(); @InjectMocks private SettingPojoService settin</div> </li> <li><a href="/article/1482.htm" title="精通Oracle10编程SQL(9)使用游标" target="_blank">精通Oracle10编程SQL(9)使用游标</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/plsql/1.htm">plsql</a> <div>/* *使用游标 */ --显示游标 --在显式游标中使用FETCH...INTO语句 DECLARE CURSOR emp_cursor is select ename,sal from emp where deptno=1; v_ename emp.ename%TYPE; v_sal emp.sal%TYPE; begin ope</div> </li> <li><a href="/article/1609.htm" title="【Java语言】动态代理" target="_blank">【Java语言】动态代理</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/java%E8%AF%AD%E8%A8%80/1.htm">java语言</a> <div>  JDK接口动态代理 JDK自带的动态代理通过动态的根据接口生成字节码(实现接口的一个具体类)的方式,为接口的实现类提供代理。被代理的对象和代理对象通过InvocationHandler建立关联   package com.tom; import com.tom.model.User; import com.tom.service.IUserService; </div> </li> <li><a href="/article/1736.htm" title="Java通信之URL通信基础" target="_blank">Java通信之URL通信基础</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jdk/1.htm">jdk</a><a class="tag" taget="_blank" href="/search/webservice/1.htm">webservice</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/ITeye/1.htm">ITeye</a> <div>java对网络通信以及提供了比较全面的jdk支持,java.net包能让程序员直接在程序中实现网络通信。 在技术日新月异的现在,我们能通过很多方式实现数据通信,比如webservice、url通信、socket通信等等,今天简单介绍下URL通信。 学习准备:建议首先学习java的IO基础知识   URL是统一资源定位器的简写,URL可以访问Internet和www,可以通过url</div> </li> <li><a href="/article/1863.htm" title="博弈Java讲义 - Java线程同步 (1)" target="_blank">博弈Java讲义 - Java线程同步 (1)</a> <span class="text-muted">boyitech</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/%E5%90%8C%E6%AD%A5/1.htm">同步</a><a class="tag" taget="_blank" href="/search/%E9%94%81/1.htm">锁</a> <div>  在并发编程中经常会碰到多个执行线程共享资源的问题。例如多个线程同时读写文件,共用数据库连接,全局的计数器等。如果不处理好多线程之间的同步问题很容易引起状态不一致或者其他的错误。    同步不仅可以阻止一个线程看到对象处于不一致的状态,它还可以保证进入同步方法或者块的每个线程,都看到由同一锁保护的之前所有的修改结果。处理同步的关键就是要正确的识别临界条件(cri</div> </li> <li><a href="/article/1990.htm" title="java-给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。" target="_blank">java-给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div> public class DeleteExtraSpace { /** * 题目:给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。 * 方法1.用已有的String类的trim和replaceAll方法 * 方法2.全部用正则表达式,这个我不熟 * 方法3.“重新发明轮子”,从头遍历一次 */ public static v</div> </li> <li><a href="/article/2117.htm" title="An error has occurred.See the log file错误解决!" target="_blank">An error has occurred.See the log file错误解决!</a> <span class="text-muted">Kai_Ge</span> <a class="tag" taget="_blank" href="/search/MyEclipse/1.htm">MyEclipse</a> <div>今天早上打开MyEclipse时,自动关闭!弹出An error has occurred.See the log file错误提示! 很郁闷昨天启动和关闭还好着!!!打开几次依然报此错误,确定不是眼花了! 打开日志文件!找到当日错误文件内容: --------------------------------------------------------------------------</div> </li> <li><a href="/article/2244.htm" title="[矿业与工业]修建一个空间矿床开采站要多少钱?" target="_blank">[矿业与工业]修建一个空间矿床开采站要多少钱?</a> <span class="text-muted">comsci</span> <div>        地球上的钛金属矿藏已经接近枯竭...........        我们在冥王星的一颗卫星上面发现一些具有开采价值的矿床.....        那么,现在要编制一个预算,提交给财政部门..</div> </li> <li><a href="/article/2371.htm" title="解析Google Map Routes" target="_blank">解析Google Map Routes</a> <span class="text-muted">dai_lm</span> <a class="tag" taget="_blank" href="/search/google+api/1.htm">google api</a> <div>为了获得从A点到B点的路劲,经常会使用Google提供的API,例如 [url] http://maps.googleapis.com/maps/api/directions/json?origin=40.7144,-74.0060&destination=47.6063,-122.3204&sensor=false [/url] 从返回的结果上,大致可以了解应该怎么走,但</div> </li> <li><a href="/article/2498.htm" title="SQL还有多少“理所应当”?" target="_blank">SQL还有多少“理所应当”?</a> <span class="text-muted">datamachine</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a> <div>转贴存档,原帖地址:http://blog.chinaunix.net/uid-29242841-id-3968998.html、http://blog.chinaunix.net/uid-29242841-id-3971046.html! ------------------------------------华丽的分割线-------------------------------- </div> </li> <li><a href="/article/2625.htm" title="Yii使用Ajax验证时,如何设置某些字段不需要验证" target="_blank">Yii使用Ajax验证时,如何设置某些字段不需要验证</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a> <div>经常像你注册页面,你可能非常希望只需要Ajax去验证用户名和Email,而不需要使用Ajax再去验证密码,默认如果你使用Yii 内置的ajax验证Form,例如: $form=$this->beginWidget('CActiveForm', array(        'id'=>'usuario-form',&</div> </li> <li><a href="/article/2752.htm" title="使用git同步网站代码" target="_blank">使用git同步网站代码</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/crontab/1.htm">crontab</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a> <div>转自:http://ued.ctrip.com/blog/?p=3646?tn=gongxinjun.com   管理一网站,最开始使用的虚拟空间,采用提供商支持的ftp上传网站文件,后换用vps,vps可以自己搭建ftp的,但是懒得搞,直接使用scp传输文件到服务器,现在需要更新文件到服务器,使用scp真的很烦。发现本人就职的公司,采用的git+rsync的方式来管理、同步代码,遂</div> </li> <li><a href="/article/2879.htm" title="sql基本操作" target="_blank">sql基本操作</a> <span class="text-muted">蕃薯耀</span> <a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/sql%E5%9F%BA%E6%9C%AC%E6%93%8D%E4%BD%9C/1.htm">sql基本操作</a><a class="tag" taget="_blank" href="/search/sql%E5%B8%B8%E7%94%A8%E6%93%8D%E4%BD%9C/1.htm">sql常用操作</a> <div>sql基本操作 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 蕃薯耀 2015年6月1日 17:30:33 星期一     &</div> </li> <li><a href="/article/3006.htm" title="Spring4+Hibernate4+Atomikos3.3多数据源事务管理" target="_blank">Spring4+Hibernate4+Atomikos3.3多数据源事务管理</a> <span class="text-muted">hanqunfeng</span> <a class="tag" taget="_blank" href="/search/Hibernate4/1.htm">Hibernate4</a> <div>Spring3+后不再对JTOM提供支持,所以可以改用Atomikos管理多数据源事务。Spring2.5+Hibernate3+JTOM参考:http://hanqunfeng.iteye.com/blog/1554251Atomikos官网网站:http://www.atomikos.com/   一.pom.xml <dependency> <</div> </li> <li><a href="/article/3133.htm" title="jquery中两个值得注意的方法one()和trigger()方法" target="_blank">jquery中两个值得注意的方法one()和trigger()方法</a> <span class="text-muted">jackyrong</span> <a class="tag" taget="_blank" href="/search/trigger/1.htm">trigger</a> <div>  在jquery中,有两个值得注意但容易忽视的方法,分别是one()方法和trigger()方法,这是从国内作者<<jquery权威指南》一书中看到不错的介绍 1) one方法     one方法的功能是让所选定的元素绑定一个仅触发一次的处理函数,格式为    one(type,${data},fn) &nb</div> </li> <li><a href="/article/3260.htm" title="拿工资不仅仅是让你写代码的" target="_blank">拿工资不仅仅是让你写代码的</a> <span class="text-muted">lampcy</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E5%92%A8%E8%AF%A2/1.htm">咨询</a> <div>这是我对团队每个新进员工说的第一件事情。这句话的意思是,我并不关心你是如何快速完成任务的,哪怕代码很差,只要它像救生艇通气门一样管用就行。这句话也是我最喜欢的座右铭之一。 这个说法其实很合理:我们的工作是思考客户提出的问题,然后制定解决方案。思考第一,代码第二,公司请我们的最终目的不是写代码,而是想出解决方案。 话粗理不粗。 付你薪水不是让你来思考的,也不是让你来写代码的,你的目的是交付产品</div> </li> <li><a href="/article/3387.htm" title="架构师之对象操作----------对象的效率复制和判断是否全为空" target="_blank">架构师之对象操作----------对象的效率复制和判断是否全为空</a> <span class="text-muted">nannan408</span> <a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84%E5%B8%88/1.htm">架构师</a> <div>1.前言。   如题。 2.代码。 (1)对象的复制,比spring的beanCopier在大并发下效率要高,利用net.sf.cglib.beans.BeanCopier Src src=new Src(); BeanCopier beanCopier = BeanCopier.create(Src.class, Des.class, false); </div> </li> <li><a href="/article/3514.htm" title="ajax 被缓存的解决方案" target="_blank">ajax 被缓存的解决方案</a> <span class="text-muted">Rainbow702</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a><a class="tag" taget="_blank" href="/search/cache/1.htm">cache</a><a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a> <div>使用jquery的ajax来发送请求进行局部刷新画面,各位可能都做过。 今天碰到一个奇怪的现象,就是,同一个ajax请求,在chrome中,不论发送多少次,都可以发送至服务器端,而不会被缓存。但是,换成在IE下的时候,发现,同一个ajax请求,会发生被缓存的情况,只有第一次才会被发送至服务器端,之后的不会再被发送。郁闷。 解决方法如下: ① 直接使用 JQuery提供的 “cache”参数,</div> </li> <li><a href="/article/3641.htm" title="修改date.toLocaleString()的警告" target="_blank">修改date.toLocaleString()的警告</a> <span class="text-muted">tntxia</span> <a class="tag" taget="_blank" href="/search/String/1.htm">String</a> <div>  我们在写程序的时候,经常要查看时间,所以我们经常会用到date.toLocaleString(),但是date.toLocaleString()是一个过时 的API,代替的方法如下:   package com.tntxia.htmlmaker.util; import java.text.SimpleDateFormat; import java.util.</div> </li> <li><a href="/article/3768.htm" title="项目完成后的小总结" target="_blank">项目完成后的小总结</a> <span class="text-muted">xiaomiya</span> <a class="tag" taget="_blank" href="/search/js/1.htm">js</a><a class="tag" taget="_blank" href="/search/%E6%80%BB%E7%BB%93/1.htm">总结</a><a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE/1.htm">项目</a> <div>项目完成了,突然想做个总结但是有点无从下手了。 做之前对于客户端给的接口很模式。然而定义好了格式要求就如此的愉快了。 先说说项目主要实现的功能吧 1,按键精灵 2,获取行情数据 3,各种input输入条件判断 4,发送数据(有json格式和string格式) 5,获取预警条件列表和预警结果列表, 6,排序, 7,预警结果分页获取 8,导出文件(excel,text等) 9,修</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>