SpringMVC运行原理和使用教程

SpringMVC运行原理和使用教程,第1张

一、SpingMVC简介

Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。

二、常用组件
  1. DispatcherServlet

是一种前端控制器,由框架提供。

作用:统一处理请求和响应。除此之外还是整个流程控制的中心,由 DispatcherServlet 来调用其他组件,处理用户的请求

  1. HandlerMapping

处理器映射器,由框架提供。

作用:根据请求的 url、method 等信息来查找具体的 Handler(一般来讲是Controller)

  1. Handler(一般来讲是Controller)

处理器,注意,这个需由工程师自己开发。

作用:在 DispatcherServlet 的控制下,Handler对具体的用户请求进行处理

  1. HandlerAdapter

处理器适配器 ,由框架提供。

作用:根据映射器找到的处理器 Handler 信息,按照特定的规则去执行相关的处理器 Handler。

  1. ViewResolver

视图解析器,由框架提供。

作用: ViewResolver 负责将处理结果生成 View 视图。 ViewResolver 首先根据逻辑视图名解析成物理图名,即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

  1. View

视图,工程师自己开发

作用:View接口的职责就是接收model对象、Request对象、Response对象,并渲染输出结果给Response对象。

三、工作流程


步骤详情:

  1. 用户通过浏览器发起 HttpRequest 请求到前端控制器 (DispatcherServlet)。

  2. DispatcherServlet 将用户请求发送给处理器映射器 (HandlerMapping)。

  3. 处理器映射器 (HandlerMapping)会根据请求,找到负责处理该请求的处理器,并将其封装为处理器执行链 返回 (HandlerExecutionChain) 给 DispatcherServlet

  4. DispatcherServlet 会根据 处理器执行链 中的处理器,找到能够执行该处理器的处理器适配器(HandlerAdaptor) --注,处理器适配器有多个

  5. 处理器适配器 (HandlerAdaptoer) 会调用对应的具体的 Controller

  6. Controller 将处理结果及要跳转的视图封装到一个对象 ModelAndView 中并将其返回给处理器适配器 (HandlerAdaptor)

  7. HandlerAdaptor 直接将 ModelAndView 交给 DispatcherServlet ,至此,业务处理完毕

  8. 业务处理完毕后,我们需要将处理结果展示给用户。于是DisptcherServlet 调用 ViewResolver,将 ModelAndView 中的视图名称封装为视图对象

  9. ViewResolver 将封装好的视图 (View) 对象返回给 DIspatcherServlet

  10. DispatcherServlet 调用视图对象,让其自己 (View) 进行渲染(将模型数据填充至视图中),形成响应对象 (HttpResponse)

  11. 前端控制器 (DispatcherServlet) 响应 (HttpResponse) 给浏览器,展示在页面上。

四、使用 1. 创建web项目,导入jar包 2. 添加配置文件

1)配置web.xml文件

<!‐‐ springmvc配置文件 DispatcherServlet 核心控制器 ‐‐>
    <servlet>
        <servlet‐name>springDispatcherServlet</servlet‐name>
        <servlet‐class>org.springframework.web.servlet.DispatcherServlet</servle t‐class>
        <!‐‐ 初始化加载参数 ‐‐>
            <init‐param>
                <!‐‐ 初始化加载springmvc配置文件 ‐‐>
                <param‐name>contextConfigLocation</param‐name>
                <!‐ classpath什么时候需要加  和spring框架有关系的配置文件 都添加classpath:   ‐‐>
                <param‐value>classpath:springmvc.xml</param‐value>
            </init‐param>
        <!‐‐ 项目启动的时候就加载该配置文件 ‐‐>
        <load‐on‐startup>1</load‐on‐startup>
    </servlet>
    <servlet‐mapping>
        <servlet‐name>springDispatcherServlet</servlet‐name>
        <!‐‐ springmvc会拦截所有以 .do结尾的请求 ‐‐> 
        <url‐pattern>*.do</url‐pattern>
    </servlet‐mapping>

2)配置添加springmvc.xml

<!‐‐ 扫描当前包下的注解 ‐‐>
<context:component‐scan base‐package="com.by.controller"></context:component‐scan>
 <!‐‐ 注解驱动:自动加载最新版的处理器映射器和处理器适配器 ‐‐>
<mvc:annotation‐driven></mvc:annotation‐driven>   
3. 写方法,如何访问方法

规范:包名:controller 类名:XxxController

package com.by.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("userController")
public class UserController {
         @ResponseBody
        @RequestMapping("test")
        public String test() {
            System.out.println("userController test方法被访问");
            return "success";
        }
    }
4. 访问路径中传递参数
使用@PathVariable  注解获取路径中的参数

使用方法:在路径中通过{形参} public String test1(@PathVariable(“id”)Integer id)
在方法的()将@PathVariable 添加在参数上,就会把路径中的参数赋值给()中的参数

@ResponseBody
@RequestMapping(value="testGet/{id}",method=RequestMethod.GET)
public String test1(@PathVariable("id")Integer id) {
    System.out.println("userController testGet方法被访问"+id);
    return "success";
}
5. 如何跳转页面

路径:
相对路径:
return “addUser.jsp”;
springmvc_1902/类上面的名称/addUser.jsp
绝对路径:
return “/addUser.jsp”;
springmvc_1902/addUser.jsp
web项目的jsp文件储存
web项目的 WEB‐INF 目录是受保护的
WEB‐INF下面的页面不能直接方法 类似于private int id;
需要通过方法跳转 类似于public int getId(){}

页面存放的位置:
自定义文件夹,存放jsp
创建 /WEB‐INF/view/user 目录
把user相关的jsp内容添加在该目录中
案例:跳转到增加页面

@RequestMapping("toAddUserPage")
public String toAddUserPage() {
    return "/WEB‐INF/view/user/addUser.jsp";
}
6. 添加视图解析器

视图解析器作用:自动给后面controller 的方法return的字符串加上前缀和后缀,变成一个可用的url地址
在springmvc.xml文件

 <!‐‐ 配置视图解析器 ‐‐>
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!‐‐ 前缀 ‐‐>
    <property name="prefix" value="/WEB‐INF/view/" />
    <!‐‐ 后缀 ‐‐>
    <property name="suffix" value=".jsp" />
</bean>
@RequestMapping("toAddUserPage")
     public String toAddUserPage() {
     return "user/addUser";
}
7. 使用ModelAndView对象跳转页面

案例: 跳转到修改页面 使用ModelAndView对象来跳转

@RequestMapping("toUpdateUserPage")
    public ModelAndView toUpdateUserPage() {
        ModelAndView mv = new ModelAndView();
        mv.setViewName("user/updateUser");
        return mv;
    }
8. 获取参数:

(1)方法一
增加方法
获取参数:
在参数中可以直接获取到 HttpServletRequest request
request.getParameter()可以获取到参数
参数可以为:HttpServletRequest request,HttpServletResponse response ,HttpSessionsession

@ResponseBody
@RequestMapping(value="addUser",method=RequestMethod.POST)
    public void addUser(HttpServletRequest request) {
        String userId = request.getParameter("userId");
        String userName = request.getParameter("userName");
        System.out.println(userId + " ‐‐‐ "+ userName);
    }

(2)方法二
直接获取参数:addUser(Integer userId,String userName)

@ResponseBody
@RequestMapping(value="addUser",method=RequestMethod.POST)
public void addUser(Integer userId,String userName) {
    System.out.println(userId + " ‐‐‐ "+ userName);
}

(3)方法三
直接添加对象:addUser(User user)
注意:表单的name值,必须和实体类的属性名保持一致 name=属性 name=userId
区别:struts2赋值的之后,name=对象.属性 name=user.userId

@ResponseBody
@RequestMapping(value="addUser",method=RequestMethod.POST)
    public void addUser(User user) {
    System.out.println(user);
 }
9. 如何传递参数到jsp页面

(1)方法一 通过ModelMap传递参数
案例:通过id查询数据 将查询到的数据传递到update页面

@RequestMapping("selectUserById/{id}")
public String selectUserById(@PathVariable("id")Integer userId,ModelMap map) {
    //去后台查询数据
    //模拟数据
    User user =new User(userId,"ZS");
    //通过ModelMap将数据传递到前台页面
    map.put("user", user);
    return "user/updateUser";
 }

(2)方法二 使用Model传递参数

@RequestMapping("selectUserById/{id}")
public String selectUserById(@PathVariable("id")Integer userId,Model model) {
    //去后台查询数据
    //模拟数据
    User user =new User(userId,"ZS");
    //通过ModelMap将数据传递到前台页面
    model.addAttribute("user", user);
    return "user/updateUser";
}
(3)方法三   使用ModelAndView传递数据
@RequestMapping("selectUserById/{id}")
public ModelAndView selectUserById(@PathVariable("id")Integer userId) {
    ModelAndView mv = new ModelAndView();
    //去后台查询数据
    //模拟数据
    User user =new User(userId,"ZS");
    //通过ModelMap将数据传递到前台页面
    mv.addObject("user", user);
    mv.setViewName("user/updateUser");
   return mv;
 }
10. 注意:

(1)日期类型
出现 400:数据类型出现问题
默认接受的是 yyyy/MM/dd
如果传递 yyyy‐MM‐dd,出现400
如果要传递 yyyy‐MM‐dd的解决办法:在实体类中
@DateTimeFormat(pattern=“yyyy‐MM‐dd”)
private Date userBir;

五、springmvc注解

@Controller 表示是一个控制层框架,把当前对象放在spring容器中。
@RequestMapping 访问路径。可以添加在类、方法上
访问路径的格式:ip:端口号/项目名/类上面@RequestMapping的名字/方法上 @RequestMapping名字.后缀名
@RequestMapping括号中内容含义:
value:访问的路径 可以写多级。访问的时候,多级访问
@RequestMapping(“test”)‐‐>@RequestMapping(value=“test”)
method:方法:请求的方法是什么类型??
restful风格之后
RequestMethod.POST //增加
RequestMethod.GET //查询
RequestMethod.DELETE //删除
RequestMethod.PUT //修改
案列:@RequestMapping(value=“testPost”,method=RequestMethod.POST)
@ResponseBody响应的格式 json格式
添加上 @ResponseBody ,将返回的数据以json的格式返回给前端
不添加 @ResponseBody ,return 返回的是页面;
@PathVariable注解获取路径中的参数
使用方法:在路径中通过{形参} public String test1(@PathVariable(“id”)Integer id)
在方法的()将@PathVariable 添加在参数上,就会把路径中的参数赋值给()中的参数

五、跳转页面

方法一:
在springmvc.xml文件中


方法二:
@RequestMapping(“list2”)
public String toList(){
return “meet2/list”;
}

异常处理
常见问题:
1.404:路径有问题
2.405:get、post 传递有错误
3.400:前端和后端传递的格式不同

本文中二、三最重要!

想了解更多,请加入QQ群:920199935

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/langs/722550.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存