springMVC开发步骤
- 导入springmvc相关坐标
- 配置springmvc核心控制器DispatcherServlet(一定要在web.xml中配置 前端控制器,否则controller层将没有任何效果)
- 创建controller类和视图页面
- 使用注解配置controller类业务方法的映射地址
- 配置Springmvc核心文件spring-mvc.xml
- 客户端发起请求测试
前端控制器配置如下
<!--配置springMvc的前端控制器-->
<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>/</url-pattern>
</servlet-mapping>
springMVC注解
@RequestMapping
作用:用于建立URL和处理请求方法之间的对应关系
位置:
- 类上:请求url的第一级访问目录,此处不写的话,就相当于应用的根目录
- 方法山:请求url的第二级访问目录,与类上的使用@RequsetMapping标注的一级目录一起访问虚拟路径属性
属性:
- value:用于指定请求的url,它的path属性的的作用是一样的
- method:用于指定请求的方式
- params:用于指定限定请求的参数条件,它支持简单的表达式。要请求参数的key和value必须和配置的一模一样
- 例如:params={"accountName"},表示请求参数必须有accountName
- params={money!100"},表示请求参数中money不能是100
@ResponseBody:告知springMvc框架该方法不进行视图跳转,直接进行数据响应回写到页面,就是直接返回字符串,不会被解析成跳转路径
@RequestParam:当请求参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解现实的绑定
属性如下:
value:指定请求参数名称
required:指定的请求参数是否必须包括,默认是true,提交时如果没有此参则报错
defaultValue:当没有指定请求参数时,则使用指定的默认赋值
URL:http://localhost:8081/spring03_springmvc_war_exploded/quick16?name=xiugaib
//代码如下
@RequestMapping("/quick16")
@ResponseBody//告知SpringMVC框架该方法不进行视图跳转,直接进行数据响应回写到页面
public void save16(@RequestParam(value = "name") String username) throws IOException {
System.out.println(username);
}
springMVC数据响应方式
1.页面跳转
- 直接返回字符串
- 通过ModelAndView对象返回
2.数据回写
- 直接返回字符串
- 返回对象集合
springMVC获得的请求参数
- 基本类型参数:Controller中的业务方法参数名称要与请求参数的name一致,参数值会自动映射匹配 如下所示:
http://localhost:8080/spring03_springmvc_war_exploded/quick11?username=zhangsan&age=18
@RequestMapping("/quick11") @ResponseBody//告知SpringMVC框架该方法不进行视图跳转,直接进行数据响应回写到页面 public void save11(String username,int age) throws IOException { System.out.println(username); System.out.println(age); }
- POJO类型参数:Controller中的业务方法的pojo参数的属性名要与请求参数的name一致,参数值会自动映射匹配
地址 http://localhost:8080/spring03_springmvc_war_exploded/quick12?username=zhangsan&age=18
-
POJO的user类如下 private String username; private int age; 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; }
controller类如下 @RequestMapping("/quick12") @ResponseBody//告知SpringMVC框架该方法不进行视图跳转,直接进行数据响应回写到页面 public void save12(User user) throws IOException { System.out.println(user); }
- 数组类型参数:controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配
http://localhost:8080/spring03_springmvc_war_exploded/quick13?shuzu=aa
@RequestMapping("/quick13") @ResponseBody//告知SpringMVC框架该方法不进行视图跳转,直接进行数据响应回写到页面 public void save13(String[] shuzu) throws IOException { System.out.println(Arrays.asList(shuzu));//打印出值 }
- 集合类型参数:获得集合参数时,要将集合参数包装到一个POJO中才可以
先创建一个VO实体类 这里的User是POJO类 public class VO { private List<User> userList; public List<User> getUserList() { return userList; } public void setUserList(List<User> userList) { this.userList = userList; } @Override public String toString() { return "VO{" + "userList=" + userList + '}'; } }
controller类 @RequestMapping("/quick14") @ResponseBody//告知SpringMVC框架该方法不进行视图跳转,直接进行数据响应回写到页面 public void save14(VO v) throws IOException { System.out.println(v); } 再写一个jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <form action="${pageContext.request.contextPath}/quick14" method="post"> <%--表明是缔结User对象的username age--%> <input type="text" name="userList[0].username"><br/> <input type="text" name="userList[0].age"> <input type="submit" value="提交"> </form> </body> </html>
当使用ajax请求时,可以指定contentType为json格式,那么在方法参数位置使用@RequestBody可以直接接收集合数据而无需使用POJO进行包装