springmvc项目(处理用户请求)、拦截器

在这里插入图片描述
在这里插入图片描述
注意:web开发底层必须是servlet,springmvc没有定义servlet对象,但是springmvc底层有一个DispatcherServlet(HttpSerlet子类),负责接收用户的所有请求(index.html),用户把请求交给了DispatcherServlet,之后DispatcherServlet把请求转发给有@Controller注解的对象,最后是Controller对象处理请求,Controller对象处理完后在返回给DispatcherServlet,再在通过html文件中显示。

步骤:
在这里插入图片描述
在这里插入图片描述
1.新建项目:
新建一个新工程:
在这里插入图片描述
新建一个module:
在这里插入图片描述
新建module模块,选择webapp模板:
在这里插入图片描述
创建的项目结构:
在这里插入图片描述
在main目录下添加两个目录(java和resource):
在这里插入图片描述

2.修改pom.xml(注意红线标注的地方)
在这里插入图片描述

前一个是servlet的依赖,后一个是springmvc的依赖。
3.发布应用(项目):
在这里插入图片描述
命令,取消勾选,填写端口号:
在这里插入图片描述
在这里插入图片描述
可修改项目名称:
在这里插入图片描述
4.web.xml的默认版本较低:
在这里插入图片描述
修改如下(已添加到idea的文件模板中,可以直接新建):
在这里插入图片描述
在web.xml文件中注册springmvc的核心对象DispatcherServlet,当tomcat服务器启动后就会创建DispatcherServlet实例:
在这里插入图片描述
DispatcherServlet在init()中{
//创建容器,读取配置文件
WebApplicationContext ctx new ClassPathXmlApplicationContext(“springmvc.xml”);
//把容器对象放入到ServletContext中
getServletContext().setAttribute(key,ctx);
}
添加load-on-startup标记,它表示tomcat启动后创建对象的顺序,它的值是大于等于0的整数,数值越小tomcat创建时间越早:
在这里插入图片描述
DispatcherServlet在init()中读取配置文件(springmvc.xml)的位置可以通过init-param标记来设定(下例中param-value的classpath的springmvc.xml是默认在resource目录下的):
在这里插入图片描述
在resource目录下添加springmvc.xml文件:
在这里插入图片描述
最终web.xml文件如下:
在这里插入图片描述
可以看出和写servlet项目时的格式类似,只是servlet-class里指明的servlet的类不是程序员自己写的,而是springmvc底层已有的。
注意:这里的url-pattern使用的是通配符。
5.index主页面的内容如下:
在这里插入图片描述
该页面中有一个超链接,点击发起some.do请求,即与web.xml中url-pattern中指定的路径匹配。
写一个实体类MyController,用于处理用户请求:
在这里插入图片描述
该实体类有两个注解,@Controller位于类上,创建处理器对象,放在spring容器中。
@RequestMapping注解位于处理的方法之上,作用如下:
在这里插入图片描述
在这里插入图片描述
方法中的返回值为ModelAndView对象,用于返回一个页面。
AddObject()方法现在看不明白没关系,下面创建show.jsp自然就懂了:
在这里插入图片描述
setViewName()方法用于指定返回的.jsp文件,把数据传给该文件后作为处理结果返回给用户。
在springmvc.xml文件中生成组件扫描器,可以生成指定包路径下@Controller标注的类的代理,用于被web.xml中指定的DispatcherServlet对象读取调用:
在这里插入图片描述
运行项目:
在这里插入图片描述
点击超链接后显示:
在这里插入图片描述
注意上图的路径为"springmvc/some.do就是@Controller修饰的类中方法中处理方法@RequestMapping的value值。
总结:springmvc项目的web.xml文件中注册了一个框架自带的DispatcherServlet类(中央调度器),该类中执行的init()方法会读取配置文件,通过servlet标记中的param-value标记中的值指定一个spring配置文件(这里是springmvc.xml),该配置文件中有一个组件扫描器,该组件扫描器用于扫描指定包路径下的用@Controller修饰的实体类,生成代理。init()读取配置文件后会创建一个springmvc容器,spring配置文件生成的代理放入到该容器中。而这些代理中有@RequestMapping修饰的方法,@RequestMapping的value值制定了路径,该路径与index.jsp中指定提交或者切换的页面地址一致(如该例中的href=“do.some”),value值的地址推荐使用/开头。
过程:index.jsp的do.some请求交给中央调度器DispatcherServlet–>中央调度器将请求交给包含RequestMapping路径一致的方法的Controller对象处理。
在这里插入图片描述注意,为了使用于只能通过主页面index.jsp访问项目,需把其他的.jsp文件放到WEB-INF目录下(WEB-INF目录下的内容用户都不能访问):
在这里插入图片描述
这是需修改处理方法中添加视图的完整路径:
在这里插入图片描述
也可以用下述方法简化路径:
在springmvc.xml中添加
在这里插入图片描述
这是在处理方法中视图的路径可以只说明jsp文件名:
在这里插入图片描述
补充:
(1)RequestMapping注解的value值是一个数组,可以传多个值,作用是将多个请求交给同一个方法处理。
在这里插入图片描述
(2)RequestMapping还可以有method参数,值为RequesMethod.GET或者Requestethod.POST,不设定默认是RequesMethod.GET,但有时表单(form)的method属性值为post,此时要设定RequestMapping的有method参数值是两者一致。

二、拦截器:
拦截器用来拦截用户的请求,对请求做判断处理。
拦截器是springmvc中的一种对象,需要实现HandleInterceptor接口。
拦截器是全局的,可以对多个Controller做拦截。一个项目中可以有0个或多个拦截器,一起拦截用户的请求。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.拦截器实例(项目中含一个):
在上一个项目的基础上添加一个拦截器类

在这里插入图片描述
拦截器中的preHandle方法在控制器方法之前执行(即这里的MyController的doSome),用户请求首席按到达此方法。在这个方法中可以验证请求是否符合要求。
postHandle是后处理方法,在处理器方法之后执行,参数ModelAndView是获取的控制器方法的返回值,它主要是对原来的结果做二次修正。
afterCompletion是最后执行的方法,参数Object handle是拦截器的处理对象,Exception ex是程序中发生的异常。
afterCompletion方法的特点:
在这里插入图片描述
在配置文件中声明拦截器:
在这里插入图片描述

特别要注意这里的path属性,它表明在用户在浏览器中输入满足path属性值的通配符即执行拦截器的方法(这里表示任意路径下都使用视图解析器解析)。bean中class属性指明拦截器类的路径。
在控制器和视图解析器中添加输出语句来验证它们的执行顺序:
在这里插入图片描述
在这里插入图片描述
启动项目运行:
在这里插入图片描述

点击提交按钮:
在这里插入图片描述
若把preHandle方法返回值改为false:
在这里插入图片描述
点击提交按钮后页面为空白,无结果(且postHandle和afterCompletion方法不执行):
在这里插入图片描述
关于mvc:mapping的class的匹配,下图中的匹配:
其中http://localhost:8080/myweb是项目的导出路径
在这里插入图片描述
项目实例(验证用户登录信息,该例是验证登录用户是否为zs)
preHandle的方法体:
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值