首页 新闻 会员 周边

json 访问action 返回数据在前端显示

0
[已解决问题] 解决于 2018-05-09 13:25
 1 $(".sortCondition").click(function(){
 2     var condition=$(this).text();
 3     alert(condition);
 4     $.ajax(
 5       {
 6        url:'findProject.action',
 7        type:'post',
 8        data:condition,//传递的参数
 9        dataType:"JSON",
10        success:function(data){
11             alert(data);
12             var backdata=JSON.parse(data); 
13             for(var i=0;i<backdata.length;i++){
14                 $(".content").append("<li title=‘’>${backdata[i].projector.projector_name}</li>");
15                   $(".content").append("<li title=‘’>${backdata[i].project_name}</li>");
16                   $(".content").append("<li title=‘’>${backdata[i].project_explain}</li>");
17             }
18      },
19          error:function(){
20           alert("出错了");
21          }
22      }
23      ); 
24 });

元素$(".sortCondition")被点击后,向findProject.action请求,并把返回数据填充到 $(".content")里面,

<div>
    <ul class="content">
    </ul>
</div>

我的action写法:

 1 public class ProjectAction extends ActionSupport{
 2 
 3 private static final long serialVersionUID = 1L;
 4     
 5     private ProjectService projectService = null;
 6     private Project project = null;
 7     private Projector projector = null;
 8     private ProjectorService projectorService = null;
 9     private String condition; //前端传的条件参数
10     private String backData;//返回参数
11     
12     public String find() {
13          System.out.println(condition);
14          List<Project> list = null;
15          if(condition.equals("时间排序")){
16             list = projectService.orderByTime();
17          }
18              JSONObject json=JSONObject.fromObject(list);
19              setBackData(json.toString());
20              return SUCCESS;
21     }
22     public ProjectService getProjectService() {
23         return projectService;
24     }
25     public void setProjectService(ProjectService projectService) {
26         this.projectService = projectService;
27     }
28     public Project getProject() {
29         return project;
30     }
31     public void setProject(Project project) {
32         this.project = project;
33     }
34     public Projector getProjector() {
35         return projector;
36     }
37     public void setProjector(Projector projector) {
38         this.projector = projector;
39     }
40     public ProjectorService getProjectorService() {
41         return projectorService;
42     }
43     public void setProjectorService(ProjectorService projectorService) {
44         this.projectorService = projectorService;
45     }
46     public String getCondition() {
47         return condition;
48     }
49     public void setCondition(String condition) {
50         this.condition = condition;
51     }
52     public String getBackData() {
53         return backData;
54     }
55     public void setBackData(String backData) {
56         this.backData = backData;
57     }

struts.xml配置:

1 <package name="project" extends="json-default">
2 
3 <action name="*Project" class="cn.ncu.et.action.ProjectAction" method="{1}">
4     <result name="success" type="json">                
5             <param name="root">backData</param>
6         </result>
7 </action>
8 
9 </package>            

刚刚学的,有很多东西不是很清楚,希望大神解答,多谢多谢

可爱的丶男孩子的主页 可爱的丶男孩子 | 菜鸟二级 | 园豆:222
提问于:2018-04-18 09:45

你的问题是什么?

Shendu.cc 6年前

@Shendu.cc: 访问不到action,find方法没执行,直接执行的
error:function(){
  alert("出错了");
}方法

可爱的丶男孩子 6年前

@Shendu.cc: 我觉得我action返回json数据到前端应该也有问题,我有点菜,不知道哪里有问题

可爱的丶男孩子 6年前
< >
分享
最佳答案
0

查看web.xml里面,有没有设置拦截.action的请求

 <filter>
<!--  配置Struts2核心控制器的名字 -->
    <filter-name>struts2</filter-name>
<!--  配置Struts2核心控制器的实现类 -->
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
<!--  配置Struts2拦截的URL -->
  <filter-mapping>
<!--  配置Struts2拦截器的名字 -->
    <filter-name>struts2</filter-name>
<!--  配置Struts2的核心FilterDispatcher拦截所有请求 -->
    <url-pattern>/*</url-pattern> 或者<url-pattern>/*.action</url-pattern>
  </filter-mapping>

 

<action name="*Project"

ajax 里的url是findProject.action

你还是把他们的名字设成一样: findProject

 

如果都正确的话。你可以在error: function()里打印错误的状态码

  error: function (XMLHttpRequest, textStatus, errorThrown) {
                    // 状态码
                    console.log(XMLHttpRequest.status);
                    // 状态
                    console.log(XMLHttpRequest.readyState);
                    // 错误信息   
                    console.log(textStatus);
                }

查看是什么错误。

奖励园豆:5
Shendu.CC | 老鸟四级 |园豆:2138 | 2018-04-18 09:59
<package name="project" extends="json-default">

<action name="findProject" class="cn.ncu.et.action.ProjectAction"method="find">
    <result name="success" type="json">
                 <param name="root">backData</param>
         </result>
</action>

</package>

改成这样的了,web.xml上面配置了拦截为/*

<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>

还是不行,我后端获取condition属性,然后像下面这样处理

public String find() {
         System.out.println(condition);
         List<Project> list = null;
         if(condition.equals("时间排序")){
            list = projectService.orderByTime();
         }
             JSONObject json=JSONObject.fromObject(list);
             setBackData(json.toString());
             return SUCCESS;
    }

前端像下面这样操作list

 success:function(data){
             alert(data);
             var backdata=JSON.parse(data); 
            for(var i=0;i<backdata.length;i++){
               $(".content").append("<li title=‘’>${backdata[i].projector.projector_name}</li>");
                   $(".content").append("<li title=‘’>${backdata[i].project_name}</li>");
                   $(".content").append("<li title=‘’>${backdata[i].project_explain}</li>");
             } 
},

这些有问题吗,我觉得可能是我数据转换的过程中哪里写的有问题,

可爱的丶男孩子 | 园豆:222 (菜鸟二级) | 2018-04-18 10:11

你好,我调试了一下,后台获取不到前台传的的condition属性

url:'findProject.action',
type:'post',
data:"condition"+condition,
dataType:"JSON",

ajax的data加了一个name,后台改成这样的

public String find() {
    setCondition(ServletActionContext.getRequest().getParameter("condition"));
    System.out.println(condition);

打印condition结果仍未null

可爱的丶男孩子 | 园豆:222 (菜鸟二级) | 2018-04-18 10:43

@可爱的丶男孩子: 你确定请求可以到达find()函数里吗?你Debug一下,在find函数里设置断点,看看请求能否走到find函数里。

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-04-18 11:27

@Shendu.cc: 现在可以获取到condition属性的值了,但是报了一个奇怪的错误

点进去是这样的

xhr.send( ( s.hasContent && s.data ) || null );这行报错,换了一个jquery版本也会报错

可爱的丶男孩子 | 园豆:222 (菜鸟二级) | 2018-04-18 11:33

@可爱的丶男孩子: 500是后台服务端的错误,应该是你的action有错误。还是建议Debug,一步步走下去,看能否顺利走完。

Shendu.CC | 园豆:2138 (老鸟四级) | 2018-04-18 11:49
其他回答(1)
0

error:function(data){}这里面也有返回数据的的吧?有可能是后台出错了?

华临天下 | 园豆:1501 (小虾三级) | 2018-04-18 10:01

调试了一下,没有获取到前台传的condition属性,我改了一下data,加了一个name,

url:'findProject.action',
type:'post',
data:"condition"+condition,
dataType:"JSON",

后台这样写的

public String find() {
    setCondition(ServletActionContext.getRequest().getParameter("condition"));
    System.out.println(condition);

打印出来的condition仍为null。。

支持(0) 反对(0) 可爱的丶男孩子 | 园豆:222 (菜鸟二级) | 2018-04-18 10:40

@可爱的丶男孩子: data: { val1: "1", val2: "2" }, //要发送的数据(参数)格式为{'val1':"1","val2":"2"}

参数要是这样的格式的吧

支持(0) 反对(0) 华临天下 | 园豆:1501 (小虾三级) | 2018-04-18 10:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册