Struts2学习——请求参数获取

版权声明: https://blog.csdn.net/hu18315778112/article/details/84794571

Struts2框架是web层的优秀框架,他的核心是采用Filter技术,并且使用Action类代替Servlet技术,当然如果特别想使用servlet技术,也可以通过一些方法获取Servlet中的所有对象(如:request、response、session、ServletContext……)

获取了这些对象后,你就可以做一些想做的事,比如……想干啥就干啥

一、从Action中获取ServletAPI

  • 具体如何获取ServletAPI,有三种方式(底层都是相同的方法)
  •  
  • 1. 通过ActionContext

例如:

//request域=> map (struts2并不推荐使用原生request域)
Map<String, Object> requestScope = (Map<String, Object>)ActionContext.getContext().get("request");
//推荐,直接使用put方法将键值对存到Action对象中
ActionContext.getContext().put("name", "requestTom");
		
//session域 => map
Map<String, Object> sessionScope = ActionContext.getContext().getSession();
sessionScope.put("name", "sessionTom");
		
//application域=>map
Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
applicationScope.put("name", "applicationTom");
  • 2. 通过ServletActionContext
//原生request
HttpServletRequest request = ServletActionContext.getRequest();
//原生session
HttpSession session = request.getSession();
//原生response
HttpServletResponse response = ServletActionContext.getResponse();
//原生servletContext
ServletContext servletContext = ServletActionContext.getServletContext();
  • 3. 通过实现接口方式
public class Demo7Action extends ActionSupport implements ServletRequestAware {
	
	
	private HttpServletRequest request;

	public String execute() throws Exception { 
		
		System.out.println("原生request:"+request);
		return SUCCESS;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}
	
}

二、获取参数

  • 既然Struts2不推荐使用Servlet中的Api,那么如何从请求中获取参数,Action有自己的方式: 

  • 以表单提交的数据获取方式为例:(分为三种方式)
  • 1. 属性注入方式:

  • 方式1 表单:
<form action="${pageContext.request.contextPath}/xxxAction" method="post">
	用户名:<input type="text" name="name" /><br>
	年龄:<input type="text" name="age" /><br>
	生日:<input type="text" name="birthday" /><br>
	<input type="submit" value="提交" />
</form>
  • 方式1 Action属性 
//准备与参数键名称相同的属性
private String name;
//自动类型转换 只能转换8大基本数据类型以及对应包装类
private Integer age;
//支持特定类型字符串转换为Date ,例如 yyyy-MM-dd
private Date   birthday;
  •  当表单提交到该Action时,封装数据属性名会对应input的name值自动
  • (注意,有set/get方法的私有成员变量才能称之为属性,这里未写出set/get方法,但是实际开发种一定有)
  • 2. 对象驱动方式:

  • 方式2 表单:
<form action="${pageContext.request.contextPath}/Demo9Action">
	用户名:<input type="text" name="user.name" /><br>
	年龄:<input type="text" name="user.age" /><br>
	生日:<input type="text" name="user.birthday" /><br>
	<input type="submit" value="提交" />
</form>
//准备user对象
private User user;

public User getUser() {
	return user;
}

public void setUser(User user) {
	this.user = user;
}
  • 对象的属性与表单的name值对应进行自动封装
  • 这里将对象作为属性,同样生成set/get方法
  • 3. 模型驱动方式:

  • 表单与方式1 的表单相同
  • 代码:
public class Demo10Action extends ActionSupport implements ModelDriven<User> {
	//准备user 成员变量
	private User user =new User();

	public String execute() throws Exception { 
		
		System.out.println(user);
		
		return SUCCESS;
	}

	@Override
	public User getModel() {
		return user;
	}

}
  • 此种方式需要实现接口ModelDriven,泛型为想要封装的对象类。然后实现方法getModel()。
  • 优点:前台页面无须任何改动(与方式1相同);
  • 缺点:只能封装一个对象
  • 拓展:当然其实还有第四种方式,作为拓展知识,集合形式:

  • 页面:
<form action="${pageContext.request.contextPath}/Demo11Action" method="post" >
	list:<input type="text" name="list" /><br>
	list:<input type="text" name="list[3]" /><br>
	map:<input type="text" name="map['haha']" /><br>
	<input type="submit" value="提交" />
</form>
  • 代码:
//list
private List<String> list;
//Map
private Map<String,String> map;
	
  • 注意:这里同样为集合类型的属性,需要有set/get方法
  • List集合name值为属性名,角标为集合索引,
  • Map集合,角标为key值

猜你喜欢

转载自blog.csdn.net/hu18315778112/article/details/84794571