spring mvc的流程,添加一个监听器再哪里添加
SpringMVC 工作流程:
SpringMVC工作流程描述
Dispatcher 调度员
Handler 处理者
Execution 执行、实行、完成
Chain 链、束缚、枷锁
1.用户向服务器发送请求时,请求被Spring 前端控制器DispatcherServlet获取,如详细图第一步
2.DispatcherServlet对请求URL进行解析(比如我们发送一个url如下的请求
http://localhost:8080/SpringMVC/hello.action),就会得到请求资源标示符(URI,相当于就是上面的hello.action )。然后根据URI,调用处理器映射器(HandlerMapping)获得该Handler配置的所有相关对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回。
3.DispatcherServlet获取上面返回的Handler,并选择一个适合的HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)
4.选择好合适的HandlerAdapter后就会开始执行Handler。在填充Handler的入参过程中,根据配置,Spring将帮你做一些额外的工作(我们不需要管):
EG:
Converter 变流器、整流器、转化器
HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
5. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象(包含视图名或视图名和模型)
6.根据返回的ModelAndView对象,选择一个合适的ViewResolver返会给DispatcherServlet ;
7.ViewResolver结合,Model和View来渲染视图
8.最后将视图渲染结果返回给客户端
组件名词解释:
1.DispatcherServlet:前端控制器
等同于以前的Controller, 是整个流程的中心, 负责调用其他组件
2.HandlerMapping: 处理器映射器
负责根据请求找到Handler(处理器),springMVC中可以根据不同的映射器实现不同映射,比如 xml配置方式,注解方式,接口方式等
3.Handler:后端控制器
在前端控制器的控制下对具体的用户请求进行处理,所以一般情况下都需要开发者进行根据需求进行开发。
4.HandlerAdapter:处理器适配器
处理Handler,可以对多种类型的处理器进行执行,这是对适配器模式的应用体现。
5.ViewResolver : 视图解析器
负责将处理结果生成view视图、开发者可以根据需要开发view
入门程序(详细步骤): 在理解了springMVC的工作流程后,下面我们根据流程步骤,来实现我们的入门程序,步骤如下:
1.导入我们的spring架包(一般去官网下载即可 4.2版本用的比较多)
2.在web.xml配置前端控制器
[java] view plain copy
1. <servlet>
2. <servlet-name>springmvc</servlet-name>
3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
4. </servlet>
5. <!-- 让servlet随服务启动 -->
6. <servlet-mapping>
7. <servlet-name>springmvc</servlet-name>
8. <url-pattern><strong><span style="color:#FF0000;">*.action</span></strong></url-pattern>
9. </servlet-mapping>
这里说一下 我们的拦截方式:
1. 拦截固定后缀名的URL : 如 *.action, *.do
2. 拦截所有:设置为/,但是该方法会导致静态文件(css,js.jpg)被拦截下来不能正常显示,所以该方式需要特殊处理
注意:不能设置拦截所有为/* 该方式是错误的,因为请求action时,当action跳转到jsp时会再次被拦截,出现异常:根据jsp路径找不到映射地址
3.设置springmvc的配置文件
[java] view plain copy
1. <servlet>
2. <init-param>
3. <param-name>contextConfigLocation</param-name>
4. <param-value>WEB-INF/springmvc.xml</param-value>
5. </init-param>
6. </servlet>
4.开发处理器
[java] view plain copy
1. public class Hello implements Controller{
2. @Override
3. public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
4. List list = new ArrayList<>();
5. list.add("one");
6. list.add("two");
7. ModelAndView mv = new ModelAndView();
8. mv.addObject("list",list);
9. return mv;
10. }
11. }
5.在springmvc.xml中配置
[java] view plain copy
1. <!-- 配置适配器 -->
2. <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
3. <!-- 处理器映射器 -->
4. <!-- 根据bean的 name 查找Handler , 将action的URL 配置在bean的name中-->
5. <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
6.
7. <!-- 配置处理器 -->
8. <bean name="/hello.action" class="com.mt.controller.Hello"></bean>
9. <!-- 配置视图解析器 -->
10. <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
6.视图开发 ,jsp文件
[java] view plain copy
1. <%@ page language="java" contentType="text/html; charset=UTF-8"
2. pageEncoding="UTF-8"%>
3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4. <html>
5. <head>
6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
7. <title>Insert title here</title>
8. </head>
9. <body>
10. asdfadfadfa
11. ${list }
12. </body>
13. </html>
测试结果: 开启服务器后, 发送 http://localhost:8080/SpringMVC/hello.action的请求
页面显示:
对应理解springMVC 的流程即可。
----------------------------------------------------------------------------------------------------
监听器故名思议就是起到监听作用,对某个对象所进行的一系列动作进行监听,并记录下来。JavaWeb主要有三种类型的监听器ServletContextListener,HttpSessionListener,ServletRequestListener, 这三种类型监听器对应的作用域分别是application, session, request。这一节我们看看这三个监听器的用法
1.创建监听器
我们创建自定义的监听器需要继承这三个接口。并在web.xml文件中进行配置
[java] view plain copy
1. public class firstServletListener implements ServletContextListener {
2.
3. public void contextDestroyed(ServletContextEvent arg0) {
4. // TODO Auto-generated method stub
5. System.out.println("contextDestroyed");
6. }
7.
8. public void contextInitialized(ServletContextEvent arg0) {
9. // TODO Auto-generated method stub
10. System.out.println("contextInitialized");
11. }
12.
13. }
[java] view plain copy
1. public class firstSessionListener implements HttpSessionListener {
2.
3. public void sessionCreated(HttpSessionEvent arg0) {
4. // TODO Auto-generated method stub
5. System.out.println("sessionCreated");
6. }
7.
8. public void sessionDestroyed(HttpSessionEvent arg0) {
9. // TODO Auto-generated method stub
10. System.out.println("sessionDestroyed");
11. }
12.
13. }
[java] view plain copy
1. public class firstRequestListener implements ServletRequestListener {
2.
3. public void requestDestroyed(ServletRequestEvent arg0) {
4. // TODO Auto-generated method stub
5. System.out.println("requestDestroyed");
6. }
7.
8. public void requestInitialized(ServletRequestEvent arg0) {
9. // TODO Auto-generated method stub
10. System.out.println("requestInitialized");
11. }
12.
13. }
web.xml中添加配置
[html] view plain copy
1. <listener>
2. <listener-class>com.selfListener.firstServletListener</listener-class>
3. </listener>
4. <listener>
5. <listener-class>com.selfListener.firstSessionListener</listener-class>
6. </listener>
7. <listener>
8. <listener-class>com.selfListener.firstRequestListener</listener-class>
9. </listener>
[html] view plain copy
1. <!-- 配置session超时时间为1分钟,如果为0,则表示不超时 -->
2. <session-config>
3. <session-timeout>1</session-timeout>
4. </session-config>
我们启动服务,运行一个网页,看以看到如下输出结果
ServletContextListener--contextInitialized
ServletRequestListener--requestInitialized
HttpSessionListener--sessionCreated
ServletRequestListener--requestDestroyed
HttpSessionListener--sessionDestroyed
我们每次请求一个网页后,requestListener会自动销毁。
sesslonListener的销毁时间有session的过期时间决定,我们可以在web.xml中进行配置
按监听事件划分,有以下三种,上面我们演示的是第一种
域对象自身的创建和销毁
域对象中属性的创建和消除
绑定到session中的某个对象的状态
我也不知道自己在哪里看到的,如有侵权立即删除。