菜鸟程序猿之SpringMVC入门

SpringMVC
一、Servlet的缺点:
    1、xml配置繁琐
    一个Servlet必须配置8行,这样的配置太繁琐。
    
    2、servlet类中方法单一
    在servlet中只有两个方法 doget() dopost().通常情况下。一个servlet只能执行一个方法。
    例如addUserServlet, updateUserServlet .这样写一张表的增删改查就会出现至少4个servlet.这两个方法结构单一 作用就是传递页面参数。
    
    3、获取的值只能是String
    可以通过request对象获取页面传入的值,但是传入值的类型只能是字符串。如果是其他类型,必须通过类型转化的方式进行转换。
 
二、SpringMVC
    SpringMVC是一个前端控制框架。是Spring家族中的一个组件。与spring可以做到无缝整合。而且写法简单,类型可以随意接收。就是MVC设计模式中的Controller
    1、整个SpringMVC的核心调用过程
        ★核心内容:
            一个控制器:前端控制器
            3个适配器:处理器映射器  处理器适配器  视图解析器
 
        ★调用过程:
            1. 用户发起请求,请求到DispatcherServlet前端控制器
            DispatcherServlet(中央调度),负责request和response,负责调用处理器映射器查找Handler,负责调用处理器适配器执行Handler,
            有了前端控制器降低了各各组件之间的耦合性,系统扩展性提高。
            2. DispatcherServlet前端控制器请求处理器映射器HandlerMapping查找Handler
            根据用户请求的url,根据一定的规则去查找(比如:xml配置,注解)
            3. HandlerMapping处理器映射器将Handler返回给前端控制器
            4. DispatcherServlet前端控制器调用HandlerAdapter处理器适配器执行Handler
            程序员编写的Handler是按照适配器要求的规则去执行Handler
            5. HandlerAdapter处理器适配器执行Handler
            适配器按照一定规则去执行Handler
            6. Handler执行完成,返回ModelAndView
            ModelAndView是springmvc的封装对象,将model和view封装在一起。
            7. HandlerAdapter处理器适配器将ModelAndView返回给前端 控制器
            8. 前端控制器调用视图解析器,进行视图解析,解析完成给前端控制器返回View
            View是springmvc的封装对象,是一个接口,实现类包括jspview,pdfview。。。。
            9. 前端控制器调用view进行视图渲染
            将模型数据填充到view(将model数据填充到request)响应给用户
            10、前端控制器响应给用户。
    2、具体实现
        ★导入jar包
        
        ★配置前端控制器
        
        ★配置springMVC的核心配置文件
            springmvc(Servlet-name)-servlet.xml
        
        ★配置映射关系
            <bean name="/hello.action" class="controller.HelloController"></bean>
            
        ★编写Controller
            如果使用默认的处理器适配器就需要实现一个Controller接口 并且返回modelAndView对象。
            modelAndView对象需要两个值
            一个是model 就是服务的数据。
            一个是view  就是页面名称。
        
        ★配置视图解析器
            <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--前缀  -->
            <property name="prefix" value="/WEB-INF/"></property>
            <property name="suffix" value=".jsp"></property>
            </bean>
            作用:将modelAndView对象中的view进行拼接找到具体的页面路径
            前缀+页面名称+后缀
            /WEB-INF/hello.jsp
            
    3、SpringMVC的核心配置文件
        ★首先找到<servlet-name>springmvc</servlet-name>
            拿到springmvc之后   拼接(-servlet.xml) 形成springmvc-servlet.xml
        
        ★/WEB-INF的好处
            放入到web-inf下浏览器不能直接访问。需要通过程序内部跳转才是实现浏览功能
        
        ★SpringMVC的配置文件的位置
            放到web-inf 下程序手动调用时不可能引入的。所有通常情况下把配置文件放入到src/
            <!--指定springmvc核心配置文件的位置  -->
                      <init-param>
                              <param-name>contextConfigLocation</param-name>
                              <param-value>classpath:/springmvc-servlet.xml</param-value>
                      </init-param>
              
    4、SpringMVC的注解形式
        ★开启注解
            <!--开启springMVC的注解  -->
            <mvc:annotation-driven/>
            
            <!--开启类扫描  -->
            <context:component-scan base-package="controller"/>
        ★指明映射关系
            @RequestMapping(value="hello.action")
            public String hello(Model model){
            System.out.println("客户端成功调用");
            
            model.addAttribute("msg", "注解形式实现SpringMVC");
            
            //返回的字符串就是返回的页面名称
            return "hello";
            }
            通过RequestMapping(URL) 可以与方法进行匹配。如果url能够匹配成功就会执行相应的方法。方法的返回值就是页面的名称。
            Model对象就是用来为页面赋值的。其实底层就是request域。通过request进行数据的传递。
    
    5、页面中参数的接收
        通过form表单提交的内容可以实现自动的赋值。但是前提条件是
        <input name="password" type="password"/> input元素中name属性的值 必须与SpringMVC接收参数的名称一致。
        
    6、通过对象接收参数
        首先拿到form表单中的所有的提交的元素名称 按照名称与对象中的set方法匹配。如果匹配成功,则正确赋值。
        
    7、为对象的引入赋值
        <tr>
            <td>电话:</td>
            <td><input name="userInfo.tel" type="text"/></td>
        </tr>
        
    8、日期的转换
        如果没有进行日期格式的设定就会出现类型转化错误-400。
        @org.springframework.web.bind.annotation.InitBinder
        public void InitBinder (ServletRequestDataBinder binder){
        binder.registerCustomEditor(
        java.util.Date.class,
        new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true));
        }
        只要在当前的Controller中添加日期转换格式 就能实现日期正确转化。
        
    9、同名属性提交
        如果是同属性提交时,如果接收参数类型是String 那么就是把提交的属性进行拼接,中间用“,”号隔开。
        
    10、提交的name和参数名称不匹配
        如果参数与提交值的name属性不一致 可以通过
        @RequestParam(value="hobby") String[] hobbys
        可以吧 hobby中的参数 转化为 hobbys
    
    11、重定向
        页面如果要实现跳转 需要用到重定向
        redirect:/toUserList.action
        浏览器的地址栏会改变,当前request域中的数据不能传递。
        
    12、转发
        forward:/toUserList.action
        ★浏览器的地址不变。
        ★request域中的数据可以继续传递。
        
    13、SpringMVC的文件上传
        ★编写Controller
            FileUtils.writeByteArrayToFile(new File("D:\\图片样例\\"+file.getOriginalFilename()), file.getBytes());
            
        ★开启文件上传解析器
            <!--配置文件上传解析器
            id的名称必须为:multipartResolver  ····写死
              -->
            <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
             bean中的ID不能随便修改
        
        ★页面提交设置
            必须添加enctype="multipart/form-data" 才能实现文件上传。
            
    14、RestFul结构
        相对于get提交而言   XXX.action?name=tom&age=19
        使用restful结构   XXX/tom/19.action
        resuFul结构对数据的传递 只需要传递数据的值。不需要传递值的名称,这样能够实现效率更快。
        实现方式:
            @RequestMapping(/hello/{id})

猜你喜欢

转载自blog.csdn.net/yxh13521338301/article/details/80667494