原创文章,转载请注明:MyEclipse下Struts2配置使用和Ajax、JSON的配合 By Lucio.Yang
新手,初学Struts2的配置,同时尝试与Ajax通过JSON交互。首先介绍MyEclipse下Struts2的配置。
1.Struts2的配置
右键项目,MyEclips->project facets->install apache struts(2.x)facets
URL pattern我选择了*.action,libraries只选择了core
1.1撰写action
新建package,名为action。在action中新建hd_query_action.java,调用hibernate方法,实现数据获取,并返回。
//hd_query_action.java
package action; import com.opensymphony.xwork2.ActionSupport; import java.sql.Timestamp; import java.util.List; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import net.sf.json.test.JSONAssert; import com.cc.hibernate.*; public class hd_query_action extends ActionSupport{ private String queryText;//http请求参数,命名和http参数名必须相同。 private JSONArray result;//返回的json //请求参数需要set方法,名称一定要是这种格式 public void setQueryText( String queryText ){ this.queryText = queryText; } //返回结果需要get方法 public JSONArray getResult(){ return result; } //程序入口 public String execute() throws Exception { //定义druginfo数组 System.out.println(this.queryText); JSONArray jsonArray=new JSONArray(); //hibernate DAO DrugInfoOperate DrugInfoOp=new DrugInfoOperate(); System.out.println("2"); List<DrugInfo> list=DrugInfoOp.queryDrugInfoWithKey(this.queryText); System.out.println("3"); //遍历数据集 for( DrugInfo druginfo:list ){ //获取数据,hibernate POJO String name=druginfo.getName(); String func=druginfo.getFunc(); String drugUsage=druginfo.getDrugUsage(); Timestamp prodDate=druginfo.getProdDate(); String manu=druginfo.getManufacturer(); //打包json JSONObject json=new JSONObject(); json.put("name",name); json.put("func",func); json.put("drugUsage", drugUsage); json.put("prodDate", prodDate); json.put("manufacturer", manu); //加入json数组 jsonArray.add(json); } this.result=new JSONArray();//返回结果初始化 result=jsonArray; return SUCCESS; } }
1.2配置struts.xml
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd"> <struts> <package name="action" extends="json-default"> <action name="hdQueryAction" class="action.hd_query_action"> <result type="json"></result> </package> </struts>
1.3action打包json
用到了net.sf.json中的jar来解析json,所需jar包下载 百度云,下载后导入工程的lib。
2.JavaScript方法解析
<script> var json,json_str; //数据提交 function submit_query(){ var query_text=document.getElementById("u13").value; var reg=new RegExp(" ","g"); //创建正则RegExp对象 //将空格替换为- query_text=query_text.replace(reg,"-"); if( query_text.length>0 ){ //调用jquery的ajax方法 $.ajax({ type:"post", url:"hdQueryAction.action", data:{queryText:query_text}, dataType:"text", success:function(msg){ json_str=eval("("+msg+")"); //alert(json_str.result); json=json_str.result; //第二种方法 //var obj=$.parseJSON(msg); //var state_value=obj.result; //alert(state_value); //json=state_value; //alert(json[0]); var i=0; var far=document.getElementById("u15"); far.innerHTML=""; for( i=0;i<json.length;i++ ){ var divC=document.createElement("div"); divC.setAttribute("class","query_results"); var divB=document.createElement("div"); divB.setAttribute("class","query_results_border"); var divN=document.createElement("div"); divN.setAttribute("class","query_results_name"); divN.innerHTML=json[i].name; var divF=document.createElement("div"); divF.setAttribute("class","query_results_func"); divF.innerHTML=json[i].func; var divU=document.createElement("div"); divU.setAttribute("class","query_results_usage"); divU.innerHTML=json[i].drugUsage; var divM=document.createElement("div"); divM.setAttribute("class","query_results_manu"); divM.innerHTML=json[i].manufacturer; divC.appendChild(divB); divC.appendChild(divN); divC.appendChild(divF); divC.appendChild(divU); divC.appendChild(divM); far.appendChild(divC); } var divAuto=document.createElement("div"); divAuto.setAttribute("class","clearfloat"); far.appendChild(divAuto); } }); } else{ alert("please input something"); } } </script>
3.Hibernate与Struts2冲突
在Struts2的action里使用网页传参并使用hibernate的查询方法或者更新方法可能失效,原因参见关于Struts2与hibernate结合出错的问题!------java.lang.NoSuchMethodError: antlr.collections.AST.getLine()I问题解决及总结。原因为MyEclipse导入的struts2和Hibernate的jar包冲突,删除冲突的包的依赖即可。亲测可用,最后的jar包在一个lib下,所以不用担心某个框架无包可用。