【Struts】Struts中前后台参数传递的两种方式

2022-04-29 10:36:52 浏览数 (1)

Struts中通过前台页面传递参数到后台,一般常用的有两种方式。

一种是通过在Action处理类声明属性并提供SET/GET方法,另一种是Action处理类实现ModelDriven类并提供一个对应的POJO供Struts进行封装。

一、通过声明属性的方式传递参数

Action处理类如下:

代码语言:javascript复制
 1 package com.basestruts.action;
 2 
 3 import com.opensymphony.xwork2.ActionSupport;
 4 /**
 5  * 通过直接在Action中声明参数进行参数传递
 6  * @author chenyr
 7  *
 8  */
 9 
10 public class AS_SayHelloAction extends ActionSupport {
11 
12     /**
13      * 版本号
14      */
15     private static final long serialVersionUID = -4693323245030734260L;
16     
17     /** 名字 **/
18     private String name;
19     
20     /** 消息 **/
21     private String message;
22     
23     
24     /** 传递到前台的消息(必须提供SET/GET方法) **/
25     private String sayHelloStr = "";
26     
27     public String execute()
28     {        
29         sayHelloStr = "读取不到前台消息!";
30         
31         if(name != null && message != null)
32         {
33             sayHelloStr = name   ","   message;
34         }
35         
36         System.out.println(sayHelloStr);
37         
38         return SUCCESS;
39     }
40     /* 省略name, message, sayHelloStr的SET/GET方法 */
41 }

struts.xml文件如下:

代码语言:javascript复制
 1 <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd">
 2 <struts>
 3     <package name="default" namespace="/" extends="struts-default">
 4         <action name="AS_sayHello" class="com.basestruts.action.AS_SayHelloAction"
 5             method="execute">
 6             <result name="success">/result.jsp</result>
 7             <result name="input">/index.jsp</result>
 8         </action>
 9         
10         <action name="MD_sayHello" class="com.basestruts.action.MD_SayHelloAction"
11             method="execute">
12             <result name="success">/result.jsp</result>
13             <result name="input">/index.jsp</result>
14         </action>
15     </package>
16 </struts>

前台页面index.jsp用表单传递name, message参数:

代码语言:javascript复制
 1 <%@page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@ page contentType="text/html;charset=utf-8" %>
 3 
 4 <!-- 省略了其他代码 -->
 5  <body>
 6     <%-- 通过Struts传递参数,数据传递方式必须选择post,否则编码错误! --%>
 7        <form action="message/MD_sayHello" method="post" >
 8             <b>名字:</b><input type="text" id="name" name="name" /></br>
 9             <b>消息:</b><input type="text" id="message" name="message"/></br>
10             <input type="submit" name="submit" value="问好"/>        
11         </form>
12   </body>

注意:Struts传递数据时,必须将表单的method属性设为post,否则会出现编码错误!

结果页面result.jsp:

代码语言:javascript复制
1 <body>
2            <h1>${sayHelloStr }</h1>
3 </body>

二、通过ModelDriven接口实现参数传递

此时的前后台页面和strut.xml文件都不变,Action处理类修改如下:

代码语言:javascript复制
 1 package com.basestruts.action;
 2 
 3 import com.basestruts.pojo.Message;
 4 import com.opensymphony.xwork2.ActionSupport;
 5 import com.opensymphony.xwork2.ModelDriven;
 6 
 7 /**
 8  * 通过ModelDriven方式传递参数
 9  * @author chenyr
10  *
11  */
12 public class MD_SayHelloAction extends ActionSupport implements ModelDriven<Message> {
13 
14     /**
15      * 版本号
16      */
17     private static final long serialVersionUID = -4693323245030734260L;
18     
19     /** 声明存储前台信息的POJO类对象(不必提供GET/SET方法) **/
20         private Message model = new Message();   
21     
22     /** 传递到前台的消息(必须提供SET/GET方法) **/
23     private String sayHelloStr = "";
24     
25     public Message getModel() {
26         // TODO Auto-generated method stub
27         return model;
28     }
29     
30     public String execute()
31     {        
32         setSayHelloStr("读取不到前台消息!");
33         /* 获取前台的消息 */
34         if(model != null)
35         {
36             Message message = (Message)getModel();
37             setSayHelloStr(message.getName()   ","   message.getMessage());            
38         }
39         
40         return SUCCESS;
41     }
42 
43     /* 省略sayHelloStr的SET/GET方法 */
44 }
45     

这时相比第一种方式,Action的主要改变是提供了20行的一个参数和25行的一个getModel()方法。

注意20行中的mode参数要用new去获取一个POJO类对象,如果没有用new声明,那么Struts将无法将前台数据传递过来。

此时要增加一个POJO类:Message.java

代码语言:javascript复制
 1 package com.basestruts.pojo;
 2 
 3 import java.io.Serializable;
 4 
 5 public class Message implements Serializable{
 6     
 7     /**
 8      * 版本号
 9      */
10     private static final long serialVersionUID = 6023958776122034827L;
11 
12     /** 名字 **/
13     private String name;
14     
15     /** 消息内容 **/
16     private String message;
17 
18     /* 省略name, message 的SET/GET方法 */
19 }

0 人点赞