SpringMVC注解式开发

SpringMVC注解式开发

1.在类上添加@RequestMapper

可将所有请求的公共部分,提取出

在这里插入图片描述

在这里插入图片描述

2.@RequestMapper:请求映射

属性: method

​ 表示请求的方式。它的值RequestMethod类枚举值。

​ 例如表示get请求方式,RequestMethod.GET,post方式,RequestMethod.POST

3.处理器方法的参数

处理器方法可以包括一下四类参数,这些参数会在系统调用时由系统自动赋值

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • 请求中所携带的参数

接收用户提交的参数

  1. 逐个接收
  2. 对象接收

逐个接收请求参数

要求:处理器(控制器)方法的形参名和请求中参数名必须一致,同名的请求参数赋值给同名的形参

框架接收请求的参数

  1. 使用request对象接收请求参数

    • String strName = request.getParameter(“name”)
    • String strAge = request.getParameter(“age”)
  2. SpringMVC框架通过DispatcherServlet调用MyController的doSome()方法,调用方法时,按名称对应,把接收的参数赋值给形参

    框架会提供类型转换的功能,能把String转为int ,long,float,double等类型

@Controller
public class MyController {
    @RequestMapping(value = "/receiveproperty.do")
    public ModelAndView doSome(String name, Integer age) {
        ModelAndView mv = new ModelAndView();
        mv.addObject("myName", name);
        mv.addObject("myAge", age);
        mv.setViewName("show");

        return mv;
    }
}
    <form action="receiveproperty.do" method="post">
      姓名:<input type="text" name="name"> <br/>
      年龄:<input type="test" name="age"> <br/>
      <input type="submit" value="提交参数">
    </form>

过滤器

注意:在提交请求时,get请求方式没有乱码,使用post方式提交请求,中文有乱码,需要使用过滤器处理乱码问题

​ 过滤器可以自定义,也可以使用框架中提供的过滤器 CharacterEncodingFilter

    <!--注册声明过滤器,解决post请求乱码问题-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <!--设置项目中使用的字符编码-->
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <!--强制请求对象(HttpServletRequest)使用encoding编码-->
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <!--强制应答对象(HttpServletResponse)使用encoding编码-->
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <!--
            /*:表示强制所有的请求先通过过滤器处理
        -->
        <url-pattern>/*</url-pattern>
    </filter-mapping>

请求中参数名与形参名不一样的问题

@RequestParam:解决请求中参数名与形参名不一样的问题

属性:

  1. value 请求中的参数名称
  2. required 是一个boolean,默认为true,true:表示请求中必须包含该参数

位置:在处理器方法的形参定义的前面

在这里插入图片描述

对象接收

  1. 创建一个类,类属性名与参数名保持一致
  2. 处理器方法形参是Java对象,这个对象的属性名和请求中参数名一样
  3. 框架会创建形参的Java对象,给属性赋值。请求中的参数是name,框架会调用setName()

在这里插入图片描述

4.处理方法的返回值

4.1返回ModelAndView

有数据和视图,对视图执行forward

4.2返回String

表示视图,可以逻辑名称,也可以完整视图

在这里插入图片描述

若有完整路径则不可以有视图解析器

在这里插入图片描述

4.3void

不能表示数据,也不能表示视图,在处理ajax的时候,可以使用void返回值。通过HttpServletResponse输出数据,响应ajax请求.

ajax请求服务器端返回的就是数据,和视图无关。

4.4Object

对象是属性,属性就是数据,所以返回Object表示数据,和视图无关。可以使用对象表示数据,响应ajax请求

现在做ajax,主要使用json的数据格式。实现步骤:

  1. 加入处理json的工具库的依赖,SpringMVC默认使用的jackson。
  2. 在SpringMVC配置文件中加入 <mvc:annoction-driven> 注解驱动
  3. 在处理器方法的上面加入@ResponseBody注解

SpringMVC处理器方法返回Object,可以转为json输出到浏览器,响应ajax的内部原理

  1. <mvc:annoction-driven> 注解驱动。

    注解驱动实现的功能是 完成Java对象到json,xml,text,二进制等数据格式的转换

    HttpMessageConveter接口:消息转换器

    功能:定义Java转为json,xml等数据格式的方法。

  2. @ResponseBody注解

    放在处理器方法的上面,通过HttpServletResponse输出数据,响应ajax请求

返回对象框架的处理流程

  1. 框架会把返回的Student类型,调用框架中ArrayList<HttpMessageConverter>中每个类的canWrite()方法检查哪个 HttpMessageConverter 接口的实现类能处理Student类型的数据。
  2. 框架会调用实现类的write() 将对象转为json
  3. 框架会调用@ResponseBody将 2 的结果数据输出到浏览器,ajax请求处理完成
/**
     * 处理器方法返回一个Student,通过框架转为json,响应ajax请求
     */
    @RequestMapping(value = "/returnStudentJson.do")
    @ResponseBody
    public Student doStudentJsonObject(String name, Integer age) {
        //调用service,获取请求结果数据,Student对象表示结果数据
        Student student = new Student();
        student.setName("name");
        student.setAge(1);
        //会被框架转为Json
        return student;
    }
    /**
     * 处理器方法返回List<Student>
     */
    @RequestMapping(value = "/returnStudentJsonArray.do")
    @ResponseBody
    public List<Student> doStudentJsonObjectArray(String name, Integer age) {
        List<Student> list = new ArrayList<>();

        //调用service,获取请求结果数据,Student对象表示结果数据
        Student student = new Student();
        student.setName("name");
        student.setAge(1);
        list.add(student);

        student = new Student();
        student.setName("name2");
        student.setAge(2);
        list.add(student);

        student = new Student();
        student.setName("name3");
        student.setAge(3);
        list.add(student);

        System.out.println(list);

        return list;
    }

4.5返回String表示数据,不是视图

区分返回值String是数据,还是视图,看有没有@ResponseBody注解,如果有@ResponseBody注解,返回String就是数据

/**
     * text/plain;charset=ISO-8859-1
     * 解决作为乱码
     * 给RequestMapping增加一个属性 produces,使用这个属性指定新的contentType
     */
    @RequestMapping(value = "/returnStringData.do", produces = "text/plain;charset=utf-8")
    @ResponseBody
    public String doStringData() {
        return "返回对象,表示数据";
    }

5.中央调度器url-pattern设置为 /

tomcat本身能处理静态资源的访问,像html,图片,js文件都是静态资源

<url-pattern>/</url-pattern> <!--表示静态资源和未映射的请求都由这个default处理-->
  1. 处理静态资源
  2. 处理未映射到其他servlet请求
    <!--
        使用"/"  它会代替tomcat中的default
        导致所以的静态资源都给DispatcherServlet处理,默认情况下DispatcherServlet没有处理静态资源的能力
        没有控制器对象能处理静态资源的访问,所以静态资源都是404
        
        动态资源可以访问
    -->
    <servlet-mapping>
        <servlet-name>sprinigmvc</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

5.1第一种处理静态资源的方式

需要在SpringMVC配置文件中加入<mvc:default-servlet-handler>

原理:

加入这个标签后,框架会创建控制器对象DefaultServletHttpRequestHandler(类似与我们自己创建的MyController)

DefaultServletHttpRequestHandler 这个对象可以把接收的请求转发给 tomcat的default这个servlet

default-servlet-handler 和 @RequestMapping注解有冲突,需要加入annotation-driven(注解驱动)

5.3第二种

mvc:resources 加入后框架会创建 ResourceHttpRequestHandler这个处理器对象,让这个对象处理静态资源,不依赖tomcat服务器

    <!--
        第二种
        mapping:访问静态资源的uri地址,使用通配符 **
        location:静态资源在项目的目录位置
    -->
    <mvc:resources mapping="/html/**" location="/html/"></mvc:resources>

    <!--注解驱动-->
    <mvc:annotation-driven></mvc:annotation-driven>

resources 和 @RequestMapping注解有冲突,需要加入annotation-driven(注解驱动)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值