springMVC
初始搭建springMVC
前置控制器(DispatchServlet)初识:配置在web.xml文件中的
截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步。
Resource文件夹下spring xml文件配置
1.处理器映射器(HandlerMapping):
前端控制器把请求转发给处理器映射器。处理器映射器根据请求中的URL,找到对应的Handler(相当于struts2的Action),返回给前端控制器。
2.处理器适配器(HandlerAdapter):
前端控制器知道要执行哪个Handler,但是它只是把信息转发给处理器适配器,处理器适配器调用程序写好的Handler,Handler执行完,返回一个ModelAndView对象给适配器,处理器适配器再把这个对象返回给前端控制器
处理器(Handler):
编写handler按照适配器的规则来编写,比如实现哪个接口,这样适配器才可以正确执行handler
3.视图解析器(View resolver):
前端控制器会把逻辑视图发送给视图解析器请求解析,视图解析器处理后返图物理视图(view)给前端控制器
视图view:
前端控制器请求进行视图渲染,把model数据填充到request域,返回视图(jsp、html等)
前端控制器把视图响应返回给用户
springMVC工作流程图
DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派.
配置DispatchServlet
在web.xml配置
<!-- 配置DispatchServlet DispatchServlet: 这个是SpringMVC的核心;请分发器,前控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- DispatchServlet要绑定的Spring配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:XX</param-value>
</init-param>
<!-- DispatchServlet 启动级别:1 在服务器启动时启用DispatchServlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--
在SpringMVC中 /、/*
/: 只匹亮所有的请求但不会去匹配jsp页面
/* : 匹配所有的请求,包括isp页面
-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
1.通过implements Controller接口方式实现控制层
1.DispatchServlet绑定的Resource文件夹下spring 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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 处理器映射器 BeanNameUrlHandlerMapping 根据url匹配bean的name找到处理器
BeanNameUrlHandlerMapping映射规则是:将bean的name/id作为url进行查找,需要在配置Handler的时候指定beanname(url)。
-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- controller 通过url要访问的接口要通过springIOC交给spring容器统一管理 -->
<bean id="/hello" class="com.lzq.controller.HelloController"/>
<!-- 处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- 视图解析器:-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!-- jsp视图前缀 试图前后缀指jsp文件web下的的路径 jsp文件在web文件下的不含文件名前面的路径-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- jsp视图后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2.控制层controller代码实现方式
package com.lzq.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 HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView modelAndView = new ModelAndView();
//控制类接口下的业务
String message = "Hello Spring MVC";
modelAndView.addObject("message", message);
//视图跳转
modelAndView.setViewName("index");//跳转到index.jsp页面
return modelAndView;
}
}
2.通过注解方式实现控制层
1.DispatchServlet绑定的Resource文件夹下spring 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 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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 自动扫描包 指定包下注解实现 依赖注入后由springIOC统一管理-->
<context:component-scan base-package="com.lzq.controller"/>
<!-- 让Spring MVC不处理静态资源-->
<mvc:default-servlet-handler/>
<!--
支持mvc注解驱动
在spring中一般来用@RequestMapping注解来完成映射关系 实现处理器适配器、处理器映射器功能
要想使@RequestMapping注解生效必须上下文中注册DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter
两个实例分别在类级别和方法级别处理
annotation-driven 配置帮助我们自动完成上述两个实例的注入
-->
<mvc:annotation-driven/>
<!-- 视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--视图前缀:jsp文件在web文件下的不含文件名前面的路径-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 视图后缀:视图文件后缀-->
<property name="suffix" value=".jsp"/>
</bean>
</beans>
2.控制层controller代码实现方式
package com.lzq.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping("/helloSpringMvc")
public String helloSpringMvc(Model model) {
//业务逻辑
String message = "你好springMVC";
//添加视图模型数据
model.addAttribute("message", message);
/**
* 视图前缀:jsp文件在web文件下的不含文件名前面的路径<property name="prefix" value="/WEB-INF/jsp/"/>
* 确保跳转的视图页面存在语配置的前缀路径文件夹下
*/
return "index";//指向要跳转的视图
}
}