简单的用 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/1901979900982652928.htm" title="Java是值传递" target="_blank">Java是值传递</a> <span class="text-muted">先睡</span> <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中的参数传递始终是值传递(passbyvalue)。无论是基本数据类型还是对象类型,传递给方法的是变量值的副本,而非变量本身。以下是对这一概念的详细解析:1.基本数据类型的值传递传递机制:传递的是变量的值副本,方法内的修改不影响原始变量。voidmodify(intnum){num=10;//修改的是副本,原变量不受影响}inta=5;modify(a);System.out.printl</div> </li> <li><a href="/article/1901979773354176512.htm" title="Maven 插件" target="_blank">Maven 插件</a> <span class="text-muted">先睡</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>为Maven插件配置环境变量通常涉及到设置Java环境变量以及Maven相关的环境变量。以下是一些基本步骤:1.设置Java环境变量Maven需要Java运行环境,因此您需要确保Java的环境变量已经正确设置。-**JAVA_HOME**:指向您的Java安装目录。-**PATH**:包含`%JAVA_HOME%\bin`,使得`java`和`javac`命令可以在命令行中直接使用。在Window</div> </li> <li><a href="/article/1901972586720456704.htm" title="一招帮你搞定验证码设置" target="_blank">一招帮你搞定验证码设置</a> <span class="text-muted">不修×蝙蝠</span> <a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/%E9%AA%8C%E8%AF%81%E7%A0%81/1.htm">验证码</a><a class="tag" taget="_blank" href="/search/session/1.htm">session</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>目录一、准备环境编辑二、配置环境三、基础方法四、验证码的一些常用类别1.LineCaptcha线段干扰的验证码(Java)2.CircleCaptcha圆圈干扰的验证码(Java)3.ShearCaptcha扭曲干扰验证码4.写出到浏览器输出5.自定义验证码CodeGenerator五、通过实例来简述过程1.一个简易html文件2.创建生成验证码图片的Java文件①定义图形验证码的长、宽、验证码字</div> </li> <li><a href="/article/1901971956782133248.htm" title="详细讲一下webpack中五个优化能力十分强大的插件(1-5)" target="_blank">详细讲一下webpack中五个优化能力十分强大的插件(1-5)</a> <span class="text-muted">asecretman!</span> <a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a> <div>1.TerserPlugin功能:用于压缩和优化JavaScript代码,支持ES6+语法。安装:npminstallterser-webpack-plugin--save-dev配置constTerserPlugin=require('terser-webpack-plugin');module.exports={mode:'production',//设置为生产模式,启用优化optimizat</div> </li> <li><a href="/article/1901971197575360512.htm" title="JavaScript 异步编程:从回调到 Async/Await 进化" target="_blank">JavaScript 异步编程:从回调到 Async/Await 进化</a> <span class="text-muted">PM简读馆</span> <a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF%E6%9D%82%E8%B0%88/1.htm">技术杂谈</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</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/ecmascript/1.htm">ecmascript</a> <div>作者简介:程序员转项目管理领域优质创作者个人邮箱:[2707492172@qq.com]PMP资料导航:PM菜鸟(查阅PMP大纲考点)座右铭:上善若水,水善利万物而不争。绿泡泡:PM简读馆(包含更多PM常用免费资料)目录1.回调函数(Callback)2.Promise3.Generator4.Async/Await在JavaScript中,异步编程是一个非常重要的概念,因为JavaScript是</div> </li> <li><a href="/article/1901970185812766720.htm" title="【Java】已解决:`java.sql.SQLSyntaxErrorException: SQL`" target="_blank">【Java】已解决:`java.sql.SQLSyntaxErrorException: SQL`</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/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>个人简介:某不知名博主,致力于全栈领域的优质博客分享|用最优质的内容带来最舒适的阅读体验!文末获取免费IT学习资料!文末获取更多信息精彩专栏推荐订阅收藏专栏系列直达链接相关介绍书籍分享点我跳转书籍作为获取知识的重要途径,对于IT从业者来说更是不可或缺的资源。不定期更新IT图书,并在评论区抽取随机粉丝,书籍免费包邮到家AI前沿点我跳转探讨人工智能技术领域的最新发展和创新,涵盖机器学习、深度学习、自然</div> </li> <li><a href="/article/1901969304421724160.htm" title="springboot一课一得" target="_blank">springboot一课一得</a> <span class="text-muted">POlse</span> <a class="tag" taget="_blank" href="/search/springboot/1.htm">springboot</a> <div>SpringBoot学习之路:从基础到进阶SpringBoot是基于Spring框架的一个开源项目,它通过简化配置、自动化功能以及集成多种开箱即用的技术,使开发者能够更快地开发、测试和部署Java应用程序。它不仅减少了开发者的配置工作量,还为开发者提供了很多与生产环境相关的功能,使得SpringBoot成为现代Web开发、微服务架构和企业级应用开发的首选框架。本文将基于“SpringBoot一课一</div> </li> <li><a href="/article/1901966783582105600.htm" title="Java注解" target="_blank">Java注解</a> <span class="text-muted">陈陈爱java</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基本注解注解注解与注释的区别注释:增强代码的可阅读性,并不会对程序的执行产生任何影响。注解:给编译器或运行时环境提供额外的信息,能够影响程序的编译或运行行为。常见注解@Override明确标记一个方法是覆盖(重写)了父类中的方法。classAnimal{voidmakeSound(){System.out.println("Animalmakesasound");}}classDogext</div> </li> <li><a href="/article/1901966784328691712.htm" title="Java、Spring、SpringBoot" target="_blank">Java、Spring、SpringBoot</a> <span class="text-muted">陈陈爱java</span> <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/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a> <div>JAVA与Spring不使用Spring的程序UserService.javapublicclassUserService{publicStringgetUserName(){return"JohnDoe";}}Main.javapublicclassMain{publicstaticvoidmain(String[]args){//手动创建UserService实例UserServiceuser</div> </li> <li><a href="/article/1901962113929244672.htm" title="html怎么获取父页面的元素的值,使用JavaScript与jQuery怎么在子窗口中获取父窗口的元素值..." target="_blank">html怎么获取父页面的元素的值,使用JavaScript与jQuery怎么在子窗口中获取父窗口的元素值...</a> <span class="text-muted">weixin_39907658</span> <div>使用JavaScript与jQuery怎么在子窗口中获取父窗口的元素值发布时间:2021-02-1815:42:20来源:亿速云阅读:115作者:Leah使用JavaScript与jQuery怎么在子窗口中获取父窗口的元素值?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。js:父窗口:子窗口:curproject=window.op</div> </li> <li><a href="/article/1901961734613168128.htm" title="jquery查找父窗体id_jquery 获取父窗口的元素、父窗口、子窗口" target="_blank">jquery查找父窗体id_jquery 获取父窗口的元素、父窗口、子窗口</a> <span class="text-muted">weixin_39781550</span> <a class="tag" taget="_blank" href="/search/jquery%E6%9F%A5%E6%89%BE%E7%88%B6%E7%AA%97%E4%BD%93id/1.htm">jquery查找父窗体id</a> <div>一、获取父窗口元素:$("#父窗口元素ID",window.parent.document);对应javascript版本为window.parent.document.getElementById("父窗口元素ID");取父窗口的元素方法:$(selector,window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector,window.parent.</div> </li> <li><a href="/article/1901961482007015424.htm" title="jquery查找父窗体id_JS与jQuery实现子窗口获取父窗口元素值的方法" target="_blank">jquery查找父窗体id_JS与jQuery实现子窗口获取父窗口元素值的方法</a> <span class="text-muted">北木南烟</span> <a class="tag" taget="_blank" href="/search/jquery%E6%9F%A5%E6%89%BE%E7%88%B6%E7%AA%97%E4%BD%93id/1.htm">jquery查找父窗体id</a> <div>这篇文章主要介绍了JS与jQuery实现子窗口获取父窗口元素值的方法,涉及javascript与jQuery操作窗口元素的相关技巧,需要的朋友可以参考下本文实例讲述了JS与jQuery实现子窗口获取父窗口元素值的方法。分享给大家供大家参考,具体如下:功能描述:父窗口有一个input,和一个button,点击button打开子窗口,在子窗口中获取父窗口中input的值,并显示。js:父窗口:子窗口:</div> </li> <li><a href="/article/1901957828592070656.htm" title="【Java教程】Day13-05 正则表达式:贪婪与非贪婪匹配" target="_blank">【Java教程】Day13-05 正则表达式:贪婪与非贪婪匹配</a> <span class="text-muted">即刻提优</span> <a class="tag" taget="_blank" href="/search/Java%E6%95%99%E7%A8%8B/1.htm">Java教程</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%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>在正则表达式中,匹配规则有两种模式:贪婪匹配和非贪婪匹配。默认情况下,正则表达式使用贪婪匹配,即尽可能多地匹配字符。有时,我们希望匹配尽可能少的字符,这时就需要使用非贪婪匹配。本文将通过具体的例子介绍贪婪与非贪婪匹配的区别,并提供如何在Java中实现这些匹配的教程。1.贪婪匹配的默认行为首先,让我们看一个简单的示例:给定一个字符串,判断该数字末尾零的个数。比如:"123000":3个0"10100</div> </li> <li><a href="/article/1901950139761750016.htm" title="【ES6新特性】声明变量关键字:var、let、const详解" target="_blank">【ES6新特性】声明变量关键字:var、let、const详解</a> <span class="text-muted">小钟H呀</span> <a class="tag" taget="_blank" href="/search/ES6%E6%96%B0%E7%89%B9%E6%80%A7%E5%AD%A6%E4%B9%A0%E6%89%8B%E5%86%8C/1.htm">ES6新特性学习手册</a><a class="tag" taget="_blank" href="/search/es6/1.htm">es6</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>前言在ES6(ECMAScript2015)之前,JavaScript中只有var关键字用于变量声明。ES6新增了let和const,它们解决了var的一些设计缺陷,使得变量声明更安全、更符合编程直觉。核心特性对比1.作用域(Scope)var:函数作用域(在函数内部声明的变量,只能在函数内部访问)let/const:块级作用域(在{}代码块中声明的变量,只能在块内访问)//var示例functi</div> </li> <li><a href="/article/1901946109241126912.htm" title="神器 Turbo Console Log:让 `console.log` 操作一键搞定!" target="_blank">神器 Turbo Console Log:让 `console.log` 操作一键搞定!</a> <span class="text-muted">Judy1623</span> <a class="tag" taget="_blank" href="/search/VS/1.htm">VS</a><a class="tag" taget="_blank" href="/search/Code/1.htm">Code</a><a class="tag" taget="_blank" href="/search/%E6%8F%92%E4%BB%B6/1.htm">插件</a><a class="tag" taget="_blank" href="/search/vscode/1.htm">vscode</a><a class="tag" taget="_blank" href="/search/%E6%8F%92%E4%BB%B6/1.htm">插件</a> <div>在前端开发的日常里,尤其是使用VSCode调试JavaScript代码时,console.log堪称我们的“调试好帮手”。但每次都手动输入console.log语句,着实麻烦又浪费时间。今天就给大家安利一款超实用的VSCode插件——TurboConsoleLog,用了它,你会感叹为什么没有早点发现!安装和卸载步骤就不多说了,相信大家都轻车熟路。咱们直接进入重点——这款插件的快捷键使用方法。使用注</div> </li> <li><a href="/article/1901945728452849664.htm" title="3.7 Spring Boot整合Kafka:消息顺序性与消费幂等性保障" target="_blank">3.7 Spring Boot整合Kafka:消息顺序性与消费幂等性保障</a> <span class="text-muted">Sendingab</span> <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/%E4%BB%8E%E5%85%A5%E9%97%A8%E5%88%B0%E7%B2%BE%E9%80%9A/1.htm">从入门到精通</a><a class="tag" taget="_blank" href="/search/%E9%9B%B6%E5%9F%BA%E7%A1%807%E5%A4%A9%E7%B2%BE%E9%80%9ASpring/1.htm">零基础7天精通Spring</a><a class="tag" taget="_blank" href="/search/Boot/1.htm">Boot</a><a class="tag" taget="_blank" href="/search/linq/1.htm">linq</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</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/kafka/1.htm">kafka</a> <div>在SpringBoot中整合Kafka并保障消息顺序性与消费幂等性,可以通过以下步骤实现:一、消息顺序性保障1.生产者配置相同Key写入同一分区:Kafka保证同一分区内消息的顺序性,生产者发送消息时指定相同Key,确保相关消息进入同一分区。java@AutowiredprivateKafkaTemplatekafkaTemplate;publicvoidsendMessage(Stringkey</div> </li> <li><a href="/article/1901943960796983296.htm" title="高级java每日一道面试题-2025年3月05日-微服务篇[Eureka篇]-Eureka在微服务架构中的角色?" target="_blank">高级java每日一道面试题-2025年3月05日-微服务篇[Eureka篇]-Eureka在微服务架构中的角色?</a> <span class="text-muted">java我跟你拼了</span> <a class="tag" taget="_blank" href="/search/java%E6%AF%8F%E6%97%A5%E4%B8%80%E9%81%93%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">java每日一道面试题</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%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%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84%E6%9C%8D%E5%8A%A1%E5%8F%91%E7%8E%B0/1.htm">架构服务发现</a><a class="tag" taget="_blank" href="/search/%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5/1.htm">健康检查</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E6%B3%A8%E5%86%8C/1.htm">服务注册</a> <div>如果有遗漏,评论区告诉我进行补充面试官:Eureka在微服务架构中的角色?我回答:在微服务架构中,Eureka作为Netflix开源的服务发现组件,在解决服务间通信的寻址问题方面扮演着至关重要的角色。以下是结合提供的内容对Eureka在微服务架构中的角色进行的详细解析和综合概述:1.服务注册(ServiceRegistration)功能:服务提供者(Provider)启动时向EurekaServe</div> </li> <li><a href="/article/1901943708404740096.htm" title="高级java每日一道面试题-2025年3月01日-微服务篇[SpringCloud篇]-SpringCloud和微服务之间是什么关系?" target="_blank">高级java每日一道面试题-2025年3月01日-微服务篇[SpringCloud篇]-SpringCloud和微服务之间是什么关系?</a> <span class="text-muted">java我跟你拼了</span> <a class="tag" taget="_blank" href="/search/java%E6%AF%8F%E6%97%A5%E4%B8%80%E9%81%93%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">java每日一道面试题</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><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/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/cloud/1.htm">cloud</a><a class="tag" taget="_blank" href="/search/%E5%A4%8D%E6%9D%82%E5%BA%A6%E5%8F%AF%E6%8E%A7/1.htm">复杂度可控</a><a class="tag" taget="_blank" href="/search/%E7%8B%AC%E7%AB%8B%E9%83%A8%E7%BD%B2/1.htm">独立部署</a><a class="tag" taget="_blank" href="/search/%E6%8A%80%E6%9C%AF%E9%80%89%E5%9E%8B%E7%81%B5%E6%B4%BB/1.htm">技术选型灵活</a><a class="tag" taget="_blank" href="/search/%E5%AE%B9%E9%94%99%E6%80%A7%E5%A5%BD/1.htm">容错性好</a> <div>如果有遗漏,评论区告诉我进行补充面试官:SpringCloud和微服务之间是什么关系?我回答:在Java高级面试中讨论SpringCloud与微服务之间的关系时,理解两者如何相互作用以及SpringCloud如何支持微服务架构的具体实现是非常重要的。以下是结合提供的内容对这两者关系的详细解析和综合概述:微服务概述定义:微服务是一种将大型单体应用拆分为多个小型、独立运行的服务的设计风格。每个服务专注</div> </li> <li><a href="/article/1901940559178690560.htm" title="fastapi+angular实现Tcp在线聊天室功能" target="_blank">fastapi+angular实现Tcp在线聊天室功能</a> <span class="text-muted">勘察加熊人</span> <a class="tag" taget="_blank" href="/search/typescript/1.htm">typescript</a><a class="tag" taget="_blank" href="/search/fastapi/1.htm">fastapi</a><a class="tag" taget="_blank" href="/search/angular.js/1.htm">angular.js</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a> <div>说明:我计划用fastapi+angular,实现一个在线聊天室的功能,1.必须有一个服务端和多个客户端2.用一个列表,显示当前所有在线的用户3.所有在线的用户,必须实现群聊和单独聊天效果图:新增安卓测试程序C:\Users\wangrusheng\AndroidStudioProjects\MyApplication9\app\src\test\java\com\example\myapplic</div> </li> <li><a href="/article/1901937152988606464.htm" title="高级java每日一道面试题-2025年3月04日-微服务篇[Eureka篇]-Eureka是什么?" target="_blank">高级java每日一道面试题-2025年3月04日-微服务篇[Eureka篇]-Eureka是什么?</a> <span class="text-muted">java我跟你拼了</span> <a class="tag" taget="_blank" href="/search/java%E6%AF%8F%E6%97%A5%E4%B8%80%E9%81%93%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">java每日一道面试题</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><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/eureka/1.htm">eureka</a><a class="tag" taget="_blank" href="/search/%E7%BB%84%E4%BB%B6%E5%92%8C%E6%9E%B6%E6%9E%84/1.htm">组件和架构</a><a class="tag" taget="_blank" href="/search/%E9%9B%86%E7%BE%A4%E9%83%A8%E7%BD%B2/1.htm">集群部署</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E6%88%91%E4%BF%9D%E6%8A%A4%E6%9C%BA%E5%88%B6/1.htm">自我保护机制</a><a class="tag" taget="_blank" href="/search/%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5/1.htm">健康检查</a> <div>如果有遗漏,评论区告诉我进行补充面试官:Eureka是什么?我回答:在Java高级面试中,关于Eureka的讨论通常会涵盖其基本概念、组件与架构、工作原理、高级特性以及与其他服务发现工具的比较等多个方面。以下是结合提供的内容对Eureka进行的详细解析和综合概述:一、Eureka的基本概念Eureka是Netflix开源的服务注册与发现组件,广泛应用于SpringCloud生态系统中,主要用于解决</div> </li> <li><a href="/article/1901931607267274752.htm" title="java版鸿鹄招采系统源码 招投标系统源码 供应商招投标平台源码" target="_blank">java版鸿鹄招采系统源码 招投标系统源码 供应商招投标平台源码</a> <span class="text-muted">微服务 spring cloud</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%8B%9B%E6%8A%95%E6%A0%87%E7%B3%BB%E7%BB%9F%E6%BA%90%E7%A0%81/1.htm">招投标系统源码</a><a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A%E6%8B%9B%E6%8A%95%E6%A0%87%E7%B3%BB%E7%BB%9F%E6%BA%90%E7%A0%81/1.htm">企业招投标系统源码</a><a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A%E6%8B%9B%E9%87%87/1.htm">企业招采</a> <div>在数字化时代,企业对工程管理的需求日益增长,这要求企业采用先进的数字化技术来提高效率和质量。招投标管理系统作为一种关键的应用平台,能够满足企业内部业务项目管理的需求,涵盖了门户管理、立项管理、采购项目管理、采购公告管理、考核管理、报表管理、评审管理、企业管理、采购管理和系统管理等多个方面。该系统以项目为主线,从项目立项到项目归档,实现了数据信息的实时共享、规范化管理和有效监控。通过有效沟通、高效流</div> </li> <li><a href="/article/1901929967994859520.htm" title="小白怎么入门网络安全?看这篇就够啦!" target="_blank">小白怎么入门网络安全?看这篇就够啦!</a> <span class="text-muted">Hacker_LaoYi</span> <a class="tag" taget="_blank" href="/search/web%E5%AE%89%E5%85%A8/1.htm">web安全</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E5%85%A8/1.htm">安全</a> <div>由于我之前写了不少网络安全技术相关的故事文章,不少读者朋友知道我是从事网络安全相关的工作,于是经常有人在微信里问我:我刚入门网络安全,该怎么学?要学哪些东西?有哪些方向?怎么选?不同于Java、C/C++等后端开发岗位有非常明晰的学习路线,网路安全更多是靠自己摸索,要学的东西又杂又多,难成体系。常读我文章的朋友知道,我的文章基本以故事为载体的技术输出为主,很少去谈到职场、面试这些方面的内容。主要是</div> </li> <li><a href="/article/1901926316379271168.htm" title="前端框架革命:React与Vue对比与解析" target="_blank">前端框架革命:React与Vue对比与解析</a> <span class="text-muted">WHCIS</span> <a class="tag" taget="_blank" href="/search/Web%E5%BC%80%E5%8F%91%E6%8A%80%E6%9C%AF/1.htm">Web开发技术</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a> <div>一、框架设计哲学的本质差异1.1React:以JavaScript为核心的函数式哲学React的核心思想可以概括为**“UI即函数”**,其设计遵循以下原则:React核心声明式编程组件即函数单向数据流JSX描述UI函数组件+Hook状态提升模式声明式编程:开发者只需描述界面应该呈现的最终状态,无需关心具体DOM操作细节不可变数据流:通过setState触发组件树更新,保持数据流向的可预测性虚拟D</div> </li> <li><a href="/article/1901924167956099072.htm" title="【玩转正则表达式】Python、Go、Java正则表达式解释器的差异解析(附示例)" target="_blank">【玩转正则表达式】Python、Go、Java正则表达式解释器的差异解析(附示例)</a> <span class="text-muted">ThisIsClark</span> <a class="tag" taget="_blank" href="/search/%E7%8E%A9%E8%BD%AC%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">玩转正则表达式</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/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/golang/1.htm">golang</a> <div>正则表达式作为文本处理的利器,在不同编程语言中的实现却暗藏玄机。Python、Go和Java作为主流开发语言,其正则引擎在语法支持、功能完整性和性能表现上存在显著差异。本文通过具体示例,揭示这些差异及应对策略。一、原始字符串与转义差异Python使用r""定义原始字符串,避免转义:importrere.findall(r'\d+','123a456')#输出['123','456']Go和Java</div> </li> <li><a href="/article/1901917609503289344.htm" title="Java面试常见的面试题(持续更新版)" target="_blank">Java面试常见的面试题(持续更新版)</a> <span class="text-muted">Java进阶八股文</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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</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/jvm/1.htm">jvm</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> <div>一丶基础知识1.面向对象(工作时间不是很长的出现频率)什么是面向对象?什么是面向过程?面向过程:例子:我要洗衣服把衣服放进洗衣机→加入洗衣液→关上洗衣机门→按下启动按钮面向对象:例子:我要洗衣服对象有我洗衣机我要做的事:把衣服放进去加入洗衣液关门按启动按钮洗衣机要做的事:清洗以上可以看出,面向过程比较高效比较直接,面向对象更易于扩展丶维护和复用封装明确标识出允许外部使用的所有成员函数和数据项,内部</div> </li> <li><a href="/article/1901917105561858048.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/servlet/1.htm">servlet</a><a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a> <div>一、JavaWeb概述JavaWeb是指使用Java技术来解决相关web互联网领域的技术总和。在当今数字化时代,JavaWeb在构建企业级应用、电子商务平台、社交网络等方面发挥着至关重要的作用。(一)JavaWeb的体系结构JavaWeb应用的体系结构主要分为客户端层、表示层、业务逻辑层和数据访问层。1.客户端层-这是用户与Web应用交互的最前端。主要包括用户浏览器,它可以接收并显示从服务器端发送</div> </li> <li><a href="/article/1901916599753961472.htm" title="前端面试:ajax 和 xhr 是什么关系?" target="_blank">前端面试:ajax 和 xhr 是什么关系?</a> <span class="text-muted">returnShitBoy</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/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/ajax/1.htm">ajax</a> <div>在前端开发中,AJAX(AsynchronousJavaScriptandXML)和XHR(XMLHttpRequest)是两个密切相关但有些不同的概念。以下是对这两者的详细解释及其关系:1.AJAX定义:AJAX是一个用于创建异步web应用程序的技术。它允许网页在不完全重新加载整页的情况下,与服务器交换数据并更新部分网页内容。主要特征:异步操作:AJAX使得页面可以在后台与服务器进行数据交换,用</div> </li> <li><a href="/article/1901903365474938880.htm" title="自定义Spark启动的metastore_db和derby.log生成路径" target="_blank">自定义Spark启动的metastore_db和derby.log生成路径</a> <span class="text-muted">节昊文</span> <a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a> <div>1.进入安装spark目录的conf目录下2.复制spark-defaults.conf.template文件为spark-defaults.conf3.在spark-defaults.conf文件的末尾添加一行:spark.driver.extraJavaOptions-Dderby.system.home=/log即生成的文件存放的目录</div> </li> <li><a href="/article/1901900090688204800.htm" title="java redis pipeline,redis pipeline简介" target="_blank">java redis pipeline,redis pipeline简介</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/pipeline/1.htm">pipeline</a> <div>java中redis的pipelinepipeline方式执行redis操作:Listresults=this.getRedisTemplate().executePipelined(newRedisCallback(){@OverridepublicObjectdoInRedis(RedisConnectionconnection)throwsDataAccessException{RedisS</div> </li> <li><a href="/article/1901899964313825280.htm" title="构建AngularJS动态Web应用的示例教程" target="_blank">构建AngularJS动态Web应用的示例教程</a> <span class="text-muted">你这人真狗</span> <div>本文还有配套的精品资源,点击获取简介:AngularJS是一个由Google支持的前端JavaScript框架,用于创建动态Web应用程序。本文将通过一个名为“angular-sample-app”的示例应用程序,详细介绍AngularJS的核心特性,包括双向数据绑定、控制器、指令系统、服务与依赖注入、表单处理、路由与导航、模板和局部存储以及其他高级特性。通过这个示例应用的深入剖析,开发者可以学习</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>