文章目录
1、SpringMVC 优势
SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust、WebWork、Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了 SpringMVC 作为 Java EE 项目表述层开发的首选方案。之所以能做到这一点,是因为 SpringMVC 具备如下显著优势:
Spring 家族原生产品,与 IOC 容器等基础设施无缝对接
表述层各细分领域需要解决的问题全方位覆盖,提供全面解决方案
代码清新简洁,大幅度提升开发效率
内部组件化程度高,可插拔式组件即插即用,想要什么功能配置相应组件即可
性能卓著,尤其适合现代大型、超大型互联网项目要求
2、表述层框架要解决的基本问题
请求映射
数据输入
视图界面
请求分发
表单回显
会话控制
过滤拦截
异步交互
文件上传
文件下载
数据校验
类型转换
3、SpringMVC 代码对比
①基于原生 Servlet API 开发代码片段
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName = request.getParameter("userName");
System.out.println("userName="+userName);
}
②基于 SpringMVC 开发代码片段
@RequestMapping("/user/login")
public String login(@RequestParam("userName") String userName){
System.out.println("userName="+userName);
return "result";
}
4、
1、修改pom文件的打包方式为war
<packaging>war</packaging>
2、创建web.xml文件
5、获取传递参数
1.使用SpringMVC技术需要先导入SpringMVC的依赖坐标和servlet的坐标
<dependencies>
<!-- SpringMVC-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<!--ServletAPI-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
</dependency>
</dependencies>
2.控制器
//声明beanSpringMVC使用@Controller定义bean
@Controller
public class UserController {
//设置访问路径
@RequestMapping("/save")
//设置当前操作的返回值类型
@ResponseBody
public String save(){
System.out.println("user save");
return "{'module':'springmvc'}";
}
}
3.加载控制器Controller对应的Bean
//创建SpringMVC的配置文件,加载Controller对应的Bean
@Configuration
@ComponentScan("com.itheima.controller")
public class SpringConfig {
}
4.定义一个Servlet容器的启动配置类
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
//加载springMVC容器配置
protected WebApplicationContext createServletApplicationContext() {
AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
ctx.register(SpringConfig.class);
return ctx;
}
//设置那些请求归属springMVC
protected String[] getServletMappings() {
return new String[]{"/"};
}
//加载Spring容器配置
protected WebApplicationContext createRootApplicationContext() {
return null;
}
}
简化开发:
public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMVCConfig.class};
}
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
// //加载springMVC容器配置
// protected WebApplicationContext createServletApplicationContext() {
// AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
// ctx.register(SpringMVCConfig.class);
// return ctx;
// }
//
// //设置那些请求归属springMVC
// protected String[] getServletMappings() {
// return new String[]{"/"};
// }
//
加载Spring容器配置
// protected WebApplicationContext createRootApplicationContext() {
// AnnotationConfigWebApplicationContext ctx=new AnnotationConfigWebApplicationContext();
// ctx.register(SpringConfig.class);
// return ctx;
// }
}
get请求与post请求发送普通参数
1.一个参数(get)
只需要修改形参的值即可
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name){
System.out.println("普通参数传递"+name);
return "{'module': 'commonParam'}";
}
使用postman发送请求
控制台输出:
2.两个参数(get)
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(String name,int age){
System.out.println("普通参数传递"+name+age);
return "{'module': 'commonParam'}";
}
3.post
4.乱码的处理
当我们发送的数据中有中文时,出现乱码
处理方法:
在Servler容器中设置过滤器
@Override
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter=new CharacterEncodingFilter();
filter.setEncoding("UTF-8");
return new Filter[]{filter};
}
5.当传入的参数名和形参名不一致时
使用@RequestParam注解
@RequestMapping("/commonParam")
@ResponseBody
public String commonParam(@RequestParam("name") String username, int age){
System.out.println("普通参数传递"+username+age);
return "{'module': 'commonParam'}";
}
其他四种类型的参数传递
1.POJO参数
传入参数自动封装成实体类
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(User user){
System.out.println("pojo参数传递:"+user);
return "{'module': 'pojoParam'}";
}
2.POJO嵌套POJO数据
Address实体类:
public class Address {
private String province;
private String city;
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
@Override
public String toString() {
return "Address{" +
"province='" + province + '\'' +
", city='" + city + '\'' +
'}';
}
}
重写use实体类的构造
public class User {
private String username;
private int age ;
private Address address;
public Address getAddress(){
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", age=" + age +
", address=" + address +
'}';
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
发送数据
3.数组参数
//数组
@RequestMapping("/arrayParam")
@ResponseBody
public String arrayParam(String[] hobby){
System.out.println("数组参数传递:"+ Arrays.toString(hobby));
return "{'module': 'arrayParam'}";
}
4.集合参数
//集合参数
@RequestMapping("/listParam")
@ResponseBody
public String ListParam(List<String> arrayList){
System.out.println("集合参数传递:"+arrayList);
return "{'module': 'listParam'}";
}
报错:
严重: Servlet.service() for servlet [dispatcher] in context with path [/springmvc-demo] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No primary or default constructor found for interface java.util.List] with root cause
java.lang.NoSuchMethodException: java.util.List.()
则需要加注解@RequestParam
@RequestMapping("/listParam")
@ResponseBody
public String ListParam(@RequestParam List<String> arrayList){
System.out.println("集合参数传递:"+arrayList);
return "{'module': 'listParam'}";
}
json数据传递参数
1.JSON传递集合
1.导入json坐标
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
2.在核心配置类中写一个注解
@EnableWebMvc
3.在参数前加上*@RequestBody*注解
//集合参数:JSON格式
@RequestMapping("/listParamJSON")
@ResponseBody
public String listParamJSON(@RequestBody List<String> arrayList){
System.out.println("集合参数json传递:"+arrayList);
return "{'module': 'listParamJSON'}";
}
4.修改传入的数据格式为json
2.JSON传递pojo
加上注解@RequestBody
@RequestMapping("/pojoParam")
@ResponseBody
public String pojoParam(@RequestBody User user){
System.out.println("pojo参数传递:"+user);
return "{'module': 'pojoParam'}";
}
3.json数组(pojo)
@RequestMapping("/listParamJSON")
@ResponseBody
public String listParamJSON(@RequestBody List<User> arrayList){
System.out.println("集合参数json传递:"+arrayList);
return "{'module': 'listParamJSON'}";
}
@RequestBody和@RequestParam的区别
@RequestParam用于接受url地址传参,表单传参
@RequestBody用于接受json数据
日期类型的参数传递
1.传入的日期类型是yyyy/MM/dd
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date){
System.out.println("日期类型的参数传递:"+date);
return "{'module': 'dataParam'}";
}
2.传入的日期类型是yyyy-MM-dd
如下date1
3.传入的日期类型是yyyy-MM-dd HH:mm:ss
@RequestMapping("/dataParam")
@ResponseBody
public String dataParam(Date date,
@DateTimeFormat(pattern ="yyyy-MM-dd") Date date1,
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date date2){
System.out.println("日期类型的参数传递:"+date);
System.out.println("日期类型yyyy-MM-dd的参数传递:"+date1);
System.out.println("日期类型yyyy-MM-dd HH:mm:ss的参数传递:"+date2);
return "{'module': 'dataParam'}";
}