SpringMVC知识 day02 常用注解&响应数据&文件上传

一、常用注解

1.1 RequestParam 

1.1.1 使用说明

作用: 把请求中指定名称的参数给控制器中的形参赋值。 

属性: 

        value:请求参数中的名称。 

        required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。

1.1.2 使用示例

1.2 RequestBody 

1.2.1 使用说明 

作用: 

        用于获取请求体内容。直接使用得到是 key=value&key=value...结构的数据。         get 请求方式不适用。 

属性: 

        required:是否必须有请求体。默认值是true。当取值为 true 时,get 请求方式会报错。如果取值为false,get 请求得到是 null。

1.2.2 使用示例

1.3 PathVaribale 

1.3.1 使用说明 

作用: 

        用于绑定 url 中的占位符。例如:请求url中/delete/{id},这个{id}就是url占位符。是springmvc 支持 rest 风格 URL 的一个重要标志。 

属性: 

        value:用于指定 url 中占位符名称。 

        required:是否必须提供占位符。

1.3.2 使用示例

1.3.3 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 用来删除资源。

1.3.4 基于 HiddentHttpMethodFilter 的示例

        作用: 由于浏览器 form 表单只支持 GET 与 POST 请求,而 DELETE、PUT 等 method 并不支持,Spring3.0 添 加了一个过滤器,可以将浏览器请求改为指定的请求方式,发送给我们的控制器方法,使得支持 GET、POST、PUT 与 DELETE 请求。         

        使用方法: 

                       第一步:在 web.xml 中配置该过滤器。 

                       第二步:请求方式必须使用 post 请求。 

                       第三步:按照要求提供_method 请求参数,该参数的取值就是我们需要的请求方式。

1.4 RequestHeader

1.4.1 使用说明 

作用: 用于获取请求消息头。 

属性: value:提供消息头名称 

           required:是否必须有此消息头

注: 在实际开发中一般不怎么用。

1.5 CookieValue

1.5.1 使用说明 

作用: 用于把指定 cookie 名称的值传入控制器方法参数。 

属性: value:指定 cookie 的名称。 

           required:是否必须有此 cookie。

1.5.2 使用举例:

1.6 ModelAttribute

1.6.1 使用说明 

作用: 

           该注解是 SpringMVC4.3 版本以后新加入的。它可以用于修饰方法和参数。 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。 

           出现在参数上,获取指定的数据给参数赋值。 

属性: 

           value:用于获取数据的 key。key 可以是 POJO 的属性名称,也可以是 map 结构的 key。 

应用场景: 

            当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。 

            例如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为 null,此时就可以使用此注解解决问题。

1.7 SessionAttribute

1.7.1 使用说明 

作用: 用于多次执行控制器方法间的参数共享。 

属性: value:用于指定存入的属性名称 

           type:用于指定存入的数据类型。

二、响应数据和结果视图

2.1 返回值分类 

2.1.1 字符串

2.1.2 void

Servlet 原始 API 可以作为控制器中方法的参数: @RequestMapping("/testReturnVoid") 

public void testReturnVoid(HttpServletRequest request,HttpServletResponse response) throws Exception { } 

在 controller 方法形参上可以定义 request 和 response,使用 request 或 response 指定响应结果: 

1、使用 request 转向页面,如下:

request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response); 

2、也可以通过 response 页面重定向: response.sendRedirect("testRetrunString") 

3、也可以通过 response 指定响应结果,例如响应 json 数据: response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); response.getWriter().write("json 串");

2.1.3 ModelAndView

ModelAndView 是 SpringMVC 为我们提供的一个对象,该对象也可以用作控制器方法的返回值。

示例代码:

@RequestMapping("/testReturnModelAndView") 

public ModelAndView testReturnModelAndView() { 

        ModelAndView mv = new ModelAndView(); 

        mv.addObject("username", "张三"); 

        mv.setViewName("success"); 

        return mv; 

}

2.2 转发和重定向

2.2.1 forward 转发

controller 方法在提供了 String 类型的返回值之后,默认就是请求转发。我们也可以写成:

@RequestMapping("/testForward") 

public String testForward() { 

        System.out.println("AccountController 的 testForward 方法执行了");

       return "forward:/WEB-INF/pages/success.jsp"; 

}

注意:如果用了formward:则路径必须写成实际视图url,不能写逻辑视图。 

它相当于“request.getRequestDispatcher("url").forward(request,response)”使用请求 转发,既可以转发到 jsp,也可以转发到其他的控制器方法。

2.2.2 Redirect 重定向

2.3 ResponseBody 响应 json 数据

2.3.1 使用说明 

作用: 该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据,如:json,xml 等,通过Response响应给客户端

2.3.2 使用示例

需求: 使用@ResponseBody 注解实现将 controller 方法返回对象转换为 json 响应给客户端。 

前置知识点: Springmvc 默认用 MappingJacksonHttpMessageConverter 对 json 数据进行转换,需要加入 jackson 的包。

jsp 中的代码:

控制器中的代码:

三、SpringMVC 实现文件上传

3.1 文件上传的回顾

3.1.1 文件上传的必要前提

3.1.2 文件上传的原理分析

3.1.3 借助第三方组件实现文件上传

3.2 springmvc 传统方式的文件上传

3.2.1 说明

传统方式的文件上传,指的是我们上传的文件和访问的应用存在于同一台服务器上。 并且上传完成之后,浏览器可能跳转。

3.2.2 实现步骤

3.2.2.1 第一步:拷贝文件上传的 jar 包到工程的 lib 目录

3.2.2.2 第二步:编写 jsp 页面

3.2.2.3 第三步:编写控制器

3.2.2.4 第四步:配置文件解析器

3.3 springmvc 跨服务器方式的文件上传

3.3.1 分服务器的目的

在实际开发中,我们会有很多处理不同功能的服务器。例如: 

        应用服务器:负责部署我们的应用 

        数据库服务器:运行我们的数据库 

        缓存和消息服务器:负责处理大并发访问的缓存和消息 

        文件服务器:负责存储用户上传文件的服务器。

分服务器处理的目的是让服务器各司其职,从而提高我们项目的运行效率。

3.3.2 准备两个 tomcat 服务器,并创建一个用于存放图片的 web 工程

3.3.3 拷贝 jar 包

3.3.4 编写控制器实现上传图片

3.3.5 编写 jsp 页面

3.3.6 配置解析器

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容