SpringMVC服务端返回数据

下面介绍controller向jsp页面传递数据的几种方式

请求转发

1.在学习MVC之前,用request的setAttribute方法传递数据

@RequestMapping("/response")
public ModelAndView sendData01(HttpServletRequest request) {
    ModelAndView mav = new ModelAndView("result");
    request.setAttribute("user_name", "清雅轩");
    return mav;
}                                                           

在jsp页面用el表达式即可接到数据。

2.用ModelAndView的addObject方法

@RequestMapping("/modelandview")
public ModelAndView sendData02() {
    ModelAndView mav = new ModelAndView("result");
    Map<String, String> map = new HashMap<String, String>();
    map.put("user_id", "1");
    map.put("user_name", "清雅轩");
    mav.addObject("map", map);
    return mav;
}                                             

3.用ModelMap的addAttribute方法

@RequestMapping("/modelmap")
public String sendData03(ModelMap modelMap) {
    modelMap.addAttribute("user_name", "清雅轩");
    return "result";
}                                              

这里返回值为一个字符串,而不是ModelAndView对象,实际上字符串形式与ModelAndView的viewName等价,解析器也会将字符串解析出路径。

还有一种返回值为void的形式,这种默认会将@RequestMapping中的请求路径进行解析得出路径。

@RequestMapping("/void")
public void voidMethod() {
//默认的返回路径为/WEB-INF/void.jsp
}                         

4.用Model的addAttribute方法

@RequestMapping("/model")
public String sendData04(Model model) {
    model.addAttribute("user_name", "清雅轩");
    return "result";
}                                           

5.用Map集合

@RequestMapping("/map")
public String sendData05(Map<String, String> map) {
    map.put("user_name", "清雅轩");
    return "result";
}                                                  

重定向

1.在路径后拼凑数据

@RequestMapping("/redirect")
public String sendData06() {
    return "redirect:result.jsp?user_name=qingyaxuan";
}                                                     

这种方式传递的数据属于param域,用${param.user_name}可以获取。但是这种方式在地址栏会显示出参数,而且只能传递简单参数

2.用RedirectAttribute的addFlashAttribute方法

因为/WEB-INF/的安全级别很高,重定向方式无法访问/WEB-INF/目录下的jsp文件,所以需要先重定向到controller中再由请求转发访问。

@RequestMapping("/redirect02")
public String sendData07(RedirectAttributes redi) {         

    Map<String, String> map = new HashMap<String, String>();
    map.put("user_id", "1");
    map.put("user_name", "qingyaxuan");
    redi.addFlashAttribute("map", map);
    redi.addFlashAttribute("account", "account");
    return "redirect:redirect03";
}                                                           

@RequestMapping("/redirect03")
public String sendData08() {
    return "result";
}                                                           

用addFlashAttribute传递的数据属于request域,可用$(requestScope.account)获取。

而且这种方式可以传递复杂数据类型

使用addFlashAttribute方法传值是为了解决下列问题,引用别人的解释说明一下:

正常的MVC Web应用程序在每次提交都会POST数据到服务器。一个正常的Controller (被注解 @Controller标记)从请求获取数据和处理它 (保存或更新数据库)。一旦操作成功,用户就会被带到(forward)一个操作成功的页面。传统上来说,这样的POST/Forward/GET模式,有时候会导致多次提交问题. 例如用户按F5刷新页面,这时同样的数据会再提交一次。

为了解决这问题, POST/Redirect/GET 模式被用在MVC应用程序上. 一旦用户表单被提交成功, 我们重定向(Redirect)请求到另一个成功页面。这样能够令浏览器创建新的GET请求和加载新页面。这样用户按下F5,是直接GET请求而不是再提交一次表单。

虽然这一方法看起来很完美,并且解决了表单多次提交的问题,但是它又引入了一个获取请求参数和属性的难题. 通常当我们生成一次http重定向请求的时候,被存储到请求数据会丢失,使得下一次GET请求不可能访问到这次请求中的一些有用的信息.

Flash attributes 的到来就是为了处理这一情况. Flash attributes 为一个请求存储意图为另外一个请求所使用的属性提供了一条途径. Flash attributes 在对请求的重定向生效之前被临时存储(通常是在session)中,并且在重定向之后被立即移除。

但引述的说法中,数据是被存在session中的,我试的例子中数据是存在request域中的,不知究竟孰是孰非,有知道的dalao希望能指点迷津。

时间: 2024-11-16 07:19:00

SpringMVC服务端返回数据的相关文章

Android客户端采用Http 协议Post方式请求与服务端进行数据交互

本示例以Servlet为例,演示Android与Servlet的通信. 众所周知,Android与服务器通信通常采用HTTP通信方式和Socket通信方式,而HTTP通信方式又分get和post两种方式.至于Socket通信会在以后的博文中介绍. HTTP协议简介: HTTP (Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种协议. HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响

android菜鸟学习笔记25----与服务器端交互(二)解析服务端返回的json数据及使用一个开源组件请求服务端数据

补充:关于PHP服务端可能出现的问题: 如果你刚好也像我一样,用php实现的服务端程序,采用的是apache服务器,那么虚拟主机的配置可能会影响到android应用的调试!! 在android应用中访问的IP都是10.0.2.2,如果在apache虚拟主机配置文件中配置了多个虚拟主机,那么将默认解析为对第一个虚拟主机的请求,所以,在调试android应用时,应该将对应的服务端所配置的那个虚拟主机放在配置文件中的第一个虚拟主机的位置.否则就会出现请求的文件不存在等的错误. 服务端返回JSON数据及

easyUI form提交与springMVC交互时服务端返回的错误处理

asyUI form的submit接口中没有提供error回调函数,网上一种解决方案是串联.success(function(){}).error(function(){}),然后通过jqXHR进行统一处理:但是我发现这种方案不论服务端返回正确还是异常,都会调用.error(),而且这样写代码也有点乱.经过两天摸索,基本找到了解答.对于post提交的数据,服务端的controller定义为void,不必返回值,通过在controller上注解的方式控制返回的http头.在这里发现对于easyUI

服务端Json数据+js表单数据提交的 表单交互插件(base-form.js)

我们在做表单的查看.编辑里涉及两个点: 点1,提交Form表单到服务器,保存到数据库 点2,页面显示Form表单里的所有字段 如果表单的字段很多,这两个点会有两个问题: 1,提交Form时,如何少量代码.快速获取表单的所有数据? 2,页面显示Form表单时,如何自动给表单的所有字段自动赋值,而不要一个一个属性地写代码? 针对这两个问题,我有一个推荐的做法,下面以Demo举例: 1)index.html或index.jsp里写一个form表单,引入jquery.js: <srcript type=

如何使用Ajax从服务端获取数据

在本文中将给出一个例子来介绍使用 Ajax 技术从服务端获得数据的三种方法.这个例子很简单,就是两个选择框(html中的<select>标签),通过选中第一个select的某一项后,会从服务端得到一些数据,并加载到第2个select中.金光大道娱乐城 从服务端获得XML格式的数据 从服务端获得数据的最容易想到的方法就是在服务端反加一定格式的数据,一般是XML格式,然后在服务端使用XMLDocument或其他技术来读取这些数据,并生成<select>标签中选项的格式文本(<op

http的post方式连接服务器,发送数据到服务端,并获取服务端的数据

大概的流程是:客户端填写了用户名和密码,在服务端进行判断,验证密码如果正确,则返回登录成功,如果密码错误,则返回登录失败 客户端是java程序,具体代码如下: package lgx.java.test; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.Unsupport

客户端通过HTTP协议与服务端交换数据

客户端(包括浏览器)通过HTTP协议与服务端交换数据的描述 发起请求 http method 写请求使用POST 读请求使用GET 参数提交 提交一个普通对象,使用键值对参数 x-www-form-urlencoed 当同名参数有多个值时,使用http表单数组的方式 options[]:a options[]:b options[]:c - 当参数对应的值是复杂对象或多维数组时,json序列化该对象/多维数组 处理服务端响应 预先准备 根据业务需求,确定当前响应返回的是业务数据,还是系统消息.(

js与C#服务端 json数据交互

1.1 服务端返回给前端 返回的数据都放入对象中(根据需求:单个对象,集合,键值对),然后JSON序列化返回给前端.这里可以引用JSON.NET 库,也可以用.NET自带的类库: JavaScriptSerializer().Serialize(obj) ; JSON序列化后的结果是一个键和值都用双引号括起的字符串:  "{"msg" : "成功 文件大小为:16397",   "imgurl":"/head.jpg"

在Android中调用KSOAP2库访问webservice服务出现的服务端返回AnyType{}

最近在做毕业设计的时候,涉及到了安卓端访问web service服务端数据库,并返回一个值,当我把web service测试通过后,想写一个简单的安卓测试程序,来实现服务端数据库访问,通过web service中的一个serch()方法,然后发现,每次的返回值都是一个AnyType{},Logcat如图所示: 网上搜集了很多资料,产生的原因其实很简答,是因为服务端返回值为null,Logcat中显示的就职anyType{},找到了原因,解决起来也就好说了,其中包括这些方法: {解决方法引用自博客