前后端参数传递方式演化史

写服务端比较头疼的事情就是从前端往后台传递参数了,一般的套路是:

前端页面写一大堆乱七八糟的参数 --> 传递到后台 --> 后台接收并且提取封装为一个对象,然后拿这个对象去进行各种业务操作。

v0.1 最早的时候是使用的Servlet,它是这样子的:

前端代码:

 <form action="loginServlet" method="post">
     用户名:<input type="text" name="username" /><br/>
     密&nbsp;&nbsp;码:<input type="password" name="passwd" /><br/>
     <input type="submit" value="登录" />
 </form>

接收参数的Servlet代码:

 1 @WebServlet(urlPatterns={"/loginServlet"})
 2 public class LoginServlet extends HttpServlet {
 3
 4     @Override
 5     protected void doGet(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
 6         process(req,resp);
 7     }
 8
 9     @Override
10     protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException ,IOException {
11         process(req,resp);
12     }
13
14     private void process(HttpServletRequest req, HttpServletResponse resp) throws ServletException ,IOException{
15         String username=req.getParameter("username");
16         String passwd=req.getParameter("passwd");
17
18         User u=new User();
19         u.setUsername(username);
20         u.setPasswd(passwd);
21
22         //blabla....
23
24     }
25
26 }

这种方式需要我们手动的一个个把参数扣出来然后打包成对象。

v0.2 后来有了struts2,它有一个参数拦截器可以自动地将参数拍进去:

前端页面:

 <form    action="loginAction" method="post">
     用户名:<input type="text" name="username" /><br/>
     密&nbsp;&nbsp;码:<input type="password" name="passwd" /><br/>
     <input type="submit" value="登录" />
 </form>

Action代码:

 1 public class LoginAction extends ActionSupport {
 2
 3     private String username;
 4     private String passwd;
 5
 6     public String login(){
 7
 8         System.out.println(username+","+passwd);
 9         //....
10
11         return SUCCESS;
12     }
13
14     public String getUsername() {
15         return username;
16     }
17
18     public void setUsername(String username) {
19         this.username = username;
20     }
21
22     public String getPasswd() {
23         return passwd;
24     }
25
26     public void setPasswd(String passwd) {
27         this.passwd = passwd;
28     }
29
30 }

这个时候可以在login()中直接使用username和passwd,因为参数拦截器已经把它们的值拍进去了。

v0.3 既然都已经可以拍进去,为什么不干脆彻底一点呢?

前端代码:

 <form    action="loginAction" method="post">
     用户名:<input type="text" name="user.username" /><br/>
     密&nbsp;&nbsp;码:<input type="password" name="user.passwd" /><br/>
     <input type="submit" value="登录" />
 </form>

Action代码:

 1 public class LoginAction extends ActionSupport {
 2
 3     private User user=new User();
 4
 5     public String login() {
 6
 7         System.out.println(user.getUsername()+","+user.getPasswd());
 8
 9         return SUCCESS;
10     }
11
12     public User getUser() {
13         return user;
14     }
15
16     public void setUser(User user) {
17         this.user = user;
18     }
19
20 }

但是这样子的话还是多了一级导航,还能更好吗?

v0.4 原来还有更酷更优雅的办法呢~  ModelDriven

前端代码:

 <form    action="loginAction" method="post">
     用户名:<input type="text" name="username" /><br/>
     密&nbsp;&nbsp;码:<input type="password" name="passwd" /><br/>
     <input type="submit" value="登录" />
 </form>

后台代码:

 1 public class LoginAction extends ActionSupport implements ModelDriven {
 2
 3     private User user;
 4
 5     public String login() {
 6
 7         System.out.println(user.getUsername()+","+user.getPasswd());
 8
 9         return SUCCESS;
10     }
11
12     public User getUser() {
13         return user;
14     }
15
16     public void setUser(User user) {
17         this.user = user;
18     }
19
20     @Override
21     public Object getModel() {
22         if(user==null) user=new User();
23         return user;
24     }
25
26 }

啊哈返璞归真了,从v0.2开始依赖的就是struts2的参数拦截器把参数拍进来,而最后一个依赖的则是ModelDriven拦截器将对象设置到ValueStack的栈顶,因为ValueStack有暴露栈顶属性可直接使用属性名访问的特性,所以在前台可以直接使用username和passwd传递参数。

参数拦截器:(待修改网址引用)

ModelDriven拦截器:(待修改网址引用)

.

时间: 2024-10-14 22:37:12

前后端参数传递方式演化史的相关文章

从Angular2路由引发的前后端路由浅谈

笔者的学习进度比较慢,直到两年以前写的网站都还是以服务端为主导的,即网站的所有视图都由服务器视图模板来渲染,笔者使用的是 DotNet MVC,开发套路就是在Controller里面写Action,在Views里写对应的Action.cshtml,使用ajax发起请求已经是比较前端的事情了.这种时候由于DotNet MVC框架继承的微软风格的懒人模式,甚至不需要去知道其路由是如何实现的,给人一种感觉是只要在浏览器里敲进去Controller名与Action名,就访问到视图了. 后来笔者开始使用n

[转]从MVC到前后端分离

从MVC到前后端分离 来源:csdn 发布时间:2015-10-26 阅读次数:1680 1. 理解MVC MVC是一种经典的设计模式,全名为Model-View-Controller,即模型-视图-控制器. 其中,模型是用于封装数据的载体,例如,在Java中一般通过一个简单的POJO(Plain Ordinary Java Object)来表示,其本质是一个普通的Java Bean,包含一系列的成员变量及其getter/setter方法.对于视图而言,它更加偏重于展现,也就是说,视图决定了界面

BugPhobia准备篇章:Beta阶段前后端接口文档

0x00:序言 Two strangers fell in love, Only one knows it wasn’t by chance. To the searching tags, you may well fall in love with http:// 10.2.26.67 Github地址:Beta阶段前后端接口定义说明.md 版本管理 修改记录 V1.0 Beta阶段前后端接口文档一稿整理完成,记录用户.标签(含推荐).搜索和问答部分的主要接口 0x01 :接口定义说明 接口定

前后端分离

Swagger - 前后端分离后的契约 前后端分离 按照现在的趋势,前后端分离几乎已经是业界对开发和部署方式所达成的一种共识.所谓的前后端分离,并不是传统行业中的按部门划分,一部分人只做前端(HTML/CSS/JavaScript等等),另一部分人只做后端(或者叫服务端),因为这种方式是不工作的:比如很多团队采取了后端的模板技术(JSP, FreeMarker, ERB等等),前端的开发和调试需要一个后台Web容器的支持,从而无法将前后端开发和部署做到真正的分离. 通常,前后端分别有着自己的开发

【整理】--C++三种参数传递方式

在C++中,共有三种参数传递方式: 按值传递(pass by value) 地址传递(pass by pointer) 引用传递(pass by reference) (1)按值传递的过程为:首先计算出实参表达式的值,接着给对应的形参变量分配一个存储空间,该空间的大小等于该形参类型的,然后把以求出的实参表达式的值一一存入到形参变量分配的存储空间中,成为形参变量的初值,供被调用函数执行时使用.这种传递是把实参表达式的值传送给对应的形参变量,故称这种传递方式为“按值传递”. 使用这种方式,调用函数本

Vue.js前后端同构方案之准备篇——代码优化

作者:王鹤 导语 目前Vue.js的火爆不亚于当初的React,本人对写代码有洁癖,代码也是艺术.此篇是准备篇,工欲善其事,必先利其器.我们先在代码层面进行优化,对我们完成整个技术架构是起到基础作用的.此准备篇是独立的,即使你们的项目不使用Vue.js,也不影响文章的阅读,是代码的基础优化. 一.前言 目前Vue.js的火爆不亚于当初的React,本人对写代码还是有一定洁癖的,代码也是艺术.很长时间在找寻最适合自己的前端开发框架,包括在React最火的时候,我依然在坚持寻找,但React在我心目

运用NodeJs环境并依赖第三方库,框架等实现网站前后端分离报错问题及处理方法

运用NodeJs环境并依赖第三方库,框架等实现网站前后端分离报错问题及处理方法 问题一: SyntaxError: missing ) after argument list in .....\views\user\index.html while compiling ejs. 语法错误:失去右括号)在参数列表后面,在.....\views\user\index.html(在这个路径中的index.html)中当编译ejs时. 分析:这个时候应该是模板引擎ejs出现问题,但是ejs已经是一个写好

前后端交互流程,如何进行交互

(1)前后端都要充分了解项目的需求 (2)接口设计(出接口文档),前后端沟通设计接口,前端需要后台返回什么样的数据(格式),后台需要前端传递什么参数(哪些参数是必须的,哪些参数是可选的,采用get还是post,哪些数据需要前端先进行校验,哪些需要双方都校验).共同制定出整个程序所有的接口说明,形成文档.前后台按照约定好的接口进行开发. (3)有些公司不够规范,没有接口文档,都口头说明,遇到问题都是QQ或者当面沟通(一般都是小公司或者小项目). (4)前端通过ajax进行网络请求,获取服务器返回的

从 MVC 到前后端分离——转自:OSChina 黄勇

转自:OSChina 黄勇 从 MVC 到前后端分离 1 理解 MVC MVC 是一种经典的设计模式,全名为 Model-View-Controller,即 模型-视图-控制器. 其中,模型 是用于封装数据的载体,例如,在 Java 中一般通过一个简单的 POJO(Plain Ordinary Java Object)来表示,其本质是一个普通的 Java Bean,包含一系列的成员变量及其 getter/setter 方法.对于 视图 而言,它更加偏重于展现,也就是说,视图决定了界面到底长什么样