一,概述
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:
<package name="data" extends="struts-default">
<global-results>
<result name="success">/data.jsp</result>
</global-results>
<action name="execute" class="com.bighuan.c_data.DataAction"
method="execute">
</action>
</package>
data.jsp中从域对象中取数据:
${requestScope.requestData }<br>
${sessionScope.sessionData }<br>
${applicationScope.applicationData }<br>
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<String, Object> request = ac.getContextMap();
Map<String, Object> session = ac.getSession();
Map<String, Object> 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<String, Object> request;
private Map<String, Object> session;
private Map<String, Object> 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<String, Object> request) {
this.request = request;
}
// 注入session
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
// 注入application
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
}
2)实现一个RequestAware接口,就要实现setRequest方法,然后struts2在运行的时候就会将代表request的Map对象注入。其他的也一样。开发 者只需要自己在类中写一个成员变量来接收对应的Map即可。存数据的操作就和方式二一模一样了。配置一下struts.xml,运行,同样可以在jsp页面中看到数据。
3)这种方式适用于一个Action类中有多个业务方法都要往域中存数据的情况,就不用在每一个方法中通过ActionContext获得相应的Map了。
五,总结
南昌的天气变得越来越热了,博客也写的比较少了,希望自己坚持,每天学一点,总会有丰收的!!!