struts2获取request,session,application作用域的几种方式

先来总结一下 jsp 4大作用域的生命周期吧(scope)(PS:如有总结不到位或有误的地方还请指点)

page:页面作用域,仅限当前页面,页面跳转或者页面关闭后都失效。

request:请求作用域,从http请求到相应的整个过程,也可以是跨越forward前后的两个页面。

session:会话作用域,用户首次访问浏览器会产生一个会话,这个会话直到浏览器关闭或者会话超时才会失效,也就是说从用户打开浏览器开始,到用户关闭浏览器这中间的过程。这个过程可能包含多个请求响应。只要用户不关浏览器,服务器就有办法知道这些请求是一个人发起的,整个过程被称为一个会话(session),而放到会话中的变量,就可以在当前会话的所有请求里使用。

application:应用作用域,从应用启动到应用关闭,生命周期最长,如果不进行收到删除会一直存在。

总结:application里的变量可以被所有用户共用。如果用户甲的操作修改了application中的变量,用户乙访问时得到的是修改后的值。这在其他scope中都是不会发生的,page, request, session都是完全隔离的,无论如何修改都不会影响其他人的数据。按照生命周期时间长短排序:page<request<session<application

下面就来总结一下action获取4大作用域的4种方法

1.实现ServletRequestAware接口通过IOC机制注入request,IoC方式(即使用ServletRequestAware拦截器)(此方法最麻烦,不推荐使用)

public class TestAction extends ActionSupport implements ServletRequestAware {

	private static final long serialVersionUID = 1L;

	private HttpServletRequest request;
	private HttpSession session;
	private ServletContext application;

	public String execute() {
		request.setAttribute("r1", "r1");
		session.setAttribute("s1", "s1");
		application.setAttribute("a1", "a1");
		return SUCCESS;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
		this.session = request.getSession();
		this.application = session.getServletContext();
	}

}


2.实现Servlet Aware接口通过IOC机制注入request(此方法与第一种类似)

public class TestAction extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {

	private static final long serialVersionUID = 1L;

	private Map<String, Object> request;
	private Map<String, Object> session;
	private Map<String, Object> application;

	public String execute() {
		request.put("r1", "r1");
		session.put("s1", "s1");
		application.put("a1", "a1");
		return SUCCESS;

	}

	@Override
	public void setRequest(Map<String, Object> request) {
		this.request = request;
	}

	@Override
	public void setSession(Map<String, Object> session) {
		this.session = session;
	}

	@Override
	public void setApplication(Map<String, Object> application) {
		this.application = application;
	}

}


3.使用ActionContext类(此方法与servlet解耦,推荐使用)

@SuppressWarnings({"rawtypes","unchecked" })
public class TestAction extends ActionSupport {
	private static final long serialVersionUID = 1L;

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

	public TestAction() {
		request = (Map) ActionContext.getContext().get("request");
		session = ActionContext.getContext().getSession();
		application = ActionContext.getContext().getApplication();
	}

	public String execute() {
		request.put("r1", "r1");
		session.put("s1", "s1");
		application.put("a1", "a1");
		return SUCCESS;
	}

}


4.使用ServletActionContext类(此方法与servle耦合)

public class TestAction extends ActionSupport {

	private static final long serialVersionUID = 1L;

	private HttpServletRequest request;
	private HttpSession session;
	private ServletContext application;

	public TestAction() {
		request = ServletActionContext.getRequest();
		session = request.getSession();
		application = session.getServletContext();
	}

	public String execute() {
		request.setAttribute("r1", "r1");
		session.setAttribute("s1", "s1");
		application.setAttribute("a1", "a1");
		return SUCCESS;
	}
}


  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在使用dependency:copy将struts2里面的javax包兼容Jakarta的时候,有以下几种方式: 1. 使用dependencyManagement指定依赖版本 在pom.xml文件使用dependencyManagement指定依赖的版本,例如: ``` <dependencyManagement> <dependencies> <dependency> <groupId>jakarta.platform</groupId> <artifactId>jakarta.jakartaee-api</artifactId> <version>8.0.0</version> <scope>provided</scope> </dependency> </dependencies> </dependencyManagement> ``` 这样在使用dependency:copy时就会将javax包替换成Jakarta的对应包。 2. 使用maven-dependency-plugin的excludes排除javax包 在pom.xml文件使用maven-dependency-plugin的excludes排除javax包,例如: ``` <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <version>3.2.0</version> <executions> <execution> <id>copy-dependencies</id> <phase>package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/lib</outputDirectory> <excludeGroupIds>javax</excludeGroupIds> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 这样在使用dependency:copy时就会排除javax包,避免与Jakarta的对应包发生冲突。 3. 使用maven-shade-plugin重新打包 在pom.xml文件使用maven-shade-plugin重新打包,将javax包重命名,例如: ``` <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>javax</pattern> <shadedPattern>jakarta</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin> </plugins> </build> ``` 这样在打包时就会将javax包重命名为jakarta包,避免与Jakarta的对应包发生冲突。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

珍妮玛•黛金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值