Struts 2 接受前端参数传递的三种方式

Struts 2 接受前端表单传值有三种方式:

1. 直接传值。Action 中对应定义相关属性,并设置 getter and setter.

2. 封装成 POJO 对象。将要传递的值封装到 DTO 中。这是当前实践中使用最多的方式。

3. 使用 ModelDriven 方式。

1. 直接传值

接受参数的方法,可以直接在 Action 里设置好域,写好 getter, setter,就能接受客户端传来的参数,而且能够自动转型。

配置如下:

<action name="hello" class="org.iridium.actions.HelloAction">
     <result name="success">result1.jsp</result>
</action>

index.jsp 内容如下,用传统的方式向后台传递表单值:

<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
<%
     String path = request.getContextPath();
     String basePath = request.getScheme() + "://"
               + request.getServerName() + ":" + request.getServerPort()
               + path + "/";
%>
<html>
<body>
     <h2>Hello World!</h2>
     <form action="<%=path%>/hello" method="post">
          user name: <input type="text" name="userName" /><br />
          password: <input type="password" name="password" /><br /> <input type="submit" />
     </form>
</body>
</html>

这里也留意下另外一个问题,表单尽量用 post 传值,否则有出现编码问题的隐患。

HelloAction 内容如下:

package org.iridium.actions;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport {
     private String userName;
     private String password;
   
//... gettters and setters
   
     @Override
     public String execute() throws Exception {
          System.out.println(this.userName);
          System.out.println(this.password);
          return super.execute();
     }
   
}

注:这里一定要有 getter, setter. 只要前端传来值,会打印到控制台上。实际上,页面传来的值,类型可以自动匹配,如页面有整形数,这里可定义为 int xxx.

result 页面的内容如 result1.jsp 所示:

<%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>result of Hello</title>
</head>
<body>
     user name: <%=request.getAttribute("userName")%><br />
     password: <%=request.getAttribute("password")%>
</body>
</html>

这里也可以使用 Struts 2 标签。

2. 封装为 POJO 对象

如上面的例子,将 userName 和 password 封装到 UserDto 中:

package org.iridium.dto;
public class UserDto {
     private String userName;
     private String password;
//... getters and setters
}

Action 中的定义类似:

import com.opensymphony.xwork2.ActionSupport;
public class Hello2Action extends ActionSupport {
     private UserDto user;// 这里名称 user 将和 JSP 页面中保持一致
  
     public UserDto getUser() {
          return user;
     }
     public void setUser(UserDto user) {
          this.user = user;
     }
     @Override
     public String execute() throws Exception {
          System.out.println(user.getUserName());
          System.out.println(user.getPassword());
          return super.execute();
     }
  
}

输入页面内容略有变化:

     <form action="<%=path%>/hello2" method="post">
          user name: <input type="text" name="user.userName" /><br /> password: <input
               type="password" name="user.password" /><br /> <input type="submit" />
     </form>

注:input 的 name 要用 user.userName 的形式。user.userName 中点号左边的名称来源于 Action 中的定义。

输出页面也略有变化:

     <%=request.getAttribute("user.userName")%><br /> password:
     <%=request.getAttribute("user.password")%>

注:attribute 的 key 要用 user.userName 的形式。user.userName 中点号左边的名称来源于 Action 中的定义。

和上一种方式一样,传来的值,可以自动匹配类型。

3. ModelDriven 方式

除了 Action 的写法和第二种方法(封装为 POJO 对象)不一样,其余完全一样。

package org.iridium.actions;
import org.iridium.dto.UserDto;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class Hello3Action extends ActionSupport implements ModelDriven<UserDto> {
     private UserDto user;
   
     public UserDto getUser() {
          return user;
     }
     public void setUser(UserDto user) {
          this.user = user;
     }
   
     public UserDto getModel() {
          return this.user;
     }
     @Override
     public String execute() throws Exception {
          System.out.println(user.getUserName());
          System.out.println(user.getPassword());
          return super.execute();
     }
   
}

这东西有个不好就是限定了传入的对象类型。注意需要 getModel() 方法,另外,在声明具体的 Model 时,需要初始化。ModuleDriven 体现了 MVC 中 M,在实践中,很少用到这种方式,一般主要使用前述第二种方式。