在ASP.Net MVC中,如何使用post或get调用控制器方法?
我知道我可以限制只通过post或get来调用方法 - 但是如何检查post/get in允许两者的方法呢?
最近我们搬到了Spring 3.0控制器处理,如下所示:
@Controller
public class MyController {
@RequestMapping(method = RequestMethod.POST)
protected String onSubmit ( Form form, Errors errors) {
// handle POST
}
@RequestMapping(method = RequestMethod.GET)
protected void getForm ( Form form ) {
// handle GET
}
}
Run Code Online (Sandbox Code Playgroud)
现在,由于HEAD请求,我们在日志中获得了大量异常.
org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'HEAD' not supported
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodResolver.resolveHandlerMethod(AnnotationMethodHandlerAdapter.java:621)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:422)
at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:415)
...
Run Code Online (Sandbox Code Playgroud)
我想以与GET请求相同的方式支持HEAD请求,但当然遵守HTTP引用:
HEAD方法与GET相同,只是服务器不能
在响应中返回消息体.响应HEAD请求的HTTP头中包含的元信息应该与响应GET请求时发送的信息相同.该方法可用于获得关于请求所暗示的实体的元信息,而无需转移实体主体本身.此方法通常用于测试超文本链接的有效性,可访问性和最近的修改. http://www.ietf.org/rfc/rfc2616.txt
有没有人有一个优雅的解决方案或甚至有一个开箱即用的弹簧解决方案?
我在网上搜索但没有找到任何答案.
我有几个控制器使用@ResponseBody注释返回相同的通用Response对象,如下所示:
@RequestMapping(value = "/status", method = RequestMethod.GET)
@Transactional(readOnly = true)
public @ResponseBody Response<StatusVM> status()
Run Code Online (Sandbox Code Playgroud)
在返回Response之后,我需要在每个控制器上执行操作.此操作将使用新数据丰富Response对象.
我不想重复代码,所以我需要单点干预.我认为我可以用拦截器做到这一点,但是,根据文档http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html#mvc-handlermapping-interceptor这样做与@ResponseBody不协调:
请注意,HandlerInterceptor的postHandle方法并不总是非常适合与@ResponseBody和ResponseEntity方法一起使用.在这种情况下,HttpMessageConverter在调用postHandle之前写入并提交响应,这使得无法更改响应,例如添加标头.相反,应用程序可以实现ResponseBodyAdvice并将其声明为@ControllerAdvice bean或直接在RequestMappingHandlerAdapter上配置它.
我无法找到这个技术的例子,有人可以帮助我吗?
作为替代方案,我可以使用方面,但是我需要注释每个控制器,这是我想要避免的.
我目前正在尝试使用rspec测试自定义Devise会话控制器.我的控制器看起来像这样:
class SessionsController < Devise::SessionsController
def create
#valid email?
if !(params[:email] =~ /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$/)
set_flash_message :notice, "Please enter a valid e-mail address!"
end
super
end
end
Run Code Online (Sandbox Code Playgroud)
我的RSpec控制器测试是这样的:
require 'spec_helper'
require 'devise/test_helpers'
describe SessionsController do
it "should put a warning on invalid mail address login attempt" do
post :create, :user => {:email => 'invalidEmailAddress'}
response.should contain "Please enter a valid e-mail address!"
end
it "should put no warning on valid mail address login attempt" do
pending
end
end
Run Code Online (Sandbox Code Playgroud)
如果我执行RSpec测试,则失败并显示以下行:
Failure/Error: post :new, …Run Code Online (Sandbox Code Playgroud) 我在故事板中有两个控制器,嵌入在NavigationController中,并且有一个segue可以在这些控制器之间切换.
通过实现prepareForSegue,将数据从第一个控制器传递到第二个控制器非常简单,并使用segue.destinationViewController设置第二个控制器的属性.
我应该将数据传回第二个控制器到前一个控制器.我用Google搜索,但我没有找到任何简单但有效的代码来演示它.
你会这么善良,给我一个关于最佳方法的简单样本吗?
提前致谢!
对于一个项目,我一直在研究JavaFX 2.0桌面应用程序(keytool UI).JavaFx2.0的工作方式(无论如何在我的项目中),UI事件处理发生在JavaFX 2.0 UI类本身中(例如:onclicked()事件或属性更改侦听器).
现在我使用一个带有方法的静态类:getController(),所有UI类都使用它来访问应用程序的一个控制器(不知何故,将控制器传递给所有50多个UI类似乎很麻烦).
然而问题是,一个控制器变得非常大!它有太多的方法(我的UI类需要访问所有业务逻辑方法).即使它只将方法调用传递给我的模型/服务,仍然需要在控制器级别捕获许多异常,以便在UI中处理它们(显示错误消息等).
任何人都知道一种简洁的方法可以使整个MVC/MVP模式更好地适用于我的应用程序,而UI/Controller/Model类不直接依赖于彼此吗?每个用例可能有不同的控制器?但是,我将如何制作它以便正确的UI类获得正确的控制器而不直接知道它?也许使用界面?
我有一个用angular.module().controller()创建的控制器,就像在这种情况下一样
myModule = angular.module('myApp.controllers', [])
.controller('testCtrl', ['$scope', function($scope){
$scope.test = 'this is a test';
}]);
Run Code Online (Sandbox Code Playgroud)
现在,我需要使用mocha来测试我的控制器是否正常工作.在Angular中有一些例子,当控制器被声明为全局函数时(例如http://docs.angularjs.org/tutorial/step_04),所以他们使用
function PhoneListCtrl() {...}
.....
beforeEach(function() {
scope = {},
ctrl = new PhoneListCtrl(scope);
});
it('shod test whatever PhoneListCtrl does ', function() {
expect(scope.someProp).toBe('whateverValue');
});
Run Code Online (Sandbox Code Playgroud)
所以问题是:
1)如何对使用angular.module()声明的控制器进行类似的测试.controller()
2)如何使用Mocha做到这一点
对于WebApplicationContext,我应该@Transactional在控制器或服务中添加注释吗?Spring文档让我有些困惑.
这是我的web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>Alpha v0.02</display-name>
<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.htm</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.json</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
Run Code Online (Sandbox Code Playgroud)
这是我的application-context.xml,它定义了一个spring dispatcher servlet:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:annotation-config />
<mvc:annotation-driven />
<tx:annotation-driven />
<context:component-scan base-package="com.visitrend" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" …Run Code Online (Sandbox Code Playgroud) 对于我的生活,我无法获得$ httpBackend来处理执行$ http get请求的控制器.我已经试了几个小时了=)
我把它减少到了下面最简单的形式.如果我,测试通过
也就是说,它是一个有效的,有效的测试和应用程序.
如果我把它重新插入,我会在底部显示错误.
应用程序/ JS/app.js
// Declare a module which depends on filters and services.
var myApp = angular
.module('myApp', ['ngRoute', 'myApp.filters', 'myApp.services',
'myApp.directives'])
.config(['$routeProvider' , function($routeProvider) {
$routeProvider
.when("/dashboard", {
templateUrl: "partials/dashboard.html",
controller: cDashboard
})
.otherwise({redirectTo: "/dashboard"});
}]);
// Pre-define our main namespace modules.
angular.module('myApp.directives' , []);
angular.module('myApp.filters' , []);
angular.module('myApp.services' , []);
angular.module('myApp.controllers', []);
Run Code Online (Sandbox Code Playgroud)
应用程序/ JS/controller.js
function cDashboard ($scope, $http) {
$scope.data = "dog";
// Fetch the actual data.
$http.get("/data") …Run Code Online (Sandbox Code Playgroud) 当Symfony2控制器通过BinaryFileResponse响应返回文件时,是否可以设置自己的文件名?
controller ×10
angularjs ×2
spring ×2
spring-mvc ×2
unit-testing ×2
asp.net-mvc ×1
devise ×1
file ×1
http ×1
httprequest ×1
interceptor ×1
ios5 ×1
java ×1
javafx-2 ×1
json ×1
mocha.js ×1
mvp ×1
objective-c ×1
php ×1
rspec ×1
service ×1
storyboard ×1
symfony ×1