什么是MVC?
MVC是设计模式的一种,Model代表模型,负责Dao,Service等数据;View代表视图,就是网页等用来展示数据;Controller代表控制器,控制器负责转发,把不同的数据显示在不同的网页上。
SpringMVC中的核心组件:
接下来通过实践来熟悉SpringMVC的处理流程:
首先新建一个SpringMVC项目
选中Download后idea会自动下载所需的jar包,使用eclipse的可以自己导入相应的需要使用的jar包。除了自动下载的包以外,我们还需要导入本地Tomcat路径下lib文件夹中的servlet-api.jar这个包。生成项目之后,我们会发现lib文件夹并不在WEB-INF之下,为了防止之后出现问题,我们把lib文件夹剪切到WEB-INF之下,接着右键整个项目选择Open Module Settings,选中Dependencies点击右侧的加号。
接着选择第一个jar选项,选中lib文件夹,点击确定。
接下来修改web.xml
将url-pattern修改为 / ,表示要拦截所有的请求,并交由Spring MVC的后台控制器来处理。
接下来修改dispatcher-servlet.xml,这是SoringMVC的映射配置文件,名称和web.xml文件中定义的servlet-name相对应,为xxx-servlet.xml
firstController
新建一个包【controller】,包下新建一个类FirstController,继承Controller接口,重写handleRequest方法,通过ModelAndView将视图和数据结合在一起。
package controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class FirstController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView("index.jsp");
modelAndView.addObject("message","Hello Spring MVC");
return modelAndView;
}
}
修改index.jsp,使用EI表达式展示message的数据
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" isELIgnored="false" %>
$Title$
hello
${message}
启动tomcat,在浏览器中修改路径后加上/first,看到结果。启动tomcat的方法见博客https://blog.csdn.net/qq_41973594/article/details/95037638
-------------------------------------------------------------------------------------------------------------------------------------
Spring MVC的请求流程
很多人学习SpringMVC时都见过这个图,也能用语言表示出其中的步骤,但是放到代码中就不是那么清楚了,接下来就通过上面的代码解释一下SpringMVC的请求流程
1.请求发送到DispatcherServlet
dispatcher
org.springframework.web.servlet.DispatcherServlet
1
dispatcher
/
请求首先到达DispatcherServlet,通过将url-pattern修改成“/”,DispatcherServlet会拦截所有请求
2.DispatcherServlet根据HandlerMapping中的配置信息找到相应的二级控制器
firstController
我们通过配置 simpleUrlHandlerMapping 来将 /first 地址交给 firstController 处理
3.DispatcherServlet调用相应的控制器
public class FirstController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView("index.jsp");
modelAndView.addObject("message","Hello Spring MVC");
return modelAndView;
}
}
这里的控制器将视图与数据结合在一起
4.当处理完业务逻辑后,Controller返回ModelAndView给DispatcherServlet
5.DispatcherServlet调用视图解析器进行解析,上面的例子直接绑定到了index.jsp
6.最后的View负责展示视图,在本例中就是index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" isELIgnored="false" %>
$Title$
hello
${message}
-------------------------------------------------------------------------------------------------------------------------------------
使用注解配置Spring MVC
使用XML方式配置Spring MVC程序虽然可以很好的了解SpringMVC的全过程,但是终究还是太麻烦了,在现实中大多还是使用注解的方式。
SpringMVC中的常用注解有以下几种:
1.@Controller
在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model,使用@Controller 标记一个类是Controller,后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到
2.@ResquestMapping
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径
3.@PathVariable
用于将请求URL中的模板变量映射到功能处理方法的参数上,即取出uri模板中的变量作为参数。
4.@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区
更多的注解等使用到的时候再做补充
将上面的例子使用注解进行修改:
@Controller
public class FirstController{
@RequestMapping("/first")
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView modelAndView = new ModelAndView("index.jsp");
modelAndView.addObject("message","Hello Spring MVC");
return modelAndView;
}
}
将原来的XML文件中的配置注释,增加新的配置
再次重新启动服务器后可以达到和原来一样的效果。
------------------------------------------------------------------------------------------------------------------------------------
配置安全的视图解析器
如果我们把jsp页面放在web的根目录下,那么通过 路径/jsp名字 就能直接访问到jsp页面,这会导致web网站不安全。【WEB-INF】是javaweb中默认的安全目录,用户无法通过在地址栏直接访问到WEB-INF目录中的文件,我们要做的就是在WEB-INF下建立一个存放jsp文件的目录,然后告诉视图解析器就行。
1.在WEB-INF目录下新建包page,并把index.jsp剪切到包下
2.在dispatcher-servlet.xml中增加下面一项
这里的意思是告诉视图解析器视图资源的物理路径,为/WEB-INF/page/xxx.jsp,xxx就是接下来配置的。
3.修改FirstController
去掉 index.jsp中的后缀,因为我们在xml文件中已经配置好了
4.重启服务器,加上后缀/first后查看结果,和原先的结果一致。