struts2怎么处理ajax请求

struts2接收ajax请求参数有三种方法

首先说一下struts2是线程安全的,为什么说struts2是线程安全的呢,因为在struts2中struts2把所有的域对象全都封装到了actioncontext对象中,所以actioncontext对象的生命周期和request域对象的生命周期相同,也就是每次请求的到来会重新去创建一个actioncontext对象,所以请求与请求之间不使用相同的资源,所以struts2就是线程安全的了

另外呢action类(代替servlet的类)的创建一共有三种方式

1,pojo类

就是普通的java对象,跟创建普通的类没有区别,也就是没有继承也没有实现

2,实现action接口

3,继承ActionSupport类(推荐使用这种,可能是因为我喜欢用)

在action类中的方法模板是固定的 权限:public 返回值类型:String方法中不允许接收参数,

参数的接收

1,属性驱动

因为struts是线程安全的,所以在action类中可以直接定义属性(也可以说是全局变量,而servlet是存在线程安全问题的所以不能使用全局变量),在action类中定义属性名,然后设置set get 方法,然后在访问的地方传入对应的属性名和值,struts2会自动的帮你写入到你在action中定义的属性中

public class AttrAction extends ActionSupport {
    //定义一个名字属性
    private String name;
    //定义一个密码属性
    private String psd;

    /**
     * 写一个登录的方法
     * @return 但会一个NONE这里返回为NONE的话就不需要在排位置文件写result
     */
    public String login(){
        System.out.println(name);
        System.out.println(psd);
        return NONE;
    }

    
    //下面试get set方法
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPsd() {
        return psd;
    }

    public void setPsd(String psd) {
        this.psd = psd;
    }
}
2,对象驱动

定义一个bean类在action中定义一个bean对象加上get set方法,并且在请求的地方请求参数的键名有规定,比如按照规定的 对象名+.+对象的属性名 的方式传递

public class ObjAction extends ActionSupport {
//    定义一个对象 这里注意前台传的参数的键名要用user.name和user.psd
    private User user;

    /**
     * 这里的重写了ActionSupport中的方法这个方法是默认调用的
     * 就是在配置文件中指定访问到这个action类不指定方法是会默认调用的
     * @return
     * @throws Exception
     */
    @Override
    public String execute() throws Exception {
        System.out.println(user);
        return NONE;
    }

//    定义的属性的get set方法
    public void setUser(User user) {
        this.user = user;
    }

    public User getUser() {
        return user;
    }
}
3,模板驱动

模板驱动在从创建action的时候需要实现一个ModuleDriver<>接口,实现这个接口的时候要在尖括号中声明你要接收的实例类对象,实现接口中的一个方法,在action中创建一个bean对象,并且创建的时候需要用new的方法创建这个对象,请求的地方还是按照键名要和对象的属性名相同。

//实现ModelDriven<>接口 要在这里声接收的哪个对象
public class ModuleAction extends ActionSupport implements ModelDriven<User> {
//    定义一个对象属性 这里一定要用new的方式
    //至于为什么不太明白,不过这是工具学会怎么用就行了
    private User user = new User();
    @Override
    public String execute() throws Exception {
        System.out.println(user);
        return NONE;
    }

    //实现的ModelDriven<>中的方法,
    //这里这个return记得修改成自己定义的对象属性
    @Override
    public User getModel() {
        return user;
    }
}

ajax请求的响应

1,servletapi响应ajax请求

(1)首先获得response对象(2种方法)然后就回到了原生态的servlet响应中

        第一种方法

package cn.hd.servletApi;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;

import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;

public class Demo1 extends ActionSupport {
    //这个方法一般不用用这个方法换不如用原生的servlet
    @Override
    public String execute() throws Exception {
        HttpServletResponse response = ServletActionContext.getResponse();
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        out.write("name:456");
        out.flush();
        out.close();
        return NONE;
    }
}

        第二种方法(同样的也是一般不用)

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;
    }
}
2,stream

在action类中创建一个inputStream对象,添加get方法,在struts.xml中的result标签中设置type=stream,action最终将json字符串转化为inputStream流

public class StreamAction extends ActionSupport {
    public InputStream inputStream;
    @Override
    public String execute() throws Exception {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("msg","访问StreamAction成功");
        jsonObject.put("code",1);
        String result = jsonObject.toJSONString();
        inputStream = new ByteArrayInputStream(result.getBytes("UTF-8"));
        return SUCCESS;
    }

    public InputStream getInputStream() {
        return inputStream;
    }
}
3,使用json插件

(1)需要导入一个包


(2)建立一个action类,定义想要返回的json字符串的键名,生成get set方法然后在action访问的方法中为json键名的属性进行赋值,struts2会自动的检测的这个属性的值有变化,然后自动的放回给前台

(3)配置struts2.xml文件,重新写一个package标签,extends继承不能写struts-default要写json-default,action不变,result name属性不变type属性变为json

配置文件代码

<action name="plugin2" class="cn.hd.ajax.PluginAction2" method="execute">
            <result name="success" type="json">
                <!--参数的过滤正则表达式的书写方法-->
                <param name="includeProperties">
                    msg,
                    users\[\d+\]\.name
                </param>
            </result>
        </action>

action类代码

public class PluginAction2 extends ActionSupport {
    private String msg;
    private String code;
    private List<User> users = new ArrayList<>();

    @Override
    public String execute() throws Exception {
        msg = "访问PluginAction成功";
        code = "1";
        users.add(new User("zsc","hn","123","1000"));
        users.add(new User("lcj","hn","123456","10000"));
        return SUCCESS;
    }

    public List<User> getUsers() {
        return users;
    }

    public void setUsers(List<User> users) {
        this.users = users;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}


  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值