先看实例:有疑问下面统一分析。
一:依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>11</java.version>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.13.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
二: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">
<!--配置DispathServlet,这个是springMVC的核心:请求分发器,前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 要绑定spring的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-servlet.xml</param-value>
</init-param>
<!-- -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--在springMVC中,
/:只会匹配所有的请求,不会匹配jsp页面
/*:匹配所有的请求,包括jsp页面-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
三: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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd ">
<!--处理器映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!-- 处理器适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!-- DispatherServlet调用 视图解析器,ds给的MV都会经过下面这里
它做了什么?
1,获取了modelandView中的数据,2,解析MV的视图名字,3,拼接视图名字,找到对应的视图,4,将数据渲染到这个视图上面-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--前缀-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<!-- 后缀-->
<property name="suffix" value=".jsp"/>
</bean>
//这个处理器(BeanNameUrlHandlerMapping)需要用到bean,以后可能不用这个处理器了
<bean id="/hello" class="com.kuang.controller.HelloController"/>
</beans>
四:控制器
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 httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mv=new ModelAndView();
String result="Hellospringmvc";
mv.addObject("msg",result);
mv.setViewName("hello");
return mv;
}
}
注意不成功的话可能是jar包没有在lib中。
实例二:注解开发
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">
<!--配置DispathServlet,这个是springMVC的核心:请求分发器,前端控制器-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 要绑定spring的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!-- -->
<load-on-startup>1</load-on-startup>
</servlet>
<!--在springMVC中,
/:只会匹配所有的请求,不会匹配jsp页面
/*:匹配所有的请求,包括jsp页面-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
核心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">
<!--自动扫描包,让指定包下的注解生效,有IOC容器管理
上面是是自己手动配置的,这里直接把包扫描,让注解生效即可-->
<context:component-scan base-package="com.kuang.controller"/>
<!--资源过滤的-->
<mvc:default-servlet-handler />
<!--原先要配置映射器和适配器,开启注解后就不用了,下面这一段代码就是帮我们把他们两个自动注入-->
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
支持注解驱动:
在spring中一般采用@Requestmapping注解来完成映射关系
要想使它生效,
必须向上下文中注册DefaultAnnotationHandlermapping
和一个AnnotationMethodHanderAdapter实例
这两个实例分别在类级别和方法级别处理
而annotation-driven配置帮助哦们自动完成上述两个实例的注入。
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class helloController {//上面注解表示被spring装配
@RequestMapping("/hello")
public String hello(Model model){
//封装数据
model.addAttribute("msg","hello,world");
return "hello";//会被视图解析器处理
}//如果是多个映射,就多写几个方法(把hello方法复制),加上url路径就好了。
}
package com.kuang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Controller
public class moduletest01 {
@RequestMapping("/m1/t1")
public String test01(HttpServletRequest request, HttpServletResponse response){
HttpSession session=request.getSession();
System.out.println(session.getId());
return "hello";
}
}
@Controller代表这个类会被spring接管,被这个注解的类,中的所有的方法,如果返回值是string,并且有具体的体面可以跳转,那么接会被视图解析器所解析:
@requestMapping最好写在方法上面, 他是映射的地址
通过接口编写:要继承接口,在xml文件中配置bean。缺点,每一个控制器都要写一个bean
通过注解:编写注解类,在xml文件中开启注解即可,优点,在同一个包中直接扫描。,还有就是适配器和映射器不用写了。
这一段配置文件默认在pom.xml中加上
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
小结:
实现的步骤:
- 创建一个web项目
- 导入相关的jar包
- 编写web.xml注册DispatherServlet
- 编写springmvc核心配置文件
- 接下来就是去创建对应的控制类controller
- 最后完善前端视图和controller之间 的对应
- 测试运行调试
使用springmvc必须配置的三大件:
处理器映射器,处理器适配器,视图解析器
通常:我们需要手动配置视图解析器,二处理器映射器和处理器适配器只需要开启注解驱动即可,而省去大段的xml配置
下面是个人笔记,仅供参考:
mvc:模型(dao,service),视图(jsp),控制器(Servlet)
spring的web框架围绕DispatherServlet设计,他的作用是将请求分发到不同的处理器。
springMVC框架想许多其他的MVC框架一样,以请求为例,围绕一个中心Servlet分派请求及提供其他功能,DispatherServlet实际是一个Servlet(它继承自HttpServlet基类)
简要分析执行流程:
DispatherServlet表示前置控制器,是整个sprignMvc的控制中心,用户发出请求,它接收请求并拦截请求。
请求路径分为三部份,服务器域名,web站点(项目名),控制器(对应的servlet)
HanderMapping为处理器映射,由DS调用,HM根据请求url查找Hander.
HE将解析后的信息传递给DispatherServlet,如解析控制器映射等
ds调用处理器适配器
HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler,
Handler让具体的Controller执行
Controller将具体的执行信息返回给HandlerAdapter,如ModelAndview
HA将视图逻辑名或模型传递给DS
DS调用视图解析器(ViewResolver)来解析HA传递的逻辑视图名
视图解析器将解析的逻辑视图名传给DS
DS根据视图解析器解析的视图结果,调用具体的视图
最终视图呈现给用户。
小结:springmvc是spring框架的一部分,是基于Java实现MVC的轻量级web框架。
底层还是一个servlet。