Spring MVC 简单梳理

Spring MVC 和 Struts2  ---》实现MVC的结构
为什么使用:从模仿者变成了领跑者
 

1.网页开发模式的演化

CGI--》servlet--》jsp--》标签库<jsp>,EL,JSTL-->mvc(model1,model2)
    
Spring MVC 使用的是基于Model2 的技术框架
Model1:
Model1的中心是JSP页面,JSP页面中结合业务逻辑、服务端处理过程和HTML等,这样就在JSP页面中同时实现了业务逻辑和流程控制。从而快速开发。
 
Model1的优缺点:
优点:简单,快速开发,适用小规模开发
缺点:业务逻辑和表示逻辑混合在JSP页面中没有进行抽象和分离,JSP负载太大。所以非常不利于应用系统业务的重用和改动,不便于维护
 
Model2:
Model 2表示的是基于MVC模式的框架。MVC “Model”代表的是应用的业务逻辑(通过JavaBean,EJB组件实现),“View”是应用的表示面(由JSP页面产生),“Controller”是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。这些组件可以进行交互和重用。从而弥补了Model1的不足。
 
Model2其实是在Model1基础上又抽了一层控制层。
 
Model2优缺点:
优点:具有组件化的优点从而更易于实现对大规模系统的开发和管理。职责划分清晰。
缺点:不适合小项目开发

2.spring MVC流程展示

3.配置DispatcherServlet

默认获取地址:
[/WEB-INF/chapter2-servlet.xml]    
默认名称:[servlet-name]-servlet.xml
 
<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-servlet-config.xml</param-value>
</init-param>
 
自定义的获取地址:
[spring-servlet-config.xml]
 

4.相关组件说明,及默认配置

spring 3.1 之后 提供了更好的实现
RequestMappingHandlerMapping
RequestMappingHandlerAdapter
 

5.接口的形式配置handler

接口的实现方式(继承的实现方式)  实现Controller
在2.5版本之前使用较多,2.5之后逐渐被注解替代
 

6.@controller和@Requestmapping(其属性与HTTP请求的对应)

替换组件的实现类,来支持注解的实现方式
@Requestmapping
target:Method,Type
属性:value(),path(),params(),headers(),method(),consumes(),produces()
 

7.数据收集与数据绑定

支持的参数类型:
类型说明描述
ServletRequest请求 
HttpServletRequestHTTP请求 
ServletResponse响应 
HttpServletResponseHTTP响应 
InputStream请求正文(字节流)等价于request.getInputStream()
OutputStream响应正文(字节流)等价于response.getOutputStream()
Reader请求正文(字符流)等价于request.getReader()
Writer响应正文(字符流)等价于response.getWriter()
WebRequest统一请求访问接口webRequest.getParameter:访问请求参数区的数据,可以通过getHeader()访问请求头数据;

webRequest.setAttribute/getAttribute:到指定的作用范围内取/放属性数据,Servlet定义的三个作用范围分别使用如下常量代表:

SCOPE_REQUEST :代表请求作用范围;

SCOPE_SESSION :代表会话作用范围;

SCOPE_GLOBAL_SESSION :代表全局会话作用范围,即ServletContext上下文作用范围。

 

NativeWebRequest额外提供访问本地servlet APInativeWebRequest.getNativeRequest/nativeWebRequest.getNativeResponse:得到本地的Servlet API
HttpSession会话此处的session永远不为null。

 

注意:session访问不是线程安全的,如果需要线程安全,需要设置AnnotationMethodHandlerAdapter或RequestMappingHandlerAdapter的synchronizeOnSession属性为true,即可线程安全的访问session。

命令对象/表单对象一个自定义类Spring Web MVC能够自动将请求参数绑定到功能处理方法的命令/表单对象上。
Model同一个对象渲染视图需要的模型数据
注意和ModelAndView中model的关系
Map
ModelMap
RedirectAttributesreturn "redict:xxx/xxx" 相关类addFlashAttribute()
SessionStatus .setComplete()
 
 
注解:
@CookieValue、@RequestHeader、@PathVariable、@RequstParam、@RequestBody
@ResponseBody
  1. 引入json的转换包。需要引入如下2个包:
复制代码
jackson-mapper-asl-1.9.13.jar
jackson-core-asl-1.9.13.jar
复制代码

  2. spring-servlet.xml文件中需要配置转换的bean

复制代码
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <util:list id="beanList">
                <ref bean="mappingJacksonHttpMessageConverter" />
            </util:list>
        </property>
    </bean>
    <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>
复制代码

3. 最后,别忘了还要声明util的schema文件和地址,在spring-servlet.xml文件的头部声明部分加入如下三行即可

xmlns:util="http://www.springframework.org/schema/util"
       http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util-3.0.xsd
 
@ModelAttribute
    1) 标注方法的返回值,以给定名称作为属性名,设置到model当中(可支持列表List)
    2) 标注处理器方法参数,将参数 以给定名称作为属性名,设置到model当中。此处会检测有无普通方法标注的同名属性,如果名称相同,则使用该方法返回值作为此处对象;如果没有,则新建一个。
 
@RequestMapping(value="/model1") //②
public String test1(@ModelAttribute("user") UserModel user, Model model) {
       System.out.println(model.containsAttribute("cityList"));
       System.out.println(user);
       return "success";
 }
 
@SessionAttribute
    1)方法开始前,从session中获取value属性指定的名称所对应的值 ,找到后,将该值存入model当中
    2)方法结束时,从model中找value属性指定的名称所对应的值,存入session中
属性:value(),type()
taget: type
 

8.拦截器

  1. preHandle方法:进入Handler方法之前执行。可以用于身份认证、身份授权。比如如果认证没有通过表示用户没有登陆,需要此方法拦截不再往下执行(return false),否则就放行(return true)。
  2. postHandle方法:进入Handler方法之后,返回ModelAndView之前执行。可以看到该方法中有个modelAndView的形参。应用场景:从modelAndView出发:将公用的模型数据(比如菜单导航之类的)在这里传到视图,也可以在这里同一指定视图。
  3. afterCompletion方法:执行Handler完成之后执行。应用场景:统一异常处理,统一日志处理等。
配置:
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="handlerInterceptor1"/>
            <ref bean="handlerInterceptor2"/>
        </list>
    </property>
</bean>
<bean id="handlerInterceptor1" class="ssm.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="ssm.intercapter.HandlerInterceptor2"/>
或者
 
<!-- 配置拦截器 -->
<mvc:interceptors>
    <!-- 多个拦截器,按顺序执行 -->        
    <mvc:interceptor>
        <mvc:mapping path="/**"/> <!-- 表示拦截所有的url包括子url路径 -->
        <bean class="ssm.interceptor.HandlerInterceptor1"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="ssm.interceptor.HandlerInterceptor2"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="ssm.interceptor.HandlerInterceptor3"/>
    </mvc:interceptor>
</mvc:interceptors>
 
 

不拦截静态资源

  如果配置拦截类似于*.do格式的拦截规则,则对静态资源的访问是没有问题的,但是如果配置拦截了所有的请求(如我们上面配置的“/”),就会造成js文件、css文件、图片文件等静态资源无法访问。

  拦截器的主要作用是是用于权限管理,拦截不合理的URL,所以不对静态资源进行拦截

  方案:使用<mvc:resources/> (mapping:请求,location:映射地址,注意必须是webapp根目录下的路径。)  

springMVC配置文件
<mvc:resources mapping="/css/**" location="/css/"/> <mvc:resources mapping="/images/**" location="/img/"/> <mvc:resources mapping="/js/**" location="/js/"/>
 
 
 
 
 
 

转载于:https://www.cnblogs.com/how-do/p/7495428.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值