首页 文章 精选 留言 我的

精选列表

搜索[基础搭建],共10000篇文章
优秀的个人博客,低调大师

Spring 框架基础(06):Mvc架构模式简介,执行流程详解

本文源码:GitHub·点这里 || GitEE·点这里 一、SpringMvc框架简介 1、Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑,MVC分层有助于管理和架构复杂的应用程序 M:代表模型Model 模型就是数据,应用程序的核心。 V:代表视图View 回显数据的界面,例如JSP就是用来展示模型中的数据。 C:代表控制器Controller 控制器的作用就是根据入参,把不同的响应数据(Model),显示在不同的视图(View)上。 2、SpringMvc简介 框架描述 SpringMVC是一种基于Java实现的MVC设计模式的请求驱动类型的轻量级Web框架,出自Spring框架全家桶,与Spring框架无缝整合,使用了MVC架构模式的思想,将Web层进行职责解耦。 框架优点 结构松散,几乎可以在SpringMVC中使用各类视图,各个模块分离而且耦合度非常低,且易于扩展。与Spring无缝集成,且简单,灵活,容易上手。 二、SpringMvc执行流程 1、流程图解 2、步骤描述 (1)、发起请求到前端控制器DispatcherServlet; (2)、前端控制器请求HandlerMapping查找,Handler可以根据xml配置、注解进行查找; (3)、处理器映射器HandlerMapping向前端控制器返回Handler; (4)、前端控制器调用处理器适配器去执行Handler; (5)、处理器适配器去执行Handler ; (6)、Handler执行完成给适配器返回ModelAndView ; (7)、处理器适配器向前端控制器返回ModelAndView,ModelAndView是springmvc框架的一个底层对象,包括Model和view ; (8)、前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图 ; (9)、视图解析器向前端控制器返回View ; (10)、前端控制器进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域中; (11)、前端控制器向用户响应结果 ; 3、核心组件 前端控制器 DispatcherServlet:请求离开浏览器后,最先到达的就是DispatcherServlet,是整个流程控制的中心,作用接收请求,响应结果,相当于转发器,中央处理器。减少各个组件之间的耦合度。 处理器映射器 HandlerMapping:根据请求的url路由到指定接口,用户请求找到Handler处理器,springmvc提供不同类型映射器,例如:Xml配置方式,注解方式等。 处理器适配器 HandlerAdapter:按照特定规则去执行Handler,SpringMvc支持多种处理器,各种处理器中的处理方法各不相同,为了解决适应多种处理器,就出现了处理器适配器。 处理器 Handler:处理用户请求,涉及具体业务逻辑,需要程序员根据业务需求开发。编写Handler时按照HandlerAdapter的规则开发,这样适配器才可以正确执行Handler。 视图解析器 ViewResolver:负责将请求的响应结果生成View,根据逻辑视图名解析成物理视图名,就是具体页面地址,生成View视图对象,对View进行渲染,通过页面展示给用户。 视图 View:SpringMvc框架提供很多的View视图类型的支持,包括:jsp、freemarker、pdf等。通过页面标签或页面模版解析模型数据回显到页面,需要根据业务开发具体页面。 三、整合Spring框架配置 1、spring-mvc配置 <!-- 扫描文件 --> <context:component-scan base-package="com.spring.mvc.controller" /> <!-- MVC默认的注解映射的方式 --> <mvc:annotation-driven /> <mvc:default-servlet-handler/> <!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/page/" /> <property name="suffix" value=".jsp" /> </bean> 2、Web.xml配置 <servlet> <servlet-name>spring-mvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring-mvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> 3、测试接口 @Controller public class HelloController { @RequestMapping("/getInfo") public @ResponseBody String getInfo (String name){ return name ; } } 4、常用注解说明 @Controller 标记一个类是Handler,也就是开发的Controller,然后使用@RequestMapping或其他相关注解(@GetMapping、@PostMapping、@PutMapping、@DeleteMapping),用来关联请求和Controller方法之间的映射关系,这样的Controller 就可以被请求访问。 @RequestMapping 处理请求地址映射的注解,可作用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以类上标注地址作为父路径。 @requestParam 主要用于在SpringMvc框架的控制层获取参数,三个常用参数:defaultValue表示设置默认值,required 通过boolean设置是否是必须要传入的参数,value值表示传入的参数名称。 @RequestBody 接收请求体中传递给后端的Json字符串数据的,GET方式无请求体,所以使用@RequestBody接收数据时,不能使用GET方式提交数据,需要用POST方式进行提交。 @ResponseBody 该注解用于方法的返回对象,可以通过配置转换器为指定数据响应格式,如果希望返回的数据不是View试图页面,而是指定数据格式的时候使用,例如:Json、Xml等。 @Autowired 按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。 @Resource 按照ByName自动注入,需要导入包javax.annotation.Resource。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。 @PathVariable 用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。 四、常见参数映射 1、普通映射 @RequestMapping("/getSum") public Integer getSum (int a,int b){ return a+b ; } 测试: http://localhost:6003/getSum?a=1&b=2 传参名称和方法参数保持一致。 2、指定参数名 @RequestMapping("/getInfo") public String getInfo (@RequestParam("name") String var1, @RequestParam("say") String var2){ return var1+":"+var2 ; } 测试: http://localhost:6003/getInfo?name=cica&say=hello 传参名和 @RequestParam 指定的参数名要对应。 3、数组参数 @GetMapping("/getArray") public String getArray (String[] ids){ return ids[0]+"-"+ids[1] ; } 测试: http://localhost:6003/getArray?ids=2&ids=3 传递并解析数组类型的参数格式。 4、Map参数 @RequestMapping("/getMap") public String getMap (@RequestParam Map<String,String> paramMap){ return paramMap.get("name") ; } 测试: http://localhost:6003/getCityEntity?province=浙江&name=杭州 这里以Post方式将相关参数传递CityEntity实体对象中。 5、包装参数 @PostMapping("/getCityEntity") public CityEntity getCityEntity (CityEntity cityEntity){ return cityEntity ; } 测试: http://localhost:6003/getCityEntity?province=浙江&name=杭州 这里以Post方式将相关参数传递CityEntity实体对象中。 6、Rest风格参数 @GetMapping("/getId/{id}") public String getId (@PathVariable("id") Integer id){ return "id="+id ; } 测试: http://localhost:6003/getId/1 RestFul 风格参数映射。 五、源代码地址 GitHub·地址 https://github.com/cicadasmile/spring-mvc-parent GitEE·地址 https://gitee.com/cicadasmile/spring-mvc-parent

优秀的个人博客,低调大师

Java编程基础阶段笔记 day06 二维数组

​ 二维数组 笔记Notes 二维数组 二维数组声明 二维数组静态初始化与二位初始化 二维数组元素赋值与获取 二维数组遍历 二维数组内存解析 打印杨辉三角 Arrays工具类 数组中常见的异常 二维数组 二维数组的元素是一维数组 二维数组的声明和初始化 String [][] persons; String persons2[][]; String [] persons3[]; 二维数组的初始化 //静态初始化 persons = new String[][]{{"小龙哥","110"},{"小仓","119"},{"小强","120"}}; //声明和初始化不能分开 int[][] numbers = {{1,2},{3,4},{5,6}}; //动态初始化 persons2 = new String3; //3值得是二维数组长度,2指的是二维数组元素(一维数组)的长度 //创建一个长度为3的二维数组,二维数组的元素为null persons3 = new String[3][]; persons3[0] = new String[2]; persons3[1] = new String[3]; 获取二维数组的值,元素的值 String aString = persons3[2][2]; int a = persons3.length; int b = persons3[0].length; 遍历二维数组的元素 //遍历二维数组 for (int i = 0; i < numbers.length; i++) { for (int j = 0; j < numbers[i].length; j++) { System.out.print(numbers[i][j] + " "); } System.out.println(); } 二维数组内存解析 打印杨辉三角 使用二维数组打印一个 10 行杨辉三角。 【提示】 第一行有 1 个元素, 第 n 行有 n 个元素 每一行的第一个元素和最后一个元素都是 1 从第三行开始, 对于非第一个元素和最后一个元素的元素。即: yanghuii = yanghuii-1 + yanghuii-1; public class YangHui { public static void main(String[] args) { //创建二维数组 int[][] numbers = new int[10][]; //给二维数组的元素赋值 for (int i = 0; i < numbers.length; i++) { //创建二维数组的元素(一维数组) numbers[i] = new int[i + 1]; //给二维数组中的元素的第一个元素和最后一个元素赋值 numbers[i][0] = numbers[i][i] = 1; //遍历二维数组中的元素(一维数组),不包括第一个和最后一个 for (int j = 1; j < numbers[i].length - 1; j++) { numbers[i][j] = numbers[i - 1][j] + numbers[i - 1][j - 1]; } } //遍历二维数组 for (int i = 0; i < numbers.length; i++) { for (int j = 0; j < numbers[i].length; j++) { System.out.print(numbers[i][j] + " "); } System.out.println(); } } } Arrays工具类使用 int[] ns = {5,2,30,4,1,90}; int[] ns2 = {5,2,3,4,1}; //比较两个数组是否相等 : 比较的是内容,个数,顺序 boolean equals = Arrays.equals(ns, ns2); System.out.println(equals); //输出数组信息 String nsStr = Arrays.toString(ns); System.out.println(nsStr); //将指定的数值填充到数组中 Arrays.fill(ns, 100); System.out.println(Arrays.toString(ns)); //对数组中的内容进行排序 Arrays.sort(ns); System.out.println(Arrays.toString(ns)); //二分法查找 - 使用前必须先排序 - 如果找不到会返回负数 int index = Arrays.binarySearch(ns, 4); System.out.println(index); 数组中常见的异常 //1.数组下角标越界 :ArrayIndexOutofBoundsException int[] numbers = new int[2]; //索引值合理范围 :0 ~ 长度-1 System.out.println(numbers[2]); //发生了异常 System.out.println(numbers[-1]); //发生了异常 //2.空指针异常 :: NullPointerException String str = "aaa"; str = null; System.out.println(str.toUpperCase());//发生了异常 String[] names = new String[2]; System.out.println(names[0].toUpperCase());//发生了异常 String[][] persons = new String[3][]; System.out.println(persons[0][0]); //发生了异常 System.out.println(persons[0].length); //发生了异常 习题:数组声明 声明:int[] x,y[]; 在给x,y变量赋值以后,以下选项允许通过编译的是: a ) x[0] = y; //类型不符,x[0]为int类型,而y为引用类型 b) y[0] = x; //可以 c) y0 = x; //类型不否,x为引用类型,而y0为int类型 d) x0 = y; //x为一维数组 e) y0 = x[0]; //可以 f) x = y; //类型不符,一个是一维数组,一个是二维数组 提示: 一维数组:int[] x 或者int x[] 二维数组:int[][] y 或者 int[] y[] 或者 int y[][] 总结Summary 二维数组遍历二维数组内存解析杨辉三角Arrays工具类数组常见异常

优秀的个人博客,低调大师

Java编程基础阶段笔记 day03 Java基本语法(中)

​ day03 Java基本语法(中) 核心内容扩展赋值运算符 逻辑或| 与短路|| 逻辑与&与短路与&& 位运算符 交换变量的三种方法 if条件表达式注意点 三元运算符 扩展赋值运算符: +=, -=, *=, /=, %= short s = 3; s = s+2; ①//编译不通过 s += 2; ②//编译通过,且s=5 byte b = 10; b = b + 2; //编译不通过,因为byte做运算会先将自身提升为int b += 2; //编译没问题 :不会改变原来的数据类型。 int i = 1; i *= 0.1; System.out.println(i);//0 i++; System.out.println(i);//1 逻辑运算符 逻辑与(&)、短路与(&&) 逻辑或(|)、短路或(||) 逻辑非(!) 逻辑异或(^):两个相同则为false,不同为true 逻辑运算结果只能为 true 或 false 逻辑与 & 和 短路与 && 的区别是什么: 左边式子为 true 时,右边的式子会执行 左边的式子为false 时,&& 右边的式子不执行 逻辑或 | 与 短路或 || 的区别是什么: 左边的式子为false时,左右都执行 左边的式子为false时,|| 右边的式子不执行 位运算符 << (左移) :在一定范围内,每向左移一位那么原来的数乘以2 (右移) :在一定范围内,每向右移一位原来的数除以2 (右移) :如果是正数最高位用0补,如果是负数最高位用1补。 (无符号右移) :无论正数还是负数,最高位都是用0补 System.out.println(3 << 1);//6 System.out.println(3 << 2);//12 System.out.println(3 << 3);//24 System.out.println(1 << 31); System.out.println(6 >> 1); System.out.println(3 >> 1); System.out.println(-3 >> 1); System.out.println(6 >>> 1); System.out.println(-6 >>> 1); 交换两个变量中的数据的三种方法 int n = 5, m = 10; //方式一:必须会(优点:任何数据类型都可以交换。缺点:需要一个另时变量) /* int temp = m; m = n; n = temp; */ //方式二:(优点 :不需要再申请额外的变量 缺点:1.只能用于数值 2.有可能会超过表数范围) /* m = m + n; n = m - n; //(m + n) - n m = m - n; //(m + n) - n(m) */ //方式三:(优点 :1.不需要申请额外的变量 2.效率高 缺点:1.不容易理解 2.只能用于数值 ) m = m ^ n; n = m ^ n; //(m ^ n) ^ n m = m ^ n; //(m ^ n) ^ n(m) if条件表达式 如果多个条件表达式的范围是互斥关系,那么谁上谁下都可以。 如果多个条件表达式的范围是包含关系,那么范围小的在上面,范围大的在下面。 else可以省略。但是省略后可能会导致没有任意一个条件是满足的。 在if-else中如果执行语句只有一条,那么大括号可以省略 else //就近原则-离哪个if最近就和谁是一对 if(true) if(false) System.out.println("cccc"); else //就近原则-离哪个if最近就和谁是一对 System.out.println("ddddddd"); /* if(score == 100){ System.out.println("嘿嘿 哈哈 嘻嘻 宝马就停在门口"); }else if(score >= 60 && score <= 80){ System.out.println("知道,知道 ipad明天给你买"); }else if(score > 80 && score <= 99){ System.out.println("恩 还可以 iphone xs max 已经在路上了"); }else{ System.out.println("还想要东西,看我回去不打死你"); } */ //下面的方式必须考虑范围的大小。 if(score == 100){ System.out.println("嘿嘿 哈哈 嘻嘻 宝马就停在门口"); }else if(score > 80){ System.out.println("恩 还可以 iphone xs max 已经在路上了"); }else if(score >= 60){ System.out.println("知道,知道 ipad明天给你买"); }else{ System.out.println("还想要东西,看我回去不打死你"); } 三元运算符 格式:(条件表达式)?表达式1 :表达式2; 说明: ①条件表达式的结果只能为布尔类型 ②表达式1和表达式2的类型应该保持一致 如果表达式1和表达式2可以自动类型提升成一样的类型那么也可以。 例 :double max = (m > n)? 10.2 : 5; ③三元运算符可以被if-else所替换,反之不成立。两者都可以使用的情况下,我们优先选择三元运算符。因为三元运算符效率会快一些。 总结Summary 逻辑与 & 和 短路与 && 的区别逻辑或 | 和 短路或 || 的区别实现两个数交换的三种方法if 语句的注意点

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册