流程图(面试用):
概念
当要实现在Spring框架下的web服务时,那么servlet将无法兼容(因为Spring无法依赖注入到Servlet).
因此将会通过SpringMVC来替代servlet,从而提供WEB服务.
也就是说,在今后的实际开发中,servlet不会被常用.
准备
配置Jar包
<!--Spring坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--SpringMVC坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--Servlet坐标-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--Jsp坐标-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.0</version>
<scope>provided</scope>
</dependency>
<!-- 导入jackson坐标 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
应用
步骤一:创建并配置application文件
建立一个xml文件,通俗名称为’applicationContext.xml’
如果你是普通模式,那么在src目录下建立;
如果你是Maven模式,那么在resources目录下建立
创建好后,进行配置.
格式:
<!--Spring的监听器
是Sprign的三大组件之一,用于Web开发
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!--指定包路径-->
<context:component-scan base-package="包路径">
<!-- 排除'Controller'注解,因为这个注解是用于springMvc的,而不是用于Spring的.否则会冲突 -->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
列如:
<!--Spring的监听器
是Sprign的三大组件之一,用于Web开发
-->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context:component-scan base-package="cn.apply">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"></context:exclude-filter>
</context:component-scan>
步骤二.配置springmvc文件
建立一个xml文件,通俗名称为’springmvc.xml’
如果你是普通模式,那么在src目录下建立;
如果你是Maven模式,那么在resources目录下建立
格式:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置并规定SpringMvc的注解扫描范围 因为SpringMVC只扫描自己的Controller,不然会报错-->
<context:component-scan base-package="要被应用到SpringMVC的包路径"/>
</beans>
步骤三.通过web.xml配置核心控制器
在web.xml文件中配置SpringMVC的核心控制器
格式:
<servlet>
<servlet-name>自定义SpringMVC控制器名称</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定SpringMvc配置文件的文件名(resources路径下) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:SpringMVC的配置文件名</param-value>
</init-param>
<!--让前端控制器随着项目的启动而加载-->
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>自定义SpringMVC控制器名称</servlet-name>
<!-- 指定控制器要过滤的路径 单单一个斜杠'/'表示拦截除jsp以外的访问 如果是斜杠和星号'/*'则表示拦截所有访问 -->
<url-pattern>自定义控制器要过滤的路径</url-pattern>
</servlet-mapping>
列如:
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定SpringMvc配置文件的文件名(resources路径下) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--让前端控制器随着项目的启动而加载-->
<load-on-startup>2</load-on-startup>
</servlet>
<!-- 指定控制器要过滤的路径 单单一个斜杠'/'表示拦截除jsp以外的访问 如果是斜杠和星号'/*'则表示拦截所有访问 -->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
步骤四.将普通类声明为WEB类
将一个类声明为WEB类,这样就可以让SpringMVC将其当作WEB类应用
声明位置必须在类的文件头
格式:@Controller
步骤五.声明虚拟路径
应用方式一:声明在类文件头
格式:@equestMapping("/自定义虚拟路径")
,代表它是一个父级路径
应用方式二:声明在方法上面
表示该方法对应着一个虚拟路径,访问该虚拟路径,将会触发该方法
格式
@RequestMapping("/自定义虚拟路径名")
public String 自动方法名(){
return "/自定义被转发或重定向的链接路径";
}
列如:
@RequestMapping("/wangzhanone")
public String webone(){
System.out.println("执行one~~~~");
return "/url.jsp";
}
扩展(了解)
SpringMVC组件解析
前端控制器:DispatcherServlet
DispatcherServlet 是SpringMVC整个流程控制的中心,用户的所有请求,都需要先到达前端控制器
处理器映射器:HandlerMapping
HandlerMapping负责根据用户请求路径,找到该路径对应的执行流程
处理器适配器:HandlerAdapter
拿到请求路径对应的"执行流程"后,HandlerAdapter负责调用对应的方法进行执行.
处理器:Handler
负责真正的执行方法
视图解析器:View Resolver
负责处理"方法执行之后的结果",特别是跳转页面,由视图解析器负责处理要跳转的页面
视图:View
页面
RequestMapping注解解析
作用
RequestMapping: 用于设置方法的请求路径, 当浏览器的请求路径符合要求的时候,执行对应的方法
属性:
value:用于指定请求的URL。它和path属性的作用是一样的
method:用于指定请求的方式
位置:
@Controller
@RequestMapping("/page") //类的访问路径
public class PageController {
@RequestMapping("/show") //方法的访问路径
public String show(){
return "/success.jsp";
}
//如果类上没有RequestMapping, 则该方法的请求路径是 "/show"
//如果类上也有RequestMapping, 则该方法的请求路径是 "/page/show"
}
页面跳转(视图解析器)
在SpringMVC的Controller中, 有时候返回值会有重复性内容, 这个时候, 我们可以把返回值中重复部分提取, 那这个就是SpringMVC的前端控制器
案例
**配置"视图解析器"之前代码: **
@RequestMapping("/show02")
public String show02(){
return "/jsp/aaa.jsp";
}
@RequestMapping("/show03")
public String show03(){
return "/jsp/bbb.jsp";
}
抽取"视图解析器"
在Springmvc.xml中配置
<!--配置内部资源视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--前缀(前边重复性内容)-->
<property name="prefix" value="/jsp/"></property>
<!--后缀(后边重复性内容)-->
<property name="suffix" value=".jsp"></property>
</bean>
配置视图解析器后的Controller代码
@RequestMapping("/show02")
public String show02(){
return "aaa";
}
@RequestMapping("/show03")
public String show03(){
return "bbb";
}
注意事项
当一个项目配置了"视图解析器"之后, 所有Controller方法的返回值, 都会被"视图解析器"解析.
@RequestMapping("/show01")
public String show01(){
return "/success.jsp";
//如果项目配置了上边的"视图解析器",则当前方法的返回值,会被自动解析为"/jsp/success.jsp.jsp"
}
**解决方案: **
如果想让方法的返回值不被"视图解析器"解析, 则可以在返回值之前,加上"forward"或者"redirect"前缀
@RequestMapping("/show01")
public String show01(){
return "forward:/success.jsp"; //转发到success.jsp, 并且不允许视图解析器解析
//return "redirect:/success.jsp"; //重定向到success.jsp, 并且不允许视图解析器解析
}