Struts2的请求作用域分为:
application request response session四种,获得到这四种作用域的方式有两种。
1.解耦合的方式
解耦合:就是不依赖servlet,是Struts2自己的。拿到的是Map集合
获取方式:application
//定义map集合,键是string,值是object。然后在下面写set,get方法,一定要写,不然页面获取不到值
private Map<String , Object> application;
public String test() {
//获取application对象
application=(Map<String, Object>) ActionContext.getContext().get("application");
//通过application对象的集合,设置值,集合的也是一样的
application.put("name", "张三");
return SUCCESS;
}
<!-- 页面上直接通过键获取值-->
页面上:${name}
request的方式
//和上面的一样的
private Map<String , Object> request;
public String test() {
//通过解耦合的方式获取集合
List<Student> list=new ArrayList<Student>();
list.add(new Student(1,"张三",17));
list.add(new Student(2,"李四",27));
list.add(new Student(3,"王五",37));
//获取request对象
request=(Map<String, Object>) ActionContext.getContext().get("request");
//保存集合
request.put("list", list);
return SUCCESS;
}
页面上:
<!-- 我是通过s标签获取的,c标签是一样的。s标签获取要注意#后面写的是你保存到哪一个请求作用域,你就写哪一个 -->
<s:iterator value="#request.list" var="li">
<s:property value="#li.id"/>
<s:property value="#li.name"/>
<s:property value="#li.age"/><br/>
</s:iterator>
response
其实response在这里作用不大。基本上没用
//和上面的一样的
private Map<String , Object> response;
public String test(){
//获取response对象
response=(Map<String, Object>) ActionContext.getContext().get("response");
return success;
}
session
//和上面的一样的
private Map<String, Object> session;
public String test() {
student=new Student(1,"李四",20);
//获取session对象
session=ActionContext.getContext().getSession();
//保存一个学生对象到集合中
session.put("stu", student);
return SUCCESS;
}
页面上:
<!-- 通过请求作用域获取到对象,在从对象中获取到属性-->
<s:property value="#session.stu.name"/>
还有一种解耦合的方式:通过实现接口的方式
request 实现接口:implements RequestAware
sessionn实现接口:implements SessionAware
application实现接口:implements ApplicationAware
在类中还是要定义map集合,方式还是和上面一样
实现接口后需要重新接口中的方法,不然会报错
public void setRequest(Map<String, Object> request) {
//你定义的map集合等于括号中的map集合
this.request=request;
}
其他对象也是一样的,和上面的差不多。
2.耦合的方式
耦合:必须需要Struts2的依赖。拿到的是HttpServletRequest, ServletContext, HttpServletResponse, Session对象
使用的时候需要引入servlet的依赖
在pom.xml中引入
<!-- servlet的核心依赖-->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
通过ServletActionContext的静态方法获取
request
public String test() {
//通过静态方法获取request对象
HttpServletRequest request=ServletActionContext.getRequest();
//设置值
request.setAttribute("name", "小明");
return SUCCESS;
}
response
public String test() {
//通过静态方法获取response对象
HttpServletResponse response=ServletActionContext.getResponse();
return SUCCESS;
}
session
public String test() {
//先获取request对象
HttpServletRequest request=ServletActionContext.getRequest();
//再获取session对象
HttpSession session = request.getSession();
session.setAttribute("name", "小明");
return SUCCESS;
}
application
public String test() {
//获取application对象
ServletContext application=ServletActionContext.getServletContext();
application.setAttribute("name", "小花");
return SUCCESS;
}
页面上和耦合的方式是一样的
也有实现接口的方式
request 实现接口:implements HttpServletRequest
sessionn实现接口:implements HttpSession
application实现接口:implements ServletContext
和解耦合的方式也是差不多的
请求转发方式:
Struts2里面差不多都是通过配置文件完成请求转发和重定向
这里加不加action是要看web.xml中怎样配置,
我是只有*.action才能进Struts2框架
<package name="default" namespace="/" extends="struts-default">
<action name="testAction2_*" class="com.ywy.action.TestAction2" method="{1}">
<!-- 默认是请求转发,dispatcher可以不加,这种请求转发只能转发到页面,不能到action中-->
<result type="dispatcher">index.jsp</result>
<!--一个action转发到另一个action,后面一定不能加 .action-->
<result type="chain">testAction</result>
<!-- 重定向到一个页面,也可以重定向到action,重定向到action中,后面一定要加action-->
<result type="redirect">index.jsp</result>
<!-- 重定向到一个action中,可加可不加action-->
<result type="redirect">testAction.action</result>
</action>
</package>