获取Session两种方式
(1)ActionContext:在Struts2中代表当前Struts2中环境相关信息
能够获取所有的相关信息
Map类型的session不依赖于Servlet API
HttpSession 与Servlet API耦合性低
就可以进行与容器无关的测试
Servlet不能进行离线测试(Junit测试)
离线:脱离web容器单独使用,比如进行Junit测试
在底层struts2容器会将Map session中的信息同步到HttpSession中
ActionContext ctx=ActionContext.getContext();
Map<String, Object> session=ctx.getSession();
session.put("loginName","Jack");
(2)也可以使用Struts注入Session到实现SessionAware接口
的Action对象中
定义一个Action的抽象父类,在封装Session的公共的方法子类
只需继承抽象父类就可以获得这些公共方法
/*
* 所有控制器的基类,
* 用于封装常用的session,request等,用于提供给子类进行复用
* ActionSupport是struts2提供了Action基础类用于复用公共代码的类
* */
public abstract class BaseAction extends ActionSupportimplements SessionAware,ApplicationAware,RequestAware{
private Map<String, Object>session;
protected Map<String, Object>application;
protected Map<String, Object>request;
public void setSession(Map<String, Object>session) {
this.session=session;
}
public void setApplication(Map<String, Object>session){
this.session=session;
}
public void setRequest(Map<String, Object>request){
this.request=request;
}
}public class LoginAction2implements SessionAware{
private Map<String, Object>session;
public void setSession(Map<String, Object>session) {
this.session=session;
}
Spring与Struts2整合
1:利用Spring管理Action对象
2:Spring管理Action,同时可以为控制层注入业务层
最终将控制层和业务层整合
插件 Struts2-Spring
(1)导包:Pom.xml配置文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.tedu</groupId>
<artifactId>struts-day02</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.3.24</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-spring-plugin</artifactId>
<version>2.3.34</version>
</dependency>
</dependencies>
</project>
(2)可以界面配置listener
<!-- 用于在web容器启动期间初始化Spring容器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/spring-*.xml</param-value>
</context-param>
(3)引入spring-web.xml
保持Spring的配置文件的版本和Spring的版本一致
启动注解驱动
<context:component-scan base-package="cn.tedu.web"/>
(4)在web包下写一个Action类
@Controller//作用仅仅是告诉Spring这是一个bean组件
@Scope("prototype")//为了线程安全
public class WebAction extends BaseAction{
public String execute(){
System.out.println("WEB Action");
return SUCCESS;
}
(5)配置struts.xml文件
<!-- 使用有Spring管理的Action组件
在配置Action期间将class属性引用Bean ID即可
-->
<action name="web" class="webAction">
<result name="success">/WEB-INF/success.jsp</result>
</action>
*****
一个请求一个Action
Spring管理,一定要加@scope(prototype)
不然会造成并发问题