SpringMVC — 前提
前提了解:Web 开发中的一些概念
-
JavaBean规范
- 必须是一个公共类,如:public class User{ }
- 必须有一个空的构造器
- 类的成员变量是私有,如:private int id;
- 通过 getter / setter 来访问属性
-
在软件体系架构中,分层式结构最常见,微软推荐的分层式结构为三层:数据访问层、业务逻辑层 ( 领域层 )、表示层
-
数据访问层 ( DAL ):面向数据库,数据的添删改查。
-
业务逻辑层 ( BLL ):面向业务逻辑,对数据层的操作、对数据业务逻辑处理。
-
表示层 ( UI ):面向用户,通俗讲就是展现给用户的界面。
-
-
对应关系
-
数据访问层 ( DAL ) --> Dao
-
业务逻辑层 ( BLL ) --> Service
-
表示层 ( UI ) --> HTML、JSP
-
Servlet 的 url-pattern 匹配规则
-
注解方式:似先前常用 servelt 将功能映射到 web 前端
- @WebServlet(“/xxx”) .... extends HttpServlet
-
web.xml 配置:
<!-- 一、 Servlet的url-pattern匹配规则——前提 --> <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>com.qut._20.MyServlet</servlet-class> </servlet>
-
精准匹配
<!-- 1、精确匹配1 --> <servlet-mapping> <servlet-name>MyServlet</servlet-name> <url-pattern>/MyServlet</url-pattern> // “/MyServlet”时会根据MyServlet匹配到上面的class类 </servlet-mapping>
-
增加路径
<url-pattern>/a/b/MyServlet</url-pattern>
-
加路径加扩展名
<url-pattern>/a/b/MyServlet.do</url-pattern>
-
路径匹配,只要是 /a/b 下的所有都可以访问
<url-pattern>/a/b/*</url-pattern>
-
扩展名匹配,do 结尾的任意 url 都可访问
<url-pattern>*.do</url-pattern>
-
缺省匹配,任何无扩展名路径来都能匹配上
<url-pattern>/</url-pattern>
-
-
注意 / 与 /* 的区别
<url-pattern>/</url-pattern>
只匹配 /login,不匹配 *.jsp 这样的后缀型 url ( 静态资源也会被拦截 )< url-pattern>/*</url-pattern>
匹配所有 url,即 /login,* .jsp,* .js,* .html 等 ( 所有都拦截 )- 为放行静态资源,xml 需要加上:
<mvc:default-servlet-handler/>
放行静态资源的配用
SpringMVC 原理
- 用户发送请求 -> DispatcherServlet ( 前端控制器 )
- 前端控制器作为统一访问点,进行全局流程控制:收到请求后委托给其他解析器进行处理
- DispatcherServlet -> HandlerMapping ( 处理器映射器 ) —— url 到 controller
- 处理器映射器把请求映射为 HandlerExecutionChain 对象,方便添加各种新的映射策略,HandlerExecutionChain 包含一个 Handler 处理器、多个 HandlerInterceptor 拦截器
- DispatcherServlet -> HandlerAdapter ( 处理器适配器 )
- 处理器适配器使用适配器设计模式,把处理器包装为适配器,支持多种类型的处理器
- HandlerAdapter -> 处理器 —— 具体到 RequestMapping 方法
- HandlerAdapter 根据适配的结果,调用处理器,完成处理功能,返回一个 ModelAndView 对象
- DispatcherServlet -> ViewResolver ( 视图解析器 ) —— 返回字符串,得到的是一个页面
- 视图解析器把逻辑视图名解析为具体的 View,通过这种策略可以很方便的更换其他图技术
- DispatcherServlet -> View ( 视图 ) —— 页面
- 视图把传进来的 Model 模型数据进行渲染,该 Model 是一个 Map 数据结构,因此很容易支持其他视图技术
- 由 DispatcherServlet 返回响应给用户,到此一个流程结束
- 主要是写好处理器,其实 mvc 可看做就是一个功能强大的 servlet
SpringMVC 开发
-
加 jar 包:spring-context ( 一带四 ccbe ) + spring-webmvc
-
xml:xmlns + xsi —— mvc
-
想让 web 读配置文件 —— springmvc 的前端控制器编写
<!-- web.xml 中配置 DispatcherServlet ( SpringMVC 的前端控制器 ) --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- value:自己配置文件 xml所在 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:8_springMVC.xml</param-value> </init-param> <!-- 随web服务器启动,单实例多线程 --> <load-on-startup>1</load-on-startup> </servlet> <!-- 做映射(缺省匹配) --> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <!-- 匹配 / 开头的进行拦截,包括静态资源,从而做处理(处理器、映射器),不匹配*.jsp这样有扩展名的后缀型url,如果不拦截的话就不会有后面处理器的操作了 --> <url-pattern>/</url-pattern> </servlet-mapping>
-
注意:如果打开了 tomcat,在 jsp 里点击网页没法直接打开,就把 web.xml 第一行替换为
<?xml version="1.0" encoding="utf-8" ?>
- WEB-INF 里的资源不能通过浏览器直接访问 —— 可以内部跳转:转发、mv.setViewName
-
处理器配置
-
xml 的 bean 中 class 指定 MyController 类,name 为 url 被访问的路径 ( 映射 url ),如:
<bean id="myController1" class="com.qut._20.controller.MyController1" name="/hello1"></bean>
—— 前端用超链接<a href = "hello"></a>
-
F1:MyController 类 implements Controller {
方法返回值 ModelAndView {
ModelAndView mv = new ModelAndView();
mv.setViewName ( “ 路径字符串,各层用 / 隔开 ”);
return mv;
}
} —— ModelAndView 既能包含数据,还能告诉你访问哪个页面
-
F2:MyController 类 implements HttpRequestHandler {
void 方法含参 HttpServletRequest HttpServletResponse {
httpServletRequest.getRequestDispatcher("WEB-INF/jsp/2.jsp").forward(req, res);
}
}
-
-
F3 ( 推荐 ):
-
xml 内配置
<!-- 1. 扫描包 --> <context:component-scan base-package="com.qut._20"></context:component-scan> <!-- 2. 用来支持RequestMapping等mvc注解 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 3. 默认情况下对静态资源不做拦截,放行jsp --> <mvc:default-servlet-handler/>
-
类前使用注解:@Controller
-
@RequestMapping ( “/被请求的url” ) —— 映射 url,被扫描到后自动创建 bean —— 于某方法前,方法里写具体操作
如果置于类前,如:@RequestMapping ( value=“/controller1” )。则访问为两层:/controller1/被请求的url
-
写字符串 url 时:/ 斜线开头表示根目录
-
-
代码
- 前端控制器 + 处理器配置的第三种方式