概述
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;
}
}
最后
以上就是腼腆火车为你收集整理的struts2怎么处理ajax请求的全部内容,希望文章能够帮你解决struts2怎么处理ajax请求所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复