1. 控制器默认支持的参数类型
1.1. 直接在控制器方法形参上定义HttpServletRequest、HttpServletResponse、HttpSession和Model/ModelMap类型的对象, 不用创建对象, 就可以直接使用。
1.2. HttpServletRequest: 获取request对象请求信息。
1.3. HttpServletResponse: 通过response对象处理相应信息。
1.4. HttpSession: 获得session对象中存放的信息。
1.5. Model/ModelMap: Model是一个接口, ModelMap是一个实现类, 使用Model对象或ModelMap对象都行, 一般使用Model对象。将模型数据填充到request域中。
2. @Controller标识一个类是一个控制器。
3. @RequestMapping注解
3.1. @RequestMapping的value值定义Controller的url映射。可以定义方法的映射, 一个方法对应一个url。
3.2. 也可以定义类的映射, 用来窄化请求映射(比如是某个模块的根路径)。
3.3. @RequestMapping的method值可以设置请求类型。
4. 处理器方法的返回值
4.1.返回ModelAndView
4.2. 返回String
4.2.1. 如果返回String, 表示的是逻辑视图名。真正视图(Jsp路径)=前缀+逻辑视图名+后缀。
4.2.2. 转发: "forward:/WEB-INF/jsp/itemList.jsp"
4.2.3. 重定向: "redirect:itemList.jsp"
4.3. 返回void
5. 例子
5.1. 新建一个名为ControllerRequestMapping的Web工程, 同时拷入相关jar包
5.2. 新建Item.java
package com.lywgames.domain;
import java.io.Serializable;
import java.util.Date;
public class Item implements Serializable{
private static final long serialVersionUID = 1L;
// 商品id
private Integer id;
// 商品名称
private String name;
// 商品价格
private Double price;
// 商品创建时间
private Date createtime;
// 商品描述
private String detail;
public Item() { }
public Item(Integer id, String name, Double price, Date createtime, String detail) {
this.id = id;
this.name = name;
this.price = price;
this.createtime = createtime;
this.detail = detail;
}
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 Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getDetail() {
return detail;
}
public void setDetail(String detail) {
this.detail = detail;
}
}
5.3. 新建ItemAction.java
package com.lywgames.web.action;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.lywgames.domain.Item;
// @Controller标识一个类是一个控制器。
@Controller
// @RequestMapping的value值定义Controller类url映射, 用来窄化请求映射(比如是某个模块的根路径)。
@RequestMapping("item")
public class ItemAction {
List<Item> itemList = new ArrayList<Item>();
public ItemAction() {
itemList.add(new Item(1, "冰箱", 1999.0, new Date(), "保鲜。"));
itemList.add(new Item(2, "电脑", 8888.0, new Date(), "网上冲浪"));
itemList.add(new Item(3, "洗衣机", 4000.0, new Date(), "从此不用手。"));
itemList.add(new Item(4, "空调", 2600.0, new Date(), "冬天制热, 夏天制冷。"));
itemList.add(new Item(5, "液晶电视", 20000.0, new Date(), "曲面屏幕"));
}
// @RequestMapping的value值定义Controller方法的url映射, method值可以设置请求类型。
@RequestMapping(value="productsCallbackModelAndView", method={RequestMethod.GET})
// 处理器方法返回ModelAndView
public ModelAndView productsCallbackModelAndView() {
ModelAndView mav = new ModelAndView();
mav.addObject("itemList", itemList); // 设置商品数据
mav.setViewName("itemList"); // 设置视图名字
return mav;
}
@RequestMapping(value="productsCallbackString")
// 处理器方法返回String
public String productsCallbackString(HttpServletRequest req, HttpServletResponse res, HttpSession hs, Model m) {
req.setAttribute("itemList", itemList); // 设置商品数据
return "itemList";
}
@RequestMapping("productsCallbackStringByForward")
// 处理器方法返回String, 通过forward方式
public String productsCallbackStringByForward(HttpServletRequest req) {
req.setAttribute("itemList", itemList); // 设置商品数据
return "forward:/WEB-INF/jsp/itemList.jsp";
}
@RequestMapping("productsCallbackStringByRedirect")
// 处理器方法返回String, 通过redirect方式
// 请求地址栏中直接输入地址无法之间访问WEB-INF下的资源, redirect也不能访问。
public String productsCallbackStringByRedirect(HttpSession hs) {
hs.setAttribute("itemList", itemList); // 设置商品数据
return "redirect:itemList.jsp";
}
@RequestMapping("productsCallbackVoid")
// 处理器方法返回void
public void productsCallbackVoid(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
req.setAttribute("itemList", itemList); // 设置商品数据
req.getRequestDispatcher("/WEB-INF/jsp/itemList.jsp").forward(req, res);
}
}
5.4. 在src下, 编写springmvc.xml
5.5. 在web.xml里配置请求路径拦截、SpringMVC的前端控制器和加载SpringMVC的核心配置文件。
5.6. 编写index.jsp
5.7. 由于重定向不能直接访问WEB-INF下的资源, 所以我们在WebContent/item/和WebContent/WEB-INF/jsp/目录下都编写itemList.jsp(仅仅是为了演示)
5.8. 运行项目
5.9. 转发的访问结果
5.10. 重定向的访问结果