1.MVC架构(SSH框架之一)
MVC是model、view、controller的缩写。分别代表web应用程序中的3种职能。
2.springmvc
优化页面跳转、优化参数获取、封装了基于反射的接口访问、不需要去写BaseServlet,也不需要在web.xml中配置控制器。
Spring framework是我们平时说的Spring框架,是Spring全家桶内其他框架的核心和基础。
Spring MVC 的工作原理/流程如下:
1)客户端请求提交到调度器DispatcherServlet;
2)由 DispatcherServlet调度器解析URL,调用URL对应的映射处理器HandlerMapping,获得处理请求的Controller和对应的拦截器Interceptor;
3)DispatcherServlet 将请求提交到控制器Controller;
4)Controller调用业务逻辑(service层和dao层)处理后,向DispatcherServlet返回ModelAndView;
5)DispatcherServlet 根据modleAndView获取对应的视图解析器ViewResolver ,找到 ModelAndView 指定的视图view;
6)ViewResolver将数据渲染到视图;
7)响应视图显示到客户端;
3.Controller:
1)控制器,接受来自dispatcherServlet转发的HTTP请求,处理请求
2)所有能够通过HTTP请求访问到的controller方法,称为接口
3)调度器DispacherServlet是springMVC的入口。
4)tomcat容器扫描控制器类,指定要扫描的包路径,并扫描所有被@controller注解声明的类
5)容器完成所有被扫描到的控制器类的实例化
<context:component-scan base-package="com.st.controller" />
4.拦截器Interceptor
4-1 拦截器Interceptor:对于进入到controller的请求进行预处理、后处理
过滤器Filter预处理。
<!--配置拦截器-->
<mvc:interceptors>
<!--配置一个全局拦截器,拦截所有请求-->
<!--<bean class="interceptor.UserInterceptor"/>-->
<mvc:interceptor>
<!--配置拦截器的请求路径-->
<!--/*智能拦截一层请求,/**可以拦截多层请求-->
<mvc:mapping path="/def/*" />
<!--定义拦截器类的包路径-->
<bean class="com.st.interceptor.DefInterceptor" />
</mvc:interceptor>
</mvc:interceptors>
4-2 拦截器Interceptor几个方法:
1.preHandle方法:在控制器controller处理请求之前被调用
1)该方法返回值是boolean类型,当返回false时,表示请求结束,后续的interceptor和controller都不会再执行
2)当返回值为true时就会继续调用下一个interceptor的prehandle方法。
3)如果请求到达最后一个interceptor,就会调用当前请求的controller方法。
2.postHandle方法:
在controller处理请求结束之后,在dispatcherServlet进行视图数据渲染之前,调用该方法。
可以在这里对Controller处理之后的ModelAndView对象进行操作
3.afterCompletion
在DispatcherServlet渲染了对应的视图之后执行,这个方法的主要作用是用于进行资源清理工作
5.ModelAndView
作用:添加数据、添加跳转页面名称。
public ModelAndView test3(){
ModelAndView mv = new ModelAndView();
//添加数据
mv.addObject("name","思途");
//添加跳转页面名称
mv.setViewName("welcome");
return mv;
}
// ModelAndView交给DispatcherServlet处理,DispatcherServlet去加载配置文件中的视图解析器,拼接前后缀,形成文件路径。
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<!--前缀-->
<property name="prefix" value="/page/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
6.封装工作单元:
如果客户端请求中的参数很多时,为了避免controller方法参数列表过长,可以用一个类的对象接收全部参数。
但是前提是,要求类的属性名和请求中的参数名相同。
Model:
public class User {//User类
private String name;
private int age;
private int id;
public User(){
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
...........................
}
@Controller
public String test(User user){//类对象为参数
System.out.println(user.getName());
return "你好 hello spring mvc";//向浏览器返回字符串
}