精华内容
下载资源
问答
  • work 工作目录:该目录用于存放 jsp 被访问后生成对应的server 文件和.class 文件 HTTP 协议 HTTP 请求 组成 请求行 请求头 请求正文 HTTP 响应 状态行 消息报头 响应正文 XML 可扩展标记语言 XML 作用 1、存储、...

    JS第八天

    ba8a11291af12c7e6f7af6c5c9d0736a.png

    XML

    可扩展标记语言

    XML 作用

    1、存储、交换数据

    2、配置

    格式良好的 xml

    1、语法规范:

    1)、必须有 XML 文档声明:

    <?xml version="1.0" encoding="UTF-8"?>

    2)、必须有且仅有一个根元素

    3)、严格区分大小写

    4)、属性值用引号(双引号或单引号) :等号分开的名称-值对;在一个元素上,相同的属性只能出现一次

    5)、标记成对;

    6)、空标记关闭;

    7)、元素正确嵌套。

    XML 解析(重点)

    SAX:

    效率高,数据量小,仅一次获取

    DOM

    整颗树加载到内存中,耗内存,可多次获取。

    (比较常用)

    DOM 解析

    四个核心的操作接口

    Document : 此接口代表了整个 XML 文档,表示的是整棵 DOM 树的根

    Node :每一个 Node 接口代表了 DOM 树种的一个节点。

    NodeList : 此接口表示的是一个节点的集合,一般用于表示有顺序关系的一组节点

    JavaWeb

    Tomcat

    Tomcat 是一个符合 JavaEE WEB 标准的最小的 WEB 容器

    优点

    Tomcat 技术先进、性能稳定,而且免费,因而深受 Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

    Tomcat 目录结构

    1. bin:启动和关闭 tomcat 的 bat 文件

    2. conf:配置文件 server.xml 该文件用于配置 server 相关的信息

    3. lib:该目录放置运行 tomcat 运行需要的 jar 包

    4. logs:存放日志,当我们需要查看日志的时候,可以查询信息

    5. webapps:放置我们的 web 应用

    6. work 工作目录:该目录用于存放 jsp 被访问后生成对应的server 文件和.class 文件

    HTTP 协议

    HTTP 请求

    组成

    请求行

    请求头

    请求正文

    HTTP 响应

    状态行

    消息报头

    响应正文

    XML

    可扩展标记语言

    XML 作用

    1、存储、交换数据

    2、配置

    格式良好的 xml

    1、语法规范:

    1)、必须有 XML 文档声明:

    <?xml version="1.0" encoding="UTF-8"?>

    2)、必须有且仅有一个根元素

    3)、严格区分大小写

    4)、属性值用引号(双引号或单引号) :等号分开的名称-值对;在一个元素上,相同的属性只能出现一次

    5)、标记成对;

    6)、空标记关闭;

    7)、元素正确嵌套。

    XML 解析(重点)

    SAX:

    效率高,数据量小,仅一次获取

    DOM

    整颗树加载到内存中,耗内存,可多次获取。

    (比较常用)

    DOM 解析

    四个核心的操作接口

    Document : 此接口代表了整个 XML 文档,表示的是整棵 DOM 树的根

    Node :每一个 Node 接口代表了 DOM 树种的一个节点。

    NodeList : 此接口表示的是一个节点的集合,一般用于表示有顺序关系的一组节点

    JavaWeb

    Tomcat

    Tomcat 是一个符合 JavaEE WEB 标准的最小的 WEB 容器

    优点

    Tomcat 技术先进、性能稳定,而且免费,因而深受 Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

    Tomcat 目录结构

    1. bin:启动和关闭 tomcat 的 bat 文件

    2. conf:配置文件 server.xml 该文件用于配置 server 相关的信息

    3. lib:该目录放置运行 tomcat 运行需要的 jar 包

    4. logs:存放日志,当我们需要查看日志的时候,可以查询信息

    5. webapps:放置我们的 web 应用

    6. work 工作目录:该目录用于存放 jsp 被访问后生成对应的server 文件和.class 文件

    HTTP 协议

    HTTP 请求

    组成

    请求行

    请求头

    请求正文

    HTTP 响应

    状态行

    消息报头

    响应正文

    展开全文
  • 前言介绍 在我们实现开发RPC框架的时候,需要选择socket的通信方式。...这里我们选择netty作为我们的socket框架,采用future方式进行通信。 Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于...

    前言介绍

    在我们实现开发RPC框架的时候,需要选择socket的通信方式。而我们知道一般情况下socket通信类似与qq聊天,发过去消息,什么时候回复都可以。但是我们RPC框架通信,从感觉上类似http调用,需要在一定时间内返回,否则就会发生超时断开。这里我们选择netty作为我们的socket框架,采用future方式进行通信。

    Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于 2011 年末对外开源,仅支持 Java 语言。
    Motan:微博内部使用的 RPC 框架,于 2016 年对外开源,仅支持 Java 语言。
    Tars:腾讯内部使用的 RPC 框架,于 2017 年对外开源,仅支持 C++ 语言。
    Spring Cloud:国外 Pivotal 公司 2014 年对外开源的 RPC 框架,仅支持 Java 语言
    gRPC:Google 于 2015 年对外开源的跨语言 RPC 框架,支持多种语言。
    Thrift:最初是由 Facebook 开发的内部系统跨语言的 RPC 框架,2007 年贡献给了 Apache 基金,成为 Apache 开源项目之一,支持多种语言。
    hprose:一个MIT开源许可的新型轻量级跨语言跨平台的面向对象的高性能远程动态通讯中间件。它支持众多语言:nodeJs, C++, .NET, Java, Delphi, Objective-C, ActionScript, JavaScript, ASP, PHP, Python, Ruby, Perl, Golang 。

    环境准备

    1、jdk1.8【jdk1.7以下只能部分支持netty】
    2、Netty4.1.36.Final【netty3.x 4.x 5每次的变化较大,接口类名也随着变化】

    代码示例

    itstack-demo-rpc-2-07
    └── src
        └── main
        │    └── java
        │        └── org.itstack.demo.netty
        │             ├── client
        │             │   ├── ClientSocket.java
        │             │   └── MyClientHandler.java  
        │             ├── codec
        │             │   ├── RpcDecoder.java
        │             │   └── RpcEncoder.java  
        │             ├── future
        │             │   ├── SyncWrite.java    
        │             │   ├── SyncWriteFuture.java  
        │             │   ├── SyncWriteMap.java 
        │             │   └── WriteFuture.java  
        │             ├── msg
        │             │   ├── Request.java
        │             │   └── Response.java 
        │             ├── server
        │             │   ├── MyServerHandler.java
        │             │   └── ServerSocket.java     
        │             └── util
        │                 └── SerializationUtil.java    
        └── test
             └── java
                 └── org.itstack.demo.test
                     ├── StartClient.java
                     └── StartServer.java    
    

    ** 展示部分重要代码块,完整代码可以关注公众号获取;bugstack虫洞栈 **

    MyClientHandler.java

    /**
     * 虫洞栈:https://bugstack.cn
     * 公众号:bugstack虫洞栈  {关注获取学习源码}
     * 虫洞群:①群5398358 ②群5360692
     * Create by fuzhengwei on 2019
     */
    public class MyClientHandler extends ChannelInboundHandlerAdapter {
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object obj) throws Exception {
            Response msg = (Response) obj;
            String requestId = msg.getRequestId();
            SyncWriteFuture future = (SyncWriteFuture) SyncWriteMap.syncKey.get(requestId);
            if (future != null) {
                future.setResponse(msg);
            }
        }
    
        @Override
        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
            cause.printStackTrace();
            ctx.close();
        }
    
    }
    

    SyncWrite.java

    /**
     * 虫洞栈:https://bugstack.cn
     * 公众号:bugstack虫洞栈  {关注获取学习源码}
     * 虫洞群:①群5398358 ②群5360692
     * Create by fuzhengwei on 2019
     */
    public class SyncWrite {
    
        public Response writeAndSync(final Channel channel, final Request request, final long timeout) throws Exception {
    
            if (channel == null) {
                throw new NullPointerException("channel");
            }
            if (request == null) {
                throw new NullPointerException("request");
            }
            if (timeout <= 0) {
                throw new IllegalArgumentException("timeout <= 0");
            }
    
            String requestId = UUID.randomUUID().toString();
            request.setRequestId(requestId);
    
            WriteFuture<Response> future = new SyncWriteFuture(request.getRequestId());
            SyncWriteMap.syncKey.put(request.getRequestId(), future);
    
            Response response = doWriteAndSync(channel, request, timeout, future);
    
            SyncWriteMap.syncKey.remove(request.getRequestId());
            return response;
        }
    
        private Response doWriteAndSync(final Channel channel, final Request request, final long timeout, final WriteFuture<Response> writeFuture) throws Exception {
    
            channel.writeAndFlush(request).addListener(new ChannelFutureListener() {
                public void operationComplete(ChannelFuture future) throws Exception {
                    writeFuture.setWriteResult(future.isSuccess());
                    writeFuture.setCause(future.cause());
                    //失败移除
                    if (!writeFuture.isWriteSuccess()) {
                        SyncWriteMap.syncKey.remove(writeFuture.requestId());
                    }
                }
            });
    
            Response response = writeFuture.get(timeout, TimeUnit.MILLISECONDS);
            if (response == null) {
                if (writeFuture.isTimeout()) {
                    throw new TimeoutException();
                } else {
                    // write exception
                    throw new Exception(writeFuture.cause());
                }
            }
            return response;
        }
    
    }
    

    MyServerHandler.java

    /**
     * 虫洞栈:https://bugstack.cn
     * 公众号:bugstack虫洞栈  {关注获取学习源码}
     * 虫洞群:①群5398358 ②群5360692
     * Create by fuzhengwei on 2019
     */
    public class MyServerHandler extends ChannelInboundHandlerAdapter{
    
        @Override
        public void channelRead(ChannelHandlerContext ctx, Object obj){
            Request msg = (Request) obj;
            //反馈
            Response request = new Response();
            request.setRequestId(msg.getRequestId());
            request.setParam(msg.getResult() + " 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。");
            ctx.writeAndFlush(request);
            //释放
            ReferenceCountUtil.release(msg);
        }
    
        @Override
        public void channelReadComplete(ChannelHandlerContext ctx) {
            ctx.flush();
        }
    
    }
    

    StartClient.java

    /**
     * 虫洞栈:https://bugstack.cn
     * 公众号:bugstack虫洞栈  {关注获取学习源码}
     * 虫洞群:①群5398358 ②群5360692
     * Create by fuzhengwei on 2019
     */
    public class StartClient {
    
        private static ChannelFuture future;
    
        public static void main(String[] args) {
            ClientSocket client = new ClientSocket();
            new Thread(client).start();
    
            while (true) {
                try {
                    //获取future,线程有等待处理时间
                    if (null == future) {
                        future = client.getFuture();
                        Thread.sleep(500);
                        continue;
                    }
                    //构建发送参数
                    Request request = new Request();
                    request.setResult("查询{bugstack虫洞栈}用户信息");
                    SyncWrite s = new SyncWrite();
                    Response response = s.writeAndSync(future.channel(), request, 1000);
                    System.out.println("调用结果:" + JSON.toJSON(response));
                    Thread.sleep(1000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
    
    

    StartServer.java

    /**
     * 虫洞栈:https://bugstack.cn
     * 公众号:bugstack虫洞栈  {关注获取学习源码}
     * 虫洞群:①群5398358 ②群5360692
     * Create by fuzhengwei on 2019
     */
    public class StartServer {
    
        public static void main(String[] args) {
            new Thread(new ServerSocket()).start();
            System.out.println("itstack-demo-netty server start done. {关注公众号:bugstack虫洞栈,获取源码}");
        }
    
    }
    

    测试结果

    启动StartServer

    itstack-demo-netty server start done. {关注公众号:bugstack虫洞栈,获取源码}
    

    启动StartClient

    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"188ba00e-3a0d-4094-9475-c7ee93104011"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"bc9d63d4-9d37-406a-9c0f-a68211ac466f"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"cceb510b-8179-46ab-abc6-eb7d5b6c0ac2"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"f65aafd0-07b7-4bdb-be80-a57b4c58ad2d"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"e6700074-380b-441f-ae0d-f71dcd7f84c9"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"25a0a9d5-46d5-4da6-ad3f-1496ca20bb17"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"052dce21-dfb9-42d7-bbcf-46137b9933df"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"4fd968fa-3171-4e4f-838d-4a215a90da00"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"97f6eb6e-8c5d-49f4-beba-2ba7e1ff953f"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"ffc48115-8e62-43a8-b3f7-035390427d37"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"4bafefc9-4beb-49f6-8126-29e0e03a55d1"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"10367786-24fd-4f11-9465-bcd2c87b4027"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"82293ad3-a694-405c-ab03-01624f38b1ad"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"0c163cb8-be5f-4697-931f-61f5bf487bae"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"0f1e7611-4fd0-43b4-86dc-fce09965046e"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"f22ac0dc-974c-4de1-bcdf-1566ca0b2305"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"1907456b-2507-4ddd-8c1e-a86c990e3e72"}
    调用结果:{"param":"查询{bugstack虫洞栈}用户信息 请求成功,反馈结果请接受处理{公众号:bugstack虫洞栈 博客栈:https://bugstack.cn}。","requestId":"6a99b1f2-5859-4ed7-9d17-98229c13250f"}
    
    Process finished with exit code -1
    
    


    微信公众号:bugstack虫洞栈,欢迎关注&获取源码

    展开全文
  • 本节来介绍response.response是响应的意思.在JAVA web的主要作用就是把发送我们设置的信息给客户端。HttpServletResponseHttpServletResponse如何使用? response是一个对象,主要用于动态的给客户端反馈信息。 ...

    本节来介绍response.response是响应的意思.在JAVA web的主要作用就是把我们设置的信息发送给客户端。

    response是一个对象,主要用于动态的给客户端反馈信息。

    HttpServletResponse

    普通的Servlet中的response类型是ServletResponse,而HttpServlet中的是HttpServletResponse,它针对HTTP协议设计,功能更加强大.HttpServletResponse能设置header等HTTP协议的信息。而ServletResponse不行

    HttpServletResponse如何使用?

    response是用于动态给客户端反馈信息的类,所以我们就要知道怎么来用response给客户端反馈信息
    首先了解下Http响应的结构,Http响应由响应头,响应行,响应体组成.
    在谷歌浏览器response体现如下:
    在这里插入图片描述

    response设置响应行

    响应行主要是设置状态码。也就是400,401之类的。如果不设置。那系统会根据处理结果自己设置。比如请求成功就是200,服务器出错就是500,找不到路径就是404之类等等。

    使用setStatus(int) 来设置状态码

     @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //获取状态码404
            response.setStatus(404);
        }
    

    启动tomcat,并执行此servlet
    在这里插入图片描述
    就出现这样的页面(谷歌浏览器)

    response设置响应头

    response.setHeader(String,String);根据key设置value,
    这个方法很重要。什么头都可以用这个来设置值。

    @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置Content-Type = text/html;charset=UTF-8
        //根据key设置value
            response.setHeader("Content-Type","text/html;charset=UTF-8");
        }
    

    启动tomcat,并执行此servlet,然后在f12打开浏览器调试从network抓包
    在这里插入图片描述
    这样就设置成功了。
    还有一些其他响应头的设置方法
    response.setContentType(String);//设置content-type
    response.addHeader(String,String);//添加一个自定义的响应头

    response设置响应体

    响应体也就是能够渲染在页面上的信息。
    使用getWriter()方法获取PrintWriter对象.在使用PrintWriter的write()方法来输入响应体的内容.

     @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            PrintWriter writer = response.getWriter();
            writer.write("love you");
        }
    

    启动tomcat,执行该servlet
    输出如下
    在这里插入图片描述
    当然你还可以写html标签

    @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            PrintWriter writer = response.getWriter();
            writer.write("<div style='color:red'>love you</div>");
            writer.write("<div style='color:green'>hello world</div>");
        }
    

    执行结果:
    在这里插入图片描述

    总结:
    1,response是什么?
    一个封装着响应信息并能够动态发送给客户端的对象.
    2,response怎么用?
    (1)response设置响应行,使用setStatus()方法
    (2)response设置响应头,使用setHeader(),addHeader()等方法
    (3)response设置响应体,使用getWriter()获取PrintWriter对象在使用write()方法

    展开全文
  • 因此,本人在这里用一道综合性例题来说明,GUI和事件响应机制,在程序中的作用,及它们自身的使用方式。这也是一次对前文总结知识的综合应用。看例题: /**@author:LZ(埠箬) */ /*目标:构建一个小应用...


    ------- android培训java培训、期待与您交流! ----------



    事件监听机制

            事件监听机制的组成是由4部分组成,分别是:事件源、事件对象、监听器、外部动作。由监听器监听事件源情况,当发生对应外部动作时,事件源产生相应的事件对象反馈信息,并由监听器捕获产生需要的处理。

            每一个事件源都有自己特有的对应事件和共性事件。特性事件就是只能由本事件源触发的,共性事件则是所有或者多个事件可以触发的。当事件发生的时候,产生的事件对象会将发生事件的事件源和与事件相关的信息封装到一个对象当中发给监听器。对应事件的处理方式,都是封装到监听器中的。

            整个过程其实是固定的,而如何实现对事件的处理,才是编程中需要考虑的部分。注意分清事件源。且在添加事件处理前,需先importjava.awt.event.*。

            想要实现事件对象的处理,我们就必须知道事件源,同时还得知道事件对象所对应的监听器类型。通常的监听器一般都是以xxxListener或者xxxAdapter这种格式出现。对于xxxAdapter适配器形式的,一般都是该事件的事件源有超过3个的对象需要处理时,才会封装的。较xxxListener单纯的接口形式来说,xxxAdapter覆盖了他所实现的原接口类中的方法,并实现了它们的基本功能。这样做是为了在程序只需要部分重写处理方法的时候,不需要覆盖全部处理方法。可以将xxxAdapter看作是原有xxxListener的升级版,比如windowListener和windowAdapter。

            对于一些共性事件是需要我们熟记的,例如鼠标事件、键盘事件。


    鼠标事件MouseListene

            鼠标事件MouseListener,他所处理的是鼠标相关的操作:

            mouseClicked(MouseEvent e ):用于处理鼠标在组件上单击时的动作;

            mouseEntered(MouseEvent e ):用于执行鼠标进入对应组件所在区域时的操作;

            mouseEcited(MouseEvent e ):用于执行鼠标离开对应组件所在区域时的操作;

            mousePressed(MouseEvent e ):用于处理鼠标在组件上按下时的操作;

            mouseReleased(MouseEvent e ):用于处理鼠标在组件上释放时的操作;

            注意,单击是一个按下再释放的过程,即clidk是不同于press和realse的。当涉及到鼠标具体的操作类型时,我们通常查阅MouseEvent事件类来利用里面的方法实现,如:实现双击时所调用的getClickCount( )方法。由于鼠标事件处理方法超过三个,因此,它具有适配器MouseAdapter。

     

    键盘事件KeyListener

            键盘事件KeyListener,他所处理的是键盘上的相关操作:

            keyPressed( KeyEvent e):按下某个按键时,调用此方法处理;

            keyReleased( KeyEvente ):释放某个按键时,调用此方法处理;

            keyTyped( KeyEvent e ):键入某个按键时,调用此方法;

            同样的,type键入是某个按键按下和释放这两个过程的集合。因此,对应的type过程,可以拆分为press和release这两个过程来分别处理。对应的常用KeyEvent方法有getKeyChar( )、getKeyCode()、getKeyText( )、consume(),而对于一些键盘组合键如Crtl+F,我们就可以用

            e.isControlDown( )&& e.getKeyCode( ) ==KeyEvent.VR_F

            这种组合形式来判断组合按键。


    特性事件

            而对于一些特性事件,我们一般使用自定义类继承ActionListener,并覆盖其中的actionPerformed(ActionEvent e )方法来实现特有事件激活所对应操作。

     

    综合例题

            上面,我们了解了基本的事件响应机制的使用方法。由于GUI和事件响应机制是和IO操作等一系列基础操作紧密联系在一起的。而且,较之以往本部分内容是比较散,且关联逻辑性不太紧密,更偏向于应用方面。因此,本人在这里用一道综合性例题来说明,GUI和事件响应机制,在程序中的作用,及它们自身的使用方式。这也是一次对前文总结知识的综合应用。看例题:

    /**@author:LZ(埠箬)
    */
    /*目标:构建一个小应用程序,能够在PC上实现文本文件的简易编写操作
      分析需求:
                  1.读取文件,已存在文件,阅读、修改。
                  2.保存文件,已存在文件或未存在文件,未存在则新建文件。
                  3.用户需求一个建议的GUI,来满足简便操作。
      思路:
                  1.设计GUI
                  2.设计需要使用的工具方法
                  3.设计消息响应
                  4.设计读写流操作
      总结:
                  1.本程序其实可以分为多个类,来便于查询。当然,由于是小程
                   序,放一起也不影响
                  2.本例的主要目的是为了展示包括字符流,消息响应机制,GUI
                   简易设计在内的多章节综合应用,是对本总结前文的一次综合
                   应用
                  3.本程序并非非常完善,其中对于IO异常的处理,就直接抛给了
                   jvm,这是为了节省篇幅。实际编写中这样是不可行的,或者说
                   尽量避免这种情况发生。
     
    */
    import java.awt.*;
    importjava.awt.event.*;
    import java.io.*;
     
    class S2ADemo
    {
    /*程序声明*/
    /*==============================================================*/
           //程序主体框架声明
           private Frame f ;
           private Button b ;
           private TextField tf ;
           private TextArea ta ;
     
           //菜单声明
           private MenuBar mb ;
           private Menu m ;
           private MenuItem ms ;
           private MenuItem ml ;
           private MenuItem me ;
     
           //存储、读取对话框声明
           private FileDialog save ;
           private FileDialog load ;
     
           //退出程序对话框声明
           private Label exLab ;
           private Button exButY ;
           private Button exButN ;
           private Dialog exit;
     
           //文件记录器声明
           private File file = null;
     
    /*程序主体部分*/
    /*==============================================================*/
     
           public static void main(String[] args)
           {
           }
     
           //框架及程序初始化配置函数
           private static void init()
           {
                  //初始化程序主体
                  f = new Frame();
                  b = newButton("Confirm");
                  tf = new TextField("请在这里输入访问地址");
                  ta = new TextArea();
     
                  //初始化菜单
                  mb = new MenuBar();
                  m = new Menu("菜单");
                  ms = new MenuItem("保存");
                  ml = new MenuItem("读取");
                  me = new MenuItem("退出");
     
                  //初始化对话框
                  initSave();
                  initLoad();
                  initExit();
     
                  //初始化文件记录器
                  file = null;
     
                  //程序设定
                  f.setBounds(400,400,600,500);
                  f.setLayout(new BorderLayout());
                 
                  m.add(ms);
                  m.add(ml);
                  m.add(me);
                  mb.add(m);
                  f.setMenuBar(mb);
     
                  f.add(tf,BorderLayout.NORTH);
                  f.add(b,BorderLayout.NORTH);
                  f.add(ta,BorderLayout.CENTER);
     
                  myEvent();
     
                  f.setVisible(true);
                 
           }
     
    /*对话框*/
    /*==============================================================*/
     
           //保存文件对话框初始化方法
           private static void initSave()
           {           
                  save = new FileDialog(f,"保存文件",FileDialog.SAVE);
           }
     
           //读取文件对话框初始化方法
           private static void initLoad()
           {
                  load = new FileDialog(f,"读取文件",FileDialog.LOAD);
           }
     
           //退出判断对话框初始化方法
           private static void initExit()
           {
                  exLab = new Label("是否退出?");
                  exButY = newButton("Yes");
                  exButN = newButton("No");
                  exit = new Dialog(f,"退出窗口",Dialog.DEFAULT);
                 
                  exit.setBounds(600,600,400,300);
                  exit.setLayout(newBorderLayout());
                  exit.add(exLab,BorderLayout.CENTER);
                  exit.add(exButY,BorderLayout.SOUTH);
                  exit.add(exButN,BorderLayout.SOUTH);
     
           }
     
           //保存文件算法
           private static void mySave()
           {
                  save.setVisible(true);
     
                  if(!file.exists())
                  {
                         String dir =save.getDirectory();
                         String sf = save.getFile();
                         if(dir==null || lf==null)
                                return;
                         file = new File(dir,sf);
                  }
     
                  write();
     
           }
     
           //读取文件算法
           private static void myLoad()
           {
                  load.setVisible(true);
                 
                  String dir = load.getDirectory();
                  String lf = load.getFile();
                  if(dir==null || lf==null)
                         return;
                  file = new File(dir,lf);
                 
                  read();
     
           }
     
    /*事件处理*/
    /*==============================================================*/
     
           //本程序事件处理响应方法
           private static void myEvent()
           {
                  menuEvent();
           }
     
           //菜单事件响应处理
           private static void menuEvent()
           {
                  ms.addActionListener(newActionListener()
                  {
                         public voidactionPerformed(ActionEvent e)
                         {
                                mySave();
                         }
                  });
     
                  ml.addActionListener(newActionListener()
                  {
                         public voidactionPerformed(ActionEvent e)
                         {
                                myLoad();
                         }
                  });
     
                  me.addActionListener(newActionListener()
                  {
                         public voidactionPerformed(ActionEvent e)
                         {
                                myExit();
                         }
                  });
     
           }
     
           //退出对话框内部事件处理
           private static void myExit()
           {
                  exButY.addActionListener(new ActionListener()
                  {
                         public voidactionPerformed(ActionEvent e)
                         {
                                System.exit(0);
                         }
                  });
     
                  exButN.addActionListener(newActionListener()
                  {
                         public voidactionPerformed(ActionEvent e)
                         {
                                exit.setVisible(false);
                         }
                  });
     
                  exit.addWindowListener(newWindowAdapter()
                  {
                         public voidwindowClosing(WindowEvent e)
                         {
                                exit.setVisible(false);
                         }
                  });
     
           }
     
           //主体窗口事件响应处理
           private static void myWindow()
           {
                  f.addWindowListener(newWindowAdapter()
                  {
                         public void windowClosing(WindowEvente)
                         {
                                myExit();
                         }
                  });
     
           }
     
           //TextFeild文本框及配套按钮事件响应处理
           private static void myTextField()
           {
                  tf.addKeyListener(new KeyAdapter()
                  {
                         public voidkeyPressed(KeyEvent e)
                         {
                                if(e.getKeyCode() ==KeyEvent.VK_ENTER)
                                {
                                       getTF();
                                }
                         }
                  });
     
                  b.addActionListener(newActionListener()
                  {
                         public voidactionPerformed(ActionEvent e)
                         {
                                getTF();
                         }
                  });
     
                  b.addMouseListener(newMouseAdapter()
                  {
                         public voidmouseClicked(MouseEvent e)
                         {
                                getTF();
                         }
                  });
     
           }
     
    /*程序涉及工具方法*/
    /*==============================================================*/
     
           //文本框处理算法
           private static void getTF()
           {
                  String buf = tf.getText();
                  file = new File(buf);
                  if(!file.exists())
                  {
                         tf.setText("文件不存在!!请重输");
                         return;
                  }
     
                  read();
     
           }
     
           //文档读取
           private static void read()
           {
                  try
                  {
                         BufferedReader br = newBufferedReader(new Reader(file));
     
                         String content = null;
                         while((content=br.readLine())!=null)
                         {
                                ta.append(content+"\r\n");
                         }
                        
                  }
                  catch (IOException ee)
                  {
                         throwRuntimeException("new_Reader_ERROR");
                  }
                  finally
                  {
                         if(br!=null)
                         {
                                try
                                {
                                       br.close();
                                }
                                catch (IOExceptionee)
                                {
                                       throwRuntimeException("close_Reader_ERROR");
                                }
                         }
                  }
           }
           /*    当然,文档读取也可以用下面这种方法。为简略,省略了异常处理
                  正常使用时,必须添加异常处理部分
     
                  BufferedReader br = newBufferedReader(new Reader(file));
     
                  String content;
                  while((content=br.readLine())!=null)
                  {
                         //这里也可以使用TextArea的append方法
                         StringBuilder buf = newStringBuilder(); 
                         buf.append(content+"\r\n");
                  }
     
                  ta.setText(buf.toString());
                  br.close();
     
           */
     
     
           //文档存储
           private static void write()
           {
                  try
                  {
                         BufferedWriter bw = newBufferedWriter(new Writer(file));
                 
                         String content =ta.getText();
     
                         bw.write(content);
     
                  }
                  catch (IOException ee)
                  {
                         throwRuntimeException("new_Writer_ERROR");  
                  }
                  finally
                  {
                         if(bw!=null)
                         {
                                try
                                {
                                       bw.close();
                                }
                                catch (IOExceptionee)
                                {
                                       throwRuntimeException("close_Writer_ERROR");
                                }
                         }
                  }
           }
     
           //文件记录器,记录情况判断方法
           private boolean isFileExist()
           {
           }
     
    }


     

    ------- android培训java培训、期待与您交流! ----------




    展开全文
  • 专注于原创专题案例编写,目前已完成的专题有;Netty4.x实战专题案例、用Java实现JVM、基于JavaAgent的全链路监控、手写RPC框架、架构设计专题案例、源码分析等。你用剑 、我用刀 ,好的代码都很烧,望你不吝出招!...
  • 一.第一个Servlet的实现 1.方式一:新建Servlet 继承HttpServlet类 ①新建普通java类 ②继承HttpServlet类 ③重写service()方法 ④配置web.xml文件,设置servlet对外访问 路径 package com.shsxt.servlet...
  • servlet中级

    2019-05-06 21:19:11
    response对象封存了响应给浏览器的信息 request对象获取请求行的方法及其作用? getMethod()方法获取请求方式 getRequestURL()方法获取请求的url getRequestURI()方法获取请求的uri项目根目信息 getSchem...
  • 响应式架构简介

    2021-01-27 12:36:33
    在介绍响应式编程技术会使软件开发工作变得简单之前,让我们先了解一下开发企业级软件为何如此之难。当然,你可能在开发企业级软件时遇到过各种难题,如需要经常使用的数据库出问题、应用程序服务器拖慢了你开发的...
  • 课程地址 RxJava2从入门到精通-初级篇:...RxJava2从入门到精通-中级篇:https://edu.csdn.net/course/detail/10037 RxJava2从入门到精通-进阶篇:https://edu.csdn.net/course/detail/10038 RxJava2从入门到精通-源码...
  • 中级前端知识

    2020-12-07 19:36:36
    笔试源码问题 面试问答题 浏览器输入URL发生了什么 输入网址 —> DNS[域名]解析—>建立tcp连接[三次握手]—>...服务器响应请求—>浏览器展示HTML—>浏览器发送请求 沉淀问题 ...
  • 中级运维工程师的工作内容 中级运维工程师需要帮助客户完成系统级安全事件处理、漏洞扫描、紧急事件应急响应工作。以下是小编整理的中级运维工程师的工作内容。 中级运维工程师的工作内容1 职责: 1. 配合完成...
  • Hibernate中级联操作

    千次阅读 2018-09-25 21:40:35
    1.一对多 | 多对一 在表中的表达: 在实体中的表达 ...注意:在声明Set和多对一的对象的时候要记得写...级联是什么:级联是对一个对象进行操作的时候,与它相关联的对象也会一并进行响应的操作。 例如: 这...
  • 中级运维工程师的职责职能 中级运维... 3、帮助客户完成系统级安全事件处理、漏洞扫描、紧急事件应急响应工作; 4、利用检测工具帮助客户完成相关检查工作; 5、总结系统安全运维工作,形成运维报告; 6、配合...
  • C#中级教程-多态

    2020-03-17 15:09:44
    文章目录静态多态性函数重载...在静态多态性中,函数的响应是在编译时发生的。在动态多态性中,函数的响应是在运行时发生的。 在 C# 中,每个类型都是多态的,因为包括用户定义类型在内的所有类型都继承自 Object。 ...
  • 表格是的特点是带分割线,以列和行显示数据的控件,我们是否可以通过响应WM_PAINT消息来全部绘制?为什么说响应 WM_PAINT消息绘制表格不容易实现? 表格的表头能加上一个复选框的按钮吗? 这样可以实现全选的功能. ...
  • 中级Java面试题及答案汇总

    千次阅读 2020-03-06 19:52:32
    答:http协议是超文本传输协议,是客户端与...响应行+响应首部+响应体)。 二、Java字符串拼接有几种方式? 答:1.“+”方式,直接进行拼接; 2.String方法“concat”方式:理论上效率最高,但两个参数都必须是...
  • 自参加工作以来,遵守公司及所在项目部的各项规章制度,积极服从领导的工作安排,圆满完成工作任务,维护集体荣誉,思想上要求进步,积极响应公司的号召,以下是小编整理的关于建筑专业技术工作总结中级职称,欢迎...
  • MySQL中级:触发器

    2014-07-15 17:21:07
    触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句)DELETE(删)INSERT(增)UPDATE(改)其他MySQL语句不支持触发器。创建触发器在创建触发器时,需要给出4条...
  • C#异步中级

    千次阅读 2006-08-21 21:09:00
    众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应了。异步方法很好的解决...
  • 中级CTF:pyscript writeup

    2018-01-19 19:50:15
    提示信息:pyscript 1.先访问目标,发现是一个简单的界面 2.查看源代码发现了一些有用的提示...4.利用Burp suite 进行抓包,并且发送到repeater进行发送,查看响应信息 成功的完成第一步,获取了一串密文
  • 场景 在开发软件界面时,往往美工...按钮有最常见的响应按钮事件,有正常显示时的状态,鼠标移动上去时颜色会改变,鼠标点击时也有按下去的效果. 还有按钮上左边居中有特定的图标,或者按钮按下去之后保留按下去...

空空如也

空空如也

1 2 3 4 5 ... 14
收藏数 266
精华内容 106
关键字:

中级响应