2.2 SpringMVC是什么
- Spring MVC 是 Spring 提供的一个基于 MVC 设计模式的轻量级 Web 开发框架,本质上相当于 Servlet。
- Spring MVC 角色划分清晰,分工明细。由于 Spring MVC 本身就是 Spring 框架的一部分,可以说和 Spring 框架是无缝集成。性能方面具有先天的优越性,是当今业界最主流的 Web 开发框架,最热门的开发技能
- Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
- Spring MVC 是结构清晰的 Servlet+JSP+JavaBean 的实现,是一个典型的 MVC 构架,不像 Struts 等其它框架都是变种或者不是完全基于 MVC 系统的框架。
**Spring的Web模块:**Web上下文模块建立于应用上下文模块之上,提供了一个适合于Web应用的上下文。另外,这个模块还提供了一些面向服务支持。例如:实现文件上传的multipart请求,它也提供了Spring和其它Web框架的集成,比如Struts、WebWork。
-
Spring的MVC框架是Spring为构建Web应用提供了一个功能全面的MVC框架,使用IoC对控制逻辑和业务对象提供了完全的分离,它允许你声明性地将请求参数绑定到你的业务对象中,此外,Spring的MVC框架还可以利用Spring的任何其它服务
-
Spring MVC优点
- 简单易学,灵活,轻量级,扩展性强
- 清晰地角色划分,Spring MVC 在 Model、View 和 Controller 方面提供了一个非常清晰的角色划分,这 3 个方面真正是各司其职。开发效率高
- 高效,基于请求响应的mvc框架
- 灵活的配置功能,松耦合可插拔的组件结构,可以把类当作 Bean 通过 XML 进行配置。
- 约定优于配置
- 提供了大量的控制器接口和实现类,开发者可以使用 Spring 提供的控制器实现类,也可以自己实现控制器接口。
- 功能强:注解驱动/RestFul/数据验证/格式化/本地化/国际化支持/主题
- 真正做到与 View 层的实现无关。它不会强制开发者使用 JSP,可以根据项目需求使用 Velocity、FreeMarker 等技术。
- 面向接口编程
- 与 Spring 框架无缝集成,将需要的bean注册到spring中,用的时候直接从容器中取即可。
- 使用的人、公司多
-
RestFul:url地址栏,不用?param1=xx¶m2=xx进行传参,用/分割来传参进行请求响应
-
Spring 的web框架是围绕DispatcherServlet【调度Servlet】设计。DispatcherServlet是将请求分发到不同的处理器。Spring 2.5 版本开始,Java5之后的版本新增了 Spring MVC 注解功能,用于替换传统的基于 XML 的 Spring MVC 配置
2.3 创建一个Spring MVC程序
- 步骤
普通的maven子项目,加入web框架支持转为web项目,再需要确认项目下和发布的项目中是否有lib依赖
SpringMVC配置,在 web.xml 中配置 Servlet,创建 Spring MVC 的配置文件
创建 Controller(处理请求的控制器)
创建 View,jsp
测试运行
2.3.1 SpringMVC配置
- Spring MVC 是基于 Servlet 的,DispatcherServlet 是整个 Spring MVC 框架的核心,主要负责接收请求并将其分派给相应的处理器处理。所以配置 Spring MVC,首先要配置 DispatcherServlet。跟所有 Servlet 一样,用户必须在 web.xml 中进行配置。
- web.xml 这个web版本必须时最新版本
<?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">
<servlet>
<!--配置 DispatcherServlet,是 Spring MVC 的入口 -->
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--使用 Spring 资源路径的方式进行指定,即 classpath:springmvc-servlet.xml-->
<!--这个name是源码中的参数,固定 -->
<param-name>contextConfigLocation</param-name>
<!--classpath:当前项目路径-->
<!--classpath*:所有项目路径-->
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--服务器容器启动,立刻加载Servlet-->
<!--
1、load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法);
2、当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
3、当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载;
4、正数的值越小,该servlet的优先级越高,应用启动时就越先加载;
5、当值相同时,容器就会自己选择顺序来加载。
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!--/ 匹配所有请求不包括.jsp-->
<!--/* 匹配所有请求包括.jsp-->
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!-- 处理所有URL -->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- Spring MVC 初始化时将在应用程序的 WEB-INF 目录下查找Spring MVC的配置文件,该配置文件的命名规则是“servletName-servlet.xml”,例如 springmvc-servlet.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.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/login">sysController</prop>
<prop key="/register">registerController</prop>
</props>
</property>
</bean>
<bean class="com.zk.controller.LoginController" id="sysController"/>
<bean class="com.zk.controller.RegisterController" name="registerController"/>
<!--添加处理适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--添加视图解析器,DispatcherServlet给它的ModelAndView-->
<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 MVC 的配置文件存放在应用程序目录中,但需要使用 servlet 的 init-param 元素加载配置文件,通过 contextConfigLocation 参数来指定 Spring MVC 配置文件的位置
- //不会匹配形如 .后缀 的url,而/*会, / *会将返回给用户的jsp再进行拦截,再走一遍流程若有此路径的映射方法返回的结果,可能再视图解析器这块再加一个.jsp,这样陷入了循环,无法给用户返回jsp页面,没有这样的映射方法那么直接报错
- 同样联系后面的解决乱码问题,使用/一直翻车,需要给乱码过滤器匹配一个/*
servlet容器中的匹配规则是特定的规则,不要用通配符或者正则表达式的匹配规则来看待servlet的url-pattern
Servlet 2.5开始,一个servlet可以使用多个url-pattern规则,标签声明了与该servlet相应的匹配规则,每个标签代表1个匹配规则;
当servlet容器接收到浏览器发起的一个url请求后,容器将url去掉当前应用的根路径,以剩余的字符串作为servlet映射,假如url是http://localhost:8080/appname/index.html,其应用根路径是appname,容器会将http://localhost:8080/appname去掉,用剩下的/index.html部分拿来做servlet的映射匹配
标签< url-patten >的4种规则
- 精确匹配中配置的项必须与url完全精确匹配。
<url-pattern>/com/*/hello</url-pattern> 这里的*不是通配符,是精确匹配
扩展名匹配:以“.”开头的字符串被用于扩展名匹配,
不能将路径型和扩展名型混用,要么是路径匹配(以“/”字符开头,并以“/”结尾),要么是扩展名匹配(以“.”开头),要么是精确匹配,三种匹配方法不能进行组合,不要使用通配符或正则规则。
url-pattern>/com/*.html</url-pattern> 错误,会产生IllegalArgumentException
- 路径匹配:以“/”字符开头,并以“/*”结尾的字符串用于路径匹配
< url-pattern >/*< /url-pattern >
匹配到所有的 url ,包括路径型的和后缀型的 url (包括/login,.jsp),此时需要注意静态资源了,很多静态资源都是不需要经过 Servlet 的,会造成资源浪费,此时就需要做特殊处理;
- 缺省匹配:缺省匹配url:会匹配到所有的路径。
< url-pattern >/< /url-pattern >
/*路径匹配的优先级仅次于精确匹配,所以“/*”会覆盖等级低的映射,很多404错误均由此引起,所以这是一种特别差的匹配模式,一般只用于filter的url-pattern /是servlet中特殊的匹配模式,切该模式有且仅有一个实例,优先级最低,不会覆盖其他任何url-pattern,只是会替换servlet容器web.xml中的内建default servlet ,该模式同样会匹配所有request。 配置“/”不拦截*.jsp,的原因是servlet容器tomcat的web.xml有内置的“*.jsp”匹配器,而扩展名匹配的优先级高于缺省匹配。
若使用该标签,则需要在 springmvc 配置文件中配置 静态资源映射
<!-- 资源映射 --> <mvc:resources location="/css/" mapping="/css/**"></mvc:resources> <mvc:resources location="/js/" mapping="/js/**"></mvc:resources> <mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
- url-pattern匹配优先级:精确匹配>最长路径匹配(/*)>后缀匹配(Tomcat中的web.xml默认定义了jsp的servlet)>缺省匹配(/)以上都找不到servlet,就用默认的servlet
< url-pattern >*.do< /url-pattern > 后缀型映射,推荐用法
避免对静态资源的过滤,这样也就不需要像 方法1、2 那样需要对静态资源做特殊处理。
url-pattern映射匹配过程是有优先顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了
不能将两个Servlet映射到同一个url-pattern,Tomcat会报错;
<!-- 1、welcome-file-list一般情况下只能使用静态网页,如果非要把他配置成SpringMVC的控制器URL就会报错; 2、若想使用动态网页(*.jsp),则 servlet 不能带有扩展名,否则就当成静态文件处理,即若想欢迎页面访问 *.jsp 页面,则扩展名不能有, <welcome-file>/pages/index</welcome-file> --> <welcome-file-list> <welcome-file>/pages/index.html</welcome-file> </welcome-file-list>
3.2.2 创建Spring MVC配置文件
- 在 resources目录下创建 springmvc-servlet.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">
<!-- LoginController控制器类,映射到"/login" -->
<bean class="com.zk.controller.LoginController" name="/login"/>
<!-- RegisterController控制器类,映射到"/login" -->
<!-- name="/register"不加上的话,会自动追加到项目名称后面,然后就会报404找不到,这里的/代表web项目的根目录-->
<bean class="com.zk.controller.RegisterController" name="/register"/>
</beans>
- 编写Controller,注意Controller是org.springframework.web.servlet.mvc.Controller;
- 创建 RegisterController 和 LoginController 两个传统风格的控制器类
- Controller 是控制器接口,接口中只有一个方法 handleRequest,用于处理请求和返回 ModelAndView。
public class LoginController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg","登录过程!");
mv.setViewName("/WEB-INF/jsp/login.jsp");
return mv;
}
}
public class RegisterController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg","注册过程!");
mv.setViewName("/WEB-INF/jsp/register.jsp");
return mv;
}
}
-
编写view
-
index.jsp
<%--
Created by IntelliJ IDEA.
User: CNCLUKZK
Date: 2022/6/30
Time: 17:14
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%--${pageContext.request.contextPath}尽量加上--%>
<a href="${pageContext.request.contextPath}/login" name="登录"/>登录
<a href="${pageContext.request.contextPath}/register" name="注册"/>注册
</body>
</html>
- 编写WEB-INF/jsp/login.jsp、WEB-INF/jsp/register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
登录结果:${msg}
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
注册结果:${msg}
</body>
</html>
<!--添加处理映射器-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
<!--添加处理适配器-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
<!--添加视图解析器,DispatcherServlet给它的ModelAndView-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
- 修改Controller
public class LoginController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg","登录过程!");
mv.setViewName("login");
return mv;
}
}
-
测试同样可以实现跳转和数据传输
-
可能遇到的问题:404,排查步骤
查看控制台输出,看看是缺少了jar包
若jar包存在,显示无法输出,就是再IDEA发布项目中,添加lib依赖
重启tomcat即可解决
- 部署项目中lib文件缺失,需要添加lib中的jar包
下一篇:SpringMVC-04-执行流程
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123899.html