javascript - angularjs 500内部错误

标签 javascript java angularjs servlets

我正在编写一个简单的angularjs - J2EE应用程序,用于从mysql服务器获取数据并显示在html页面上。 我在表单提交上调用 Angular 函数为:

<div id="register_form" ng-controller="MyDiaryLogin">
        <form>
            <ul>
                <li><input type="text" name="firstname" ng-model="user.firstname" /></li>
                <li><input type="text" name="lastname" ng-model="user.lastname" /></li>
                <li><input type="text" name="email" ng-model="user.email" /></li>
                <li><input type="password" name="password" ng-model="user.password" /></li>
                <li><input type="password" name="confpass" ng-model="user.confpass" /></li>
                <li><input type="text" name="age" ng-model="user.age" /></li>
                <li><input type="text" name="occupation" ng-model="user.occupation" /></li>
                <li><input type="button" name="register" ng-click="register()" value="REGISTER" /></li>
            </ul>
        </form>
        <p><h2>{{status}}</h2></p>
    </div>

{{status}} 这是我的 Angular script.js 中的 $scope 属性:

mydiary.controller('MyDiaryLogin', function($scope, $http){
$scope.user = {};
$scope.register = function(){
    $http({
          method: 'POST',
          url: 'http://localhost:9091/Angular1/getData',
          header: {'Content-Type': 'application/json'},
          data: $scope.user
    }).success(function(data){
        $scope.status = data;
    });
};

我已经编写了一个 servlet 来从数据库获取数据,但是当我在 servlet 的控制台上打印一些文本时,在到达 servlet 之前出现了错误。 当我点击注册按钮时,浏览器控制台显示错误:

POST http://localhost:9091/Angular1/getData 500 (Internal Server Error)

并且此错误指向某些 xhr.send(...) 函数中的 angular.js lib:

if (responseType) {
    try {
      xhr.responseType = responseType;
    } catch (e) {
      // WebKit added support for the json responseType value on 09/03/2013
      // https://bugs.webkit.org/show_bug.cgi?id=73648. Versions of Safari prior to 7 are
      // known to throw when setting the value "json" as the response type. Other older
      // browsers implementing the responseType
      //
      // The json response type can be ignored if not supported, because JSON payloads are
      // parsed on the client-side regardless.
      if (responseType !== 'json') {
        throw e;
      }
    }
  }

  xhr.send(post || null);
}

供您引用我的servlet 类的 doPost 方法:

protected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{
    try{
        System.out.println("CALLING THE METHOD");
        Class.forName("com.mysql.jdbc.Driver");
        cn = DriverManager.getConnection("jdbc:mysql://localhost/mydiary","root","");

        String query = "SELECT * FROM users";
        pstmt = cn.prepareStatement(query);
        rs = pstmt.executeQuery();

        String json = new Gson().toJson(rs);
        response.setContentType("text/html");
        out = response.getWriter();
        out.write(json);
    }
    catch(Exception e){
        e.printStackTrace();
    }
    try{
        try{}
        finally{
            if(rs!=null)
                rs.close();
            if(pstmt!=null)
                pstmt.close();
            if(out!=null)
                out.flush();
                out.close();
            if(cn!=null)
                cn.close();
        }
    }
    catch(Exception e1){
        e1.printStackTrace();
    }
}

请帮我找到问题的根源,我编写的完整应用程序代码是否有问题?我不确定如何使用 Angular 来显示数据/从 servlet 返回 json 格式数据?

最佳答案

为了让您了解如何将结果集转换为 JSON,我在此处添加了此类。您可以像这样使用它: jsonArr = ResultSetConverter.convert(result,"");

这是一个非常通用的类,可以处理所有 sql 数据类型,因此请选择您需要的。

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONException;

import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

public class ResultSetConverter {
	 public static final Calendar tzUTC = Calendar.getInstance(TimeZone.getTimeZone("UTC"));    

  public static JSONArray convert( ResultSet rs, String freitextlabel )
    throws SQLException, JSONException
  {
    JSONArray json = new JSONArray();
    ResultSetMetaData rsmd = rs.getMetaData();
   
    while(rs.next()) {
      int numColumns = rsmd.getColumnCount();
      JSONObject obj = new JSONObject();

      for (int i=1; i<numColumns+1; i++) {
        String column_name = rsmd.getColumnName(i);

        if(rsmd.getColumnType(i)==java.sql.Types.ARRAY){
         obj.put(column_name, rs.getArray(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.BIGINT){
         obj.put(column_name, rs.getInt(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.BOOLEAN){
         obj.put(column_name, rs.getBoolean(column_name));
        }
        else if(rsmd.getColumnType(i)==java.sql.Types.BLOB){
            obj.put(column_name, rs.getBlob(column_name));
           }
           else if(rsmd.getColumnType(i)==java.sql.Types.DOUBLE){
            obj.put(column_name, rs.getDouble(column_name)); 
           }
           else if(rsmd.getColumnType(i)==java.sql.Types.FLOAT){
            obj.put(column_name, rs.getFloat(column_name));
           }
           else if(rsmd.getColumnType(i)==java.sql.Types.INTEGER){
            obj.put(column_name, rs.getInt(column_name));
           }
           else if(rsmd.getColumnType(i)==java.sql.Types.NVARCHAR){
            obj.put(column_name, rs.getNString(column_name));
           }
           else if(rsmd.getColumnType(i)==java.sql.Types.VARCHAR){
        	   if (freitextlabel.length()>0 && column_name.equalsIgnoreCase("freitext"))
        		   obj.put(freitextlabel, rs.getString(column_name));
        	   else
        		   obj.put(column_name, rs.getString(column_name));
           }
           else if(rsmd.getColumnType(i)==java.sql.Types.TINYINT){
            obj.put(column_name, rs.getInt(column_name));
           }
           else if(rsmd.getColumnType(i)==java.sql.Types.SMALLINT){
            obj.put(column_name, rs.getInt(column_name));
           }
           else if(rsmd.getColumnType(i)==java.sql.Types.DATE){
            obj.put(column_name.concat("_js"), rs.getDate(column_name));
           }
           else if(rsmd.getColumnType(i)==java.sql.Types.TIMESTAMP){
           //obj.put(column_name.concat("_js"), rs.getTimestamp(column_name,tzUTC));  
        	   Timestamp ts = rs.getTimestamp(column_name,tzUTC);
        	  // obj.put (column_name, ts !=null ? new Date(ts.getTime)  : null); 
        	   obj.put(column_name.concat("_js"), ts != null ? new Date(ts.getTime()) : null);
           }
           else{
            obj.put(column_name, rs.getObject(column_name));
           }
         }

         json.put(obj);
       }

       return json;
     }
   }

关于javascript - angularjs 500内部错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33958961/

相关文章:

javascript - 如何更改 angularjs $http.jsonp 的 header

html5/JS 中的 java 桌面应用程序 gui

javascript - 拦截和更改 Canvas 字体

java - database.query 准备语句绑定(bind)不起作用

java - 如何让 izpack 安装程序根据操作系统架构正确限制文件集

javascript - 使用字母 ø、æ、å 时 Angular 失败,可能与 i18n 有关

angularjs - `&lt;input type="文件的 ng-model"/>`(带有指令 DEMO)

javascript - 如何使用递归计算数组中数字的实例?

javascript - 给定一个索引位置,我如何拆分出该位置所在的句子?

java - IBM Streams Java 运算符类加载问题