先来个HelloWorld

  1. 加入依赖
  2. 加入springMVC的核心配置文件spring-mvc.xml
  3. 在web.xml配置文件中配置前端控制器(核心servlet)—— DispatcherServlet
  4. 在spring-mvc.xml中配置扫描器
  5. 添加一个控制器类(Controller)
  6. 测试

    1. <packaging>war</packaging>
    2. <properties>
    3. <spring.version>5.2.9.RELEASE</spring.version>
    4. </properties>
    5. <dependencies>
    6. <!-- 依赖spring-webmvc -->
    7. <dependency>
    8. <groupId>org.springframework</groupId>
    9. <artifactId>spring-webmvc</artifactId>
    10. <version>${spring.version}</version>
    11. </dependency>
    12. <!-- JSP-API的依赖 -->
    13. <dependency>
    14. <groupId>javax.servlet.jsp</groupId>
    15. <artifactId>jsp-api</artifactId>
    16. <version>2.2</version>
    17. <scope>provided</scope>
    18. <!-- ??? -->
    19. </dependency> <!-- servlet-api依赖 -->
    20. <dependency>
    21. <groupId>javax.servlet</groupId>
    22. <artifactId>javax.servlet-api</artifactId>
    23. <version>4.0.1</version>
    24. <!-- jar文件不会打包到工程中 -->
    25. <scope>provided</scope>
    26. </dependency>
    27. </dependencies>
    28. <build>
    29. <plugins>
    30. <!-- maven内置 的tomcat7插件 -->
    31. <plugin>
    32. <groupId>org.apache.tomcat.maven</groupId>
    33. <artifactId>tomcat7-maven-plugin</artifactId>
    34. <version>2.2</version>
    35. <configuration>
    36. <!-- 可以灵活配置工程路径 -->
    37. <path>/</path>
    38. <!-- 可以灵活配置端口号 -->
    39. <port>8080</port>
    40. </configuration>
    41. </plugin>
    42. </plugins>
    43. </build>
    1. <!-- 前端控制器(核心控制器) -->
    2. <servlet>
    3. <servlet-name>DispatcherServlet</servlet-name>
    4. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    5. <init-param>
    6. <param-name>contextConfigLocation</param-name>
    7. <param-value>classpath:spring-mvc.xml</param-value>
    8. </init-param>
    9. <load-on-startup>1</load-on-startup>
    10. </servlet>
    11. <servlet-mapping>
    12. <servlet-name>DispatcherServlet</servlet-name>
    13. <url-pattern>/*</url-pattern>
    14. </servlet-mapping>
    1. <!-- 扫描包 -->
    2. <context:component-scan base-package="com.quail.controller" />
    1. @Controller
    2. public class HelloController {
    3. @RequestMapping("/hello")
    4. @ResponseBody
    5. public String say(String name){
    6. return "hello:"+name;
    7. }
    8. }

    @Controller注解,表示将这个类交个spring管理。
    这里的HelloController一般称之为后端控制器。里面的say()方法称之为Handler。
    @RequestMapping(“/hello”) 请求映射,/hello这个请求映射到say方法。
    @ResponseBody:将这个方法的返回值以字符串的形式直接输出到客户端。
    我们请求中传递的参数,会自动绑定到这个say方法的形参中的。参数名必须一致,类型要可以转换。
    image.png

    @RequestMapping的配置

    1. @Target({ElementType.TYPE, ElementType.METHOD}) //可以注解在方法和类上方
    2. @Retention(RetentionPolicy.RUNTIME)
    3. @Documented
    4. @Mapping
    5. public @interface RequestMapping {
    6. //映射的名字
    7. String name() default "";
    8. //path属性的别称
    9. @AliasFor("path") String[] value() default {};
    10. //映射的请求路径
    11. @AliasFor("value") String[] path() default {};
    12. //配置处理的请求方法
    13. RequestMethod[] method() default {};
    14. //处理的请求参数
    15. String[] params() default {};
    16. //处理的请求头
    17. String[] headers() default {};
    18. //处理的请求类型
    19. String[] consumes() default {};
    20. //响应类型
    21. String[] produces() default {};
    22. }

    有几个“子类”(功能相似):
    @GetMapping GET请求映射
    @PostMapping POST请求映射
    @PutMapping PUT请求映射
    @DeleteMapping DELETE请求映射
    @PatchMapping PATCH请求映射
    **

  • 当只有方法上有明确的RequestMapping注解时,url就是注解的value
  • 当只有类上面有明确的RequestMapping注解时,url就是注解的value
  • 当类上有该注解,方法上也有时,url是两个注解的value的拼接
  • 类中没有任何该注解时,会报错
  • 类上面有该注解,多个方法都没有,会报错
  • 类中有多个方法有该注解时,会优先根据参数匹配度找到url

    RequestMapping注解的method属性

    执行请求类型符合条件的方法

    1. @Controller
    2. @RequestMapping("/student")
    3. public class StudentController {
    4. @RequestMapping(value = "/edit",method = RequestMethod.GET)
    5. @ResponseBody
    6. public String inputEdit(){ return "input student edit"; }
    7. @RequestMapping(value = "/edit",method = RequestMethod.POST)
    8. @ResponseBody
    9. public String edit(){ return "edit student"; }
    10. }

    RequestMapping注解的params属性

    表示处理有指定参数的请求

    1. @Controller
    2. @RequestMapping("/student")
    3. public class StudentController {
    4. @RequestMapping(value = "/query",params = {"name","stuId"})
    5. @ResponseBody
    6. public String queryByNameAndStuId(){ return "queryByNameAndStuId"; }
    7. @RequestMapping(value = "/query",params = "tel")
    8. @ResponseBody
    9. public String queryByTel(){ return "queryByTel"; }
    10. }

    queryByNameAndStuId配置,请求中必须携带name和stuId参数。
    queryByTel配置,请求中必须携带参数tel。
    tips:当同时携带参数 name,stuId和tel的时候,按照参数配个个数有多到少匹配。

    headers属性

    匹配有指定请求头的请求。用法与params相似。

    consumes属性

    配置方法只接收json格式的请求。

    1. @RequestMapping(value = "/query",consumes = "application/json")

    produces属性

    配置响应格式。对AJAX的支持。

    1. @RequestMapping(value = "/query",produces = "application/json;charset=utf-8")

    使用形参绑定请求参数

    ①将请求参数中的stageName1绑定到形参stageName中。
    ②如果请求参数中没有携带page参数,则page默认为1。

    1. public String query(@RequestParam("请求参数名") String name){}

    使用POJO对象绑定请求参数

    springMVC做的操作:
    ① 创建一个POJO对象。(POJO必须有无参数的构造方法)
    ②根据请求参数的名字,从POJO类中找对对应的setXxx方法,通过反射将这个参数绑定到创建好的POJO对象中。(请求参数必须是POJO对象的属性名称)。
    tips:javaBean规范。

    1. @Controller
    2. @RequestMapping("/stage")
    3. public class StageController {
    4. @RequestMapping
    5. @ResponseBody
    6. //使用POJO绑定请求参数
    7. public String save(Stage stage){ System.out.println(stage); return "save-OK"; }
    8. }

    在路径中传递请求参数

    传统的进入编辑页面的url: /stage/inputupdate?stageId=9527
    springMVC提供了另外一种方式: /stage/9527/update /stage/9527/delete
    使用:

    1. @Controller
    2. @RequestMapping("/stage")
    3. public class StageController {
    4. @RequestMapping("/query/{stageId}")
    5. @ResponseBody
    6. //表示参数的值是从路径中获取的
    7. public String queryById(@PathVariable long stageId){
    8. return "query stageId="+stageId;
    9. }
    10. }
  • 路径中的占位符

@RequestMapping(“/query/{stageId}”)
其中{stageId} 是占位符

  • @PathVariable

@PathVariable long stageId
表示形参stageId的值从路径的占位符中获取,并且占位符的名字和形参的名字一致。

视图解析器

  1. <!-- 视图解析器 -->
  2. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  3. <!-- 前缀 -->
  4. <property name="prefix" value="/WEB-INF/jsp"/>
  5. <property name="suffix" value=".jsp"/>
  6. </bean>
  1. @RequestMapping("/")
  2. public String stuList(){
  3. // 重定向 (物理视图)
  4. return "redirect:student-list.jsp";
  5. }