一 跳转之 转发(struts.xml默认的跳转方式)
package cn.hd.jump;
import com.opensymphony.xwork2.ActionSupport;
public class ChainAction extends ActionSupport {
public String jump(){
System.out.println("转发到 TargetAction");
return SUCCESS;
}
}
struts.xml配置
<action name="chainAction_*" class="cn.hd.jump.ChainAction" method="{1}">
<result name="success" type="chain">
<!--跳转到下一个action的名字-->
<param name="actionName">targetAction</param>
<!--跳转到下一个action的命名空间-->
<param name="nameSpace">/</param>
</result>
<allowed-methods>jump</allowed-methods>
</action>
二 跳转之重定向
package cn.hd.jump;
import com.opensymphony.xwork2.ActionSupport;
public class RedirectActon extends ActionSupport{
public String jump(){
System.out.println("执行了重定向到targetAction");
return SUCCESS;
}
}
struts.xml配置
<action name="redirectAction_*" class="cn.hd.jump.RedirectActon" method="{1}">
<result name="success" type="redirectAction">
<param name="actionName">targetAction</param>
<param name="nameSpace">/</param>
</result>
</action>
三 跳转之转发到自己的Action
package cn.hd.jump; import com.opensymphony.xwork2.ActionSupport; public class ChainAction extends ActionSupport { public String jump(){ System.out.println("转发到 TargetAction"); return SUCCESS; } }
struts.xml配置
<result name="success" type="chain">
<!--跳转到下一个action的名字-->
<param name="actionName">targetAction</param>
<!--跳转到下一个action的命名空间-->
<param name="nameSpace">/</param>
</result>
四 跳转到重定向自己的Action
package cn.hd.jump;
import com.opensymphony.xwork2.ActionSupport;
public class RedirectActon extends ActionSupport{
public String jump(){
System.out.println("执行了重定向到targetAction");
return SUCCESS;
}
}
struts.xml配置
<action name="redirectAction" class="cn.hd.jump.RedirectActon">
<result name="success" type="redirectAction">
<param name="actionName">targetAction_login</param>
<param name="nameSpace">/</param>
</result>
</action>
五 不跳转 ,接收Ajax请求
(1)使用原生的servletApi
package cn.hd.servletApi;
import com.alibaba.fastjson.JSONObject;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.ServletResponseAware;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
public class demo2 extends ActionSupport implements ServletResponseAware {
private HttpServletResponse response;
@Override
public String execute() throws Exception {
JSONObject jsonObject = new JSONObject();
jsonObject.put("msg","访问成功");
jsonObject.put("code",1);
String result = jsonObject.toJSONString();
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.write(result);
out.flush();
out.close();
return NONE;
}
@Override
public void setServletResponse(HttpServletResponse httpServletResponse) {
this.response = httpServletResponse;
}
}
Action 在struts2中,我们把它叫做数据中心,数据包括(Request原生对象、Response原生对象、Session原生对象、ServletContext原生对象)
Request(域)Map struts2不建议使用,如果要用就用ActionContext对象
Session(域)Map
ServletContext(域)Map
attr(域)Map
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Map;
public class Demo extends ActionSupport {
public String execute(){
ActionContext context = ActionContext.getContext();
//获得session域
Map<String, Object> session = context.getSession();
session.put("name","莫邪");
String name = (String) session.get("name");
//获取application域
Map<String, Object> application = context.getApplication();
application.put("age",10);
//获取request域
Map<String,Object> request = (Map<String, Object>) context.get("request");
request.put("name","君莫邪");
context.put("name","君莫邪");
return SUCCESS;
}
}
//获得servletContext域
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
public class demo1 extends ActionSupport {
@Override
public String execute() throws Exception {
javax.servlet.http.HttpServletRequest request = ServletActionContext.getRequest();
String name = request.getParameter("name");
System.out.println(name);
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.write("name:莫邪");
out.flush();
out.flush();
return NONE;
}
}
ActionContext生命周期:
所有的servlet对象都存了,它的生命周期是随着其中最短的生命周期的创建和销毁。也就是request对象
每次请求到来。ActionConext都会重新创建
所以它解决了线程安全问题
使用servletApi响应ajax请求
首先获得response对象(2种方法)然后回到原生态servlet响应中
action中的方法的返回值必须是NONE(如果设置为NON那么在struts.xml中就不用写result标签了)
(2)Stream在Action类中,创建一个InputStream对象
给这个对象创建一个get方法
package cn.hd.ajax;
import com.alibaba.fastjson.JSONObject;
import com.opensymphony.xwork2.ActionSupport;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
public class StreamAction extends ActionSupport {
private InputStream inputStream;
public InputStream getInputStream() {
return inputStream;
}
@Override
public String execute() throws Exception {
JSONObject jsonObject = new JSONObject();
jsonObject.put("msg","访问stream成功");
jsonObject.put("code",1);
String result = jsonObject.toJSONString();
inputStream=new ByteArrayInputStream(result.getBytes("UTF-8"));
return SUCCESS;
}
}
struts.xml中的result标签中设置type=stream
<package name="ajax" namespace="/" extends="struts-default">
<action name="stream" class="cn.hd.ajax.StreamAction" method="execute" >
<result name="success" type="stream"></result>
</action>
</package>
Action最终可以将json字符串转化为inputStream流
(3)使用json插件
①导包
建立一个Action类
定义你想要返回的json的键名
生成get和set方法
然后在Action访问的方法中为这个json键名的对象进行赋值
package cn.hd.ajax;
import com.opensymphony.xwork2.ActionSupport;
public class pluginAction extends ActionSupport {
private String msg;
private Integer code;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
@Override
public String execute() throws Exception {
msg="访问PluginAction成功";
code=1;
return SUCCESS;
}
}
配置struts.xml文件
重新建package extends 继承不能写struts-default,要写json-default(在struts-json-plugin包的struts-plugin.xml中)
Action不变
result name 属性不变 ,type属性变为json(在struts-json-plugin包的struts-plugin.xml中)
<package name="plugin" namespace="/" extends="json-default">
<action name="pluginAction" class="cn.hd.ajax.pluginAction" method="execute">
<result name="success" type="json"></result>
</action>
</package>