Springmvc中,接收页面提交的数据是通过方法形参来接收:
-
处理器适配器调用springmvc使用反射将前端提交的参数传递给controller方法的形参
-
springmvc接收的参数都是String类型,所以spirngmvc提供了很多converter(转换器)在特殊情况下需要自定义converter,如对日期数据
1.基本数据类型
编写controller
@RequestMapping("/controller3")public String controller3(String name,Model model){model.addAttribute("msg",name);return "success";}
在index.jsp里面定义超链接
<a href="/Account/controller3?name=Tom">接收参数—基本数据类型</a><br>
结果:
2.POJO类型参数绑定
编写pojo
package com.by.pojo;import java.io.Serializable;
import java.util.Date;public class Account implements Serializable {private Integer id;private String name;private Float money;private Address address;private Date date;@Overridepublic String toString() {return "Account{" +"id=" + id +", name='" + name + '\'' +", money=" + money +", address=" + address +", date=" + date +'}';}public Date getDate() {return date;}public void setDate(Date date) {this.date = date;}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Float getMoney() {return money;}public void setMoney(Float money) {this.money = money;}public Address getAddress() {return address;}public void setAddress(Address address) {this.address = address;}
}
package com.by.pojo;import java.io.Serializable;public class Address implements Serializable {private String provinceName;private String cityName;//省略get set toString方法@Overridepublic String toString() {return "Address{" +"provinceName='" + provinceName + '\'' +", cityName='" + cityName + '\'' +'}';}public String getProvinceName() {return provinceName;}public void setProvinceName(String provinceName) {this.provinceName = provinceName;}public String getCityName() {return cityName;}public void setCityName(String cityName) {this.cityName = cityName;}
}
编写controller
@RequestMapping("/controller9")public String controller9(Account account, Model model){model.addAttribute("msg",account);return "success";}
在index.jsp里面添加表单
<form action="/Account/controller9" method="post">账户名称:<input type="text" name="name"><br>账户金额:<input type="text" name="money"><br>账户省份:<input type="text" name="address.provinceName"><br>账户城市:<input type="text" name="address.cityName"><br><input type="submit" value=" 保 存 "></form>
结果:
3.restful风格
-
restful概述:
(Representational State Transfer,表现层状态转移):URL定位资源时,用HTTP动词(GET,POST,DELETE,PUT)描述操作
3.1restful风格URL
-
在Restful之前的操作:
-
http://127.0.0.1/user/query?id=1 根据用户id查询用户数据
-
http://127.0.0.1/user/save 新增用户
-
http://127.0.0.1/user/update?id=1
-
修改用户信息 http://127.0.0.1/user/delete?id=1 删除用户信息
-
RESTful用法: http://127.0.0.1/user/1 GET 根据用户id查询用户数据 http://127.0.0.1/user POST 新增用户 http://127.0.0.1/user PUT 修改用户信息 http://127.0.0.1/user/1 DELETE 删除用户信息
-
RESTful总结:
Restful风格就是请求url统一,根据不同的请求方式,请求不同的后台方法。如果需要携带参数,在url上使用/{}占位符。
3.2@PathVaribale
-
作用
用于绑定url中的占位符。例如:/account/{id},这个{id}就是url占位符
url支持占位符是spring3.0之后加入的,是springmvc支持rest风格url的重要标志。
-
描述需要使用指定的请求方式来请求该方法
@RequestMapping("/controller10/{id}")public String controller10(@PathVariable("id") Integer id,Model model){model.addAttribute("msg",id);return "success";}
测试:在index.jsp里面定义超链接
<a href="/Account/controller10/111">restful</a><br>
结果:
4.请求参数乱码问题
4.1POST请求方式解决乱码问题
在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>
测试
4.2GET请求方式解决乱码问题
tomcat对GET和POST请求处理方式是不同的,GET请求的编码问题,要改tomcat的 配置信息,如下:
<plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><path>/</path><!--按UTF-8进行编码--><uriEncoding>UTF-8</uriEncoding></configuration>
</plugin>
5.自定义类型转换器
5.1使用场景
在index.jsp里面添加日期类型
<form action="/Account/controller11" method="post">账户名称:<input type="text" name="name"><br/>账户金额:<input type="text" name="money"><br/>账户省份:<input type="text" name="address.provinceName"><br/>账户城市:<input type="text" name="address.cityName"><br/>开户日期:<input type="text" name="date"><br/><input type="submit" value=" 保 存 "></form>
在pojo里面添加日期类型
public class Account implements Serializable {private Integer id;private String name;private Float money;private Address address;//添加日期类型private Date date;//省略get set toString方法
}
测试
-
原因
我们前台传递的是字符串类型的参数,但是后台使用的是Date类型接收的。我们期望springmvc可以帮我们做数据类型的自动转换,显然没有做,所以我们需要自己自定义类型转换器。
5.2自定义类型转换器
Converter接口说明:
定义一个类,实现Converter接口
package com.by.converter;import org.springframework.core.convert.converter.Converter;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class DateConverter implements Converter<String, Date> {@Overridepublic Date convert(String str) {try {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = sdf.parse(str);return date;} catch (ParseException e) {e.printStackTrace();}return null;}
}
在 springmvc.xml配置文件中配置类型转换器
<!-- 开启SpringMVC的注解支持-->
<!-- 注册类型转换器工厂-->
<mvc:annotation-driven conversion-service="cs"></mvc:annotation-driven><!-- 配置类型转换器工厂--><bean id="cs" class="org.springframework.context.support.ConversionServiceFactoryBean"><!-- 给工厂注入一个新的类型转换器 --><property name="converters" ><set><!-- 配置自定义类型转换器 --><bean class="com.by.converter.DateConverter"></bean></set></property></bean>
结果:
6.使用ServletAPI接收参数
编写controller
@RequestMapping("/controller12")public String controller12(HttpServletRequest request){String name = request.getParameter("name");Float money = Float.valueOf(request.getParameter("money"));request.setAttribute("msg",name+"===="+money);return "success";}
在index.jsp里面定义超链接
<a href="/Account/controller12?name=Tom&money=999">servlet接收参数</a><br>
结果:
7.参数传递
7.1ModelAndView传递
编写controller
@RequestMapping("/controller13")//也可以不创建ModelAndView,直接在参数中指定public ModelAndView controller13(ModelAndView mv){mv.addObject("msg","李寒衣");mv.setViewName("success");return mv;}
在index.jsp里面定义超链接
<a href="/Account/controller13">ModelAndView参数传递</a><br>
结果:
7.2Model传递
编写controller
@RequestMapping("/controller14")public String controller10(Model model){model.addAttribute("msg","天女蕊");return "success";}
在index.jsp里面定义超链接
<a href="/Account/controller14">Model参数传递</a><br>
结果:
7.3ServletAPI传递
编写controller
@RequestMapping("/controller15")public String controller15(HttpServletRequest request){request.setAttribute("msg","唐莲");return "success";}
在index.jsp里面定义超链接
<a href="/Account/controller15">Servlet API 参数传递</a><br>
结果
8.总结:
接收参数
1、基本类型(少量)
<a href="/account/findAccount7?name=tom">
public String findAccount7(String name, Model model){
}
2、pojo(多个)
<a href="/account/findAccount8?name=tom&id=18">
public String findAccount8(Account account, Model model){
}
3、restful
<a href="/account/findAccount10/123">
@RequestMapping("/findAccount10/{id}")
public String findAccount10(@PathVariable Integer id){
}
4、日期类型转换器
public class DateConverter implements Converter<String, Date> {
}
<!--注册转换器工厂-->
<mvc:annotation-driven conversion-service="cs"></mvc:annotation-driven>
<!--配置类型转换器工厂-->
<bean id="cs" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.by.converter.DateConverter"></bean>
</set>
</property>
</bean>
3、中文乱码
1)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>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2)get方式
new String(name.getBytes(),"UTF-8");