@RequestMapping:该注解在类的上面使用时
value:所有请求地址的公共部分,叫做模块名称
@RequestMapping:该类的处理器方法上面使用时
value:请求映射
例如:
@Controller
@RequestMapping(value = "/test")
public class MyController {
@RequestMapping(value = "/addUser.do")
public ModelAndView addUser(){
ModelAndView mv = new ModelAndView();
mv.addObject("zs","张三");
mv.addObject("lisi","李四");
//当配置了视图解析器
mv.setViewName("show");
//返回视图
return mv;
}
@RequestMapping(value = "/remove.do")
public ModelAndView removeUser(){
ModelAndView mv = new ModelAndView();
mv.addObject("zs","删除张三");
mv.addObject("lisi","删除李四");
mv.setViewName("show");
return mv;
}
}
- 也就是说,只要指定了处理器方法匹配的请求提交方式为 POST,则相当于指定了请求发送的方式:要么使用表单请求,要么使用 AJAX 请求。其它请求方式被禁用。
- 当然,若不指定 method 属性,则无论是 GET 还是 POST 提交方式,均可匹配。即对于请求的提交方式无要求。
例如:
修改处理器类如下:
@Controller
@RequestMapping(value = "/test")
public class MyController {
//指定addUser.html使用get请求方式
@RequestMapping(value = "/addUser.do",method = RequestMethod.GET)
public ModelAndView addUser(){
ModelAndView mv = new ModelAndView();
mv.addObject("zs","张三");
mv.addObject("lisi","李四");
//当配置了视图解析器
mv.setViewName("show");
//返回视图
return mv;
}
//指定remove.html使用post请求方式
@RequestMapping(value = "/remove.do",method = RequestMethod.POST)
public ModelAndView removeUser(){
ModelAndView mv = new ModelAndView();
mv.addObject("zs","删除张三");
mv.addObject("lisi","删除李四");
mv.setViewName("show");
return mv;
}
//指定update.html没有限制请求方式
@RequestMapping(value = "/update.do")
public ModelAndView updateUser(){
ModelAndView mv = new ModelAndView();
mv.addObject("zs","更新张三");
mv.addObject("lisi","更新李四");
mv.setViewName("show");
return mv;
}
}
修改index页面如下:
<body>
<a href="test/addUser.do">添加用户(使用get请求方式)a><br>
<form action="test/remove.do" method="post">
<input type="submit" value="删除用户(使用post请求方式)">
form>
<a href="test/update.do">更新用户get(没有限制请求方式)a><br>
<form action="test/update.do" method="post">
<input type="submit" value="更新用户post(使用post请求方式)">
form>
body>
例如:
<p>提交参数给Controllerp>
<form action="test/submit.do" method="post">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交参数">
form>
@RequestMapping(value = "/submit.do",method = RequestMethod.POST)
public ModelAndView addUser(String name,Integer age){
System.out.println("name="+name+"age="+age);//name=zs age=null
//可以在方法中直接使用name,age
ModelAndView mv = new ModelAndView();
mv.addObject("myname",name);
mv.addObject("myage",age);
//当配置了视图解析器
mv.setViewName("show");
//返回视图
return mv;
}
注意:
在提交请求参数时,使用POST方式提交请求中文有乱码,需要使用过滤器处理乱码问题
<filter>
<filter-name>characterEncodingFilterfilter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
<init-param>
<param-name>encodingparam-name>
<param-value>utf-8param-value>
init-param>
<init-param>
<param-name>forceRequestEncodingparam-name>
<param-value>trueparam-value>
init-param>
<init-param>
<param-name>forceResponseEncodingparam-name>
<param-value>trueparam-value>
init-param>
filter>
<filter-mapping>
<filter-name>characterEncodingFilterfilter-name>
<url-pattern>/*url-pattern>
filter-mapping>
@RequestParam:解决请求中参数名不一样的问题
属性:
1、value 请求中的参数名称
2、required是一个boolean,默认是true,表示请求中必须包含此参数,false 表示可以没有此参数
例如:
<p>提交参数名和控制器中的形参名不一样p>
<form action="test/requestParam.do" method="post">
姓名:<input type="text" name="rname"><br>
年龄:<input type="text" name="rage"><br>
<input type="submit" value="提交参数">
form>
@RequestMapping(value = "/requestParam.do")
public ModelAndView requestParam(@RequestParam(value = "rname",required = false)String name,
@RequestParam(value = "rage",required = false) Integer age){
System.out.println("name="+name+"age="+age);//name=zs age=null
//可以在方法中直接使用name,age
ModelAndView mv = new ModelAndView();
mv.addObject("myname",name);
mv.addObject("myage",age);
//当配置了视图解析器
mv.setViewName("show");
//返回视图
return mv;
}
例如:
public class Student {
/**
* 属性名和请求中参数名一致
*/
private String name;
private Integer age;
//这里省略set、get方法
}
<p>使用Java对象接收请求参数p>
<form action="test/receiveObject.do" method="post">
姓名:<input type="text" name="name"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" value="提交参数">
form>
/**
* 处理器方法形参是Java对象,这个对象的属性名和请求中参数名不一样
* 请求中参数是name,框架会调用setName()方法给属性赋值
*
*/
@RequestMapping(value = "/receiveObject.do")
public ModelAndView receiveObject(Student student){
System.out.println("name="+student.getName()+",age="+student.getAge());
//可以在方法中直接使用name,age
ModelAndView mv = new ModelAndView();
mv.addObject("myname",student.getName());
mv.addObject("myage",student.getAge());
mv.addObject("mystudent",student);
//当配置了视图解析器
mv.setViewName("show");
//返回视图
return mv;
}
/**
* 处理返回结果String:表示逻辑视图名称,需要配置视图解析器
* @param name
* @param age
* @return
*/
@RequestMapping(value = "/returnString-view.html")
public String doReturnView(HttpServletRequest request,String name, Integer age){
System.out.println("name="+name+",age="+age);
request.setAttribute("myname",name);
request.setAttribute("myage",age);
//show:逻辑视图名称,项目中配置了视图解析器
return "show";
}
/**
* 不配置视图解析器的情况
*/
@RequestMapping(value = "/returnString-view2.html")
public String doReturnView2(HttpServletRequest request,String name, Integer age){
System.out.println("name="+name+",age="+age);
request.setAttribute("myname",name);
request.setAttribute("myage",age);
//完整视图路径,项目中不能配置视图解析器,否则会出现404错误
return "/WEB-INF/jsp/show.jsp";
}
在没有特殊要求的情况下,SpringMVC 的中央调度器 DispatcherServlet 的< url-pattern/ >
常使用后辍匹配方式,如写为*.do 或者 *. action, *. mvc 等。
可以写为 /,因为 DispatcherServlet 会将向静态资源的获取请求,例如 . css、. js、. jpg、. png 等资源的获取请求,当作是一个普通的 Controller 请求。中央调度器会调用处理器映射器为其查找相应的处理器。当然也是找不到的,所以在这种情况下,所有的静态资源获取请求也均会报 404 错误
http://localhost:8080/ch05_url_pattern/index.jsp :tomcat(jsp会转为servlet)
http://localhost:8080/ch05_url_pattern/js/jquery-3.4.1.js : tomcat
http://localhost:8080/ch05_url_pattern/images/p1.jpg : tomcat
http://localhost:8080/ch05_url_pattern/html/test.html: tomcat
http://localhost:8080/ch05_url_pattern/some.do : DispatcherServlet(springmvc框架处理的)
tomcat本身能处理静态资源的访问, 像html, 图片, js文件都是静态资源< url-pattern/ >的值并不是说写为 / 后,静态资源就无法访问了。经过一些配置后,该问题也是可以解决的。
<servlet>
<servlet-name>defaultservlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServletservlet-class>
<init-param>
<param-name>debugparam-name>
<param-value>0param-value>
init-param>
<init-param>
<param-name>listingsparam-name>
<param-value>falseparam-value>
init-param>
<load-on-startup>1load-on-startup>
servlet>
<servlet-mapping>
<servlet-name>defaultservlet-name>
<url-pattern>/url-pattern> 表示静态资源和未映射的请求都这个default处理
servlet-mapping>
1、处理静态资源
2、处理未映射到其它servlet的请求
只需在springmvc配置文件中添加< mvc:default-servlet-handler/ >标签即可
<mvc:annotation-driven />
<mvc:default-servlet-handler />
注意:
default-servlet-handler 和 @RequestMapping注解有冲突, 需要在springmvc中加入注解驱动 annotation-driven 解决问题
mvc:resources 加入后框架会创建 ResourceHttpRequestHandler这个处理器对象。让这个对象处理静态资源的访问,不依赖tomcat服务器。
mapping:访问静态资源的uri地址, 使用通配符 **
location:静态资源在你的项目中的目录位置
images / ** :表示
images/p1.jpg , images/user/logo.gif , images/order/history/list.png
配置形式:
<mvc:resources mapping="/images/**" location="/images/" />
<mvc:resources mapping="/html/**" location="/html/" />
<mvc:resources mapping="/js/**" location="/js/" />
<mvc:annotation-driven />
<mvc:resources mapping="/static/**" location="/static/" />