Struts2中使用的时松耦合的设计模式,因此在action中无法使用Servlet的API操作。如果想在action中使用servlet的API,由以下三种方法。
ServletActionContext的使用
新建ServletService.java类,此类中使用ServletActionContext向request、session、application中存放值。
package com.struts.service;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* @TODO 在Action中使用Servlet的API
* @author Administrator
* @date 2015年7月6日 下午4:12:59
* @version 1.0
*/
public class ServletService extends ActionSupport{
@Override
public String execute(){
//使用ServletActionContext紧耦合
//request范围
ServletActionContext.getRequest().setAttribute("servlet_action_context", "request_scope");
//session范围
ServletActionContext.getRequest().getSession().setAttribute("servlet_action_context", "session_scope");
//appliaction范围
ServletActionContext.getServletContext().setAttribute("servlet_action_context", "application_scope");
return Action.SUCCESS;
}
}
页面获取如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<!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>在action中使用servlet的API</title>
</head>
<body>
<h>------使用ServletActionContext紧耦合----------</h><br/>
request范围:<s:property value="#request.servlet_action_context"/><br/>
session范围:<s:property value="#session.servlet_action_context"/><br/>
application范围:<s:property value="#application.servlet_action_context"/><br/>
</body>
</html>
ActionContext的使用
由于ServletActionContext继承于ActionContext,并且在ServletActionContext增加了HttpServletRequest和HttpServletResponse,因此说ServletActionContext是紧耦合,ActionContext是松耦合。修改ServletService类如下:
package com.struts.service;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* @TODO 在Action中使用Servlet的API
* @author Administrator
* @date 2015年7月6日 下午4:12:59
* @version 1.0
*/
public class ServletService extends ActionSupport{
@Override
public String execute(){
//使用ServletActionContext紧耦合
//request范围
ServletActionContext.getRequest().setAttribute("servlet_action_context", "request_scope");
//session范围
ServletActionContext.getRequest().getSession().setAttribute("servlet_action_context", "session_scope");
//appliaction范围
ServletActionContext.getServletContext().setAttribute("servlet_action_context", "application_scope");
//使用ActionContext松耦合
//request范围
Map map = (Map)ActionContext.getContext().get("request");
map.put("action_context", "request_scope");
// ActionContext.getContext().put("action_context", "request_scope");
//session范围
ActionContext.getContext().getSession().put("action_context", "session_scope");
//appliaction范围
ActionContext.getContext().getApplication().put("action_context", "application_scope");
return Action.SUCCESS;
}
}
页面获取方式和ServletActionContext类似,在此不做说明。
接口的使用
第三种方式为实现ServletRequestAware,ServletContextAware,其中ServletRequestAware可以注入request对象,ServletContextAware可以注入ServletContext对象。修改ServletService如下:
package com.struts.service;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
/**
* @TODO 在Action中使用Servlet的API
* @author Administrator
* @date 2015年7月6日 下午4:12:59
* @version 1.0
*/
public class ServletService extends ActionSupport implements ServletRequestAware,ServletContextAware{
private HttpServletRequest request;
private ServletContext application;
@Override
public String execute(){
//使用ServletActionContext紧耦合
//request范围
ServletActionContext.getRequest().setAttribute("servlet_action_context", "request_scope");
//session范围
ServletActionContext.getRequest().getSession().setAttribute("servlet_action_context", "session_scope");
//appliaction范围
ServletActionContext.getServletContext().setAttribute("servlet_action_context", "application_scope");
//使用ActionContext松耦合
//request范围
Map map = (Map)ActionContext.getContext().get("request");
map.put("action_context", "request_scope");
// ActionContext.getContext().put("action_context", "request_scope");
//session范围
ActionContext.getContext().getSession().put("action_context", "session_scope");
//appliaction范围
ActionContext.getContext().getApplication().put("action_context", "application_scope");
//第三种方式进行赋值
request.setAttribute("request_scope", "request_scope");
request.getSession().setAttribute("session_scope", "session_scope");
application.setAttribute("application_scope", "application_scope");
return Action.SUCCESS;
}
public void setServletContext(ServletContext context) {
this.application = context;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}
页面获取方式和ServletActionContext类似,在此不做说明。