简单的用 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/1901815189729243136.htm" title="Apache Shiro 使用教程" target="_blank">Apache Shiro 使用教程</a> <span class="text-muted">Kale又菜又爱玩</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/springboot/1.htm">springboot</a> <div>ApacheShiro使用教程ApacheShiro是一个强大且灵活的开源安全框架,主要用于处理身份验证(Authentication)、授权(Authorization)、加密(Cryptography)和会话管理(SessionManagement)等安全相关的任务。它简化了在Java应用程序中集成安全功能的复杂性,广泛适用于各种类型的项目,如Web应用、命令行工具等。本教程将深入介绍Shir</div> </li> <li><a href="/article/1901812535523340288.htm" title="SpringMVC简化了什么?从传统Web开发到现代高效架构的蜕变" target="_blank">SpringMVC简化了什么?从传统Web开发到现代高效架构的蜕变</a> <span class="text-muted">以恒1</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/hive/1.htm">hive</a> <div>SpringMVC简化了什么?从传统Web开发到现代高效架构的蜕变在JavaWeb开发领域,SpringMVC作为Spring框架的核心模块,通过组件化设计和注解驱动,彻底改变了传统Servlet开发的繁琐流程。本文将从开发流程、代码复杂度、技术整合等维度,系统解析SpringMVC的简化逻辑,并结合实际案例说明其价值。一、请求处理流程的简化:从分散到集中传统Servlet开发需要为每个请求编写独</div> </li> <li><a href="/article/1901798418976665600.htm" title="spring boot 拦截器简单demo" target="_blank">spring boot 拦截器简单demo</a> <span class="text-muted">测试开发小白变怪兽</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E7%AB%AF/1.htm">服务端</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/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>拦截器(Interceptor)与过滤器的区别特性过滤器(Filter)拦截器(Interceptor)所属规范Servlet规范(javax.servlet)SpringMVC框架(基于AOP实现)作用范围所有请求(包括静态资源)仅拦截Controller的请求执行时机在DispatcherServlet之前执行在Controller方法前后执行访问上下文无法直接获取Spring的Bean或注解</div> </li> <li><a href="/article/1901798040004521984.htm" title="使用MyBatis返回数据为null" target="_blank">使用MyBatis返回数据为null</a> <span class="text-muted">测试开发小白变怪兽</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E7%AB%AF/1.htm">服务端</a> <div>问题:程序里面写的sql语句放到数据库控制台里能查询到数据,但是在MyBatis里查询结果为null。原因:查询出来的字段名与Java实体类的属性名没有一一对应。解决办法:在XML映射文件中使用resultMap将数据库属性名与实体类属性名映射:使用resultMap表明返回类型:select*fromuser_info;</div> </li> <li><a href="/article/1901794757592543232.htm" title="Java 分布式高并发重试方案及实现" target="_blank">Java 分布式高并发重试方案及实现</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%88%86%E5%B8%83%E5%BC%8F/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><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/redis/1.htm">redis</a> <div>文章目录Java分布式高并发重试方案及实现一、重试机制的背景和意义二、基于SpringBoot的重试方案实现1.使用SpringRetry实现重试机制添加依赖开启重试功能定义重试逻辑使用重试服务2.使用Fast-Retry实现高性能重试引入依赖编程式重试注解式重试三、重试机制的注意事项四、总结Java分布式高并发重试方案及实现在分布式系统中,高并发场景下接口调用的稳定性至关重要。为了应对接口调用失</div> </li> <li><a href="/article/1901791476329803776.htm" title="Node.js和webpack入门-个人学习笔记" target="_blank">Node.js和webpack入门-个人学习笔记</a> <span class="text-muted">ksmswq</span> <a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>Node.js-入门Node.js基础概念Node.js是一个跨平台JavaScript运行环境,是开发者可以搭建服务器端的JavaStript应用程序。作用1.编写服务端程序2.编写数据接口,提供网页浏览资源等等3.实现“前端工程化”,为Vue和React等框架做铺垫前端工程化-概念开发项目直到上线,过程中集成的所有工具和技术。(Node.js是前端工程化的基础(因为Node.js可以主动读取前</div> </li> <li><a href="/article/1901790845934301184.htm" title="token升级(考虑在分布式环境中布置token,结合session保证请求调用过程中token不会过期。)" target="_blank">token升级(考虑在分布式环境中布置token,结合session保证请求调用过程中token不会过期。)</a> <span class="text-muted">推荐爱你Jonah</span> <a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>思路:首先,用户的需求是确保使用同一个Token的外部调用都在一个Session中处理。之前的回答提到了Token与Session绑定、安全措施、Session管理、分布式处理等。现在需要用Java来展示这些步骤。我需要考虑Java中常用的框架,比如SpringBoot,因为它广泛用于API开发。同时,使用Redis作为Session存储,这在Java中通常通过SpringDataRedis或Le</div> </li> <li><a href="/article/1901787190812274688.htm" title="JAVA 你应该有所了解的布隆过滤器" target="_blank">JAVA 你应该有所了解的布隆过滤器</a> <span class="text-muted">2401_87389661</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> <div>该篇文章将会使用最精简易懂的文字以及小图来给大家介绍讲解(不对哈希策略计算进行详解)一.布隆过滤器有啥用?二.布隆过滤器原理是什么?三.java中怎么使用布隆过滤器?本篇文章内容可能较多,所以还请耐心。一.布隆过滤器有啥用简单两点叙述:1.存值存值,就是把值存进去,类似于我们很常用的map,set等;2.检验值是否存在检验,也就是我们想知道某个值是否存在于布隆过滤器里面,调用相关的检验方法,我们会</div> </li> <li><a href="/article/1901783790926229504.htm" title="基于Java的京东电商系统的设计与实现" target="_blank">基于Java的京东电商系统的设计与实现</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%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>摘要:近十多年来,因为移动互联网发展迅猛,除了通常的查阅网页,搜索数据和发送电子邮件外,大多数国内网民还将采用以下传统功能,如购物,电信,旅游和娱乐我逐渐习惯了互联网。包括使用在线购物在内的新服务模式正在成为人们生活中一种重要的购物形式。互联网的发展迅猛,是网上购物系统发展的基础。除此之外,网络购物营商环境也在逐渐的在改善。移动互联网设备(手机,平板电脑)使互联网用户越来越多。付款和结算方式变得更</div> </li> <li><a href="/article/1901783787038109696.htm" title="LeetCode——5840. 使字符串平衡的最小交换次数(Minimum Number of Swaps to Make the String Balanced)[中等]——分析及代码(Java)" target="_blank">LeetCode——5840. 使字符串平衡的最小交换次数(Minimum Number of Swaps to Make the String Balanced)[中等]——分析及代码(Java)</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/LeetCode/1.htm">LeetCode</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E9%A2%98%E8%A7%A3/1.htm">题解</a> <div>LeetCode——5840.使字符串平衡的最小交换次数[MinimumNumberofSwapstoMaketheStringBalanced][中等]——分析及代码[Java]一、题目二、分析及代码1.贪心(1)思路(2)代码(3)结果三、其他一、题目给你一个字符串s,下标从0开始,且长度为偶数n。字符串恰好由n/2个开括号‘[’和n/2个闭括号‘]’组成。只有能满足下述所有条件的字符串才能称</div> </li> <li><a href="/article/1901782398442467328.htm" title="深入理解Java工厂方法模式:原理剖析与实战应用" target="_blank">深入理解Java工厂方法模式:原理剖析与实战应用</a> <span class="text-muted">小诸葛IT课堂</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F/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>一、为什么要学习工厂方法模式?在软件开发中,对象创建是最常见的操作之一。当我们需要创建的对象类型存在多种可能,或者对象的创建过程较为复杂时,如果直接在业务代码中使用new关键字进行实例化,会导致以下问题:代码耦合度高难以扩展新的产品类型违反开闭原则(对扩展开放,对修改关闭)代码重复和可维护性差工厂方法模式(FactoryMethodPattern)正是为了解决这些问题而诞生的经典设计模式。它被广泛</div> </li> <li><a href="/article/1901781766990000128.htm" title="基于 Vue 和 Element Plus 的时间范围控制与数据展示" target="_blank">基于 Vue 和 Element Plus 的时间范围控制与数据展示</a> <span class="text-muted">奶糖 肥晨</span> <a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/elementui/1.htm">elementui</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>文章目录1.核心功能2.实现效果3.代码实现️3.1HTML部分3.2JavaScript部分3.3CSS部分本文将重点讲解如何在Vue项目中使用ElementPlus的el-date-picker组件实现时间范围选择,并结合“日”、“月”、“年”按钮动态控制时间范围。!1.核心功能时间范围选择:使用el-date-picker实现日期范围选择。快速切换:通过“日”、“月”、“年”按钮快速设置时间</div> </li> <li><a href="/article/1901781135835328512.htm" title="Manus工作原理:从“思考”到“执行”的AI智能体革命" target="_blank">Manus工作原理:从“思考”到“执行”的AI智能体革命</a> <span class="text-muted">rider189</span> <a class="tag" taget="_blank" href="/search/%E6%9D%82%E8%B0%88/1.htm">杂谈</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>读者专属福利:500G+java从入门到精通全套视频课程,加关注提供免费答疑——解析全球首款通用AI代理的底层逻辑引言:AI智能体的新标杆2025年3月,一款名为Manus的AI智能体横空出世,凭借其“自主思考并执行任务”的能力,迅速引爆科技圈与资本市场。它不仅能在云端异步处理复杂任务,还能交付完整成果,从简历筛选到旅行规划,从股票分析到教育课件制作,其应用场景之广令人惊叹。然而,Manus的爆火</div> </li> <li><a href="/article/1901781009507086336.htm" title="LeetCode34. 在排序数组中查找元素的第一个和最后一个位置 - Java & Go - 二分查找改进" target="_blank">LeetCode34. 在排序数组中查找元素的第一个和最后一个位置 - Java & Go - 二分查找改进</a> <span class="text-muted">暴风星云裂之我裂开了</span> <a class="tag" taget="_blank" href="/search/LeetCode%E9%A2%98%E8%A7%A3/1.htm">LeetCode题解</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/golang/1.htm">golang</a><a class="tag" taget="_blank" href="/search/%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE/1.htm">二分查找</a> <div>文章目录LeetCode34.在排序数组中查找元素的第一个和最后一个位置解法11算法2Java3Go解法21算法2Java3GoLeetCode34.在排序数组中查找元素的第一个和最后一个位置LeetCode34.在排序数组中查找元素的第一个和最后一个位置解法11算法算法1.两次二分查找2.第一次二分查找计算mid=(left+right)>>1;,每次mid都偏向左边,可以保证找到的是第一个大于</div> </li> <li><a href="/article/1901780126065029120.htm" title="Vue.js 事件处理与修饰符详解" target="_blank">Vue.js 事件处理与修饰符详解</a> <span class="text-muted">vvilkim</span> <a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>Vue.js是一个流行的前端框架,它提供了强大的事件处理机制,使得开发者可以轻松地处理用户交互。Vue的事件处理通过v-on指令实现,同时还提供了丰富的事件修饰符和按键修饰符,帮助我们更高效地处理事件。本文将详细介绍Vue的事件处理机制、修饰符的使用方法,并结合示例代码展示如何在实际开发中应用这些功能。1.v-on指令与事件处理在Vue中,v-on指令用于监听DOM事件,并在事件触发时执行Java</div> </li> <li><a href="/article/1901775836713906176.htm" title="python 如何引入同一个文件夹下py方法" target="_blank">python 如何引入同一个文件夹下py方法</a> <span class="text-muted">m0_68335176</span> <a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a> <div>前言毕业快三年了,前后也待过几家公司,碰到各种各样的同事。见识过各种各样的代码,优秀的、垃圾的、不堪入目的、看了想跑路的等等,所以这篇文章记录一下一个优秀的后端Java开发应该有哪些好的开发习惯。拆分合理的目录结构受传统的MVC模式影响,传统做法大多是几个固定的文件夹controller、service、mapper、entity,然后无限制添加,到最后你就会发现一个service文件夹下面有几十</div> </li> <li><a href="/article/1901769150116720640.htm" title="B/S vs C/S架构:技术选型与实战对比" target="_blank">B/S vs C/S架构:技术选型与实战对比</a> <span class="text-muted">码农阿豪@新空间</span> <a class="tag" taget="_blank" href="/search/%E5%8C%85%E7%BD%97%E4%B8%87%E8%B1%A1/1.htm">包罗万象</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%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>个人名片作者简介:java领域优质创作者个人主页:码农阿豪工作室:新空间代码工作室(提供各种软件服务)个人邮箱:[2435024119@qq.com]个人微信:15279484656个人导航网站:www.forff.top座右铭:总有人要赢。为什么不能是我呢?专栏导航:码农阿豪系列专栏导航面试专栏:收集了java相关高频面试题,面试实战总结️Spring5系列专栏:整理了Spring5重要知识点与</div> </li> <li><a href="/article/1901761213222678528.htm" title="java.lang.NoSuchMethodError: org.springframework.data.redis.core.StringRedisTemplate.delete redis" target="_blank">java.lang.NoSuchMethodError: org.springframework.data.redis.core.StringRedisTemplate.delete redis</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/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</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/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>java.lang.NoSuchMethodError:org.springframework.data.redis.core.StringRedisTemplate.delete(Ljava/lang/Object;)V在springboot2.0.0以上的版本中已经有独立的redis包了redis.clientsjedis</<</div> </li> <li><a href="/article/1901760960503279616.htm" title="通过Java代码实现ping功能测试ip地址与ip:port的连通性" target="_blank">通过Java代码实现ping功能测试ip地址与ip:port的连通性</a> <span class="text-muted">Java大侠</span> <a class="tag" taget="_blank" href="/search/%E4%B8%9A%E5%8A%A1%E4%BB%A3%E7%A0%81/1.htm">业务代码</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/1.htm">功能测试</a> <div>通过Java代码实现测试ip地址与ip:port的连通性需求分析具体实现测试ip连通性测试ip:port连通性重试机制需求分析最近在业务中,需要添加一种掉线告警系统。大致思路为:通过定时任务扫描,每一个小时判断一次设备是否在线,如果在线继续判断端口是否能够通讯。如果不在线或者不能通讯,需要及时push消息给告警人员,及时处理。具体实现测试ip连通性主要通过InetAddress类来实现/***@p</div> </li> <li><a href="/article/1901759445877190656.htm" title="Servlet 点击计数器" target="_blank">Servlet 点击计数器</a> <span class="text-muted">lsx202406</span> <a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>Servlet点击计数器引言随着互联网的快速发展,Web应用程序已成为人们日常生活中不可或缺的一部分。Servlet作为Java平台上用于开发Web应用程序的重要技术之一,已经广泛应用于各种Web项目中。本文将详细介绍Servlet点击计数器的实现方法,帮助读者更好地理解Servlet技术在实际开发中的应用。Servlet点击计数器概述Servlet点击计数器是一种用于记录Web页面点击次数的组件</div> </li> <li><a href="/article/1901753900017446912.htm" title="Java IO 与文件系统:File 类与流操作详解" target="_blank">Java IO 与文件系统:File 类与流操作详解</a> <span class="text-muted">伤心辞</span> <a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/1.htm">计算机网络</a> <div>在Java编程中,IO(输入输出)操作是处理文件和数据流的核心部分。本文将围绕文件系统、硬盘存储、Java的File类以及InputStream和OutputStream的使用进行详细总结,帮助读者全面掌握JavaIO编程的核心知识。一、IO、存储与文件系统基础1.存储设备与硬盘硬盘:计算机的主要存储设备,分为机械硬盘(HDD)和固态硬盘(SSD)。存储单位:字节(Byte)、千字节(KB)、兆字</div> </li> <li><a href="/article/1901753771898236928.htm" title="Java 解决 TCP 粘包问题详解:原理与实战示例" target="_blank">Java 解决 TCP 粘包问题详解:原理与实战示例</a> <span class="text-muted">伤心辞</span> <a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a> <div>TCP协议是面向字节流的传输协议,其核心设计目标是高效传输数据,但这也导致了应用层需要自行处理数据包的边界问题,即粘包问题。本文将通过Java代码示例,详细解析粘包问题的原因及解决方案。一、粘包问题的本质1.什么是粘包?发送方发送多个应用层数据包(如包A和包B)。接收方可能一次性读取到合并后的数据(如包A包B),导致无法区分原始包边界。2.为什么会出现粘包?TCP的字节流特性:数据像水流一样连续,</div> </li> <li><a href="/article/1901753773680816128.htm" title="Java 线程池详解:参数、工作流程与常见线程池" target="_blank">Java 线程池详解:参数、工作流程与常见线程池</a> <span class="text-muted">伤心辞</span> <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/java/1.htm">java</a> <div>线程池是Java并发编程中最重要的工具之一,它通过复用线程、控制并发数和任务队列机制,显著提高了多线程程序的性能和资源管理效率。本文将深入解析线程池的核心参数、工作流程,以及如何使用Executors工具类创建常见的线程池。一、线程池的核心参数Java线程池的核心类是ThreadPoolExecutor,其构造函数包含以下关键参数:参数名作用corePoolSize核心线程数,即使线程空闲也不会被</div> </li> <li><a href="/article/1901752257980985344.htm" title="【Java篇】无形至有形,法与道的编织:类与对象初探" target="_blank">【Java篇】无形至有形,法与道的编织:类与对象初探</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/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/JavaSE/1.htm">JavaSE</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/JavaSE/1.htm">JavaSE</a><a class="tag" taget="_blank" href="/search/%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8/1.htm">基础入门</a><a class="tag" taget="_blank" href="/search/%E7%B1%BB%E5%92%8C%E5%AF%B9%E8%B1%A1/1.htm">类和对象</a><a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B%E8%A7%84%E8%8C%83/1.htm">编程规范</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E7%9B%B8%E8%BF%87%E7%A8%8B/1.htm">面相过程</a> <div>文章目录类和对象(上)一、面向对象的初步认知1.1什么是面向对象1.2面向对象与面向过程二、类定义和使用2.1简单认识类2.2类的定义格式2.3小练习2.3.1定义一个狗类2.3.2定义一个学生类三、类的实例化3.1什么是实例化3.2类和对象的说明四、this引用4.1为什么要有this引用4.2什么是this引用4.3this引用的特性五、总结与展望5.1总结5.2展望类和对象(上)欢迎讨论:如</div> </li> <li><a href="/article/1901733718947590144.htm" title="【LeetCode】215.数组中的第K个最大元素(三种方法,九个思路的代码实现,java格式)" target="_blank">【LeetCode】215.数组中的第K个最大元素(三种方法,九个思路的代码实现,java格式)</a> <span class="text-muted">Hi丶ImViper</span> <a class="tag" taget="_blank" href="/search/LeetCode/1.htm">LeetCode</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/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/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F/1.htm">快速排序</a> <div>题目题目链接解析这道题据说是面试的高频考题,同时也是基础算法的应用。方法一:暴力解法题目要求我们找到“数组排序后的第k个最大的元素,而不是第k个不同的元素”,语义是从右边往左边数第k个元素(从11开始),那么从左向右数是第几个呢,我们列出几个找找规律就好了。一共6个元素,找第2大,索引是4;一共6个元素,找第4大,索引是2。因此,升序排序以后,目标元素的索引是len-k。这是最简单的思路,如果只答</div> </li> <li><a href="/article/1901731441809616896.htm" title="LeetCode215.数组中的第K个最大元素 java使用小顶堆求解" target="_blank">LeetCode215.数组中的第K个最大元素 java使用小顶堆求解</a> <span class="text-muted">patientany</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> <div>JAVA实现小顶堆手撕小顶堆定义堆中的成员变量提供构造方法建堆下潜交换堆的尾部添加元素上浮获取堆顶元素替换堆顶元素删除指定元素删除堆顶元素回到题目具体步骤上代码手撕小顶堆在java中实现小顶堆定义堆中的成员变量这里首先先定义堆中的数据,在这里我使用了整数数组表示整个堆。size表示堆的大小,默认也就是数组的长度。int[]array;intsize;提供构造方法对于堆的初始化,由传进来的数组实现对</div> </li> <li><a href="/article/1901720968523476992.htm" title="JAVA有哪些主要用途" target="_blank">JAVA有哪些主要用途</a> <span class="text-muted">By北阳</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>Java是一种广泛使用的编程语言,非常流行,并经常用于构建各种类型的应用程序。在本篇博客中,我将为你详细介绍Java可以干什么,以及它在现代软件开发中的重要性。1.Web应用程序开发Java是一种非常流行的编程语言,可用于构建Web应用程序。Java提供了一系列开发工具和框架,例如Spring,SpringBoot和JavaServerPages(JSPs),可用于快速构建Web应用程序。使用Ja</div> </li> <li><a href="/article/1901720716294811648.htm" title="【Java基础19】异常,异常处理,自定义异常,受检与非受检异常" target="_blank">【Java基础19】异常,异常处理,自定义异常,受检与非受检异常</a> <span class="text-muted">摘星观月</span> <a class="tag" taget="_blank" href="/search/Java%E5%9F%BA%E7%A1%80/1.htm">Java基础</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>一、异常1、概念异常是阻止当前方法或作用域继续执行的问题,在程序中导致程序中断运行的一些指令。Throwable是异常的基类,分为Error和Exception。Exception分为编译期异常(受检)和运行期异常(非受检)。异常会导致程序中断,无法继续执行。在开发中,我们要把可能出现异常的代码使用try语句包裹起来。处理异常可以保证程序继续执行。2、案例publicclassTest02{pub</div> </li> <li><a href="/article/1901720715497893888.htm" title="Java—异常体系" target="_blank">Java—异常体系</a> <span class="text-muted">且将&</span> <a class="tag" taget="_blank" href="/search/Java%E5%9F%BA%E7%A1%80/1.htm">Java基础</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>文章目录异常和错误java异常的分类:非运行时异常运行时异常受检异常(非运行时异常)如何处理?1、trycatchfinally为什么要用trycatchfinally2、throwsThrow和Throws的区别JVM是如何处理异常的try-catch-finally中哪个部分可以省略————————————————————————————————异常和错误下面这就是异常(exception)错</div> </li> <li><a href="/article/1901720589370978304.htm" title="L2-023 图着色问题 - java" target="_blank">L2-023 图着色问题 - java</a> <span class="text-muted">谢谢 啊sir</span> <a class="tag" taget="_blank" href="/search/pta/1.htm">pta</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/%E7%AE%97%E6%B3%95/1.htm">算法</a> <div>L2-023图着色问题时间限制300ms内存限制64MB题目描述:图着色问题是一个著名的NP完全问题。给定无向图G=(V,E),问可否用K种颜色为V中的每一个顶点分配一种颜色,使得不会有两个相邻顶点具有同一种颜色?但本题并不是要你解决这个着色问题,而是对给定的一种颜色分配,请你判断这是否是图着色问题的一个解。输入格式:输入在第一行给出3个整数V(00){TreeSettr=newTreeSet()</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>