一、简介
1.MVC:
2.入门案例
3.web.xml的配置
<!-- 设置SpringMVC配置文件的位置和名称-->
<init-param>
<!--初始化参数
contextConfigLocation:指定Springmvc配置文件位置
-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 定义启动顺序:数值越小优先级越高,(越早创建 )
将DispatcherServlet的初始化时间提前到服务器启动时 -->
<load-on-startup>1</load-on-startup>
4.总结
二、详解
1.@RequestMapping注解的位置
a>标识到一个类上:设置映射请求的请求路径的初始信息
b>标识到一个方法上:设置映射请求的请求路径的具体信息
@Controller
@RequestMapping("/test")
public class TestRequestMappingController {
// 此时控制器方法所匹配的请求的请求路径为/test/hello
@RequestMapping("/hello")
public String hello(){
return "success";
}
}
2.@RequestMapping注解的value属性
一个servlet来处理多个请求
作用:通过请求的请求路径匹配请求
value属性是一个数组类型,即当前浏览器所发送的请求路径匹配value属性中的任何一个值
则当前请求就会被注解所标识的方法进行处理
@RequestMapping({"/hello","/abc"})
3.@RequestMapping注解的method属性
作用:通过请求的请求方式匹配请求
method属性是RequestMethod(枚举)类型的数组,
即当前浏览器所发送的请求方法匹配method属性中的任何一个值
则当前请求就会被注解所标识的方法进行处理
表单提交,将method设置为post,剩余全是get,比如地址栏输入地址来发送请求
@RequestMapping(
value = {"/hello","/abc"},
method = RequestMethod.GET
params = {"username"}
)
注意:若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但请求方式不匹配,此时页面报错:405--Request method 'GET' not supported
4.@RequestMapping注解的params属性
在@RequestMapping的基础上,结合请求方式的一些派生注解:
@GetMapping,@PostMapping,@DeleteMapping,@PutMapping
作用:通过请求的请求参数匹配请求,即浏览器发送的请求的请求参数必须满足params属性的设置。
params可以使用四种表达式:
“param”:表示当前所匹配请求的请求参数中必须携带params参数
“!param”:表示当前所匹配请求的请求参数中一定不能携带params参数
“param=value”:表示当前所匹配请求的请求参数中必须携带params参数且值必须为value
“param!=value”:表示当前所匹配请求的请求参数中可以不携带params参数,若携带,值一定不能是value
<a th:href="@{/hello(username='admin')}">测试测试注解</a>
<a th:href="@{/hello?username=value}">测试注解</a>
注意:若浏览器所发送的请求的请求路径和@RequestMapping注解value属性匹配,但请求参数不匹配,此时页面报错:400-- Parameter conditions "username" not met for actual request parameters: usename={admin}
5.@RequestMapping注解的headers属性(与params的用法啊一样)
6.SpringMVC支持ant风格的路径
7.SpringMVC使用路径中的占位符
<a th:href="@{/test/rest/1}">测试注解</a>
@RequestMapping("/test/rest/{id}")
public String testRest(@PathVariable("id") Integer id){
return "success";
}
8.通过servletAPI获取请求参数(用的不多)
只要在控制器方法的形参中设置HttpServletRequest类型的形参
就可以在控制器方法中使用request对象获取请求参数
public class TestParamController {
@RequestMapping("/param/servletAPI")
public String getParamByServletAPI(HttpServletRequest request){
String username = request.getParameter("username");
String password = request.getParameter("password");
System.out.println(username+" "+password);
return "success";
}
9.多种方法获取请求参数
<a>通过控制器方法的形参获取
只需要在控制器方法的形参位置,设置一个形参,形参的名字和请求参数的名字一致即可
@RequestMapping("/param")
public String testParam(String username,String password){
System.out.println(username+","+password);
return "success";
}
<b>@RequestParam:将请求参数与控制器方法的形参绑定
@RequestParam注解的三个属性:value,required,defaultValue
value:设置和形参绑定的请求参数的名字
required:设置是否必须传输value所对应的请求参数
默认值是true,表示必须传输value所对应的请求参数,否则页面报错400
若设置为false,则表示不是必须传输value所对应的请求参数,若未传输,则形参值为null
defaultValue:设置当没有传输value所对应的请求参数时,为形参设置默认值,此时和required属性值无关
<c>@RequestHeader:将请求头信息和控制器方法的形参绑定
@CookieValue:将cookie数据和控制器方法的形参绑定
<d>通过pojo获取请求参数
@RequestMapping("/testpojo")
public String testPOJO(User user){
System.out.println(user);
return "success";
10.解决获取请求参数的乱码问题
设置编码之前一定不能获取任何的请求参数,
注:处理编码的过滤器一定要配置到其他过滤器之前,否则无效
在web.xml中配置Spring的编码过滤器
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
11.域对象共享数据
①使用ServletAPI向request域对象共享数据
掌握如何在控制器方法中设置request对象
②使用ModelAndView(类)向request域对象共享数据
@Controller
public class TestScopeController {
@RequestMapping("test/mav")
public ModelAndView testMAV(){
/**
* ModelAndView 包含Model和view的功能
* Model:向请求域中共享数据
* View:设置逻辑视图实现页面跳转
*
* */
ModelAndView mav =new ModelAndView();
mav.addObject("testRequestScope","hello,ModelAndView");
mav.setViewName("success");
return mav;
}
}
③使用Model,ModelMap,Map向请求域中共享数据
其实在底层中,这些类型的形参最终通过Binding Aware Model Map()创建
@RequestMapping("/test/model")
public String testModel(Model model){
model.addAttribute("testRequestScope","hello,Model");
return "success";
}
@RequestMapping("/test/modelMap")
public String testModelMap(ModelMap modelMap){
modelMap.addAttribute("testRequestScope","hello,ModelMap");
return "success";
}
@RequestMapping("/test/map")
public String testMap(Map<String ,Object> map){
map.put("testRequestScope","hello,map");
return "success";
}
④向会话域和应用域共享数据
建议用servletAPI中的方法
Thymeleaf中获取
1.request域中的数据要用${域的名称}
2.session域中的数据要用${session.AttributeName}(与浏览器是否关闭有关)
3.application域中要用${application.AttributeName}(与服务器是否关闭有关)