spirngMVC工作原理学习


一、工作原理
1、用户发送请求→ DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局流程控制;
2、 DispatcherServlet→ HandlerMapping,HandlerMapping将会把请求映射为HandlerExcutionChain对象(包含一个Handler处理器,多个HandlerInterceptor拦截器)通过这种策略模式,很容易添加新的映射策略
3、 DispatcherServlet→ HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,
4、 HandlerAdapter→ 处理器功能方法的调用, HandlerAdapter将会把适配的结果调用真正的处理器功能方法,完成功能处理,返回ModelAndView对象(包含模型数据,逻辑视图名)
5、ModelAndView→ ViewResolver,ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术。
6、View→ 渲染,view会根据传进来的Model模型数据进行数据渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术。
7、返回控制权给 DispatcherServlet,由 DispatcherServlet返回响应给用户,到此一个流程结束。
二、与struts2的区别
  
  
1、Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC就容易实现restful url,而struts2的架构实现起来要费劲,因为Struts2中Action的一个方法可以对应一个url,而其类属性却被所有方法共享,这也就无法用注解或其他方式标识其所属方法了。 2、由上边原因,SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。 3、由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。 4、 拦截器实现机制上,Struts2有以自己的interceptor机制,SpringMVC用的是独立的AOP方式,这样导致Struts2的配置文件量还是比SpringMVC大。 5、SpringMVC的入口是servlet,而Struts2是filter(这里要指出,filter和servlet是不同的。以前认为filter是servlet的一种特殊),这就导致了二者的机制不同,这里就牵涉到servlet和filter的区别了。 6、SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。 7、SpringMVC验证支持JSR303,处理起来相对更加灵活方便,而Struts2验证比较繁琐,感觉太烦乱。 8、Spring MVC和Spring是无缝的。从这个项目的管理和安全上也比Struts2高(当然Struts2也可以通过不同的目录结构和相关配置做到SpringMVC一样的效果,但是需要xml配置的地方不少)。 9、 设计思想上,Struts2更加符合OOP的编程思想, SpringMVC就比较谨慎,在servlet上扩展。 10、SpringMVC开发效率和性能高于Struts2。 11、SpringMVC可以认为已经100%零配置。

Spring MVC是一种基于MVC(Model-View-Controller)模式的Web框架,可以用于开发Web应用程序。下面是一个简单的Spring MVC登录注册示例。 1. 创建一个Maven项目,添加Spring MVC的依赖。 ```xml <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.0.RELEASE</version> </dependency> ``` 2. 创建一个控制器(Controller)类,处理请求和响应。 ```java @Controller public class UserController { @RequestMapping("/login") public String login() { return "login"; } @RequestMapping("/register") public String register() { return "register"; } @RequestMapping("/doLogin") public String doLogin(@RequestParam String username, @RequestParam String password, Model model) { // 处理登录逻辑 if (isValid(username, password)) { model.addAttribute("username", username); return "welcome"; } else { model.addAttribute("error", "Invalid username or password"); return "login"; } } @RequestMapping("/doRegister") public String doRegister(@RequestParam String username, @RequestParam String password, Model model) { // 处理注册逻辑 if (isValid(username, password)) { model.addAttribute("username", username); return "welcome"; } else { model.addAttribute("error", "Invalid username or password"); return "register"; } } private boolean isValid(String username, String password) { // 验证用户名和密码是否正确 return true; } } ``` 3. 创建视图(View)文件,显示HTML页面。 - login.html ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Login</title> </head> <body> <h1>Login</h1> <form action="/doLogin" method="POST"> <div> <label for="username">Username:</label> <input type="text" id="username" name="username"> </div> <div> <label for="password">Password:</label> <input type="password" id="password" name="password"> </div> <button type="submit">Login</button> </form> <p style="color:red">${error}</p> </body> </html> ``` - register.html ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Register</title> </head> <body> <h1>Register</h1> <form action="/doRegister" method="POST"> <div> <label for="username">Username:</label> <input type="text" id="username" name="username"> </div> <div> <label for="password">Password:</label> <input type="password" id="password" name="password"> </div> <button type="submit">Register</button> </form> <p style="color:red">${error}</p> </body> </html> ``` - welcome.html ```html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Welcome</title> </head> <body> <h1>Welcome, ${username}!</h1> </body> </html> ``` 4. 配置Spring MVC,指定视图解析器(ViewResolver)和静态资源路径。 ```xml <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-5.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-5.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-5.2.xsd"> <context:component-scan base-package="com.example.controller" /> <mvc:annotation-driven /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/" /> <property name="suffix" value=".html" /> </bean> <mvc:resources mapping="/static/**" location="/static/" /> </beans> ``` 5. 运行Tomcat服务器,访问http://localhost:8080/login即可进入登录页面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值