深圳福田专业网站建设,wordpress 页 定制,做数据ppt模板下载网站,个人申请网址什么条件SpringMVC学习笔记——1 一、SpringMVC简介1.1、SpringMVC概述1.2、SpringMVC快速入门1.3、Controller中访问容器中的Bean1.4、SpringMVC关键组件的浅析 二、SpringMVC的请求处理2.1、请求映射路径配置2.2、请求数据的接收2.2.1、键值对方式接收数据2.2.2、封装JavaBean数据2.2… SpringMVC学习笔记——1 一、SpringMVC简介1.1、SpringMVC概述1.2、SpringMVC快速入门1.3、Controller中访问容器中的Bean1.4、SpringMVC关键组件的浅析 二、SpringMVC的请求处理2.1、请求映射路径配置2.2、请求数据的接收2.2.1、键值对方式接收数据2.2.2、封装JavaBean数据2.2.3、接收JSON格式数据2.2.4、接收Restful风格数据2.2.5、接收上传的文件2.2.6、获取header头信息和cookie信息2.2.7、直接获取Requset和Session域中的数据 2.3、Javaweb常用对象获取2.4、请求静态资源2.5、注解驱动\mvc:annotation-driven标签 三、SpringMVC的响应处理3.1、传统同步业务数据响应3.2、前后端分离异步业务数据响应 一、SpringMVC简介
1.1、SpringMVC概述
SpringMVC是一个基于Spring开发的MVC轻量级框架Spring3.0后发布的组件SpringMVC和Spring可以无缝整合使用DispatcherServlet作为前端控制器且内部提供了处理器映射器、处理器适配器、视图解析器等组件可以简化JavaBean封装Json转化、文件上传等操作。
1.2、SpringMVC快速入门 导入spring-mvc坐标
dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.7/version
/dependency配置前端控制器DispatcherServlet
?xml version1.0 encodingUTF-8?
web-app xmlnshttp://xmlns.jcp.org/xml/ns/javaeexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsdversion4.0!--配置DispatcherServlet--servletservlet-nameDispatcherServlet/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class/servletservlet-mappingservlet-nameDispatcherServlet/servlet-nameurl-pattern//url-pattern/servlet-mapping
/web-app编写Controller配置映射路径并交给SpringMVC容器管理
Controller
public class QuickController {RequestMapping(/show)private void show(){System.out.println(show running...);}
}1.3、Controller中访问容器中的Bean
创建Bean
Service
public class QuickServiceImpl implements QuickService {
}用spring-xml文件扫描包含该Bean的包
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd
!--组件扫描--context:component-scan base-packagecom.Smulll.Service/
/beans在Web-xml文件中配置ContextLoaderListener
!--配置ContextLoaderlistener--
context-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:applicationContext.xml/param-value
/context-param
listenerlistener-classorg.springframework.web.context.ContextLoaderListener/listener-class
/listener在Controller中访问容器中的Bean
Controller
public class QuickController {/*直接注入Service进行使用*/Autowiredprivate QuickService quickService;
}1.4、SpringMVC关键组件的浅析
上面已经完成的快速入门的操作也在不知不觉中完成的Spring和SpringMVC的整合我们只需要按照规则去定义Controller和业务方法就可以。但是在这个过程中肯定是很多核心功能类参与到其中这些核心功能类一般称为组件。当请求到达服务器时是哪个组件接收的请求是哪个组件帮我们找到的Controller是哪个组件帮我们调用的方法又是哪个组件最终解析的视图?
组件描述常用组件处理器映射器:HandlerMapping匹配映射路径对应的Handler返回可执行的处理器链对象HandlerExecutionChain对象RequestMappingHandlerMapping处理器适配器:HandlerAdapter匹配HandlerExecutionChain对应的适配器进行处理器调用返回视图模型对象RequestMappingHandlerAdapter视图解析器:ViewResolver对视图模型对象进行解析InternalResourceViewResolver 二、SpringMVC的请求处理
2.1、请求映射路径配置
配置映射路径映射器处理器才能找到Controller的方法资源目前主流映射路径配置方式就是RequestMapping
相关注解作用使用位置RequestMapping设置控制器方法的访问资源路径可以接收任何请求方法和类上GetMapping设置控制器方法的访问资源路径可以接收GET请求方法和类上PostMapping设置控制器方法的访问资源路径可以接收POST请求方法和类上
当给类加了RequestMapping想要访问某个方法就必须要在虚拟地址上加入类的RequestMapping名以及方法的RequestMapping名
Controller
RequestMapping(/quick)
public class QuickController {/*直接注入Service进行使用*/Autowiredprivate QuickService quickService;//使用GET方法获取数据//RequestMapping(value {/show,/showaaa},method RequestMethod.GET)GetMapping(/show)//当给类加了RequestMapping(/quick)想访问show方法就必须要 虚拟地址quick/showprivate String show(){System.out.println(show running...quickService);return /index.jsp;}
}2.2、请求数据的接收
2.2.1、键值对方式接收数据
接收普通请求数据当客户端提交的数据是普通键值对形式时直接使用同名形参接收即可
Controller
public class ParamController { //http://localhost:8080/SpringMVCDome1/Param4?usernamezhangsanage12hobbyfootballRequestMapping(/Param4)public String Param4(RequestParam MapString,String map){map.forEach((k,v)-{System.out.println(kv);});return index.jsp;}//http://localhost:8080/SpringMVCDome1/Param4?hobbypingpanghobbyfootballhobbybasketballRequestMapping(/Param3)public String Param3(RequestParam ListString hobby){for (String s : hobby) {System.out.println(s);}return index.jsp;}//http://localhost:8080/SpringMVCDome1/Param4?hobbypingpanghobbyfootballhobbybasketballRequestMapping(/Param2)public String Param2(String[] hobby){for (String s : hobby) {System.out.println(s);}return index.jsp;}//http://localhost:8080/SpringMVCDome1/Param4?usernamezhangsanage23RequestMapping(/Param1)public String Param1(RequestParam(username) String name, int age){System.out.println(nameage);return index.jsp;}
}RequestParam可以使获取的数据不创建对象而是直接注入形参因此使用该注解可以使得参数不一样而注入 RequestParam有三个属性value要注入参数的名字required该数据是否必须注入 true是false否默认 defaultValue当数据未提交时的默认值
2.2.2、封装JavaBean数据
接收实体JavaBean属性数据单个JavaBean数据:提交的参数名称只要与Java的属性名一致就可以进行自动封装
usernamehaohaoage35hobbieseathobbiessleeppublic class User{private string username ;private Integer age;private String [] hobbies;private Date birthday;private Address address;// ...省略get和set方法
}GetMapping(/show)
pubiic string show(User user){system.out.println(user);return /index.jsp ;
}2.2.3、接收JSON格式数据
使用POST请求方式添加RequestBody可以使json格式字符串整体打印出来不会被解析
PostMapping(/Param5)
public String Param5(RequestBody String body) {System.out.println(body);return index.jsp;
}使用Json工具 ( jackson 将Json格式的字符串转化为JavaBean进行操作
dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.9.0/version
/dependencyPostMapping (/show )
public string show(RequestBody string body) throws IOException {system.out.println(body);//获得objectMapperObjectMapper objectMapper new ObjectMapper();//将json格式字符串转化成指定的UserUser user objectMapper.readValue(body,User.class);System.out.println(user);return /index.jsp;
}配置HandlerAdapter可以自动执行转换的工作
bean classorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapterproperty namemessageConverterslistbean classorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter/bean/list/property
/beanPostMapping (/show )
public string show(RequestBody User user) throws IOException {System.out.println(user);return /index.jsp;
}2.2.4、接收Restful风格数据
什么是Rest风格? Rest (Representational State Transfer表象化状态转变(表述性状态转变)在2000年被提出基于HTTP、URI 、xml、JSON等标准和协议支持轻量级、跨平台、跨语言的架构设计。是Web服务的一种新网络应用程序的设计风格和开发方式。
Restful风格的请求常见的规则有如下三点: 用URI表示某个模块资源资源名称为名词;
模板URI资源用户模块userhttp://localhost/user商品模块producthttp://localhost/product账户模块accounthttp://localhost/account日志模块loghttp://localhost/log
用请求方式表示模块具体业务动作例如:GET表示查询、POST表示插入、PUT表示更新、DELETE表示删除
URI资源请求方式参数解释http://localhost/user/100GET存在URL地址中:100查询id100的User数据http://localhost/userPOST存在请求体中Json: {“username”:“haohao” ,“age”:18}插入user数据http://localhost/userPUT存在请求体中Json : {“id”:100,“username”:“haohao” , “age”:18}修改id100的User数据http://localhost/user/100DELETE存在URL地址中:100删除id100的User数据http://localhost/product/5GET存在URL地址中:5查询id5的Product数据http://localhost/productPOST存在请求体中Json: {“proName”:“小米手机” ,“price”:1299}插入Product数据http://localhost/productPUT存在请求体中Json : {“id”:5,“proName”:“小米手机” ,“price”:1299}修改id5的Product数据http://localhost/product/5DELETE存在URL地址中:5删除id5的Product数据
用HTTP响应状态码表示结果国内常用的响应包括三部分:状态码、状态信息、响应数据
{code:200,message:成功,data:{username:haohao,age:18}
}
{code:300,message:执行错误,data:,
}接收Restful风格数据Restful请求数据一般会在URL地址上携带可以使用注解PathVariable(占位符参数 名称)
http://localhost/user/100PostMapping (/user/{id})
public string findUserById(Pathvariable(id) Integer id){system.out.println(id);return /index.jsp;
}请求URL资源地址包含多个参数情况
http://localhost/user/haohao/18PostMapping (/user/{username}/{age})
public string findUserById(Pathvariable(username) String username,Pathvariable(age) Integer age){system.out.println(usernameage);return /index.jsp;
}2.2.5、接收上传的文件
接收文件上传的数据文件上传的表单需要一定的要求如下:
表单的提交方式必须是POST表单的enctype属性必须是multipart/form-data文件上传项需要有name属性
form action enctypemultipart/form-data methodpostinput typefile namemyFile
/formhttp://localhost:8080/SpringMVCDome1/Param6PostMapping(/Param6)
public String Param6(RequestBody MultipartFile myFile) {System.out.println(myFile);return /index.jsp;
}服务器端由于映射器适配器需要文件上传解析器而该解析器默认未被注册所以手动注册
!--配置文件上传解析器注意:id的名字是固定写法--
bean idmultipartResolver
classorg.springframework.web.multipart.commons.CommonsMultipartResolverproperty namedefaultEncoding valueUTF-8/!--文件的编码格式默认是Iso8859-1--property namemaxUploadSizePerFile value1048576/!--上传的每个文件限制的大小单位字节--property namemaxUploadSize value3145728/!--上传文件的总大小--property namemaxInMemorySize value1048576/!--上传文件的缓存大小--
/bean而CommonsMultipartResolver底层使用的Apache的是Common-fileuplad等工具API进行的文件上传
dependencygroupIdcommons-fileupload/groupIdartifactIdcommons-fileupload/artifactIdversion1.4/version
/dependencyPostMapping(/Param6)
public String Param6(RequestBody MultipartFile myFile) throws IOException {System.out.println(myFile);//将上传的文件进行保存//1、获取当前上传的文件的输入流InputStream inputStream myFile.getInputStream();//2、获得上传文件位置的输出流OutputStream outputStream new FileOutputStream(D:\\aaa);//3、执行文件拷贝IOUtils.copy(inputStream,outputStream);outputStream.close();inputStream.close();return /index.jsp;
}2.2.6、获取header头信息和cookie信息
接收Http请求头数据接收指定名称的请求头
GetMapping (/headers)
public string headers(RequestHeader(Accept-Encoding) String acceptEncoding){System.out.println ( Accept-Encoding:acceptEncoding);return /index.jsp;接收所有的请求头信息
GetMapping ( / headersMap )
public string headersMap(RequestHeader MapString,string map){map.forEach((k, v)-{system.out.println(k:V);});return /index.jsp ;获得客户端携带的Cookie数据
GetMapping(/cookies)
public String cookies(CookieValue(value JSESSIONID,defaultValue ) String jsessionid){system.out.println(jsessionid);return /index.jsp ;
}2.2.7、直接获取Requset和Session域中的数据
获得转发Request域中数据在进行资源之间转发时有时需要将一些参数存储到request域中携带给下一个资源
GetMapping (/request1)
public string request1(HttpServletRequest request) {//存储数据request.setAttribute(username,haohao);return /request2;
}
GetMapping (/request2)
public string request2(RequestAttribute(username) String username) {system.out.println(username);return /index.jsp;
}
2.3、Javaweb常用对象获取
直接打印参数request和response可以发现这两个参数是SpringMVC自动传入的
GetMapping(/Param10)
public String Param10(HttpServletRequest request, HttpServletResponse response) {System.out.println(request);System.out.println(response);return /index.jsp;
}2.4、请求静态资源
在Spring-MVC框架下无法直接访问到web文件下的静态资源
静态资源请求的三种解决方案:
第一种方案可以再次激活Tomcat的DefaultServletServlet的url-pattern的匹配优先级是:精确匹配目录匹配扩展名匹配缺省匹配所以可以指定某个目录下或某个扩展名的资源使用DefaultServlet进行解析:
servlet-mappingservlet-namedefault/servlet-nameurl-pattern*.html/url-pattern
/servlet-mapping
servlet-mappingservlet-namedefault/servlet-nameurl-pattern/img/*/url-pattern
/servlet-mapping第二种方式在spring-mvc.xml中去配置静态资源映射匹配映射路径的请求到指定的位置去匹配资源
!--mapping是映射资源路径location是对应资源所在的位置--
mvc:resources mapping/img/* location/img/ /
mvc:resources mapping/css/* location/css/ /
mvc:resources mapping/css/* location/js/ /
mvc:resources mapping/html/* location/html/ /第三种方式在spring-mvc.xml中去配置mvc:default-servlet-handler 该方式是注册了一个 DefaultServletHttpRequestHandler处理器静态资源的访问都由该处理器去处理这也是开发中使用最多的
mvc:default-servlet-handler/2.5、注解驱动mvc:annotation-driven标签
该标签内部会帮我们注册RequestMappingHandlerMapping、注册RequestMappingHandlerAdapter并注入Json消息转换器等上述配置就可以简化成如下:
!--mvc注解驱动--
mvc:annotation-driven/
!--配置DefaultServletHttpRequestHandler--
mvc:default-servlet-handler/PS: mvcannotation-driven标签在不同的版本中帮我们注册的组件不同Spring 3.0.X版本注册是 DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter由于框架的发展从Spring 3.1.X开始注册组件变为RequestMappingHandlerMapping和RequestMappingHandlerAdapter.
三、SpringMVC的响应处理
3.1、传统同步业务数据响应
Spring的接收请求的部分我们讲完了下面在看一下Spring怎么给客户端响应数据响应数据主要分为两大部分:
传统同步方式:准备好模型数据在跳转到执行页面进行展示此方式使用越来越少了基于历史原因一些旧项目还在使用;前后端分离异步方式:前端使用Ajax技术Restful风格与服务端进行Json格式为主的数据交互目前市场上几乎都是此种方式了。
传统同步业务数据响应
请求资源转发请求资源重定向响应模型数据直接回写数据给客户端 转发的关键字forword重定向的关键字redirect
通过视图模型的方式进行转发数据
Controller
public class QuickController1 {GetMapping(/res1)//当给类加了RequestMapping(/quick)想访问show方法就必须要 虚拟地址quick/showprivate ModelAndView show(ModelAndView modelAndView){User user new User();user.setUsername(zhangsan);user.setAge(18);user.setGender(男);modelAndView.addObject(user,user);modelAndView.setViewName(/index.jsp);return modelAndView;}
}直接回写字符串
需要使用Tomcat8
RequestMapping(/res2)
ResponseBody//告诉SpringMVC返回的字符串不是视图名是以响应体方式响应的数据
public String res2(){return hello,world;
}3.2、前后端分离异步业务数据响应
其实此处的回写数据跟上面回写数据给客户端的语法方式一样只不过有如下一些区别:
同步方式回写数据是将数据响应给浏览器进行页面展示的而异步方式回写数据一般是回写给Ajax引擎的即谁访问服务器端服务器端就将数据响应给谁同步方式回写的数据一般就是一些无特定格式的字符串而异步方式回写的数据大多是Json格式字符串
回写普通数据使用ResponseBody标注方法直接返回字符串即可此处不在说明; 回写Json格式的字符串即将直接拼接Json格式的字符串或使用工具将JavaBean转换成Json格式的字符串回写
GetMapping(/response3)
ResponseBody
public string response3(HttpServletResponse response){return {\username\:\haohaol\,\age\:18};
}
GetMapping(/response4)
ResponseBody
public string response4() throws JsonProcessingException {//创建JavaBeanUser user new User();user.setUsername(haohao);user.setAge(18);//使用Jackson转换成json格式的字符串String json new objectMapper().writevalueAsString(user);return json;
}使用RestController 相当于ResponseBody和Controller结合