一. RequestMapping路径详解
(1)首先springDispatcherServlet-servlet.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.atguigu.springmvc"/>
<!-- 配置视图解析器:如何把handler方法返回值解析为实际的物理视图
通俗的讲就是:配置一个前缀“prefix”和一个后缀“suffix”,到时候与处理方法返回的
变量的值“returnVal”组成 “prefix + returnVal + suffix”(URI) -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
(2)Controller 类
@Controller
@RequestMapping("/springmvc")
public class HelloWord {
/**
* 1. 使用@RequestMapping注解来映射请求的URL
* 2. 返回值会通过视图解析器解析为实际的物理视图,对于 InternalResourceViewResolver视图解
* 析器会做如下解析: 通过prefix + returnVal + 后缀 这样的方式得到实际的物理实物图
* 然后做转发操作
* @return returnVal
*/
@RequestMapping("/hello")
public String hello() {
System.out.println("Hello SpringMVC...");
return "success";
}
}
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
@RequestMapping("/jsp")
public class RequestController {
public static final String SUCCESS="success";
@RequestMapping("/login1")
public void hello(){
System.out.println("hello world");
}
/*第一点
*1:@RequestMapping定义在类上,那就相当于根目录
*2:@RequestMapping定义在方法上,那就相当于相对于类定义处的URL。
* 上面代码在类定义处指定映射为"/jsp",在hello()方法处指定为"/login1"。
* 那么hello()方法的URL映射地址为:http://localhost:8080/ssm/jsp/login1
* ssm指的是你项目的名称
*/
/*第二点
* 1.@RequestMapping在类上定义不是必须的,如上如果我只在方法上定义@RequestMapping("/jsp/login1")
* 那么它同样能访问上面的URL映射地址。
* 2.@RequestMapping的默认属性为value,所以@RequestMapping(value="/login1")和@RequestMapping("/login1")是等价的。
*/
@RequestMapping("/login2")
public String getModel(){
System.out.println("hello world");
return SUCCESS;
}
/*第三点:需要返回界面
*1.这个return success;加上springMVC配置的路径
* 那么它返回的路径是:
* http://localhost:8080/ssm/WEB-INF/jsp/success.jsp
*/
@RequestMapping(value="/jsp/login3")
public ModelAndView paramBind(){
ModelAndView modelAndView = new ModelAndView();
//传到界面的数据
modelAndView.addObject("date", "nihao");
modelAndView.setViewName(SUCCESS);
return modelAndView;
}
/*第四点:返回界面同时带上数据
* 1.好多时候,我们要的不是跳转界面,而是能够把后台的数据传到前端去
* modelAndView.addObject放的就是你要传的数据
* modelAndView.setViewName返回路径名称
* 所以它的返回路径和上面一样
*/
/*第五点:void类型无返回值跳转
* 1.根据上面无返回值那么它最终会跳转到
* http://localhost:8080/ssm/WEB-INF/jsp/jsp/login1.jsp
* 原则:
* prefix+类路径(类级别的mapping注解)+方法路径(方法级别的mapping注解)+prefix
*/
}
二.RequestMapping参数详解
请求参数的作用是使得请求的映射更加精细。
RequestMapping注解有六个属性,下面我们把她分成三类进行说明
value:定义处理方法的请求的 URL 地址。(重点)
method:定义处理方法的 http method 类型,如 GET、POST 等。(重点)
params: 定义请求的 URL 中必须包含的参数。或者不包含某些参数。(了解)
headers: 定义请求中 Request Headers 必须包含的参数。或者不包含某些参数。(了解)
下面也用个Controller 类来说明
1. Controller
@Controller
@RequestMapping("/hello")
public class TestController {
public static final String SUCCESS="success";
/**
* 通过method属性指定请求方式
* @return SUCCESS
*/
@RequestMapping(method=RequestMethod.POST,value="/login1")
public String testMethodPost(){
return SUCCESS;
}
/**
* 测试url中带参数(未测试请求头信息)
* param1 : 表示请求必须包含名为param1的请求参数
* !param1 : 表示请求不能包含名为param1的请求参数
* param1 != value1 : 表示请求必须包含名为param1的请求参数,但其值不能为value1
* {"param1=value1", "param2"} 表示请求必须包含名为param1和param2的两个请求参数,且
param1的参数的值必须为value1
* headers与params同理
*/
// url http://localhost:8080/hello/login2?username=zhangsan&password=123&sex=2
@RequestMapping(value="/login2",
params={"username","sex!=1","password=123"},
method=RequestMethod.GET)
public String testHeadersAndParams(){
return SUCCESS;
}
/**
* PathVariable 映射 URL 绑定占位 ( 映射URL路径里面的变量)
*
* 用Integer会比int严谨
*/
/**
* @PathVariable 可以映射URL中的占位符到目标方法的参数中(映射URL路径里面的变量)
* 用Integer会比int严谨
* @param id
* @return SUCCESS
*/
//http://localhost:8080/hello/3
@RequestMapping("/testPathVariable/{id}")
public String testPathVariable(@PathVariable("id") Integer id) {
System.out.println("testPathVariable:" + id);
return SUCCESS;
}
// http://localhost:8080/hello/login4/str
@RequestMapping(value="/login4/{name}",method=RequestMethod.GET)
public String testPathVariable2(@PathVariable("name") String name){
System.out.println("name :"+name);
return SUCCESS;
}
/**
* 如果在方法上@RequestMapping()没有任何参数,那它就代表类上的value请求地址
*
*/
// http://localhost:8080/hello.jsp
@RequestMapping()
public String test(){
return SUCCESS;
}
}