mvc和spring的结合使用

SpringMVC
        1)概念:用来简化基于MVC架构的web应用程序开发的框架
        注:SpringMVC属于Spring框架的一部分
        2)五大组件
           a、DispatcherServlet  前端控制器
           b、HandlerMapping     映射处理器        里面有请求地址与模型的对象关系
           c、Controller         处理器            模型
           d、ModelAndView       模型和视图      (处理结果里面有数据和视图名,这边的视图名只是文件的名字不带.后缀名的)
           e、ViewResolver       视图解析器      ()

    这五大组件之间的关系: +1+ 浏览器将请求发送给DispatcherServlet   
                               +2+ HandlerMapping告知DispatcherServlet请求地址与模型的对应关系
                               +3+ DispatcherServlet知道对应关系后,会调用Controller 来处理业务逻辑
                               +4+ Controller会将处理后的结果封装到ModelAndView返回给DispatcherServlet
                               +5+ DispatcherServlet接收到结果后再询问ViewResolver调用哪个jsp
                               +6+ 最后DispatcherServlet得到解析后的视图名后调用对应的jsp

         
          DispatcherServlet收到请求之后,会依据HandlerMapping的配置,去调用相应的Controller来处理。
          Controller将处理结果封装成ModelAndView对象,然后将对象返回给DispatcherServlet
          DispatcherServlet依据ViewResolver的解析,调用响应的jsp来展现。


        3)编程步骤
           第一步、导包  spring-webMVC  导入到pom.xml
           第二步、 添加spring的配置文件  将applicationContext.xml这个文件复制到resource文件夹下
           第三步、配置DispatcherServlet  在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:applicationContext.xml</param-value>  //第二步中的那个配置文件存放的地址
        </init-param>
        <load-on-startup>1</load-on-startup>                              //  1 表示立马执行
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

       第四步、写Controller相关的类 要实现Controller
                例如: public class HelloController implements Controller{
                            public ModelAndView handleRequest(HttpServletRequest req, HttpServletResponse res) throws Exception {
        
                        System.out.println("hello spring-mvc");
                        /*ModelAndView有两个常用的构造器
                        ModelAndView(String viewname)
                        ModelAndView(String viewname,Map data)
                        注:viewname 视图的名字
                        data 数据*/
                        return new ModelAndView("hello");
                               }
                      }

           第五步、写一个jsp文件(就是视图名字.jsp)
           第六步、配置HandlerMapping和ViewResolver
                   先在applicationContext.xml配置文件中配置HandlerMappling
                       <!--定义请求处理映射HandlerMapping -->
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <!--指定请求和Controller对应关系 -->    
        <property name="mappings">
            <props>
                <prop key="/hello.do">helloController</prop>
            </props>
        </property>
    </bean>
    
        <!--声明Controller 处理器,这边的id要和上面<prop></prop>中间的值一样-->
    <bean id="helloController" class="controller.HelloController"/>

                  再配置ViewResolver
         <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/"/>    //前缀    也就是文件所在的路劲
        <property name="suffix" value=".jsp"/>          //文件的后缀
    </bean>


      整个mvc的工作流程
         tomcat启动就会实例化DispatcherServlet并执行,DispatcherServlet实例化后就会启动spring容器,容器会实例化 HandlerMapping  Controller 和ViewResolver
    接下来的流程就按照上面写的五大组件之间的关系执行

15、基于注解的SpringMvc应用
    第一步:导包spring-webmvc
    第二步:添加spring的配置文件  将applicationContext.xml这个文件复制到resource文件夹下
    第三步:配置DispatcherServlet  在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:applicationContext.xml</param-value>  //第二步中的那个配置文件存放的地址
        </init-param>
        <load-on-startup>1</load-on-startup>                              //  1 表示立马执行
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    第四步:写Controller
        a、不用实现Controller接口了e
        b、可以添加多个方法  一个方法处理一个请求
        c、方法名不做要求的,可以自己取名字,返回值可以是ModelAndView也可以是String
        d、将@Controller注解添加到类的前面   用于组件扫面  用注解方式创建对象,相当于之前的声明Controller 处理器,配置的那个类的bean配置
                e、将@RequestMaping这个注解添加到类的前面或则方法前 代替之前在配置文件里的那个HandlerMappling 的配置
                
    第五步:写一个jsp文件
    第六步:在配置文件中配置ViewResolver,还要添加组件扫面和mvc注解扫描

<!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/main/"/>    //前缀    也就是文件所在的路劲
        <property name="suffix" value=".jsp"/>          //文件的后缀
    </bean>
    <!-- 组件扫描 -->
    <context:component-scan base-package="controller"/>
    <!-- 配置mvc扫描  这个扫描的是第四步的e的那个步骤 -->
    <mvc:annotation-driven/>


16、读取请求的参数值
    1)通过request的getParameter方法
        在写的Controller的下面的方法中写参数  HttpServletRequest request
        然后调用getParameter方法
    例如:public String login(HttpServletRequest request){
        
        String name=request.getParameter("adminCode");
        String pwd=request.getParameter("pwd");
        System.out.println("name:"+name+";pwd:"+pwd);
    }
    
    2)通过给@RequestParam注解来获取
    例如:
    /*
    如果参数的名称和jsp页面中的name属性的值不一样,就用@RequestParam("pwd")这个注解来说明
    把请求参数的值给方法中的那个参数*   如果方法中的参数名和页面中的name的属性值一样,就不用写@RequestParam("pwd")这个注解了/
    @RequestMapping("/login2.do")
    public String login2(String adminCode,@RequestParam("pwd") String password){
        System.out.println("name:"+adminCode+";pwd:"+password);}

    3)可以通过javabean的方式获得请求参数的值
        a、写一个java类
            要求:变量的名字和页面中name属性的值一样,并且提供相应的get和set方法
        b、将这个类作为参数给Controller的下面的方法
           在调用那个类的相应的get方法获得参数值
        例如:    public String login3(AdminParam ap){
        String adminCode=ap.getAdminCode();
        String password=ap.getPwd();
        System.out.println("name:"+adminCode+";pwd:"+password);}



17、向jsp页面传值
    1)将值绑定在request对象上

        先获得值后,用request的setAttribute方法给一个对象名赋值,然后在页面上可以用el表达式显示值
    例如:@RequestMapping("/login4.do")
    public String login4(AdminParam ap,HttpServletRequest request){
        String adminCode=ap.getAdminCode();
        String pwd=ap.getPwd();
        //将数据绑定到request对象上
        request.setAttribute("adminCode", adminCode);
        request.setAttribute("pwd", pwd);}

        <p>首页<br/>
                账号:${adminCode }
                密码:${pwd }

                </p>

    2)返回ModelAndView
        先获得值后,/*将数据添加到ModelAndView中:
        第一步:将数据添加到Map集合里;
        第二步:将Map添加到ModelAndView
        */
        public ModelAndView login5(AdminParam ap,HttpServletRequest request){
        String admin=ap.getAdminCode();
        String pwd=ap.getPwd();
        
        Map<String,Object> data=new HashMap<String, Object>();
        data.put("adminCode", admin);     //这边的key(就是adminCode)可以自己取名,在页面上用el表达式取的时候名字和这个一样即可
        data.put("pwd", pwd);
        ModelAndView mav=new ModelAndView("in",data);  //这边的"in" 是要转发到的那个视图的名字
    
        return mav;//默认会使用转发   
        
        在页面上就可以通过Map的key来获得value值

    3)将数据添加到ModelMap上
    先获得值后,/*将数据添加到ModelMap中
    调用ModelMap中的addAttribute方法,绑定对象,这样就可以在页面显示值了 用el表达式显示值的使用${这里面的名字和addAttribute这个方法的第一个参数的名字一样}
    @RequestMapping("/login6.do")
        public String login6(AdminParam ap,ModelMap mm){
            String adminCode=ap.getAdminCode();
            String pwd=ap.getPwd();
            /*    实际上着还是DispatcherServlet讲ModelMap中的数据取出来,绑定在request对象上
            */
            mm.addAttribute("admin",adminCode);
            mm.addAttribute("p",pwd);

        
            return "in";//默认会使用转发

    4)将数据添加到session对象上
    先获得值,调用setAttribute的方法,绑定到session上
    //向jsp页面传值
        @RequestMapping("/login7.do")
        public String login7(AdminParam ap,HttpSession session){
            String adminCode=ap.getAdminCode();
            String pwd=ap.getPwd();
        
            //将数据绑定到session
            session.setAttribute("admin", adminCode);
            session.setAttribute("p", pwd);
            return "in";//默认会使用转发
        }


18、mvc中页面重定向
    1)如果处理器的方法的返回值是String  在重定向地址前添加"redirect:"
        那么在方法中的return的语法是:  return "redirect:toIndex.do";
        再写一个方法处理重定向的请求
        例如: //重定向
                @RequestMapping("/login8.do")
                public String login8(){              //返回值是String
                
                    return "redirct:in.do";//重定向
                }
                //处理重定向请求
                @RequestMapping("/in.do")
                public String login9(){
                
                    return "in";
                }

    2)如果处理器的方法的返回值ModelAndView
        先创建RedirectView对象 RedirectView rv=new RedirectView("in.do");  这边的参数是重定向的地址
        在创建ModelAndView mav=new ModelAndView(rv);   这边的参数是上面的RedirectView对象
        例如@RequestMapping("/login9.do")
                public ModelAndView login10(){
                    RedirectView rv=new RedirectView("in.do");
                    ModelAndView mav=new ModelAndView(rv);
                    return mav;
                }
                
                //处理重定向请求
                @RequestMapping("/in.do")
                public String login9(){
                
                    return "in";
                }

猜你喜欢

转载自blog.csdn.net/donghua19900508/article/details/77968020