SpringMVC原理图、代码执行流程、请求的获取、响应、紧藕解耦

30 篇文章 0 订阅
17 篇文章 0 订阅

1. SpringMVC原理图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-navhcVYr-1600606078022)(E:\有道云图片\qq433A8C57C88B51E6DF4A4B18D16012EA\5bca6bb72b2c43ee8d61d5fee89a5088\clipboard.png)]

本质:

就是将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文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5XyorUQi-1600606078034)(E:\有道云图片\qq433A8C57C88B51E6DF4A4B18D16012EA\7eda484b8eff417bbfbc3ef2e6098f9d\clipboard.png)]

④在controller包下创建控制类并声明单元方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIsfjyVb-1600606078039)(E:\有道云图片\qq433A8C57C88B51E6DF4A4B18D16012EA\eda4ea0c8721431b8d5b459cb1591098\clipboard.png)]

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";
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值