微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SpringMvc简介以及相关面试题

1.SpringMVC概述

SpringMVC是一个WEB层,控制层框架,主要用来负责与客户端交互,业务逻辑的调用。SpringMVC是Spring家族的一大组件,Spring整合SpringMVC可以做到无缝集成,特点:简单易用性能

2.SpringMVC相对与Servlet的优势

a. Servlet的开发配置相对麻烦,servlet特别多的时候web.xml文件将会非常的臃肿
b. 每个Servlet都只能处理一个功能,如果需要多个功能就需要开发多个servlet,项目中存在大量的servlet显得臃肿。
c. 获取请求参数进行类型转换封装数据到bean的过程比较繁琐。
d. 其他开发中不方便的地方,例如乱码问题,数据格式处理,表单检索

spring MVC详解

  1. SpringMVC的组件
    a. 前端控制器(dispatcherServlet)
    本质上是一个servlet,相当于一个中转站,所有的访问都会走到这个servlet中,再根据配置进行中转到相对应的handler中进行处理,获取数据和视图
    b. 处理器映射器(HandlerMapping)
    本质上就是一段映射关系,将将访问路径和对应的Handler存储为映射关系,在需要时供前端控制器查阅。
    c. 处理器适配器(HandlerAdapter)
    本质上就是一个适配器,可以根据要求找到对应的handler来运行。前端控制器找到处理器映射器找到对应的handler信息之后,将请求响应和对应的handler信息交由处理器适配器来处理,处理器适配器找到真正的handler执行后,将结果也就是model and view返回给前端控制器。
    d. 视图解析器(ViewResolver)
    本质上是一种映射关系,可以将视图名称映射到真正的视图地址。前端控制器调用处理器适配完成后的到model和view,将view信息传给视图解析器得到真正的view。
    e. 视图(view)
    本质上就是将handler处理器中返回的model数据嵌入到视图解析后得到的jsp页面中,向客户端作出响应

生成SpringMvc的核心配置文件

<!--配置前端控制器-->
    <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>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
<!--配置处理器映射器中的路径和处理器的映射关系-->
    <bean name="/hello.action" class="cn.tedu.web.Hello"></bean>
    <!--配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
//创建类实现controller接口
public class Hello implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        //创建modelAndView
        ModelAndView modelAndView = new ModelAndView();
        //封装数据
        modelAndView.addobject("msg1","hello world");
        modelAndView.addobject("msg2","hello springMVC");
        //封装视图
        modelAndView.setViewName("hello");
        //返回modelAndView
        return modelAndView;
    }
}

SpringMVC注解方式配置

SpringMVC支持使用注解方式配置,比配置文件更加的灵活易用,是目前的主流配置方式
<context:component-scan base-package="cn.tedu"></context:component-scan>
    <mvc:annotation-driven></mvc:annotation-driven>
    <!--配置视图解析器中视图名称和真正页面的映射关系-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
<!--配置前端控制器-->
    <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>
    </servlet>
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
@RequestMapping("/my01")
@Controller
public class Controller01 {
    @RequestMapping("/test01.action")
    public String test01(Model model){
        model.addAttribute("msg","one word one dream");
        return "test01";
    }
}

springMVC注解工作原理

  1. 当服务器启动时,会先加载web.xml文件,之后通过引入核心配置文件来加载SpringMVC.xml
  2. 当解析到包扫描时,扫描指定的包,并将含有@Conteoller注解的类解析为处理器
  3. 如果配置过mvc:annotation-driven就会解析Spring-MVC注解
  4. 解析@requestMapping(value=“/test01.action”),将指定的地址和当前方法的映射关系保存
  5. 当客户端发出请求访问时,SpringMVC寻找改地址的映射关系,找到就执行方法,找不到抛出404

SpringMVC获取请求参数

@Controller
public class MyController01 {
    /**
     * 获取请求参数:日期数据处理
     *  通过注册自定义类型编辑器使SpringMVC支持自定义格式请求参数的处理
     *  此处,SpringMVC为Date类型已经提供了编辑器类,所以直接使用,不用自己写
     * http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01test09.jsp
     */
    @InitBinder
    public void myInitBinder(ServletRequestDataBinder dataBinder){
        dataBinder.registerCustomEditor(Date.class,new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));

    }

    @RequestMapping("/test09.action")
    public void test09(String name, int age, Date birthday) {
        System.out.println(name);
        System.out.println(age);
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        String format1 = format.format(birthday);
        System.out.println(format1);

    }

    /**
     * 获取请求参数:中文乱码解决
     *     如果服务器配置的编码是utf-8,且项目采用的也是utf-8则认请求参数无乱码
     *     tomcat8认编码为utf-8(可以更改)
     *     tomcat7及更老的版本认编码为iso8859-1(可以更改)
     *     如果遇到服务器编码和项目编码不一致时会产生乱码
     *     对于POST提交 可以通过request.setCharacterEncoding("utf-8")解决乱码
     *     但此行代码对GET无效,GET提交的请求参数乱码,只能手工编解码来解决
     *     手工编解码解决乱码的方式对POST提交也有效
     *     springmvc提供了过滤器CharacterEncodingFilter来帮助我们解决乱码
     *     但此过滤器本质上就是request.setCharacterEncoing()所以也是只对POST有效
     *     ,即使配置了GET提交乱码也要手动解决
     *
     */
    @RequestMapping("/test08.action")
    public void test08(HttpServletRequest request) throws UnsupportedEncodingException {
        //POST提交
        //request.setCharacterEncoding("utf-8");
        //String uname = request.getParameter("uname");
        //System.out.println(uname);
        //GET提交
        //String uname = request.getParameter("uname");
        //byte [] data = uname.getBytes("iso8859-1");
        //uname = new String(data,"utf-8");
        //System.out.println(uname);
    }

    //    获取请求参数:多个同名请求参数的处理
    // http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test07.action?name=tt&love=bb&love=pp&love=zz
    @RequestMapping("/test07.action")
    public void test07(String name,String [] love) {
        //封装到数组里
        System.out.println(name);
        System.out.println(Arrays.asList(love));
    }

    //获取请求参数:自动封装请求参数到bean 对复杂类型的处理
    // http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test06.action?id=35&name=jj&age=18&addr=cd&dog.name=wd&dog.age=1&dog.cat.name=xx&dog.cat.age=3
    @RequestMapping("/test06.action")
    public void test06(User user) {
        System.out.println(user);
    }

    //获取请求参数:自动封装请求参数到bean 对复杂类型的处理
    // http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test05.action?id=35&name=jj&age=18&addr=cd&dog.name=wd&dog.age=1
    @RequestMapping("/test05.action")
    public void test05(User user) {
        System.out.println(user);
    }

    //获取请求参数:自动封装请求参数到bean
    // http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test04.action?id=35&name=jj&age=18&addr=cd
    @RequestMapping("/test04.action")
    public void test04(User user) {
        System.out.println(user);

    }

    //获取请求参数: 通过@RequestParam指定参数赋值,解决请求参数名和方法参数不一致时赋值问题
    // http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test03.action?name=yasuo&uage=19
    @RequestMapping("/test03.action")
    public void test03(@RequestParam("name") String username, @RequestParam("uage") int age) {
        System.out.println(username + "~~~~" + age);
    }

    //获取请求参数: 直接获取
    // http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test02.action?username=yasuo&age=19
    @RequestMapping("/test02.action")
    public void test02(String username, int age) {
        System.out.println(username + "~~~~" + age);
    }


    //获取请求参数:传统方式获取
    // http://localhost:8080/SpringMVCDay01_04_Params_war_exploded/my01/test01.action?username=yasuo&age=19
    @RequestMapping("/test01.action")
    public void test01(HttpServletRequest request) {
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        System.out.println(username + "~~~~" + age);

    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐