Spring MVC
SpringMVC是基于MVC思想的JAVA WEB实现框架,是Spring家族的一员,它基于前置控制器来接收并分发请求,支持参考验证、请求参数封装、拦截、Restful等功能,是目前较为流行的MVC框架
本系列学习笔记包含如下的课程内容:
- MVC思想
- Hello案例
- 请求和响应处理
- 文件上传和下载处理
- 参数验证
- 请求拦截
- RESTful风格
- 日志
建立一个 web 项目
根据自己的使用习惯,创建一个 Eclipse java 项目或 maven jar 项目。
在 pom.xml 配置依赖
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
依赖树
在 web.xml 配置主控制器
在web.xml配置 org.springframework.web.servlet.DispatcherServlet
1 | <?xml version="1.0" encoding="UTF-8"?> |
- contextClass:以注解方式解析配置信息
- contextConfigLocation: 配置信息路径
WebMvcConfig
WebMvcConfig 是 springMVC 的主配置文件
1 | import org.springframework.context.annotation.ComponentScan; |
- @Configuration: 当前类是配置信息类
- @ComponentScan: 扫描当前包和递归子包的下的组件
- @EnableWebMvc: 启用 WevMVC 功能
控制器
1 | import org.springframework.stereotype.Controller; |
@Controller
- 位置:类名上方
- 作用:表示当前类是被视作为一个控制器
@RequestMapping
- 位置:类名或方法名上方
- 作用:将某一个路径,交给当前类或方法来处理。
Model
- 控制层使用 Model 向视图层传递数据
- Model 包含需要在View中呈现的数据
- Model 的本质就是一个java.util.Map
- 开发者根据需要向 Model add Attribute,然后会自动转为 request请求对象的attributes属性
hello.jsp 页面
WEB-INF/jsp/hello.jsp
1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %> |
PathListener
1 | import javax.servlet.ServletContext; |
index.jsp 页面
1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %> |
运行和调试
- 打成 war 包,部署至 tomcat 访问
mvn clean package
- 直接使用 tomcat7 插件 ( 推荐使用 )
mvn tomcat7:run
注意点
@RequestMapping 位置
- 控制器的方法名上方必须使用此注解
- 控制器的类名上方,可选使用此注解(将起到路径拼接的作用)
编码过滤器
无需自己开发编码过滤器,
由于 spring-web.jar 已提供一个 CharacterEncodingFilter 过滤器,
直接在 web.xml 中配置即可:
1 | <!-- 编码过滤器 --> |
在 jsp 页面中使用 JSTL
先在 pom.xml 配置 jstl 依赖
1 | <!--jsp standard tag lib--> |
然后在 jsp 页面头部导入标签库即可(注意要重启tomcat)
1 | <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" %> |
如何实现 redirect 重定向
首先了解 forward 和 redirect 的本质区别,见下图:
如果在开发期间,需要使用 redirect 重定向,
在 SpringMVC 的控制器中, 直接返回字符串:
格式:redirect:/路径...
比如:return "redirect:/index.jsp"; //设置重定向至index.jsp
注意:
只能跳转到项目公开资源,比如各种公开的jsp,html,控制器等.
如何获得 HttpSession 作用域
传统做法:
1 | HttpSession session = request.getSession(); |
推荐做法
直接在方法参数中声明即可
比如:
1 | String hello(Model model, |
然后就可以直接使用了,so easy!
如果开发ajax,控制器怎么返回纯文本的内容
基于@ResponseBody和 @RequestMapping 的 produces属性,
可以灵活设置响应的内容和格式.
比如:
1 | @ResponseBody //将内容直接返回,无需视图显示 |