一:ajax获取自定义Struts框架中的json编码 出现以下 问题:
1,强制flush输出 json编码打印在首页
2, 不强制flush js会解析json 打印出来的是错误的jsp页面 却没有跳转到错误页面
3, ajax中的dataType的json 改为text 会打印错误的页面数据
问题关键代码如下;
//处理登陆的servlet // 获得登陆页面提交的数据 String username = request.getParameter("username"); String userpwd = request.getParameter("userpwd"); try { // 连接数据库查询用户是否存在 Connection conn = DBUilt.getConn(); String sql = "select userid from role_user where userid=? and userpwd=?"; PreparedStatement pstm = conn.prepareStatement(sql); pstm.setString(1, username); pstm.setString(2, userpwd); ResultSet rs = pstm.executeQuery(); if (rs.next()) { String name = rs.getString(1); // 存在就存到会话对象中 HttpSession session = request.getSession(); session.setAttribute("name", name); PrintWriter out = response.getWriter(); String username = (String) request.getSession().getAttribute("name"); try { // 连接数据库查询用的权限 // 使用JSon编码格式获取,java转为json String str = "{}"; // 队列存储json的编码格式 ArrayList<JSONObject> jsonlist = new ArrayList<JSONObject>(); Connection conn2 = DBUilt.getConn(); String limitSql = "select parentnode, menuname,menuhref ,maxnode from role_menu where menuid in (select menuid from role_role where userid=?)"; PreparedStatement pstm2 = conn2.prepareStatement(limitSql); pstm2.setString(1, username); ResultSet rst = pstm2.executeQuery(); while (rst.next()) { JSONObject jsonobj = JSONObject.fromObject(str); jsonobj.put("node", rst.getString(1)); jsonobj.put("menu", rst.getString(2)); jsonobj.put("href", rst.getString(3)); jsonobj.put("max", rst.getString(4)); jsonlist.add(jsonobj);// 将转化的JSON对象放到队列中 } rst.close(); out.write(jsonlist.toString());// 写到页面 out.flush(); // json打印在首页 json的接受解析不会执行, // 不强制flush js会解析json 打印出来的是错误的jsp页面 页面页面却没有跳转 System.out.println(jsonlist.toString()); return "index.jsp"; } else { return "loginFail.html"; } } catch (Exception e) { return "loginFail.html"; }
jsp页面的代码:
<script type="text/javascript"> var date; //创建ajax函数页面加载是自动的处理 $(function() { alert("AJAX执行了"); $.ajax({ type : "POST", async : true, //异步提交数据 url : "MenuAction.ser",//请求的路径 dataType : "json", //数据的格式 error:function(){ alert("json没有获取到!!!!"); }, success : function(data) {//请求成功的数据 for(var nn=0; nn<data.length;nn++){ var node=data[nn].node; var menu=data[nn].menu; var href=data[nn].href; var max=data[nn].max; d.add(node, max, menu, href); alert(node+"<>"+max+"<>"+ menu+"<>"+ href); } } }); }); </script> </head> <body> <div class="dtree"> </div> </body>
解决思路:
1,问题一的解决: ajax是异步提交数据,需要将ajax获取后台数据的json的Action写成一个新的类
2,问题二.三的解决: 在后台的json数据返回中response需要设置响应的数据格式,设置响应response.setContentType("text/json");
修改后的代码:
1, 连接数据库的代码和返回json数据的代码分开写两个类 并t且在json格式类中设置("text/json")格式 代码如下;
数据库的连接类;
//处理登陆的servlet public class LoginServlet implements ActionInterface { @Override public String exectu(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获得登陆页面提交的数据 String username = request.getParameter("username"); String userpwd = request.getParameter("userpwd"); try { // 连接数据库查询用户是否存在 Connection conn = DBUilt.getConn(); String sql = "select userid from role_user where userid=? and userpwd=?"; PreparedStatement pstm = conn.prepareStatement(sql); pstm.setString(1, username); pstm.setString(2, userpwd); ResultSet rs = pstm.executeQuery(); if (rs.next()) { String name = rs.getString(1); // 存在就存到会话对象中 HttpSession session = request.getSession(); session.setAttribute("name", name); return "index.jsp"; } else { return "loginFail.html"; } } catch (Exception e) { return "loginFail.html"; } } }
//ajax动态获取json的Action类
public class MenuAction implements ActionInterface { @Override public String exectu(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/json"); PrintWriter out = response.getWriter(); String username = (String) request.getSession().getAttribute("name"); try { // 连接数据库查询用的权限 // 使用JSon编码格式获取,java转为json String str = "{}"; // 队列存储json的编码格式 ArrayList<JSONObject> jsonlist = new ArrayList<JSONObject>(); Connection conn2 = DBUilt.getConn(); String limitSql = "select parentnode, menuname,menuhref ,maxnode from role_menu where menuid in (select menuid from role_role where userid=?)"; PreparedStatement pstm2 = conn2.prepareStatement(limitSql); pstm2.setString(1, username); ResultSet rst = pstm2.executeQuery(); while (rst.next()) { JSONObject jsonobj = JSONObject.fromObject(str); jsonobj.put("node", rst.getString(1)); jsonobj.put("menu", rst.getString(2)); jsonobj.put("href", rst.getString(3)); jsonobj.put("max", rst.getString(4)); jsonlist.add(jsonobj);// 将转化的JSON对象放到队列中 } rst.close(); out.write(jsonlist.toString());// 写到页面 out.flush(); // json打印在首页 json的接受解析不会执行, // 不强制flush js会解析json 打印出来的是错误的jsp页面 页面页面却没有跳转 System.out.println(jsonlist.toString()); } catch (Exception ef) { ef.printStackTrace(); } return null; } }
js中的ajax代码;不用修改
二:自定义的struts框架 主控制器出现转发错误及解决思路;
Struts的主控制中转发的错误代码:
try{ //str是servlet返回的是一个地址 if (str != null) { //转发到相应的地址 request.getRequestDispatcher(str).forward(request, response); }else{ //为null就转发到错误的页面 request.getRequestDispatcher(str).forward(request, response); } } catch (Exception e) { //出现异常就转发到错误的页面 request.getRequestDispatcher("loginFail.html").forward(request, response); }
程序运行会出现以下异常:
//在MVC设计模式中,主控制器不要进行else的判断,否者会以下错误
//java.lang.IllegalStateException: Cannot forward after response has been committed
responsed不可以被重复的提交
思路分析;
如果地址不null空 程序会转发到响应的str地址页面,地址为null就会先执行else的转发再执行try-catch()中的转发,这样会导致response响应两次,就会出现上面的response被重复的提交 ,解决办法除掉else的响应
修改后的代码:
try{ //str是servlet返回的是一个地 if (str != null) { request.getRequestDispatcher(str).forward(request, response); } } catch (Exception e) { request.getRequestDispatcher("loginFail.html").forward(request,response); }
相关推荐
在本场景中,我们将探讨如何使用AJAX来传递JSON数组,并在Struts2的Action中接收和处理这些数据。 首先,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,同时也易于机器解析...
Struts2是一个强大的MVC(模型-视图-控制器)框架,它允许开发者构建可维护性和可扩展性极强的企业级Web应用。Ajax(异步JavaScript和XML)技术则为Web应用提供了局部刷新的能力,提高了用户体验。JSON(JavaScript ...
总的来说,"struts2+json"资源涉及到了Struts2框架中的Action设计、拦截器机制、结果类型的配置,以及AJAX和JSON在Web应用中的使用。理解这些知识点对于开发动态、交互性强的Java Web应用至关重要。
使用Struts2和jQuery EasyUI实现简单CRUD系统,从零开始,从基础的ajax与Struts2的使用json格式进行交互开始。
“ajax,struts2,json实现省市区三级联动源码含全国省市区数据库”这一标题揭示了这个压缩包包含的是一项使用AJAX、Struts2和JSON技术来实现的省市区三级联动功能的源代码。这项技术常用于web应用中,允许用户在选择...
在探讨“Struts2与JSON整合”的主题时,我们深入分析了如何在Struts2框架中集成JSON技术,实现前后端数据的高效交互。Struts2作为一款流行的Java Web开发框架,提供了丰富的功能来简化Web应用程序的开发过程。而JSON...
Struts2、JSON和AJAX是Web开发中的关键技术,它们的整合可以实现高效的数据交互和动态页面更新。本文将深入探讨这些技术以及如何在实际项目中整合它们。 **Struts2** 是一个基于MVC(Model-View-Controller)设计...
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web开发中,它易于人阅读和编写,同时也易于机器解析和生成。在Java世界里,`json-lib-2.1.jar` 是一个用于处理JSON的库,它提供了一系列...
总结来说,这个AjaxStruts2Json实例展示了如何在Struts2框架下利用Ajax进行异步请求,通过JSON传递和处理数据,从而实现网页的局部刷新。实践这个实例,开发者可以更深入地理解Struts2、Ajax以及JSON在实际项目中的...
【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和JSON。这个项目的核心目标是构建一个可复选的权限树形结构,用户通过勾选节点...
Struts2是一个流行的Java web应用程序框架,它基于MVC(模型-视图-控制器)设计模式,用于构建高效、可扩展的企业级应用。Struts2提供了丰富的特性,如拦截器、插件架构、强大的标签库等,使得开发者能更方便地处理...
在Struts2框架中整合Ajax以实现异步数据交互,JSON(JavaScript Object Notation)扮演了关键角色。JSON是一种轻量级的数据交换格式,它允许Web应用与服务器之间高效地传输数据,而无需进行繁琐的HTTP请求。在这个...
在IT行业中,jQuery、AJAX、JSON以及Struts2是四个非常重要的技术,它们在Web开发领域中扮演着核心角色。下面将详细解释这些技术及其相互间的集成。 **jQuery** 是一个快速、简洁的JavaScript库,它简化了HTML文档...
Struts2、JSON、Ajax 和 jQuery 是Web开发中的四个关键技术,它们共同构建了现代Web应用程序的数据交互和用户界面交互的核心部分。 Struts2 是一个基于MVC(Model-View-Controller)架构的Java Web框架,它使得...
在本场景中,我们将重点讨论如何利用Struts2作为后台处理框架,与前端Ajax通过JSON(JavaScript Object Notation)数据格式进行数据交换。 **Struts2框架** Struts2是一个基于MVC(Model-View-Controller)设计模式...
这个插件主要的功能是让Struts2应用程序能够轻松地处理JSON(JavaScript Object Notation)数据格式,使得Web应用可以方便地进行JSON序列化和反序列化,从而实现与前端的Ajax交互。 Struts2是一个基于Model-View-...
Struts2是一个强大的MVC(模型-视图-控制器)框架,它极大地简化了Java Web应用程序的开发。在Struts2中,Ajax和JSON技术的结合使得前后端交互变得更加高效和实时,为用户提供了更好的体验。现在我们来深入探讨这些...
在本文中,我们将探讨两种在Struts2框架中返回JSON数据的方法。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端交互,尤其是在AJAX请求中。Struts2提供了一套方便的机制来支持JSON...
在Web开发中,jQuery、Ajax、Struts2和JSON是常用的技术栈,它们结合使用能够构建动态、交互式的网页应用。下面将详细讲解这些技术及其在"JQuery发起ajax请求Struts2,并操作JSON数据的例子"中的应用。 **jQuery** ...
在Web开发中,jQuery、Struts2、Ajax和JSON是常见的技术组合,它们协同工作以实现动态、异步的数据交互。本示例将探讨如何利用jQuery的Ajax功能向Struts2框架发送请求,并以JSON格式接收响应数据。下面我们将详细...