目录
2.1 逐个接收请求参数:请求中的参数名和控制器方法的形参名一样
2.2 逐个接收请求参数:请求中的参数名和控制器方法的形参名不一样
2.3 对象接收请求参数:对象的属性名和控制器方法的形参名一样
2.4.2 请求中的参数名和控制器方法的形参名不一样结果截图
1. @RequestMapping定义请求规则
1.1 指定模块名称
通过@RequestMapping 注解可以定义处理器对于请求的映射规则。该注解可以注解在方法上,也可以注解在类上,但意义是不同的。value 属性值常以“/”开始。
@RequestMapping 的 value 属性用于定义所匹配请求的 URI。但对于注解在方法上与类上,其 value 属性所指定的 URI,意义是不同的。
一个@Controller 所注解的类中,可以定义多个处理器方法。当然,不同的处理器方法所匹配的 URI 是不同的。这些不同的 URI 被指定在注解于方法之上的@RequestMapping 的 value 属性中。但若这些请求具有相同的 URI 部分,则这些相同的 URI,可以被抽取到注解在类之上的@RequestMapping 的value 属性中。此时的这个 URI 表示模块的名称。URI 的请求是相对于 Web 的根目录。
换个角度说,要访问处理器的指定方法,必须要在方法指定 URI 之前加上处理器类前定义的模块名称
2. 对请求提交方式的定义
对于@RequestMapping,其有一个属性 method,用于对被注解方法所处理请求的提交方式进行限制,即只有满足该 method 属性指定的提交方式的请求,才会执行该被注解方法。
Method 属性的取值为 RequestMethod 枚举常量。常用的为RequestMethod.GET 与 RequestMethod.POST,分别表示提交方式的匹配规则为 GET 与 POST 提交。
也就是说,只要指定了处理器方法匹配的请求提交方式为 POST,则相当于指定了请求发送的方式:要么使用表单请求,要么使用 AJAX 请求。其它请求方式被禁用。
当然,若不指定 method 属性,则无论是 GET 还是 POST 提交方式,均可匹配。即对于请求的提交方式无要求。
代码展示
关于依赖文件,请看上篇
package com.liuhaiyang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/** @Controller: 创建控制器(处理器)对象
* 控制器:叫做后端控制器(back controller),自定义的类处理请求的。
* 位置:在类的上面,表示创建此类的对象,对象放在springmvc的容器中
*
* @RequestMapping :在类上面时 主要是表示公共的前缀
* 属性value: 表示所有的请求地址的公共前缀,相当于是模块名称。(value可以不写)
* 位置:类的上面
*/
@Controller
@RequestMapping("student")
public class MyController {
/**
* @RequestMapping :请求映射
* 属性:value 请求中的uri地址,唯一值,以"/"开头 (value可以不写)
* method 请求方式,使用RequestMethod类的枚举值 。 例如get方式,RequestMethod.GET
* 位置:1.在方法上面(必须) 2.在类定义的上面(可选)
* 作用:指定的请求,交给指定的方法处理,等同于url-pattern(个人理解 相当于可以做doget相关的操作)
* 返回值ModelAndView:表示本次请求的处理结果(数据和视图) model:表示数据 view:表示视图
*
*/
//可以在一个类中定义多个方法使用多个@RequestMapping注解
//使用get请求方式
@RequestMapping(value = "/some.do",method = RequestMethod.GET)
public ModelAndView doSome(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","在ModelAddView中处理了some.do的请求");
mv.addObject("fun","执行了dosome的方法");
mv.setViewName("show");
return mv;
}
@RequestMapping(value = "/second.do",method = RequestMethod.POST)
public ModelAndView doOther(){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","在ModelAddView中处理了other.do的请求");
mv.addObject("fun","执行了doOther的方法");
mv.setViewName("show");
return mv;
}
}
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--spring的配置文件 声明组件扫描器-->
<context:component-scan base-package="com.liuhaiyang.controller"/>
<!-- 声明视图解析器;帮助处理视图 主要帮助我们处理重复的多余的冗余路径等-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀:指定试图文件的路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后缀,试图文件的扩展名-->
<property name="suffix" value=".jsp"/> <!--表示所有的jsp文件-->
</bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--声明springmvc的核心对象-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 如果是自定义的文件,需要在这写自定义配置文件的位置 和监听器的是一样的-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 在服务器启动时候创建对象,和容器的顺序 在启动时装载对象 随意给个值要求大于等于0 数值越小,创建的越早-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- url-pattern 作用:把一些请求交给servlet处理 就例如将/mymvc交给springmvc处理
使用中央调度器(DispatcherServlet) 1.使用扩展名方式,格式/*.xxx 例如:xxx.xml表示以xml结尾的都算
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个springmvc</title>
</head>
<body>
<a href="student/some.do">发起一个som.do的请求</a> <br>
<form action="student/second.do" method="post">
<input type="submit" value="post请求方式">
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
/show.jsp,显示request作用域中的数据<br>
<h2>msg数据:<%=request.getAttribute("msg")%></h2>
<h2>fun数据:${fun}</h2>
</body>
</html>
2.控制器接收请求参数的三种方式
处理器方法可以包含以下四类参数,这些参数会在系统调用时由系统自动赋值,即程序员可在方法内直接使用。
1) HttpServletRequest
2)HttpServletResponse
3)HttpSession
4)请求中所携带的请求参数
2.1 逐个接收请求参数:请求中的参数名和控制器方法的形参名一样
逐个接收请求参数 要求:请求中的参数名和控制器方法的形参名一样,按照名称对象接收请求参数 参数接收: 1.框架使用request对象,接收参数 string name=req.getParameter("name"); string age=req.getParameter("age"); 2.在中央调度器的内部调用doProperparam方法时,按名称对象传递参数doProperparam (name,Integer.valueof(age))框架可以实现请求参数string到int,long,float,double等类型的转换
2.2 逐个接收请求参数:请求中的参数名和控制器方法的形参名不一样
逐个接收请求参数,请求参数名和形参名不一致问题 @RequestParam: 解决参数名称不一样问题 属性: value请求中的参数名称 required是Boolean类型,默认为true :请求中必须有单参数,没有报错。false与之相反 位置: 在形参定义的前面
2.3 对象接收请求参数:对象的属性名和控制器方法的形参名一样
使用对象接受请求中的参数 要求:参数名和Java对象属性名一样。Java类需要有一个无参构造方法,属性有set方法 框架处理: 1.调用Student的无参构造方法,创建对象 2.调用对象set方法,同名的参数,调用对应的set方法。参数是name,调用setname(参数值)
2.4 实现代码
pom的依赖前面有
package com.liuhaiyang.controller;
import com.liuhaiyang.damain.Student;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**逐个接收请求参数 要求:请求中的参数名和控制器方法的形参名一样,按照名称对象接收请求参数
参数接收:
1.框架使用request对象,接收参数
string name=req.getParameter("name");
string age=req.getParameter("age");
2.在中央调度器的内部调用doProperparam方法时,按名称对象传递参数 doProperparam(name,Integer.valueof(age))
框架可以实现请求参数string到int,long,float,double等类型的转换
*/
@Controller
public class MyController {
@RequestMapping(value = "/receive-property.do")
public ModelAndView doproperty(String name,Integer age){
ModelAndView mv=new ModelAndView();
mv.addObject("msg","在ModelAddView中处理了请求 name="+name+" age="+age);
mv.addObject("fun","执行了dosome的方法");
mv.addObject("myname",name);
mv.addObject("myage",age);
mv.setViewName("show");
return mv;
}
/**
*逐个接收请求参数,请求参数名和形参名不一致问题
* @RequestParam: 解决参数名称不一样问题
* 属性: value请求中的参数名称 required是Boolean类型,默认为true :请求中必须有单参数,没有报错。false与之相反
* 位置: 在形参定义的前面
*/
@RequestMapping(value = "/receivesproperty.do")
public ModelAndView dopropertys(@RequestParam(value = "sname",required = false) String name,
@RequestParam(value = "sage",required = false) Integer age) {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "在ModelAddView中处理了请求 name=" + name + " age=" + age);
mv.addObject("fun", "执行了dosome的方法");
mv.addObject("myname", name);
mv.addObject("myage", age);
mv.setViewName("show");
return mv;
}
/**
* 使用对象接受请求中的参数
* 要求:参数名和Java对象属性名一样。Java类需要有一个无参构造方法,属性有set方法
* 框架处理: 1.调用Student的无参构造方法,创建对象
* 2.调用对象set方法,同名的参数,调用对应的set方法。参数是name,调用setname(参数值)
*/
@RequestMapping("/receivesproperts.do")
public ModelAndView doproperts(Student student){
ModelAndView mv=new ModelAndView();
System.out.println("在ModelAddView中处理了请求 student="+student);
mv.addObject("fun","执行了dosome的方法");
mv.addObject("myname",student.getName());
mv.addObject("myage",student.getAge());
mv.setViewName("show");
return mv;
}
}
package com.liuhaiyang.damain;
public class Student {
private String name;
private Integer age;
//set()和get()方法,toString()
}
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--spring的配置文件 声明组件扫描器-->
<context:component-scan base-package="com.liuhaiyang.controller"/>
<!-- 声明视图解析器;帮助处理视图 主要帮助我们处理重复的多余的冗余路径等-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀:指定试图文件的路径-->
<property name="prefix" value="/WEB-INF/view/"/>
<!-- 后缀,试图文件的扩展名-->
<property name="suffix" value=".jsp"/> <!--表示所有的jsp文件-->
</bean>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--声明springmvc的核心对象-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 如果是自定义的文件,需要在这写自定义配置文件的位置 和监听器的是一样的-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 在服务器启动时候创建对象,和容器的顺序 在启动时装载对象 随意给个值要求大于等于0 数值越小,创建的越早-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- url-pattern 作用:把一些请求交给servlet处理 就例如将/mymvc交给springmvc处理
使用中央调度器(DispatcherServlet) 1.使用扩展名方式,格式/*.xxx 例如:xxx.xml表示以xml结尾的都算
-->
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 声明过滤器,框架提供的,解决post请求中的乱码问题-->
<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>
<!-- 强制请求(request)对象使用encoding的编码方式-->
<param-name>forceRequestEncoding</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<!-- 强制应答(response)对象使用encoding的编码方式-->
<param-name>forceResponseEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!-- 强制所有的请求,先经过过滤器处理-->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个springmvc</title>
</head>
<body>
<p>逐个接收请求参数: 请求中参数名和形参名一样</p>
<form action="receive-property.do" method="post">
姓名:<input type="text" name="name"> <br>
年龄:<input type="text" name="age"> <br>
<input type="submit" value="提交表单">
</form> <br><br>
<p>逐个接收请求参数: 请求中参数名和形参名不一样</p>
<form action="receivesproperty.do" method="post">
姓名:<input type="text" name="sname"> <br>
年龄:<input type="text" name="sage"> <br>
<input type="submit" value="提交表单">
</form><br> <br>
<p>对象接收请求参数: 请求中参数名和对象的属性名一样</p>
<form action="receivesproperts.do" method="post">
姓名:<input type="text" name="name"> <br>
年龄:<input type="text" name="age"> <br>
<input type="submit" value="对象接收参数">
</form>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
/show.jsp,显示request作用域中的数据<br>
<h2>name:<%=request.getAttribute("myname")%></h2>
<h2>age:${myage}</h2>
</body>
</html>
2.4.1 请求中的参数名和控制器方法的形参名一样结果截图
2.4.2 请求中的参数名和控制器方法的形参名不一样结果截图
2.4.3 对象的属性名和控制器方法的形参名一样结果截图