MVC: Model 数据/模型 V:View视图【前端】 C:controller 控制【后端】
【在web.xml中配置】
【在springMVC.xml中配置】
【在springMVC.xml中配置】
【程序员编写】
【Handler方法的返回值】
【在springMVC.xml中配置】
【页面view,程序员编写】
<dependency> |
xml version="1.0" encoding="UTF-8"?> |
springmvc-servlet.xml核心配置文件主要配置:
处理器映射器 、处理器适配器 、 视图解析器 、 [各个处理器]
xml version="1.0" encoding="UTF-8"?>
|
SpringMVC使用 @RequestMapping 注解为控制器指定可以处理哪些URL请求
•该注解在控制器的类定义及方法定义处都可标注
•类定义处:【请求根路径】
•提供初步的请求映射信息。相对于 WEB 应用的根目录
•方法处:
•提供进一步的细分映射信息。相对于类定义处的 URL。若类定义处未标注 @RequestMapping,则方法处标记的 URL 相对于WEB 应用的根目录
•DispatcherServlet 截获请求后,就通过控制器上@RequestMapping 提供的映射信息确定请求所对应的处理方法
普通URL路径映射:
•多个URL路径可以映射到同一个处理器的功能处理方法:
•@RequestMapping(value={"/test1", "/user/create"})
可以实现HTTP请求方法限定映射
如method={ RequestMethod.POST, RequestMethod.GET}
要求HTTP请求数据中必须包含指定参数名(有值无值均可)才能匹配
客户信息:
public class Customer {
private Integer id;
private String name;
private Date birthday;
private String address;
private String phone;
//setter..getter
}
必须保证传递过来的数据不能为null或”",否则会报异常。【不推荐】
对可能为空的数据,最好将参数数据类型定义成包装类型
//基本包装类型的参数:没值不会报错
//请求url: XXX/queryCustomerByID?cid=1
@RequestMapping("/queryCustomerByID")
public ModelAndView queryCustomerByID(Integer cid) {
ModelAndView mv = new ModelAndView();
Customer customer = customerService.queryCustomer(cid);
mv.addObject("customer", customer);
mv.setViewName("customer/customerInfo");
return mv;
}
详情页:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
head>
<body>
<h2>Hello World!h2>
<div>
<div>会员详情信息:div>
<div> 编号:${ customer.id}div>
<div>姓名: ${ customer.name}div>
<div>生日:${ customer.birthday}div>
<div>手机:${ customer.phone}div>
<div>地址:${ customer.address}div>
div>
body>
html>
3. 简单自定义POJO对象类型
//请求url: XXX/addCustomer
// 其他参数用 form表单 method=post 提交
//表单名称直接对应POJO的属性值,即:只需将对象的属性名和input的name值一一匹配即可
//日期类型默认格式: 月/日/年
@RequestMapping(value="/addCustomer",method = RequestMethod.POST)
public ModelAndView addCustomer(Customer c1) {
ModelAndView mv = new ModelAndView();
customerService.saveCustomer(customer);
mv.setViewName("success");
return mv;
}
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>新增用户title>
head>
<body>
<div>
<div>新增会员:div>
<form action="${ pageContext.request.contextPath}/addCustomer" method="post">
<div>姓名:<input type="text" name="name"/>div>
<div>生日:<input type="text" name="birthday"/>div>
<div>手机:<input type="text" name="phone"/>div>
<div>地址:<input type="text" name="address"/>div>
<input type="submit" value="提交" />
form>
div>
body>
html>
因为Date类型 因为比较常见,所以,一般可以用POJO对应的属性上增加
@DateTimeFormat(pattern = "yyyyMMdd") 注解来解决日期格式化
【也可以采用 自己定义 类型转换器 】
4 自定义复合包装对象类型:
在自定义包装类型中,增加其他java的pojo属性,解决参数传值问题
解决在复杂查询条件中,各种参数(包括同名参数)的数据绑定问题。
例如:顾客名和商品名进行查询时,他们的属性都有name。此时得用包装的pojo来解决
步骤:
【1】新增java的包装POJO
/**
* 客户和商品的POJO包装类
*/
public class CustomerProductVO {
private Customer customer;
private Product product;
//getter.. setter..
}
【2】编写Handler处理器
在方法的形参中,增加相应的pojo的参数信息
【3】jsp页面端
用户名: customer.name” />
商品名: product.name” />
5.数组绑定
步骤:
【1】编写Handler
【2】jsp页面的传参
name=”ids” value=”1” />
name=”ids” value=”2” />
....
6.List绑定
批量修改商品信息
List需要绑定在对象上,而不能直接写在Controller方法的参数中。
public class ProductList {
private List
//getter... setter..
}
@RequestMapping("/updateProducts")
public ModelAndView updateProducts(ProductList prods){
ModelAndView mv = new ModelAndView();
System.out.println("准备修改的信息:" + prods.getProducts().toString());
mv.setViewName("product/updateSuccess");
return mv;
}
页面信息:
<table>
<tr>
<td>商品编号td>
<td>商品名称td>
<td>商品价格td>
<td>商品描述td>
tr>
<tbody>
<form action="${ pageContext.request.contextPath}/product/updateProducts">
<tr>
<td><input type="hidden" name="products[0].id" value="1"/>td>
<td><input type="text" name="products[0].name" value="商品1"/>td>
<td><input type="text" name="products[0].price" value="20"/>td>
<td><input type="text" name="products[0].detail" value="商品详情1"/>td>
tr>
<tr>
<td><input type="hidden" name="products[1].id" value="2"/>td>
<td><input type="text" name="products[1].name" value="商品2"/>td>
<td><input type="text" name="products[1].price" value="30"/>td>
<td><input type="text" name="products[1].detail" value="商品详情2"/>td>
tr>
<input type="submit" value="修改提交"/>
form>
table>
7.Map绑定
Map最为灵活,它也需要绑定在对象上,而不能直接写在Controller方法的参数中。
public class UserMapForm {
private Map
// getter.. setter..
}
@RequestMapping("sysmap.do")
public void test(UserMapForm userForm) {
for (Map.Entry
System.out.println(entry.getKey() + ": " + entry.getValue().getUserName() + " - " +entry.getValue().getPassword());
}
}
表单页面:
在web.xml中,配置过滤器
|
springMvc中controller中方法的返回值类型:
[可以在方法的参数中加入Model或者ModelMap 等方式 设定返回的Model数据]
单纯的String值: "前缀" + String值 + "后缀"
请求的转发: "forward:path" ; 转发不同控制器的请求:"forward:/path" ;
重定向: "redirect:/path";
而视图: 对应的是该请求的字符串值;一般表示只返回数据,不管视图
所以,常结合@ResponeBody 来返回json字符串
【备注:一般不采用这种方式;而用第一种替代】
@RequestMapping("/test")
public ModelAndView reg(String uname){
ModelAndView mv = new ModelAndView();
mv.setViewName("MyJsp");
//mv.setView(new RedirectView("index"));
User u = new User();
u.setName(uname);
mv.addObject(u);
mv.addObject("a", "aaaa");
return mv;
}
表示 一般表示既不返回视图也不返回数据;所以,常用于文件下载;spring