springMVC:基于spring的一个框架,实际上就是spring的一个模块,专门做web开发的
理解为servlet的一个升级
springMVC能够创建对象,放到容器中(springMVC容器),springMVC容器中放的是控制器对象
@Controller创建控制器对象,把对象放在springMVC容器中,把创建的对象当作控制器使用,这个控制器对象能接受用户的请求,显示处理结果,就当做是一个servlet使用
@Contorller注解创建的是一个普通对象,不是servlet,springMVC赋予控制器对象一些额外的功能
springMVC中有一个对象是servlet:DispatherServlet:负责接受请求,之后DiapatherServlet把请求转发给Controller对象,最后是Controller对象处理
- 加入的依赖
javax.servlet
javax.servlet-api
3.1.0
provided
org.springframework
spring-webmvc
5.2.5.RELEASE
- springmvc.xml中声明组件扫描器
- web.xml中创建中央调度器
springmvc org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:springmvc.xml 1 springmvc *.do
- 创建普通Controller类
@Controller
public class MyController {
@RequestMapping(value = "/some.do")
public ModelAndView doSome(){
ModelAndView modelAndView = new ModelAndView();
//添加数据,框架在请求的最后把数据放到request作用域,
//request.setAttribute("msg","欢迎使用springmvc做web开发");
modelAndView.addObject("msg","欢迎使用springMvc做web开发");
modelAndView.addObject("fun","执行的是dpSome方法");
//指定视图,指定视图的完整路径
//框架对视图执行的forward操作,request.getRequestDiapather("/show.jsp").forward();
modelAndView.setViewName("/show.jsp");
//当配置了视图解析器,可以使用逻辑名称(文件名),指定视图
//框架会使用视图解析器前缀+后缀 组成完整路径,就是字符串连接
modelAndView.setViewName("show");
return modelAndView;
}
}
WEB_INF下的文件对用户是不开放的
普通类Controller的注解介绍
- 设置模块名称和请求方式
@RequestMapping("/test")
@Controller
public class MyController {
@RequestMapping(value = "/some.do",method = RequestMethod.GET)
public ModelAndView doSome(HttpServletRequest request,
HttpServletResponse response,
HttpSession session){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","欢迎使用springMvc做web开发");
modelAndView.addObject("fun","执行的是dpSome方法");
modelAndView.setViewName("show");
return modelAndView;
}
}
- 接受请求参数
HttpServletRequest
HttpServletResponse
HttpSession
用户提交的数据
-----逐个接收
-----对象接收
@RequestMapping(value = "/some.do",method = RequestMethod.POST)
public ModelAndView doSome(String name,Integer age){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("myname",name);
modelAndView.addObject("myage",age);
modelAndView.setViewName("show");
return modelAndView;
}
- 设置过滤器,解决post乱码问题
characterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
forceRequestEncoding
true
forceResponseEncoding
true
characterEncodingFilter
@RequestMapping(value = "/some.do",method = RequestMethod.POST)
public ModelAndView doSome(@RequestParam("pname") String name,
@RequestParam("page") Integer age){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("myname",name);
modelAndView.addObject("myage",age);
modelAndView.setViewName("show");
return modelAndView;
}
- 对象接收参数
@RequestMapping(value = "/some.do",method = RequestMethod.POST)
public ModelAndView doSome(Student myStudent){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("myname",myStudent.getName());
modelAndView.addObject("myage",myStudent.getAge());
modelAndView.setViewName("show");
return modelAndView;
}
- 返回值ModelAndView
如果处理器方法处理完后,需要跳转到其他资源,且又要在跳转的资源间传递数据,此时处理器方法返回ModelAndView较好,需要在方法中添加ModelAndView对象,否则有的多余
- 返回值String
String表示视图,可以逻辑名称,也可以是完整视图路径
@RequestMapping(value = "/some.do",method = RequestMethod.POST)
public String doSome(Student myStudent){
System.out.println("doReturnView,name="+myStudent.getName()+"age="+myStudent.getAge());
//show :逻辑视图名称,项目中配置了视图解析器
//如果使用完整的视图路径,项目中不能使用视图解析器
//框架对视图执行forward转发操作
return "show";
}
- 返回值是void(可以用于ajax )
不能表示数据,也不能表示视图
处理ajax时,可以使用void返回值,通过HttpServletRequest输出数据。响应ajax
ajax请求服务端返回的就是数据,和视图无关
//使用json和ajax
- 返回对象Object
返回对象,是数据和对象无关,可以响应ajax请求
//springmvc处理器方法返回object,可以转为json输出到浏览器,响应ajax的内部原理
- 返回List对象
//跟返回对象的方式是一样的
- 返回Map(一般不用)
- 返回String数据
补充:web中有一个default配置,加载静态资源和未映射到其他servlet的请求
访问静态资源的问题
中央调度器的地址使用"/"
当项目中使用了"/",会代替tomcat中的default,tomcat不会自动加载静态资源和未映射到其他servlet的请求
- 第一种静态资源处理方式
- 第二种静态资源处理方式
3.多个拦截器的执行顺序
有先后顺序
4.拦截器和过滤器的区别
1.过滤器是servlet中的对象,拦截器是框架中的对象
2.过滤器是tomcat服务器创建的对象,拦截器是springmvc容器中创建的对象
3.过滤器有一个执行点,拦截器有3个执行点
4.过滤器实现filter接口,拦截器实现HandlerInterceptor接口
5.过滤器是在拦截器之前先执行的,只有通过post方法才会通过中央调度器
6.过滤器可以处理jsp,js,html等,拦截器主要是针对Controller对象,如果请求不能被DispatcherServlet接收,这个请求不会被拦截器接收
springmvc内部处理请求的流程
1.用户发起请求
2.DispatcherServlet接受请求,把请求转发给处理器映射器,
-------处理器映射器,是springmvc中的对象,框架把实现了HandlerMapper的类都叫做映射器
------处理器映射器的作用,根据请求从springmvc容器中获取处理器对象,getbean,把找到的对象放到一个叫做处理器执行链的类中保存
---------HandlerExcutionChain:类中保存着,处理器对象(controller)和羡慕中所有的拦截器list
3.DispatcherServlet把执行链中的对象交给处理器适配器对象,
------处理器适配器:springmvc中的对象,需要是实现HandlerAdapter接口
处理器适配器作用,执行处理器方法,(Controller.dosome()方法执行)



