目录
一、创建项目,pom文件
二、web.xml
三、spring-mvc.xml
四、index.jsp
五、实体类
Address类
User类
六、UserController类
七、请求参数解决中文乱码
八、配置tomcat,然后启动tomcat
1.
2.
3.
4.
九、接收Map类型
1.直接接收Map类型
(1)Get请求
第一种情况,什么注解也没有
第二种情况:传个值
第三种情况:声明是get请求
第四种情况:加@RequestParam
(2)post请求:
第一种情况:什么注解也没有
前端页面:加一个表单
第二种情况:声明是post请求
第三种情况:加上@RequestParam注解
表单和controller类中的方法改改(加个username)
第四种情况:加@RequestBody注解
2.用对象接收map
(1)User类里加一个map
(2)前端:
(3)运行:
十、在控制器中使用原生的ServletAPI对象
一、创建项目,pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qcby</groupId>
<artifactId>springMVC12</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
二、web.xml
<?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">
<!--前端控制器-->
<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>*.do</url-pattern>
</servlet-mapping>
</web-app>
三、spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置spring创建容器时要扫描的包 -->
<context:component-scan base-package="com.qcby.controller"></context:component-scan>
<!-- 配置视图解析器 -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 配置spring开启注解mvc的支持-->
<!-- <mvc:annotation-driven></mvc:annotation-driven>-->
</beans>
四、index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>请求参数绑定</title>
</head>
<body>
<form action="user/save1.do" method="post">
姓名:<input type="text" name="username" /><br/>
年龄:<input type="text" name="age" /><br/>
<input type="submit" value="提交" />
</form>
<h3>请求参数绑定(封装到实体类)</h3>
<form action="user/save2.do" method="post">
姓名:<input type="text" name="username" /><br/>
年龄:<input type="text" name="age" /><br/>
<input type="submit" value="提交" />
</form>
<h3>请求参数绑定(封装到实体类)</h3>
<form action="user/save3.do" method="post">
姓名:<input type="text" name="username" /><br/>
年龄:<input type="text" name="age" /><br/>
金额:<input type="text" name="address.money" /><br/>
<input type="submit" value="提交" />
</form>
<h3>请求参数绑定(封装到实体类,存在list集合)</h3>
<form action="user/save4.do" method="post">
姓名:<input type="text" name="username" /><br/>
年龄:<input type="text" name="age" /><br/>
金额:<input type="text" name="address.money" /><br/>
集合:<input type="text" name="list[0].money" /><br/>
集合:<input type="text" name="list[1].money" /><br/>
<input type="submit" value="提交" />
</form>
</body>
</html>
五、实体类
Address类
import java.io.Serializable;
public class Address implements Serializable {
private Double money;
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Address{" +
"money=" + money +
'}';
}
}
User类
import java.io.Serializable;
import java.util.List;
public class User implements Serializable {
private String username;
private Integer age;
// 引用对象
private Address address;
// list集合
private List<Address> list;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public List<Address> getList() {
return list;
}
public void setList(List<Address> list) {
this.list = list;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
", address=" + address +
", list=" + list +
'}';
}
}
六、UserController类
import com.qcby.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/save1.do")
public String save(String username,Integer age){
System.out.println("姓名:"+username);
System.out.println("年龄:"+age);
return "success";
}
@RequestMapping("/save2.do")
public String save2(User user){
System.out.println("user对象:"+user);
return "success";
}
@RequestMapping("/save3.do")
public String save3(User user){
System.out.println("user对象:"+user);
return "success";
}
@RequestMapping("/save4.do")
public String save4(User user){
System.out.println("user对象:"+user);
return "success";
}
}
七、请求参数解决中文乱码
<!-- 配置过滤器,解决中文乱码的问题 -->
<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>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
现在的web.xml:
<?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">
<!-- 配置过滤器,解决中文乱码的问题 -->
<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>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!--前端控制器-->
<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>*.do</url-pattern>
</servlet-mapping>
</web-app>
八、配置tomcat,然后启动tomcat
1.
2.
3.
4.
九、接收Map类型
1.直接接收Map类型
如果想直接接收前端传过来的map参数,应该使用两个注解(RequestBody或RequestParam;RequestParam--get和post请求都可以,RequestBody只能post请求,底层封装都是LinkedHashMap)
(1)Get请求
第一种情况,什么注解也没有
@RequestMapping("/mapSave1.do")
public String mapSave1(Map<String, Objects> map){
System.out.println("map:"+map);
return "success";
}
第二种情况:传个值
第三种情况:声明是get请求
@RequestMapping(value = "/mapSave1.do",method = RequestMethod.GET)
public String mapSave1(Map<String, Objects> map){
System.out.println("map:"+map);
return "success";
}
第四种情况:加@RequestParam
@RequestMapping(value = "/mapSave1.do")
public String mapSave1(@RequestParam Map<String, Objects> map){
System.out.println("map:"+map);
return "success";
}
所以,我传递一个map在后端接收,用get请求必须加@RequestParam注解
(2)post请求:
第一种情况:什么注解也没有
@RequestMapping(value = "/mapSave2.do")
public String mapSave1(Map<String, Objects> map){
System.out.println("map:"+map);
return "success";
}
前端页面:加一个表单
<h3>请求参数的绑定--map集合</h3>
<form action="user/mapSave2.do" method="post">
map集合key:<input type="text" name="map.key" /><br/>
map集合value:<input type="text" name="map.value" /><br/>
<input type="submit" value="提交" />
</form>
第二种情况:声明是post请求
@RequestMapping(value = "/mapSave2.do",method = RequestMethod.POST)
public String mapSave2(Map<String, Objects> map){
System.out.println("map:"+map);
return "success";
}
第三种情况:加上@RequestParam注解
@RequestMapping(value = "/mapSave2.do",method = RequestMethod.POST)
public String mapSave2(@RequestParam Map<String, Objects> map){
System.out.println("map:"+map);
return "success";
}
可以看出,get请求和post请求都可以用@RequestParam注解
表单和controller类中的方法改改(加个username)
<h3>请求参数的绑定--map集合</h3>
<form action="user/mapSave2.do" method="post">
username:<input type="text" name="username"><br/>
map集合:<input type="text" name="test1"><br/><%-- test1就是map的key,输入框中的就是map的value --%>
<input type="submit" value="提交" />
</form>
@RequestMapping(value = "/mapSave2.do")
public String mapSave2(@RequestParam Map<String, Objects> map,String username){
System.out.println("map:"+map);
System.out.println("username:"+username);
return "success";
}
第四种情况:加@RequestBody注解
但是这样的话,它只能接收json数据
@RequestMapping(value = "/mapSave2.do")
public String mapSave2(@RequestBody Map<String, Objects> map, String username){
System.out.println("map:"+map);
System.out.println("username:"+username);
return "success";
}
总结:无注解时,什么都接收不了;@RequestParam注解时,将参数包装成LinkedHashMap对象,参数的key是Map的key,参数的值是Map的value,get和
post请求都支持;@RequestBody注解接收json类型的数据(跟表单不一样,表单传不了),也会包装成LinkedHashMap对象,该注解不支持get请求,get请求没有请求体,不能传json
2.用对象接收map
(1)User类里加一个map
private Map<String,Address> userMap;
(2)前端:
<h3>请求参数绑定(封装到实体类,存在map集合)</h3>
<form action="user/save5.do" method="post">
姓名:<input type="text" name="username" /><br/>
年龄:<input type="text" name="age" /><br/>
金额:<input type="text" name="address.money" /><br/>
Map集合:<input type="text" name="userMap['one'].money" /><br/>
Map集合:<input type="text" name="userMap['two'].money" /><br/>
<input type="submit" value="提交" />
</form>
(3)运行:
十、在控制器中使用原生的ServletAPI对象
只需要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象
UserController里加:
/*原生的API*/
@RequestMapping("/save6.do")
public String save6(HttpServletRequest request, HttpServletResponse response){
System.out.println(request);
// 获取到HttpSession对象
HttpSession session = request.getSession();
System.out.println(session);
System.out.println(response);
return "success";
}
运行:
控制台: