`
百合不是茶
  • 浏览: 356140 次
社区版块
存档分类
最新评论

ajax获取Struts框架中的json编码异常和Struts中的主控制器异常的解决办法

阅读更多

一: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);
   }

 

 

 

  

0
0
分享到:
评论

相关推荐

    AJAX和struts2传递JSON数组

    在本场景中,我们将探讨如何使用AJAX来传递JSON数组,并在Struts2的Action中接收和处理这些数据。 首先,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它易于人阅读和编写,同时也易于机器解析...

    Struts2 ajax json使用介绍

    Struts2是一个强大的MVC(模型-视图-控制器)框架,它允许开发者构建可维护性和可扩展性极强的企业级Web应用。Ajax(异步JavaScript和XML)技术则为Web应用提供了局部刷新的能力,提高了用户体验。JSON(JavaScript ...

    struts2+json

    总的来说,"struts2+json"资源涉及到了Struts2框架中的Action设计、拦截器机制、结果类型的配置,以及AJAX和JSON在Web应用中的使用。理解这些知识点对于开发动态、交互性强的Java Web应用至关重要。

    ajax与Struts2使用json格式交互实例

    使用Struts2和jQuery EasyUI实现简单CRUD系统,从零开始,从基础的ajax与Struts2的使用json格式进行交互开始。

    ajax,struts2,json实现省市区三级联动源码含全国省市区数据库

    “ajax,struts2,json实现省市区三级联动源码含全国省市区数据库”这一标题揭示了这个压缩包包含的是一项使用AJAX、Struts2和JSON技术来实现的省市区三级联动功能的源代码。这项技术常用于web应用中,允许用户在选择...

    struts2与json整合

    在探讨“Struts2与JSON整合”的主题时,我们深入分析了如何在Struts2框架中集成JSON技术,实现前后端数据的高效交互。Struts2作为一款流行的Java Web开发框架,提供了丰富的功能来简化Web应用程序的开发过程。而JSON...

    struts2+json+ajax整合例子(导入即可运行,附带详细教程)

    Struts2、JSON和AJAX是Web开发中的关键技术,它们的整合可以实现高效的数据交互和动态页面更新。本文将深入探讨这些技术以及如何在实际项目中整合它们。 **Struts2** 是一个基于MVC(Model-View-Controller)设计...

    json-lib-2.1.jar和struts2-json-plugin-2.1.8.1.jar

    JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web开发中,它易于人阅读和编写,同时也易于机器解析和生成。在Java世界里,`json-lib-2.1.jar` 是一个用于处理JSON的库,它提供了一系列...

    AjaxStruts2Json实例

    总结来说,这个AjaxStruts2Json实例展示了如何在Struts2框架下利用Ajax进行异步请求,通过JSON传递和处理数据,从而实现网页的局部刷新。实践这个实例,开发者可以更深入地理解Struts2、Ajax以及JSON在实际项目中的...

    ZTree+Struts2+ajax+json实现checkbox权限树

    【标题】"ZTree+Struts2+ajax+json实现checkbox权限树"涉及的技术栈主要集中在前端的ZTree,后端的Struts2框架,以及数据交互中的Ajax和JSON。这个项目的核心目标是构建一个可复选的权限树形结构,用户通过勾选节点...

    struts2所需的包和Struts2_json所需包

    Struts2是一个流行的Java web应用程序框架,它基于MVC(模型-视图-控制器)设计模式,用于构建高效、可扩展的企业级应用。Struts2提供了丰富的特性,如拦截器、插件架构、强大的标签库等,使得开发者能更方便地处理...

    json2+jsonplugin struts2整合ajax时,使用json时需要的jar包

    在Struts2框架中整合Ajax以实现异步数据交互,JSON(JavaScript Object Notation)扮演了关键角色。JSON是一种轻量级的数据交换格式,它允许Web应用与服务器之间高效地传输数据,而无需进行繁琐的HTTP请求。在这个...

    jquery ajax json struts2最简单例子测试成功

    在IT行业中,jQuery、AJAX、JSON以及Struts2是四个非常重要的技术,它们在Web开发领域中扮演着核心角色。下面将详细解释这些技术及其相互间的集成。 **jQuery** 是一个快速、简洁的JavaScript库,它简化了HTML文档...

    struts2+json+ajax+jquery

    Struts2、JSON、Ajax 和 jQuery 是Web开发中的四个关键技术,它们共同构建了现代Web应用程序的数据交互和用户界面交互的核心部分。 Struts2 是一个基于MVC(Model-View-Controller)架构的Java Web框架,它使得...

    使用struts2 和ajax进行传递json数据

    在本场景中,我们将重点讨论如何利用Struts2作为后台处理框架,与前端Ajax通过JSON(JavaScript Object Notation)数据格式进行数据交换。 **Struts2框架** Struts2是一个基于MVC(Model-View-Controller)设计模式...

    struts2-json-plugin-2.3.8.jar

    这个插件主要的功能是让Struts2应用程序能够轻松地处理JSON(JavaScript Object Notation)数据格式,使得Web应用可以方便地进行JSON序列化和反序列化,从而实现与前端的Ajax交互。 Struts2是一个基于Model-View-...

    struts2 ajax json

    Struts2是一个强大的MVC(模型-视图-控制器)框架,它极大地简化了Java Web应用程序的开发。在Struts2中,Ajax和JSON技术的结合使得前后端交互变得更加高效和实时,为用户提供了更好的体验。现在我们来深入探讨这些...

    struts2返回JSON数据的两种方式

    在本文中,我们将探讨两种在Struts2框架中返回JSON数据的方法。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛用于前后端交互,尤其是在AJAX请求中。Struts2提供了一套方便的机制来支持JSON...

    JQuery发起ajax请求Struts2,并操作JSON数据的例子

    在Web开发中,jQuery、Ajax、Struts2和JSON是常用的技术栈,它们结合使用能够构建动态、交互式的网页应用。下面将详细讲解这些技术及其在"JQuery发起ajax请求Struts2,并操作JSON数据的例子"中的应用。 **jQuery** ...

    JQuery发送Ajax请求Struts2,并返回JSON的例子

    在Web开发中,jQuery、Struts2、Ajax和JSON是常见的技术组合,它们协同工作以实现动态、异步的数据交互。本示例将探讨如何利用jQuery的Ajax功能向Struts2框架发送请求,并以JSON格式接收响应数据。下面我们将详细...

Global site tag (gtag.js) - Google Analytics