一、说明
将【请求中的字段】按照【名字匹配的原则】填入【模型对象】。
二、方式
1、定义跳转创建Course页面的controller
package com.imooc.mvcdemo.controller;
import com.imooc.mvcdemo.model.Course;
import com.imooc.mvcdemo.service.CourseService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
@Controller//标识这个类是一个Controller
@RequestMapping("/courses")
//controller拦截所有 /courses/** 的请求
public class CourseController {
private static Logger log = LoggerFactory.getLogger(CourseController.class);
private CourseService courseService;
@Autowired
public void setCourseService(CourseService courseService) {
this.courseService = courseService;
}
/**
* 1、value = "/admin":方法级URL
* 2、method = RequestMethod.GET:GET类型请求
* 3、params = "add":限制请求参数中需要有add
* @return
*/
@RequestMapping(value = "/admin",method = RequestMethod.GET,params = "add")
public String createCourse(){
//调用此url,将跳转至一个编辑页面
//由于web.xml -> mvc-dispatcher-servlet.xml -> 使用了InternalResourceViewResolver,其中通过前缀,后缀指定的展示哪个jsp页面,所以这里返回jsp页面的名称(包括相对路径)即可。返回
return "course_admin/edit";
}
}
2、controller中返回的字符串对应了
/WEB-INF/jsps/course_admin/edit.jsp页面
(由于web.xml -> mvc-dispatcher-servlet.xml -> 使用了InternalResourceViewResolver,其中通过前缀,后缀指定的展示哪个jsp页面,所以这里返回jsp页面的名称(包括相对路径)即可。)
3、jsp页面
<%@ page language="java"
contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>我不是真正的慕课网</title>
<link rel="stylesheet"
href="<%=request.getContextPath()%>/resources/css/main.css"
type="text/css" />
</head>
<body>
<div id="main">
<div class="newcontainer" id="course_intro">
<form name="mainForm" action="<%= request.getContextPath()%>/courses/save" method="post">
<div>
<span>课程名称:</span><input type="text" id="title" name="title">
</div>
<div>
<span>课程时长:</span><input type="text" id="duration" name="duration"> 秒
</div>
<div>
<span>课程难度:</span>
<select id="level" name="level">
<option value="0">初级</option>
<option value="1" selected="selected">中级</option>
<option value="2">高级</option>
</select>
</div>
<div>
<span>课程介绍:</span>
<textarea id="descr" name="descr" rows="5" style="width:480px"></textarea>
</div>
<div>
<input type="submit" id="btnPass" value="提交" />
</div>
</form>
</div>
</div>
</body>
</html>
- 其中form表单是提交上传文件的
- 表单提交时访问的URL是:/courses/save
- jsp中【页面控件的name属性值】,对应了【业务实体(模型对象)中属性名称】:体现了绑定机制中名称匹配规则
4、提供savecontroller:提供处理/courses/save的URL请求的controller(表单中请求参数将通过此Controller,完成绑定到模型对象)
@RequestMapping(value = "/save",method = RequestMethod.POST)
public String doSave(Course course){
log.debug("Info of Course : ");
log.debug(ReflectionToStringBuilder.toString(course));//ReflectionToStringBuilder是apache的common-lang工具包中的,用来把一个对象属性转换成键值对形式
//在此进行业务操作,比如数据库持久化
course.setCourseId(123);
//这里使用请求重定向的方式(还有请求转发forward的方式,这两个概念面试经常会被问到)
return "redirect:view2/"+course.getCourseId();
}
5、测试
启动web容器(工程中使用的jetty,也可以配置tomcat)
启动浏览器,输入如下网址:http://localhost:8080/courses/admin?add
输入表单提交内容:
点击提交
看到日志(savecontroller中)输出如下内容,同时请求重定向到:http://localhost:8080/courses/view2/123
说明表单提交的【请求中的字段】按照【名字匹配的原则】填入【模型对象】
三、其他
Spring mvc中也提供了@ModelAttribute标签(方法参数级别的annotation),也可以完成相同的工作。
用SpringMVC会自动匹匹配页面传递过来的参数的名称属性和后台控制器中的方法中的参数名,如果参数名相同,会自动匹配,如果控制器中方法是封装的豆腐,会自动匹配豆中的属性,其实这种取值方式不需要用@ModelAttribute注解,只要满足匹配要求,也能拿得到值。