spring mvc入门

来源:互联网 发布:sap hana sql 编辑:程序博客网 时间:2024/05/16 16:08

SpringMvc整个的执行流程:

1、发起请求到前端控制器(DispatcherServlet )

2、前端控制器请求HandlerMapping查找Handler(可以根据xml、注解进行查找)

3、处理器映射器HandlerMapping向前端控制器DispatcherServlet 返回Handler

4、前端控制器DispatcherServlet 调用处理器适配器HandlerAdapter 执行Handler

5、处理器适配器HandlerAdapter 执行Handler

6、Handler执行完给处理器适配器返回ModelAndView

7、处理器适配器向前端控制器返回ModelAndView (ModelAndView 是SpringMvc的底层对象 包括model和view)

8、前端控制器请求视图解析器去解析视图

  根据逻辑视图名解析成真正的视图(jsp)

9、视图解析器向前端控制器返回view

10、前端控制器进行视图渲染

  视图渲染将模型数据(模型数据在ModelAndView对象中)填充到request域

11、前端控制器向用户响应结果


一、spring mvc和spring的关系

spring mvc是spring框架提供的七层体系架构中的一个层,是spring框架的一部分,是spring用于处理客户端请求的MVC工具,取代表现层框架struts1/2。在使用时,spring mvc和spring框架的使用方式是相互独立的。spring mvc是脱离了spring框架的单独的表现层框架。


二、如何在web工程中添加spring mvc?

    web工程添加spring框架的方式和添加springmvc的方式不同的    如果在工程中同时使用 spring框架 和 springmvc框架,需要在web.xml中同时注册两个类分别加载这两个框架    注册spring时   web.xml   ContextLoaderListener 监听器    注册spring mvc框架    为了使用这个框架处理客户端请求    注册的同时为这个框架设置其需要处理的请求格式 *.do  *.action *.etoak...    struts1   ActionServlet    <servlet> <Servlet-mapping><url-pattern>                *.do    struts2   StrutsPrepareAndExecuteFilter  <filter><filter-mapping><url-pattern>  *.action    注册spring框架  ContextLoaderLIstener  <listener>  <listener-mapper>    监听器无法为spring框架设置其需要处理的请求格式    注册spring mvc ,就需要为其设置处理的请求格式    就需要使用另外一个类代替监听器    DispatcherServlet extends HttpServlet    <servlet>  <servlet-mapping>

三、spring-mvc请求处理的基本流程

spring-mvc处理请求的方式 : 非注解版(2.0及之前版本)、注解版(2.5之后)

a 客户端提交hello.do请求,将请求提交到web.xml(web容器),被web容器 中注册的DIspatcherServlet拦截到;DispatcherServlet将其拦截到的所有请求转发给ioc容器中注册的请求解析器

b spring-mvc为了实现对请求的解析提供了两种请求解析器 : 字符/字节 
字符解析器提供了一个HandlerMapping接口,可以使用它提供的任何一个实现类实现对请求的解析。在该接口中,提供了两个默认的请求解析器:SimpleUrlHandlerMapping / DefaultAnnoationHandlerMapping 具体使用哪一个,取决于当前的ioc环境是否是注解环境 
将ioc环境设置为注解环境的方式 : context:component-scan 扫描包结构。 
请求解析器解析请求的方式都不一样,但是解析的结构是相同的: 
获取表示请求的字符串 “/hello”

c 根据解析的字符串,在ioc容器中查找用于处理请求的请求处理器 
[struts1=Action struts2=ActionSupport] 
spring-mvc提供的请求处理器需要实现Controller接口

1 创建一个实现了Controller接口的类作为spring-mvc的请求处理器,处理请求 
2 将其配置成ioc容器中的bean

@Controller 
使用该注解标注的类会成为ioc容器实例化的对象 
相当于手动在ioc容器中配置一个bean

提供了一个其他注解(@Compeont @Service @Repository)不具备的功能 
被该注解标注的类会自动实现Controller接口,成为spring-mvc的请求处理器。

创建一个使用@Controller注解标注的类 - 请求处理器 - 处理/hello请求

四、spring mvc表单项封装

提供一个第三方javaBean,封装请求中的表单项。将封装有表单项的javaBean添加到处理请求方法的第一个参数中。

特例 : 当提交请求中仅有一个表单项时,并且该表单项的类型为基本数据类型或者String类型 ;

表单项的封装 可以直接使用处理请求方法的第一个参数进行。而无法再提供一个javaBean。

五、servlet-API交互

HttpServletRequest HttpServletResponse HttpSession ServletContext..servlet-API范围 (request session application)提供了类似struts2的方式范围封装在map对象     Map map=ActionContext.getContext().get("request/session/application")ModelMap implements Map@SessionAttributes(String[] attrs)该注解用于标注一个类(请求处理器)使用该注解时,需要为其提供String类型数组数组中指向添加到ModelMap中的数据key将
、示例代码
页面:
helloworld
登录名:
密 码:
     web.xml: 
     加载spring中央控制器并拦截 .do请求

empty

applicationContext.xml
            

HelloController.java 
处理请求
      
/** *          业务逻辑层 *  servlet    XxServlet  com.etoak.servlet *  struts1/2   XxAction   com.etoak.action *  spring-mvc  XxController  com.etoak.controller */@Controller@SessionAttributes({"user"})public class HelloController {    /** "/hello"     *  请求和处理之间的映射关系形成?     *  @RequestMapping(path)     *      该注解用于标注请求处理器中的一个方法;     *      使用该方法处理path指向的请求      */    @RequestMapping("/hello")    public String hello(){        System.out.println("处理客户端提交的hello.do请求");        /**         * 为客户端返回一个响应视图         *  返回响应视图的方式 : 处理请求方法的返回值(String)         * 返回视图的形式 : 重定向 redirect | 转发 forward         */        return "redirect:success.jsp";        // return "forward:/success.jsp";    }    @RequestMapping("/login")    public String login(User user){        // 表示使用User类型的一个user对象,封装当前请求中的表单项        /* 硬编码方式防止乱码:        String loginname = user.getLoginname();        try {            loginname = new String( loginname.getBytes("iso-8859-1"), "utf-8");        } catch (UnsupportedEncodingException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }        */        System.out.println("loginname-->"+user.getLoginname());        System.out.println("password-->"+user.getPassword());        return "forward:success.jsp";    }    @RequestMapping("/selectUserById")    public String selectUserById(Integer id , ModelMap map){        System.out.println("id-->"+id);        User user = new User("sheldon","111");        /** 存储在request范围中         *  将user添加到ModelMap对象中         *  添加到ModelMap中的数据 默认 是存储在request范围中         */        map.put("user", user);        // request.setAttribute("user",user);        return "forward:success.jsp";    }}

MyDispatcherServlet.java 
软编码控制编码格式:

public class MyDispatcherServlet extends DispatcherServlet {    //软编码: 重写DispatcherServlet中的doService方法来控制请求编码格式    @Override    protected void doService(HttpServletRequest request,             HttpServletResponse response)            throws Exception {        // TODO Auto-generated method stub        request.setCharacterEncoding("utf-8");        super.doService(request, response);    }}

User.java
public class User {    private String loginname;    private String password;    public User(String loginname, String password) {        super();        this.loginname = loginname;        this.password = password;    }    public String getLoginname() {        return loginname;    }    public void setLoginname(String loginname) {        this.loginname = loginname;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }}