springmvc简介

SpringMvc的框架,是spring框架的一个模块。spirngmvc用mvc的设计模式,完成了Struts完成的事情

struts.xml:1 .配置了访问的url  ;  2.配置了某个类的处理方法3.根据返回的结果(success,String),访问指定的jsp

组件:

1.前端控制器(中心)——DispatcherServlet
2.处理器映射器(三大组件之一)——HandlerMapping  1.配置了访问的url
3.处理器适配器(三大组件之一)——HandlerAdapter   2.配置了某个类的处理方法

-----------------------------[Handler处理器,真正的处理方法,类似Struts中的action,需要自己开发的java代码]

4.视图解析器(三大组件之一)——View resolver   3.根据返回的结果(success,String),访问指定的jsp,添加前后缀

-----------------------------jsp需要自己开发

配置文件编写

一.web.xml配置

1.加载spring容器
    <!-- 加载spring容器 --><context-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/classes/spring/applicationContext.xml,/WEB-INF/classes/spring/applicationContext-*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
2.post乱码处理的过滤器
<!-- post乱码处理 -->
<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>utf-8</param-value></init-param>
</filter>
<filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern>
</filter-mapping>

对于get请求中文参数出现乱码解决方法有两个:
修改tomcat配置文件添加编码与工程编码一致server.xml,如下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>

另外一种方法对参数进行重新编码:
String userName new 
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码

3.映射springmvc的全局配置文件  springmvc.xml、/WEB-INF/projectName-servlet.xml
    <!-- 前端控制器 --><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- contextConfigLocation指定 springmvc的全局配置文件 如果 contextConfigLocation不指定,默认找配置文件名称:/WEB-INF/servlet的name+"-servlet.xml" --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring/springmvc.xml</param-value></init-param></servlet>
    <servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.action</url-pattern></servlet-mapping>
4.welcome界面配置
    <welcome-file-list><welcome-file>index.html</welcome-file><welcome-file>index.htm</welcome-file><welcome-file>index.jsp</welcome-file><welcome-file>default.html</welcome-file><welcome-file>default.htm</welcome-file><welcome-file>default.jsp</welcome-file></welcome-file-list>

二.映射springmvc的全局配置文件  springmvc.xml、/WEB-INF/projectName-servlet.xml

可以写spring扫描器
    <!-- 组件扫描 只扫描action --><context:component-scan base-package="cn.xx.project.action" />
1.HandlerMapping  HandlerAdapter配置
方法一:配置

1.处理器映射,多个处理器映射器可以共存

BeanNameUrlHandlerMapping:根据url匹配配置bean的name[第3点]   处理器映射器实现了HandlerMapping接口
SimpleUrlHandlerMapping:将url进行集中配置。

2.处理器适配器,多个处理器适配器可以共存

SimpleControllerHandlerAdapter:规则是Handler要实现Controller接口[第3点class类]
HttpRequestHandlerAdapter:规则是Handler要实现HttpRequestHandler接口。

3.配置action  bean  类似Struts.xml

<bean name="/xxx.do"  class="com.xx.aa"/>

方法二:注解

方法1

 <!--注解映射器 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" /> <!--注解适配器 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><!--json转换器 --><property name="messageConverters"><list><beanclass="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean><list></property></bean> 

方法2

 <!-- 使用<mvc:annotation-driven />替换上边定义的处理器映射器和适配器 --><mvc:annotation-driven />
2.view resolver 视图解析器
<!-- 视图解析器 解析jsp视图,默认使用jstl,要求classpath下有jstl的jar包 -->
<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 视图的前缀 --><property name="prefix" value="/WEB-INF/jsp/" /><!-- 视图的后缀 --><property name="suffix" value=".jsp" />
</bean>

Springmvc注解

1.@controller

标识该类为控制器类,@controller、@service、@repository分别对应了web应用三层架构的组件即控制器、服务接口、数据访问接口

2.@RequestMapping

1.进行url映射,一个方法对应一个url,定义方法:在action方法上定义requestMapping
2.根路径+子路径
需求:为了很好的管理url,为了避免url的冲突,使用根路径+子路径
定义方法:
根路径:
在类名上边定义@RequestMapping("/parentPath")
子路径:
在方法上边定义@RequestMapping("/childPath")
最终访问路径:根路径+子路径:/parentPath/childPath.do    .action
3.uri模板模式映射  : restful
将参数在url中传递。
定义方法:
    @RequestMapping("/memberLogin2/{id}")public String restFul(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model,@PathVariable String id){return "/jspPath";}

<a href="/aa/${bean.id}.do">

4.请求方法限定
    @RequestMapping(value = "/memberLogin2/{id}", method = RequestMethod.POST)public String restFul(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model,@PathVariable String id){return "/jspPath";}

如果get请求:HTTP Status 405 - Request method 'GET' not supported

GET和POST都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})

3.请求参数绑定 —— 参数解析器

支持参数:

1.HttpServletRequest、HttpServletRequest、HttpSession、Model、
2.String、int、double等简单类型

注意:对于date类型的参数需要注册属性编辑器。

//注册一个属性编辑器@Overrideprotected void initBinder(HttpServletRequest request,ServletRequestDataBinder binder) throws Exception {//将student类中的birthday属性进行日期转换,类型和birthday一致binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));}

建议将此方法定义在父类中,让action类继承此父类。

3.pojo自动反射bean属性赋值

界面  name=“age” ——  action方法 参数Student student

界面  name=“score.english” ——   action方法 参数Student 里面有属性 score对象

4.字符串数组绑定

界面 name=“ids”、  name=“ids”   方法参数  String[] ids

5.list
界面 name="scores[0].english" name="scores[1].english" ——action方法 参数Student 里面有属性  List<Score> scores集合
6.@RequestParam绑定单个请求参数
value、requested、defaultValue
    @RequestMapping(value = "/memberLogin2/{id}", method = RequestMethod.POST)public String requestParam(@PathVariable String id,@RequestParam(value = "jspId", required = true, defaultValue = "1") String jId){return "/jspPath";}

4.forward、redirect

Forward:页面转发

浏览器中地址栏的url通过Forward不变,没有重新定义了一个request。Action方法通过Forward转发到另一个方法,方法形参可以带到另一个方法。
定义方法:

return “forward:/aa/aa.do”;
Redirect:请求重定向

浏览器中地址栏的url通过Redirect变了,重新定义了一个request。Action方法通过Redirect重定向到另一个方法,方法形参无法带到另一个方法。
定义方法:

return “redirect:/parentPath/xx.do”;

5.@RequestBody @ResponseBody实现json数据交互

1.@RequestBody将请求的json串转成java对象
添加jackson-core  jsckson-mapper 包
在springmvc.xml中的处理器适配器中添加json转换器
    <!--注解适配器 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><!--json转换器 --><property name="messageConverters"><list><beanclass="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean><list></property></bean> 
 @RequestMapping(value = "/memberLogin2/{id}", method = RequestMethod.POST)public @ResponseBody Member json(@RequestBody Member member){return member;}

拦截器

拦截器是针对handlerMapping的拦截器,由handlerMapping查找Handler后,将拦截器返回给前端控制器。

java拦截器代码

public class MyHandlerInterceptor implements HandlerInterceptor
{/*** handler,springmvc根据url找到Handler(只有一个方法) 执行:进入Handler方法之前执行;false* 拦截,true放行 使用场景:用于用户身份校验;用户权限拦截校验*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{System.out.println("preHandle_called");return true;}/*** 执行:进入Handler方法执行完毕之后 ,在返回modelAndView之前* 使用场景:使用modelAndView,向页面传递通用数据,使用统一的view;*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception{System.out.println("postHandle_called");}/*** 执行:Handler方法执行完成,(modelAndView已经返回) 使用场景: 统一异常处理; 统一记录系统日志;* 用于action方法执行监控* (在preHandle记录一个时间点,在afterCompletion记录执行结束时间点,将结束时间点减去开始执行时间点,得到执行时长);*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)throws Exception{System.out.println("afterCompletion_called");}
}

springmvc.xml配置

1.命名空间
<?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:p="http://www.springframework.org/schema/p"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsdhttp://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
2.配置
    <!--拦截器 --><mvc:interceptors><!--多个拦截器,从上往下,<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">顺序执行 </span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;"> --></span><mvc:interceptor><mvc:mapping path="/**" /><bean class="cn.xxx.project.interceptor.<span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">MyHandlerInterceptor</span><span style="font-size: 12px; font-family: Arial, Helvetica, sans-serif;">"></bean></span></mvc:interceptor></mvc:interceptors>  

多个拦截器执行顺序

1.两个都放行
MyHandlerInterceptor1..preHandle
MyHandlerInterceptor2..preHandle

MyHandlerInterceptor2..postHandle
MyHandlerInterceptor1..postHandle
MyHandlerInterceptor2..afterCompletion
MyHandlerInterceptor1..afterCompletion
2.第一个放行第二个不放
MyHandlerInterceptor1..preHandle
MyHandlerInterceptor2..preHandle
MyHandlerInterceptor1..afterCompletion

3.两个都不放行

MyHandlerInterceptor1..preHandle
总结:
只要一个拦截器preHandle不放行,action方法不执行,所有的postHandle就不会执行;
前面放行的拦截器的afterCompletion才反响执行;

springmvc拦截器Interceptor和过滤器Filter区别

①拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  ④拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  ⑤在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。
  ⑥拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。

参考

springmvc与Struts

1、springmvc的入口是servlet,struts是filter

2、springmvc是基于方法开发,struts是基于类开发:
action类中,一个url对应一个方法,对Handler对象,springmvc框架将一个方法封装到Handler中(只有一个method)。Struts对action类进行实例化。
Springmvc中的action可以使用单例也可以使用多例,建议使用单例(对相同的方法只new一个)。
Struts不能用单例,因为struts传递参数是通过成员变量。
Springmvc通过形参接收参数好处:更符合软件开发的思想,和service接口类似。

3、Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, 
springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。

SSM——SpringMVC相关推荐

  1. java进销存系统静态页_java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码...

    系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM ...

  2. java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码

    统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM 普通 ...

  3. 利用SSM(springmvc+spring+mybatis)实现多表联合查询

    最近在做在eclipse + maven搭建SSM框架下做一个简单的后台管理系统,因为是第一次搭建SSM项目,在mybatis进行多表连接查询的时候遇到问题,不知道如何进行处理?在网上搜了一下解决方法 ...

  4. SSH(Struts,Spring,Hibernate )和SSM(SpringMVC,Spring,MyBatis )的区别,抽丝剥茧的给你讲清楚

    SSH 通常指的是 Struts2 做前端控制器,Spring 管理各层的组件,Hibernate 负责持久化层. SSM 则指的是 SpringMVC 做前端控制器,Spring 管理各层的组件,M ...

  5. java 进销存C S_java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码

    系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM ...

  6. java进销存储管理系统_java 库存 进销存 商户 多用户管理系统 SSM springmvc 项目源码...

    系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM ...

  7. 1 (SSM) springMVC + spring + Mybatis(MySQL)学习笔记 ------ 阶段成果笔记

    学习了一段时间spring,springMVC和Mybatis,从开始学到现在熬了好多夜晚,好几个深夜和bug作战,真是难受. 打算写系列学习笔记,第一篇从一个小的成果说起吧,刚刚学的看这篇可能有点吃 ...

  8. 5.概念(maven,ssm,springMvc,spring,自定义注解,二级缓存,范式,事务,mysql,线程池,map,hashmap,redis,饿汉,懒汉)

    maven是啥: 1.Maven是一个项目管理和综合工具.Maven提供了开发人员构建一个完整的生命周期框架. 创建-导入jar报–编写配置文件-实现业务功能-测试-发布上线. 2.开发团队可以自动完 ...

  9. 【SSM - SpringMVC篇】03 - SpringMVC的参数绑定 - 参数自动绑定 - javabean对象参数绑 - 嵌套bean参数绑定

    文章目录 SpringMVC的参数绑定 1 传统方式进行参数传递 2 通过SpringMVC的参数绑定实现[***用这个就行] 2.1 SpringMVC的基本数据类型的参数绑定 2.1.1 方法形式 ...

最新文章

  1. Spring 基于Java配置
  2. python遗传算法工具包_Deap: python中的遗传算法工具箱
  3. 【itext学习之路】--4.给pdf增加文本水印和图片水印
  4. python以运行效率高著称吗_提升Python程序运行效率的6个方法
  5. 一文总结熵,交叉熵与交叉熵损失
  6. shell基础之EOF的用法
  7. hadoop集群配置和在windows系统上运用java操作hdfs
  8. 【转】java中的Map集合
  9. 试看5分钟视频python_清华学姐推荐的Python视频400集,拿走不谢!
  10. 26.【案例:敏感词汇过滤】
  11. 计算机基础考试大一计算题,计算机基础复习(大一)计算机基础上机题库
  12. spring基础--注解配置ssm开发环境
  13. Android百度离线地图
  14. 《球机3D定位解析及ONVIF实现》
  15. 【Spring+Mybatis】 Invalid bound statement (not found): com.xxxx.mapper.UserMapper.selectUser
  16. VB问题——ByRef参数类型不符
  17. NOI2009 诗人小G
  18. filebeat k8s健康探针
  19. Pytorch —— nn.Module类(nn.sequential)
  20. [论文笔记] In-Memory Fuzzing for Binary Code Similarity Analysis

热门文章

  1. 一 、单片机IO实验
  2. 美国名校为何青睐爱吃泡面的考生
  3. 改进的判定条件覆盖讲解和真值表书写
  4. 激荡十年:详谈云计算的过去、现在和未来
  5. vue打印插件的使用
  6. 嵌入式之Linux的LCD背光调节及驱动的工作原理
  7. 高等数学|一致连续性与连续性
  8. 无法打开虚拟机“Ubuntu”,ubuntu.vmx获得所有权失败
  9. HIP4082电机驱动电路详解
  10. 通过计算机组成原理你能得到什么?