springmvc入门使用

1.配置文件

1.1配置核心控制器-一个 Servlet

<!-- 前端控制器(加载classpath:springmvc.xml 服务器启动创建servlet) -->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 配置初始化参数,创建完DispatcherServlet对象,加载springmvc.xml配置文件 -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc.xml</param-value>
        </init-param>
        <!-- 服务器启动的时候,让DispatcherServlet对象创建 -->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

 

1.2 配置视图解析器

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/pages/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

1.3 配置监听器

<!--配置 ContextLoaderListener 用以初始化 Spring IoC 容器一>
<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class> 
</listener > 
<配置 DispatcherServlet>

ContextLoaderListener 实现了接口 ServletContextListener ,通过 Java Web 容器的 习, 我们知道 ServletContextListener 的作用是可以在整个 We 工程前后加入自定义代 码,所以可以在 Web 工程初始化之前,它先完成对 Spring IoC 容器的初始化,也可 以在 Web 工程关闭之时完成 Spring IoC 容器的资源进行释放。

1.4 配置spring mvc.xml文件

<!一使用注解驱动-->
<mvc : annotation-driven /> 
<!一定义扫描装载的包一>
<context :component-scan base-package =” com.*”/>
<!一定义视图解析器一>
<!一找到 Web 工程/WEB-INF /JSP 文件夹,且文件结尾为 jsp 的文件作为映射-->
<bean id="viewResolver" class=” org.springframework.web.servlet.view.InternalResourceViewResolver” 
p:prefix=”/WEB-INF/jsp/” p:suffix=”. jsp”/>

2.执行过程

1、服务器启动,应用被加载。读取到 web.xml 中的配置创建 spring 容器并且初始化容器中的对象
从入门案例中可以看到的是:HelloController 和 InternalResourceViewResolver,但是远不
止这些。
2、浏览器发送请求,被 DispatherServlet 捕获,该 Servlet 并不处理请求,而是把请求转发出去。转发
的路径是根据请求 URL,匹配@RequestMapping 中的内容。
3、匹配到了后,执行对应方法。该方法有一个返回值。
4、根据方法的返回值,借助 InternalResourceViewResolver 找到对应的结果视图。
5、渲染结果视图,响应浏览器。

3.核心组件

3.1 DispatcherServlet:前端控制器

用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由
它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。

3.2 HandlerMapping:处理器映射器

HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式

3.3 Handler:处理器

它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由
Handler 对具体的用户请求进行处理。

3.4 HandlAdapter:处理器适配器

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理
器进行执行。

3.5 View Resolver:视图解析器

View Resolver负责将处理结果生成 View 视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用

3.6 View:视图

SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是 jsp。一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面

3.7 mvc:annotation-driven说明

在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
使 用 <mvc:annotation-driven> 自动加载 RequestMappingHandlerMapping (处理映射器) 和
RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用
<mvc:annotation-driven>替代注解处理器和适配器的配置。
它就相当于在 xml 中配置了:
...................几个类的servlet配置

4 请求参数的绑定与乱码问题

post 请求方式:在 web.xml 中配置一个过滤器<!-- 配置 springMVC 编码过滤器 --> 
<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> 
    <!-- 启动过滤器 --> 
    <init-param> 
        <param-name>forceEncoding</param-name> 
        <param-value>true</param-value> 
    </init-param> 
</filter> 
    <!-- 过滤所有请求 --> 
    <filter-mapping> 
        <filter-name>CharacterEncodingFilter</filter-name> 
        <url-pattern>/*</url-pattern> 
    </filter-mapping>
在 springmvc 的配置文件中可以配置,静态资源不过滤:
<!-- location 表示路径,mapping 表示文件,**表示该目录下的文件以及子目录的文件 -->
<mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/images/" mapping="/images/**"/>
<mvc:resources location="/scripts/" mapping="/javascript/**"/>

get 请求方式:
tomacat 对 GET 和 POST 请求处理方式是不同的,GET 请求的编码问题,要改 tomcat 的 server.xml
配置文件,如下:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"/>
改为:
<Connector connectionTimeout="20000" port="8080"
protocol="HTTP/1.1" redirectPort="8443"
useBodyEncodingForURI="true"/>
如果遇到 ajax 请求仍然乱码,请把:
useBodyEncodingForURI="true"改为 URIEncoding="UTF-8"即可。

5.常用注解

5.1 RequestParam

作用:
把请求中指定名称的参数给控制器中的形参赋值。
属性:
value:请求参数中的名称。
required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报
示例:
public String useRequestParam(@RequestParam("name")String username                    @RequestParam(value="age",required=false)

5.2 RequestBody

作用:
用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。一般获取从前台传过来的json字符串
get 请求方式不适用。
属性:
required:是否必须有请求体。默认值是:true。当取值为 true 时,get 请求方式会报错。如果取值
false,get 请求得到是 null。
示例:public String useRequestBody(@RequestBody(required=false) String body)
这里的参数也可以传数组

5.3 PathVaribale

作用:
用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。
属性:
value:用于指定 url 中占位符名称。required:是否必须提供占位
示例:
<a href="springmvc/usePathVariable/100">pathVariable 注解</a>
@RequestMapping("/usePathVariable/{id}")public String usePathVariable(@PathVariable("id") Integer id)System.out.println(id);return "success"

Java EE 基础学习中,有时候我们会暂存数据到 HTTP request对象或者Session对象中,在开发控制器的时候,有时也需要保存对应的数据到这些对象中去,或者从中获取数据。而 Spring MVC 给予了支持,它的主要注解有 个:@RquestAttribute,@SessionAttribute,@SessionAttributes.他们的主要作用如下:

• RequestAttribute 获取在HTTP 的请求( request )对象属性值,用来传递给控制器的参数。 • SessionAttribute 在HTTP的会话( Session )对象属性值中,用来传递给控制器的参数。 • SessionAttributes 可以给它配置一个字符串数组,这个数组对应的是数据模型对应的键值对 然后将这些键值对保存到 Session 中。

5.4 @RequestAttribute

作用:获取在HTTP 的请求( request )对象属性值,用来传递给控制器的参数。
范围:一次请求中

下面两个注解和 HTTP 的会话对象有关,在浏览器和服务器保持联系的时候 HTTP 会创建一个会话对象,这样可以让我们在和服务器会话期间(请注意这个时间范围)通过它读/写会话对象的属性,缓存一定数据信息。 先来讨论一下设置会话属性,在控制器中可以使用注解@SessionAttributes 来设置对应的键值对,不过这个注解只能对类进行标注,不能对方法或者参数注解它可以配置属性名称或者属性类型。它的作用是当这个类被注解后, Spring MVC 执行完控制器的逻辑后,将数据模型中对应的属性名称或者属性类型保存到 HTTP的Session 对象中。

5.5 @SessionAttribute

作用:在HTTP的会话( Session )对象属性值中,用来传递给控制器的参数。

5.6 @SessionAttributes

作用:可以给它配置一个字符串数组,这个数组对应的是数据模型对应的键值对,然后将这些键值对保存到Session中。

6 REST 风格 URL

什么是 rest:
REST(英文:Representational State Transfer,简称 REST)描述了一个架构样式的网络系统,
比如 web 应用程序。它首次出现在 2000 年 Roy Fielding 的博士论文中,他是 HTTP 规范的主要编写者之
一。在目前主流的三种 Web 服务交互方案中,REST 相比于 SOAP(Simple Object Access protocol,简单
对象访问协议)以及 XML-RPC 更加简单明了,无论是对 URL 的处理还是对 Payload 的编码,REST 都倾向于 用更加简单轻量的方法设计和实现。值得注意的是 REST 并没有一个明确的标准,而更像是一种设计的风格。它本身 并没有什么实用性,其核心价值在于如何设计出符合 REST 风格的网络接口。
restful 的优点
它结构清晰、符合标准、易于理解、扩展方便,所以正得到越来越多网站的采用。
restful 的特性:
资源(Resources):网络上的一个实体,或者说是网络上的一个具体信息。
它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的存在。可以用一个 URI(统一
资源定位符)指向它,每种资源对应一个特定的 URI 。要
获取这个资源,访问它的 URI 就可以,因此 URI 即为每一个资源的独一无二的识别符。
表现层(Representation):把资源具体呈现出来的形式,叫做它的表现层 (Representation)。
比如,文本可以用 txt 格式表现,也可以用 HTML 格式、XML 格式、JSON 格式表现,甚至可以采用二
进制格式。状态转化(State Transfer):每 发出一个请求,就代表了客户端和服务器的一次交互过程。
HTTP 协议,是一个无状态协议,即所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,
必须通过某种手段,让服务器端发生“状态转化”(State Transfer)。而这种转化是建立在表现层之上的,所以
就是 “表现层状态转化”。具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET 、POST 、PUT、
DELETE。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
restful 的示例:
/account/1 HTTP GET : 得到 id = 1 的 account
/account/1 HTTP DELETE: 删除 id = 1 的 account
/account/1 HTTP PUT: 更新 id = 1 的 account
/account HTTP POST: 新增 account

7.重定向功能

return "redirect: ./show.do";

在 URL 重定向的过程中,并不能有效传递对象,因为 HTTP 的重定向参数是以字符串传递的。这个时SpringMVC提供了 个方法一-flash 属性,你需要提供的数据模型就是 一个RedirectAttribute ,让我们先来看看它是怎么实现的

@RequestMapping (” / addRole3 ” ) 
//RedirectAttribute 对象 Spri MVC 会自动初始化它
public String addRole3(RedirectAttributes ra , Role role) { 
    //插入角色后,会回填角色编号
    roleService.insertRole(role) ; 
    //绑定重定向数据模型
    ra addFlashAttribute (”role ”,role) ; 
    return ” redirect : ./showRoleJsoninfo2.do ”; 
}

原理:

使用addFlashAttribut 方法后, spring MVC 会将数据保存到 Session中(session在一个会话期有效),重定向后我们会将其清除,这样我们就能将其传递给下一个地址了,如图所示

 

posted @ 2019-10-30 09:43  胡庆安  阅读(193)  评论(0编辑  收藏  举报