sping mvc

来源:互联网 发布:07版excel编程入门教程 编辑:程序博客网 时间:2024/04/24 18:07

SpringMvc

1      SpringMVC架构

1.1   Spring web mvc介绍

 

Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来:

 

 

1.2   Spring web mvc 架构

1.2.1  架构图

 

 

1.2.2  架构流程

1、  用户发送请求至前端控制器DispatcherServlet

2、  DispatcherServlet收到请求调用HandlerMapping处理器映射器。

3、  处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。

4、  DispatcherServlet通过HandlerAdapter处理器适配器调用处理器

5、  执行处理器(Controller,也叫后端控制器)。

6、  Controller执行完成返回ModelAndView

7、  HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet

8、  DispatcherServlet将ModelAndView传给ViewReslover视图解析器

9、  ViewReslover解析后返回具体View

10、             DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。

11、             DispatcherServlet响应用户

 

1.2.3  组件说明

以下组件通常使用框架提供实现:

u  DispatcherServlet:前端控制器

用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性。

u  HandlerMapping:处理器映射器

HandlerMapping负责根据用户请求找到Handler即处理器,springmvc提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

u  Handler:处理器(controller)

Handler 是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。

由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

 

u  HandlAdapter:处理器适配器

通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

 

u  View Resolver:视图解析器

View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。 springmvc框架提供了很多的View视图类型,包括:jstlView、freemarkerView、pdfView等。

一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

2      SpringMVC入门

2.1   第一步:建立一个Web项目

2.2   第二步:导入spring3.2.0的jar包

 

 

2.3   第三步:前端控制器配置

在WEB-INF\web.xml中配置前端控制器,

 

<servlet>

<servlet-name>springmvc</servlet-name>

<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

<init-param>

<param-name>contextConfigLocation</param-name>

<param-value>classpath:springmvc.xml</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>springmvc</servlet-name>

<url-pattern>*.action</url-pattern>

</servlet-mapping>

 

 

load-on-startup:表示servlet随服务启动;

url-pattern:*.action的请交给DispatcherServlet处理。

contextConfigLocation:指定springmvc配置的加载位置,如果不指定则默认加

载WEB-INF/[DispatcherServlet的Servlet 名字]-servlet.xml。

 

2.3.1 Servlet拦截方式

1、拦截固定后缀的url,比如设置为 *.do、*.action, 例如:/user/add.action

此方法最简单,不会导致静态资源(jpg,js,css)被拦截。

 

2、拦截所有,设置为/,例如:/user/add  /user/add.action

此方法可以实现REST风格的url,很多互联网类型的应用使用这种方式。

但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示。需要特殊处理。

 

3、拦截所有,设置为/*,此设置方法错误,因为请求到Action,当action转到jsp时再次被拦截,提示不能根据jsp路径mapping成功。

 

2.4   第四步:springmvc配置文件

在根目录下配置springmvc.xml

在该文件中加入注解的处理器适配器和视图解析器配置前缀和后缀:

<mvc:annotation-driven></mvc:annotation-driven>

2.5   第五步:编写Handler(controller)

@Controller

public class ItemsController3 {

  

   //商品查询列表

   //@RequestMapping实现queryItems方法和url进行映射,一个方法对应一个url

   //一般建议将url和方法写成一样

   @RequestMapping("/queryItems")

   public ModelAndView queryItems()throws Exception{

     

      //调用service查找数据库,查询商品列表,这里使用静态数据模拟

      List<Items> itemsList = new ArrayList<Items>();

      //list中填充静态数据

     

      Items items_1 = new Items();

      items_1.setName("联想笔记本");

      items_1.setPrice(6000f);

      items_1.setDetail("ThinkPad T430联想笔记本电脑!");

     

      Items items_2 = new Items();

      items_2.setName("苹果手机");

      items_2.setPrice(5000f);

      items_2.setDetail("iphone6苹果手机!");

     

      itemsList.add(items_1);

      itemsList.add(items_2);

     

      //返回ModelAndView

      ModelAndView modelAndView =  new ModelAndView();

      //相当requestsetAttribut,在jsp页面中通过itemsList取数据

      modelAndView.addObject("itemsList", itemsList);

     

      //指定视图

      modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");

     

      return modelAndView;

     

   }

 

3      controller方法的返回值

3.1     返回ModelAndView

需要方法结束时,定义ModelAndView,将model和view分别进行设置。

 

3.2     返回string

如果controller方法返回string,

 

3.2.1     表示返回逻辑视图名。

真正视图(jsp路径)=前缀+逻辑视图名+后缀

3.2.2     redirect重定向

商品修改提交后,重定向到商品查询列表。

redirect重定向特点:浏览器地址栏中的url会变化。修改提交的request数据无法传到重定向的地址。因为重定向后重新进行request(request无法共享)

 

3.2.3     forward页面转发

通过forward进行页面转发,浏览器地址栏url不变,request可以共享。

 

 

3.3     返回void

 

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

3.3.1     使用request转向页面,如下:

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

 

3.3.2     也可以通过response页面重定向:

response.sendRedirect("url")

 

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

response.setCharacterEncoding("utf-8");

response.setContentType("application/json;charset=utf-8");

response.getWriter().write("json串");

 

4      controller的注解

4.1     @controller

@controller注解必须要加,作用标识类是一个Handler处理器。

4.2     @requestMapping

@requestMapping注解必须要加,作用:

         1、对url和Handler的方法进行映射。

         2、可以窄化请求映射,设置Handler的根路径,url就是根路径+子路径请求方式

         3、可以限制http请求的方法

映射成功后,springmvc框架生成一个Handler对象,对象中只包括一个映射成功的method。

 

4.3@PathVariable

用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。如:

 

@Controller  public class TestController {  
     @RequestMapping(value="/user/{userId}/roles/{roleId}",method = RequestMethod.GET)  
     public String getLogin(@PathVariable("userId") String userId,  
         @PathVariable("roleId") String roleId){  
         System.out.println("User Id : " + userId);  
         System.out.println("Role Id : " + roleId);  
         return "hello";  
     } 

 

4.4   @requestParam

@requestParam主要用于在SpringMVC后台控制层获取参数,类似一种是request.getParameter("name"),它有三个常用参数:defaultValue= "0", required = false, value = "isApp";defaultValue表示设置默认值,required 铜过boolean设置是否是必须要传入的参数,value 值表示接受的传入的参数类型。

 

4.5@ResponseBody

作用: 该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。

使用时机:返回的数据不是html标签的页面,而是其他某种格式的数据时(如json、xml等)使用;

5      参数绑定

5.1   spring参数绑定过程

从客户端请求key/value数据,经过参数绑定,将key/value数据绑定到controller方法的形参上。

springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变更接收

 

5.2   默认支持的类型

直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。

5.2.1.1 HttpServletRequest

通过request对象获取请求信息

5.2.1.2 HttpServletResponse

通过response处理响应信息

5.2.1.3 HttpSession

通过session对象得到session中存放的对象

5.2.1.4 Model/ModelMap

model是一个接口,modelMap是一个接口实现 。

作用:将model数据填充到request域。

5.3   简单类型

 

 

通过@RequestParam对简单类型的参数进行绑定。

如果不使用@RequestParam,要求request传入参数名称和controller方法的形参名称一致,方可绑定成功。

 

如果使用@RequestParam,不用限制request传入参数名称和controller方法的形参名称一致。

 

5.4   pojo绑定

页面中input的name和controller的pojo形参中的属性名称一致,将页面中数据绑定到pojo。

 

页面定义:

 

controller的pojo形参的定义:

 

5.5   自定义参数绑定实现日期类型绑定

 

对于controller形参中pojo对象,如果属性中有日期类型,需要自定义参数绑定。

将请求日期数据串传成日期类型,要转换的日期类型和pojo中日期属性的类型保持一致。

 

所以自定义参数绑定将日期串转成java.util.Date类型。

 

需要向处理器适配器中注入自定义的参数绑定组件。

 

5.5.1  自定义日期类型绑定

 

5.5.2  配置方式