SpringMVC总结笔记
1、回顾MVC
1.1、MVC
- MVC概念:它是一种软件设计规范。可以将业务、逻辑等分离。最典型的就是以前学过的 JSP(Servlet) + Servlet + JavaBean 的模式。
- 模型(dao/service)
- 视图(jsp/html)
- 控制器(servlet):
- 转发和重定向。(转发地址不会变,重定向会)
- 我们一般在bean层里面,很多时候不仅仅只是建一些对应的表的实体类,还需要建立很多其他的“简化版”实体类,这里的也有细分规范。
- pojo:表对应的实体类。
- vo:视图层所需要的实体类。
- dto:数据传输时候的对象。
- ……
- Model1:在早期的web开发中,通常采用的就是Model,这样开发相当于jsp直接立刻提交到服务器后台,中间不用Servlet。发的发展历史如下:
- Model1:视图层+模型层。
- Model2:视图层+控制层+模型层。
- 常见的MVC框架:
- Struts
- SpringMVC
- ASP.NET MVC
- 前端的 Vue等,由MVC还演化成的还有MVVM等
- ……
2、初识SpringMVC
2.1、SpringMVC简介
简介:SpringMVC是Spring FrameWork的一部分,是基于Java实现的MVC轻量级Web框架。
SpringMVC特点:
轻量、简单易学。
搞笑,基于请求响应的MVC框架。
与Spring无缝结合。这样我们可以将SpringMVC所有要用到的类都注册到Spring中。非常方便。
约定大于配置。简单来说就是规范性很好。
功能强大:支持RESTful(地址栏不用问号传参)、数据验证、格式化、本地化等。
使用的人多。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3DZJohPw-1643095416682)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1641255045570.png)]
中心控制器:Spring的web框架是围绕DispatcherServlet设计,DispatcherServlet的作用是将请求分发到不同服务器。从Spring2.5开始,使用Java5或以上的版本可以基于注解开发。
原理:SpringMVC想很多其他的框架一样,以请求为驱动,围绕一个Servlet分派请求以及提供其他功能,DispatcherServlet实际是是一个Servlet(它继承于HttpServlet基类)。
当发起请求被前置拦截器拦截到请求,根据请求参数生成代理参数,找到请求对应的实际控制器,控制器处理请求,创建数据库、访问数据库,将响应模型给中心控制器,控制器使用模型与视图渲染视图结果将结果返回给中心控制,在将结果返回给请求者。
原理图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Dr5eoATj-1643095416684)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\1641255871965.png)]
基本的环境搭建好。
配置web.xml文件,注册DispatcherServlet。
<?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"><!--1、配置DispatcherServlet :这是SpringMVC的核心;叫请求分发器或者叫前端控制器 --><servlet><servlet-name>springmvc</servlet-name><!--这和原来的Servlet一样,只是 DispatcherServlet 类不是我们写的,是Spring帮我们写好了--><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--DispatcherServlet必须要绑定SpringMVC的配置文件,关联一个springMVC配置文件--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc-servlet.xml</param-value></init-param><!--启动级别 1:表示和服务器一起启动--><load-on-startup>1</load-on-startup></servlet><!-- 在SpringMVC中, 路径中 / 和 /* 的区别“/” 是只会匹配所有的请求,不会去匹配jsp页面“/*” 是只会匹配所有的请求,包括jsp页面--><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>/</url-pattern></servlet-mapping> </web-app>
配置SpringMVC配置文件(主要是为了配置 处理器映射器、适配器和视图解析器)
<!--配置处理器映射器--><bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/><!--配置适配器--><bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/><!--视图解析器 :模板引擎--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"><!--前缀--><property name="prefix" value="/WEB-INF/jsp/"/><!--后缀--><property name="suffix" value=".jsp"/></bean>
配置Controller
package com.chuchen.controller;import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;public class HelloController implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mv = new ModelAndView();//业务代码String res = "Hello SpringMVC";mv.addObject("msg",res);//视图跳转代码mv.setViewName("test");return mv;} }
具体的底层原理我这没办法写,可以多看看代码,其他的资料。
注解开发(其实上面的xml配置方法只是为了看原理,真正的开发中不会那么写,但是到时候面试肯定只要是问你原理)
引入相关依赖或插件以及注意资源文件过滤问题
配置web.xml,注意:web.xml必须是最新版本 这都是一样的,不用改。
创建Controller
package com.chuchen.controller;import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping;@Controller @RequestMapping("/hello") public class HelloController{//localhost:8080/hello/h1@RequestMapping("/h1")public String hello(Model model){//封装数据model.addAttribute("msg","Hello SpringMVN");return "hello"; //会自动被视图解析器处理} }
注意点:
- 通常,我们只需要手动配置视图解析器,而处理器映射器和处理器是配置只需要开启注解驱动即可,从而大量的节省了xml的配置。
3、Controller及RestFul风格
3.1、控制器Controller
控制器复杂提供访问应用程序的行为,通常通过定义接口或注解两种方式实现。
控制器负责解析用户的请求并将其转换为一种模型。
在SpringMVC中,一个控制器类可以包含多个方法。
在SpringMVC中,对于Controller的配置方式有很多种。
实现Controller接口,该接口下只有一个方法。实现了该接口就代表它是一个控制器,返回ModelAndView。
//通过实现Controller接口实现 public class ControllerTestOne implements Controller {@Overridepublic ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mv = new ModelAndView();mv.addObject("msg","ControllerTestOne");mv.setViewName("test");return mv;} }
这种控制器只能一个接口写一个方法,当有多个请求的时候就要写很多类,所以不推荐使用。
用Spring中的 @controller 注解将其注入到Spring中
要先开启注解扫描。
<!--自动扫描包,这是由IOC统一管理--> <context:component-scan base-package="com.chuchen.controller"/>
编写一个控制器
@Controller //代表将会被Spring接管 public class ControllerTestTwo {@RequestMapping("t2")public String test1(Model model){model.addAttribute("msg","ControllerTestTwo");return "test";} }
@RequestMapping注解可以写在类上,也可以写在方法上,写在类上和方法上相当于是父子关系,如果要作为一个控制器,那么方法上一定要有这个注解,类上可以没有。
3.2、ResfFul风格
概念:ResFul就是一个资源定位以及资源操作风格,不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更加简洁,更有层次,更易于实现缓存等机制。
功能:
- 资源:互联网所有的事物都可以被抽取为对象。
- 资源操作:使用POST、DELETE、PUT、GET使用不同的资源进行操作。
- 分别对应增加、修改、删除、查询。
方法:在所要传递的参数上加上 @PathVariable 注解就行,让方法参数的值对应绑定到URL模板变量上。然后参数上也要加上对应的注解,其中还可以用其他的注解来限制提交方式
@Controller public class RestFulControllerTest {// @RequestMapping(value = "/add/{a}/{b}")//这类注解还可以限定请求方式@PostMapping(value = "/add/{a}/{b}")public String test(@PathVariable String a,@PathVariable int b, Model model){//原来的访问方式 localhost:8080/04/add?a=1&b=2String res = a+b;//RestFul: localhost:8080/add/a/bmodel.addAttribute("msg","结果为:"+res);return "test";} }
好处
- 安全,这样不会暴露服务器的部分代码。
- 简洁。
- 高效,这支持缓存。
4、结果跳转方式
设置 ModelAndView 对象,根据view的名称,和视图解析器跳转到指定页面。
页面:{视图解析器前缀} + viewName + {视图解析器后缀}
请求转发和从重定向其实也是可以将视图解析器删掉,直接在后面写死,当然了,不建议这么做。
4.1、请求转发
前面说的默认都是请求转发。
4.2、重定向
在有视图解析器的前提下,在返回的地址前面加上一个redirect:就行;
@Controller
public class ModelTest {@RequestMapping("/m1/t1")public String test1(HttpServletRequest request, HttpServletResponse response){return "redirect:/index.jsp";}
}
5、数据处理
5.1、提交的名称与参数名一致
一致的话可以直接提交,它会自动匹配。
5.2、提交的名称和参数名不一致
给参数前面加上一个注解就行,其实一般,最好不管参数名是不是前端提交的一样,最好都要加上这个注解@RequestParam
@Controller
@RequestMapping("/user")
public class UserControllerTest {@PostMapping("/t1")public String test1(@RequestParam("name") String name, Model model){//接受前端参数System.out.println("接受到的前端参数为:"+name);//将结果返回前端model.addAttribute("msg",name);//视图跳转return "test";}
}
5.3、提交的是一个对象
其实也通过参数来提交的
5.4、乱码的解决
在Spring中,一般都是用过滤器解决乱码。
6、JSON
在现在的前后端分离阶段,后端部署提供接口提供数据,那么前端也要可以独立部署,这才能真正的做到前后端分离。
那么前端也是一样,要做到真正的前后端分离,负责渲染后端数据以及提供数据。
那么真正的为了解决前后端的数据传输统一的问题,也就是当前后端是不同人开发,都要有统一约定。这是后就要用到JSON了。
6.1、JSON概念
特点:
- JSON是一种JavaScript的轻量级数据交换格式,目前使用的特别广泛。
- 使用完全独立于编程语言的文本格式来存储数据。
- 简洁和清晰的层次结构使得JSON成为理想的交换语言。
- 易于阅读和编写,同时也便于机器理解生成,从而提升它的传输效率。
格式:
- JSON对象的保存格式是键值对,数据间用逗号隔开
- 花括号用来保存对象。
- 方括号保存数组。
JSON和JavaScript对象的区别:JSON是JavaScript对象的字符串表示法,它使用文本表示一个JS的对象信息,本质是一个字符串。
var obj = {a:"hello",b:"word"}; //这就表示一个JavaScript对象,注意键名也是可以用引号包裹的 var json = '{a:"hello",b:"word"}'; //这就是一个JSON对象,本质就是一个字符串。
JSON和JavaScript对象之间的转换
实现JavaScript对象转化为JSON字符串,使用JSON.stringify() 方法
var json = JSON.stringify({a:"hello",b:"word"}); //结果是:'{a:"hello",b:"word"}'
实现JSON字符串转化为JavaScript对象,使用JSON.parse() 方法
var obj = JSON.parse('{a:"hello",b:"word"}'); //这个的结果就是: obj = {a:"hello",b:"word"};
6.2、Controller返回JSON数据
- Jackson应该是目前比较好用的JSON解析工具了,当然还有阿里巴巴的fastjson等等。
要使用Jackson,首先要导入它的jar包。
然后jackson有一个ObjectMapper对象,这个对象可以进行转换,另外注意编码问题
@Controller public class UserController {//可以在这个注解上加上这个属性来设置编码,但是不建议用,一般都用在配置文件里面配置//@RequestMapping(value = "/j1",produces = "application/json;charset=utf-8")@RequestMapping(value = "/j1")@ResponseBody //加上这个注解就不会走视图解析器 ,会直接返回以一个字符串public String test1() throws JsonProcessingException {//jackson有一个ObjectMapper对象ObjectMapper mapper = new ObjectMapper();//创建一个对象User user = new User("孔繁帮",3,"男");return mapper.writeValueAsString(user);} }
统一设置Jackson编码
<!--json乱码 统一设置编码--><mvc:annotation-driven><mvc:message-converters register-defaults="true"><bean class="org.springframework.http.converter.StringHttpMessageConverter"><constructor-arg value="utf-8"/></bean><bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="objectMapper"><bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean"><property name="failOnEmptyBeans" value="false"/></bean></property></bean></mvc:message-converters></mvc:annotation-driven>
注意可以设置输出格式
@ResponseBody //加上这个注解就不会走视图解析器 ,会直接返回以一个字符串 public String test3() throws JsonProcessingException {Date date = new Date();//jackson有一个ObjectMapper对象ObjectMapper mapper = new ObjectMapper();//创建一个对象//时间解析后的时间默认是时间戳 Timestamp,可以通过时间戳来设置//SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//String format = sdf.format(date);//也可以使用ObjectMapper来格式化输出mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,false);return mapper.writeValueAsString(format); }
注意:@RestController(这个注解加在类的上面) //这个注解是不让这个类里面的方法只是返回字符串,不走视图解析器。
为了方便可以写一个JSON的工具类
public class JsonUtil {public static String getJson(Object o){return getJson(o,"yyyy-MM-dd HH:mm:ss");}public static String getJson(Object o,String dataFormat) {ObjectMapper mapper = new ObjectMapper();//时间解析后的时间默认是时间戳 Timestamp,可以通过时间戳来设置SimpleDateFormat sdf = new SimpleDateFormat(dataFormat);mapper.setDateFormat(sdf);try {return mapper.writeValueAsString(o);} catch (JsonProcessingException e) {e.printStackTrace();}return null;} }
6.3、Fastjson的使用
这是阿里巴巴开发的一个JSON的工具包,和上面的一个概念,这个了解就行
它主要有三个工具类:
- JSONObject :代表json对象
- JSONArray:代表json数组对象
- JSON:代表JSONObject和JSONArray之间的转化
用法主要看代码
7、Ajax的使用
7.1、简介
- Ajax = Asynchronous JavaScript and XML(异步的JavaScript和xml)。
- Ajax是在无需重新加载整个网页的情况下,能够更新部分网页技术。
- Ajax不是一种编程语言,而是一种用于创建更好以及交互性更强的Web应用程序技能。
- 简单来说就还是局部刷新页面。
- 这个主要看代码笔记。
比如登陆例子的核心代码:
function a1() {$.post({url: "${pageContext.request.contextPath}/a3",data: {"name":$("#name").val()},success:function (date){console.log(date);if(date === "Ok"){$("#userInfo").css("color","green").html(date);}else {$("#userInfo").css("color","red").html(date);}}});
}
function a2(){$.post({url: "${pageContext.request.contextPath}/a3",data: {"pwd":$("#pwd").val()},success:function (date){if(date === "Ok"){$("#pwdInfo").css("color","green").html(date);}else {$("#pwdInfo").css("color","red").html(date);}}});
}
@RequestMapping("a3")
public String a3(String name,String pwd){String msg = "";if(name != null){//模拟数据库if("admin".equals(name)){msg = "Ok";}else {msg = "用户名有误";}}if(pwd != null){if("123456".equals(pwd)){msg = "Ok";}else {msg = "密码有误";}}return msg;
}
以前还觉得很难,其实现在理解了也很简单。
8、 拦截器
8.1、拦截器和过滤器的区别
猪獒区别是 : 拦截器是AOP思想的具体应用
- 过滤器:
- 是Servlet的一部分,在任何的java web都可以使用。
- 在 url-pattern 中配置之 */之后,所有的要访问的资源都会先经过它。
- 拦截器:
- 是SpringMVC框架自己的,只有使用了SpringMVC框架之后才能使用。
- 拦截器只能拦截访问的控制方法,如果访问的是jsp/html/image/js是不会进行拦截的。
8.2、自定义拦截器
要实现拦截器,必须要继承HandlerInterceptor 接口。
public class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("处理器前");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("处理器前");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("清理");} }
配置拦截器
<!--拦截器配置--> <mvc:interceptors><mvc:interceptor><!--包括这个请求下的所有请求--><mvc:mapping path="/**"/><bean class="com.chuchen.config.MyInterceptor"/></mvc:interceptor> </mvc:interceptors>
9、文件上传
9.1、上传
一样的,要上传文件,前端表单必须要设置enctype属性。这样它才能以流形(二进制)式上传。
SpringMVC为文件上传提供了专门的支持,这种支持是用 **MultipartResolver **实现的所以要先导入插件。
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.1</version>
</dependency>
主要用到的类是下面的这个,要提前注入好,注意,这个注入的id不能改,只能是这个。
<!--文件上传的配置--><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!--请求编码的格式,,必须和jsp里面的pageEncoding一样,以至于读取正确的表单内容--><property name="defaultEncoding" value="utf-8"/><!--上传文件的大小上限,这里是 10M--><property name="maxUploadSize" value="10485760"/><property name="maxInMemorySize" value="40960"/></bean>
具体实现
//@RequestParam("file") :将name = file 控件得到的文件封装成 CommonsMultipartFile 对象//批量上传CommonsMultipartFile则为数组@RequestMapping("uploadOne")public String uploadFileOne(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {//获取文件名String uploadFileName = file.getOriginalFilename();//如果文件为空,直接返回到首页if("".equals(uploadFileName)){return "redirect:/index.jsp";}System.out.println("上传文件名为:"+uploadFileName);//上传文件保存String path = request.getServletContext().getRealPath("/upload");File realPath = new File(path);//如果不存在这个目录,则创建一个if(!realPath.exists()){realPath.mkdir();}System.out.println("文件上传保存地址为:"+realPath);InputStream is = file.getInputStream();assert uploadFileName != null;OutputStream os = new FileOutputStream(new File(realPath,uploadFileName));//读取写出int len = 0;byte[] buffer = new byte[1024];while ((len=is.read(buffer)) != -1){os.write(buffer,0,len);os.flush();}os.close();is.close();return "redirect:/index.jsp";}//方法二,这个相当于把文件的操作也给我们封装好了@RequestMapping("uploadTwo")public String uploadFileTwo(@RequestParam("file") CommonsMultipartFile file, HttpServletRequest request) throws IOException {//上传文件路径保存设置String path = request.getServletContext().getRealPath("/upload");File readPath = new File(path);if(!readPath.exists()){readPath.mkdir();}System.out.println("上传文件地址"+readPath);//通过CommonsMultipartFile方法直接写入文件file.transferTo(new File(readPath + "/" + file.getOriginalFilename()));return "redirect:/index.jsp";}
9.2、下载
文件的下载其实刚好和文件的下载相反,这就不多说了,具体看代码。
@RequestMapping("download")public String downLoad(HttpServletResponse response,HttpServletRequest request) throws IOException {//要下载的文件地址String path = request.getServletContext().getRealPath("upload");String fileName = "鞠婧祎.jpg";//设置响应头response.reset(); //设置页面不缓存,清空页面response.setCharacterEncoding("utf-8");response.setContentType("multipart/form-data"); //二进制传输数据//设置响应头response.setHeader("Content-Disposition","attachment;fileName="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8));File file = new File(path,fileName);//读取文件--输入流InputStream input = new FileInputStream(file);//写文件OutputStream out = response.getOutputStream();byte[] buff = new byte[1024];int index;//执行写出操作while ((index = input.read(buff)) != -1){out.write(buff,0,index);out.flush();}out.close();input.close();return null;}
rEncoding("utf-8");response.setContentType("multipart/form-data"); //二进制传输数据//设置响应头response.setHeader("Content-Disposition","attachment;fileName="+ URLEncoder.encode(fileName, StandardCharsets.UTF_8));File file = new File(path,fileName);//读取文件--输入流InputStream input = new FileInputStream(file);//写文件OutputStream out = response.getOutputStream();byte[] buff = new byte[1024];int index;//执行写出操作while ((index = input.read(buff)) != -1){out.write(buff,0,index);out.flush();}out.close();input.close();return null;}
SpringMVC总结笔记相关推荐
- SpringMVC:学习笔记(11)——依赖注入与@Autowired
SpringMVC:学习笔记(11)--依赖注入与@Autowired 使用@Autowired 从Spring2.5开始,它引入了一种全新的依赖注入方式,即通过@Autowired注解.这个注解允许 ...
- SpringMVC:学习笔记(10)——整合Ckeditor且实现图片上传
SpringMVC:学习笔记(10)--整合Ckeditor且实现图片上传 配置CKEDITOR 精简文件 解压之后可以看到ckeditor/lang下面有很多语言的js,如果不需要那么多种语言的,可 ...
- springmvc学习笔记(10)-springmvc注解开发之商品改动功能
springmvc学习笔记(10)-springmvc注解开发之商品改动功能 springmvc学习笔记(10)-springmvc注解开发之商品改动功能 标签: springmvc springmv ...
- springmvc学习笔记(19)-RESTful支持
springmvc学习笔记(19)-RESTful支持 标签: springmvc springmvc学习笔记19-RESTful支持 概念 REST的样例 controller REST方法的前端控 ...
- SpringMVC:学习笔记(5)——数据绑定及表单标签
SpringMVC--数据绑定及表单标签 理解数据绑定 为什么要使用数据绑定 基于HTTP特性,所有的用户输入的请求参数类型都是String,比如下面表单: 按照我们以往所学,如果要获取请求的所有参数 ...
- springmvc学习笔记(17)-上传图片
2019独角兽企业重金招聘Python工程师标准>>> springmvc学习笔记(17)-上传图片 标签: springmvc [TOC] 本文展示如何在springmvc中上传图 ...
- SpringMVC学习笔记(二)常用注解
SpringMVC学习笔记(二)常用注解 1.RequestParam 作用: 把请求中指定名称的参数给控制器中的形参赋值. 属性: value:请求参数中的名称. required:请求参数中是否必 ...
- springmvc学习笔记--ueditor和springmvc的集成
springmvc学习笔记--ueditor和springmvc的集成 前言: 在web开发中, 富文本的编辑器真心很重要. 有电商店铺的打理, 新闻稿/博客文章/论坛帖子的编辑等等, 这种所见即所的 ...
- SpringMVC学习笔记
文章目录 SpringMVC学习笔记 Spring MVC 什么是 MVC 设计模式? Spring MVC 的核心组件 Spring MVC 的工作流程 如何使用? Spring MVC 注解 Sp ...
- SpringMVC学习笔记整理
SpringMVC学习笔记 以下是我整理的SpringMVC学习笔记: 导入jar包 一:springmvc工作流程. ①. servlet容器初始化一个request请求 ②. Di ...
最新文章
- mysql缺少函数_零散的MySQL基础总是记不住?看这一篇就够了!
- java jpanel 间距_Java的 . 调整JPanel上的问题大小
- RocketMQ初探(五)之RocketMQ4.2.6集群部署(单Master+双Master+2m+2s+async异步复制)
- python3.7官网中文官网_通用操作系统服务
- std::make_shared<T>/std::make_unique<T>与std::shared_ptr<T>/std::unique_ptr<T>的区别与联系
- 阿里云大数据利器Maxcompute-使用mapjoin优化查询
- 【转】windows 7系统安装与配置Tomcat服务器环境
- VirtualBox配置
- 问你觉得iOS7为什么要扁平化,扁平化和之前的比有什么优势
- Juniper SRX防火墙流量处理流程图(详细)
- 插值方法 matlab 实验,matlab计算方法实验报告3(插值问题).doc
- my97前端日期插件使用示例
- 数学建模常用算法:人工鱼群算法(AFAS)求解二元函数最小值+限定x,y范围测试【java实现--详细注释+Matlab绘制小鱼游动过程】
- 三国演义网页游戏私服架设教程
- linux关闭3389端口,如何修改云服务器(Windows、Linux)的默认3389远程端口?
- ArcGIS基于爬虫数据绘制人口分布密度图
- AutoCAD:The miracle created by Autodesk
- 数据结构第二版(朱昌杰版)习题2答案
- Pixhawk原生固件PX4之驱动ID
- 关于LoRa模块你需要知道的一切
热门文章
- 计算机组成原理笔记(8)---机器指令、寻址方式
- 078 周期函数定积分性质及定积分三大性质总结
- 单相/三相桥相/线电压基波幅值总结
- Spring+SpringMVC+MyBatis明日方舟版人员信息管理系统前端页面代码前后端交互+SSM框架 管理员登录 游客登录 普通用户登录 人员的增删改查 信息更新 图片上传 分页查询)
- Cass10.1独立地物简码识别功能
- 手机拍摄证件照有什么诀窍
- 语c语言用语大全,C语言常用语总结.doc
- Windows Git 多用户多仓库配置
- c语言之良好的编程习惯(四)
- 本地安装brat标注平台