概述

之前在写一个项目的时候,用到了SSH框架,而前端正好需要用AJAX请求Struts,当时刚刚学完SSH框架,只知道action只能处理前台传来的数据,之后进行页面的跳转,却不知道怎么把数据传递给前端的页面,在查阅相关资料后,问题得到解决。

解决思路

思路一

因为AJAX接收的是服务端向浏览器输出的数据,所以只要向浏览器响应,然后输出内容就可以实现交互。比如,在AJAX请求Servlet组件的数据的时候,Servlet处理完从浏览器带来的数据,然后向浏览器直接输出处理后的结果,也就是响应内容,这时候AJAX就会接收这段内容,完成这次交互, 而如果让Action完成这个Servlet的操作,也就是说让Action向浏览器输出处理过后的内容,那么,ajax同样可以接收到后台处理的数据,进而刷新页面,这样就达到了action和AJAX交互的效果。向浏览器输出数据这个操作是response对象,只要拿到response对象,就可以向浏览器输出数据,就能和AJAX交互。

思路二

使用Struts提供的组件struts2-json-plugin,只需要导入相关jar包,然后在Struts.xml中配置相关返回值,就会把action相关的属性输出到页面上。

使用方法

原生方法

方法简介

ajax获取的数据是从服务器输出的数据,也就是封装到response中的数据,但是在Action中,并不能直接获取到response,所以可以用ServletActionContext获取getResponse,然后使用getWriter()方法,向浏览器输出数据。但是这种方法没法解析json。

代码实例

下面以登陆为例,写一下使用方法

  • LoginAction.java
public class LoginAction extends ActionSupport{
    
    private String userName;
    private 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 void login(){
        HttpServletResponse response = ServletActionContext.getResponse();
        if((userName.equals("howie"))&&passWord.equals("howie")){
            try {
                response.getWriter().write("OK");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}
  • login.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>登陆页面</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript">
        $(function(){
            $("#login").click(function(){
                var user = $("#userName").val();
                var pass = $("#passWord").val();
                $.ajax({
                    url : "${pageContext.request.contextPath}/login",
                    type : "POST",
                    data:
                    {
                        'userName':user,
                        'passWord':pass
                    },
                    success:function(data){   
                       if(data == "OK"){
                           alert("登陆成功!");
                           window.location.href = "${pageContext.request.contextPath}/admin.jsp";
                       }
                    }
                });
            });
        });
    </script>
  </head>
  
  <body>
    <form>
        用户名:<input type="text" id="userName"><br>
        密码:<input type="password" id="passWord"><br>
        <button id="login">登陆</button>
    </form>
  </body>
</html>

  • admin.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>管理页面</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  
  <body>
    管理界面
  </body>
</html>
  • struts.xml
<action name="login" class="com.zhangqiu.action.LoginAction" method="login"></action>

步骤总结

①导入Struts相关jar包

②配置Struts.xml中的action,action不要设置result子标签

<action name="Login" class="com.zhangqiu.action.LoginAction" method="login"></action>

③Action的相关java类

④获取response,并输出到浏览器

HttpServletResponse response = ServletActionContext.getResponse();
response.getWriter().write("OK");

⑤编写AJAX请求后台并进行前台页面的刷新

$(function(){
    $("#login").click(function(){
        var user = $("#userName").val();
        var pass = $("#passWord").val();
        $.ajax({
            url : "${pageContext.request.contextPath}/Login",
            type : "POST",
            data:
            {
                'userName':user,
                'passWord':pass
            },
            success:function(data){   
               if(data == "OK"){
                   alert("登陆成功!");
                   window.location.href = "${pageContext.request.contextPath}/admin.jsp";
               }
            }
        });
    });
});

注意事项

这里的Action的相关方法的返回值类型是void,然后在struts.xml里,不需要配置元素

缺点

以上可以看到,写法是比较麻烦的。需要在Action里通过ServletActionContext的静态方法,获取到PrintWriter,然后直接写入响应。

这种写法主要有2个缺陷,首先是与Servlet组件耦合,这在struts2应用里是不推荐的做法。其次是这个Action没有办法自动从请求中将json串解析为java的域,同样,如果需要将json串写入响应的话,也需要自行编码

使用struts2-json-plugin

方法简介

用struts2-json-plugin后可以直接在Struts.xml中配置输出到页面的相关属性,用这种集成的插件直接可以与AJAX交互

代码示例

下面以注册时检查用户名是否重复为例,写一下struts2-json-plugin的使用方法

  • RegisterAction.java
public class RegisterAction extends ActionSupport{
    
    private String userName;
    
    
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    //输出到浏览器上的变量值,也就是ajax接收的值
    private String result;
    public String getResult() {
        return result;
    }
    public void setResult(String result) {
        this.result = result;
    }
        
    public String register(){
        JSONObject json = new JSONObject();
        //模拟去数据库查询
        try {
            if(userName.equals("howie")){
                json.put("result", "对不起,当前账号已被注册");
            }else{
                json.put("result", "当前用户可以注册");
            }
            //为result赋值,传递到前台页面上,对应Struts.xml中的param下的属性
            result = json.toString();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return SUCCESS;
    }
}

  • register.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <script type="text/javascript">
        $(function(){
            $("#register").click(function(){
                
                $.ajax({
                    url:"${pageContext.request.contextPath}/register.action",
                    type:"POST",
                    data:
                    {
                        userName:$("#username").val()
                    },
                    success:function(data){
                        var resultJson = $.parseJSON(data);
                        $("#showResult").text(resultJson.result);
                    }
                });
            });
        });
    </script>
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  
  <body>
    用户名:<input type="text" id="username" name="userName">
    <br/>
    <input type="button" id="register" value="提交">
    <div id="showResult"></div>
  </body>
</html>
  • 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,json-default" namespace="/">
        <action name="register" class="com.imhowiw.action.RegisterAction" method="register">
                <!-- 返回json类型数据 -->
                <result type="json">
                    <param name="root">
                    <!-- result是action中设置的变量名,也是页面需要返回的数据,该变量必须有setter和getter方法 -->
                        result
                    </param>
                </result>
        </action>
    </package>
</struts>

使用步骤

①导入Struts相关jar包,struts2-json-plugin相关jar,json操作的jar包

②Action的相关java类,声明一个要输出到浏览器的属性,一定要重写set和get方法.

//输出到浏览器上的变量值,也就是ajax接收的值
private String result;
public String getResult() {
    return result;
}
public void setResult(String result) {
    this.result = result;
}

③设置action的相关逻辑方法

public String register(){
    JSONObject json = new JSONObject();
    //模拟去数据库查询
    try {
        if(userName.equals("howie")){
            json.put("result", "对不起,当前账号已被注册");
        }else{
            json.put("result", "当前用户可以注册");
        }
        //为result赋值,传递到前台页面上,对应Struts.xml中的param下的属性
        result = json.toString();
    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return SUCCESS;
}

④修改Struts.xml,package标签结点的extends要设置json-default,action中的result不用设置name,默认为success,如果设置为别的要和Action方法的返回值相同,type要设置json, result结点下的param的name属性要设置为root,param结点内容为action中设置的变量名,也是页面需要返回的数据,该变量必须有setter和getter方法。

<?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,json-default" namespace="/">
        <action name="register" class="com.imhowiw.action.Register" method="register">
                <!-- 返回json类型数据 -->
                <result type="json">
                    <param name="root">
                    <!-- result是action中设置的变量名,也是页面需要返回的数据,该变量必须有setter和getter方法 -->
                        result
                    </param>
                </result>
        </action>
    </package>
</struts>

注意事项

①Struts的版本要和struts2-json-plugin的版本兼容。

②在Action中与第一种方法不同的是,处理方法的返回值不是空的,而是String 类型

实例

具体的示例,在前面的使用方法中已经贴出代码。然后在GitHub上上传了一份完整的简单Demo Demo下载地址

最后编辑:2021年02月09日 ©著作权归作者所有

评论已关闭