一、SpringMVC概述
Spring MVC是由spring官方提供的基于MVC设计理念的web框架
Spring MVC是基于Servlet封装的用于实现MVC控制的框架,实现前端和服务端的交互
1.1SpringMVC的优势
严格遵守了MVC分层思想
采用了松耦合、插件式结构,相比较于我们封装的BaseSerlet以及其他的一些MVC框架来说更灵活、更具有扩展性
Spring MVC是基于Spring的扩展。提供了一套完善的MVC注解
Spring MVC在数据绑定、视图解析都提供了多种处理方式,可灵活配置
Spring MVC对RESTful设计方法提供了良好的支持
1.2 SpringMVC本质工作
接收并解析请求
处理请求
数据渲染、响应请求
二、Spring MVC框架部署
2.1基于Maven创建一个web项目
2.2添加SpringMVC依赖
spring-context
spring-aspects
spring-jdbc
spring-test
spring-web
spring-webmvc
5.2.13.RELEASE org.springframework spring-context ${spring.version} org.springframework spring-aspects ${spring.version} org.springframework spring-jdbc ${spring.version} org.springframework spring-test ${spring.version} org.springframework spring-web ${spring.version} org.springframework spring-webmvc ${spring.version}
2.3创建SpringMVC配置文件
在resources目录下创建名为 spring-servlet.xml 的文件
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml springmvc *.do
配置文件的加载顺序和功能
1.tomcat服务器启动,读取web.xml 根据web.xml 文件中的说明,创建对象
创建DispatcherServlet他的对象,会执行init()方法。在init()方法中会执行springmvc容器对象创建
Web ApplicationContext cx = new ClassPathXml ApplicationContext(“calsspath:springmvc.xml”);
2.springmvc框架,new ClassPathXml ApplicationContext() 读取springmvc的配置文件
使用组件扫描器base-package=“com.max.controller” , 遍历controller包中的所有类,
找到xxx类中的@Controller,@RequestMapping注解,就能创建xxx类对象。
知道了some.do的请求是执行doSome()方法
2.4 在web.xml 中配置SpringMVC的前端控制器
SpringMVC提供了一个名为DispatcherServlet的类(SpringMVC前端控制器),用于拦截用户请求由SpringMVC处理
SpringMVC org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:spring-servlet.xml 1 SpringMVC /*
SpringMVC框架的使用
在SpringMVC中,我们把接收用户请求、处理用户请求的类称为Controller(控制器)
3.1创建控制器
创建一个名为com.qfedu.controller的包(包需要在spring注解扫描的范围内)
创建一个类(无需做任何的继承和实现)
在类上添加@Controller 注解声明此类为SpringMVC的控制器
在类上添加@RequestMapping(“url”)声明此控制器类的请求url
@Controller@RequestMapping("/book")publicclassBookController{}
3.2在控制器类中定义处理请求的方法
在一个控制器类中可以定义多个方法处理不同的请求
在每个方法上添加@RequestMapping(“url”)用于声明当前方法请求的url
@RequestMapping("/add") publicvoidadd(){ System.out.println("11111"); } @RequestMapping("/list") publicvoidlist(){ System.out.println("2222222"); }
3.3 静态资源放行配置
xml中配置文件
3.4 接收请求中的参数
HttpServletRequest request, HttpServletResponse response, HttpSession session只需在控制器方法的形参列表中添加上面这个
3.4.1逐个接收
逐个接收,请求中的参数名和控制器方法的形参名一样,按照名称对象接收参数
action="/some.do"> 姓名: 年龄:
@Controller中
@RequestMapping(value="/some.do") publicModelAndViewdoSome(Stringname,Integerage)
接收参数的问题:
1.参数最好使用包装类型
2.post请求乱码问题
接收请求时,POST请求,使用中文时会出现乱码
在web.xml声明过滤器
characterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 forceRequestEncoding true forceResponseEncoding true characterEncodingFilter /*
逐个接收请求参数:请求中参数名和形参名不一样
publicModelAndViewdoSome(@RequestParam(value="iname")Stringname,intage)
required:boolen类型,默认是true,请求中必须有此参数,没有的话报错
publicModelAndViewdoSome(@RequestParam(value="iname",required=false)Stringname,intage)
3.4.2 对象接收
对象接收:在控制器方法的形参时Java对象,使用Java对象的属性接收请求中参数值
要求:Java对象的属性名和请求中参数名一样
publicclassStudent{ privateStringname; privateIntegerage;}//再get set//控制器 @RequestMapping("/roe.do") publicModelAndViewdoRoe(Studentstudent){ ModelAndViewmv=newModelAndView(); mv.addObject("myname",student.getName()); mv.addObject("myage",student.getAge()); mv.setViewName("show"); returnmv; }
3.5 void 没有数据和视图
HttpMessageConverter 消息转换器
作用,实现请求的数据转为Java对象,把控制器方法返回的对象转为json,xml,text等不同格式的数据
publicvoidreAjax(HttpServletResponseresponse,Stringname,Integerage){ //调用service得到结果对象 Studentstudent=newStudent(); student.setName(name+"同学"); student.setAge(age); //HttpMessageConverter 消息转换器,对象转为json OjectMappingom=newOjectMapping(); Stringjson=om.wirteValueAsString(student); System.out.println("服务器对象转为的json"+json); //输出json。响应ajax response.setContentType("application/json;charset=utf-8"); PrintWriterpw=response.getWriter(); pw.println(json); pw.flush(); pw.close();
怎么使用实现类:
框架根据控制器方法的返回类型,自动查找使用的实现类。
@RequestMapping("/reAjax.do") publicStudentreAjax(Stringname,Integerage){ //调用service得到结果对象 Studentstudent=newStudent(); student.setName(name+"同学"); student.setAge(age); returnstudent;
默认情况下:springmvc使用了HttpMessageConverter接口的4个实现类。包括了StringHttpMessageConverter。
需要在springmvc的配置文件,加入注解驱动的标签mvc:annotation-driven
加上这个标签,springmvc项目启动后,会创建HttpMessageConverter接口的7歌实现类对象,
包括了StringHttpMessageConverter和Mapping jackson2HttpMessageConverter
3.5.2 @ResponseBody
@ResponseBody注解的作用,就是把stduent转换后的json通过HttpServletResponse对象输出给浏览器
response.setContentType("application/json;charset=utf-8");PrintWriterpw=response.getWriter();pw.println(json);pw.flush();pw.close();@ResponseBody注解作用就上面的代码的实现
3.5.3 控制器方法返回对象转为json 的步骤
1.pom.xml 加入jackson依赖,springmvc框架,默认处理json就是i使用jacson
2.在springmvc配置文件,加入注解驱动 mvc:annotation-dirven
3.在控制器方法的上面加入@ResponseBody注解,表示返回值数据,输出到浏览器
@RequestMapping("/reAjax.do") @ResponseBody publicStudentreAjax(Stringname,Integerage){ //调用service得到结果对象 Studentstudent=newStudent(); student.setName(name+"同学"); student.setAge(age); returnstudent; }
3.5.4 返回值是String,如何解决Ajax中乱码的方法
// 区别返回值String是数据还是视图//-----方法上面有@ResponseBody注解就是数据,没就是视图//解决中文乱码,需要使用@RequestMapping的produces属性@RequestMapping("/reAjax.do"produces="text/plain;charset=utf-8")@ResponseBodypublicStringreString(Stringname,Integerage){System.out.println("控制器方法返回String,是数据");return"Hello,SpringMVC注解式开发";}
3.6 静态资源处理
1.url-pattern 中央调度器
springmvc /
设置“ / ” ,导致中央调度器成为了默认的defual servlet
需要处理静态资源和其他的未映射的请求,但默认的中央调度器没有处理静态资源的控制器对象,所以静态资源都是404,只有some.do这个请求有MyController对象,才能访问
2. 静态资源处理
第一种
<!--声明:静态资源default-servlet-handler 和@RequestMapping 有冲突,要加上注解驱动优点:解决方式简单缺点:依赖于tomcat-->
第二种(重要)
在springmvc配置文件中加入一个mvc:resources标签,框架会创建ResourceHttpRequestHandler控制器对象,使用这个对象处理静态资源的访问,不依赖tomcat