1. SpringMVC原理图:
本质:
就是将servlet进行了封装,提供一个公共的servlet。改servlet可以根据请求动态的调用
对应的逻辑方完成请求处理
优点:提升开发效率
使用:
① 配置SpringMVC的依赖(公共Servlet)
② 在web.xml中配置Servlet
a. Servlet的访问路径
b. 配置SpringMVC容器对象的配置文件路径
③ 在src下创建并配置SpringMVC配置文件
a. 配置注解扫描路径
b. 配置SpringMVC的驱动解析器。
2.springMVC的基本实现
①创建web项目,并导入springMVC的jar包
②配置web.xml文件,配置springMVC的servlet
③在src下创建并配置springmvc.xml文件
④在controller包下创建控制类并声明单元方法
3.springMVC的代码执行流程
① 启动tomcat服务器
② 服务器启动过程中,会初始化创建DispatcherServlet的对象
③ DispatcherServlet被创建时,触发其init方法执行
④ DispatcherServlert的init方法中会创建SpringMVC的容器对象
⑤ SpringMVC的容器对象被创建时会加载其配置文件,springmvc.xml文件
⑥ 在springmvc.xml文件中声明了注解扫描路径为com.bjsxt.controller,SpringMVC的容器对
象会创建所有controller包下使用了@Controller注解的控制器类的对象以及使用了
@RequestMapping注解的方法对象
⑦ init方法中将SpringMVC对象创建成功后,会将SpringMVC中的资源获取到Servlet中,至
此init方法执行完毕,Servlet初始化创建成功。
⑧ tomcat服务器启动成功,意味着tomcat服务器启动成功后,DispatcherServlet中已经有了
Controller层下的所有的资源。
⑨ 浏览器发起请求,请求地址: localhost:8080/mvc/demo
⑩ tomcat服务器接收到请求后,会在mvc的项目中触发DispatcherServlet的执行
11 DispatcherServlet的service方法开始执行,其service方法会根据请求地址中的demo标识符,从Servlet中的所有Controller资源中查找是否有某个Controller对象中的方法的标识符为demo,如果找到了则调用执行,没有找到则响应404
12 假如找到了,DispatcherServlet中的service方法开始调用Controller中的方法
13 Controller中的方法被执行,处理请求。
4.单元方法中获取请求数据
方式一:
紧耦方式
DispatcherServlet中的service方法直接将此次请求的request对象传递给调用的单元方法即可。同时在单元方法上声明形参HttpServletRequest来接收request实参即可。
方式二:
解耦方式
DispatcherServlet在其service方法中将请求数据根据需求从request对象中获取出来后,将数据直接传递给对应的单元方法使用。同时在单元方法上直接声明对应的形参接收请求数据即可。
5.形参名和请求数据的键名不一致
6.使用实体类对象获取请求数据
7.获取同键不同值的请求数据
8.混合使用紧藕和解耦方式获取请求数据
9.springMVC对restful请求的支持
格式
localhost:8080/project/aa/zhangsan/18
使用占位{字符}声明公共单元方法
单元方法中获取restful请求地址中的请求数据
/**
* 声明单元方法:获取restful请求地址中的请求数据
* 解释:
* 既然前台将请求数据拼接在了请求地址中,造成不同的用户发起的同类型的
* 请求的请求地址不同,比如注册:
* 张三的请求地址:
* localhost:8080/mvc/reg/zhangsan/18/song
* 李四的请求地址:
* localhost:8080/mvc/reg/lisi/20/dance
* .......
* 获取请求地址中的数据
* @PathVariable:
* 声明:在单元方法的形参前声明
* 作用:
* 告诉DispatcherServlet此形参的数据,不要再按照之前的形参名为键名的方式获取了
* 而是从请求地址中获取。默认按照占位符和形参名一致的规则获取,不一致则在
* 注解中声明占位符的名称。
* 注意:
* restful只是一种请求数据携带的格式,它只是表明将请求数据作为请求地址的一部分发送给后台
* 和请求方式没有关系,请求地址可以是get方式也可以是post方式来发送。并且restful格式本身
* 仍然可以使用键值对携带数据.并且仍然按照解耦方式获取即可。
* 总结:
* 其实我们后台就是从请求地址中截取一部分数据来使用了。
* restful+正常的键值对数据
* 单纯的restful
* 单元的键值对数据
*/
@RequestMapping("reg/{name}/{age}/{fav}")
public String testGetDataRestFul(@PathVariable("name") String uname, @PathVariable Integer age, @PathVariable String fav,String course){
//处理请求
System.out.println(uname+":"+age+":"+fav);
System.out.println("键值对数据:"+course);
//响应结果
return "/aa";
}
10.springMVC的编码过滤器
在web.xml文件中配置springMVC官方提供的编码过滤器即可
<!--配置编码过滤器-->
<filter>
<filter-name>code</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>
<!--设置编码格式的生效范围-->
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>code</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
11.springMVC的静态资源放行
① 将DispatcherServlet的底层逻辑进行变更,静态资源的请求就不要作为
单元方法请求处理,而是查找对应的资源响应给浏览器。
② 在SpringMVC的配置文件中配置静态资源的放行,告诉DispatcherServlet
哪些资源静态资源需要放行,将静态资源响应给了浏览器。
12.springMVC的响应
使用response对象完成响应
/***
* 使用response对象完成响应
* 1.单元方法的返回值类型设置void
* 因为使用response对象在单元方法中直接对此次请求进行了响应,不再通过
* DispatcherServlet了,既然已经响应了,就不需要再给DispatcherServlet返回值了。
* 2. 在单元方法上声明HttpServletResponse形参,来接收
* 此次请求的response对象。
* 3.在单元方法中直接使用response对象完成响应
* 直接响应
* 请求转发
* 重定向
*/
@RequestMapping("resp")
public void demoResp(String uname,Integer age,HttpServletRequest req,HttpServletResponse response) throws IOException, ServletException {
//处理请求
System.out.println("MyControllerResp.demoResp:使用原生的response对象完成响应:"+uname+":"+age);
//响应结果
response.setContentType("text/html;charset=utf-8");
//直接响应
//response.getWriter().write("直接响应");
//请求转发
//req.getRequestDispatcher("/index.jsp").forward(req,response);
//重定向
response.sendRedirect(req.getContextPath()+"/redirect.jsp");
}
使用forward关键字完成响应
作用:实现请求转发
使用:通过单元方法的返回值来告诉DispatcherServlet请求转发指定的资源
注意:如果是请求转发,forward关键字可以省略不写的。
请求转发jsp资源
/**
* 使用forward关键字完成请求转发jsp资源
* 使用:
* 使用返回值告诉DispatcherServlet请求转发到指定的资源。
* 注意:
* 单元方法的返回值类型为String
* 示例:
* return "forward:/index.jsp";
* return "响应方式:资源路径";
* 注意:
* 路径中的第一个"/"表示项目根据目录,使用了"/"后资源路径为绝对路径
* 从项目的webapp目录下开始查找对应的jsp资源了。
*/
@RequestMapping("demoForwardJsp")
public String demoForwardJsp(String uname,Integer age){
//处理请求
System.out.println("使用forwrd关键字请求转发Jsp资源:"+uname+age);
//响应结果
//请求转发
return "forward:/index.jsp";
}
使用redirect关键字完成响应
作用:完成资源的重定向
使用:通过单元方法的返回值来告诉DispatcherServlet重定向指定的资源。
重定向到jsp资源
/**
* 使用redirect关键字重定向到jsp资源
* 使用:
* 使用返回值告诉DispatcherServlet重定向到指定的jsp资源
* 示例:
* return "redirect:/index.jsp";
* return "redirect:/资源路径"
* 注意:
* 路径中的第一个"/"表示项目根据目录,使用了"/"后资源路径为绝对路径
* 从项目的webapp目录下开始查找对应的jsp资源了。
*/
@RequestMapping("demoRedirectJsp")
public String demoRedirectJsp(String uname,Integer age){
//处理请求
System.out.println("使用redirect关键字重定向到jsp资源:"+uname+age);
//响应结果
return "redirect:/index.jsp";
}