服装网站项目的设计方案,wordpress图文直播插件,盗版视频网站怎么做,开源模板网站五、Rest风格编程
#xff08;一#xff09;Rest风格URL规范介绍
1、什么是restful RESTful架构#xff0c;就是目前最流行的一种互联网软件架构风格。它结构清晰、符合标准、易于理解、扩展方便#xff0c;所以正得到越来越多网站的采用。REST这个词#xff0c;是Roy T…五、Rest风格编程
一Rest风格URL规范介绍
1、什么是restful RESTful架构就是目前最流行的一种互联网软件架构风格。它结构清晰、符合标准、易于理解、扩展方便所以正得到越来越多网站的采用。REST这个词是Roy Thomas Fielding在他2000年的博士论文中提出的. Fielding将他对互联网软件的架构原则定名为REST即Representational State Transfer的缩写。即表现层状态转化。如果一个架构符合REST原则就称它为RESTful架构。值得注意的是 REST 并没有一个明确的标准而更像是一种设计的格。 它本身并没有什么实用性其核心价值在于如何设计出符合 REST 风格的网络接口。
2、restful的优点 它结构清晰、符合标准、易于理解、扩展方便所以正得到越来越多网站的采用。
3、restful 的特性
1资源Resources 网络上的一个实体或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务总之就是一个具体的存在。可以用一个 URI统一资源定位符指向它每种资源对应一个特定的 URI 。要获取这个资源访问它的 URI 就可以因此 URI 即为每一个资源的独一无二的识别符。
2表现层Representation 把资源具体呈现出来的形式叫做它的表现层 Representation。比如文本可以用 txt 格式表现也可以用 HTML 格式、XML 格式、JSON 格式表现甚至可以采用二进制格式。
3状态转化State Transfer 每发出一个请求就代表了客户端和服务器的一次交互过程。HTTP 协议是一个无状态协议即所有的状态都保存在服务器端。因此如果客户端想要操作服务器必须通过某种手段让服务器端发生“状态转化”State Transfer。而这种转化是建立在表现层之上的所以就是“表现层状态转化”。具体说就是 HTTP 协议里面四个表示操作方式的动词GET 、POST 、PUT、DELETE。它们分别对应四种基本操作GET 用来获取资源POST 用来新建资源PUT 用来更新资源DELETE 用来删除资源。
4传统请求url 新增http://localhost:8888/annotation/addPerson POST 修改http://localhost:8888/annotation/updatePerson POST 删除http://localhost:8888/annotation/deletePerson?id1 GET 查询http://localhost:8888/annotation/findPerson?id1 GET
4REST风格请求 新增http://localhost:8888/annotation/person POST 修改http://localhost:8888/annotation/person PUT 删除http://localhost:8888/annotation/person/1 DELETE 查询http://localhost:8888/annotation/person/1 GET
二PathVariable注解详解 该注解用于绑定 url 中的占位符。例如请求 url 中/annotation/test9/{id}这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。是springmvc 支持 rest 风格 URL 的一个重要标志。 属性 value用于指定 url 中占位符名称。 required是否必须提供占位符。
三PathVariable案例
1、构建页面发起请求
REST风格编程
增删改查
h2REST风格编程/h2
br
新增:
form actionperson methodpostname :input typetext namenamebrage :input typetext nameagebrinput typesubmit value提交
/form
br修改:
form actionperson methodpostinput typehidden name_method valueputname :input typetext namenamebrage :input typetext nameagebrinput typesubmit value提交
/form
br
删除:
form actionperson/1 methodpostinput typehidden name_method valuedeleteinput typesubmit value提交
/form
br
查询:
a hrefperson/1查询/a
2、定义控制层执行器处理请求 //测试添加RequestMapping(value user, method RequestMethod.POST)public String addUser(String name,int age){System.out.println(新增用户: name\tage);return RequestSuccessful;}//测试修改RequestMapping(value user, method RequestMethod.PUT)public String updateUser(String name,int age){System.out.println(修改用户: name\tage);return RequestSuccessful;}//测试删除RequestMapping(value user/{id}, method RequestMethod.DELETE)public String deleteUser(PathVariable(value id)int id){System.out.println(删除用户: id);return RequestSuccessful;}//查询用户RequestMapping(value user/{id}, method RequestMethod.GET)public String getUser(PathVariable(value id)int id){System.out.println(查询用户: id);return RequestSuccessful;} 3.测试出现错误
4.引入请求方式转换过滤器
filterfilter-namehiddenHttpMethodFilter/filter-namefilter-classorg.springframework.web.filter.HiddenHttpMethodFilter/filter-class/filter
filter-mappingfilter-namehiddenHttpMethodFilter/filter-nameurl-pattern/*/url-pattern
/filter-mapping
5.双出现错误 类型 状态报 消息 JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS 描述 请求行中接收的方法由源服务器知道但目标资源不支持 Apache Tomcat/8.5.85 6.再解决错误 在JSP文件的page标签中添加isErrorPage“true”
% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 isErrorPagetrue %7.双又错啦 但是丝毫不影响测试结果查阅资料显示Tomcat的版本太高内部抛弃了那些什么某种约束不允许除了get\post以外的请求方式但是不影响测试。 8.测试结果
六、响应数据和结果视图
一返回值分类
1、返回值为字符串 用于指定返回的逻辑视图名称
控制器代码 //测试返回值为字符串类型RequestMapping(testString)public String testString(){System.out.println(返回String类型测试);return RequestSuccessful;}运行结果 2、void类型 通常使用原始servlet处理请求时返回该类型
控制器代码 //测试返回值类型为void类型RequestMapping(testVoid)public void testVoid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {System.out.println(返回void类型测试);request.getRequestDispatcher(/testString).forward(request,response);}
运行结果
3、ModelAndView
用于绑定参数和指定返回视图名称
控制器代码 //返回ModelAndView类型测试RequestMapping(testModelAndView)public ModelAndView testModelAndView(ModelAndView mv){mv.addObject(aa,AA);mv.setViewName(RequestSuccessful);return mv;}
JSP页面代码
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
h2请求处理成功/h2
h2a:${requestScope.aa}/h2
/body
/html运行结果
二转发和重定向
1、forward请求转发
控制器代码 //forword请求转发测试RequestMapping(testForward)public String testForward(){System.out.println(请求转发);return forward:/testString;}
运行结果
2、redirect重定向
控制器代码
//redirect重定向测试RequestMapping(testRedirect)public String testRedirect(){System.out.println(请求重定向);return redirect:http://www.baidu.com;} 运行结果
3、携带参数的重定向
控制器代码 //携带参数的重定向测试RequestMapping(testRedirectWithParam)public String testRedirectWithParam(RedirectAttributes ra,String name){System.out.println(携带参数的重定向);ra.addAttribute(name,name);//访问的参数在进行重定向的时候会被显示//ra.addFlashAttribute(name,name);return redirect:/testRedirectParam;}//接收重定向请求参数的测试案例RequestMapping(testRedirectParam)public String testRedirectParam(String name){System.out.println(接收重定向请求参数);System.out.println(name);return RequestSuccessful;} 运行结果 注意重定向携带参数需要使用对象RedirectAttributes该对象提供两个方法封装参数addAttribute()和addFlashAttribute()第一个方法参数会明文显示在浏览器地址栏第二个方法参会会隐藏使用第二种方法传参时获取参数时需要加注解ModelAttribute; //接收重定向请求参数的测试案例RequestMapping(testRedirectParam)public String testRedirectParam(ModelAttribute(value name) String name) {System.out.println(接收重定向请求参数);System.out.println(name);return RequestSuccessful;}
三ResponseBody 响应 json 数据
1、ResponseBody使用介绍 ResponseBody的作用其实是将java对象转为json格式的数据。
2、ResponseBody使用案例:
(1)引入json相关依赖 dependencygroupIdcom.fasterxml.jackson.core/groupIdartifactIdjackson-databind/artifactIdversion2.15.2/version/dependency
(2)编写jsp页面,发送异步请求
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/titlescript typetext/javascript srchttps://cdn.bootcdn.net/ajax/libs/jquery/2.2.0/jquery.min.js/script/head
body
button idbtn发送ajax请求/buttonbutton onclickgetUser()获得json数据/buttonscript//页面加载时间$(function () {//为按钮绑定点击事件$(#btn).click(function () {$.ajax({url: ajaxTest,data: {name:Tom,age:18},type: POST,contentType: application/json,success: function (obj) {//将控制层操作成功响应信息通过弹窗展示alert(obj);},})})});function getUser() {$.ajax({type: GET,url: jsonTest,dataType: json, // 添加这一行明确指定期望的响应数据类型为JSONsuccess: function (msg) {alert(Data Saved: msg);}});}
/script/body
/html
(3)编写控制器方法添加ResponseBody注解 //获取json数据的测试RequestMapping(jsonTest)ResponseBodypublic User testJson(){User user new User();user.setName(张三);user.setAge(20);Car car new Car();car.setName(奔驰);car.setPrice(100000);user.setCar(car);return user;}
(4)测试出现错误 GET http://localhost:8080/SpringMVC01_war_exploded/jsonTest 406 (Not Acceptable)
(5)解决了一上午的错误 发现是Springmvc配置文件里面多配置了两个处理器映射器以及处理器适配器如图
(6)修改完成后的配置
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd!--扫描注解的包--context:component-scan base-packagecom.jn/!--视图解析器解析视图--bean classorg.springframework.web.servlet.view.InternalResourceViewResolverproperty nameprefix value//property namesuffix value.jsp//bean!-- 配置 Web 数据绑定 --mvc:annotation-driven conversion-serviceconversionServicemvc:message-convertersbean classorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter//mvc:message-converters/mvc:annotation-driven!--开启静态资源配置 第一种方式mvc:default-servlet-handler/mvc:default-servlet-handler
--!--开启静态资源配置 第二种方式--mvc:resources mapping/images/** location/images//!--配置类型转换器
将自定义的 MyDateConverter 注册到 Spring 的类型转换服务中使得在应用中可以使用 MyDateConverter 来进行字符串到日期的转换。--bean idconversionService classorg.springframework.format.support.FormattingConversionServiceFactoryBeanproperty nameconverterssetbean classcom.jn.utils.MyDateConverter //set/property/bean/beans (7)终极测试 七、Postman工具使用
一Postman工具介绍 用户在开发或者调试网络程序或者是网页B/S模式的程序的时候是需要一些方法来跟踪网页请求的用户可以使用一些网络的监视工具比如著名的Firebug等网页调试工具。今天给大家介绍的这款网页调试工具不仅可以调试简单的css、html、脚本等简单的网页基本信息它还可以发送几乎所有类型的HTTP请求Postman在发送网络HTTP请求方面可以说是Chrome插件类产品中的代表产品之一。
二Postman工具的下载安装
1、下载地址https://www.postman.com/downloads/ 2、安装步骤 1下载安装文件 2运行安装程序 3重启电脑自动安装 4运行
三Postman工具的使用
1、启动Tomcat服务器
2、打开postMan新建连接
3、测试添加 4、测试修改 5、测试删除
6、测试查询
八、SpringMVC中的父子容器解析
一SpringMVC中的父子容器解析 Spring和SpringMVC的容器具有父子关系。Spring容器为父容器SpringMVC为子容器子容器可以引用父容器中的Bean而父容器不可以引用子容器中的Bean。 配置spring的配置文件时排出扫描控制层注解
context:component-scan base-packagecom.jncontext:exclude-filter typeannotation expressionorg.springframework.stereotype.Controller/
/context:component-scan 配置springMVC的配置文件时扫描控制层注解
context:component-scan base-packagecom.jn.controllercontext:exclude-filter typeannotation expressionorg.springframework.stereotype.Controller/
/context:component-scan 九、SpringMVC中的文件上传
一文件上传的必要前提 1、form 表单的 enctype 取值必须是multipart/form-data(默认值是:application/x-www-form-urlencoded)enctype:是表单请求正文的类型 2、 method 属性取值必须是 Post 3、提供一个文件选择域input type”file”/
二文件上传原理分析 当 form 表单的 enctype 取值不是默认值后request.getParameter()将失效。 enctype”application/x-www-form-urlencoded”时form 表单的正文内容是 keyvaluekeyvaluekeyvalue; 当 form 表单的 enctype 取值为 Mutilpart/form-data 时请求正文内容就变成 每一部分都是 MIME 类型描述的正文;
三SpringMVC的文件上传
1、构建maven工程添加依赖
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.jn/groupIdartifactIdSpringMVC02/artifactIdpackagingwar/packagingversion1.0-SNAPSHOT/versionnameSpringMVC02 Maven Webapp/nameurlhttp://maven.apache.org/urldependenciesdependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion3.8.1/versionscopetest/scope/dependency!--spring-webmvc--dependencygroupIdorg.springframework/groupIdartifactIdspring-webmvc/artifactIdversion5.3.4/version/dependency!--spring-web--dependencygroupIdorg.springframework/groupIdartifactIdspring-web/artifactIdversion5.3.4/version/dependency!--spring-context--dependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.3.4/version/dependency!--servlet-api依赖--dependencygroupIdjavax.servlet/groupIdartifactIdjavax.servlet-api/artifactIdversion4.0.1/version/dependency!--fileupload --dependencygroupIdcommons-fileupload/groupIdartifactIdcommons-fileupload/artifactIdversion1.3.3/version/dependency/dependenciesbuildfinalNameSpringMVC02/finalName/build
/project2、SpringMVC.xml配置
?xml version1.0 encodingUTF-8?
beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:mvchttp://www.springframework.org/schema/mvcxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd!--扫描注解的包--context:component-scan base-packagecom.jn/context:component-scan!--视图解析器解析视图--bean classorg.springframework.web.servlet.view.InternalResourceViewResolverproperty nameprefix value//property namesuffix value.jsp//bean!-- 配置 Web 数据绑定 --mvc:annotation-driven conversion-serviceconversionServicemvc:message-convertersbean classorg.springframework.http.converter.json.MappingJackson2HttpMessageConverter//mvc:message-converters/mvc:annotation-driven!--配置类型转换器
将自定义的 MyDateConverter 注册到 Spring 的类型转换服务中使得在应用中可以使用 MyDateConverter 来进行字符串到日期的转换。--bean idconversionService classorg.springframework.format.support.FormattingConversionServiceFactoryBean/bean/beans 3、web.xml文件的配置
?xml version1.0 encodingUTF-8?
web-app idWebApp_9 version2.4 xmlnshttp://java.sun.com/xml/ns/j2eexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd!-- 配置Spring MVC的前端控制器 --servlet!-- servlet的名称 --servlet-namespring-mvc/servlet-name!-- servlet的类路径指向Spring的请求分发器 --servlet-classorg.springframework.web.servlet.DispatcherServlet/servlet-class!-- 初始化参数指定Spring MVC配置文件的位置 --init-param!-- 参数名称配置文件位置 --param-namecontextConfigLocation/param-name!-- 参数值配置文件在类路径下的位置 --param-valueclasspath:SpringMVC.xml/param-value/init-param/servlet!-- 配置spring-mvc servlet的URL映射规则 --servlet-mapping!-- 对应的servlet名称 --servlet-namespring-mvc/servlet-nameurl-pattern//url-pattern/servlet-mapping!--配置post请求时的编码过滤器--filterfilter-nameencodingFilter/filter-namefilter-classorg.springframework.web.filter.CharacterEncodingFilter/filter-classinit-paramparam-nameencoding/param-nameparam-valueUTF-8/param-value/init-param/filterfilter-mappingfilter-nameencodingFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping!--引入请求方式转换过滤器--!-- 配置HiddenHttpMethodFilter --filterfilter-nameHiddenHttpMethodFilter/filter-namefilter-classorg.springframework.web.filter.HiddenHttpMethodFilter/filter-class/filterfilter-mappingfilter-nameHiddenHttpMethodFilter/filter-nameurl-pattern/*/url-pattern/filter-mapping/web-app4、编写 jsp 页面
% page languagejava contentTypetext/html; charsetUTF-8 pageEncodingUTF-8 isErrorPagetrue %
html
head
/head
body
form actionupload methodpost enctypemultipart/form-datainput typefile namefile/input typesubmit value上传/
/form/body
/html
6、编写控制器
package com.jn.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;import java.io.File;Controller
public class FileController {//测试文件上传RequestMapping(upload)public String upload(MultipartFile file){File dest new File(C:/photos/file.getOriginalFilename());try {file.transferTo(dest);} catch (Exception e) {e.printStackTrace();}return successful;}}6、配置文件解析器
!--配置文件解析器--bean idmultipartResolver classorg.springframework.web.multipart.commons.CommonsMultipartResolver/bean
7、测试文件上传的运行结果 十、SpringMVC中的异常处理
一项目开发中异常处理的方式介绍 系统中异常包括两类预期异常和运行时异常 RuntimeException前者通过捕获异常从而获取异常信息后者主要通过规范代码开发、测试等手段减少运行时异常的发生。
二异常处理的设计思路 系统的 dao、service、controller出现都通过 throws Exception 向上抛出最后由 springmvc 前端控制器交由异常处理器进行异常处理。
三异常处理的步骤
1、编写异常类和错误页面 //测试异常处理RequestMapping(error)public String error(){System.out.println(error);int a 1/0;return error;}
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
styleimport url(https://fonts.googleapis.com/css?familyMontserrat:400,600,700);import url(https://fonts.googleapis.com/css?familyCatamaran:400,800);.error-container {text-align: center;font-size: 106px;font-family: Catamaran, sans-serif;font-weight: 800;margin: 70px 15px;}.error-container span {display: inline-block;position: relative;}.error-container span.four {width: 136px;height: 43px;border-radius: 999px;background:linear-gradient(140deg, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.07) 43%, transparent 44%, transparent 100%),linear-gradient(105deg, transparent 0%, transparent 40%, rgba(0, 0, 0, 0.06) 41%, rgba(0, 0, 0, 0.07) 76%, transparent 77%, transparent 100%),linear-gradient(to right, #d89ca4, #e27b7e);}.error-container span.four:before,.error-container span.four:after {content: ;display: block;position: absolute;border-radius: 999px;}.error-container span.four:before {width: 43px;height: 156px;left: 60px;bottom: -43px;background:linear-gradient(128deg, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.07) 40%, transparent 41%, transparent 100%),linear-gradient(116deg, rgba(0, 0, 0, 0.1) 0%, rgba(0, 0, 0, 0.07) 50%, transparent 51%, transparent 100%),linear-gradient(to top, #99749D, #B895AB, #CC9AA6, #D7969E, #E0787F);}.error-container span.four:after {width: 137px;height: 43px;transform: rotate(-49.5deg);left: -18px;bottom: 36px;background: linear-gradient(to right, #99749D, #B895AB, #CC9AA6, #D7969E, #E0787F);}.error-container span.zero {vertical-align: text-top;width: 156px;height: 156px;border-radius: 999px;background: linear-gradient(-45deg, transparent 0%, rgba(0, 0, 0, 0.06) 50%, transparent 51%, transparent 100%),linear-gradient(to top right, #99749D, #99749D, #B895AB, #CC9AA6, #D7969E, #ED8687, #ED8687);overflow: hidden;animation: bgshadow 5s infinite;}.error-container span.zero:before {content: ;display: block;position: absolute;transform: rotate(45deg);width: 90px;height: 90px;background-color: transparent;left: 0px;bottom: 0px;background:linear-gradient(95deg, transparent 0%, transparent 8%, rgba(0, 0, 0, 0.07) 9%, transparent 50%, transparent 100%),linear-gradient(85deg, transparent 0%, transparent 19%, rgba(0, 0, 0, 0.05) 20%, rgba(0, 0, 0, 0.07) 91%, transparent 92%, transparent 100%);}.error-container span.zero:after {content: ;display: block;position: absolute;border-radius: 999px;width: 70px;height: 70px;left: 43px;bottom: 43px;background: #FDFAF5;box-shadow: -2px 2px 2px 0px rgba(0, 0, 0, 0.1);}.screen-reader-text {position: absolute;top: -9999em;left: -9999em;}keyframes bgshadow {0% {box-shadow: inset -160px 160px 0px 5px rgba(0, 0, 0, 0.4);}45% {box-shadow: inset 0px 0px 0px 0px rgba(0, 0, 0, 0.1);}55% {box-shadow: inset 0px 0px 0px 0px rgba(0, 0, 0, 0.1);}100% {box-shadow: inset 160px -160px 0px 5px rgba(0, 0, 0, 0.4);}}/* demo stuff */* {-webkit-box-sizing: border-box;-moz-box-sizing: border-box;box-sizing: border-box;}body {background-color: #FDFAF5;margin-bottom: 50px;}html, button, input, select, textarea {font-family: Montserrat, Helvetica, sans-serif;color: #bbb;}h1 {text-align: center;margin: 30px 15px;}.zoom-area {max-width: 490px;margin: 30px auto 30px;font-size: 19px;text-align: center;}.link-container {text-align: center;}a.more-link {text-transform: uppercase;font-size: 13px;background-color: #de7e85;padding: 10px 15px;border-radius: 0;color: #fff;display: inline-block;margin-right: 5px;margin-bottom: 5px;line-height: 1.5;text-decoration: none;margin-top: 50px;letter-spacing: 1px;}
/style
body
h1404 Error Page #2/h1
p classzoom-areabCSS/b animations to make a cool 404 page. /p
section classerror-containerspan classfourspan classscreen-reader-text4/span/spanspan classzerospan classscreen-reader-text0/span/spanspan classfourspan classscreen-reader-text4/span/span
/section
div classlink-containera target_blank hrefhttps://www.silocreativo.com/en/creative-examples-404-error-css/ classmore-linkVisit the original article/a
/div/body
/html2、自定义异常处理器
package com.jn.utils;import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyExceptionHandler implements HandlerExceptionResolver {Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {e.printStackTrace();System.out.println(自定义异常处理);ModelAndView mv new ModelAndView();mv.setViewName(error);return mv;}
}3、配置异常处理器
!--配置自定义的异常处理器--bean classcom.jn.utils.MyExceptionHandler/bean
4、测试异常处理的运行结果
十一、SpringMVC中的拦截器使用
一拦截器的介绍和作用 SpringMVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter用于对处理器进行预处理和后处理。用户可以自己定义一些拦截器来实现特定的功能。谈到拦截器还要向大家提一个词——拦截器链Interceptor Chain。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时拦截器链中的拦截器就会按其之前定义的顺序被调用。
二拦截器与过滤器的区别 过滤器是 servlet 规范中的一部分任何 java web 工程都可以使用。拦截器是 SpringMVC 框架自己的只有使用了SpringMVC框架的工程才能用。过滤器在web.xml中的 url-pattern 标签中配置了/*之后可以对所有要访问的资源拦截。拦截器它是只会拦截访问的控制器方法如果访问的是 jsphtml,css,image 或者js是不会进行拦截的。它也是 AOP 思想的具体应用。 我们要想自定义拦截器 要求必须实现HandlerInterceptor 接口。
三自定义拦截器的步骤
1、编写一个普通类实现 HandlerInterceptor 接口
package com.jn.utils;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;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(控制层结束之后的拦截器);}
}2、配置拦截器
!--配置SpringMVC的拦截器--mvc:interceptorsmvc:interceptormvc:mapping path/**/bean classcom.jn.utils.MyInterceptor/bean/mvc:interceptor/mvc:interceptors
3、测试拦截器的运行结果 随便执行一个方法
四拦截器的注意事项
1、拦截器的放行 拦截器中的放行指的是如果有下一个拦截器就执行下一个如果该拦截器处于拦截器链的最后一个则执行控制器中的方法。 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)方法返回true表示继续执行控制层执行器方法返回false表示方法结束不会执行控制层执行器方法。
2、拦截器中方法的说明
preHandle方法说明 控制层执行之前的拦截器。 改方法在控制层执行器方法前调用该方法返回结果为true则继续调用下一个拦截器。 改方法返回结果为false则不会调用下一个拦截器也不会调用控制层执行器方法。 /*控制层执行之前的拦截器。改方法在控制层执行器方法前调用该方法返回结果为true则继续调用下一个拦截器。改方法返回结果为false则不会调用下一个拦截器也不会调用控制层执行器方法。*/Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(控制层执行之前的拦截器);return true;}
postHandle方法说明 控制层执行器方法返回时拦截器 该方法在控制层执行器方法返回时调用由DispatcherServlet在将结果响应给浏览器前的调用。 /*控制层执行器方法返回时拦截器该方法在控制层执行器方法返回时调用由DispatcherServlet在将结果响应给浏览器前的调用。*/Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(控制层执行器方法返回时拦截器);}
afterCompletion方法说明 控制层结束之后的拦截器 该方法在DispatcherServlet将结果响应给浏览器后调用。 /*控制层结束之后的拦截器该方法在DispatcherServlet将结果响应给浏览器后调用。*/Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(控制层结束之后的拦截器);} 3、拦截器的作用路径
!--配置SpringMVC的拦截器--!--用于定义一组拦截器--mvc:interceptors!--定义一个具体的拦截器--mvc:interceptor!--指定拦截器应用的路径。/** 表示拦截所有路径--mvc:mapping path/**/!--指定拦截器类的全限定名--bean classcom.jn.utils.MyInterceptor/bean/mvc:interceptor/mvc:interceptors
五、多个拦截器的执行顺序
1、多个拦截器放行的情况
拦截器1
package com.jn.utils;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MyFirstInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(控制层执行之前的拦截器1);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(控制层执行器方法返回时拦截器1);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(控制层结束之后的拦截器1);}
}拦截器2
package com.jn.utils;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class MySecondInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(控制层执行之前的拦截器2);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(控制层执行器方法返回时拦截器2);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(控制层结束之后的拦截器2);}
}2、配置拦截器 mvc:interceptorsmvc:interceptormvc:mapping path/**/bean classcom.jn.utils.MyFirstInterceptor/bean/mvc:interceptormvc:interceptormvc:mapping path/**/bean classcom.jn.utils.MySecondInterceptor/bean/mvc:interceptor/mvc:interceptors
3、多个拦截器阻断的情况
第一个拦截器放回true,第二个拦截器返回true时
第一个拦截器放回true,第二个拦截器返回false时
第一个拦截器放回false,第二个拦截器返回true时
十二、拦截器的简单案例验证用户是否登录
一实现思路分析
1、定义登录页面并定义请求映射。 2、判断用户名密码是否正确 3、如果正确 向 session 中写入用户信息 4、返回登录成功。 5、拦截用户请求判断用户是否登录 6、如果用户已经登录。放行 7、如果用户未登录跳转到登录页面
二案例代码
1、登录页面login.jsp定义
% page contentTypetext/html;charsetUTF-8 languagejava %
html
headmeta nameviewport contentwidthdevice-width, initial-scale1.0title登录页面/titlestyle* {margin: 0;padding: 0;}html {height: 100%;}body {height: 100%;}.container {height: 100%;background-image: linear-gradient(to right, #fbc2eb, #a6c1ee);}.login-wrapper {background-color: #fff;width: 358px;height: 588px;border-radius: 15px;padding: 0 50px;position: relative;left: 50%;top: 50%;transform: translate(-50%, -50%);}.header {font-size: 38px;font-weight: bold;text-align: center;line-height: 200px;}.input-item {display: block;width: 100%;margin-bottom: 20px;border: 0;padding: 10px;border-bottom: 1px solid rgb(128, 125, 125);font-size: 15px;outline: none;}.input-item:placeholder {text-transform: uppercase;}.btn {text-align: center;padding: 10px;width: 100%;margin-top: 40px;background-image: linear-gradient(to right, #a6c1ee, #fbc2eb);color: #fff;}.msg {text-align: center;line-height: 88px;}a {text-decoration-line: none;color: #abc1ee;}/style
/head
body
div classcontainerdiv classlogin-wrapperdiv classheaderLogin/divform actionlogin methodpostdiv classform-wrapperinput typetext nameusername placeholderusername classinput-iteminput typepassword namepassword placeholderpassword classinput-iteminput typesubmit valueLogin classbtn !-- 将原来的div.btn改为input提交按钮 --/divdiv classmsgDont have account?a href#Sign up/a/div/form/div
/div
/body
/html
2、控制器实现 //测试拦截实现登录RequestMapping(login)public String login(String username,String password,HttpSession session){System.out.println(登录校验成功);session.setAttribute(username,username);return successful;}
3、拦截器实现
package com.jn.utils;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;public class MyInterceptor implements HandlerInterceptor {/*控制层执行之前的拦截器。改方法在控制层执行器方法前调用该方法返回结果为true则继续调用下一个拦截器。改方法返回结果为false则不会调用下一个拦截器也不会调用控制层执行器方法。*/Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(控制层执行之前的拦截器);//校验用户是否登录HttpSession session request.getSession();String username (String) session.getAttribute(username);if (username null){return true;}else {//当前用户未登录拦截跳转到登录页面request.getRequestDispatcher(/login.jsp).forward(request,response);return false;}}/*控制层执行器方法返回时拦截器该方法在控制层执行器方法返回时调用由DispatcherServlet在将结果响应给浏览器前的调用。*/Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(控制层执行器方法返回时拦截器);}/*控制层结束之后的拦截器该方法在DispatcherServlet将结果响应给浏览器后调用。*/Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(控制层结束之后的拦截器);}
}4、注册拦截器 mvc:interceptorsmvc:interceptormvc:mapping path/**/mvc:exclude-mapping pathlogin/bean classcom.jn.utils.MyInterceptor/bean/mvc:interceptor/mvc:interceptors
5、测试结果
此时输入用户名然后点击login 然后username不填点击登录 然后还是跳转到了登录界面