一、SpringMVC

1.SpringMVC概述

1.1 SpringMVC的历史

  • SpringMVC 它可以称为一个解决 JavaEE 开发的 B/S 架构项目的表现层的 MVC 的框架。其实在 SpringFramework项目中只是一个子模块而已,最开始在SpringFramework项目中没有SpringMVC子模块,在一段时间里慢慢发展起来解决表现层业务逻辑的时候,才有了Springmvc 这样的子模块是在 SpringFramework项目中基于(AOP IOC 为基础发展起来的),Springmvc 模块应该依赖 ioc 以及 aop。

  • Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。

1.2. Springmvc是什么?

Springmvc 也是一个类似于struts2框架的基于MVC 设计模式的表现层框架

1.2.1JAVAEE 开发应用采用经典的三层架构

  • 表现层:完成跟客户端进行数据交互的, 处理数据以及模型跳转的。
  • 业务逻辑层:完成数据针对需求进行数据加工作处理
  • 数据访问层(持久层): 完成对数据的持久化到数据库提供操作对象

1.2.2 MVC 设计模式 没在Java 23种设计模式中

  • Model(模型):数据模型(POJO)以及业务模型(Service层中)
  • View(视图):模型渲染、填充模型数据用 Jsp 、 pdf 、freemarker
  • Controller(控制器):Filter、Servlet作为中央控制器

2. SpringMVC 第一个程序

2.1 pom 文件配置 (导包)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.xingxue.springmvc</groupId>
    <artifactId>springmvc-demo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>
        <!-- 导入 springmvc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.0.4.RELEASE</version>
        </dependency>


        <!-- 导入 servlet 相关依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.0.1</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.2.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <!-- 最小支持的 编译版本 -->
                    <target>1.7</target>
                    <!-- 1.7 编译源码 -->
                    <source>1.7</source>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.2 配置 web.xml (应用的描述文件),服务器启动的时候,要去读

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                               http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">

    
    <!-- 
        mvc 框架 都有两种控制器:
            1.前端控制器 (框架提供) StrutsPrepareAndExectuteFilter (Filter ) 、 DispatcherServlet (Servlet)
            2.页面控制器(程序员自己定义) UserAction、RoleAction...... 、 UserController、RoleController
                (Action Contoller  Handler)
                
        Filter  vs  Servlet 区别:
            相同点:都可以处理http 请求:
            Filter : public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            Servlet:public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
            
            不同点:Filter 功能要比 Servlet 强大。  FilterChain chain 实现请求预处理
     -->
     
     
    <servlet>
        <!-- DispatcherServlet 组件在init 初始化的时候,会去读取 mvc 配置文件 -->
        <servlet-name>springDispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:mvc.xml</param-value>
        </init-param>
        <!-- Servlet 组件创建的时候是在第一次请求来的时候才会创建,配上下面可以使 Servlet 组件在应用启动的时候就被创建 -->
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>springDispatcherServlet</servlet-name>
        <!-- Tomcat 有一个  rg.apache.catalina.servlets.DefaultServlet 默认拦截  / ,可以处理静态数据(html css js...)
             DispatcherServlet 前端控制器 配置上  / 也就覆盖了DefaultServlet
             
             如果不配,就使用不了Spring mvc 提供的 restFul 风格的网络资源架构
                restFul :不是一种技术实现,它是一种网络资源架构规则
        -->
        <url-pattern>/</url-pattern>
    </servlet-mapping>
</web-app>

2.3 开发 Controller 控制器

//页面控制器
@Controller
public class UserController {
    
    @RequestMapping(value="/hello")
    public String hello() {
        System.out.println("请求来了...");
        return "ok";
    }

}

2.4 mvc.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:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        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-4.0.xsd">

<!-- 静态资源处理 -->
<mvc:default-servlet-handler/>
<context:component-scan base-package="com.xingxue"></context:component-scan>
<mvc:annotation-driven/>

<!-- 内部资源视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>
</beans>

3. @RequestMapping 请求映射注解

  • 该注解用于映射请求 是通过 该注解的 value 属性来映射。
  • 该注解可以修饰在类上,也可以修饰在方法上:如果修饰在类上会自动在每个方法的url路径上加上类上的前缀
  • 该注解可以使用 method 属性来映射 请求方式
  • 该注解可以使用params 属性来映射 请求携带的参数

总结 : RequestMapping 注解中的 value 属性用来映射 url,method属性用于映射请求方式,params 属性用于 映射 请求携带的参数

4.Springmvc 处理请求流程

图片.png

1.页面发出请求到 dispatcherServlet中央控制器进行处理
2.中央控制器调用 处理器映射器 HandelMapping 查询 Handel
3.处理器映射处理完毕后,返回Handel 以及 HandelExcutionChain(拦截器链)
4.中央控制器调用 处理器适配器 执行Handle
5.处理适配器调用真正的Handel执行
6.Handle执行完毕后,返回ModelAndView
7.处理器适配器ModelAndView返回给中央控制器
8.中央控制器调用视图解析器查询具体的View
9.视图解析器返回真正的View 地址
10.中央控制器调用View 执行 数据模型的 渲染
11.响应请求

总结:

  • 玩 springmvc 要配置好 一中心(dispatcherServlet) 三器(HandelMapping、 HandelApater 、 ViewResoler)但是一中心要在web.xml 文件配置 、 三器没有特殊需求的时候可以不配,三器在springmvc 配置文件中配置,但是视图解析器要显示去配置一下(原因视图的位置将来不确定)
  • 为什么三器不用配置:前端控制器dispatcherServlet 在创建完成后会自动加载dispatcherServlet.properties 文件,在该文件中就已经配置了相应的三器的实现,如果在springmvc.xml 配置文件中显示的配置了默认的三器,就会覆盖默认的配置
  • 程序员:只需要编写View Handel

5.@RequestParam映射请求参数

  • 该注解用于映射请求参数

  • 该注解中的value 属性 用于匹配http 请求过来的参数的名字

  • 该注解中的required 属性用于限定请求是否必须携带参数,默认是true

  • 注解中的defaultValue 属性用于没有携带请求参数的时候,给方法变量赋默认值

  • 可以利用 Controller 动作类方法的签名的方式来获取请求参数值,保证页面参数的名称要跟方法中的形参名称一致,如果方法形参为POJO 类型,要保证页面参数的名称要跟方法中形参POJO中的属性名称一致,满足以上规则可以接收页面数据

  • 处理页面数据中文乱码问题
    在 web.xml 应用描述文件中配置

    <!-- 引入spring 提供的 POST 提交方式的中文乱码过滤器 :注意一点 提供的 中文乱码过滤器只能处理 POST -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
  • RestFul风格的模板URL 携带参数方式:方便后期做网站的SEO优化
    获取模板参数使用 @PathVariable
@RequestMapping(value="m4/{id}",method=RequestMethod.GET)
public String m4 (@PathVariable(value="id") String id) {
    System.out.println(id);
    return "ok";
}
  • forward指令和redirect指令

forward指令:可以实现视图的转发以及动作的转发
redirect 指令:可以实现视图的重定向以及动作的重定向

指令的格式:
forward:/xxx.jsp
redirect :/xxx.jsp
如果Handler 方法执行完毕后返回的字符串带有forward 或者redirect ,视图解析器就会另外处理,不会在返回的字符串前后加前缀和后缀

6.Springmvc 提供的隐式对象

  • 隐式对象:不需要程序员自己创建的对象,springmvc 自动会创建的对象。拿来就使用
  • 框架提供的隐式对象:ModelAndView 、 Model 、 ModelMap 、 Map ,HttpServletRequest、HttpServletResponse等对象可以把数据放入到模型中,自动的放入到请求域中
    扩展:
    框架还可以自动注入 HttpSession 、 HttpServletRequest 、 HttpServletResponse 等
  • 利用 框架提供的 隐式对象来完成数据向页面传递
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容