第一种:用request接收数据
在servlet中 可以用request.getParameter(),同样在struts2也可以这样接收,但需要获取request对象和response对象
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
第二种:用定义成员变量,提供get/set方法
1、零散类型数据
直接在action中声明接收的成员变量,并为成员变量提供公开的get/set方法
注意:name属性值要与Action中接收的成员变量一致,地址栏中?后面的参数也需要保持一致
2、对象类型数据
同1,直接将接收的对象声明为成员变量,并提供公开的get/set方法
注意:表单中的name属性要必须为成员变量名.属性名,地址栏中?后面的参数也一样
3、数组和集合类型数据
同上,直接将接收的数组/集合声明为成员变量,并提供公开的get/set方法
注意:表单中多个name属性与action中声明的数据/集合变量名一致才可以放在一个数组集合中
地址栏?后面的参数的多个key也必须与action中声明的数组集合名一致
例子如下:
login.jsp
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<title>login</title>
<body>
<form action="${pageContext.request.contextPath}/user/login" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
<input type="submit" value="登陆" />
</form>
<a href="regist.jsp">注册</a>
</body>
</html>
UserAction.java
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.struts2.ServletActionContext;
import com.baizhi.entity.User;
import com.baizhi.service.UserService;
import com.baizhi.service.impl.UserServiceImpl;
import com.baizhi.util.DateUtil;
import com.baizhi.util.DateXingZuoUtil;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport{
private String username;
private String password;
private Date birthday;
private User user;
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
//处理user的login控制代码
public String login(){
UserService us = new UserServiceImpl();
//第一种方式接受参数 (零散型接收)
User user = us.loign(username, password);
if(user!=null){
ServletActionContext.getRequest().getSession().setAttribute("user", user);
return Action.SUCCESS;
}else{
return Action.ERROR;
}
}
}
说明:HttpServletRequest request = ServletAction.Context.getRequest();
上述例子可以改为
login.jsp
标红处:改为user.username user.password
UserAction.java
定义private User user;并提供get/set方法
标红处可以改为:user.getUsername(),user.getPassword()
三、可以利用值栈处理参数接收问题
值栈的内存结构:
值栈分为root区和contextMap区:
root区中存的是当前请求的action对象和标签处理的临时结果;
contextMap区中:有默认的request、session、application
值栈:用来管理和操作一次请求所涉及的数据
什么是一次请求涉及的数据?1、作用域中的数据 2、请求参数
首先,获取值栈:ActionContext context = ActionContext.getContext();
ValueStack vs = context.getValueStack();
操作值栈:存值 vs.setValue(“OGNL表达式”, Object);
取值 vs.findValue("OGNL表达式");
通过值栈设置request作用域:vs.setValue("#request.key",value); 取值vs.findValue("#request.key");
通过值栈设置session作用域:vs.setValue("#session.key",value); 取值vs.findValue("#session.key");
通过值栈设置request作用域:vs.setValue("#application.key",value); 取值vs.findValue("#application.key");
通过值栈接收请求参数(?name=sqc&name=hz) 取值vs.findValue("#parameter['name'][0]");
在页面取值用Struts2提供的标签;