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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了前后端参数传递方式演化史相关的知识,希望对你有一定的参考价值。

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

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

 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拦截器:(待修改网址引用)

 

 

 

 

 .

以上是关于前后端参数传递方式演化史的主要内容,如果未能解决你的问题,请参考以下文章

javaWeb前后端传递数据交互的两种方式

技术前端大讲堂:从Web演化史看前后端分离

前端ajax异步传值以及后端接收参数的几种方式

共享资源组前后端分离演化过程

axios 传递参数的方式(data 与 params 的区别)

axios 传递参数的方式(data 与 params 的区别)