一、加入jar包
asm-3.3.jar,asm-commons-3.3.jar,asm-tree-3.3.jar,commons-fileupload-1.3.1.jar
commons-io-2.2.jar,commons-lang3-3.2.jar,commons-logging-1.1.3.jar,freemarker-2.3.22.jar
javassist-3.11.0.GA.jar,log4j-api-2.2.jar,log4j-core-2.2.jar,ognl-3.0.6.jar,struts2-core-2.3.24.jar,xwork-core-2.3.24.jar
二、web.xml文件中配置struts
<!-- 配置Struts -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
注:本质就是配置一个Struts2的Filter过滤器,进行拦截所有请求,交给Struts2处理
三、添加一个Action类
package zhuojing.struts;
import java.util.Map;
import org.apache.struts2.dispatcher.SessionMap;
import com.opensymphony.xwork2.ActionContext;
public class TestActionContextAction {
public String execute() {
//0.获取ActionContext
//ActionContext是Action上下文对象,可以获取Action的一切信息
ActionContext actionContext = ActionContext.getContext();
//1.获取application 对应的Map,并向其中添加一个属性
Map<String, Object> applicationMap = actionContext.getApplication();
applicationMap.put("applicationkey", "applicationValue");
System.out.println(applicationMap.get("applicationkey"));
//2.session
Map<String, Object> sessionMap = actionContext.getSession();
sessionMap.put("sessionKey", "sessionValue");
if(sessionMap instanceof SessionMap){
SessionMap sm = (SessionMap) sessionMap;
sm.invalidate();
System.out.println("session 失效了");
}
//3.request
Map<String, Object> requestMap = (Map<String, Object>)actionContext.get("request");
requestMap.put("requestKey", "requestValue");
//4.获取请求参数对应的Map,并获取指定的参数值,
//键 : 请求参数的名字 值:请求参数对应的字符串数组
Map<String, Object> paramterMap = actionContext.getParameters();
System.out.println(((String[])paramterMap.get("name"))[0]);
return "success";
}
}
注:在请求时Action中Struts会调用Action的execute方法,然后根据execute返回值和struts.xml配置文件的配置进行页面的跳转
ActionContext是Action上下文对象,可以获取Action的一切信息
四、struts.xml文件的配置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="default" extends="struts-default">
<action name="TestActionContext" class="zhuojing.struts.TestActionContextAction" method="execute">
<result name="success">/test/test-actionContext.jsp</result>
</action>
</package>
</struts>
注:属性说明(action标签):
name:action名称(请求是访问用的,访问地址为localhost:8080/项目名/TestActionContext.action,或者localhost:8080/项目名/TestActionContext),若想修改后缀则:
<!-- 配置Struts 可以受理的请求的扩展名 -->
<constant name="struts.action.extension" value="action,do,,"></constant>
action标签的method属性:表示请求action是调用的方法名称,默认是execute
result :一个action 节点可以配置第一个result 子节点,result 的name属性对应着action 方法可能有点一个返回值,name默认是success
result的type属性的值说明
a:chain:转发到一个action
b;dispatcher:转发(默认是这个):不能通过dispatcher实现chain
c:redirect:重定向:使用redirect 也能便捷的 实现 redirectAction 的功能
d:redirectAction:重定向到一个action:
使用param来实现重定向到一个action(注意必须有一个namespace相同的action,param name属性还有其他值)
eg:<result name="result_c" type="redirectAction">
<param name="actionName">redirectActionTest</param>
<param name="namespace">/zhuojing</param>
</result>
e:stream:文件上传下载的时候使用:跟redirectAction使用方法类似
五、Action返回JSON
package zhuojing.struts;
public class StrutsJson {
public String userName;
public String passWord;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public String testJson(){
System.out.println(userName+"-->"+passWord);
return "testJson";
}
}
注:会将name和password作为json输出,并且可以通过getter,setter获取请求参数
<!-- 使用ajax -->
<package name="ajax" extends="json-default">
<action name="testJson" class="zhuojing.struts.StrutsJson" method="testJson">
<result name="testJson" type="json"></result>
</action>
</package>
访问:http://localhost:8080/项目名/testJson.action?userName=11则返回 {"passWord":null,"userName":"11"}字符串
返回字符串:result标签中配置 <param name="root">userName</param>则:
访问:http://localhost:8080/项目名/testJson.action?userName=11则返回 11字符串
注:
我们为了方便实现Action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类, 并重载(Override)此类里的String execute()方法,因为ActionSupport已经实现了Action接口, 还实现了Validateable接口,提供了数据校验功能。通过继承该ActionSupport类,可以简化Struts 2的Action开发。
Action 跟 Actionsupport 的区别: 当我们在写action的时候,可以实现Action接口,也可以继承Actionsupport这个类.到底这两个有什么区别呢?
Action接口有:
public static final Java.lang.String SUCCESS = "success";
public static final java.lang.String NONE = "none";
public static final java.lang.String ERROR = "error";
public static final java.lang.String INPUT = "input";
public static final java.lang.String LOGIN = "login";
public abstract java.lang.String execute() throws java.lang.Exception;
而Actionsupport这个工具类在实现了Action接口的基础上还定义了一个validate()方法, 重写该方法,它会在execute()方法之前执行,如校验失败,会转入input处, 必须在配置该Action时配置input属性。
另外,Actionsupport还提供了一个getText(String key)方法还实现国际化,该方法从资源文件上获取国际化信息. 这样在自定义标签时可以定义一个变量为new actionsupport对象实现国际化。
ActionSupport类的作用 struts2不要求我们自己设计的action类继承任何的struts基类或struts接口, 但是我们为了方便实现我们自己的action,大多数情况下都会继承com.opensymphony.xwork2.ActionSupport类,并重写此类里的public String execute() throws Exception方法。 因为此类中实现了很多的实用借口,提供了很多默认方法,这些默认方法包括国际化信息的方法、默认的处理用户请求的方法等,这样可以大大的简化Acion的开发。
Struts2中通常直接使用Action来封装HTTP请求参数,因此,Action类里还应该包含与请求参数对应的属性,并且为属性提供对应的getter和setter方法