1.学习路线
今天咱们来学struts2获得ServletAPI,let`go!
图1.学习路线
图2.类和配置文件
api.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!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>Insert title here</title>
</head>
<body>
request:${requestScope.name }<br>
session:${sessionScope.name }<br>
application:${applicationScope.name }<br>
</body>
</html>
2.原理
图3.原理
3.获得获得ServletAPI方式
3.1通过ActionContext
新建一个Demo5Action类,继承ActionSupport,再创建一个execute()方法,return SUCCESS。(这个方法可以到源码中查看)
package cn.aisino.b_api;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
//如何在action中获得原生的Servlet
public class Demo5Action extends ActionSupport{
public String execute() throws Exception {
//request域-》map(struts2并不推荐使用原生request域,因为她的生命周期和ActionContext的生命周期是一样的!)
//不推荐
Map<String, Object> requestScope = (Map<String, Object>) ActionContext.getContext().get("request");
//推荐
ActionContext.getContext().put("name", "requestTom");
//原生的request被核心过滤器包装成新的request域对象,用于改变getAttribute()方法的取值位置
//session域=》map
Map<String, Object> sessionScope = ActionContext.getContext().getSession();
sessionScope.put("name", "sessionTom");
//applocation域-》map
Map<String, Object> applicationScope = ActionContext.getContext().getApplication();
applicationScope.put("name", "applicationTom");
return SUCCESS;
}
}
在包下的配置文件struts.xml中配置:
图3.类和配置文件
在主配置文件struts.xml中配置(这是一种调用包下的配置文件的方式,相比于直接在主配置文件中配置action,这样可让代码更加的清晰整洁):
启动服务器,在地址栏中访问Demo5Action:
可获取到Demo5Action中的Tom!
3.2通过ServletActionContext
新建一个Demo6Action类,继承ActionSupport,再创建一个execute()方法,return SUCCESS。(这个方法可以到源码中查看)
package cn.aisino.b_api;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import jdk.nashorn.internal.ir.RuntimeNode.Request;
//如何在action中获得原生的Servlet
public class Demo6Action extends ActionSupport{
public String execute() throws Exception {
//原生request
HttpServletRequest request = ServletActionContext.getRequest();
//原生的session
HttpSession session = request.getSession();
//原生的response
HttpServletResponse response = ServletActionContext.getResponse();
//原生的servletContext
ServletContext servletContext = ServletActionContext.getServletContext();
return SUCCESS;
}
}
在包下的配置文件struts.xml中配置:
启动服务器,在地址栏中访问Demo6Action:
可获取到Demo6Action中的Tom!
3.3实现接口方式
新建一个Demo7Action类,实现ServletRequestAware接口,再创建一个execute()方法,return SUCCESS,需要重写setServletRequest()方法。
package cn.aisino.b_api;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;
//ctrl+shift+t,搜索*aware,选择Servlet下的接口,复制接口名称,在Demo8Action中实现
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;
}
}
在包下的配置文件struts.xml中配置:
启动服务器,在地址栏中访问Demo7Action:
可获取到。