1、Web层:
有jsp+servlet、struts2、springMVC
其中struts2有一个前端控制器,所有的请求都经过前端控制器,发给对印的action
springMVC:可替换struts2,
web层框架都有一个前端控制器,都做web层处理的
- Spring MVC属于SpringFrameWork的后续产品 Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块
- 使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,
- 可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架 Spring web mvc和Struts2都属于表现层的框架
2、SpringMVC处理流程
3、SpringMVC入门:
1. 导入springMVC相关jar包,在spring的基础上添加一个mvc的包
2. 在src/下添加springmvc.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>
3.配置前端控制器
<!-- 配置SpringMVC前端控制器 -->
<servlet>
<servlet-name>mySpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定SpringMVC配置文件 -->
<!-- SpringMVC的配置文件的默认路径是/WEB-INF/${servlet-name}-servlet.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>mySpringMVC</servlet-name>
<!-- 设置所有以action结尾的请求进入SpringMVC -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
配置web.xml文件:里面有一个可设置所有以action结尾的请求进入springMVC 还有只有设置了value值他就会进入springmvc.xml,不然会自己在web目录里面找(就找不到)
4.创建控制器
将一个类注解@Controller即为控制器,当然需要在配置文件中开启注解扫描
<context:component-scan base-package=“com.nan”/>
package com.nan.springmvc;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class MyController {
//访问first action时就会执行show方法 设置数据后跳转到另外一个jsp中
@RequestMapping("/first.action")
public ModelAndView show(){
ModelAndView modelAndView = new ModelAndView();
//请求过来后,要跳转到别个界面 往别的界面当中传一些数据都可以用modelAndView
modelAndView.addObject("name","nan");
modelAndView.setViewName("/result.jsp");//还可在这里面取出数据
return modelAndView;
}
}
在一个jsp中写一个a标签,使其跳转到控制器中的first action
<a href="${pageContext.request.contextPath}/first.action">发送请求</a>
然后在result. jsp把设置的属值性写出来,这样就可以将数据取出来
<h1>转发过来的数据=${name}</h1>
4、架构执行原理流程
组件说明
DispatcherServlet
- 前端控制器 用户请求到达前端控制器,它就相当于mvc模式中的C -
- dispatcherServlet是整个流程控制的中心
由它调用其它组件处理用户的请求 dispatcherServlet的存在降低了组件之间的耦合 性
HandlerMapping
-
处理器映射器
-
HandlerMapping负责根据用户请求url找到Handler处理器
-
springmvc提供了不同的映射器实现不同的映射方式
HandlerMapping会把找到映射返回给前端控制器
Handler
- 后端控制器
- 在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
HandlAdapter - 通过HandlerAdapter对处理器进行执行
- 处理器适配器
ViewResolver
- 视图解析器
- View Resolver负责将处理结果生成View视图
View
- springmvc框架提供了很多的View视图类型的支持,
包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
内部组件在DispatcherServlet.properties里,有HandlerMapping、HandlerAdapter、ViewResolver
视图解析器前后缀配置
假如要跳转的某一个jsp是在自定义的web目录下面,那么我们可以配置视图解析器的前后缀,首先在springmvc中添加一个bean,然后添加有关于前后缀的属性
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/myjsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
然后在控制器中添加要跳转的页面的名字,也不用加处于哪个目录,也不用加后缀
modelAndView.setViewName("nan");
5、请求与转发
先把前面关于前后缀的配置取消掉
一个小问题:当第一次加载时跳转时间很长,因为第一次在配置springmvc前端控制器:
<!--在服务器一启动时就加载-->
<load-on-startup>1</load-on-startup>
转发有两种形式
- 返回类型为ModelAndView,需要用到数据的转发
- 当不需要用到数据时,可设置返回类型为String
@RequestMapping("/second.action")
//用String作为参数是因为此转发不用到数据
public String show2(){
return "/result.jsp";
}
重定向:重新发送一次请求,浏览器做了至少两次的访问请求的,在需要重定向的方法中增加redirect:
modelAndView.setViewName("redirect:/second.action");
关于重定向与转发的区别
转发:浏览器发送http请求,web服务器接受此请求,调用内部的一个方法在容器内部完成请求处理和转发动作,将目标资源发送给客户;在这里,转发的路径必须是同一个web容器下的url,其不能转向到其他的web路径上去,中间传递的是自己的容器内的request。在客户浏览器路径栏显示的仍然是其第一次访问的路径,也就是说客户是感觉不到服务器做了转发的。转发行为是浏览器只做了一次访问请求。
重定向:客户浏览器发送http请求,web服务器接受后发送302状态码响应及对应新的location给客户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location地址,服务器根据此请求寻找资源并发送给客户。在这里location可以重定向到任意URL,既然是浏览器重新发出了请求,则就没有什么request传递的概念了。在客户浏览器路径栏显示的是其重定向的路径,客户可以观察到地址的变化的。重定向行为是浏览器做了至少两次的访问请求的