范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

SpringMVC概述和基础知识详解

  一. SpringMVC概述及原理1. SpringMVC是什么
  Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),[Struts 2](https://baike.baidu.com/item/Struts 2/2187934)(一般老项目使用)等。
  SpringMVC 已经成为目前最主流的 MVC 框架之一, 从 Spring3.0 的发布, 就已全面超越 Struts2,成为最优秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful 编程风格的请求。2. MVC和三层架构
  MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)。
  控制器(Controller):Servlet,控制器主要处理用户的请求
  视图(View):HTML, JSP, 前端框架
  模型(Model):逻辑业务程序(后台的功能程序), Service, Dao, JavaBeanJavaWEB发展史Model1
  所有的业务逻辑交给jsp单独处理完成,一个web项目只存在DB层和JSP层,所有的东西都耦合在一起,对后期的维护和扩展极为不利。
  Model2 第一代
  JSP Model2有所改进,把业务逻辑的内容放到了JavaBean中,而JSP页面负责显示以及请求调度的工作。虽然第二代比第一代好了些,但JSP还是把view和controller的业务耦合在一起。依然很不理想。
  Model2 第二代(三层架构)
  Model2第二代就是现在大力推广的和使用的mvc,将一个项目划分为三个模块,各司其事互不干扰,既解决了jsp所形成的耦合性,又增加了逻辑性、业务性以及复用性和维护性
  表示层(web层):包含JSP,Servlet等web相关的内容
  业务逻辑层(Service):处理业务,不允许出现servlet中的request、response。
  数据层(Data Access Object):也叫持久层,封装了对数据库的访问细节。
  其中 web层相当于mvc中的view+controller,Service层和dao层相当于mvc中的model。
  3. SpringMVC 在三层架构的位置
  MVC模式:(Model-View-Controller):为了解决页面代码和后台代码的分离.
  二. 入门示例1. 配置流程-基于XML的配置1.1.搭建普通Maven项目
  使用插件将项目转换为web项目
  转换成功:
  查看是否生成webapp目录和maven项目打包方式是否变为war
  添加SpringMVC依赖     org.springframework     spring-webmvc     5.0.6.RELEASE 查看关系依赖图
  1.2.在web.xml配置核心控制器<?xml version="1.0" encoding="UTF-8"?>   	 	 		dispatcher 		org.springframework.web.servlet.DispatcherServlet 	 			 		dispatcher 		*.form 	 1.3.创建一个Spring的配置文件<?xml version="1.0" encoding="UTF-8"?>                   mvc:annotation-driven 说明
  在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
  在springmvc早期版本中需要我们自己加载springmvc的三大组件(现在我们使用的版本5.0.6会自动加载这三大组件)
  **处理器映射器:RequestMappingHandlerMapping **
  处理器适配器:RequestMappingHandlerAdapter
  处理器解析器:ExceptionHandlerExceptionResolver
  在早期的版本中使用  自动加载这三大组件,但是高版本的不需要来加载
  同时它还提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB,读写JSON的支持(Jackson)。我们处理响应ajax请求时,就使用到了对json的支持(配置之后,在加入了jackson的core和mapper包之后,不写配置文件也能自动转换成json)springmvc配置文件说明
  注意:默认的Spring配置文件放在WEB-INF下,名为{servlet-name}-servlet.xml
  {servlet-name}指的是,核心控制器配置的名字
  如:dispatcherServlet-servlet.xml
  当请求被springmvc处理时,springmvc会去默认路径下加载xxxx-servlet.xml核心配置文件
  但是我们在开发中一般都是把配置文件写在classes下的,我们可以在web.xml中设置springmvc配置文件的路径  	dispatcher 	org.springframework.web.servlet.DispatcherServlet 	 	 		contextConfigLocation 		classpath:dispatcher-servlet.xml 	  		 	dispatcher 	*.form 1.4.创建一个业务控制器package com.dfbz.controller;  import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView;  @Controller public class HelloController{      //代表此方法的访问路径为/hello.form     @RequestMapping("/hello.form")     public ModelAndView hello(){                  ModelAndView mav=new ModelAndView();         mav.addObject("msg","小标");         mav.setViewName("/hello.jsp");          return mav;     }  }1.5.创建一个返回的视图页面<%@ page contentType="text/html;charset=UTF-8" language="java" %>      Title      ${msg },欢迎您!  1.7. SpringMVC的工作流程
  1、客户端发送请求给前端控制器(DispatcherServlet)
  2、dispatcherServlet接收到请求调用HandlerMapping处理器映射器
  3、处理器映射器根据请求的url找对应的处理器,生成处理器对象(handler)返回
  4、dispatchServlet将handler传入处理器适配器执行
  5、处理器适配器执行handler
  6、执行完成最终封装一个ModelAndView
  7、将ModelAndView返回给前端控制器
  8、前端控制器将请求的路径交给视图解析器进行解析
  9、最终封装一个View对象给dispatcherServlet,此View对象封装了响应参数
  10、JSP页面渲染数据
  11、响应客户端1.8 SpringMVC源码分析
  我们知道SpringMVC实质上是对servlet进行封装,让我们的开发更加简便1. 准备工作
  我们知道springmvc在工作开始之前会加载默认的处理器映射器、处理器适配器、处理器解析器等
  可以在spring-webmvc-5.0.6.RELEASE.jar源码包下查看DispatcherServlet.properties文件看有哪些处理器是springmvc默认加载的
  2. 查看DispatcherServlet的继承体系:
  我们发现DispatcherServlet最终还是继承与HttpServlet,那么我们就直接找service方法吧!
  经打断点发现,最终会走向DispacherServlet的doDispacher方法!
  此时请求进入DispatcherServlet,按照我们画图分析的结果应该是把请求交给处理器映射器HandlerMapping最终返回一个Handler3. 查看HandlerMapping接口:
  4. 寻找HandlerMapping实现类:
  接下来进入处理器适配器HandlerAdapter执行handler最终返回一个ModelAndView5. 查看HandlerAdapter接口:
  6. 查看HandlerAdapter实现类:
  然后请求交给视图解析器进行解析最终返回一个View对象7. 查看View接口:
  8. 查看View实现类:
  9. 查看View信息:
  1.9.核心控制器
  SpringMVC自带了拦截器请求的核心控制器.所以就可以在请求过来的时候,直接启动Spring框架
  默认情况下,Spring容器是在核心控制器DispatcherServlet获得请求后才启动的.
  能不能网站启动的时候,Spring容器就立刻启动.     dispatcher     org.springframework.web.servlet.DispatcherServlet     1  三. Controller方法返回值返回值返回String
  可以返回视图字符串,解析器会自动解析@RequestMapping("/demo3_1") public String demo3_1(){      return "/success.jsp";           //直接返回字符串 }返回ModelAndView
  ModelAndView是SpringMVC帮我们提供的,即"模型和视图"@RequestMapping("/demo3_2") public ModelAndView demo3_2(){          //返回ModelAndView     ModelAndView mav=new ModelAndView();     mav.setViewName("success.jsp");     mav.addObject("username","东方标准");     return mav; }返回void
  一般用于使用原生的Servlet对象或者ajax请求@RequestMapping("/demo3_3")		//返回void(一般用于ajax) public void demo3_2(HttpServletResponse response) throws IOException {                response.setContentType("text/html;charset=utf8");     response.getWriter().write("东方标准");  }转发和重定向
  SpringMVC提供了一个 String 类型返回值之后会自动解析forward、redirect等特殊字符串
  视图解析器配置的前缀和后缀解析不支持forward、redirect
  :forward:代表转发request.getRequestDispatcher(url).forward(request,response)
  :redirect:代表重定向response.sendRedirect(url)@RequestMapping("/demo3_4") public String demo3_4(Model model)  {          //转发      System.out.println("执行啦!");     model.addAttribute("username","东方标准");     return "forward:/success.jsp"; }@RequestMapping("/demo3_5") public String demo3_5(HttpSession session)  {          //重定向     session.setAttribute("password","admin");     System.out.println("执行啦!");      return "redirect:/success.jsp"; }四. 映射路径-@RequestMapping1. 探究RequestMapping
  注解式处理器映射器,对类中标记了@ResquestMapping的方法进行映射。根据@ResquestMapping定义的url匹配@ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器。HandlerMethod对象中封装url对应的方法Method。@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping { }命名空间
  按照我们传统的url写法不能很好的规定请求路径,即不能按照业务来区分请求
  例如现在user需要定义一个findById,goods也需要定义一个findById,此时就会有冲突,针对这种现象我们可以在类上定义一个命名空间,即在类上使用@RequestMapping注解,类似于一级目录,以后访问此类下的任意资源都需要加上此目录类上
  请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。 写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理:
  例如:
  user模块:
  /user/register
  /user/update
  /user/findById
  goods模块:
  /goods/add
  /goods/update
  /goods/findById
  映射路径的有三种:标准的映射路径,带通配符的映射路径,带路径变量的映射路径方法上
  请求 URL 的第二级访问目录。属性:value:用于指定请求的 URL。 它和 path 属性的作用是一样的。method:用于指定请求的方式。params:用于指定限制请求参数的条件。 它支持简单的表达式。 要求请求参数的 key 和 value 必须和配置的一模一样。
  params = {"userId"},表示请求参数必须有 userId,区分大小写
  params = {"userId!=20"},表示请求参数中 id不能是 20。可以不携带userId参数,区分大小写
  headers:用于指定限制请求消息头的条件。package com.dfbz.controller;  import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView;  @Controller public class HelloController{      public HelloController(){         System.out.println("Hello创建了");     }     /*     	代表此方法的访问路径为/hello.form,如果携带userId参数那么参数必须不能等于1     	并且提交方式一定要为POST     */     @RequestMapping(value = "/hello.form",params = "userId!=1",method = RequestMethod.POST)     public ModelAndView hello(){          ModelAndView mav=new ModelAndView();         mav.addObject("msg","小标");         mav.setViewName("/hello.jsp");          return mav;     }  }
  小结:1.参数必须包括:params={"username","password"}
  2.参数不能包括:params={"!userid"}
  3参数值必须是指定的值:params={"username=zhangsan"})
  4.参数值必须不是指定的值:params={"userid!=123"})2.3. RESTFUL
  所谓的路径变量,就是将参数放在路径里面,而不是放在?的后面
  如:原get请求方法 /login.mvc?username=’zhangsan’&pwd=’123456’
  路径变量写法:
  /zhangsan/123456/login.form2.3.1 什么是RESTFUL
  REST(英文:Representational State Transfer,简称REST)RESTful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。2.3.2 RESTFUL示例:
  请求方式有几种?7种
  jsp、html,只支持get、post。基于restful风格的url:添加
  http://localhost:8080/SpringMVC_01/user
  提交方式: post修改
  http://localhost:8080/SpringMVC_01/user
  提交方式:put删除
  http://localhost:8080/SpringMVC_01/user/101
  提交方式:delete查询
  http://localhost:8080/SpringMVC_01/user/102
  提交方式:get五. 数据绑定1. 数据绑定是什么
  SpringMVC里面,所谓的数据绑定就是将请求带过来的表单数据绑定到执行方法的参数变量中,或将服务器数据绑定到内置对象,传递到页面2. 自动绑定的数据类型2.1 自动绑定数据类型基本数据类型:基本数据类型+String+包装类包装数据类型(POJO):包装实体类数组和集合类型:List、Map、Set、数组等数据类型2.2 内置绑定数据自动绑定:ServletAPI:
  HttpServletRequest
  HttpServletResponse
  HttpSessionSpringMVC内置对象
  Model
  ModelMap
  ModelAndView
  Model和ModelMap默认都是存储了Request请求作用域的数据的对象
  这个两个对象的作用是一样.就将数据返回到页面.测试页面:<%@ page contentType="text/html;charset=UTF-8" language="java" %>             Title   

测试ServletAPI绑定

测试参数类型绑定

属性参数绑定

测试对象参数绑定

测试数组类型绑定

测试Pojo对象数据绑定


测试Controller:package com.dfbz.controller; import com.dfbz.entity.Pojo; import com.dfbz.entity.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.util.Arrays; import java.util.List; @Controller public class DemoController { @RequestMapping("/demo1") //自定义属性绑定 public String demo1(HttpServletRequest request, HttpServletResponse response, HttpSession session){ request.setAttribute("username","zhangsan"); return "/success.jsp"; } @RequestMapping("/demo2") //属性参数绑定 public String demo2(String username){ System.out.println(username); return "/success.jsp"; } @RequestMapping("/demo3") //对象参数绑定 public String demo3(User user){ System.out.println(user); return "/success.jsp"; } @RequestMapping("/demo4") //数组参数绑定 public String demo4(String[] ids){ System.out.println(Arrays.toString(ids)); return "/success.jsp"; } @RequestMapping("/demo5") //Pojo对象参数绑定 public String demo5(Pojo pojo){ System.out.println(pojo); return "/success.jsp"; } }3. Post提交方式乱码解决   测试GET/POST提交中文数据页面:

测试Post乱码

controller:@RequestMapping("/demo7.form") //Pojo对象参数绑定 public String demo7(User user){ System.out.println(user); return "/success.jsp"; }   发现POST乱码   解决post提交乱码我们可以配置spring提供的过滤器 characterEncoding org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 characterEncoding /* 4. SpringMVC常用注解   SpringMVC有一些数据是不能自动绑定,需要我们使用它提供的注解强制绑定.   遇到需要强制绑定的几种情况   a. 默认参数绑定的是表单数据,如果数据不是来自表单(如restful),那么必须需要强制绑定   b. 数据是来自表单的,但是参数名不匹配,那么也需要强制绑定   c. 数据是来自表单的,但是需要将数据绑定在Map对象里面,需要强制绑定4.1. @PathVariable:绑定路径参数   这个注解是绑定路径参数的./** * http://localhost:8080/20/zhangsan/demo9.form * @param id * @param username * @return */ @RequestMapping("/{id}/{username}/demo9") //@PathVariable绑定restful请求 public String demo9( @PathVariable("id") Integer id,@PathVariable("username") String username ){ System.out.println(id); System.out.println(username); return "/success.jsp"; }测试restful风个绑定4.2. 通过@RequestParam绑定表单数据   接收的参数的变量名与表单的name属性不一样/** * http://localhost:8080/demo8.form?name=zhangsan * @param username * @return */ @RequestMapping("/demo8") //@RequestParam强制数据类型绑定 public String demo8(@RequestParam("name") String username) { System.out.println(username); return "/success.jsp"; }测试强制类型绑定4.3. @CookieValue获得Cookie值的注解/** * 获得JSP 页面,JSESSIOINID这个Cookie值 * @param cookevalue */ @RequestMapping("/demo10") public void getcookie(@CookieValue(value="JSESSIONID") String cookevalue){ //输出Cookie System.out.println(cookevalue); }测试@CookieValue注解4.4. @RequestHeader获得指定请求头的值@RequestMapping("/demo11") //获取请求头host的值封装到value中 public void demo10(@RequestHeader("host")String value){ System.out.println(value); }测试@RequestHeader注解4.5 @SessionAttributes 注解   把Model和ModelMap中的指定的key或者指定的属性的值也存入一份进session域package com.dfbz.controller; import com.dfbz.entity.User; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.SessionAttribute; import org.springframework.web.bind.annotation.SessionAttributes; import javax.servlet.http.HttpServletRequest; @Controller /** * names: 代表此类中model/modelMap的username属性将会添加到一份进入session * types: 此类中指定的类型会添加一份到session中 */ @SessionAttributes(names = {"username"},types ={User.class,String.class,Integer.class} ) public class Demo2Controller { @RequestMapping("/demo12.form") public String demo12(Model modelMap) { modelMap.addAttribute("username","zhangsan"); modelMap.addAttribute("password","admin"); modelMap.addAttribute("age",20); User user=new User(); user.setUsername("xiaodong"); modelMap.addAttribute("user",user); return "/success.jsp"; } }测试@SessionAttribute注解@SessionAttribute注解:   从session中获取一个值封装到参数中/** * @SessionAttribute:从session中获取一个值 * @param username * @param user * @return */ @RequestMapping(value = "/demo6") public String demo5(@SessionAttribute("password") String username,@SessionAttribute("user") User user){ System.out.println(username); return "/success.jsp"; }5. 格式化参数类型   SpringMVC之所以能够帮我们实现自动数据类型转换是因为SpringMVC提供了非常多的转换器(Converter)   例如:   发现他们都实现Converter接口,如果我们需要之定义转换器必须实现Converter接口案例:   实现日期的转换实体类:public class User { private Integer id; private String username; private String password; private String address; private Date birthday; }表单:<%@ page contentType="text/html;charset=UTF-8" language="java" %> Title controller:@RequestMapping("/testConverter.form") public String testConverter(User user) { System.out.println(user); return "/success.jsp"; }转换器类:package com.dfbz.converter; import org.springframework.core.convert.converter.Converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * Converter<传入进来的类型,转换之后的类型> */ public class MyConverter implements Converter { @Override public Date convert(String str) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); try { Date date = sdf.parse(str); return date; } catch (ParseException e) { e.printStackTrace(); } return null; } }dispatcher-servlet.xml配置 六. Controller的生命周期   Spring框架默认创建的对象是单例.所以业务控制器是一个单例对象.   SpringMVC提供了,request,session ,globalsession三个生命周期request:每次新的请求,创建一个新的实例.session:每次会话创建一个新的实例. 就是同一个浏览器,就使用同一个实例globalsession:基于集群的session   每个Session创建一个实例package com.dfbz.controller; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller //@Scope("request") //代表每次请求都会创建一个新的Demo4Controller对象 //@Scope("session") //代表每次创建session就会创建一个Demo4Controller对象 public class Demo4Controller { public Demo4Controller(){ System.out.println("Demo4Controller创建啦!"); } @RequestMapping("/demo4_1") public String demo4_1(){ return "/success.jsp"; } }   at.support.FormattingConversionServiceFactoryBean">   六. Controller的生命周期   Spring框架默认创建的对象是单例.所以业务控制器是一个单例对象.   SpringMVC提供了,request,session ,globalsession三个生命周期request:每次新的请求,创建一个新的实例.session:每次会话创建一个新的实例. 就是同一个浏览器,就使用同一个实例globalsession:基于集群的session   每个Session创建一个实例package com.dfbz.controller; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller //@Scope("request") //代表每次请求都会创建一个新的Demo4Controller对象 //@Scope("session") //代表每次创建session就会创建一个Demo4Controller对象 public class Demo4Controller { public Demo4Controller(){ System.out.println("Demo4Controller创建啦!"); } @RequestMapping("/demo4_1") public String demo4_1(){ return "/success.jsp"; } }

这肯定是我买过的最贵电子产品小鹏P7提车分享从2017年就开始想买一台纯电车,不过那个时候新势力刚刚进入大规模量产的阶段。续航里程产品逻辑都还不够成熟。我看过蔚来i3特斯拉,有特别喜欢的部分,也有难以接受的问题。当自己真的置2K高刷屏!小米平板5终于来了骁龙870处理器加持点击右上方关注,第一时间获取科技资讯技能攻略产品体验,私信我回复01,送你一份玩机技能大礼包。千呼万唤始出来,网友们期待已久的小米煲剧神器终于有消息了。自2018年小米推出小米平板苹果春季发布会在即,外媒曝出iPhoneX亮黑款苹果春季发布会在即,肯定有很多小伙伴跃跃欲试准备入手新机了。iPhone受欢迎程度如此高除了流畅的系统之外,惊艳的颜值也是人们追捧它的原因之一。iPhone曾经使用过黑色深空灰太空从特斯拉风险看我国地理信息安全面临的风险挑战近日,网络上司马南特斯拉风险,智能战争不必用到核武和特斯拉有74类潜在风险,危及经济军事安全等帖子引发人们的热议,部分经济类媒体如汽车人等评论说是商业对手有组织的抹黑特斯拉,众说纷红米手机怕买贵又怕吃亏,看准别买错,目前最值得买的是这四款在前几年红米手机就非常受欢迎,当时的红米手机售价很便宜,因此入手的人多到数不过来,堪称是国民手机品牌。现在红米手机的价格虽然提高了不少,但它受欢迎的程度却丝毫没下降,入手的人甚至比价格跌破4000元女孩子最喜欢的三星小屏旗舰降价促销小屏手机是女孩子的最爱,但在手机大屏化的趋势下,寻找一款手感好的小屏手机有点困难。去年,苹果发布了一款使用5。4英寸屏幕的iPhone12mini,糟糕的续航能力让很多人崩溃。最近盘点各领域最佳手机,各有所长互不冲突,按需选择才适合自己其实大部分手机主打的功能和卖点都不同,虽然价格很接近,但彼此各有长处,比如以下几款手机,它们都在自己的领域做到了最佳,互不冲突,大家在购买时按需选择才是最好的。最强有线充电iQOO想入手一台全画幅相机佳能5d4佳能EOSR索尼A7m3松下S1,有什么建议?在这几款相机里面佳能5D4是单反相机,具有光学取景器。单反相机与其他的微单相机是结构性的差异,它具有运动追焦出色,抓拍效果好取景不费电的优势,也存在笨重不支持佳能RF系列新镜头视频领先火灾预警技术看辰安天泽消防智能化应用新突破欢迎关注消防大业微信公众号xfdy119。现今,消防领域的科技化创新化发展逐渐成为主流理念和趋势,利用信息化手段,实现安全风险分类分析自动预警是消防智能化应用的必经之路。辰安天泽注福建省在高档数控机床与机器人研究领域实现关键技术突破福建日报讯(记者李珂)记者从省科技厅获悉,我省科技重大专项高档数控机床与机器人日前顺利结题。该专项瞄准全向搬运机器人系统和机器人数控加工中心用高性能伺服电机及控制器这两个领域进行研台积电很紧张三星全球首秀3nm芯片,明年正式商用在目前半导体芯片行业里,台积电是毋庸质疑的老大,但是三星在技术能力上也很强。两家厂商现在都已经攻克了3nm的芯片工艺,台积电会在今年风险试产,大概率明年会大面积商用3nm工艺,苹果
我的礼物FREETIE潮流百搭休闲老爹鞋前言从教26年的老妈我习惯叫她老法师,但是老妈一直认为她还和我是没有代沟的。这不,正值我生日,老妈不仅给了我红包,还亲自为我挑选了FREETIE潮流百搭休闲老爹鞋,并美其名曰是复古穿着FREETIE云弹减震运动鞋开启双节云游生活前言穿惯了运动鞋,所以总是喜欢关注运动鞋。家里的鞋子款式样式无数,可是每每看到漂亮舒适的鞋子总是会毫不手软的下手一双。最近的爱物是FREETIE云弹减震运动鞋。这种鞋子脚感比其他鞋Orico分线器开箱上手体验前些天入手了两个Orico的分线器,分别是4口和7口,之前都是使用拓展坞的习惯,固定使用便携性还好,但是出门在外又不需要像拓展坞那么丰富的功能的时候,一个支持USB3。0还可以tySONYA7M3R3的斯莫格兔笼选择指南前言作为一名海外记者兼影视从业者,我在工作和生活中和相机有着深厚的交情,基本处于每天都要抚摸它的状态。出门大包小包,别人都是带着旅行用品,而我却带着成箱的摄影器材。谈到器材,咱们今咖啡杯里有故事花絮许多人不喜欢喝咖啡,却喜欢咖啡馆的闲适,点一杯咖啡,或许十分钟喝完,或许喝上一个下午,安静温馨,静静的看着窗外,细细回味着曾经,时间仿佛静止了一样。每一个喝咖啡的人,或多或少总穿上抗菌防泼水袜套健步鞋锻炼去前言专业医生会告诉我们每天坚持锻炼可以改善心脏和肺脏的功能,可以改善血脂的代谢可以减轻体重,降低体重的脂肪比例,让肌肉更加发达,而且能够增加基础代谢率最后还有可能改善骨骼的力量,让中秋佳节,我陪爷爷饮小酒前言每逢佳节倍思亲,我觉得心能在一起就是团圆,打小家里就有着团圆之夜饮酒聊天的习惯,今年我为迎接这次双节同日,我入手了两套热门的白酒进行横评体验让家里人一同来品尝感受下这几种的不同巧遇双节同日,好友有口福喝到我自制的咖啡啦前言中秋国庆双节重合,2020年是一个有灾难,但又幸福满满的年份。我们遭遇了新冠病毒的威胁,我们被禁足不能朋友相聚,可是我们更欣慰的是国之强大,很快中国人征服了新冠病毒。在这个双庆出行小帮手小米小背包前言看着周围的人接连打出三个喷嚏的滑稽模样,我意识到已经入秋很久了,外出拍摄除了携带众多设备之外,我还需要带上几件保暖的衣物和烫嘴的热水,以防我趴在拍摄车上被风吹得一把鼻涕一把泪。甲方克星!斯莫格A7R3相机兔笼体验前言作为一位长期在海外拍摄各类题材的影视工作者,对接过有各类需求且形形色色的甲方,他们有时候会在工作后期提出一些问题以及建议,他们还可能会在前期拍摄的现场产生一些疑问,尤其是使用索这一次耳朵真的不疼了南卡Runner骨传导蓝牙耳机体验前言用惯了各种插入耳朵的耳机,这一次见到了不用入耳的骨传导耳机,我还是感到很新奇,我好奇它如何不入耳,就能有好的音质好奇它如何做到保护耳朵初印象正面是NINEKA的logo和这次的