在以前的学习中咱们都知道,获取view层传递过来的参数,咱们通常的都是key,value键-值对的形式,在servlet控制器中使用getParameter,来接收view层传递过来的参数!!!做为表现层控制器的springMVC,给咱们提供了更加的方式去获取view层传递过来的参数!!!html
参数类型分为:前端
1. 基本数据类型和字符串类型
2. 实体类型(JavaBean)
3. 集合数据类型(List、map集合等)java
准备配置环境web
web.xml文件、springmvc文件spring
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!-- SpringMVC的核心控制器:前端控制器--> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 而后配置Servlet的初始化参数,读取springmvc的配置文件,建立spring容器 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <!-- 首先是:servlet启动时加载对象 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> <!--配置过滤器解决中文乱码:提供初始化参数--> <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> </web-app>
<?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.cc"></context:component-scan> <!-- 配置视图解析器:返回请求成功后的页面 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--文件所在的目录--> <property name="prefix" value="pages/"></property> <!--文件的后缀名--> <property name="suffix" value=".jsp"></property> </bean> <!--配置日期类型转换器--> <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean"> <!--给工厂注入一个新的类型转换器--> <property name="converters"> <!--把咱们本身写的日期类型转化器配置进去--> <bean class="com.cc.util.StringToDataCoverter"></bean> </property> </bean> <!--配置spring开启注解mvc的支持--> <!--开启启动日期类型专户器服务--> <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/> </beans>
实体类:Accountspring-mvc
package com.cc.entity; import java.io.Serializable; import java.util.List; import java.util.Map; /** * 用户实体类 */ public class Account implements Serializable { private String username; private String password; private Double money; //存在引用类型的时候 private User user; //存在list和map集合的时候 List<User> list; Map<String,User> map; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } /*public User getUser() { return user; } public void setUser(User user) { this.user = user; } public void setUser(List<User> user) { this.user = user; }*/ public Map<String, User> getMap() { return map; } public void setMap(Map<String, User> map) { this.map = map; } @Override public String toString() { return "Account{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", money=" + money + ", list=" + list + ", map=" + map + '}'; } }
实体类:Usertomcat
package com.cc.entity; import javax.xml.crypto.Data; import java.io.Serializable; public class User implements Serializable { private String uname; private String password; private Data data; public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Data getData() { return data; } public void setData(Data data) { this.data = data; } @Override public String toString() { return "User{" + "uname='" + uname + '\'' + ", password='" + password + '\'' + ", data=" + data + '}'; } }
在jsp页面,只是用键值对的方式session
<h1>你好tomcat</h1> <a href="/hello?username=Tom">入门程序</a>
2、在控制层代码(控制器)mvc
要求:提交表单的name和参数的名称是相同的app
package com.cc.controller; import com.cc.entity.Account; import com.cc.entity.User; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { //处理映射器,用于创建请求 URL 和处理请求方法之间的映射关系 @RequestMapping(path = "/hello") public String sayHello(String username){ System.out.println("hello springMVC"+"user:"+username); return "success"; } }
这里还存在一个问题,就是在Account实体类中若是存在引用类型User类那怎么办??采用对象.属性的表达式获取属性
<form action="/account" method="post"> 用户名:<input type="text" name="name"><br> 帐户:<input type="text" name="password"><br> 金额:<input type="text" name="money"><br> 用户名:<input type="text" name="user.uname"><br> 密码:<input type="text" name="user.password"><br> <input type="submit" value="提交"> </form>
list数据类型采用list[0].属性的方式、map集合采用键值对的方式
实体类:Account
package com.cc.entity; import java.io.Serializable; import java.util.List; import java.util.Map; /** * 用户实体类 */ public class Account implements Serializable { private String username; private String password; private Double money; //存在引用类型的时候 private User user; //存在list和map集合的时候 List<User> list; Map<String,User> map; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } /*public User getUser() { return user; } public void setUser(User user) { this.user = user; } public void setUser(List<User> user) { this.user = user; }*/ public Map<String, User> getMap() { return map; } public void setMap(Map<String, User> map) { this.map = map; } @Override public String toString() { return "Account{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", money=" + money + ", list=" + list + ", map=" + map + '}'; } }
<!--绑定封装list集合和map集合到--> <form action="/account" method="post"> 用户名:<input type="text" name="name"><br> 帐户:<input type="text" name="password"><br> 金额:<input type="text" name="money"><br> 用户名:<input type="text" name="list[0].uname"><br> 密码:<input type="text" name="list[0].password"><br> <!--带有map数据封装,key,value--> 用户名:<input type="text" name="map['one'].uname"><br> 密码:<input type="text" name="map['one'].password"><br> <input type="submit" value="提交"> </form>
在web.xml文件中配置过滤器
<!-- 配置过滤器,解决中文乱码的问题 --> <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>
表单提交的任何数据类型所有都是字符串类型,可是后台定义Integer类型,数据也能够封装上,说明Spring框架内部会默认进行数据类型转换。可是咱们本身想要自定义数据类型转化怎么办?能够实现Converter的接口
1、咱们能够先建立一个数据类型转化器,把请求过来的数据类型转化为咱们想要的
package com.cc.util; import org.springframework.core.convert.converter.Converter; import org.springframework.util.StringUtils; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; /** * 把字符串转换为日期 * StringUtils这个类须要好好研究一下 */ public class StringToDataCoverter implements Converter<String, Date> { @Override public Date convert(String source) { try { //传进来参数为空状况 if (StringUtils.isEmpty(source)) { throw new RuntimeException("请输入要转换的日期"); } //自定义日期转换格式 DateFormat dt = new SimpleDateFormat("yyyy-MM-dd"); return dt.parse(source); } catch (Exception e) { throw new RuntimeException(e); } } }
2、注册自定义类型转换器,在springmvc.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.cc"></context:component-scan> <!-- 配置视图解析器:返回请求成功后的页面 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--文件所在的目录--> <property name="prefix" value="pages/"></property> <!--文件的后缀名--> <property name="suffix" value=".jsp"></property> </bean> <!--配置日期类型转换器--> <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean"> <!--给工厂注入一个新的类型转换器--> <property name="converters"> <!--把咱们本身写的日期类型转化器配置进去--> <bean class="com.cc.util.StringToDataCoverter"></bean> </property> </bean> <!--配置spring开启注解mvc的支持--> <!--开启启动日期类型专户器服务--> <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/> </beans><?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.cc"></context:component-scan> <!-- 配置视图解析器:返回请求成功后的页面 --> <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--文件所在的目录--> <property name="prefix" value="pages/"></property> <!--文件的后缀名--> <property name="suffix" value=".jsp"></property> </bean> <!--配置日期类型转换器--> <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean"> <!--给工厂注入一个新的类型转换器--> <property name="converters"> <!--把咱们本身写的日期类型转化器配置进去--> <bean class="com.cc.util.StringToDataCoverter"></bean> </property> </bean> <!--配置spring开启注解mvc的支持--> <!--开启启动日期类型专户器服务--> <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/> </beans>
在控制器中使用原生的ServletAPI对象,只须要在控制器的方法参数定义HttpServletRequest和HttpServletResponse对象
1、 使用model来保存数据到前台
controller页面代码 @RequestMapping("/demo") public String Model(Model model){ UserBean bean = new UserBean(); bean.setName("admin"); bean.setPwd("admin"); model.addAttribute("admin", bean); return "Model"; }
Model.jsp页面
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> ${admin } </body> </html>
第2、使用modelView的方式
controller层代码
@RequestMapping("/demo1") public ModelAndView ModelView(){ ModelAndView view = new ModelAndView(); UserBean bean = new UserBean(); bean.setName("孙悟空"); bean.setPwd("猪八戒"); view.addObject("admin", bean); view.setViewName("Model"); return view; }
第3、使用session来保存数据
@RequestMapping("/demo3") public String session(HttpSession session){ UserBean bean = new UserBean(); bean.setName("曹操"); bean.setPwd("周瑜"); session.setAttribute("admin", bean); return "Model"; }
第4、使用map来传递数据
@RequestMapping("/demo2") public String Hashmap(Map<String, Object> Map){ UserBean bean = new UserBean(); bean.setName("刘备"); bean.setPwd("张飞"); Map.put("admin", bean); return "Model"; }
//携带数据并实现跳转的两种方式 //第一种 @RequestMapping("index") public String test(Model model){ //携带数据 model.addAttribute("username","张三") return "index"; } //第二种 @RequestMapping("index") public ModelAndView testone(){ //携带数据 ModelAndView modelAndView=new ModelAndView(); modelAndView.addObject("username","张三"); modelAndView.setViewName("index"); return modelAndView; }