当前位置: 首页 > article >正文

SpringMVC框架---SpringMVC概述、入门案例、常用注解

目录

第一章:三层架构和MVC

1.三层架构

2. MVC模型

第二章:SpringMVC的入门案例

1. SpringMVC的简介

1.1 SpringMVC介绍

1.2 SpringMVC执行过程

2. SpringMVC的入门程序

创建WEB工程,引入开发的jar包

项目代码

3. 入门案例的执行过程分析

4. RequestMapping注解

第三章:请求参数的绑定

jsp代码

Javabean代码

controller代码

请求参数中文乱码的解决

自定义类型转换器

第一种方式使用DateTimeFormat注解的方式

第二种方式,自定义类型转换器。

在控制器中使用原生的ServletAPI对象

第四章:常用的注解

RequestParam注解

RequestBody注解

restful编程风格

PathVaribale注解

RequestHeader注解

CookieValue注解


第一章:三层架构和MVC

1.三层架构

  1. 咱们开发服务器端程序,一般都基于两种形式,一种C/S架构程序(Client/Server,客户端/服务器),一种B/S架构程序(Browser/Server,浏览器/服务器)
  2. 使用Java语言基本上都是开发B/S架构的程序,B/S架构又分成了三层架构
  3. 三层架构
    1. 表现层:WEB层,用来和客户端进行数据交互的。表现层一般会采用MVC的设计模型
    2. 业务层:处理公司具体的业务逻辑的
    3. 持久层:用来操作数据库的

2. MVC模型

  1. MVC全名是Model View Controller 模型视图控制器,每个部分各司其职。
  2. Model:数据模型,JavaBean的类,用来进行数据封装。
  3. View:指JSP、HTML用来展示数据给用户
  4. Controller:用来接收用户的请求,整个流程的控制器。用来进行数据校验等。

第二章:SpringMVC的入门案例

1. SpringMVC的简介

1.1 SpringMVC介绍

        SpringMVC是Spring框架中的一个模块,是针对表现层提出来相应的解决方案

        SpringMVC是基于MVC设计模式的表现层框架。它没有完全替换Servlet,底层也是通过Servlet来实现。

        DispatcherServlet前端控制器,用于接收分发请求给各个组件,由各个组件对请求进行处理,最后将处理的结果响应给浏览器。

      DispatcherServlet需要在web.xml文件中进行配置。

1.2 SpringMVC执行过程

2. SpringMVC的入门程序

创建WEB工程,引入开发的jar包

 选择maven的JavaWeb项目

 输入GroupId 和ArtifactId

配置tomcat

 

 补充包结构

项目代码

引入依赖

<!-- 版本锁定 -->
    <properties>
        <spring.version>5.0.2.RELEASE</spring.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
​
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
        </dependency>
​
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
​
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
            <scope>provided</scope>
        </dependency>
​
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

编写index.jsp页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>入门程序</title>
</head>
<body>
​
    <%--超链接--%>
​
    <h3>入门</h3>
​
    <a href="/hello.do" >入门程序</a>
​
</body>
</html>

编写suc.jsp页面,路径为:/WEB-INF/pages/suc.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>成功</title>
</head>
<body>
    
    <h3>入门成功了2...</h3>
    
</body>
</html>

编写Controller类和方法,Controller类用于执行业务层逻辑操作

@Controller 将这个类交给spring去管理,@RequestMapping注解配置映射的配置

package com.qcby.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 表现层控制器
 * 接收前端请求的
 */
@Controller
@RequestMapping("mvc01")
public class HelloController {

    /**
     * 处理超链接发送出来的请求
     * @return
     */
    //配置映射的配置
    @RequestMapping(path="hello.do")
    //具体处理前端请求的方法
    public String sayHello(){
        System.out.println("入门方法执行了2...");

        //跳转的jsp页面的路径,默认使用的是请求的转发
        // return "/WEB-INF/pages/suc.jsp";
        //配置了试图解析器后,写法
        return "suc";
    }
}

配置核心的控制器(配置DispatcherServlet

在web.xml配置文件中核心控制器DispatcherServlet

前端控制器,底层的实现是Servlet,<load-on-startup>1</load-on-startup>中间值大于0时,tomcat启动的时候就加载,且有多个需要启动加载的时候,按照中间值由小到大的顺序启动

映射部分<url-pattern>*.do</url-pattern>拦截所有后缀为.do的请求

<url-pattern>/</url-pattern>拦截除了jsp之外的所有请求

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1"
         metadata-complete="true">

  <!--配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--加载springmvc.xml配置文件,配置的是Spring配置-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springMVC.xml</param-value>
    </init-param>
    <!--配置启动加载-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

</web-app>

编写springmvc.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    
    <!--配置spring创建容器时要扫描的包-->
    <context:component-scan base-package="com.qcby"></context:component-scan>

    <!--配置视图解析器-->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!-- 前缀路径 -->
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <!-- 后缀 -->
        <property name="suffix" value=".jsp"></property>
    </bean>

</beans>

启动Tomcat服务器,进行测试

3. 入门案例的执行过程分析

入门案例的执行流程

  1. 当启动Tomcat服务器的时候,因为配置了load-on-startup标签,所以会创建DispatcherServlet对象,就会加载springmvc.xml配置文件
  2. 开启了注解扫描,那么HelloController对象就会被创建
  3. 从index.jsp发送请求,请求会先到达DispatcherServlet核心控制器,根据配置@RequestMapping注解找到执行的具体方法
  4. 根据执行方法的返回值,再根据配置的视图解析器,去指定的目录下查找指定名称的JSP文件
  5. Tomcat服务器渲染页面,做出响应

入门案例中的组件分析

  1. 前端控制器(DispatcherServlet)
  2. 处理器映射器(HandlerMapping)
  3. 处理器(Handler)
  4. 处理器适配器(HandlAdapter)
  5. 视图解析器(View Resolver)
  6. 视图(View)

4. RequestMapping注解

RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系

RequestMapping注解可以作用在方法和类上

  1. 作用在类上:第一级的访问目录
  2. 作用在方法上:第二级的访问目录
  3. 细节:路径可以不编写 / 表示应用的根目录开始

RequestMapping的属性

  1. path  指定请求路径的url
  2. value  value属性和path属性是一样的
  3. mthod  指定该方法的请求方式
  4. params  指定限制请求参数的条件
@RequestMapping(value = "/hello.do", method = RequestMethod.GET, params = "username")

value 可以省略不写

  • RequestMethod.GET 一般查询请求用get,可以带参数可以不带参数
  • RequestMethod.PUT 一般修改用put
  • RequestMethod.POST 带有请求体的请求一般用做新增
  • RequestMethod.DELETE 传递一个参数进行删除

更改为下面代码后同样可以执行成功

@RequestMapping(path="hello.do", method = RequestMethod.GET)

更改index.jsp

此时运行不成功,网页错误代码 405 请求方式错误

即请求方式不匹配,可以将@RequestMapping注解改为下面这行代码,运行成功

@RequestMapping(path="hello.do", method = RequestMethod.POST)

或者把index.jsp中改为get

package com.qcby.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * 表现层控制器
 * 接收前端请求的
 */
@Controller
@RequestMapping("mvc01")
public class HelloController {

    /**
     * 处理超链接发送出来的请求
     *
     * method="当前方法允许请求方式能访问"
     * params="请求路径上传参数"
     *
     *
     * @return
     */
    //配置映射的配置
    //具体处理前端请求的方法
    @RequestMapping(value = "hello.do",method = RequestMethod.GET,params = {"username"})
    public String sayHello(){
        System.out.println("入门方法执行了2...");

        //跳转的jsp页面的路径,默认使用的是请求的转发
        // return "/WEB-INF/pages/suc.jsp";
        //配置了试图解析器后,写法
        return "suc";
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>入门程序</title>
</head>
<body>
​

<h3>入门</h3>
​
<%--<a href="/mvc01/hello.do" >入门程序</a>--%>
​
<form action="/mvc01/hello.do" method="get">
    用户名:<input name="username" id="username" type="text">
    <input type="submit" value="提交"/>
</form>


</body>
</html>

运行成功,填值跳转

---------------------------------------------------------------------------------------------------------------------------------

将@RequestMapping与请求类型相结合

//将@RequestMapping与请求类型相结合
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping

第三章:请求参数的绑定

请求参数的绑定说明

  1. 绑定机制
    1. 表单提交的数据都是k=v格式的 username=haha&password=123
    2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
    3. 要求:提交表单的name和参数的名称是相同的
  2. 支持的数据类型
    1. 基本数据类型和字符串类型
    2. 实体类型(JavaBean)
    3. 集合数据类型(List、map集合等)

基本数据类型和字符串类型

  1. 提交表单的name和参数的名称是相同的
  2. 区分大小写

实体类型(JavaBean)

  1. 提交表单的name和JavaBean中的属性名称需要一致
  2. 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:对象.属性 例如:address.name

给集合属性数据封装

  1. JSP页面编写方式:list[0].属性

jsp代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>请求参数绑定</title>
</head>

<body>

    <h3>请求参数绑定入门</h3>

    <form action="/user/save1.do" method="post">
        姓名:<input type="text" name="username" /><br/>
        年龄:<input type="text" name="age" /><br/>
        <input type="submit" value="提交" />
    </form>

    <h3>请求参数绑定(封装到实体类)</h3>

    <form action="/user/save2.do" method="post">
        姓名:<input type="text" name="username" /><br/>
        年龄:<input type="text" name="age" /><br/>
        <input type="submit" value="提交" />
    </form>

    <h3>请求参数绑定(封装到实体类)</h3>

    <form action="/user/save3.do" method="post">
        姓名:<input type="text" name="username" /><br/>
        年龄:<input type="text" name="age" /><br/>
        金额:<input type="text" name="address.money" /><br/>
        <input type="submit" value="提交" />
    </form>

    <h3>请求参数绑定(封装到实体类,存在list集合)</h3>

    <form action="/user/save4.do" method="post">
        姓名:<input type="text" name="username" /><br/>
        年龄:<input type="text" name="age" /><br/>
        金额:<input type="text" name="address.money" /><br/>
        ​
        集合 金额:<input type="text" name="list[0].money" /><br/>
        集合 姓名:<input type="text" name="list[0].name" /><br/>
        <input type="submit" value="提交" />
    </form>

    <h3>日期转换</h3>
    <form action="/user/save5.do" method="post">
        姓名:<input type="text" name="username" /><br/>
        年龄:<input type="text" name="age" /><br/>
        生日:<input type="text" name="birthday" /><br/>
        <input type="submit" value="提交" />
    </form>

    <h3>使用map集合数据类型</h3>
    <form action="/user/save6.do" method="post">
        username<input type="text" name="username"><br>
        map集合key<input type="text" name="test"><br>
        <%--
        map:{username=123, test=456}
        username:123
        --%>
        <input type="submit" value="提交" />
    </form>
</body>
</html>

Javabean代码

package com.qcby.demo2;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class User implements Serializable{

    private String username;
    private Integer age;

    //生日
    //默认使用的是/ 例如2012/12/12
    //想使用 2012-12-12
    //第一种方式 使用DateTimeFormat注解的方式
    //@DateTimeFormat(pattern = "yyyy-MM-dd")
    //@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;
    //引用对象
    private Address address;

    //list集合
    private List<Address> list;

    private Map<String, Address> extraInfo;

    public User(String username, Integer age, Date birthday, Address address, List<Address> list, Map<String, Address> extraInfo) {
        this.username = username;
        this.age = age;
        this.birthday = birthday;
        this.address = address;
        this.list = list;
        this.extraInfo = extraInfo;
    }

    public User() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

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

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public List<Address> getList() {
        return list;
    }

    public void setList(List<Address> list) {
        this.list = list;
    }

    public Map<String, Address> getExtraInfo() {
        return extraInfo;
    }

    public void setExtraInfo(Map<String, Address> extraInfo) {
        this.extraInfo = extraInfo;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                ", address=" + address +
                ", list=" + list +
                ", extraInfo=" + extraInfo +
                '}';
    }
}

controller代码

package com.qcby.demo2;

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

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.text.SimpleDateFormat;
import java.util.Map;

/**
 *
 * 用户的模块
 */

@Controller
@RequestMapping("/user")
public class UserController {

    /**
     * 请求参数的绑定
     * @param username
     * @param age
     * @return
     */
    @RequestMapping("/save1.do")
    public String save(String username,Integer age){
        System.out.println("姓名"+username);
        System.out.println("年龄"+age);
        return "suc";
    }

    /**
     * 请求参数的绑定
     * @param user
     * @return
     */
    @RequestMapping("/save2.do")
    public String save2(User user){
        System.out.println("user对象:"+user);
        return "suc";
    }

    /**
     * 请求参数的绑定
     * @param user
     * @return
     */
    @RequestMapping("/save3.do")
    public String save3(User user){
        System.out.println("user对象:"+user);
        return "suc";
    }

    /**
     * 请求参数的绑定
     * @param user
     * @return
     */
    @RequestMapping("/save4.do")
    public String save4(User user){
        System.out.println("user对象:"+user);
        return "suc";
    }


    @RequestMapping("/save5.do")
    public String save5(User user){
        System.out.println(user);
        //把英文的输出转换回原始状态
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String format = sdf.format(user.getBirthday());
        System.out.println(format);
        return "suc";
    }

    @RequestMapping(value = "/save6.do",method = RequestMethod.POST)
    public String save6(@RequestParam Map<String,Object> map,String username){
        System.out.println("map:"+map);
        System.out.println("username:"+username);
        return "suc";
    }

    /**
     * 原生的API
     * @return
     */
    @RequestMapping("/save7.do")
    public String save6(HttpServletRequest request, HttpServletResponse response){
        System.out.println(request);
        // 获取到HttpSession对象
        HttpSession session = request.getSession();
        System.out.println(session);
        System.out.println(response);
        return "suc";
    }
}

map的输出结果

map:{username=123, test=456}
username:123

请求参数中文乱码的解决

在web.xml中配置Spring提供的过滤器类

<!-- 配置过滤器,解决中文乱码的问题 -->
<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>
</filter>

<filter-mapping>
  <filter-name>characterEncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

自定义类型转换器

        如果想提交日期类型数据就必须要按照SpringMVC设置的格式输入,SpringMVC的默认格式为:yyyy/MM/dd。如果我们输入yyyy-MM-dd格式或者yyyy.MM.dd则会出错,使用以下两种方式解决:

第一种方式使用DateTimeFormat注解的方式

使用这个注解一定要在Spring配置文件中打开注解支持

<mvc:annotation-driven/>

@DateTimeFormat(pattern = "yyyy-MM-dd")

pattern属性值可以省略不写

package com.qcby.demo2;

import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

public class User implements Serializable{

    private String username;
    private Integer age;

    //生日
    //默认使用的是/ 例如2012/12/12
    //想使用 2012-12-12
    //第一种方式 使用DateTimeFormat注解的方式
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    //@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
    //@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date birthday;
    //引用对象
    private Address address;

    //list集合
    private List<Address> list;

    private Map<String, Address> extraInfo;

    public User(String username, Integer age, Date birthday, Address address, List<Address> list, Map<String, Address> extraInfo) {
        this.username = username;
        this.age = age;
        this.birthday = birthday;
        this.address = address;
        this.list = list;
        this.extraInfo = extraInfo;
    }

    public User() {
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public Integer getAge() {
        return age;
    }

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

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    public List<Address> getList() {
        return list;
    }

    public void setList(List<Address> list) {
        this.list = list;
    }

    public Map<String, Address> getExtraInfo() {
        return extraInfo;
    }

    public void setExtraInfo(Map<String, Address> extraInfo) {
        this.extraInfo = extraInfo;
    }

    @Override
    public String toString() {
        return "User{" +
                "username='" + username + '\'' +
                ", age=" + age +
                ", birthday=" + birthday +
                ", address=" + address +
                ", list=" + list +
                ", extraInfo=" + extraInfo +
                '}';
    }
}

第二种方式,自定义类型转换器。

如果想自定义数据类型转换,可以实现Converter的接口

1.自定义类型转换器

package com.qcby.demo2;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 自定义类型转换器 把String转换成Date
 */
public class StringToDate implements Converter<String,Date> {
    /**
     * 进行类型转换的方法
     * @param s 用户输入的内容
     * @return
     */
    @Override
    public Date convert(String s) {
        //判断
        if(s == null){
            throw new RuntimeException("请输入日期");
        }
        //进行转换
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try{
            //进行转换
            return sdf.parse(s);
        }catch (ParseException e){
            throw new RuntimeException(e);
        }
    }

}

2.注册自定义类型转换器,在springmvc.xml配置文件中编写配置

    <!--配置日期类型转换器,类型转换器的组件,把日期类型转换注入到组件对象中-->
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.qcby.demo2.StringToDate"/>
            </set>
        </property>
    </bean>
    <!--让映射器、适配器和处理器生效(默认不配置也是可以的)-->
    <mvc:annotation-driven conversion-service="conversionService"/>

在控制器中使用原生的ServletAPI对象

只需要在控制器的方法参数定义HttpServletRequestHttpServletResponse对象

/**
 * 原生的API
 * @return
 */
@RequestMapping("/save7.do")
public String save6(HttpServletRequest request, HttpServletResponse response){
    System.out.println(request);
    // 获取到HttpSession对象
    HttpSession session = request.getSession();
    System.out.println(session);
    System.out.println(response);
    return "suc";
}

第四章:常用的注解

RequestParam注解

1.作用:把请求中的指定名称的参数传递给控制器中的形参赋值

2.属性:

        value:请求参数中的名称

        required:请求参数中是否必须提供此参数,默认值是true,必须提供

        defaultValue:当参数没有传入的时候使用的默认值,必须搭配required = false使用

代码如下

package com.qcby.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/dept")
public class DeptController {

    @RequestMapping("/save1.do")
    public String save(@RequestParam(value = "username",required = false,defaultValue = "abc") String name){
        System.out.println("姓名:"+name);
        return "suc";
    }
}

RequestBody注解

1.作用:用于获取请求体的内容(注意:get方法不可以)
2.属性
        required:是否必须有请求体,默认值是true
3.代码如下

@RequestMapping("/save2.do")
    public String save2(@RequestBody String body){
        System.out.println("请求体内容:"+body);
        return "suc";
    }

restful编程风格

//@GetMapping

//@PutMapping

//@DeleteMapping

//@PostMapping

package com.qcby.controller;

import org.springframework.aop.scope.ScopedProxyUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
//@GetMapping
//@PutMapping
//@DeleteMapping
//@PostMapping
//@RequestMapping("/emp")
public class EmpController {
    /**
     * 保存
     * @return
     */
    @PostMapping("/emp")
    public String save(){
        System.out.println("保存员工");
        return "suc";
    }
    /**
     * 查询所有
     * @return
     */
    @GetMapping("/emp")
    public String findAll(){
        System.out.println("查询所有员工");
        return "suc";
    }
    /**
     * 查询单个
     * @return
     */
    @GetMapping("/emp/{id}")
    public String findById(@PathVariable("id")Integer id){
        System.out.println("通过id查询员工");
        return "suc";
    }
    /**
     * 删除所有
     * @return
     */
    @DeleteMapping("/emp")
    public String deleteAll(){
        System.out.println("删除员工");
        return "suc";
    }
    /**
     * 通过id删除
     * @return
     */
    @DeleteMapping("/emp/{id}")
    public String deleteById(@PathVariable("id")Integer id){
        System.out.println("通过id删除员工");
        return "suc";
    }
    /**
     * 修改
     * @return
     */
    @PutMapping("/emp/{id}")
    public String updateById(@PathVariable("id")Integer id){
        System.out.println("更新员工");
        return "suc";
    }
}

suc.jsp

isErrorPage="true"该页面是否应该作为错误页面使用

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>成功</title>
</head>
<body>
<h3>入门成功了</h3>
</body>
</html>

可以通过Postman测试

执行程序之后,在Postman中输入域名,左侧根据方法类型选择

比如 此时我执行的是通过id删除

PathVaribale注解

1.作用:拥有绑定url中的占位符的,从 URL 路径中提取变量值。例如:url中有/delete/{id},{id}就是占位符
2.属性
        value:指定url中的占位符名称
3.Restful风格的URL
        请求路径一样,可以根据不同的请求方式去执行后台的不同方法

restful风格的URL优点

  • 结构清晰
  • 符合标准
  • 易于理解
  • 扩展方便

4.代码如下
下面方法的路径都一样为"/emp",但是请求方法不一样或者参数名称不一样

package com.qcby.controller;

import org.springframework.aop.scope.ScopedProxyUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
//@GetMapping
//@PutMapping
//@DeleteMapping
//@PostMapping
//@RequestMapping("/emp")
public class EmpController {
    /**
     * 保存
     * @return
     */
    @PostMapping("/emp")
    public String save(){
        System.out.println("保存员工");
        return "suc";
    }
    /**
     * 查询所有
     * @return
     */
    @GetMapping("/emp")
    public String findAll(){
        System.out.println("查询所有员工");
        return "suc";
    }
    /**
     * 查询单个
     * @return
     */
    @GetMapping("/emp/{id}")
    public String findById(@PathVariable("id")Integer id){
        System.out.println("通过id查询员工");
        return "suc";
    }
    /**
     * 删除所有
     * @return
     */
    @DeleteMapping("/emp")
    public String deleteAll(){
        System.out.println("删除员工");
        return "suc";
    }
    /**
     * 通过id删除
     * @return
     */
    @DeleteMapping("/emp/{id}")
    public String deleteById(@PathVariable("id")Integer id){
        System.out.println("通过id删除员工");
        return "suc";
    }
    /**
     * 修改
     * @return
     */
    @PutMapping("/emp/{id}")
    public String updateById(@PathVariable("id")Integer id){
        System.out.println("更新员工");
        return "suc";
    }
}

前端页面index.jsp

根据表单的action值来匹配url,根据method的值来匹配HTTP方法

这里方法并没有全部调用,想要调用别的方法直接修改action值和method的值即可

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<body>

<form action="/emp" method="get">
    <input type="submit" value="提交查询">
</form>

<form action="/emp/1" method="get">
    <input type="submit" value="提交通过id查询">
</form>

<form action="/emp" method="post">
    <input type="submit" value="提交新增">
</form>

<form action="/emp/1" method="put">
    <input type="submit" value="提交修改">
</form>
</body>

</html>

5.修改前端控制器的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1"
         metadata-complete="true">

  <!--配置前端控制器-->
  <servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--加载springmvc.xml配置文件,配置的是Spring配置-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springMVC.xml</param-value>
    </init-param>
    <!--配置启动加载-->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <!--<url-pattern>*.do</url-pattern>-->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

  <!-- 配置过滤器,解决中文乱码的问题 -->
  <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>
  </filter>

  <filter-mapping>
    <filter-name>characterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

</web-app>

RequestHeader注解

1.作用:获取指定请求头的值
2.属性
        value:请求头的名称
3.代码如下

@RequestMapping("save3.do")
public String save3(@RequestHeader(value = "Accept") String header){
    System.out.println("Accept请求头的值:"+header);
    return "suc";
}

CookieValue注解

1.作用:用于获取指定cookie的名称的值
2.属性
        value:cookie的名称
3.代码

@RequestMapping("/save4.do")
public String save4(@CookieValue(value = "JSESSIONID") String cookie){
    System.out.println("值:"+cookie);
    return "suc";
}

.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>

<body>
    <h3>1.RequestParam注解---把请求中的指定名称的参数传递给控制器中的形参赋值</h3>

    <form action="/dept/save1.do" method="post">
        姓名:<input type="text" name="username" /><br/>
        <input type="submit" value="提交" />
    </form>

    <h3>2.RequestBody注解---获取请求体的内容</h3>

    <form action="/dept/save2.do" method="post">
        请求体:<input type="text" name="body" /><br/>
        <input type="submit" value="提交" />
    </form>

    <h3>3.PathVaribale注解---拥有绑定url中的占位符的</h3>
    <h3></h3>
    <form action="/emp" method="post">
        <input type="submit" value="保存员工"/>
    </form>
    <form action="/emp" method="get">
        <input type="submit" value="查询员工"/>
    </form>

    <form action="/emp" method="get">
        <input type="text" name="username"/><br/>
        <input type="submit" value="提交"/>
    </form>

    <h3>4.RequestHeader注解---获取指定请求头的值</h3>

    <form action="/dept/save3.do" method="get">
        <input type="submit" value="提交请求"/>
    </form>


    <h3>5.CookieValue注解---获取指定cookie的名称的值</h3>

    <form action="/dept/save4.do" method="get">
        <input type="submit" value="提交请求"/>
    </form>
</body>
</html>


http://www.kler.cn/a/411764.html

相关文章:

  • 【8210A-TX2】Ubuntu18.04 + ROS_ Melodic + TM-16多线激光 雷达评测
  • TailwindCss 总结
  • 前端适配:常用的几种方案
  • 使用ENSP实现默认路由
  • 填补覆盖空白,小型机器人让智能清洁再“净”一步!
  • 最新SQL Server 2022保姆级安装教程【附安装包】
  • Flink Transformation-转换算子
  • C++设计模式之组合模式的基本结构
  • 【多线程-第一天-多线程的技术方案-pthread演示 Objective-C语言】
  • React中事件处理和合成事件:理解与使用
  • [RabbitMQ] 保证消息可靠性的三大机制------消息确认,持久化,发送方确认
  • 写个添加球队和展示球队的功能--laravel与inertia
  • 多线程
  • 【含开题报告+文档+PPT+源码】基于Spring Boot+Vue的在线学习平台的设计与实现
  • 多级反馈队列调度算法
  • kafka生产者和消费者命令的使用
  • 深入解析下oracle date底层存储方式
  • 利用Java爬虫获取1688商品类目:技术解析与代码示例
  • python操作Elasticsearch
  • PHP md5函数 生成的字符串是多少位的
  • 一个开源轻量级的服务器资源监控平台,支持告警推送
  • 应用商店双弹窗“APP在向用户申请权限时未同步告知用户申请此权限的理由”驳回uni-app应用上线的解决方法
  • 从零开始学GeoServer源码(二)添加支持arcgis切片功能
  • 小程序-基于java+SpringBoot+Vue的网上花店微信小程序设计与实现
  • Android Toast信息定位分析介绍
  • 基于Matlab实现Gabo滤波器(源码)