先来个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" />
@Controllerpublic class HelloController {@RequestMapping("/hello")@ResponseBodypublic 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@Mappingpublic @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)@ResponseBodypublic String inputEdit(){ return "input student edit"; }@RequestMapping(value = "/edit",method = RequestMethod.POST)@ResponseBodypublic String edit(){ return "edit student"; }}
RequestMapping注解的params属性
表示处理有指定参数的请求
@Controller@RequestMapping("/student")public class StudentController {@RequestMapping(value = "/query",params = {"name","stuId"})@ResponseBodypublic String queryByNameAndStuId(){ return "queryByNameAndStuId"; }@RequestMapping(value = "/query",params = "tel")@ResponseBodypublic 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";}
