Struts2 前端与后台之间传值问题

老是被前端与后台之间的传值给弄糊涂了,特此写一篇blog进行总结。

一. 前端向后台传值

(1)属性驱动

属性驱动是指在Action类里,包含表单里对应的字段(字段名称一样),同时设置对应的getter和setter。

表单代码:html

   1: <form action="login" method="post">
   2:   <label>username:</label>

   3:   <input type="text" name="username">

   4:   <label>password:</label>

   5:   <input type="text" name="username">

   6: </form>

对应的Action:LoginAction

java代码:

   1: public LoginAction extends ActionSupport{
   2:     private String username; //对应表单中input属性name=username

   3:     private String password; //对应表单中input属性name=password

   4:  

   5:     /*--  getter and setter --*/

   6:     public void setUsername(String username){

   7:         this.username = username;

   8:     }

   9:     public String getUsername(){

  10:         return this.username;

  11:     }

  12:     public void setPassword(String password){

  13:         this.password = password;

  14:     }

  15:     public String getPassword(){

  16:         return this.password;

  17:     }

  18:     public String execute(){

  19:         return SUCCESS;

  20:     }

  21: }

在struts.xml中配置Action

   1: <action name="login" class="com.bigdata.action.LoginAction">
   2:     <result name="success">success.jsp</result>

   3: </action>

在success.jsp页面中使用{username}来访问username属性。

属性驱动适合于表单域传值较少的情况,如果表单域过多的话,Java代码将会充斥着大量的getter和setter代码。

(2)对象驱动

对象驱动是指在Action里包含一个对象,而这个对象的属性与表单域一一对应。

对应的Action:LoginAction

   1: public LoginAction extends ActionSupport{
   2:     private User user;

   3:  

   4:     /*--  getter and setter --*/

   5:     public void setUser(User user){

   6:         this.user = user;

   7:     }

   8:     public User getUser(){

   9:         return this.user;

  10:     }

  11:     public String execute(){

  12:         return SUCCESS;

  13:     }

  14: }

对应的user类:

   1: public Class User{
   2:     private String username;

   3:     private String password;

   4:  

   5:     public String getPassword() {

   6:         return password;

   7:     }

   8:     public void setPassword(String password) {

   9:         this.password = password;

  10:     }

  11:  

  12:     public String getUsername(){

  13:         return username;

  14:     }

  15:     public void setUsername(String username){

  16:         this.username = username;

  17:     }

  18: }

前台html页面代码

   1: <form action="login" method="post">
   2:   <label>username:</label>

   3:   <input type="text" name="user.username">

   4:   <label>password:</label>

   5:   <input type="text" name="user.password">

   6: </form>

表单域的name由对象名和属性名组成,中间用.连接,Action对象被创建后,通过setter进行赋值。Action result页面则通过${user.username}来访问。

二. 后台向前端传值

(1)使用Struts2的标签

对应Action:

   1: public Class CollectAction extends ActionSupport{
   2:     private String [] arryStr;  

   3:     //遍历list  

   4:     private List<User> list;  

   5:     private Map<String,String> map;  

   6:     private Map<Integer,User> userMap;    

   7:     private Map<String,List<User>> userListMap; 

   8:  

   9:     public void setArryStr(String[] arryStr){

  10:         this.arryStr = arryStr;

  11:     }

  12:     public String[] getArryStr(){

  13:         return arryStr;

  14:     }

  15:  

  16:     //省略其他的getter与setter

  17:     public String execute(){

  18:  

  19:         arryStr[] = new String[]{"wbl","sdfsdf","gfg"};

  20:  

  21:         list.add(new User("wbl","123"));

  22:         list.add(new User("avd","ggg"));

  23:         list.add(new User("eee","iii"));

  24:  

  25:         map.put("key1","value1");

  26:         map.put("key2","value2");

  27:         map.put("key3","value3");

  28:  

  29:         userMap.put(1,new User("wbl","123"));

  30:         userMap.put(2,new User("avd","ggg"));

  31:  

  32:         userListMap.put("user",list);

  33:     }

  34: }

Action对应的JSP页面:

   1: <div id="arryStr">
   2:     <!-- iterator遍历String 字符数组 -->

   3:     <s:iterator value="arryStr" id="arryValue">

   4:         <span><s:property value="arryValue" /></span>

   5:     </s:iterator>

   6:   </div>

   7:  

   8:   <div id="list">

   9:     <!-- iterator遍历List集合 -->

  10:     <table>

  11:       <s:iterator value="list" id="user">

  12:         <tr>

  13:           <td><s:property value="username" /></td>

  14:           <td><s:property value="password" /></td>

  15:         </tr>

  16:       </s:iterator>

  17:     </table>

  18:   </div>

  19:  

  20:   <div id="map">

  21:     <!-- iterator遍历Map中的String字符串 -->

  22:     <s:iterator value="map" id="column">

  23:       <tr>

  24:         <td>Key:<s:property value="key" /></td>

  25:         <td>Value:<s:property value="value" /></td>

  26:       </tr>

  27:     </s:iterator>

  28:   </div>

  29:  

  30:   <div id="userMap">

  31:     <!-- iterator遍历Map中的User 对象(Object) -->

  32:     <s:iterator value="userMap" id="column">  

  33:         <tr>  

  34:             <td><s:property value="value.username"/></td>  

  35:             <td><s:property value="value.password"/></td>  

  36:         </tr>  

  37:       </s:iterator> 

  38:   </div>

  39:   

  40:   <div id="userlistMap">

  41:     <!-- iterator遍历Map中的List集合 -->

  42:     <s:iterator value="userListMap" id="column">  

  43:       <s:set var="total" name="total" value="#column.value.size"/>  

  44:         <s:iterator value="#column.value" id="col" status="st">  

  45:           <tr>  

  46:               <td><s:property value="username"/></td>  

  47:               <td><s:property value="password"/></td>  

  48:           </tr>  

  49:       </s:iterator>  

  50:     </s:iterator>  

  51:   </div>

(2)AJAX

ajax方式可以实现异步更新数据,这里我采用json格式传输数据。

首先,建立一个action:

   1: public class ajaxAction extends ActionSupport{
   2:     private JSONObject dataObj; //向前台传递的JSON数据

   3:  

   4:     public JSONObject getDataObj() {

   5:         return dataObj;

   6:     }

   7:  

   8:     public void setDataObj(JSONObject dataObj) {

   9:         this.dataObj = dataObj;

  10:     }

  11:  

  12:     public String execute(){

  13:         dataObj = new JSONObject();

  14:         dataObj.put("key","value");

  15:         dataObj.put("result","SUCCESS");

  16:         return SUCCESS;

  17:     }

  18: }

struts.xml中action的配置

   1: <action name="ajax"  class="com.bigdata.action.ajaxAction">
   2:     <result type="json">

   3:          <param name="root">dataObj</param>

   4:          <param name="callbackParameter">jsoncallback</param>

   5:     </result>

   6: </action>

如果为某个action指定了一个类型为json的Result,则该Result无须映射到任何视图资源,因为json插件会负责将Action里的状态信息序列化成JSON格式的字符串,并将该字符串返回给客户端浏览器。

json类型的Result允许指定的参数

root:设置该参数将不再把整个Action对象序列化成JSON字符串,而只是将该参数所指定的Action的属性序列化成JSON字符串返给客户端,本例中将会把dataObj进行序列化。

callbackParameter: 配置该参数之后,才能进行JSON的跨域传输。

前端利用jQuery完成AJAX交互

   1: <div id="ajaxTest">
   2:       <input type="button" value="test" id="show">

   3:   </div>

   4: </body>

   5: <script type="text/javascript" src="js/jquery.js"></script>
   1:  

   2: <script>

   3:   $(function(){

   4:       $("show").click(function(){

   5:           $.getJSON(

   6:             /*访问Action的URL地址*/

   7:             "http://localhost:8080/bigData/ajax?jsoncallback=?",

   8:             /*得到服务器响应之后的操作*/

   9:             function(respose){

  10:                 if(respose.result == "SUCCESS")

  11:                     $("#ajaxTest").append("<span>SUCCESS</span>");

  12:             })

  13:       })

  14:   })

</script>

   6: </html>

function中的参数response对应Action中的dataObj,此时就可以获得由后端传入的值。

时间: 2024-11-07 16:49:22

Struts2 前端与后台之间传值问题的相关文章

通过AngularJS实现前端与后台的数据对接(一)

最近,笔者在做一个项目:使用AngularJS,从而实现前端与后台的数据对接.笔者这是第一次做前端与后台的数据对接的工作,因此遇到了许多问题.笔者在这些问题中,总结了一些如何实现前端与后台的数据对接的方法,希望与大家分享. 在开始进行前端与后台的数据对接前,首先要做到以下几点: 1.先要了解页面哪里是需要后台提供数据的(即:哪里是需要接接口的) ps:很明显,表格里的数据就是要向后台发送请求,从数据库里获取页面需要显示的数据 2.要理解接口里的每一个字段的含义 ps:一般而言,前端工作者都可以根

asp.net页面之间传值方法详解

asp.net中页面之间传值我们用得最多的就是get,post这两种了,其它的如session,appliction,cookie等这些相对来说少用也不是常用的,只是在特殊情况下在使用了. 1. Get(即使用QueryString显式传递) 方式:在url后面跟参数. 特点:简单.方便. 缺点:字符串长度最长为255个字符:数据泄漏在url中. 适用数据:简单.少量.关键的数据. 适用范围:传递给自己.传递给另一个目标页面:常用于2个页面间传递数据. 用法:例如:url后加?UserID=…,

个人网站架构设计(三) - 从设计到前端到后台

在五月份,写过两篇博客,提到了要给自己做个网站,当时人在实习,没太多的时间,只是把大概的思路捋了一番,顺道也买了个云主机(配置比较低,内存才500M).接着返校处理毕业事宜,于是六月也随着同学之间挥泪告别的声音渐渐远去.七月,家里呆着,中旬回公司.想必这也是我近几年最长的一次假期了=. = 一.先说设计 1. 阮一峰的博客 目前我的博客设计是 fork 了 BeiYuu 的主题,然后七改八改,除了主页 BeiYuu 还认得出是他的之外,其他页面已经动了很大的手术,而这些手术灵感都是源自阮一峰阮大

深度剖析Vue中父给子、子给父、兄弟之间传值!

本片文章将为您详细讲解在Vue中,父给子传值.子给父传值以及兄弟之间传值方式! 父传子:父组件 // template里面 <aa :info="name"/> // script里面 import aa from './aa.vue' components:{ aa }, data(){ return{ name : '小明' } } 父传子:子组件 // template里面 {{info}} // script里面 export default { props :['

MVC 控制器之间传值学习——session

刚接触MVC不久,写的一些代码自己都不忍心看下去.路漫漫其修远兮,宝宝还需努力!之前只用过Session做登录时用户信息的储存,今天对集合类数据做了小小的尝试:利用session在控制器之间传值,以减少代重复率. 1.将数据储存到Session中(不受类型限制): 2.从session中读取数据(注意转换为正确的的数据类型): 3.随你怎么操作. using System.Collections.Generic; using System.Linq; using System.Web.Mvc;

Asp.Net Core MVC控制器和视图之间传值

一.Core MVC中控制器和视图之间传值方式和Asp.Net中非常类似 1.弱类型数据:ViewData,ViewBag 2.强类型数据:@model 二.代码 实例  1.ViewData public IActionResult Index() { //测试的 时候在Cummuty2017的最新版中右键添加视图生成的 视图文件的编码 为ANSI对于中文显示乱码 //使用ViewData 实现 控制器 和 视图之间传值 /* * 1.ViewData指定键值对的方式设置或读取 数据 * 2.

C# 加密–RSA前端与后台的加密&amp;解密

1. 前言 本问是根据网上很多文章的总结得到的. 2. 介绍 RSA加密算法是一种非对称加密算法. 对极大整数做因数分解的难度决定了RSA算法的可靠性.换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠.假如有人找到一种快速因数分解的算法的话,那么用RSA加密的信息的可靠性就肯定会极度下降.但找到这样的算法的可能性是非常小的.今天只有短的RSA钥匙才可能被强力方式解破.到2016年为止,世界上还没有任何可靠的攻击RSA算法的方式.只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的

一个简易的便签工具:探索窗体之间传值和传引用的方法

简单的便签工具:实现了基于文本的便签信息的浏览,删除,添加.可以查看时间,实时更新数据. 这个便签工具完全基于面向对象的编程方式,首先定义Note类,然后使用NoteManager类进行便签的管理.其中的关键就是在NoteManager类中定义list<Note>泛型集合.原理上和ArrayList基本是一致的. NoteManager的工作原理: public List<Note> list;//定义一个泛型集合,并在构造函数中初始化. private int CurrentIn

前端和后台对时间数值的增减操作(JavaScript和C#两种方法)

最近在做一个视频回放项目,记录下一点总结. 应用背景: 假设有一个门禁系统记录着门禁的人员进出刷卡信息,门禁装有视频录像设备,现在要根据人员的刷卡时间调出其刷卡时间点前后一段时间的录像.关于视频回放部分具体实现过程较复杂本文不涉及,提一下其中涉及到的对时间数值的增减操作. 目标: 以时间格式的字符串“2015-01-01 00:00:00”为例,返回该时间点前30秒和后30秒的时间格式的字符串. 前端和后台起始都可以实现,只是方法不同而已. 后台(C#)实现方法: 1 string str =