SpringMVC的实现
SpringMVC部分对应JavaWeb部分的MVC层次结构,主要负责网页层面的转发、数据传输等功能,也就是Controller层与视图层之间的调用关系,分别对其运行原理、配置文件、注解使用进行了解
一.SpringMVC的工作原理
---------第一阶段--------
0:客户端发起请求时,拦截指定请求,送至DispatcherServlet(前置控制器)
操作:在web.xml文件中配置servlet拦截到DispatcherServlet,并关联一个spring的xml文件
---------第二阶段--------
1:HandlerMapping为处理器映射器,被DispatcherServlet调用,根据URL寻找对应的Handler
2:HandlerExecution为具体的Handler(识别spring手动注册的bean或注解@RequestMapping)
3:HandlerExecution将解析后的结果返回给DispatcherServlet对象
操作:在spring.xml中配置处理器映射器,此处使用BeanNameUrlHandlerMapping映射器,根据bean的id进行匹配
---------第三阶段--------
4:HandlerAdapter为处理器适配器,执行DispatcherServlet传入的Handler
5:HandlerAdapter执行找到的Controller(此阶段是进行业务层调用的部分)
6:执行后给HandlerAdapter返回具体信息,如:ModelAndView对象
7:HandlerAdapter将返回信息传给DispatcherServlet
操作:建立需要执行的类,实现Controller接口,重写handleRequest()方法; 在方法中新建ModelAndView对象,在对象中封装数据,封装视图,返回此对象在spring中注册此类
---------第四阶段--------
8:DispatcherServlet调用视图解析器,解析ModelAndView
9:视图解析器解析出要跳转的视图名后,进行逻辑操作,最后将数据和视图返回给DispatcherServlet
10:根据返回的结果,调用对应的视图,映射对应的数据
最后:用户看到请求的页面
操作:在spring.xml中注册视图解析器,指定逻辑操作;
二.SpringMVC的配置
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--注册DispatcherServlet,拦截请求-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--关联一个springmvc配置文件springmvc-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--启动级别:1,和服务器一起启动-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--/*:使.jsp文件也会被拦截,去加上前后缀,导致页面找不到
/ :只拦截请求页面-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
spring-mvc.xml
<!--处理器映射器,用于根据URL找到对应的bean-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--处理器适配器,根据bean找到对应的类-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
<!--注册实体类bean-->
<bean id="/hello" class="com.xawl.wvc.HellowController"/>
实体类,实现Controller接口:
public class HellowController implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//ModelAndView视图和模型
ModelAndView modelAndView = new ModelAndView();
//封装对象,放在ModelAndView中
ModelAndView modelAndView1 = modelAndView.addObject("msg", "HellowController");
//封装要跳转的对象
modelAndView.setViewName("hello");//WEB-INF/jsp/hello.jsp
return modelAndView;
}
}
至此,一个简单的具有MVC功能的后端已配置完成,在建立前端JSP页面后,即可实现页面之间的跳转、数据传输。
三、注解实现
1.注解回顾
@Controller @Service @Repository @Component
//用于spring注册类,扫描包时进行注册组件
//扫描包:<context:component-scan base-package="包路径"/>
@RestController
//不走视图解析器,不进行页面跳转,返回字符串
@RequestMapping
//用于指定映射请求,可用于类、方法上
//用于类上时,类中所有方法都需嵌套映射
@PathVariable
//接收路径中占位符的值
// /path/{x}/{y} @PathVariable int x,@PathVariable int y
@Param @RequestParam
//@RequestParam 解决前台参数名称与后台接收参数变量名称不一致的问题
//@Param 为修饰参数,使得mapper.xml中的参数与后台的参数对应上,也增强了可读性
2.注解代码实现
web.xml不变,与上述一致
spring-mvc.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
https://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!-- 扫描包 -->
<context:component-scan base-package="com.xawl.controller"/>
<!--处理器映射器,处理器适配器合二为一,被整合为:-->
<mvc:annotation-driven/>
<!--过滤资源,防止css.js等资源被拦截-->
<mvc:default-servlet-handler/>
<!--视图解析器-->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!--后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
实现类:
@Controller
public class HelloMVC {
@RequestMapping("/test")
public String test(Model model){
//封装数据
model.addAttribute("name","Hello MVC");
//跳转页面
return "test";
}
}
实现了简化开发的目的