先来个HelloWorld
- 加入依赖
- 加入springMVC的核心配置文件spring-mvc.xml
- 在web.xml配置文件中配置前端控制器(核心servlet)—— DispatcherServlet
- 在spring-mvc.xml中配置扫描器
- 添加一个控制器类(Controller)
测试
<packaging>war</packaging>
<properties>
<spring.version>5.2.9.RELEASE</spring.version>
</properties>
<dependencies>
<!-- 依赖spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- JSP-API的依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
<!-- ??? -->
</dependency> <!-- servlet-api依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<!-- jar文件不会打包到工程中 -->
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<!-- maven内置 的tomcat7插件 -->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<!-- 可以灵活配置工程路径 -->
<path>/</path>
<!-- 可以灵活配置端口号 -->
<port>8080</port>
</configuration>
</plugin>
</plugins>
</build>
<!-- 前端控制器(核心控制器) -->
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<!-- 扫描包 -->
<context:component-scan base-package="com.quail.controller" />
@Controller
public class HelloController {
@RequestMapping("/hello")
@ResponseBody
public String say(String name){
return "hello:"+name;
}
}
@Controller注解,表示将这个类交个spring管理。
这里的HelloController一般称之为后端控制器。里面的say()方法称之为Handler。
@RequestMapping(“/hello”) 请求映射,/hello这个请求映射到say方法。
@ResponseBody:将这个方法的返回值以字符串的形式直接输出到客户端。
我们请求中传递的参数,会自动绑定到这个say方法的形参中的。参数名必须一致,类型要可以转换。
@RequestMapping的配置
@Target({ElementType.TYPE, ElementType.METHOD}) //可以注解在方法和类上方
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {
//映射的名字
String name() default "";
//path属性的别称
@AliasFor("path") String[] value() default {};
//映射的请求路径
@AliasFor("value") String[] path() default {};
//配置处理的请求方法
RequestMethod[] method() default {};
//处理的请求参数
String[] params() default {};
//处理的请求头
String[] headers() default {};
//处理的请求类型
String[] consumes() default {};
//响应类型
String[] produces() default {};
}
有几个“子类”(功能相似):
@GetMapping GET请求映射
@PostMapping POST请求映射
@PutMapping PUT请求映射
@DeleteMapping DELETE请求映射
@PatchMapping PATCH请求映射
**
- 当只有方法上有明确的RequestMapping注解时,url就是注解的value
- 当只有类上面有明确的RequestMapping注解时,url就是注解的value
- 当类上有该注解,方法上也有时,url是两个注解的value的拼接
- 类中没有任何该注解时,会报错
- 类上面有该注解,多个方法都没有,会报错
-
RequestMapping注解的method属性
执行请求类型符合条件的方法
@Controller
@RequestMapping("/student")
public class StudentController {
@RequestMapping(value = "/edit",method = RequestMethod.GET)
@ResponseBody
public String inputEdit(){ return "input student edit"; }
@RequestMapping(value = "/edit",method = RequestMethod.POST)
@ResponseBody
public String edit(){ return "edit student"; }
}
RequestMapping注解的params属性
表示处理有指定参数的请求
@Controller
@RequestMapping("/student")
public class StudentController {
@RequestMapping(value = "/query",params = {"name","stuId"})
@ResponseBody
public String queryByNameAndStuId(){ return "queryByNameAndStuId"; }
@RequestMapping(value = "/query",params = "tel")
@ResponseBody
public String queryByTel(){ return "queryByTel"; }
}
queryByNameAndStuId配置,请求中必须携带name和stuId参数。
queryByTel配置,请求中必须携带参数tel。
tips:当同时携带参数 name,stuId和tel的时候,按照参数配个个数有多到少匹配。headers属性
consumes属性
配置方法只接收json格式的请求。
@RequestMapping(value = "/query",consumes = "application/json")
produces属性
配置响应格式。对AJAX的支持。
@RequestMapping(value = "/query",produces = "application/json;charset=utf-8")
使用形参绑定请求参数
①将请求参数中的stageName1绑定到形参stageName中。
②如果请求参数中没有携带page参数,则page默认为1。public String query(@RequestParam("请求参数名") String name){}
使用POJO对象绑定请求参数
springMVC做的操作:
① 创建一个POJO对象。(POJO必须有无参数的构造方法)
②根据请求参数的名字,从POJO类中找对对应的setXxx方法,通过反射将这个参数绑定到创建好的POJO对象中。(请求参数必须是POJO对象的属性名称)。
tips:javaBean规范。@Controller
@RequestMapping("/stage")
public class StageController {
@RequestMapping
@ResponseBody
//使用POJO绑定请求参数
public String save(Stage stage){ System.out.println(stage); return "save-OK"; }
}
在路径中传递请求参数
传统的进入编辑页面的url: /stage/inputupdate?stageId=9527
springMVC提供了另外一种方式: /stage/9527/update /stage/9527/delete
使用:@Controller
@RequestMapping("/stage")
public class StageController {
@RequestMapping("/query/{stageId}")
@ResponseBody
//表示参数的值是从路径中获取的
public String queryById(@PathVariable long stageId){
return "query stageId="+stageId;
}
}
路径中的占位符
@RequestMapping(“/query/{stageId}”)
其中{stageId} 是占位符
- @PathVariable
@PathVariable long stageId
表示形参stageId的值从路径的占位符中获取,并且占位符的名字和形参的名字一致。
视图解析器
<!-- 视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/jsp"/>
<property name="suffix" value=".jsp"/>
</bean>
@RequestMapping("/")
public String stuList(){
// 重定向 (物理视图)
return "redirect:student-list.jsp";
}