SpringMVC

 

SpringMVC_第1张图片

    1. 架构流程
  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器。
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet
  4. DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
  5. 执行处理器(Controller,也叫后端控制器)
  6. Controller执行完成返回ModelAndView
  7. HandlerAdaptercontroller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServletModelAndView传给ViewReslover视图解析器
  9. ViewReslover解析后返回具体View
  10. DispatcherServletView进行渲染视图(即将模型数据填充至视图中)。
  11. DispatcherServlet响应用户

在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。需要用户开发的组件有handler、view

 

 

 

    1. 注解映射器和适配器
      1. 配置处理器映射器

       注解式处理器映射器,对类中标记了@ResquestMapping的方法进行映射。根据@ResquestMapping定义的url匹配@ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器。

HandlerMethod对象中封装url对应的方法Method。

 

从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。

 

在springmvc.xml配置文件中配置如下:

<bean

class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />

 

注解描述:

@RequestMapping定义请求url到处理器功能方法的映射

 

      1. 配置处理器适配器

注解式处理器适配器,对标记@ResquestMapping的方法进行适配。

 

从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。

 

在springmvc.xml配置文件中配置如下:

<bean

class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />

 

 

      1. 注解驱动

直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载。

SpringMVC使用自动加载RequestMappingHandlerMapping和RequestMappingHandlerAdapter

可以在springmvc.xml配置文件中使用替代注解处理器和适配器的配置。

<mvc:annotation-driven />

 

    1. 视图解析器

视图解析器使用SpringMVC框架默认的InternalResourceViewResolver,这个视图解析器支持JSP视图解析

在springmvc.xml配置文件中配置如下:

   

   

    <bean

       class="org.springframework.web.servlet.view.InternalResourceViewResolver">

      

       <property name="prefix" value="/WEB-INF/jsp/" />

      

       <property name="suffix" value=".jsp" />

    bean>

逻辑视图名需要在controller中返回ModelAndView指定,比如逻辑视图名为ItemList,则最终返回的jsp视图地址:

WEB-INF/jsp/itemList.jsp

 

最终jsp物理地址:前缀+逻辑视图名+后缀

 

 

最核心的还是处理器,

处理器:(1)配置路径(2)接收前端传来的参数(3)返回前端视图

 

1 配置路径

 

    1. 请求方法限定

除了可以对url进行设置,还可以限定请求进来的方法

  1. 限定GET方法

@RequestMapping(method = RequestMethod.GET)

 

如果通过POST访问则报错:

HTTP Status 405 - Request method 'POST' not supported

 

例如:

@RequestMapping(value = "itemList",method = RequestMethod.POST)

 

  1. 限定POST方法

@RequestMapping(method = RequestMethod.POST)

 

如果通过GET访问则报错:

HTTP Status 405 - Request method 'GET' not supported

 

  1. GET和POST都可以

@RequestMapping(method = {RequestMethod.GET,RequestMethod.POST})

    1. 接收参数
    2. @RequestParam 注解

/api/params/testGet1?paramName=123

    1. @PathVariable注解

 

/api/params/testGet2/111112333
    1. SpringMVC的自动匹配

前后端命名要一致

    1. 返回值
  1. Controller方法返回值
    1. 返回ModelAndView

controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。

 

参考第一天的内容

    1. 返回void

       在Controller方法形参上可以定义request和response,使用request或response指定响应结果:

1、使用request转发页面,如下:

request.getRequestDispatcher("页面路径").forward(request, response);

request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request, response);

 

2、可以通过response页面重定向:

response.sendRedirect("url")

response.sendRedirect("/springmvc-web2/itemEdit.action");

 

  1. 可以通过response指定响应结果,例如响应json数据如下:

response.getWriter().print("{\"abc\":123}");

 

      1. 代码演示

以下代码一次测试,演示上面的效果

/**

 * 返回void测试

 *

 * @param request

 * @param response

 * @throws Exception

 */

@RequestMapping("queryItem")

public void queryItem(HttpServletRequest request, HttpServletResponse response) throws Exception {

    // 1 使用request进行转发

    // request.getRequestDispatcher("/WEB-INF/jsp/success.jsp").forward(request,

    // response);

 

    // 2 使用response进行重定向到编辑页面

    // response.sendRedirect("/springmvc-web2/itemEdit.action");

 

    // 3 使用response直接显示

    response.getWriter().print("{\"abc\":123}");

}

    1. 返回字符串
      1. 逻辑视图名

controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/itemList.jsp

return "itemList";

 

参考第一天内容

      1. Redirect重定向

Contrller方法返回字符串可以重定向到一个url地址

如下商品修改提交后重定向到商品编辑页面。

/**

 * 更新商品

 *

 * @param item

 * @return

 */

@RequestMapping("updateItem")

public String updateItemById(Item item) {

    // 更新商品

    this.itemService.updateItemById(item);

 

    // 修改商品成功后,重定向到商品编辑页面

    // 重定向后浏览器地址栏变更为重定向的地址,

    // 重定向相当于执行了新的requestresponse,所以之前的请求参数都会丢失

    // 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数

    return "redirect:/itemEdit.action?itemId=" + item.getId();

}

 

      1. forward转发

Controller方法执行后继续执行另一个Controller方法

如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。

/**

 * 更新商品

 *

 * @param item

 * @return

 */

@RequestMapping("updateItem")

public String updateItemById(Item item) {

    // 更新商品

    this.itemService.updateItemById(item);

 

    // 修改商品成功后,重定向到商品编辑页面

    // 重定向后浏览器地址栏变更为重定向的地址,

    // 重定向相当于执行了新的requestresponse,所以之前的请求参数都会丢失

    // 如果要指定请求参数,需要在重定向的url后面添加 ?itemId=1 这样的请求参数

    // return "redirect:/itemEdit.action?itemId=" + item.getId();

 

    // 修改商品成功后,继续执行另一个方法

    // 使用转发的方式实现。转发后浏览器地址栏还是原来的请求地址,

    // 转发并没有执行新的requestresponse,所以之前的请求参数都存在

    return "forward:/itemEdit.action";

 

}

//结果转发到editItem.actionrequest可以带过去

return "forward: /itemEdit.action";

 

需要修改之前编写的根据id查询商品方法

因为请求进行修改商品时,请求参数里面只有id属性,没有itemId属性

修改,如下图::

SpringMVC_第2张图片

 

SpringMVC和struts2的区别

SpringMVC_第3张图片

 

你可能感兴趣的:(spring)