传统网站模板,wordpress 小论坛,通辽公司做网站,17网做网站一、SpringMVC简单理解
1.1 Spring与Web环境集成
1.1.1 ApplicationContext应用上下文获取方式
应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的#xff0c;但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(sp…
一、SpringMVC简单理解
1.1 Spring与Web环境集成
1.1.1 ApplicationContext应用上下文获取方式
应用上下文对象是通过new ClasspathXmlApplicationContext(spring配置文件) 方式获取的但是每次从容器中获得Bean时都要编写new ClasspathXmlApplicationContext(spring配置文件) 这样的弊端是配置文件加载多次应用上下文对象创建多次。
在Web项目中可以使用ServletContextListener监听Web应用的启动我们可以在Web应用启动时就加载Spring的配置文件创建应用上下文对象ApplicationContext在将其存储到最大的域servletContext域中这样就可以在任意位置从域中获得应用上下文ApplicationContext对象了。
1.1.2 Spring提供获取应用上下文的工具
上面的分析不用手动实现Spring提供了一个监听器ContextLoaderListener就是对上述功能的封装该监听器内部加载Spring配置文件创建应用上下文对象并存储到ServletContext域中提供了一个客户端工具WebApplicationContextUtils供使用者获得应用上下文对象。
所以我们需要做的只有两件事
①在web.xml中配置ContextLoaderListener监听器导入spring-web坐标
②使用WebApplicationContextUtils获得应用上下文对象ApplicationContext
1.1.3 导入Spring集成web的坐标 !-- spring必要依赖 --dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.0.5.RELEASE/version/dependency!-- spring web依赖注意使用mvc后倒入webmvc --dependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion5.0.5.RELEASE/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.2/version/dependency!--Jsp坐标--dependencygroupIdjavax.servlet.jsp/groupIdartifactIdjsp-api/artifactIdversion2.0/version/dependency!-- Servlet坐标 --dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion3.1.0/version/dependency1.1.4 配置ContextLoaderListener监听器 !--全局参数--
context-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:applicationContext.xml/param-value
/context-param
!--Spring的监听器--
listenerlistener-classorg.springframework.web.context.ContextLoaderListener/listener-class/listener1.1.5 通过工具获得应用上下文对象
WebServlet(name TestServlet, value /test)
public class TestServlet extends HttpServlet {Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {ServletContext servletContext request.getServletContext();WebApplicationContext spring WebApplicationContextUtils.getWebApplicationContext(servletContext);System.out.println(spring.getBean(user));}
}知识要点
Spring集成web环境步骤
①配置ContextLoaderListener监听器 ②使用WebApplicationContextUtils获得应用上下文 ③spring-web提供的监听器spring-webmvc页提供同时使用会冲突
1.2 SpringMVC的简介
1.2.1 SpringMVC概述
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架属于SpringFrameWork 的后续产品已经融合在 Spring Web Flow 中。
SpringMVC 已经成为目前最主流的MVC框架之一并且随着Spring3.0 的发布全面超越 Struts2成为最优秀的 MVC 框架。它通过一套注解让一个简单的 Java 类成为处理请求的控制器而无须实现任何接口。同时它还支持 RESTful 编程风格的请求。
通过属性java类交由spring容器管理通过注解定义url实现对应的方法执行简化了servlet定义与书写
1.2.2 SpringMVC简单实现
使用servlet进行控制层处理每一个请求都需要书写一个servlet每个servlet只修改处理请求的方法与名称其余没有修改springMVC可以看做提供了一个中央控制器对这些servlet进行统一的分发管理并简化servlet的书写
①将所有的方法书写在一个java类中 并书写相应地址映射
import java.util.HashMap;//将所有需要执行的方法书写在当前类中
public class AllController {HashMapString,String mapnew HashMap();public void a(){System.out.println(a方法执行);}public void b(){System.out.println(b方法执行);}
}
②书写核心控制器应该是处理所有请求的servlet
WebServlet(/*)
public class AllServlet extends HttpServlet {AllController allControllernew AllController();Overridepublic void init() throws ServletException {HashMapString, String map allController.map;map.put(/day0924/a,a);map.put(/day0924/b,b);}Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//获取实际请求的uriString requestURI request.getRequestURI();System.out.println(requestURI:requestURI);HashMapString, String map allController.map;String methodName map.get(requestURI);//通过反射调用对应方法ClassAllController allControllerClass AllController.class;try {Method declaredMethod allControllerClass.getDeclaredMethod(methodName);//执行对应方法declaredMethod.invoke(allController);} catch (Exception e) {}}
}1.2.3 SpringMVC快速入门
需求客户端发起请求服务器端接收请求执行逻辑并进行视图跳转。
开发步骤
①导入SpringMVC相关坐标
②配置SpringMVC核心控制器DispathcerServlet
③创建Controller类和视图页面
④使用注解配置Controller类中业务方法的映射地址
⑤配置SpringMVC核心文件 spring-mvc.xml
⑥客户端发起请求测试
代码实现
①导入Spring和SpringMVC的坐标、导入Servlet和Jsp的坐标 !--Spring坐标--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.0.8.RELEASE/version/dependency!--SpringMVC坐标--dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.0.8.RELEASE/version/dependency!--Jsp坐标--dependencygroupIdjavax.servlet.jsp/groupIdartifactIdjsp-api/artifactIdversion2.0/version/dependency!-- Servlet坐标 --dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion3.1.0/version/dependency②在web.xml配置SpringMVC的核心控制器与spring加载监听器
!DOCTYPE web-app PUBLIC-//Sun Microsystems, Inc.//DTD Web Application 2.3//ENhttp://java.sun.com/dtd/web-app_2_3.dtd web-appdisplay-nameArchetype Created Web Application/display-name!-- 配置springmvc前端控制器 --servletservlet-namespringmvc/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring-mvc.xml/param-value/init-param/servletservlet-mappingservlet-namespringmvc/servlet-nameurl-pattern*.do/url-pattern/servlet-mapping
/web-app
③创建Controller和业务方法
public class UserController {public ModelAndView select(ModelAndView mv,HttpServletRequest request){request.setAttribute(msg,查找返回的数据);mv.setViewName(/index.jsp);return mv;}public String update(ModelAndView mv,HttpServletRequest request){request.setAttribute(msg,更新返回的数据);return /index.jsp;}
}③创建视图页面index.jsp
html
bodyh2Hello SpringMVC!/h2${msg}
/body
/html④配置注解
Controller
RequestMapping(/user)
public class UserController {RequestMapping(/select.do)public ModelAndView select(ModelAndView mv,HttpServletRequest request){request.setAttribute(msg,查找返回的数据);mv.setViewName(/index.jsp);return mv;}RequestMapping(/update.do)public String update(ModelAndView mv,HttpServletRequest request){request.setAttribute(msg,更新返回的数据);return /index.jsp;}
}⑤创建spring-mvc.xml
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:mvchttp://www.springframework.org/schema/mvcxmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocationhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd!--配置注解扫描--context:component-scan base-packagecom.yunhe.controller/
/beans二、SpringMVC常用功能与使用
2.1 SpringMVC的执行流程 ①用户发送请求至前端控制器DispatcherServlet。 ②DispatcherServlet收到请求调用HandlerMapping处理器映射器。 ③处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找)生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。 ④DispatcherServlet调用HandlerAdapter处理器适配器。 ⑤HandlerAdapter经过适配调用具体的处理器(Controller也叫后端控制器)。 ⑥Controller执行完成返回ModelAndView。 ⑦HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet。 ⑧DispatcherServlet将ModelAndView传给ViewReslover视图解析器。 ⑨ViewReslover解析后返回具体View。 ⑩DispatcherServlet根据View进行渲染视图即将模型数据填充至视图中。DispatcherServlet响应用户。
2.1.1 SpringMVC组件解析 前端控制器DispatcherServlet 用户请求到达前端控制器它就相当于 MVC 模式中的 CDispatcherServlet 是整个流程控制的中心由它调用其它组件处理用户的请求DispatcherServlet 的存在降低了组件之间的耦合性。 处理器映射器HandlerMapping HandlerMapping 负责根据用户请求找到 Handler 即处理器SpringMVC 提供了不同的映射器实现不同的映射方式例如配置文件方式实现接口方式注解方式等。 处理器适配器HandlerAdapter
通过 HandlerAdapter 对处理器进行执行这是适配器模式的应用通过扩展适配器可以对更多类型的处理器进行执行。 处理器Handler 它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由Handler 对具体的用户请求进行处理。 视图解析器View Resolver View Resolver 负责将处理结果生成 View 视图View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址再生成 View 视图对象最后对 View 进行渲染将处理结果通过页面展示给用户。 视图View SpringMVC 框架提供了很多的 View 视图类型的支持包括jstlView、freemarkerView、pdfView等。最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户需要由程序员根据业务需求开发具体的页面
2.1.2 SpringMVC注解解析
RequestMapping 作用用于建立请求 URL 和处理请求方法之间的对应关系 位置 类上请求URL 的第一级访问目录。此处不写的话就相当于应用的根目录 方法上请求 URL 的第二级访问目录与类上的使用ReqquestMapping标注的一级目录一起组成访问虚拟路径
属性 value用于指定请求的URL。它和path属性的作用是一样的 method用于指定请求的方式 params用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的key和value必须和配置的一模一样
例如 params {“accountName”}表示请求参数必须有accountName params {“moeny!100”}表示请求参数中money不能是100
2.1.3 SpringMVC的XML配置解析
mvc命名空间引入
命名空间xmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvc
约束地址http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd组件扫描
SpringMVC基于Spring容器所以在进行SpringMVC操作时需要将Controller存储到Spring容器中如果使用Controller注解标注的话就需要使用context:component-scan base-package“com.yh.controller/进行组件扫描。 SpringMVC有默认组件配置默认组件都是DispatcherServlet.properties配置文件中配置的该配置文件地址org/springframework/web/servlet/DispatcherServlet.properties该文件中配置了默认的视图解析器如下
org.springframework.web.servlet.ViewResolverorg.springframework.web.servlet.view.InternalResourceViewResolver翻看该解析器源码可以看到该解析器的默认设置如下
REDIRECT_URL_PREFIX redirect: --重定向前缀
FORWARD_URL_PREFIX forward: --转发前缀默认值
prefix ; --视图名称前缀
suffix ; --视图名称后缀视图解析器 我们可以通过属性注入的方式修改视图的的前后缀
!--配置内部资源视图解析器--
bean classorg.springframework.web.servlet.view.InternalResourceViewResolverproperty nameprefix value/WEB-INF/views//propertyproperty namesuffix value.jsp/property
/bean2.2 SpringMVC的数据响应
数据响应方式
1) 页面跳转 ①直接返回字符串 ②通过ModelAndView(HttpServletRequest)对象返回
2 回写数据 ①直接返回字符串 ②返回对象或集合
页面跳转-返回字符串形式
第一种形式
这种方式进行页面跳转一般与HttpServletRequest对象一起使用,在参数列表中声明,将数据存储至作用域中进行传递
第二种形式
RequestMapping(value/quick4)public String save4(Model model){model.addAttribute(username,二狗子);return success;}这种方式同样会进行页面跳转,但是数据传递使用model对象,model对象的使用方式与HttpServletRequest类似,可以在jsp中使用el表达式通过key进行获取
页面跳转-通过ModelAndView对象返回
在Controller中方法返回ModelAndView对象并且设置视图名称
RequestMapping(value/quick2)public ModelAndView save2(){/*Model:模型 作用封装数据View视图 作用展示数据*/ModelAndView modelAndView new ModelAndView();//设置模型数据modelAndView.addObject(username,二狗子);//设置视图名称modelAndView.setViewName(success);return modelAndView;}这种方法就是直接将返回的视图与数据一同交由视图解析器进行自动处理
当然也可以不创建ModelAndView对象而是在方法中声明,在Controller中方法形参上直接声明ModelAndView无需在方法中自己创建在方法中直接使用该对象设置视图同样可以跳转页面 RequestMapping(value/quick3)public ModelAndView save3(ModelAndView modelAndView){modelAndView.addObject(username,华华);modelAndView.setViewName(success);return modelAndView;}回写数据-直接返回字符串
通过SpringMVC框架注入的response对象使用response.getWriter().print(“hello world”) 回写数据此时不需要视图跳转业务方法返回值为void将需要回写的字符串直接返回但此时需要通过ResponseBody注解告知SpringMVC框架通知视图解析器方法返回的字符串不是跳转是直接在http响应体中返回
RequestMapping(value/quick7)ResponseBody //告知SpringMVC框架 不进行视图跳转 直接进行数据响应public String save7() throws IOException {return hello yh;}RequestMapping(value/quick6)public void save6(HttpServletResponse response) throws IOException {response.getWriter().print(hello yh);}json字符串也是字符串,所以也可以通过这种方式返回json字符串数据
RequestMapping(value/quick8)ResponseBodypublic String save8() throws IOException {return {\username\:\zhangsan\,\age\:18};}手动拼接json格式字符串的方式很麻烦开发中往往要将复杂的java对象转换成json格式的字符串我们可以使用web阶段学习过的json转换工具类进行转换后回写字符串(一般不用手动转换的方式)
回写数据-返回对象或集合
通过SpringMVC帮助我们对对象或集合进行json字符串的转换并回写为处理器适配器配置消息转换参数指定使用jackson进行对象或集合的转换因此需要在spring-mvc.xml中进行如下配置
bean classorg.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapterproperty namemessageConverterslistbean classorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter//list/property/beanRequestMapping(value/quick10)ResponseBody//期望SpringMVC自动将User转换成json格式的字符串public User save10() throws IOException {User user new User();user.setUsername(张三);user.setAge(18);return user;}这样配置还是比较麻烦配置的代码比较多因此我们可以使用mvc的注解驱动代替上述配置
mvc:annotation-driven/在 SpringMVC 的各个组件中处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。 使用mvc:annotation-driven /自动加载 RequestMappingHandlerMapping处理映射器和RequestMappingHandlerAdapter 处 理 适 配 器 可用在Spring-xml.xml配置文件中使用mvc:annotation-driven /替代注解处理器和适配器的配置。同时使用mvc:annotation-driven /默认底层就会集成jackson进行对象或集合的json格式字符串的转换
2.3 SpringMVC的数据请求
客户端请求参数的格式是namevaluenamevalue…… 服务器端要获得请求的参数有时还需要进行数据的封装SpringMVC可以接收如下类型的参数 ①基本类型参数 ②类类型参数 ③数组类型参数 ④集合类型参数
2.3.1 基本类型参数的获取
springmvc会自动进行解析,只需要在controller中的业务方法的参数名称与请求参数的name一致参数值会自动映射匹配。并且能自动做类型转换 自动的类型转换是指从String向其他类型的转换(注意类型转换失败的情况)
RequestMapping(value/quick11)ResponseBodypublic void save11(String username,int age){System.out.println(username);System.out.println(age);}Controller中的业务方法的POJO参数的属性名与请求参数的name一致参数值会自动映射匹配。
当然也可以手动的进行配置获取请求指定的参数,使用RequestParam注解 RequestParam有以下三个参数 value参数名字即入参的请求参数名字如username表示请求的参数区中的名字为username的参数的值将传入 required是否必须默认是true表示请求中一定要有相应的参数否则将抛出异常 defaultValue默认值表示如果请求中没有同名参数时的默认值设置该参数时自动将required设为false。
public String requestparam(RequestParam(valueusername,requiredfalse) String username)2.3.2 类类型参数的获取
package com.yunhe.pojo;
public class User {private String username;private int age;public String getUsername() {return username;}public void setUsername(String username) {this.username username;}public int getAge() {return age;}public void setAge(int age) {this.age age;}Overridepublic String toString() {return User{ username username \ , age age };}
}
RequestMapping(value/quick12)ResponseBodypublic void save12(User user){System.out.println(user);}2.3.3 数组类型参数的获取
在前台页面提交的数据中,多个数据name相同,springmvc会自动解析成数组,但要求controller中的业务方法数组名称与请求参数的name一致参数值会自动映射匹配。
RequestMapping(value/quick13)ResponseBodypublic void save13(String[] strs) throws IOException {System.out.println(Arrays.asList(strs));}
2.3.4 集合类型参数的获取
springmvc会自动将对个name相同的数据解析为数组,所以在进行集合获取时需要将集合参数包装到一个POJO中才可以。
form action${pageContext.request.contextPath}/user/quick14 methodpost%--表明是第一个User对象的username age--%input typetext nameuserList[0].usernamebr/input typetext nameuserList[0].agebr/input typetext nameuserList[1].usernamebr/input typetext nameuserList[1].agebr/input typesubmit value提交/form
package com.yh.domain;import java.util.List;public class VO {private ListUser userList;public ListUser getUserList() {return userList;}public void setUserList(ListUser userList) {this.userList userList;}Overridepublic String toString() {return VO{ userList userList };}
}
RequestMapping(value/quick14)ResponseBodypublic void save14(VO vo) throws IOException {System.out.println(vo);}
这种使用方式太过繁琐,对于不同的pojo类需要创建对应的集合类
使用ajax提交json数据获取集合类型参数数据
当使用ajax提交时可以指定contentType为json形式那么在方法参数位置使用RequestBody可以直接接收集合数据而无需使用POJO进行包装
script src${pageContext.request.contextPath}/js/jquery-3.3.1.js/scriptscriptvar userList new Array();userList.push({username:zhangsan,age:18});userList.push({username:lisi,age:28});$.ajax({type:POST,url:${pageContext.request.contextPath}/user/quick15,data:JSON.stringify(userList),contentType:application/json;charsetutf-8});/script
RequestMapping(value/quick15)ResponseBodypublic void save15(RequestBody ListUser userList) throws IOException {System.out.println(userList);}
2.4 SpringMVC静态资源的访问
当有静态资源需要加载时比如jquery文件通过谷歌开发者工具抓包发现没有加载到jquery文件原因是SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是/,代表对所有的资源都进行过滤操作我们可以通过以下两种方式指定放行静态资源
•在spring-mvc.xml配置文件中指定放行的资源
mvc:resources mapping/js/**location/js//
•使用mvc:default-servlet-handler/标签
!--开发资源的访问--!--mvc:resources mapping/js/** location/js//mvc:resources mapping/img/** location/img//--mvc:default-servlet-handler/
2.5 SpringMVC配置编码过滤器
使用springmvc与servlet一样,当编码不一致时会出现乱码问题,springmvc提供了CharacterEncodingFilter全局过滤器进行全局的编码配置
!--配置全局过滤的filter--filterfilter-nameCharacterEncodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-param/filterfilter-mappingfilter-nameCharacterEncodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping
2.6 SpringMVC配置参数绑定
当请求的参数名称与Controller的业务方法参数名称不一致时就需要通过RequestParam注解显式的绑定
form action${pageContext.request.contextPath}/quick16 methodpostinput typetext namenamebrinput typesubmit value提交br
/form
RequestMapping(value/quick16)ResponseBodypublic void save16(RequestParam(valuename,required false,defaultValue yh) String username) throws IOException {System.out.println(username);}
属性: value :页面数据的name required :是否必填(如果页面没有传递则报错默认为false) defaultValue :默认值,当页面没有传递数据时的赋值(默认为数据 类型默认值)
2.7 SpringMVC配置请求类型转换器
SpringMVC 默认已经提供了一些常用的类型转换器例如客户端提交的字符串转换成int型进行参数设置。 但是不是所有的数据类型都提供了转换器没有提供的就需要自定义转换器例如日期类型的数据就需要自定义转换器。
component
public class DateConverter implements ConverterString, Date {public Date convert(String dateStr) {//将日期字符串转换成日期对象 返回SimpleDateFormat format new SimpleDateFormat(yyyy-MM-dd);Date date null;try {date format.parse(dateStr);} catch (ParseException e) {e.printStackTrace();}return date;}
}
RequestMapping(value/quick18)ResponseBodypublic void save18(Date date) throws IOException {System.out.println(date);} mvc:annotation-driven conversion-serviceconversionService/bean idconversionService classorg.springframework.context.support.ConversionServiceFactoryBeanproperty nameconverterssetref beandateConverter//set/property/bean
2.8 请求头信息信息的获取
使用RequestHeader可以获得请求头信息相当于web阶段学习的request.getHeader(name) RequestHeader注解的属性如下 value请求头的名称 required是否必须携带此请求头
RequestMapping(value/quick20)ResponseBodypublic void save20(RequestHeader(value User-Agent,required false) String user_agent) throws IOException {System.out.println(user_agent);}
2.9 请求头cookie数据的获取
使用CookieValue可以获得指定Cookie的值 CookieValue注解的属性如下 value指定cookie的名称 required是否必须携带此cookie RequestMapping(value/quick21)ResponseBodypublic void save21(CookieValue(value JSESSIONID) String jsessionId) throws IOException {System.out.println(jsessionId);}
三、SpringMVC使用RESTful风格参数的获取
Restful是一种软件架构风格、设计风格而不是标准只是提供了一组设计原则和约束条件。主要用于客户端和服务器交互类的软件基于这个风格设计的软件可以更简洁更有层次更易于实现缓存机制等。
Restful风格的请求是使用“url请求方式”表示一次请求目的的HTTP 协议里面四个表示操作方式的动词如下 GET用于获取资源 POST用于新建资源 PUT用于更新资源 DELETE用于删除资源
例如 /user/1 GET 得到 id 1 的 user /user/1 DELETE 删除 id 1 的 user /user/1 PUT 更新 id 1 的 user /user POST 新增 user
上述url地址/user/1中的1就是要获得的请求参数form表单提交数据的方式支持get与post,但是在SpringMVC中可以使用占位符进行参数绑定。地址/user/1可以写成/user/{id}占位符{id}对应的就是1的值。在业务方法中我们可以使用PathVariable注解进行占位符的匹配获取工作。
http://localhost:8080/springmvc1/quick17/zhangsan
RequestMapping(value/quick17/{name})
ResponseBodypublic void save17(PathVariable(valuename) String username) throws IOException {System.out.println(username);}
springmvc使用RESTful风格就是使用占位符的形式,将数据与地址进行绑定,通过PathVariable注解进行获取,完成通过对不同路径请求完成类似功能的需求 使用axios发送不同的请求
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/titlescript srcjs/axios.min.js/script
/head
bodybutton idbtn1GET请求/buttonbutton idbtn2POST请求/buttonbutton idbtn3PUT请求/buttonbutton idbtn4DELETE请求/button
/body
scriptdocument.getElementById(btn1).onclickfunction (){var obj{};axios({// 请求方式method: get,url: user/1,// 传递参数 data使用流发送数据 params台servlet可以直接获取data: obj,//响应的数据格式 默认就是json 可以省略responseType: text}).then(response {// 请求成功let res response.data;console.log(res);}).catch(error {// 请求失败console.log(error);// 一般不用});}document.getElementById(btn2).onclickfunction (){var obj{id:2,name:张三};axios({// 请求方式method: post,url: user,// 传递参数 data使用流发送数据 params台servlet可以直接获取data: obj,//响应的数据格式 默认就是json 可以省略responseType: json}).then(response {// 请求成功let res response.data;console.log(res);}).catch(error {// 请求失败console.log(error);// 一般不用});}document.getElementById(btn3).onclickfunction (){var obj{id:2,name:张三2};axios({// 请求方式method: put,url: user,// 传递参数 data使用流发送数据 params台servlet可以直接获取data: obj,//响应的数据格式 默认就是json 可以省略responseType: json}).then(response {// 请求成功let res response.data;console.log(res);}).catch(error {// 请求失败console.log(error);// 一般不用});}document.getElementById(btn4).onclickfunction (){var obj{};axios({// 请求方式method: delete,url: user/4,// 传递参数 data使用流发送数据 params台servlet可以直接获取data: obj,//响应的数据格式 默认就是json 可以省略responseType: text}).then(response {// 请求成功let res response.data;console.log(res);}).catch(error {// 请求失败console.log(error);// 一般不用});}
/script
/html
四、SpringMVC拦截器简单使用
4.1 概念
SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter用于对处理器进行预处理和后处理。 1过滤器
依赖于servlet容器。在实现上基于函数回调可以对几乎所有请求进行过滤但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作比如在过滤器中修改字符编码在过滤器中修改HttpServletRequest的一些参数包括过滤低俗文字、危险字符等。
2拦截器
依赖于web框架在实现上基于Java的反射机制属于面向切面编程AOP的一种运用。由于拦截器是基于web框架的调用因此可以使用Spring的依赖注入DI进行一些业务操作同时一个拦截器实例在一个controller生命周期之内可以多次调用。
1、常见应用场景
1日志记录记录请求信息的日志以便进行信息监控、信息统计、计算PVPage View等。
2权限检查如登录检测进入处理器检测是否登录如果没有直接返回到登录页面
3性能监控有时候系统在某段时间莫名其妙的慢可以通过拦截器在进入处理器之前记录开始时间在处理完后记录结束时间从而得到该请求的处理时间如果有反向代理如apache可以自动记录
4通用行为读取cookie得到用户信息并将用户对象放入请求从而方便后续流程使用还有如提取Locale、Theme信息等只要是多个Controller中的处理方法都需要的我们就可以使用拦截器实现。
5OpenSessionInView如Hibernate在进入处理器打开Session在完成后关闭Session。
…………本质也是AOP面向切面编程也就是说符合横切关注点的所有功能都可以放入拦截器实现。
SpringMVC提供的拦截器接口HandlerInterceptor
public interface HandlerInterceptor {boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception;void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception;void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception;
}
拦截器一个有3个回调方法而一般的过滤器Filter才两个:
preHandle预处理回调方法实现处理器的预处理如登录检查第三个参数为响应的处理器返回值true表示继续流程如调用下一个拦截器或处理器false表示流程中断如登录检查失败不会继续调用其他的拦截器或处理器此时我们需要通过response来产生响应
postHandle后处理回调方法实现处理器的后处理但在渲染视图之前此时我们可以通过modelAndView模型和视图对象对模型数据进行处理或对视图进行处理modelAndView也可能为null。
afterCompletion整个请求处理完毕回调方法即在视图渲染完毕时回调如性能监控中我们可以在此记录结束时间并输出消耗时间还可以进行一些资源清理类似于try-catch-finally中的finally但仅调用处理器执行链中preHandle返回true的拦截器才会执行afterCompletion。
拦截器适配器HandlerInterceptorAdapter
有时我们可能只需要实现三个回调方法中的某一个如果实现HandlerInterceptor接口的话三个方法必须实现此时spring提供了一个HandlerInterceptorAdapter适配器一种适配器设计模式的实现允许我们只实现需要的回调方法
public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {return true;}public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)throws Exception {}public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {}public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {}
}
4.2 简单使用
①自定义两个拦截器继承拦截器适配器HandlerInterceptorAdapterHandlerInterceptor1 和 HandlerInterceptor2
public class HandlerInterceptor1 extends HandlerInterceptorAdapter{Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {System.out.println(--1--HandlerInterceptor1.preHandle);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {System.out.println(--1--HandlerInterceptor1.postHandle);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception {System.out.println(--1--HandlerInterceptor1.afterCompletion);}
}
②在 springmvc.xml 配置文件中配置拦截器 (1)拦截所有Controller类里的所有处理方法 !-- 配置拦截器--mvc:interceptors!-- 会拦截所有Controller类里的所有处理方法 --bean classcom.yunhe.interceptor.HandlerInterceptor1/beanbean classcom.yunhe.interceptor.HandlerInterceptor2/bean/mvc:interceptors
2只拦截某个请求路径的处理方法 !-- 配置拦截器--mvc:interceptors!-- 会拦截所有Controller类里的所有处理方法 --bean classcom.yunhe.interceptor.HandlerInterceptor1/beanmvc:interceptor!-- 只拦截该路径 --mvc:mapping path/users/bean classcom.yunhe.interceptor.HandlerInterceptor2/bean/mvc:interceptor/mvc:interceptors
(3)拦截器深入配置注意 /** (任意分层路径下) /* (该任意单路径下) 和 配置順序先所有后排除 !-- 配置拦截器--mvc:interceptors!-- 会拦截所有Controller类里的所有处理方法 --bean classcom.yunhe.interceptor.HandlerInterceptor1/beanmvc:interceptor!-- 只拦截该路径 --mvc:mapping path/users/bean classcom.yunhe.interceptor.HandlerInterceptor2/bean/mvc:interceptormvc:interceptor!-- 拦截所有请求排除拦截 /toAdd 请求 --mvc:mapping path/**/mvc:exclude-mapping path/toAdd/bean classcom.yunhe.interceptor.HandlerInterceptor3/bean/mvc:interceptor/mvc:interceptors
# 五、SSM整合项目创建
①导入相应的依赖坐标 !-- spring核心依赖坐标 --dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.3.5/version/dependency!-- springaop织入依赖 --dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.9.6/version/dependency!-- lombok工具依赖 --dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.2/version/dependency!-- spring jdbc依赖 --dependencygroupIdorg.springframework/groupIdartifactIdspring-jdbc/artifactIdversion5.3.5/version/dependency!-- mysql依赖--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.39/version/dependency!-- Druid连接池 --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.10/version/dependency!-- springmvc依赖 --dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.5/version/dependency!-- servlet依赖 --dependencygroupIdjavax.servlet/groupIdartifactIdservlet-api/artifactIdversion2.5/version/dependency!-- jsp依赖 --dependencygroupIdjavax.servlet.jsp/groupIdartifactIdjsp-api/artifactIdversion2.0/version/dependency!-- jackson依赖 --dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.9.0/version/dependency!-- mybatis依赖 --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.6/version/dependency!-- mybatis sping整合依赖--dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion2.0.6/version/dependency!--log4j依赖--dependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.17/version/dependency②创建相应的包 ③书写mybatis核心配置文件
?xml version1.0 encodingUTF-8 ?
!DOCTYPE configurationPUBLIC -//mybatis.org//DTD Config 3.0//ENhttp://mybatis.org/dtd/mybatis-3-config.dtd
configuration!-- 加载properties配置文件 --!--properties url/properties--!-- 为指定的包下的类设置别名设置pojo 使用首字母小写形式的别名 --!--typeAliasespackage name//typeAliases--!-- 配置mybatis数据源选择操作 --!--environments defaultenvironment idtransactionManager type/transactionManagerdataSource type/dataSource/environment/environments--!-- mybatis的全局配置 基本使用默认 其他可以通过mapper配置文件进行设置 --settingssetting namelazyLoadingEnabled valuetrue/!-- 开启懒加载 --setting nameaggressiveLazyLoading valuefalse/!-- 设置懒加载侵入方式 --setting namelogImpl valueSTDOUT_LOGGING/!-- 使用mybatis 自带的日志管理 --/settings!-- 配置mybatis扫描xml文件所在的包 --!--mapperspackage name//mappers--/configuration④书写log4j与数据连接配置文件
db.properties
jdbc.drivercom.mysql.jdbc.Driver
jdbc.urljdbc:mysql://localhost:3306/mydb?characterEncodingUTF-8
jdbc.usernameroot
jdbc.passwordrootlog4j.properties
# Global logging configuration
log4j.rootLoggerDEBUG, stdout
# MyBatis logging configuration...
log4j.logger.org.mybatis.example.BlogMapperTRACE
# Console output...
log4j.appender.stdoutorg.apache.log4j.ConsoleAppender
log4j.appender.stdout.layoutorg.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern%5p [%t] - %m%n⑤配置spring相关核心配置文件
?xml version1.0 encodingUTF-8 ?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:txhttp://www.springframework.org/schema/txxmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttps://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd!-- spring组件扫描 --!-- 将含有对应注解的类交由spring管理 可以实现IOC与DI AOP也必须切入由spring管理的类 --context:component-scan base-packagecom.yunhe/!-- 加载properties --!-- 可以在当前的配置文件中使用${key}的形式获取对应的value值 --context:property-placeholder locationclasspath:db.properties/!-- 配置数据源 --!-- 使用指定的连接池对数据源进行管理 --bean iddataSource classcom.alibaba.druid.pool.DruidDataSourceproperty namedriverClassName value${jdbc.driver}/property nameurl value${jdbc.url}/property nameusername value${jdbc.username}/property namepassword value${jdbc.password}//bean!-- 配置spring与mybatis整合 --!-- 配置SqlSessionFactoryBean对象整合加载mybatis配置文件 使用mybatis进行数据源操作 --bean idsqlSessionFactory classorg.mybatis.spring.SqlSessionFactoryBean!-- 将数据源交由mybatis进行管理 --property namedataSource refdataSource/!-- 配置mybatis配置文件 --!-- 加载mybatis核心配置文件进行修改时 --property nameconfigLocation valueclasspath:mybatis.xml/!-- 配置mapper映射文件 --!-- 在创建mybatis时加载所有的mapper.xml --property namemapperLocations valueclasspath:mapper/*.xml//bean!-- mybatis.spring自动映射DAO接口所在包名Spring会自动查找其下的类 --!-- 根据加载的mapper.xml创建相应的实现类 并交由spring容器管理 --bean classorg.mybatis.spring.mapper.MapperScannerConfigurerproperty namebasePackage valuecom.yunhe.mapper //bean!--平台事务管理器--!-- 创建相应的事务代理对象交由spring容器管理 --bean idtransactionManager classorg.springframework.jdbc.datasource.DataSourceTransactionManagerproperty namedataSource refdataSource/property/bean!-- 开启事务的注解驱动 --!-- 将拥有事务处理的方法进行事务代理 --tx:annotation-driven transaction-managertransactionManager/!-- 设置aop织入自动代理 --!-- 才会将相应的切面类织入指定的切入点方法 --aop:aspectj-autoproxy/!-- springmvc视图解析器 --!-- 在controller返回的视图名进行拼接返回对应视图 --!-- 如果需要使用其他的视图模板或插件也是在视图解析器进行配置 --bean classorg.springframework.web.servlet.view.InternalResourceViewResolverproperty nameprefix value/WEB-INF/view//propertyproperty namesuffix value.jsp/property/bean!-- 开启springmvc注解驱动 --mvc:annotation-driven/!-- 开启静态资源默认过滤 --mvc:default-servlet-handler/!-- 指定静态资源过滤 --!--mvc:resources mapping location/mvc:resources--/beans⑥配置web.xml
!DOCTYPE web-app PUBLIC-//Sun Microsystems, Inc.//DTD Web Application 2.3//ENhttp://java.sun.com/dtd/web-app_2_3.dtd web-appdisplay-nameArchetype Created Web Application/display-name!-- springmvc编码控制器 --filterfilter-nameEncoding/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-class/filterfilter-mappingfilter-nameEncoding/filter-nameurl-pattern*/url-pattern/filter-mapping!-- springmvc前端控制器 --servletservlet-namemvc/servlet-nameservlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-classinit-paramparam-namecontextConfigLocation/param-nameparam-valueclasspath:spring.xml/param-value/init-param/servletservlet-mappingservlet-namemvc/servlet-nameurl-pattern//url-pattern/servlet-mapping/web-app
⑦书写相应的代码测试ssm整合是否成功
User.java
Data
AllArgsConstructor
NoArgsConstructor
public class User {private int uid;private String uusername;private String upassword;
}UserMapper.java
public interface UserMapper {ArrayListUser selectAll();
}UserMapper.xml
?xml version1.0 encodingUTF-8?
!DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd
mapper namespacecom.yunhe.mapper.UserMapperselect idselectAll resultTypecom.yunhe.pojo.Userselect * from user/select/mapperUserService.java
public interface UserService {public ArrayListUser findAll();
}UserServiceImpl.java
Service
public class UserServiceImpl implements UserService {Autowiredprivate UserMapper userMapper;Overridepublic ArrayListUser findAll() {return userMapper.selectAll();}
}UserController.java
Controller
public class UserController {Autowiredprivate UserService userServiceImpl;RequestMapping(/all)public String find(HttpServletRequest request){request.setAttribute(msg,userServiceImpl.findAll());return success;}
}success.jsp
% page contentTypetext/html;charsetUTF-8 languagejava isELIgnoredfalse %
html
headtitleTitle/title
/head
body
${msg}
/body
/htmlUserController.java
Controller
public class UserController {Autowiredprivate UserService userServiceImpl;RequestMapping(/all)public String find(HttpServletRequest request){request.setAttribute(msg,userServiceImpl.findAll());return success;}
}success.jsp
% page contentTypetext/html;charsetUTF-8 languagejava isELIgnoredfalse %
html
headtitleTitle/title
/head
body
${msg}
/body
/htmlselect idselectAll resultTypecom.yunhe.pojo.Userselect * from user
/selectUserService.java
public interface UserService {public ArrayListUser findAll();
}UserServiceImpl.java
Service
public class UserServiceImpl implements UserService {Autowiredprivate UserMapper userMapper;Overridepublic ArrayListUser findAll() {return userMapper.selectAll();}
}UserController.java
Controller
public class UserController {Autowiredprivate UserService userServiceImpl;RequestMapping(/all)public String find(HttpServletRequest request){request.setAttribute(msg,userServiceImpl.findAll());return success;}
}success.jsp
% page contentTypetext/html;charsetUTF-8 languagejava isELIgnoredfalse %
html
headtitleTitle/title
/head
body
${msg}
/body
/htmlUserController.java
Controller
public class UserController {Autowiredprivate UserService userServiceImpl;RequestMapping(/all)public String find(HttpServletRequest request){request.setAttribute(msg,userServiceImpl.findAll());return success;}
}success.jsp
% page contentTypetext/html;charsetUTF-8 languagejava isELIgnoredfalse %
html
headtitleTitle/title
/head
body
${msg}
/body
/html