Struts2——前后台传值总结

进入新公司两个月了,在新公司主要做的是web开发,java后台开发还是比较少的。最近一直在努力学习java-web中。bootstrap、js、jquery,struts2,感觉任重而道远。加油,BOY!
下面让我们进入到这篇博客的正题中。
在这里插入图片描述

一、前台给后台传值

(1)属性驱动
属性驱动是指在Aciton类中定义和HTML页面名称一样的字段,同时设置get和set方法。适合简单传值,我司代码中几乎没有使用!
HTML页面的写法:

 <form action="login" method="post">
   <label>username:</label>
   <input type="text" name="username">
   <label>password:</label>
   <input type="text" name="username">
  </form>

java后台Action类的写法:

 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中的配置:

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

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

(2)对象驱动
Action中包含一个对象,这个对象的属性和JSP页面上的名称一一映射。
Action代码的写法:

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}来访问。

(3)对象驱动改良版本——我司采用这种方法实现前后台传值
利用ModelDriven机制,让UserAction实现一个ModelDriven接口,同时实现接口中的方法:getModel()。如下所示:

public class UserAction implements ModelDriven{
  private User user;
    @Override
    public Object getModel() {

       if(user == null){

           user = new User();

       }

       return user;

    }

 

    public String add(){

 

       new UserManager().addUser(user);

      

       return "success";

    }


    public User getUser() {

       return user;

    }

 

    public void setUser(User user) {

       this.user = user;

    }

}

可见,这种做法是比较好的,Action和JSP写起来都比较简单。

二、后台给前台传值

(1)使用strtus2标签
Action类中的写法:

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: }

对应的JSP页面的写法:我司也很少看到嵌套如此多的结构。

 <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:

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 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,此时就可以获得由后端传入的值。

三、和Servlet API耦合的访问方式

1、 采用Request (HttpServletRequest)对象来传递数据

1)在Action类文件中

(A) 导入ServletActionContext类:

import org.apache.struts2.ServletActionContext;

(B) 获得request对象,具体的方法如下:

HttpServletRequest request = ServletActionContext.getRequest ();

(C)通过setAttribute()方法把需要传递的数据对象放入request对象中:

request.setAttribute("key",Object);

(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:

(A) request.getAttribute("key")获得被传递的数据对象。

(B) <s:iterator value="#request.key"> 获得被传递的数据对象。

2、采用application (ServletContext) 对象来传递数据

1)在Action类文件中

(A) 导入ServletActionContext类:

import org.apache.struts2.ServletActionContext;

(B) 获得application对象,具体的方法如下:

ServletContext application = ServletActionContext.getServletContext ();

(C)通过setAttribute()方法把需要传递的数据对象放入application对象中:

application.setAttribute("key",Object);

(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:

(A) application.getAttribute("key")获得被传递的数据对象。

(B)<s:iterator value="#application.key"> 获得被传递的数据对象。

3、采用session (HttpSession) 对象来传递数据
(1)在Action类文件中

(A) 导入ServletActionContext类:

import org.apache.struts2.ServletActionContext;

(B) 获得session对象,具体的方法如下:

HttpSession session = ServletActionContext.getRequest ().getSession();

(C) 通过setAttribute()方法把需要传递的数据对象放入session对象中:

session.setAttribute("key",Object);

(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:

(A) session.getAttribute("key")获得被传递的数据对象。

(B) <s:iterator value="#session.key"> 获得被传递的数据对象。

四、和Servlet API解耦的访问方式

1、 采用Request (HttpServletRequest对应的Map对象)对象来传递数据

1)在Action类文件中

(A) 导入ActionContext类:

import com.opensymphony.xwork2.ActionContext;

(B) 获得request对象,具体的方法如下:

ActionContext context= ActionContext.getContext();

Map request = (Map)context.get("request");

(C)通过put()方法把需要传递的数据对象放入request对象中:

request.put("key",Object);
2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:

(A) request.getAttribute("key")获得被传递的数据对象。

(B) request.get("key")获得被传递的数据对象。

(C) <s:iterator value="#request.key"> 获得被传递的数据对象。

(D) requestScope.key 获得被传递的数据对象。

2、采用application (ServletContext对应的Map对象) 对象来传递数据

1)在Action类文件中

(A) 导入ActionContext类:

import com.opensymphony.xwork2.ActionContext;

(B) 获得application对象,具体的方法如下:

ActionContext context= ActionContext.getContext();

Map application = (Map)context.getApplication();

(C)通过put()方法把需要传递的数据对象放入application对象中:

application.put("key",Object);

(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:

(A) application.getAttribute("key")获得被传递的数据对象。

(B) application.get("key")获得被传递的数据对象。

(C) <s:iterator value="#application.key"> 获得被传递的数据对象。

(D) applicationScope.key 获得被传递的数据对象。

3、采用session (HttpSession对应的Map对象) 对象来传递数据

1)在Action类文件中

(A) 导入ActionContext类:

import com.opensymphony.xwork2.ActionContext;

(B) 获得session对象,具体的方法如下:

ActionContext context= ActionContext.getContext();

Map session = (Map)context.getSession();

(C)通过put()方法把需要传递的数据对象放入session对象中:

session.put("key",Object);

(2)JSP文件中,有多种方法可以获得被传递的数据对象,比如:

(A) session.getAttribute("key")获得被传递的数据对象。

(B) session.get("key")获得被传递的数据对象。

(C) <s:iterator value="#session.key"> 获得被传递的数据对象。

(D) sessionScope.key 获得被传递的数据对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值