【创宇小课堂】JAVA代码审计-MVC入门

admin 2022年1月13日19:00:50评论88 views字数 5862阅读19分32秒阅读模式

1、M:模型层,完成具体的业务操作,如查询数据库,分装对象

2、V:视图层,JSP展示数据的

3、C:控制层,用于获取用户的输入,调用模型,将数据交给视图进行展示

【创宇小课堂】JAVA代码审计-MVC入门

解决IDEA导入maven过慢的办法,在创建maven时,添加如下标签

archetypeCatalog = internal



三层架构




在很长时间中,一直把springMVC的MVC和经典的三层架构给混为一谈,后来在开发中也是慢慢了解到,这两种压根就没有什么关系。

表现层(Presentation layer) 业务逻辑层(Business Logic Layer) 数据访问层(Data access layer)

Spring MVC工作流程

【创宇小课堂】JAVA代码审计-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返回到特定的前台页面。

【创宇小课堂】JAVA代码审计-MVC入门


【创宇小课堂】JAVA代码审计-MVC入门



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

将方法的内容作为返回体返回



【创宇小课堂】JAVA代码审计-MVC入门


【创宇小课堂】JAVA代码审计-MVC入门

@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编程风格

【创宇小课堂】JAVA代码审计-MVC入门


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入门


【创宇小课堂】JAVA代码审计-MVC入门

【创宇小课堂】JAVA代码审计-MVC入门

原文始发于微信公众号(安全宇宙):【创宇小课堂】JAVA代码审计-MVC入门

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年1月13日19:00:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【创宇小课堂】JAVA代码审计-MVC入门http://cn-sec.com/archives/735686.html

发表评论

匿名网友 填写信息