struts2之数据处理的三种方式

一,概述

Javaweb开发少不了往域对象中存数据,使用sruts2框架该如何往域对象中存数据呢?使用sruts2有三种方式往域对象中存数据,各有各的优点。

二,方式一:调用Servlet API

1)新建一个Action
package com.bighuan.c_data;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
 * 数据处理
 * @author bighuan
 *
 */
public class DataAction extends ActionSupport{

	@Override
	public String execute() throws Exception {
		//1,对请求数据进行封装
                //2,调用service,拿到结果数据
		
		//3,向域中存数据
		
		
		//struts中对数据操作,1,直接拿到SerlvetApi,执行操作
		HttpServletRequest request = ServletActionContext.getRequest();
		
		//获取session
		HttpSession session = request.getSession();
		
		//获取application
		ServletContext application = ServletActionContext.getServletContext();
		
		//保存数据
		request.setAttribute("requestData", "requestData111");
		session.setAttribute("sessionData", "sessionData222");
		application.setAttribute("applicationData", "applicationData333");
		
		//拿某个目录的路径
		ServletContext application1 = ServletActionContext.getServletContext();
		String uploadPath = application1.getRealPath("/upload");
		System.out.println(uploadPath);
		

		return SUCCESS;
	}
}
2)通过ServletActionContext拿到request对象、application对象,通过request又可以拿到session对象,然后通过相应的域对象往域中存数据,在struts.xml中配置一下跳转到Data.jsp页面,查看自己保存的数据。
配置struts.xml:

		
			/data.jsp
		

		
		

	
data.jsp中从域对象中取数据:
 ${requestScope.requestData }
${sessionScope.sessionData }
${applicationScope.applicationData }
3)在struts2中一般不推荐使用Servlet API,但是有些情况必须使用Serlvet API,比如要拿WebRoot下的upload目录的路径,使用servlet API很方便。

三,方式二:使用ActionContext

1)struts2对request、session、application进行了封装,封装成一个Map对象,只要通过ActionContext就可拿到相应的Map,以一种解耦的方式实现对数据的操作。
2)将上面那个Action类的execute()方法中的存数据的逻辑改为下面的代码,其他配置不变。同样可以在jsp页面上取出数据显示出来。
ActionContext ac = ActionContext.getContext();
		
Map request = ac.getContextMap();
Map session = ac.getSession();
Map application = ac.getApplication();
//存数据
request.put("requestData", "requestData111_ActionContext");
session.put("sessionData", "sessionData222_ActionContext");
application.put("applicationData", "applicationData333_ActionContext");

四,方式三,通过实现相应的接口来RequestAware、SessionAware、ApplicationAware来获得域对象。

1)先贴代码,再解释。
package com.bighuan.c_data;

import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

/**
 * 数据处理 struts对数据的操作方式3,实现接口的方式
 * 
 * @author bighuan
 * 
 */
public class DataAction3 extends ActionSupport implements RequestAware,
		SessionAware, ApplicationAware {

	private Map request;
	private Map session;
	private Map application;

	@Override
	public String execute() throws Exception {

		// 存数据
		request.put("requestData", "requestData111_Aware");
		session.put("sessionData", "sessionData222_Aware");
		application.put("applicationData", "applicationData333_Aware");
		return SUCCESS;
	}

	// struts运行的时候会将代表request的map对象注入
	@Override
	public void setRequest(Map request) {
		this.request = request;

	}

	// 注入session
	@Override
	public void setSession(Map session) {
		this.session = session;

	}

	// 注入application
	@Override
	public void setApplication(Map application) {
		this.application = application;

	}

}
2)实现一个RequestAware接口,就要实现setRequest方法,然后struts2在运行的时候就会将代表request的Map对象注入。其他的也一样。开发 者只需要自己在类中写一个成员变量来接收对应的Map即可。存数据的操作就和方式二一模一样了。配置一下struts.xml,运行,同样可以在jsp页面中看到数据。
3)这种方式适用于一个Action类中有多个业务方法都要往域中存数据的情况,就不用在每一个方法中通过ActionContext获得相应的Map了。

五,总结

南昌的天气变得越来越热了,博客也写的比较少了,希望自己坚持,每天学一点,总会有丰收的!!!





你可能感兴趣的:(struts2)