【框架:SpringMVC】SpringMVC注解试开发

1 @RequestMapping 定义请求规则

1.1 指定模块名称

通过@RequestMapping 注解可以定义处理器对于请求的映射规则。该注解可以注解在方法上,也可以注解在类上,但意义是不同的。
在这里插入图片描述
在这里插入图片描述

1.2 对请求提交方式的定义

在这里插入图片描述

    @RequestMapping(value="/other.do", method = RequestMethod.GET)
    public ModelAndView doOther(){
        ModelAndView mv = new ModelAndView();
        mv.addObject("school", "广州大学");
        mv.addObject("age", "20");
        mv.setViewName("other");
        return mv;
    }
请求方式提交方式
表单请求默认GET,可以指定POST
AJAX默认GET,可以指定POST
地址栏请求GET请求
超链接请求GET请求
src资源路径请求GET请求

2 处理器方法的参数

在这里插入图片描述
index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index</title>
</head>
<body>
    <form action="test/student.do" method="post">
        用户名:
        <label>
            <input type="text" name="name"/>
        </label>
        <br/>
        密码:
        <label>
            <input type="password" name="password"/>
        </label>
        <br/>
        <input type="submit"/>
    </form>
</body>
</html>

2.1 逐个参数接受

在这里插入图片描述

@Controller
@RequestMapping(value = "/test")
public class MyController {
    @RequestMapping(value="/student")
    public ModelAndView doTable(String name, String password){
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", name);
        mv.addObject("password", password);
        mv.setViewName("student");
        return mv;
    }
}

2.2 请求参数中文乱码问题

我们在处理表单的时候,可能会出现一个问题,当我们的请求是post请求的时候,会出现乱码的问题,所以我们需要在web.xml中加入如下的一个过滤器。

 <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>
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <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>

2.3 校正请求参数名@RequestParam

在这里插入图片描述

package com.sdnu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(value = "/test")
public class MyController {
    @RequestMapping(value="/student")
    public ModelAndView doTable(@RequestParam(value = "myName", required = false) String name,
                                @RequestParam(value = "myPassword", required = false) String password){
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", name);
        mv.addObject("password", password);
        mv.setViewName("student");
        return mv;
    }
}

2.4 对象参数接

发起请求:
在这里插入图片描述

定义SchoolStudent类

package com.sdnu.vo;

public class SchoolStudent {
    private String name;
    private  Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "SchoolStudent{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

处理器类 MyControlle

@Controller
@RequestMapping(value = "/test")
public class MyController {
    @RequestMapping(value="/schoolStudent.do")
    public ModelAndView doStudent(SchoolStudent student){
        ModelAndView mv = new ModelAndView();
        mv.addObject("name", student.getName());
        mv.addObject("age", student.getAge());
        mv.addObject("student", student);
        mv.setViewName("student");
        return mv;
    }
}

页面

<body>
    <p>用户名 : </p>${name}
    <p>密码 : </p>${password}
    ${student}
</body>

在这里插入图片描述

3 处理器方法的返回值

3.1返回 ModelAndView

若处理器方法处理完后,需要跳转到其它资源,且又要在跳转的资源间传递数据,此时处理器方法返回 ModelAndView 比较好。当然,若要返回 ModelAndView,则处理器方法中需要定义 ModelAndView 对象。

在使用时,若该处理器方法只是进行跳转而不传递数据,或只是传递数据而并不向任何资源跳转(如对页面的 Ajax 异步响应),此时若返回 ModelAndView,则将总是有一部分多余:要么 Model 多余,要么 View 多余。即此时返回 ModelAndView 将不合适。

3.2 返回 String

处理器类 MyControlle

@Controller
@RequestMapping(value = "/test")
public class MyController {
    @RequestMapping(value="/stringView.do")
    public String doReturnView(HttpServletRequest request, String name, Integer password){
        System.out.println(name + " " + password);
        request.setAttribute("name", name);
        request.setAttribute("password", password);
        return "student";
    }
}

3.3 返回void

对于处理器方法返回 void 的应用场景,AJAX 响应.
若处理器对请求处理后,无需跳转到其它任何资源,此时可以让处理器方法返回 void。

(1)maven 加入 jackson 依赖
由于本项目中服务端向浏览器传回的是 JSON 数据,需要使用一个工具类将字符串包装为 JSON 格式,所以需要导入 JSON 的依赖。

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>

(2)引入 jQuery 库

(3)定义 index 页面

index.html

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>index</title>
    <script type="text/javascript" src="js/Jquery-3.4.1.js"></script>
    <script type="text/javascript">
        $(function(){
            $("button").click(function () {
                $.ajax({
                    url:"returnVoid-ajax.do",
                    data:{
                        name:"zhangsan",
                        age:20
                    },
                    type:"post",
                    dataType:"json",
                    success:function(resp){
                        alert(resp);
                    }
                })
            })
        })
    </script>
</head>
<body>
    <form action="test/stringView.do" method="post">
        用户名:
        <label>
            <input type="text" name="name"/>
        </label>
        <br/>
        密码:
        <label>
            <input type="password" name="password"/>
        </label>
        <br/>
        <input type="submit"/>
    </form>
    <button id="btn">发起Ajax请求</button>
</body>
</html>

(4)定义对象SchoolStudent

SchoolStudent.java

package com.sdnu.vo;

public class SchoolStudent {
    private String name;
    private  Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "SchoolStudent{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

(5)处理器类 MyControlle

   @RequestMapping(value="/returnVoid-ajax.do")
    public void doReturnVoidAjax(HttpServletResponse response, String name, Integer age){
        System.out.println(name + " " + age);
        SchoolStudent student = new SchoolStudent();
        student.setName(name);
        student.setAge(20);
        String json = "";
        if(student != null){
            ObjectMapper om = new ObjectMapper();
            try {
                json = om.writeValueAsString(student);
                System.out.println(json);
            } catch (JsonProcessingException e) {
                e.printStackTrace();
            }
        }
        response.setContentType("application/json;charset=utf-8");
        PrintWriter pw = null;
        try {
            pw = response.getWriter();
        } catch (IOException e) {
            e.printStackTrace();
        }
        pw.println(json);
        pw.flush();
        pw.close();
    }

3.4 返回对象 Object

在这里插入图片描述

3.4.1 加入json的工具库的依赖

springmvc默认使用jackson,上面的例子有依赖项。

3.4.2 在springmvc配置文件之间加入注解驱动

注意,annotation-driven有许多重名的,要选下面这个。
在这里插入图片描述
处理器类 MyControlle

    @RequestMapping(value = "/schoolStudent.do")
    @ResponseBody
    public SchoolStudent doReturnJson(String name, String age){
        SchoolStudent schoolStudent = new SchoolStudent();
        schoolStudent.setName("小雪");
        schoolStudent.setAge(23);
        return schoolStudent;
    }

3.4.3 在处理器方法上面加入@ResponseBody

@ResponseBody

3.4.4 返回自定义对象

   @RequestMapping(value = "/schoolStudent.do")
    public SchoolStudent doReturnJson(){
        SchoolStudent schoolStudent = new SchoolStudent();
        schoolStudent.setName("小雪");
        schoolStudent.setAge(23);
        return schoolStudent;
    }

3.4.5 返回LIst集合

   @RequestMapping(value = "/schoolStudent.do")
    @ResponseBody
    public List<SchoolStudent> doReturnJson(){
        List<SchoolStudent> list = new ArrayList<>();

        SchoolStudent schoolStudent = new SchoolStudent();
        schoolStudent.setName("小雪");
        schoolStudent.setAge(23);
        list.add(schoolStudent);

        SchoolStudent schoolStudent2 = new SchoolStudent();
        schoolStudent2.setName("小鱼");
        schoolStudent2.setAge(23);
        list.add(schoolStudent2);

        return list;
    }

4.访问静态资源

4.1 使用 mvc:default-servlet-handler

声 明 了 <mvc:default-servlet-handler /> 后 , springmvc 框 架 会 在 容 器 中 创 建DefaultServletHttpRequestHandler 处理器对象。它会像一个检查员,对进入 DispatcherServlet的 URL 进行筛查,如果发现是静态资源的请求,就将该请求转由 Web 应用服务器默认的Servlet 处理。一般的服务器都有默认的 Servlet。

在 Tomcat 中,有一个专门用于处理静态资源访问的 Servlet 名叫 DefaultServlet。其中为 default。可以处理各种静态资源访问请求。该 Servlet 注册在 Tomcat 服务器的 web.xml 中。在 Tomcat 安装目录/conf/web.xml。

4.2 使用 mvc:resources mapping="" location=""

在这里插入图片描述

5.地址分类

在这里插入图片描述
在这里插入图片描述
base使用:
在这里插入图片描述

在这里插入图片描述

作者:Beyong    
出处:Beyong博客
github地址:https://github.com/beyong2019

本博客中未标明转载的文章归作者Beyong有,欢迎转载,但未经作者同意必须保留此段声明,且在文章明显位置给出原文连接,否则保留追究法律责任的权利。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值