Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当来自JSP时,如何理解服务器/客户端数据的角度传输?_Java_Javascript_Angularjs_Jsp - Fatal编程技术网

Java 当来自JSP时,如何理解服务器/客户端数据的角度传输?

Java 当来自JSP时,如何理解服务器/客户端数据的角度传输?,java,javascript,angularjs,jsp,Java,Javascript,Angularjs,Jsp,我对如何使用java和jsp以及表达式语言和JSTL创建web应用程序有很好的基础知识。我正在尝试学习如何在前端使用Angular.js 我已经学习了好几门教程,我开始掌握一些基本知识。但我还没有弄清楚如何将数据从服务器传输到前端。我找到的大多数教程都描述了如何将数据从前端发送到服务器 我知道对于Angular web应用程序,建议使用RESTful api后端。不幸的是,我没有这方面的经验,我发现很难同时学习角度和宁静。如果可能的话,我很愿意做一个变通,这样我就可以使用我现有的服务器解决方案,

我对如何使用java和jsp以及表达式语言和JSTL创建web应用程序有很好的基础知识。我正在尝试学习如何在前端使用Angular.js

我已经学习了好几门教程,我开始掌握一些基本知识。但我还没有弄清楚如何将数据从服务器传输到前端。我找到的大多数教程都描述了如何将数据从前端发送到服务器

我知道对于Angular web应用程序,建议使用RESTful api后端。不幸的是,我没有这方面的经验,我发现很难同时学习角度和宁静。如果可能的话,我很愿意做一个变通,这样我就可以使用我现有的服务器解决方案,同时学习一个元素

服务器端设置

现在,在我的旧设置中,使用
javax.servlet.http.HttpServlet
,我调用
服务(HttpServletRequest,HttpServletResponse)
-方法。在方法内部,我向请求添加属性,如下所示:

request.setAttribute("attribute1", "1");
request.setAttribute("attribute2", "2");
request.setAttribute("attribute3", "3");
request.getRequestDispatcher("/WEB-INF/" + myPageVar + ".jsp").
forward(request, response);
$scope.att1 = attribute1;
$http({method: 'GET', url: 'http://yourservleturl' })
.success(function(jsonStringFromServlet){
  $scope.newData = jsonStringFromServlet;
})
.error(function(){
  $scope.error = true;
});
var currentUser = $window.CURRENT_USER;
然后,由于前端控制器模式,我将这些请求变量传递给重定向,如下所示:

request.setAttribute("attribute1", "1");
request.setAttribute("attribute2", "2");
request.setAttribute("attribute3", "3");
request.getRequestDispatcher("/WEB-INF/" + myPageVar + ".jsp").
forward(request, response);
$scope.att1 = attribute1;
$http({method: 'GET', url: 'http://yourservleturl' })
.success(function(jsonStringFromServlet){
  $scope.newData = jsonStringFromServlet;
})
.error(function(){
  $scope.error = true;
});
var currentUser = $window.CURRENT_USER;
目前,我希望保留这个服务器端设置

当前客户端数据访问:

在当前设置中,我现在可以通过两种不同的方式访问启动的变量。在javascript脚本中,如下所示(不适用于对象,只适用于更简单的属性,如字符串(包括JSON))。接下来的代码行是从servlet将重定向到的jsp页面中选取的

var attribute1 = ${requestScope.attribute1};
或者在html中,如下所示(将用于对象):


我想我可以合并表达式语言,并使用javascript变量来初始化angular模块、指令和控制器中的变量,但我更喜欢纯angular语言


这些属性是否可以通过任何方式访问(使用angular)?我一直在尝试阅读$http和$scope,但是在这些方面有一大堆不相关的信息,我还没有浏览过这些信息。

如果您想让angular访问的数据应该在用户登陆页面时准备好,那么按照您的建议将数据放在jsp页面的javascript变量中是有意义的。 由于您的var处于全局范围内,您可以在角度控制器中获得如下结果:

request.setAttribute("attribute1", "1");
request.setAttribute("attribute2", "2");
request.setAttribute("attribute3", "3");
request.getRequestDispatcher("/WEB-INF/" + myPageVar + ".jsp").
forward(request, response);
$scope.att1 = attribute1;
$http({method: 'GET', url: 'http://yourservleturl' })
.success(function(jsonStringFromServlet){
  $scope.newData = jsonStringFromServlet;
})
.error(function(){
  $scope.error = true;
});
var currentUser = $window.CURRENT_USER;
但是,如果您希望在不重新呈现整个页面的情况下更新数据(这正是您很快想要的),那么应该使用$http调用一个返回json的servlet。通过在httpServlet中重写doGet并使用轻量级json库(如gson),可以相对简单地在没有jax-rs的情况下创建这个servlet。这个例子可以做到:

//Set up pojo and make it into json string:
SomeClass pojo =new SomeClass();
pojo.setX("this is X");
JSONObject jsonObject = new Gson().toJson(pojo);
String jsonStr=jsonObject.toJSONString();
//Modify response and write json string
httpServletResponse.setStatus(200);//We are ok
httpServletResponse.setContentType("application/json");
httpServletResponse.setCharacterEncoding("UTF-8");
Writer writer = httpServletResponse.getWriter();
writer.write(jsonStr);
writer.close();
//Thats it
在一个简单的设置中,您可以在控制器中处理此响应,如下所示:

request.setAttribute("attribute1", "1");
request.setAttribute("attribute2", "2");
request.setAttribute("attribute3", "3");
request.getRequestDispatcher("/WEB-INF/" + myPageVar + ".jsp").
forward(request, response);
$scope.att1 = attribute1;
$http({method: 'GET', url: 'http://yourservleturl' })
.success(function(jsonStringFromServlet){
  $scope.newData = jsonStringFromServlet;
})
.error(function(){
  $scope.error = true;
});
var currentUser = $window.CURRENT_USER;
在html页面中,您可以使用

<div>This is your new x: {{newData.x}}</div>
这是您的新x:{{newData.x}

有很多不同的方法来实现这一点。这正是我最终使用的

要将JSP中的值公开给Angular,您需要将它们写在脚本标记中,并使用它们构建Javascript变量。然后您可以从Angular访问它们。我这样做是为了将经过身份验证的用户帐户信息从服务器端传递到我的代码中。您的JSP将包含以下代码:

<script>
  window.CURRENT_USER = {
    id: <%=currentUser.getId()%>,
    name: "<%=currentUser.getName()%>",
    email: "<%=currentUser.getEmail()%>",
    prevLogin: new Date(<%=currentUser.getPrevLoginAt().getTime()%>),
    prevLoginIp: "<%=currentUser.getPrevLoginIp()%>"    
  };
</script>

更好的方法(Jacob Nicolaisen提到)是使用Google GSon库来实际生成JSON对象,而不是手工编码。)

不要使用JSP,不要设置属性

只使用静态html,这就是好处!您可以编写执行jsp include功能的角度指令,并且具有更清晰的代码(没有嵌入的jstl、java,只有纯html)

创建返回json的服务器端代码。然后,angular js代码调用rest api并填充客户端模型

如果您有需要在启动时填充的内容,请适当地使用javascript

下面是一个使用Jersey返回json的典型java方法(类似于SpringMVC、resteasy、restlets、spark、ApacheCxf等):


在angualr中,您可以创建,例如,
$myPojoService.getPojo()
,它被注入到相关控制器并调用此端点。调用时,它可能将pojo作为json返回,然后可能填充
$scope.model.pojo
json对象。然后,角度的双向数据绑定将更新您的gui。。。Boom,你是一个完整的堆栈工程师/前端开发人员

我认为您应该学习JAX-RS,并使用RestFul进行研究。谢谢你的意见。我会等一会儿,看看是否有人有一个现成的工作可以让我同时学习一个元素。你在使用spring吗?没有。我从零开始实现前端控制器模式,尽可能多地学习基础知识。spring MVC可以为RESTful服务提供一个简单快速的解决方案,我可以用一个返回和接收json的例子来回答这个问题,这个json很容易操作negative@NimChimpsky这个问题指定他想使用现有的设置来实现这一点,他不想使用REST服务或进行API调用。甚至谷歌AdWords团队也使用这种方法,通过将初始值嵌入页面服务器端来减少初始API调用的数量。对他们来说,如果你想使用jsp,我认为摆脱jsp是angular的主要好处之一;Don’不要为角度而烦恼——你最终得到的是一个不太好的中途之家。下面是ng conf视频讨论它。讨论了为什么他们转向服务器端呈现某些内容以提高体验/性能,这是用户身份验证的一个特殊案例,其中开发人员决定将jsp用于此特定用例和应用程序。。。作为一般规则,摆脱它们这仍然依赖于JSP,并使用普通的旧JSP