欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

菜鸟程序猿之SpringMVC入门

程序员文章站 2024-03-22 09:49:16
...

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域中的数据可以继续传递。
        

            <!--配置文件上传解析器
            id的名称必须为:multipartResolver  ····写死
              -->
            <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>
             bean中的ID不能随便修改

    13、SpringMVC的文件上传

        ★编写Controller
            FileUtils.writeByteArrayToFile(new File("D:\\图片样例\\"+file.getOriginalFilename()), file.getBytes());
            
        ★开启文件上传解析器

        
        ★页面提交设置
            必须添加enctype="multipart/form-data" 才能实现文件上传。
            

    14、RestFul结构

        相对于get提交而言   XXX.action?name=tom&age=19
        使用restful结构   XXX/tom/19.action
        resuFul结构对数据的传递 只需要传递数据的值。不需要传递值的名称,这样能够实现效率更快。
        实现方式:

            @RequestMapping(/hello/{id})

小结

谢谢观赏,我是正在奔跑的程序猿。

猿友推荐:猿医生