Spring MVC

4 篇文章 0 订阅
2 篇文章 0 订阅

SpringMVC开发步骤

  • 加入jar包
    • commons-logging
    • spring-aop
    • spring-beans
    • spring-context
    • spring-core
    • spring-expression
    • spring-web
    • spring-webmvc
  • 在web.xml文件中配置DispatcherServlet
  • 加入SpringMVC的配置文件
  • 编写处理请求的处理器(Controller),并标识为处理器
  • 编写视图

SpringMVC设计HelloWorld:

  • 结构:

    structure

  • Controller

    controller

  • SpringMVC配置文件:

    springmvc.xml

  • web.xml:

    web.xml

  • 测试结果:

    result_01
    result_02

RequestMapping注解:

  • 类注解与方法注解:

    • Controller:

      Controller

    • 请求url:

      url

    • 测试结果:

      result_03

  • 映射请求参数、请求方法或请求头:
    • @RequestMapping的value、method、params及heads分别表示请求URL、请求方法、请求参数及请求头的映射条件
    • params与headers支持简单的表达式:
      • param1:表示请求必须包含名为param1的请求
      • !param1:表示请求不包含名为param1的请求参数
      • param1!=value1:表示请求包含名为param1的请求参数,但其值不能为value1
      • {“param1=value1”, “param2”}:请求必须包含名为param1和param2的两个请求参数,且param1参数的值必须为value1

使用@RequestMapping映射请求 - 通配符:

  • Ant风格资源地址支持3种匹配符:
    • ? :匹配文件名中的一个字符
    • * :匹配文件名中的任意字符
    • ** :匹配多层路径
  • @RequestMapping还支持Ant风格的URL:
    • /user/*/createUser,如:/user/self/createUser
    • /user/**/createUser,如:/user/createUser或/user/self/register/createUser
    • /user/createUser??,如:/user/createUserNa

@PathVariable映射URL绑定的占位符:

  • 带占位符的URL是Spring3.0新增的功能
  • 通过@PathVariable可以将URL中占位符参数绑定到控制器处理方法的入参中:URL中的{xxx}占位符可以通过@PathVariable(“xxx”)绑定到操作方法的入参中,如:

    @RequestMapping("/testPathVariable/{id}")
    public String testPathVariable(@PathVariable("id") Integer id){
        UserDao.test(id);
        return "redirect:/user/list.action";
    }
    

HiddenHttpMethodFilter:

  • 浏览器form表单只支持GET与POST请求,添加过滤器,可以将GET、POST、PUT、DELETE请求转换为标准的http请求
  • 在web.xml文件中需要配置HiddenHttpMethodFilter,如下:

    <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern
    </filter-mapping>
    
  • DELETE与PUT请求,如下:

    • DELETE请求:

      <from action="springmvc/demo/testDelete" method="POST">
          <input type="hidden" name="_method" value="DELETE" /> <!--用于HiddenHttpMethodFilter转换请求方式-->    
          <input type="submit" value="DELETE method" />
      </form>
      
    • PUT请求:

      <from action="springmvc/demo/testDelete" method="POST">
          <input type="hidden" name="_method" value="DELETE" />
          <input type="submit" value="DELETE method" />
      </form>
      

RequestParam注解:

  • value属性:映射参数名
  • 请求处理方法签名:
    • SpringMVC通过分析处理方法的签名,将HTTP请求信息绑定到处理方法的相应入参中
    • 必要时可对方法及方法入参标注相应的注解(@PathVariable、@RequestParam等),SpringMVC框架会将HTTP请求的信息绑定到相应的方法入参中,并根据方法的返回值做相应的后续处理
  • @RequestParam绑定请求参数值:

    • 在处理方法入参处使用@RequestParam可以把请求参数传递给请求方法

      • value:参数名
      • required:是否必须,默认为true,表示请求参数中必须包含对应的参数,若不存在将抛出异常
      • 如:

        @RequestMapping("/testRequestParam")
        public String testRequestParam(@RequestParam(value="username", required=false)String userName, @RequestParam(value="id")int id){
            return "success";
        }
        

RequestHeader注解:

  • 使用@RequestHeader绑定请求报头的属性值,如:

    @RequestMapping("/testRequestHeader")
    public String testRequestHeader(@RequestHeader(value="Accept-Encoding")String encoding, @RequestHeader(value="Keep-Alive")long keepAlieve){
        return "success";
    }
    

CookieValue注解绑定请求中的Cookie值,如:

@RequestMapping("/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID", required=false)String sessionId, @CookieValue(value="username")String userName){
    return "success";
}

处理模型数据:

  • SpringMVC提供了以下几种途径输出模型数据:

    • ModelAndView:处理方法返回值类型为ModeAndView时,方法体即可通过该对象添加模型数据
    • 添加模型数据:
      • ModelAndView addObject(String attributeName, Object attributeValue)
      • ModeAndView addAllObject(Map

SpringMVC的CRUD:

  • 需要使用原生的JSTL显示
  • SpringMVC的表单标签可以实现将模型数据中的属性和HTML表单元素相绑定,以实现表单数据更便捷的编辑与表单值得回显
  • SpringMVC的form标签:

    • 一般情况下,通过GET请求获取表单页面,而通过POST请求提交表单页面,因此获取表单页面和提交表单页面的URL是相同的,只要满足该最佳条件的契约,form标签就无需通过action属性指定表单提交的URL
    • 可以通过modelAttribute属性指定绑定的模型属性,若没有指定该属性,则默认从request域对象中读取command的表单bean,如果该属性值也不存在,则会发生错误,如:

      <form:from action="textAdd" method="POST" modelAttribute="employee"> <!-- employee为一个Bean对象 -->
          //form element ....
          <!--
          items可以是List, String[]或Map
          itemValue:指定radio的value值,可以是集合中bean的一个属性值
          itemLabel:指定radio的label值
          delimiter:多个单选框可以通过delimiter指定分割
          -->
          <form:select path="department.deptId" items="${departments}" itemValue="DepartmentName" itemLabel="deptId" />
      </form:form>
      
    • form:errors:显示表单组件或数据校验所对应的错误:
      • <form:errors path=”*” />:显示表单的所有错误
      • <form:errors path=”user*” />:显示所有以user为前缀的属性对应的错误
      • <form:errors path=”username” />:显示特定表单对象属性的错误
  • Spring MVC处理静态资源:

    • 若将DispatcherServlet请求映射配置为/,则Spring MVC将捕获WEB容器的所有请求,包括静态资源的请求,Spring MVC会将它们当成一个普通的请求处理,因找不到对应的处理器将导致错误(404)
    • 可以在Spring MVC的配置文件中配置<mvc:default-servlet-handler />的方式解决静态资源的问题:
      • <mvc:default-servlet-handler/>将在Spring MVC上下文中定义一个DefaultServletHttpRequestHandler, 它会对进入DispatcherServlet的请求进行筛查,如果发现是没有经过映射的请求,就将该请求交由WEB应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理
      • 一般WEB应用服务器默认的Servlet的名称都是default.若所使用的WEB服务器的默认Servlet名称不是default,则需要通过default-servlet-name属性显示指定
    • 将一个Get请求转换为DELETE请求,如下所示使用jQuery的form表单:

      <head>
          <script type="text/javascript">
              $(function(){
                  $(".delete").click(function(){
                      var href = $(this).attr("href");
                      $("form").attr("action", href).submit();
                      return false;
                  })
              });
          </script>
      </head>
      <body>
          <form method="POST">
              <input type="hidden" name="_method" value="DELETE" />
          </form>
      
          <a class="delete" href="remove">remove emp</a>
      <body>
      

SpringMVC数据绑定流程:

  • 1). SpringMVC主框架将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象
  • 2). DataBinder调用装配在SpringMVC上下文中的ConversionService组建进行数据类型转换、数据格式化工作,将Servlet中的请求信息填充到入参对象中
  • 3). 调用Validator组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象
  • 4). SpringMVC抽取BindingResult中的入参对象和校验错误对象,将他们赋给处理方法的响应入参
  • 如:

    Data Bind Flow

关于mvc:annotation-driven:

  • <mvc:annotation-driven />会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter与ExceptionHandlerExceptionResolver三个bean
  • 还提供以下支持:
    • 支持使用ConversionService实例对表单参数进行类型转换
    • 支持使用@NumberFormatannotation、@DataTimeFormat注解完成数据类型的格式化
    • 支持使用@Valid注解对JavaBean实例进行JSR 303验证
    • 支持使用@RequestBody和@ResponseBody注解

关于SpringMVC数据的格式化:

  • 使用@DateTimeFormat注解标注在Bean中的Date类型的属性上,如:

    @DateTimeFormat(pattern="yyyyMMdd")    //指定Date类型的格式,表单的输入格式应与该格式一致
    private Date birthday;    
    
  • 配置文件中配置国际化资源文件:

    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="i18n" />
    </bean>
    
  • 使用<form:error>标签用于显示检验错误信息

处理JSON:使用HttpMessageConverter

  • 导入所需的jar包:
    • jackson-annotations.jar
    • jackson-core.jar
    • jsckson-databind.jar
  • 在目标方法上加入如下注解:
    • @ResponseBody
    • @RequestMapping(String url)
  • 目标方法直接返回所需的数组,如:

    @ResponseBody
    @RequestMapping("/getJSON")
    public List<Employee> getJson(){
        return employeeDAO.getEmployees();
    }
    
  • HttpMessageConverter:

    Converter

国际化资源文件:

  • 通过点击超链接的形式来选择显示的语言:

    • 在配置文件中配置SessionLocaleResolver与LocaleChangeInterceptor

      <bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
      </bean>
      
      <mvc:interceptors>
      <bean class="org.springframework.web.servlet.LocaleChangeInterceptor" />
      </mvc:interceptors>
      
    • 超链接:

      <a href="testChangeLanguage?locale=zh_CN">中文</a>
      <a href="testChangeLanguage?locale=en_US">English</a>
      

SpringMVC对比Struts2:

  • SpringMVC的入口是Servlet,而Struts2是Filter
  • SpringMVC会稍微比Struts2快些,SpringMVC是基于方法设计,而Struts2是基于类,每次发一次请求都会实例一个Action
  • SpringMVC使用更加简洁,开发效率SpringMVC比Struts2高,且支持JSR303,处理ajax的请求更方便
  • Strust2的OGNL表达式使页面的开发效率相比SpringMVC更高
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值