来SpringMVC-1-入门配置

1 配置SpringMVC的前端核心控制器

<servlet>
    <servlet-name>dispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置前端核心控制器的初始化参数contextConfigLocation,指定springmvc框架的核心配置文件 -->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:spring-mvc.xml</param-value>
    </init-param>
    <!-- web容器启动就创建实例 -->
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcherServlet</servlet-name>
    <!-- 如果配置/或者*.do,对rest风格支持不友好,暂时记住就是 / (好处就是可以自行放行) -->
    <url-pattern>/</url-pattern>
</servlet-mapping>

2 配置Springmvc-config

    <context:component-scan base-package="com.yuyi.springmvc.controller"/>

    <!-- 视图解析器-jsp视图解析 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--  前缀必须是/结尾,否则容易出错 -->
        <property name="prefix" value="/WEB-INF/views/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

3 配置对应的Controller

package com.yuyi.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloSpringmvcController {
    /**
     * 第一个请求处理方法
     */
    @RequestMapping(value = "/helloMvc")
    public String helloSpringMvc() {
        System.out.println("------ Hello SpringMvc ------");
        //返回一个目标视图,此处只要写目标jsp文件名称(不需要后缀)
        return "success";
    }
}

4 以及可以在类上进行注解配置

​ 这种则需要类上注解+方法上注解组合才能进行访问,即(/springmvc/testRequestMappingMarkPlace)

package com.yuyi.springmvc.controller;

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

/**
 * Created on 2021/6/23.
 * <p>
 * Author: Lcywings
 * <p>
 * Description:请求控制器,@RequestMapping注解详解
 */
@Controller
@RequestMapping("/springmvc")
public class SpringMvcController {
    /**
     * 请求处理方法
     */
    @RequestMapping("/testRequestMappingMarkPlace")
    public String testRequestMappingMarkPlace() {
        return "success";
    }
}

@RequestMapping参数介绍:

Method参数:

/**
 * method属性,指定请求处理方式
 * 1.指定具体业务方法可以接收请求的方式,可以实现相同的请求,通过method指定不同的请求方式,实现不同的方法调用
 * 2. 默认情况下,不加method属性,会自动根据前端请求适配(get,post等都支持),一但指定了请求处理方式,会自动根据前端请求适配(get,post等都支持),一旦指定了请求处理方式,就只能接受该类型请求
 * 否则异常:HTTP Status 405—方法不允许
 */
@RequestMapping(value = "/testRequestMappingMethod", method = RequestMethod.GET)
public String testRequestMappingMethod1() {
    return "hello";
}
/**
* 多method的指定方法
*/
@RequestMapping(value = "/testRequestMappingMethod", method = {RequestMethod.POST, RequestMethod.DELETE})
    public String testRequestMappingMethod2() {

        return "success";
    }

Params参数:

/**
 * params参数,指定请求携带参数
 * 1.指定请求必须携带参数,可以指定多个(使用大括号,逗号分割),如果没有参数请求404
 * 2.可以值请求参数必须是某个值,否则不给访问(并不代表默认值)
 */
@RequestMapping(value = "/testRequestMappingParams", params = {"userName", "userPwd=EDG"})
public String testRequestMappingParams() {
    return "success";
}

headers参数:

/**
 * headers参数,指定请求头携带的参数,类似于params属性
 *
 * @return
 */
@RequestMapping(value = "/testRequestMappingHeaders", headers = "token")
public String testRequestMappingHeaders() {
    return "success";
}

@PathVariable:

/**
 * PathVariable参数注解用法, 只能加载方法参数上
 * 1.作用:可以将请求url中使用占位符进行参数绑定,直接将其绑定到目标请求处理方法的形参上
 * 2.注意:请求处理映射地址中的{xxx},必须跟请求处理方法入参注解@PathVariable (xxx)保持一致
 */
@RequestMapping(value = "/testRequestMappingPathVariable/{userName}/{userPwd}")
public String testRequestMappingPathVariable(@PathVariable("userName") String userName, @PathVariable("userPwd") String userPwd) {
    System.out.println("userName = " + userName + ", userPwd = " + userPwd);
    return "success";
}

REST风格:

/**
 * @author : zhukang
 * @date : 2021-06-23
 * @return : java.lang.String
 * @description : rest请求处理方式:GET
 */
@RequestMapping(value = "/testRequestMappingREST/{id}", method = RequestMethod.GET)
public String testRequestMappingRESTGET(@PathVariable("id")String id){
    System.out.println("Rest Get : select " + id);
    return "success";
}

/**
 * @author : zhukang
 * @date : 2021-06-23
 * @return : java.lang.String
 * @description : rest请求处理方式:POST
 */
@RequestMapping(value = "/testRequestMappingREST", method = RequestMethod.POST)
public String testRequestMappingRESTPOST(){
    System.out.println("Rest Post : insert ");
    return "success";
}

/**
 * @author : zhukang
 * @date : 2021-06-23
 * @return : java.lang.String
 * @description : rest请求处理方式:PUT
 */
@RequestMapping(value = "/testRequestMappingREST", method = RequestMethod.PUT)
public String testRequestMappingRESTPUT(){
    System.out.println("Rest Put : update ");
    return "success";
}

/**
 * @author : zhukang
 * @date : 2021-06-23
 * @return : java.lang.String
 * @description : rest请求处理方式:DELETE
 */
@RequestMapping(value = "/testRequestMappingREST/{id}", method = RequestMethod.DELETE)
public String testRequestMappingRESTDELETE(@PathVariable("id")String id){
    System.out.println("Rest Delete : delete " + id);
    return "success";
}

同时这玩意需要《Rest风格请求转换过滤器》来辅助,就是下面这玩意,写在web.xml之中

<!--  Rest风格请求转换过滤器  -->
<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>

他会自动识别post请求,并转换成你想要发送的请求类型(put、delete、push之类的),但是form表单递交其他请求很麻烦,需要用个隐藏域传一个名为_method的变量,如下:

<form action="/testRequestMappingREST" method="post">
    <input type="submit" value="Test RquestMapping Rest Post"/>
</form>
<form action="/testRequestMappingREST" method="post">
    <input type="hidden" name="_method" value="put"/>
    <input type="submit" value="Test RquestMapping Rest Put"/>
</form>
<form action="/testRequestMappingREST/1" method="post">
    <input type="hidden" name="_method" value="delete"/>
    <input type="submit" value="Test RquestMapping Rest Delete"/>
</form>

处理请求数据

@RequestParam 注解

/**
 * @author : zhukang
 * @date : 2021-06-23
 * @return : java.lang.String
 * @description : 请求参数注解RequestParam,必须掌握
 * 1)作用范围:只能出现在方法的形参上,可以不写(如果参数名和形参名一致,可以自动参数绑定)
 * 2)如果只写此注解,不写任何属性值,代表参数比传,且参数名必须跟方法形参名一致,否则不能自动绑定参数,且报错
 * 3)value属性:指定绑定参数名,代表客户端必须按照指定的别名传参
 * 4)required属性:默认是true,代表参数比传,如果不需要比传校验,可以改为false
 * 5)defaultValue属性:如果参数没传,防止参数为null,可以指定默认值
 *
 */
@RequestMapping(value = "/testRequestMappingRequestParam")
public String testRequestMappingRequestParam(@RequestParam(value = "uname", required = false, defaultValue = "admin") String userName, String userPwd){
    System.out.println("入参:userName = " + userName + ", userPwd = " + userPwd);
    return "success";
}

@RequestHeader 注解

请求头包含了若干个属性,服务器可据此获知客户端的信息,通过 @RequestHeader 即可将请求头中的属性值绑定到处理方法的入参中

/**
 * @RequestParam请求参数注解
 */
@RequestMapping(value = "/testRequestMappingRESTToken", method = RequestMethod.POST)
public String testRequestMappingRESTToken(@RequestHeader("token") String token) {
    System.out.println("入参: token = " + token);
    return "hello";
}

@CookieValue注解

  1. 使用@CookieValue绑定请求中的cookie值
  2. @CookieValue可以让处理方法入参绑定摸个Cookie值
/**
 * @RequestParam请求参数注解
 */
@RequestMapping(value = "/testRequestMappingRESTChookieValue")
public String testRequestMappingRESTChookieValue(@CookieValue("JSESSIONID") String JSESSIONID) {
    System.out.println("入参: JSESSIONID = " + JSESSIONID);
    return "hello";
}

实体入参

突出一个全自动:

  1. 使用 POJO 对象绑定请求参数值
  2. Spring MVC 会按请求参数名和 POJO 属性名进行自动匹配,自动为该对象填充属性 值。支持级联属性。
/**
 * @RequestParam请求实体参数绑定 自动根据入参的参数名和实体属性进行绑定
 */
@RequestMapping(value = "/testRequestMappingPoJo")
public String testRequestMappingPoJo(User user) {
    System.out.println("实体入参: user = " + user);
    return "hello";
}

使用 Servlet 原生 API 作为参数

可以直接使用形参承接Servlet的参数

MVC 的 Handler 方法可以接受哪些 ServletAPI 类型的参数 :

  • HttpServletRequest

  • HttpServletResponse

  • HttpSession

  • java.security.Principal

  • Locale

  • InputStream

  • OutputStream

  • Reader

  • Writer

/**
 * @author : Lcywings
 * @date : 2021/6/24 15:00
 * @acl : true
 * @description : 使用Servlet的原生API接口作为参数
 */
@RequestMapping(value = "/testRequestMappingServletApi", method = RequestMethod.POST)
public void testRequestMappingServletApi(HttpServletRequest request, HttpServletResponse response,
                                         HttpSession session) throws Exception {
    //获取参数
    String userName = request.getParameter("userName");
    System.out.println("******************************** userName:" + userName);
    //转发
    request.getRequestDispatcher("/WEB-INF/views/testRequestMappingServletApi").forward(request, response);
}

Q.E.D.