Struts的学习过程中,感觉很多东西都有一种似曾相识的感觉,但是同时也有一种傻傻分不清的感觉,今天就把那些我认为Struts中比较难分的类说明讲述一下。
Action
Action是一个接口,里面定义了SUCCESS NONE ERROR INPUT LOGIN 以及一个抽象方法execute()
import com.opensymphony.xwork2.Action;
/*
* 动作类:实现Action接口
*/
public class HelloAction2 implements Action {
@Override
public String execute() throws Exception {
System.out.println("HelloAction2执行了");
return SUCCESS;
}
}
ActionSupport
ActionSupport继承了Action接口,重写了execute()方法,定义了Validate()方法,在execute()执行前执行,如果校验失败会转入input处,所以需要在struts.xml中的result标签中定义name为input。
import com.opensymphony.xwork2.ActionSupport;
/*
* 继承ActionSupport类创建动作类
*/
public class HelloAction3 extends ActionSupport {
private static final long serialVersionUID = 1L;
}
Servlet
Servlet全名为Java Servlet是用Java编写的服务端的小程序,是应用程序设计接口和相关类和方法的Java程序。
ServletAPI
全名是Server+Applet,包括Java两个包
javax.servlet:定义了所有的Servlet类都必须实现或者扩展的通用接口和类。
javax.servlet.http:定义了采用Http协议通信的HttpServlet类。
Action访问Servlet的方式:
IOC方式:通过让它实现某些特定的接口,让Struts框架在运行时向Action实例注入request、session、application对象。
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.util.ServletContextAware;
import com.opensymphony.xwork2.ActionSupport;
public class Hello3Action extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
private HttpServletRequest request;
private HttpServletResponse response;
private HttpSession session;
private ServletContext application;
@Override
public void setServletResponse(HttpServletResponse response) {
this.response=response;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request=request;
}
@Override
public void setServletContext(ServletContext application) {
this.application = application;
}
}
非IOC方式:
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.ActionSupport;
public class HelloAction extends ActionSupport {
private HttpServletRequest request;
private HttpServletResponse response;
private HttpSession session;
private ServletContext application;
public String sayHello(){
request = ServletActionContext.getRequest();
response=ServletActionContext.getResponse();
session=request.getSession();
application=ServletActionContext.getServletContext();
return SUCCESS;
}
}
Tomcat
实现了ServletAPI,运行时将一些实现类自动实例化。
工作流程:Web客户向Servlet(Tomcat)容器发出HTTP请求,Servlet容器分析请求信息,容器创建HttpRequest和HttpResponse对象,在调用HttpServlet对象的service方法使将它们作为参数传递给HttpServlet对象,调用参数中对象的方法,获取请求,生成响应给Web。
ContextMap
OGNL上下文,是struts2中封装数据的最大的对象,所有的数据都可以在这个对象里面获取。
ContextMap一共有七个对象,除了ValueStack是栈结构,其他都是Map结构是key-value形式的。
Map中添加内容:
public class Demo1Action extends ActionSupport{
public String demo1(){
//获取ActionContext对象
ActionContext context = ActionContext.getContext();
//向Map中存入数据
context.put("contextMap", "hello context map");
//方式一:获取大Map中的小Map中的内容
Map<String,Object> applicationMap = context.getApplication();
applicationMap.put("applicatonMap", "hello application map");
//方式二:
ServletContext applicationAttr = ServletActionContext.getServletContext();
applicationAttr.setAttribute("applicationAttr", "hello application Attr");
return SUCCESS;
}
}
从Map中获取内容
<!-- 1.获取 -->
<s:property value="#contextMap"/><br/>
<!-- 2.获取大Map中的小Map -->
<s:property value="#application.applicatonMap"/><br/>
<s:property value="#application.applicationAttr"/>
ValueStack栈结构
public class Demo2Action extends ActionSupport{
public String demo2(){
//获取ActionContext对象
ActionContext context = ActionContext.getContext();
//获取ValueStack对象
ValueStack vs = context.getValueStack();
//可以push不同数据类型的内容
vs.push("你好");
return SUCCESS;
}
}
ActionContext
ActionContext是一个快速操作ContextMap的工具类,是线程安全的。
创建时间:核心控制器StrutsPrepareAndExecuteFilter的doFilter方法执行时
创建完ActionContext后就与线程进行了绑定:
维护的是Map结构:
ServletActionContext
继承了ActionContext类,提供了直接与Servlet相关对象访问的功能。
例子如ServletAPI。
小结:及时学习并总结是很有必要的,如果不总结就会越学越乱,最后感觉万物归一,然后丧失学习的兴趣,有问题就要及时解决,不能越堆越多,否则后面会很吃力的。