一、静态资源不拦截

第二部分最后显示的几个页面其实都加载了css和js等文件,要不然不会显示的那么好看(假装好看吧),前面已经说了,我们在web.xml中配置了url的拦截形式是/,那么DispatcherServlet会拦截除了jsp外的所有资源,包括静态资源,那么为什么我们的页面还是加载了css和js等资源呢,是因为我们在springmvc.xml中进行了如下配置:

location="/css/"代表根目录下的css文件夹,都哪些资源不拦截呢,是/css/**,**意思就是只要是css文件夹下的都不拦截。

二、springmvc请求处理流程

当我们在浏览器访问:http://localhost:8080/login的时候,前端控制器解析url,得到请求资源标示符/,执行处理器映射器去映射对应的handler对象,获得该handler配置的所有相关对象(包括Handler对象以及对应的拦截器),最后以HandlerExecutionChain对象的形式返回,如果用户自定义了拦截器,开始执行拦截器的preHandle()方法,在此方法中对请求进行拦截或者放行,如果用户没有定义拦截器则没有这步操作。然后前端控制器调用处理器适配器去执行对应的handler,就是controller中对应的方法,例如此例中对应我们UserController中的showLogin()方法,执行完毕后返回ModelAndView,包括要返回的页面以及设置的属性。然后前端控制器开始调用ViewReslover去解析,解析完后发现原来要返回/WEB-INF/jsp/login.jsp这个页面。然后再去渲染这个页面,例如页面中可能要取一些后台传过来的值。最后响应给客户端浏览器。

三、定义登录拦截器

如果用户在没有登录的情况下,有些资源是不能让用户访问的,这个时候我们需要对请求的url进行过滤,然后决定是放行还是拦截。来看com.neu.interceptor.LoginInterceptor这个类

前面已经说了,在执行controller中具体的方法之前,需要执行自定义拦截器的preHandler()方法。在此方法中,我们定义规则如下:如果是访问主页,登录页面,或者是注册页面,或者是登录操作,或者是注册操作都放行。因为这些操作还进行拦截,用户就永远不能登录注册了。request.getRequestURI()方法返回的是请求资源标识符,例如访问http://localhost:8080/login,uri就是/login。如果用户访问的不是以上资源,那么我们需要判断用户是否登录,就是判断session中有没有user属性。由于在UserController的登录方法login(),一旦用户登录成功,我们就给session的user属性设置了值。来看一下:

所以,如果是登录状态,也放行。否则就直接重定向到登录页面,返回false。如果放行的情况下:会开始执行UserController中对应的handler方法,然后就是后续的一系列操作。当然,如果想让自定义的拦截器生效,需要在springmvc.xml中进行配置

登录拦截器当然也会拦截我们的静态资源,所以我们需要过滤掉静态资源的拦截,如上图中红框的配置。

四、用户注册功能

当我们在登录页面点击Create Account,会跳转到注册页面。来看看跳转的过程,先打开login.jsp

这个超链接访问的是${pageContext.request.contextPath}/register,${pageContext.request.contextPath}就相当于我们的工程根路径。所以这个url相当于是访问http://localhost:8080/register,首先前端控制器会拦截,映射到到具体的handler,这个时候handler还不能执行,因为登录拦截器的preHandler()方法会先执行,发现原来这个请求不需要拦截,放行。开始执行handler对应的方法showRegister(),然后就跳转到register.jsp页面了。来看看这个页面的表单都有什么

三个字段,用户名,密码,确认密码,还有一个提交按钮,页面中引入的js一会再说。我们发现username和password的name字段正好和com.neu.pojo.User的username和password属性对应,那么我们就可以使用User对象来接收这两个参数,发现确认密码confirmPass和User的属性不匹配怎么办,没关系,我们在UserController的register()方法参数中加个String confirmPass就行了,这样这个参数也能够接收到了。来继续看UserController

先查询注册的用户是否存在,如果存在就跳转到register.jsp,如果不存在就补全pojo属性,插入数据库。这里密码我们使用的是spring自带的MD5加密,然后跳转到success.jsp。这里有些地方需要说一下,当查询到注册的用户已存在的时候,我们调用了returnRegisterData()方法来设置页面回显的值。

读者可能发现,在注册页面,每个表单字段都有个value属性,例如username那块,value="${username }",这样在model中设置的username属性值就可以取到了,其他的一样。message属性用来定义错误信息,我们在注册页面的一个div中显示它。

当然,这个div不是页面一打开就显示的,例如我们第一次访问注册页面填写表单的时候就不能显示它,只有后台回显数据的时候才显示它,这是register.js控制的,来看看这个js。

这里我们使用了jquery,$(function(){})中的内容页面加载完毕就执行,先获取显示错误信息的这个div(var meg = $("#td-meg-div");),然后判断这个div内有没有内容(if (meg.html() == "")),如果没有内容,说明是第一次打开注册页面填写表单,后台不会传过来message值,div中${message}自然内容就为空了,那么我们就隐藏这个div(meg.hide();),如果是回显数据到注册页面呢,那么这个div就有内容,有内容就不隐藏呗,反正默认div就是显示的。在register.js中我们还给提交按钮绑定了click事件,加上了一些前端表单验证,验证成功后就提交。

还有我们给回车键也加上了一个监听事件,13就代表回车键码

注册成功后,会跳转到success.jsp,来看看这个jsp

在页面中我们还定义了5秒跳转的js,5秒后跳转到登录页面

四、用户登录功能

首先来看login.jsp页面

和注册页面类似,两个表单字段username和password,加上一个提交按钮,一个重置按钮,当然也少不了我们回显错误信息的div。login.js和register.js的内容大同小异,这里我们就不再重复了。来看看处理登录请求

代码比较简单,大家应该都能看明白。下面我们演示一下整个流程吧

来个正确的试试

看下数据库有没有添加进来

我这里因为实验了很多次,id本来我们设置的是自增的,所以显示id=43,不奇怪,如果是第一此插入会是id=1

这个时候我们先不登录,继续使用刚才的用户名注册,看看错误信息回显了没有

和预期的一样,正确显示错误信息。我们来登录试试吧!

赶紧登录成功吧,去看看主页,这次我们输入正确的用户名密码再次访问,会跳转到主页

主页终于出来了,确认很简陋,体谅博主前端技术太菜,做不出优雅的界面。点击注销试试

在index.jsp中点击注销会访问/logout,去UserController中看看

这里只是简单的把session中保存的用户信息删除,然后重定向到/login这个handler,然后跳转到登录页面。

五、全局错误页面

当用户在浏览器中输入不存在的页面或者以不允许的请求方式去提交表单都会出现一些错误信息,当然为了更友好的展示错误信息,我们可以在web.xml中配置错误页面

例如我们在浏览器中输入http://localhost:8080/dwqdqwdqwd/dedf32325,就会跳转到error.jsp

至此,整个项目就搭建完毕了。写博客的过程中发现,把自己会的东西用通俗易懂的语言讲给别人真是一件很费力的事情。不过这也有好处,相当于加深一遍印象,也加深了自己的理解。项目驱动是最好的老师,希望大家都可以动手去实现一下!不懂的可以在下面留言。谢谢阅读!

Spring,Mybatis,Springmvc框架整合项目(第三部分)的更多相关文章

  1. Spring,Mybatis,Springmvc框架整合项目(第一部分)

    一.说在前面的话 本篇博文实现一个注册登录小项目,使用spring,mybatis,springmvc框架进行整合,我们创建的是一个maven工程,主要是方便jar包版本的管理.项目使用eclispe ...

  2. Spring+mybatis+struts框架整合的配置具体解释

    学了非常久的spring+mybatis+struts.一直都是单个的用他们,或者是两两组合用过,今天总算整合到一起了,配置起来有点麻烦.可是配置完一次之后.就轻松多了,那么框架整合配置具体解释例如以 ...

  3. Spring,Mybatis,Springmvc框架整合项目(第二部分)

    一.创建数据库表 打开Navicat Premium,点击左上角连接,选择mysql   输入你的数据库用户名和密码信息,可以先点击下测试连接,如果显示连接成功,说明能连接到数据库,然后点击确定.如果 ...

  4. SSM(SpringMVC+Spring+MyBatis)三大框架使用Maven快速搭建整合(实现数据库数据到页面进行展示)

    本文介绍使用SpringMVC+Spring+MyBatis三大框架使用Maven快速搭建一个demo,实现数据从数据库中查询返回到页面进行展示的过程. 技术选型:SpringMVC+Spring+M ...

  5. SSM(Spring,SpringMVC,Mybatis)框架整合项目

    快速上手SSM(Spring,SpringMVC,Mybatis)框架整合项目 环境要求: IDEA MySQL 8.0.25 Tomcat 9 Maven 3.6 数据库环境: 创建一个存放书籍数据 ...

  6. Spring+SpringMVC+MyBatis+Maven框架整合

    本文记录了Spring+SpringMVC+MyBatis+Maven框架整合的记录,主要记录以下几点 一.Maven需要引入的jar包 二.Spring与SpringMVC的配置分离 三.Sprin ...

  7. SpringMVC+Spring+Mybatis+Maven+mysql整合

    一.准备工作1.工具:jdk1.7.0_80(64)+tomcat7.0.68+myeclipse10.6+mysql-5.5.48-win322. 开发环境安装配置.Maven项目创建(参考:htt ...

  8. (一)springmvc+spring+mybatis+maven框架搭建

    (一)springmvc+spring+mybatis+maven框架搭建 1.说明 工作之余,为了学习点东西.先搭建个框架. 以后要往里面加东西,比如rabbitMQ.redis.shiro等. 也 ...

  9. Spring+Mybatis+SpringMVC+Maven+MySql搭建实例

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何使用Maven来搭建Spring+Mybatis+SpringMVC+M ...

随机推荐

  1. Python基础之collection

    collection-系列 cellection是作为字典.元组(列表与元组可互相转换)的扩充,在此需要导入cellection 一.计数器(counter) counter是对字典类型的补充,用户获 ...

  2. Masonry UIScrollView autolayout 的一个奇特的问题

    事情是这样的.... 我一个工程里 一直使用的 masonry 做autolayout,有个gesturerReconizer的bug,找了很久,发现很奇怪一个现象: 我的某个view 是这样的 |- ...

  3. 《javascript设计模式》笔记之第四章:继承

    一:首先,一个简单的继承实例: 首先是创建一个父类Person: function Person(name) { this.name = name; } Person.prototype.getNam ...

  4. kafka-->storm-->mongodb

    目的: 通过Spout发射kafka的数据,到bolt统计每一个单词的个数,将这些记录更新到mongodb中. Spout的nextTuple方法会一直处于一个while循环这中,每一条数据发送给bo ...

  5. Java编程基础-字符串

    在Java语言中,字符串数据实际上由String类所实现的.Java字符串类分为两类:一类是在程序中不会被改变长度的不变字符串:另一类是在程序中会被改变长度的可变字符串.Java环境为了存储和维护这两 ...

  6. IE6常见CSS解析Bug和hack

    第一:图片间隙 a:div中的图片间隙: 描述:在div中插入图片时,图片会将div下方撑大3像素 hack1:将<div>和<img>写在一行 hack2:将<img& ...

  7. Selenium私房菜系列5 -- 第一个Selenium RC测试案例

    <Selenium简介>中讲过,Selenium RC支持多种语言编写测试案例,如:C#,Python.在工作中,我倾向于是用Python这类动态语言编写测试案例,因为这样的测试案例无需编 ...

  8. MySQL常用命令和语句

    1.常用SQL语句 1)常用函数/*type可取值为:MICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEARSECOND_MICROSECONDMINUT ...

  9. hihoCoder #1080 : 更为复杂的买卖房屋姿势 (线段树,多tag)

    题意: 有编号为0~n的n+1个房屋,给出每个房屋的起始价格,随后给出m种修改,每次修改都要进行输出所有房屋的价格总和.修改有两种方式:(1)政府调控,编号L~R全置为同一价格(0)房屋自行涨跌,编号 ...

  10. COGS 615. 韩国明星

    [问题描述] 在LazyCat同学的影响下,Roby同学开始听韩国的音乐,并且越来越喜欢H.o.T,尤其喜欢安七炫和Tony,可是,爱学习爱思考的Roby同学想,如果以后喜欢的韩星越来越多怎么办呢?R ...