1、M:模型层,完成具体的业务操作,如查询数据库,分装对象
2、V:视图层,JSP展示数据的
3、C:控制层,用于获取用户的输入,调用模型,将数据交给视图进行展示
解决IDEA导入maven过慢的办法,在创建maven时,添加如下标签
archetypeCatalog = internal
三层架构
在很长时间中,一直把springMVC的MVC和经典的三层架构给混为一谈,后来在开发中也是慢慢了解到,这两种压根就没有什么关系。
表现层(Presentation layer) 业务逻辑层(Business Logic Layer) 数据访问层(Data access layer)
Spring MVC工作流程
1、web.xml文件配置
服务器启动后根据web.xml文件创建一个DispatcherServlet对象并扫描Spring.xml配置文件。
<display-name>Archetype Created Web Application</display-name> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <!--扫描spring.xml文件--> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring.xml</param-value> </init-param> <!--启动服务就创建DispathcerServlet对象,并扫描spring.xml配置文件--> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> |
2、spring.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <!--设置扫描注解的包--> <context:component-scan base-package="cn"/> <!--设置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="suffix" value=".jsp"/> <!-- 视图后缀,controller中的方法返回的url字符串会添加该后缀 --> <property name="prefix" value="/WEB-INF/pages/"/> <!-- 视图前缀controller中的方法返回的url字符串会添加该前缀 --> </bean> <!--开启Springmvc框架注解的支持--> <mvc:annotation-driven/> </beans> |
MVC组件讲解
1、用户向服务器发送request请求,请求被SpringMVC中央控制器DispatcherServlet捕获;
2、DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping映射处理器,将请求发送给指定的Controller。
3、 Controller执行完成后,将返回的数据信息封装到ModelAndView对象中,最后通过ViewResolver视图解析器选择一个合适的View 渲染视图返回界面。
一言概之,request请求到中央控制器——>传到映射处理器——>转发到指定controller——>获取数据和view ,组成成ModelAndView组件——>通过ViewResolver返回到特定的前台页面。
RequestMapping属性讲解
/* path:当访问路径是/hi的时候调用下面方法进行处理 method:指定直接该路径的形式 params:执行请求该路径的参数 */ @RequestMapping(path = "/hi",method = {RequestMethod.POST},params = {"username"}) |
参数绑定
表单提交数据后自动封装数据到account bean中的对应属性中
<form action="user/sayno" method="post "> <input type="text" name="name"> <input type="password" name="passwd"> <input type="number" name="money"> <input type="submit" value="条件"> //封装到集合中或者列表当中 <input type="text" name="list[0].uname"> <input type="text" name="map['one'].age"> #<input type="text" name="user.name"> <input type="text" name="user.name"> </form> |
//请求该路径获取参数封装为account的bean @RequestMapping("/sayno") public String sayno(account account){ System.out.println("say no"); System.out.println(account); return "success"; } |
获取原生Servlet
//在方法参数中加入即可 public String sayhi(HttpServletRequest httpServletRequest,HttpServletResponse response){
常用注解
@RequestParam("name")参数绑定,将name和username参数绑定 public String sayno(@RequestParam("name") String username)
//绑定请求体 public String sayno(@RequestBody String body)
//将sid和Id做绑定,访问路径/sayno/10,id值即为10 @RequestMapping("/sayno/{sid}") public String sayno(@PathVariable(name="sid") String id)
@Autowrite 作用:自动按照类型注入,只要有唯一的类型匹配就能注入成功,当传入的类型不唯一时,则会报错(就是自动把前端传来的数据赋值给对应的属性) @Qualiier 作用:在自动按照类型注入的基础上,在按照bean的id注入。它在给类成员注入数据时,不能独立使用。但是再给方法的形参注入数据的时候,可以独立使用。(将对象与bean id绑定) @Transactional 事务管理 @response 将方法的内容作为返回体返回 |
@Resource @Resource(name="ps"):获取bean id为ps的bean Resource用法与@Autowired 用法 用法相似,也是做依赖注入的,从容器中自动获取bean。但还是有一定的区别。 https://blog.csdn.net/u010502101/article/details/78950045 /*纳入容器中后,bean的id名字为ps*/ @Component(value="ps") @ModelAttribute @ModelAttribute通常使用在Controller方法的参数注解中,用于解释model entity,但同时,也可以放在方法注解里。 如果把@ModelAttribute放在方法的注解上时,代表的是:该Controller的所有方法在调用前,先执行此@ModelAttribute方法 |
5、resful编程风格
6、Spring拦截器
.springmvc拦截器mvc:interceptors
mvc:interceptors用来拦截url请求。
正常的流程,应该是DispatcherServlet先获取所有的URL请求,然后依据规则分发给可以处理这些请求的controller。
而是用mvc:interceptors后,流程变成了:DispatcherServlet先获取所有的URL请求,对于符合拦截器要求格式的URL,先分发给拦截器处理,最后再分发给可以处理这些请求的controller。
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/static/**" /> <bean class="com.xxx.interceptor.LoginRequiredInterceptor" /> </mvc:interceptor> </mvc:interceptors> |
在springmvc中,定义拦截器要实现HandlerInterceptor接口,并实现该接口中提供的三个方法,如下:
//测试拦截器1 public class HandlerInterceptor1 implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("HandlerInterceptor1....preHandle"); //false表示拦截,不向下执行;true表示放行 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("HandlerInterceptor1....postHandle"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("HandlerInterceptor1....afterCompletion"); } } |
preHandle方法:进入Handler方法之前执行。可以用于身份认证、身份授权。比如如果认证没有通过表示用户没有登陆,需要此方法拦截不再往下执行(return false),否则就放行(return true)。 postHandle方法:进入Handler方法之后,返回ModelAndView之前执行。可以看到该方法中有个modelAndView的形参。 应用场景:从modelAndView出发:将公用的模型数据(比如菜单导航之类的)在这里传到视图,也可以在这里同一指定视图。 afterCompletion方法:执行Handler完成之后执行。应用场景:统一异常处理,统一日志处理等。 |
HanderInterceptorAdaptor继承了AsyncHandlerInterceptor,在拦截器中实现了afterCompletion,afterConcurrentHandlingStarted。以下是对这俩个方法的介绍
继承HandlerInterceptor的接口,额外提供了afterConcurrentHandlingStarted方法,该方法是用来处理异步请求。 当Controller中有异步请求方法的时候会触发该方法。 楼主做过测试,异步请求先支持preHandle、然后执行afterConcurrentHandlingStarted。 异步线程完成之后执行preHandle、postHandle、afterCompletion。 |
原文始发于微信公众号(安全宇宙):【创宇小课堂】JAVA代码审计-MVC入门
- 我的微信
- 微信扫一扫
-
- 我的微信公众号
- 微信扫一扫
-
评论