springMVC

框架重量级和轻量级的区分在于依赖其他组件的多少,依赖其他组件少就是轻量级的,依赖其他组件多就是重量级的
springMVC将web层的功能进行了解耦,实现了松散耦合可插拔的组件结构
servlet有一个属性 load-on-startup 默认是0 代表的是该servlet第一次被访问后进行实例化 大于1代表容器一创建随之实例化servlet 数字越小越小创建

springMVC简单入门总结
SpringMVC是一个web层的框架,它将web层的功能进行了解耦,分为MOdel(数据模型) view(视图) controller(控制器) 工作原理如下:
用户访问controller,controller将用户的请求信息提交给model,经过model处理返回数据,controller再将数据发送给view,view拿到数据进行视图渲染,并将渲染后的数据返回给用户
具体步骤及细节:
1.首先在web.xml中配置SpringMVC框架的核心(DispatchServlet,这是框架已经写好的类),设置随web容器的创建而实例化
2.和web.xml平级创建调度servlet的配置文件(这是一个springCof,直接用模板就可以)
3.在springmvc-servlet.xml中配置相关的组件
3.1BeanNameurl映射处理器
3.2simpleControllerHanderAdapter控制器适配器
3.3控制器,自己创建一个类实现Controller接口 里面返回ModernAndView,自己设置viewname和model内容
3.4内部资源解析器innerResourceViewResover 配置prefix 前缀(/WEB-INF/目录名/) 和 suffix后缀 .文件类型

DispatcherServlet里面内置了BeannameUrlHanderMapping映射处理器和SimpleControllerHanderAdapter处理器适配器 所以我们不配置也没有问题
现在关键的问题是只能一个类对应一个处理器,我们希望的是一个方法对应一个处理器

现在可用到@RequestMapping注解 它会将请求的url映射到相应的控制器和方法上 控制器上也可以加这个注解,不加的话默认就是没有 在控制器上可以加上@Controller注解 然后开启注解扫描就不用配置了

使用@RequestMapping注解后发现不配置映射处理器和处理器适配器也能正常的访问
查看dispatcherServlet源码发现它内置的处理器映射器和处理器适配器除了之前所说的beannameHanderMapping和SimpleControllerHanderAdapter之外还有annotationHanderMapping和annotationHanderAdapter
在使用注解的时候会默认使用后面两个注解版组件
但是经过查看这两个注解版的组件都已经过时了,推荐使用的是RequestMappingHanderMapping 和 RequestMappingHanderAdapter 过时的虽然能用但是不好,所以我们在使用时配置两个新的映射器和适配器
但是这么配置还是感觉麻烦,spring又提供了简化的做法,那就是开启注解驱动 mvc:annotation-driven 这一句话就代表了上面的两个配置

在高版本的spring中,已经改了,默认的映射器和适配器都改成了requestMapping 不用加注解驱动了

@RequestMapping 注解里的内容 写访问的url路径 /可以写也可以不写,不写spring会自动加上一个/的

Ant风格映射
?代表一个字符
*代表0个或多个字符
**代表的是0个或多个子路径
如果一个请求路径多个资源都可以匹配上,spring遵循的是最长匹配原则,即最相似原则

占位符映射 @RequestMapping("/user/{id}") 只要是/user/xxx的请求路径都可以过来访问此方法 show(@PathVariable(“id”)int id) 并且方法会取得访问路径中的内容作为方法的参数
占位符映射可以获取请求路径中的值作为参数

请求方法的限定 method属性
请求参数的限定 params属性

springmvc的配置文件默认是放在WEB_INF下面的,但是也可以放在类路径下面
但是就需要在初始化dispetcherServlet的时候加载它的init-param初始化参数(该参数是servlet标签内的) contextConfigLocation指定配置文件的位置

servlet的urlpattern 匹配优先级是 1.完全匹配 2.路径匹配 /也属于(一般用于过滤器) 3..do扩展名匹配 4./ 最后匹配

通过@Controller注解不仅可以把类作为组件,还代表它是一个控制器 这样就不用实现Controller接口了

tomcat7在处理url上的中文时,会出现乱码.原因是中文以二进制传输过来后,服务器按照默认的iso-8859-1对其进行了解码,但是我们传的是UTF-8格式的,随意就出现了乱码,于是我们要先进行iso-8859-1编码然后utf-8解码才能解决这一问题 tomcat8已经帮我们解决了此问题

WEB-INF下的内容是不能通过浏览器直接访问的,但是java项目内部的代码时可以访问的

springmvc的Json功能底层依赖的是Jackson这个Json工具

如果在方法上注解@ResponseBody 框架就不会按照默认的视图解析器去解析资源,而是直接将结果响应到响应体中,因为网络传输涉及到类型转换,对象需转换成Json格式,而内置的Jackson工具会完成这一功能

springmvc允许直接返回一个字符串作为视图的名称 也可以把视图和模型分离在参数中注入model对象

在springmvc中转发和重定向也非常的简单,直接在返回的字符串前加上前缀就可以 redirect: 重定向 forward:代表的是请求转发

如果只返回一个状态码,别的什么都不返回的话,在方法上加一个@ResponseStatus 响应状态码的注释,并指定响应的状态码,框架就不会走默认的视图解析器了

@RequestParam 注解不仅可以获取到get方式请求的参数 也可以获取到表单方式提交的参数(即post方式) 但是现在存在一问题,如果请求的参数10000个我就接受1万个参数吗?答案是否定的,框架会帮我们将请求的参数封装到对象中,我们在方法参数上定义一个接受参数的对象就可以了. 这里用到的是JavaBean的set方法,其中以is开头的变量,set方法会将is省略掉,这个需要注意

@RequestParam 这个注释里面有3个属性 value 参数的名字 required 默认是TRUE 必须提交此参数,否则报错 defaultValue 此值设置后,required默认改为false 如果此参数未传递,则采用此默认值

@CookieValue这个注解就可以获取cookie的值

springmvc接收的参数都必须放到一个javaBean中,不能直接放入到集合或者数组中 前端的参数名如果是 users[0].name users[1].name 后端需要有一个UserFrom(也可以叫其他)里面需要包含users数组,这样就可以封装进去了

@ResponseBody是把返回值javaBean对象转换成Json 称为序列化 而@RequestBody 是把请求的Json字符串转化为javaBean对象 是反序列化

MultipartResolver 文件上传解析器 MultiPartFile是springmvc中定义的类,放在方法的参数部分会自动注入

springmvc中有处理器拦截器,handlerInterceptor 在转发servlet找到处理器映射器后会返回一个handlerInterceptorchain 拦截器链 里面含有处理器和拦截器
拦截器中有三个方法 处理前方法preHandler 处理后方法postHandler 和完成方法afterCompletion 自定义的拦截器要实现HandlerInterceptor接口
多个拦截器处理前方法按顺序执行,处理后方法和完成方法倒序执行 ,如果处理前方法返回false则停止,跳过本拦截器,执行下一个拦截器的完成方法
拦截器的配置有全部拦截和精确拦截两种

@Transaction注解可以加在方法上,也可以加在类上,加在方法上就是仅仅一个方法 加在类上的话类下的所有方法都生效受事务的管理

@ExceptionHandler 这个注解 代表被注解的方法是一个 异常处理器 发生异常后执行这个方法
注解版异常只能简单获取异常类型和原因不能获得更加详细的信息,而自定义异常类及异常处理类可以获得详细的异常信息 且可以自定义我们特定的异常

如果将dispatcerServlet的请求路径映射为/,那么所有的请求都会被拦截,包括静态资源,当静态资源被拦截后无法找到对应的视图解析器就会报错.如何解决这个问题呢
进行配置mvc:default-servlet-handler/ 这样配置在经过转发servlet之前框架会先将静态资源交给web容器去处理,其他的非静态资源才会交给转发servlet去处理

mybatis有一个pageHelper分页插件 进行导jar包(两个)和配置mybatis配置文件后可以帮助我们完成分页的功能,简化开发 重要的一点是不同数据库的分页语言不同,而使用分页插件支持各种语言提供了代码的扩展性 同时简化了mapper接口和配置文件,避免了重复的sql语句

在跳转的时候发现,无论跳转到用户列表还是跳转到新增用户等都是直接返回一个字符串,而且返回的字符串可以和路径保持一致,这样我们就可以对此通用的功能进行抽取,利用url占位符进行变化部分的代替,优化代码

前端给的字符串的日期无法转换成java的日期格式,需要在日期字段上加一个@DateTimeFormat注解 指定字符串的格式,这样就可以进行字符串和日期的转换了 报错后要及时查明报错原因

在注解的动态sql的时候,注意在方法和内部类方法的参数上要加上@Param注解 前端给的Json字符串如果仅仅是一个对象我们不能用list接收,我们可以用@requestParam接收

springMVC和struts2 框架的区别
相同点:它们都是web层的框架,都是基于MVC模型的 它们都有一个核心的控制器 它们都是基于servletAPI的
不同点:
springMVC的核心控制器是一个servlet Struts2的核心控制器是一个filter
springmvc是基于方法设计的 Struts2是基于类设计的,每次执行都会创建一个动作类,所以效率要低于springmvc
Struts2的OGNL表达式使页面的开发效率高于springmvc但是执行效率并没有比jstl更高

如果创建一个带骨架的maven项目过慢的话,可以在创建好名称之后,finish之前加入一个property archetypeCatalog internal 使用本地的骨架类型,就不会去网络上下载了

如果springmvc的配置文件全部在一起的话,servlet设置load-on-start为1 init-param 设置上配置文件的路径 那么web项目一启动就加载spring配置文件 就有spring容器了 之前的web监听器就不需要了
配置文件分开的情况下,才需要这么做(分别加载)

springMVC三大组件 处理器映射器 处理器适配器 视图解析器

@RequestMapping注解的作用,是建立url请求和处理请求的方法之间的映射关系

后台请求参数的接收,如果接收的参数名和前端传的参数名一致的话,会直接赋值,不用@RequestParam 如果后台的参数名会变化则可以使用@RequestParam(“前端的参数名”)

前端的参数名和后端的对象的属性名一致的话,框架帮我们直接将前端请求参数封装到对象中 如果对象中含有引用数据类型 那么前端参数名= 引用属性名.引用属性值 即可进行赋值 原理同OGNL对象图导航语言
如果一个对象里面有listlist 和Map map 那么前端属性名是这样便可以封装进去 list[0].username list[0].age map[“one”].username map[“one”].age 意思是map中存着one这个user user的属性是username 和age

springmvc框架中提供了解决乱码问题的过滤器,我们在web.xml中进行配置即可

springmvc框架会将前端提交的数据自动转换为我们需要的类型,包括把字符串转换为日期,因为各个类型在某些非特殊情况下之间是可以转换的 2000/12/12 它可以把这个字符串转换成日期 但是2000-12-12就不可以了 那么就涉及到了自定义类型转换器

因为有些数据格式是SpringMVC框架帮我们转不了的,需要我们自己来创建一个自定义的类型转换器,实现Converter接口
然后在spring配置文件中进行配置 转换器工厂 下面有一个属性 converters这是一个set集合 需要将我们自定义的转换器加入到这个集合中,这样框架就可以帮我们转换类型了

@RequestBody 注解可以拿到请求体的内容 格式是 name=zhangsan&age=18 并不是Json字符串 前端定义数组var ids={1,2,3} 前端发送ajax请求参数为 {ids:ids} 用@RequestBody注解后得到的ids=1,2,3

前端数组传递到后端的RequestBody 得到的是 ids=15,16 这样的字符串 requestBody只能被字符串或者是javaBean接收(会进行赋值) 只能用于post请求方式

requestParam 可以被基本数据类型/字符串(15,16)或集合数组接收
前端传过来的数据,不用任何注解,框架可以自由的封装,将部分数据封装到对象 或者封装为单个基本数据类型 但是用上了以后就不一定了
id=15,16 不用@RequestParam 封装不到list或数组中,用了才可以,看来加了注解有强制类型转换的作用

@RequestHeader可以获得指定名称请求头的信息
@CookieValue可以获得指定名称的cookie的值

@ModelAttribute注解 在方法上此方法优先于其他方法先执行 并且有返回值的话返回值会作为其他方法的参数,直到被新传入的参数取代,未取代的部分就按照此方法的结果执行
如果它注解的方法没有返回值 那么也可以在方法参数上增加一个map或其他对象 一会其他方法执行的时候可以在参数上进行此注解指定先执行时内部存放的对象

model对象存储的内容,底层会存到request对象中

@SessionAttributes这个注解是注解在类上面的 @SessionAttribute不加s的这个注解是注解在元素上面的
前者注解并指定了属性名后,model存放此名称的属性就会同时放到session中 默认是放到request中的 这样就实现了数据的共享, @SessionAttribute不加s的这个注解 就可以取得session中的值了
Model是个接口,它的实现类ModeMap继承了LinkedHashMap

请求转发和重定向后后面的代码还会执行,所以要加return

@RequestMapping 注解的方法如果返回值是void 那么默认 视图解析器会解析此注解的路径 没有就会报错 以下三种方式不会报错
1.进行请求转发
2.进行重定向
3.向页面响应内容

<mvc:resources location="" mapping=""> 这个标签可以放行静态资源

@requestBody 注意事项 :前端发过来的 是不是Json应该由 ajax决定 并且得用$.ajax 需要指定dataType 和contentType type是post类型的 另外data : ‘{}’ 一定注意大括号外的单引号 另外Json字符串的每一个属性都需加引号(否则错误,血的教训) 值数字类型的可不加引号 细节一定注意!!!

form表单文件上传,必须具备的条件 form表单的enctype 选择 multipart/form-data method必须是post 因为post上传的大小不受限制 有一个 的输入框
另外需要导入 commons-fileupload 和commons-io jar包

springmvc实现文件上传需要配置一个文件解析器

出现异常一定要查异常,别在那里试来试去的了,tomcat跨服务器上传文件中,报403的错误,那是因为tomcat默认是不允许上传文件的,需要在tomcat的配置文件中进行修改 readonly false
另外报409错误的话,是因为服务器没有上传的目录,虽然在webapp下面创建了一个上传的文件夹,但是部署的时候并没有部署上,所以需要手动创建一个
另外跨服务器上传需要导入连个jersey的jar包才可以

拦截器只会拦截访问的控制器的方法(是springmvc框架自己的,只有使用了此方法才有效) 过滤器加上/*会拦截所有的资源(包括jsp,html,js等)

拦截器的前处理和后处理方法中都可以进行页面的跳转,最终方法主要用于资源的释放

在组件扫描的时候可以设置标签 不扫描哪个注解 比如我们不扫描Controller这个注解(写全路径) 因为springmvc有自己的配置文件,自己扫描

如果mybatis配置文件不需要的话,删掉也可以了 如果配置的注解版sql那么别名也不用起了

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值