了解MVC模型结构,熟悉SpringMVC项目创建以及重要的组件;掌握SpringMVC执行流程;
三层结构
我们在使用Java语言进行开发程序中,一般都是基于C/S架构或者B/S架构,我接触的都是B/S架构,即Browser/Server,而在B/S架构又分成三层结构,即:表现层(用于与客户端交互数据),业务层(处理业务逻辑),持久层(数据库操作)。
MVC模型
MVC 是模型(model)-视图(view)-控制器(controller)的缩写,是一种用于设计创建 Web 应用程序表现层的模式;
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,是目前最主流的MVC框架之一;
SpringMVC通过一套注解让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口;
Model | 数据模型,用于封装数据 |
View | 通常指代前台的html或者jsp,用于展示数据 |
Controller | 整个流程的控制器,用于接收用户的请求 |
SpringMVC为表现层框架。
图片来源于黑马视频
SpringMVC项目创建
注意点一: 配置核心的前端控制器(配置DispatcherServlet);
<!--配置前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置Servlet的初始化参数,读取springmvc的配置文件,创建spring容器 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置servlet启动时加载对象 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
注意点二: 在Resources目录下创建一个配置文件并编写配置文件内容(习惯性命名为springmvc.xml);
<!-- 开启注解扫描,指定扫描路径 -->
<context:component-scan base-package="com.yp"></context:component-scan>
<!-- 视图解析器对象 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--解析目录路径-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!--解析文件类型-->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 开启SpringMVC框架注解的支持 -->
<mvc:annotation-driven></mvc:annotation-driven>
SpringMVC的重要组件
DispatcherServlet: 前端控制器,是整个流程控制的中心,由它调用其他组件处理请求;
HandlerMapping: 处理器映射器,用于根据用户请求找到对应的Handler;
Handler: 具体的业务控制器,处理用户请求;
HandlerAdapter: 处理器适配器,执行Handler;
ViewResolver: 视图解析器,根据处理结果进行视图解析,返回View给控制器;
SpringMVC执行流程
图片来源于黑马视频
SpringMVC的请求参数绑定
绑定机制: 表单数据以key=value进行提交;SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定;
支持的数据参数类型: 基础数据类型和字符串类型; POJO类型;集合类型;
使用要求:
基础数据类型和字符串类型 | 参数名称必须和控制器中方法的形参名称保持一致,严格区分大小写 |
POJO类型 | 表单中参数名称和 POJO 类的属性名称保持一致,并且控制器方法的参数类型是 POJO 类型 |
数组和集合类型 | 集合类型的请求参数必须在 POJO 中,在表单中参数名称和 POJO 类的属性名称保持一致;给 List 集合中的元素赋值使用下标,给 Map 集合中的元素赋值使用键值对; |
部分注解介绍
@RequestMapping: 既可以作用在类上,也可以作用在方法上。
作用: 用于建立请求URL和处理请求方法之间的联系;
属性:
path: 用于指定请求的 URL;@RequestMapping(path="/account");
value: 用于指定请求的 URL; @RequestMapping(value="/account");
method: 用于指定请求的方式; @RequestMapping(value="/account",method=RequestMethod.POST);
params: 用于指定限制请求参数的条件;@RequestMapping(value="/account",params = {“userName”});
headers: 用于指定限制请求消息头的条件;
@RequestParams:
作用: 把请求URL中的指定名称的参数传递给控制器中的形参赋值;
属性:
value: 用于指定请求URL中参数名称;
required: 请求参数中是否必须提供此参数,默认值是true,必须提供;
代码示例:
<!--jsp代码-->
<a href="anno/testRequestParam?name=哈哈">RequestParam</a>
<!--控制器代码-->
@RequestMapping("/testRequestParam")
public String testRequestParam(@RequestParam(name="name") String username){
System.out.println(username);
return "success";
}
@RequestBody:
作用: 用于获取请求体内容,get请求方式不适用;
属性:
required: 是否必须有请求体,默认值是:true;
代码示例:
<!--jsp代码-->
<form action="anno/testRequestBody" method="post">
用户姓名:<input type="text" name="username" /><br/>
用户年龄:<input type="text" name="age" /><br/>
<input type="submit" value="提交" />
</form>
<!--控制器代码-->
@RequestMapping("/testRequestBody")
public String testRequestBody(@RequestBody String body){
System.out.println(body);
return "success";
}
@PathVariable:
作用: 用于绑定 url 中的占位符;
属性:
value: 用于指定 url 中占位符名称;
required: 是否必须提供占位符;
代码示例:
<!--jsp代码-->
<a href="anno/testPathVariable/100">testPathVariable</a>
<!--控制器代码-->
@RequestMapping(value="/testPathVariable/{sid}")
public String testPathVariable(@PathVariable(name="sid") String id){
System.out.println(id);
return "success";
}
@RequestHeader:
作用: 用于获取请求消息头内容
属性:
value: 用于提供消息头名称;
required: 是否必须有此消息头;
代码示例:
<!--jsp代码-->
<a href="anno/testRequestHeader">RequestHeader</a>
<!--控制器代码-->
@RequestMapping(value="/testRequestHeader")
public String testRequestHeader(@RequestHeader(value="Accept") String header) throws IOException {
System.out.println(header);
return "success";
}
@CookieValue:
作用: 用于把指定 cookie 名称的值传入控制器方法参数;
属性:
value: 用于指定 cookie 的名称;
required: 是否必须有此 cookie;
代码示例:
<!--jsp代码-->
<a href="anno/testCookieValue">CookieValue</a>
<!--控制器代码-->
@RequestMapping(value="/testCookieValue")
public String testCookieValue(@CookieValue(value="JSESSIONID") String cookieValue){
System.out.println(cookieValue);
return "success";
}
@ModelAttribute: 既可以作用在方法上,也可以作用在参数上。
作用:
作用范围 | 作用效果 |
---|---|
方法 | 表示当前方法会在控制器的方法执行之前先执行 |
参数 | 获取指定的数据给参数赋值 |
属性:
value: 用于获取数据的 key; key 可以是 POJO 的属性名称,也可以是 map 结构的 key;
代码示例:
<!--jsp代码-->
<form action="anno/testModelAttribute" method="post">
用户姓名:<input type="text" name="uname" /><br/>
用户年龄:<input type="text" name="age" /><br/>
<input type="submit" value="提交" />
</form>
<!--控制器代码-->
<!--无返回值类型-->
@ModelAttribute
public void showUser(String uname, Map<String,User> map){
// 通过用户查询数据库(模拟)
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
map.put("abc",user);
}
@RequestMapping(value="/testModelAttribute")
public String testModelAttribute(@ModelAttribute("abc") User user){
System.out.println(user);
return "success";
}
<!--有返回值类型-->
@ModelAttribute
public User showUser(String uname){
// 通过用户查询数据库(模拟)
User user = new User();
user.setUname(uname);
user.setAge(20);
user.setDate(new Date());
return user;
}
@RequestMapping(value="/testModelAttribute")
public String testModelAttribute( User user){
System.out.println(user);
return "success";
}
@SessionAttributes: 只能作用在类上
作用: 用于多次执行控制器方法间的参数共享;
属性:
value: 用于指定存入的属性名称;
type: 用于指定存入的数据类型;
代码示例:
<!--jsp代码-->
<a href="anno/testSessionAttributes">testSessionAttributes</a>
<a href="anno/getSessionAttributes">getSessionAttributes</a>
<a href="anno/delSessionAttributes">delSessionAttributes</a>
<!--控制器代码-->
@SessionAttributes(value={"msg"})
public class AnnoController {
/**
* 存入值
* @return
*/
@RequestMapping(value="/testSessionAttributes")
public String testSessionAttributes(Model model){
// 底层会存储到request域对象中
model.addAttribute("msg","Session存值");
return "success";
}
/**
* 获取值
* @param modelMap
* @return
*/
@RequestMapping(value="/getSessionAttributes")
public String getSessionAttributes(ModelMap modelMap){
String msg = (String) modelMap.get("msg");
System.out.println(msg);
return "success";
}
/**
* 清除值
* @param status
* @return
*/
@RequestMapping(value="/delSessionAttributes")
public String delSessionAttributes(SessionStatus status){
status.setComplete();
return "success";
}
}