• MVC架构知识点
    (1) 什么是MVC?       MVC是一种设计思想,根据职责不同将程序中的组件分成以下3个部分。       V(View视图):负责与用户交互。将数据展现,或者是接收数据       M(Model模型):负责业务处理。业务模型,数据模型       C(Controller控制器):负责协同模型和视图工作。视图有请求调用模型处理,模型处理完毕调用视图响应。(2)为什么使用MVC?      MVC是一个非常优秀的设计思想,基于该思想架构程序,可以提高程序的结构灵活性,便于日后维护、扩展和升级。注意:下面内容助于理解:1)  一个模型可以被多个视图共享模型只负责输出数据,不关心数据的表现形式,同一仹数据,可以使用多个不同的视图展现给用户。模型只负责处理数据,不关心是谁在调用,可以使用多种不同的界面来调用模型。2)  方便测试    模型一般使用java 类来开发,在开发完成之后,可以立即测试。如果业务逻辑直接写在servlet里面,则需要部署在服务器上面才能测试,比较麻烦。3)  组件复用    控制器可以做成一个通用的模块。4)  代码好维护,利于分工协作。    按照 mvc 的思想,可以对程序迚行分层,一般划分成表示层(包括 v,c)、业务层(m中的业务逻辑部分)、持久层(m中的数据访问逻辑部分)。下一层的代码发生改变,只要接口不变,不会影响到上一层的代码。mvc的缺点1)  采用 mvc 以后,会增加代码量,相应的开发周期以及开发的成本会相应增加。2)  使用 mvc,需要良好的设计。如果设计不当,会增加开发的难度。在表示层Servlet中调用业务层代码的接口,当业务层发生改变时不影响Servelt ;在业务层Service中调用DAO的接口,DAO发生改变不影响Service和其上层 结论一般来说,如果一个程序需要良好的架构,需要良好的代码的可维护性及可扩展性,需要使用mvc思想来架构。反之,则不必使用。
  • [问题求助] Can't open lib 'PostgreSQL Unicode' : file not found
    .net windows 开发好了,都是通的,linux环境发布之后为什么连不上数据库了 ? 装上了linux的驱动 但还是一直找不到文件  是开发的链接字符串也要改嘛
  • [技术干货] MVC 架构笔记分享
    (1) 什么是MVC?       MVC是一种设计思想,根据职责不同将程序中的组件分成以下3个部分。       V(View视图):负责与用户交互。将数据展现,或者是接收数据       M(Model模型):负责业务处理。业务模型,数据模型       C(Controller控制器):负责协同模型和视图工作。视图有请求调用模型处理,模型处理完毕调用视图响应。(2)为什么使用MVC?      MVC是一个非常优秀的设计思想,基于该思想架构程序,可以提高程序的结构灵活性,便于日后维护、扩展和升级。注意:下面内容助于理解:1)  一个模型可以被多个视图共享模型只负责输出数据,不关心数据的表现形式,同一仹数据,可以使用多个不同的视图展现给用户。模型只负责处理数据,不关心是谁在调用,可以使用多种不同的界面来调用模型。2)  方便测试    模型一般使用java 类来开发,在开发完成之后,可以立即测试。如果业务逻辑直接写在servlet里面,则需要部署在服务器上面才能测试,比较麻烦。3)  组件复用    控制器可以做成一个通用的模块。4)  代码好维护,利于分工协作。    按照 mvc 的思想,可以对程序迚行分层,一般划分成表示层(包括 v,c)、业务层(m中的业务逻辑部分)、持久层(m中的数据访问逻辑部分)。下一层的代码发生改变,只要接口不变,不会影响到上一层的代码。mvc的缺点1)  采用 mvc 以后,会增加代码量,相应的开发周期以及开发的成本会相应增加。2)  使用 mvc,需要良好的设计。如果设计不当,会增加开发的难度。在表示层Servlet中调用业务层代码的接口,当业务层发生改变时不影响Servelt ;在业务层Service中调用DAO的接口,DAO发生改变不影响Service和其上层 结论一般来说,如果一个程序需要良好的架构,需要良好的代码的可维护性及可扩展性,需要使用mvc思想来架构。反之,则不必使用。
  • [技术干货] mvc框架DispatcherServlet 类
    package com.zhou.mvc;import javax.servlet.ServletConfig;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.InputStream;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class DispatcherServlet extends HttpServlet {    //初始化方法 利用反射机制事先把类以及方法进行预处理    @Override    public void init(ServletConfig config) throws ServletException {        //读取配置文件路径        String path = config.getInitParameter("contentConfigLocation");        //配置文件内容转换为输入流        InputStream is = DispatcherServlet.class.getClassLoader().getResourceAsStream(path);        //把配置文件的输入流传入此处理器 利用反射机制事先把配置文件中指定的类以及方法进行预处理        HandleMapping.load(is);    }    @Override    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //1.获取用户请求的uri        String uri = req.getRequestURI();        HandleMapping.MVCMapping mapping = HandleMapping.get(uri);        if(mapping==null){            resp.sendError(404,"自定义MVC:映射地址不存在"+uri);            return;        }        Object obj = mapping.getObj();        Method method = mapping.getMethod();        String result = null;        try {            //利用反射直接调用此方法并且获得此方法的返回值            result = (String) method.invoke(obj, req, resp);        } catch (IllegalAccessException e) {            e.printStackTrace();        } catch (InvocationTargetException e) {            e.printStackTrace();        }        switch (mapping.getType()){            case TEXT:                //如果是纯文本就利用打印流直接写回前端页面                resp.getWriter().write(result);                break;            case VIEW:                //如果是视图 就直接进行重定向                resp.sendRedirect(result);                break;        }    }}
  • [技术干货] 手撸一个mvc框架有多简单
    在web配置类中定义一个处理前端请求的servletweb.xml 配置<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"         version="4.0"><!--    定义一个集中处理前端请求的servlet-->    <servlet>        <servlet-name>DispatcherServlet</servlet-name>        <servlet-class>com.zhou.mvc.DispatcherServlet</servlet-class><!--        定义初始化参数 用于解析配置文件中的类信息-->        <init-param>            <param-name>contentConfigLocation</param-name>            <param-value>application.properties</param-value>        </init-param><!--        服务器一启动此类就加载-->        <load-on-startup>0</load-on-startup>    </servlet>    <servlet-mapping><!--        所有带有.do结尾的请求都被映射到此类中-->        <servlet-name>DispatcherServlet</servlet-name>        <url-pattern>*.do</url-pattern>    </servlet-mapping></web-app>
  • [技术干货] 详解Http请求中Content-Type讲解以及在Spring MVC中的应用
    详解Http请求中Content-Type讲解以及在Spring MVC中的应用引言: 在Http请求中,我们每天都在使用Content-type来指定不同格式的请求信息,但是却很少有人去全面了解content-type中允许的值有多少,这里将讲解Content-Type的可用值,以及在spring MVC中如何使用它们来映射请求信息。1.  Content-Type  MediaType,即是Internet Media Type,互联网媒体类型;也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求中的媒体类型信息。1234类型格式:type/subtype(;parameter)? type 主类型,任意的字符串,如text,如果是*号代表所有;  subtype 子类型,任意的字符串,如html,如果是*号代表所有;  parameter 可选,一些参数,如Accept请求头的q参数, Content-Type的 charset参数。   例如: Content-Type: text/html;charset:utf-8; 常见的媒体格式类型如下:    text/html : HTML格式    text/plain :纯文本格式         text/xml :  XML格式    image/gif :gif图片格式       image/jpeg :jpg图片格式    image/png:png图片格式   以application开头的媒体格式类型:   application/xhtml+xml :XHTML格式   application/xml     : XML数据格式   application/atom+xml  :Atom XML聚合格式      application/json    : JSON数据格式   application/pdf       :pdf格式    application/msword  : Word文档格式   application/octet-stream : 二进制流数据(如常见的文件下载)   application/x-www-form-urlencoded : <form encType=””>中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)   另外一种常见的媒体格式是上传文件之时使用的:    multipart/form-data : 需要在表单中进行文件上传时,就需要使用该格式     以上就是我们在日常的开发中,经常会用到的若干content-type的内容格式。2.   Spring MVC中关于关于Content-Type类型信息的使用    首先我们来看看RequestMapping中的Class定义:123456789101112@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented@Mappingpublic @interface RequestMapping {    String[] value() default {};    RequestMethod[] method() default {};    String[] params() default {};    String[] headers() default {};    String[] consumes() default {};    String[] produces() default {}; } value:  指定请求的实际地址, 比如 /action/info之类。method:  指定请求的method类型, GET、POST、PUT、DELETE等consumes: 指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;produces:    指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回params: 指定request中必须包含某些参数值是,才让该方法处理headers: 指定request中必须包含某些指定的header值,才能让该方法处理请求其中,consumes, produces使用content-typ信息进行过滤信息;headers中可以使用content-type进行过滤和判断。3. 使用示例  3.1 headers1234@RequestMapping(value = "/test", method = RequestMethod.GET, headers="Referer=http://www.ifeng.com/")  public void testHeaders(@PathVariable String ownerId, @PathVariable String petId) {     // implementation omitted  }    这里的Headers里面可以匹配所有Header里面可以出现的信息,不局限在Referer信息。  示例212345678@RequestMapping(value = "/response/ContentType", headers = "Accept=application/json")  public void response2(HttpServletResponse response) throws IOException {    //表示响应的内容区数据的媒体类型为json格式,且编码为utf-8(客户端应该以utf-8解码)    response.setContentType("application/json;charset=utf-8");    //写出响应体内容    String jsonData = "{\"username\":\"zhang\", \"password\":\"123\"}";    response.getWriter().write(jsonData);  }  服务器根据请求头“Accept=application/json”生产json数据。当你有如下Accept头,将遵守如下规则进行应用:①Accept:text/html,application/xml,application/json      将按照如下顺序进行produces的匹配 ①text/html ②application/xml ③application/json②Accept:application/xml;q=0.5,application/json;q=0.9,text/html      将按照如下顺序进行produces的匹配 ①text/html ②application/json ③application/xml      参数为媒体类型的质量因子,越大则优先权越高(从0到1)③Accept:*/*,text/*,text/html      将按照如下顺序进行produces的匹配 ①text/html ②text/* ③*/*即匹配规则为:最明确的优先匹配。3.2 params的示例1234@RequestMapping(value = "/test/{userId}", method = RequestMethod.GET, params="myParam=myValue")  public void findUser(@PathVariable String userId) {     // implementation omitted  }    仅处理请求中包含了名为“myParam”,值为“myValue”的请求,起到了一个过滤的作用。3.3 consumes/produces1234567@Controller @RequestMapping(value = "/users", method = RequestMethod.POST, consumes="application/json", produces="application/json")  @ResponseBodypublic List<User> addUser(@RequestBody User userl) {      // implementation omitted    return List<User> users; }    方法仅处理request Content-Type为“application/json”类型的请求. produces标识==>处理request请求中Accept头中包含了"application/json"的请求,同时暗示了返回的内容类型为application/json;4. 总结  在本文中,首先介绍了Content-Type主要支持的格式内容,然后基于@RequestMapping标注的内容介绍了主要的使用方法,其中,headers, consumes,produces,都是使用Content-Type中使用的各种媒体格式内容,可以基于这个格式内容来进行访问的控制和过滤。
  • [Java] spring mvc 和struts
    spring mvc 和 struts 的区别是什么?
  • [技术干货] 【转载】简单介绍 10 个常见的软件架构
    简评:简单科普一下常见的 10 个架构。有没有想过如何设计大型企业及系统?在开发之前,我们必须要选择一个合适的架构,以保证我们软件的功能和质量。今天就简单介绍一下常用的 10 个架构。什么是架构?一直以来,在软件行业,对于什么是架构,都有很多的争论,每个人都有自己的理解。甚至于很多架构师一说架构,就开始谈论什么应用架构、硬件架构、数据架构等等。我曾经也到处寻找过架构的定义,请教过很多人,结果发现,没有大家都认可的定义。套用一句关于 big data 流行的笑话,放在架构上也适用:Architecture is like **age sex,everybody talks about it,nobody really knows what is it。事实上,架构在软件发明时的 N 多年以前,就已经存在了,这个词最早是跟随着建筑出现的。在软件工程中,架构以理解为:根据要解决的问题,对目标系统的边界进行界定。并对目标系统按某个原则的进行切分。切分的原则,要便于不同的角色,对切分出来的部分,并行或串行开展工作,一般并行才能减少时间。并对这些切分出来的部分,设立沟通机制。根据 3,使得这些部分之间能够进行有机的联系,合并组装成为一个整体,完成目标系统的所有工作。(上面关于什么是架构摘自 InfoQ,资深架构师王概凯 Kevin 的专栏)这篇文章将简述常见的 10 种架构模式的概念、用法以及其优缺点。分层模式 (Layered pattern)客户端/服务器模式 (Client-server pattern)主/从模式 (Master-slave pattern)管道/过滤器模式 (Pipe-filter pattern)代理模式 (Broker pattern)对等模式 (Peer-to-peer pattern)事件总线模式 (Event-bus pattern)模型/视图/控制器 (MVC) 模式 (Model-view-controller pattern)黑板模式 (Blackboard pattern)解析器模式 (Interpreter pattern)1. 分层模式 (Layered pattern)分层模式用于对结构化设计的软件进行层次拆解,每个层次为独立的抽象,为其上层抽象提供服务。系统通常被拆分为以下四个层次:表示层(也称为 UI 层)应用层(也称为服务层)业务逻辑层(也称为领域层)数据访问层(也称为持久化层)使用场景通用桌面应用程序电子商务 Web 应用2. 客户端/服务器模式 (Client-server pattern)客户端/服务器模式由两个部分构成:一个服务器与多个客户端。服务器组件同时为多个客户端组件提供服务。客户端向服务器发启服务请求,服务器将相应服务信息回应给客户端。此外,服务器持续监听来自客户端的请求。使用场景电子邮件、文件共享及银行业务等在线应用3. 主/从模式 (Master-slave pattern)主/从模式由两个部分构成:主设备与从设备。主服务组件将作业分发给多个从设备组件,并根据这些从设备反馈的结果,计算生成最终结果。使用场景数据库复制,主数据库被认定为权威数据源,各从数据库与主数据保持同步在计算机系统中通过总线互连的各设备(包括主设备与从设备)4. 管道/过滤器模式 (Pipe-filter pattern)管道/过滤器模式用于构造用于生成及处理数据流的系统。每个处理过程都封装在过滤器(filter)组件之中,要处理的数据通过 管道(pips) 进行投递。管道同时用于作为 过滤器(filter) 间的缓冲及同步。使用场景编译器,一系列的过滤器用于词法分析、语法分析、语义分析及代码生成生物信息学的工作流5. 代理模式(Broker pattern)代理模式用于在结构化系统中对组件解耦。系统内各组件间采用远过程调用(remote service invocations)的方式交互。代理(Broker)组件充当组件间通讯的协调角色。提供服务的组件将其能力(服务以及特性)发布给代理,客户端均向代理请求服务,由代理将请求重定向到先前已发布过对应服务的组件进行处理。使用场景消息中间件软件:Apache ActiveMQ,Apache Kafka,RabbitMQ 与 JBoss 等等6. 对等模式 (Peer-to-peer pattern)对等模式中的组件称之为对等体(peer),对等体既作为向其他对等体请求服务的客户端,同时也做为响应其他对等体请求的服务端。对等体可以在运行过程中动态地改变其角色,即,既可以单独做为客户端或服务端运行,又可同时作为客户端与服务端运行。使用场景网络文件共享:Gnutella 与 G2)流媒体协议:P2PTV 与 PDTP.流媒体应用: Spotify.7. 事件总线模式(Event-bus pattern)事件总线模式应用于事件处理,主要由四个组件构成:事件源(event source),事件侦听者(event listener),通道(Channel)以及总线(event bus)。 事件源将消息发布到总线的特定通道,侦听者订阅相应的通道,事件源所发布的消息经通道通告给订阅通道的侦听者。使用场景Android 开发通告(Notification)服务8. 模型/视图/控制器 (MVC) 模式(Model-view-controller pattern)模型/视图/控制器模式(简称 MVC 模式)将交互式应用程序拆分为三个部分:模型(model) – 包含核心功能及数据视图(view) – 呈现信息给用户(通过有多个视图)控制器(controller) – 处理用户的输入操作MVC 模式通过将内部信息表示、用户信息呈现以及用户操作接收分开的方式解耦组件,实现高效代码重用。使用场景主流开发语言所构建的互联网网页应用架构Django 与 Rails 等网页应用开发框架9. 黑板模式(Blackboard pattern)黑板模式适用于 无预知确定解决策略 的问题,主要由三个组件构成:黑板(blackboard) – 用于存储解空间对象的结构化全局内存知识(knowledge)源 – 能自表意的专用模块控制(control)组件 – 选择、配置与执行的模块所有的组件均能访问黑板,组件可将新生成的数据对象写入黑板,也可以通过模式匹配从黑板中获取知识源所生成的特定数据。使用场景语音识别车辆识别和追踪蛋白质的结构鉴定声纳信号解析10. 解析器模式(Interpreter pattern)解析器模式用于设计语言的解析程序,主要用于指定评估程序代码行,即解析出特定语言的语句与表达式,其核心思想是为语言的每个符号定义相应的类。使用场景SQL 等数据库查询语言通讯协议描述语言上述架构模式的对比下表格总结了各架构模式的优缺点英文原文:10 Common Software Architectural Patterns in a nutshell中文:10 个常用的软件架构模式本文有增改
  • [技术干货] spring mvc用户使用CSE疑问总结帖
    1、filter的实现和spring mvc的filter实现完全不同:cse的fileter和controller使用的是不同线程,导致线程传递的变量失效;fspring mvc的filter执行顺序是U型,而cse的filter是类似于栈,导致原有实现逻辑错误          ----------是的,需要客户理解其中原理。参考文章: https://bbs.huaweicloud.com/blogs/eca98a6f399a11e9bd5a7ca23e93a891  https://bbs.huaweicloud.com/blogs/b5dfdf9d51bf11e9bd5a7ca23e93a8912、用于API异常捕获的@ControllerAdvice失效,需要重新按照cse规则做一个捕获处理         ----------是的,这个是spring mvc的功能。参考文章看看差异: https://docs.servicecomb.io/java-chassis/zh_CN/build-provider/springmvc.html3、默认的消息处理线程只有1个,经过压测才发现有性能问题(通过配置可以解决)         -------老版本问题升级 (参考说明:https://docs.servicecomb.io/java-chassis/zh_CN/transports/rest-over-vertx.html)4、默认只能返回http状态码为200,假如需要返回2XX或者4XX错误码,需要用cse规则实现       --------是的, 参考说明:https://docs.servicecomb.io/java-chassis/zh_CN/build-provider/interface-constraints.html5、不支持部署到tomcat,部署会报空指针,cse开发没有解决这个问题       ------这个需要具体定位。 大量CSE的用户用的tomcat,这块功能支持方面应该是没问题的。 参考https://docs.servicecomb.io/java-chassis/zh_CN/transports/rest-over-servlet.html