forcemvc 0.8.5

  • readme.md
  • CHANGELOG.md
  • Installing
  • Versions
  • 42

VERSION! Build Status

Dart Force MVC

LOGO!

Serverside MVC based implementation for Dart. Easy to setup and part of the dart force framework!

Introduction

Dart ForceMVC is a dartlang webframework, with a lot of similarities to java spring mvc

First of all you need to setup a webserver:

library x;
import 'package:wired/wired.dart';
import 'package:forcemvc/force_mvc.dart';

part 'controllers/x_controller.dart';

main() {
  WebApplication app = new WebApplication(startPage: "start.html");
  
  app.start(); 
}

And then ofcource we need to create our controller.

part of x;

@Controller
class XController {

  @RequestMapping(value: "/home", method: RequestMethod.GET)
  String home(Locale locale, Model model) {
    model.addAttribute("someprop", "value" );
    
    return "home";
  }
  
}

In the web folder of your application you can create a home.html file. That will be your view.

Walkthrough

Use a Web Application Server with dart very easily, create controllers with annotations ... similar to java spring mvc.

First you will setup a new web application.

WebApplication app = new WebApplication(wsPath: wsPath, port: port, host: host, buildPath: buildPath);

Then you use the 'use' method to handle http requests.

app.use(url, (ForceRequest req, Model model) { /* logic */ }, method: "GET");

You can also use the annotation RequestMapping in a dart object

@RequestMapping(value: "/someurl", method: "GET")
void index(ForceRequest req, Model model)

You can also use the annotation @ModelAttribute to add an object to all the scopes in the methods. An @ModelAttribute on a method argument indicates the argument should be retrieved from the model. If not present in the model, the argument should be instantiated first and then added to the model. Once present in the model, the argument's fields should be populated from all request parameters that have matching names.

@ModelAttribute("someValue")
String someName() {
	return mv.getValue();
}

Then you register that object on the WebApplication object.

app.register(someObjectWithRequestMappingAnnotations)

Or you can annotate a class with @Controller and then it will be registered automatically in the force WebApplication.

@Controller
class SomeObject {

}

Starting your web application

You can do this as follow!

app.start();

It is also possible to start a web application with SSL possibilities.

app.startSecure();

ForceRequest

ForceRequest is an extension for HttpRequest

forceRequest.postData().then((data) => print(data));

Interceptors

You can define inteceptors as follow, the framework will pick up all the HandlerInterceptor classes or implementations.

class RandomInterceptor implements HandlerInterceptor {

  bool preHandle(ForceRequest req, Model model, Object handler) { return true; }
  void postHandle(ForceRequest req, Model model, Object handler) {}
  void afterCompletion(ForceRequest req, Model model, Object handler) {}
  
}

Path variables

You can now use path variables in force mvc.

@RequestMapping(value: "/var/{var1}/other/{var2}/", method: "GET")
void pathvariable(ForceRequest req, Model model, String var1, String var2)

This is an alternative way how you can access path variables.

req.path_variables['var1']

You can also use the annotation @PathVariable("name") to match the pathvariable, like below:

  @RequestMapping(value: "/var/{var1}/", method: "GET")
  String multivariable(req, Model model, @PathVariable("var1") variable) {}

Redirect

You can instead of returning a view name, performing a redirect as follow:

@RequestMapping(value: "/redirect/")
String redirect(req, Model model) {
	redirect++;
	return "redirect:/viewable/";
}

Asynchronous Controller

In the controller you can have asynchronous methods to handle for example POST methods much easier.

On the ForceRequest object you have a method .async and his value is the return value that matters for the req.

When a method is asynchrounous you must return req.asyncFuture.

This is an example how you can use it.

@RequestMapping(value: "/post/", method: "POST")
Future countMethod(req, Model model) {
     req.getPostParams().then((map) {
       model.addAttribute("email", map["email"]);
       
       req.async(null);
     });
     model.addAttribute("status", "ok");
     
     return req.asyncFuture;
}

Authentication

You can now add the annotation @Authentication to a controller class. This will make it necessary to for a user to authenticate before accessing these resources.

An authentication in force is following a strategy. You can set a strategy by extending the class SecurityStrategy.

class SessionStrategy extends SecurityStrategy {
  
  bool checkAuthorization(HttpRequest req, {data: null}) {
    HttpSession session = req.session;
    return (session["user"]!=null);
  }   
  
  Uri getRedirectUri(HttpRequest req) {
    var referer = req.uri.toString();
    return Uri.parse("/login/?referer=$referer");
  }
} 

And then add this strategy to the web application.

app.strategy = new SessionStrategy();

Roles

You can also define authorize roles. This can be done as follow.

@Controller
@PreAuthorizeRoles(const ["ADMIN"])
class AdminController {
		
}
ExceptionHandler

This helps in defining methods that will be executed when an error or exception occured.

@ExceptionHandler()
String error_catch(req, Model model) {
	...
}

You can also specify a type, only when an error or exception happend of that Type, that method will be executed.

@ExceptionHandler(type: DoorLockedError)
String doorLockedError(req, Model model) {
	model.addAttribute("explanation", "This is a specific error!");
	return "error";  
}

Logging

You can easily boostrap logging.

app.setupConsoleLog();

Wired

Wired is a dependency injection package. You can use @Autowired and @bean and more in forcemvc find info here

LocaleResolver

In ForceMVC you have a locale resolver to handle locale. The implementation that is been used by default is the AcceptHeaderLocale Resolver, this resolver looks at the request header accept-language.

You can choose for a fixed locale resolver implementation or a cookie locale resolver or just implement your own handling if need.

View / Templating

In forcemvc you can define view templates. ForceMvc will look into the viewfolder and in the client 'build' folder for a .html file with the viewname that you provide the system in the controller.

@RequestMapping(value: "/hello/")
String redirect(req, Model model) {
	// do something
	model.addAttribute("text", "greetings");
	return "hello";
}

So in the example about we are returning a string with the value 'hello'. So the system will search in the view & build folder for a hello.html file.

The default implementation in ForceMVC for templating is mustache.

In the html file {{text}} will be replaced by greetings.

More info about creating your own viewrender implementation here

Development trick

Following the next steps will make it easier for you to develop, this allows you to adapt clientside files and immidiatly see results with doing a pub build.

pub serve web --hostname 0.0.0.0 --port 7777 &&
export DART_PUB_SERVE="http://localhost:7777" &&
pub run bin/server.dart

GAE

You can now easily run your Force apps on a Google App Engine infrastructure by the following code! The rest is the same as a normal dart force app.

WebApplication app = new WebApplication();

runAppEngine(app.requestHandler).then((_) { // Server running. and you can do all the stuff you want! });

You don't need to start WebApplication anymore, the start of the server will be done by AppEngine!

More info about GAE overall

Rest API's

If you want to learn more about how to build Rest api's with ForceMVC go here

Example

You can find a simple example with a page counter implementation here - live demo

Or visit Github issue mover here

Youtube

You can watch a simple youtube video to get you started, have an idea between the transformation of java spring mvc and force mvc here

TODO

  • get more annotations and options for sending the response back
  • writing tests

Notes to Contributors

Fork Dart Force MVC

If you'd like to contribute back to the core, you can fork this repository and send us a pull request, when it is ready.

If you are new to Git or GitHub, please read this guide first.

Dart Force

Realtime web framework for dart that uses force MVC & wired source code

Twitter

Follow us on twitter https://twitter.com/usethedartforce

Google+

Follow us on google+

Join our discussion group

Google group

Changelog

This file contains highlights of what changes on each version of the forcemvc package.

Pub version 0.8.2 & version 0.8.5

  • Update version of wired to v0.4.5
  • improve @ResponseBody & httpmessageconverter logic

Pub version 0.8.1

  • Introducing @RestController
  • improve @ResponseBody
  • solve path variables with dash, issue #32

Pub version 0.8.0

  • Updating dependencies on logging
  • Clean up code
  • introduce @ResponseBody
  • HttpMessageConverters and HttpMessageRegulator are also available in this release with a JsonHttpMessageConverter implementation

Pub version 0.7.3

  • Introducing a new annotation @ResponseStatus, so we can indicate status code of the response

Pub version 0.7.2

  • Adopt code to async/await
  • Extract locale to an other dependency

Pub version 0.7.1+1

  • Improve the flow of client serving
  • Add more logging

Pub version 0.7.1

  • Allow completely handling the HttpResponse

Pub version 0.7.0

  • update forcemvc to wired 4.3
  • add web config and an easy change towards core components with di
    • SecurityContextHolder
    • HandlerExceptionResolver
    • LocaleResolver
    • ServingAssistent

Pub version 0.6.1+1

  • add improvement on static handling internally

Pub version 0.6.1

  • remove start page and use this instead!

app.static("/", "index.html");

Pub Version 0.6.0+1

  • Tighter version constraint on exported package

Pub Version 0.6.0

  • WebServer becomes WebApplication dart class
  • The .on method becomes .use method
  • app.static will skip the view rendering logic, ideal for angular and polymer applications
  • simplify code on some parts

Pub Version 0.5.10

  • Extending the possibilities of a Rest interface.

Pub Version 0.5.9+1

  • Fix a bug so that @Authentication works, and takes up BASIC as a role.

Pub Version 0.5.9

  • Improve the startup functionality, by adding startup fallback mechanism

Pub Version 0.5.8

  • Make the default value to startpage empty. It is better to use:

    app.use('/', (req, model) { return "index"; });

    then startPage: "index.html"

    Be aware that then it becomes a template and that when you use polymer or angular you need to use another delimiter.

Pub version 0.5.7+1

  • Deprecate the method on, it is too confusing with the on method of dart force, the method 'use' is now the prefered way.
  • Fixing a crash when the startPage is not found.

Pub version 0.5.7

  • Changing the main class of WebServer to WebApplication.
  • Making WebServer Deprecated

Pub version 0.5.6+1

  • Fix issue serving without pub serve
  • put more control in accept_header_locale

Pub version 0.5.6

  • Apply pub serve trick also to view render logic.
  • Fallbacks / error handling when a resource is not been found.

Pub version 0.5.5

  • Add locale resolver mechanics into the framework
  • Easy use of the locale in the controller

Pub version 0.5.4

  • Add required boolean into @RequestParam(required: true)
  • Pub serve trick, issue 23 is been solved.

Pub version 0.5.3+1

  • Small adjustments so dart force can also work on appengine.

Pub version 0.5.3

  • Add better 404 handling
  • Serving the Client files from their URL relative to the script's location
  • Make dart-forcemvc WebServer compatible with App Engine Dart

Pub version 0.5.2+1

  • Fixing 'Replace only the first occurrence of /build'

Pub version 0.5.2

  • package 'Force IT' is been renamed to 'wired'

Pub version 0.5.1

  • Add Type checking in @ExceptionHandler

Pub version 0.5.0+1

  • Add getAuthentication in MVCAnnotationHelper

Pub version 0.5.0

  • Add PreauthorizeRoles and PreauthorizeFunc Annotations
  • Add possibility to define authorization roles
  • Define and extend the way security works in forcemvc
  • Upgrade to the latest version of 'force it'

Pub version 0.4.0+1 & 0.4.0+2

  • Adding MVCAnnotationHelper, with the method hasAuthentication(obj) to the package

Pub version 0.4.0

  • Remove parentheses from annotations.
  • Update to the latest version (0.2.0) of force_it
  • Add example folder to the git repository

Pub version 0.3.8

  • Introducing @ControllerAdvice so that you can make methods with @ModelAttribute & @ExceptionHandler that has inpact to all the controller

Pub version 0.3.7

  • General error handling with a HandlerExceptionResolver
  • Introducing the annotation @ExceptionHandler so you can use that in your @Controller classes when an error is happening.

Pub version 0.3.6+1

  • First steps in error handling

Pub version 0.3.6

  • Adding startSecure method, so you can start your webserver over SSL.

Pub version 0.3.5+1

  • Update package configuration

Pub version 0.3.5

  • Provide a class MockForceRequest to mock more easily ForceRequest in unittests
  • Upgrade of the unittest package and introducing of the mock package

Pub version 0.3.4+1 & 0.3.4+2 & 0.3.4+3

  • update rules for mustache rendering the view

Pub version 0.3.4

  • Add @RequestMapping on an object level possible

Pub version 0.3.3+1

  • Make @RequestParam working without a value

Pub version 0.3.3

  • Error logging when the server don't start
  • Add responseHooks into the web_server
  • Using variable name of the annotated @RequestParam when value is empty

Pub version 0.3.2+1 & 0.3.2+2

  • improve serving code of the start page.

Pub version 0.3.2

  • load values into your webserver from yaml files
  • cors
  • small improvement on the model object, it allows you to put anything in it

Pub version 0.3.1

Fix a problem with serving dart files.

Pub version 0.3.0+1

Fix a bug with passing by the startPage.

Pub version 0.3.0

Add 'force it' package into this new version of the forcemvc so you can use @Autowired in the @Controller classes.

Pub version 0.2.4

Add easier bootstrapping of the logging functionality serverside.

Pub version 0.2.3

Implemented changes to the security api. Add an optional parameter {data} in the security strategy checkAuthorization class.

Pub version 0.2.2

Refactoring of the use of webSockets, also provide httpRequest in the flow, so you get access to httpsession.

Pub version 0.2.1+2

Make the security rules more general.

Pub version 0.2.1+1

Make the securityContextHolder object in webserver public accessible.

Pub version 0.2.1

New structure!

Pub version 0.2.0

Adding security and authentication functionality

Pub version 0.1.13+5

Move transformation method to the view renderer!

Pub version 0.1.13+4

More logging!

Pub version 0.1.13+1 & 0.1.13+2

Adding slashes in src="...", it will become src="/..." when needed of the template rendering is been performed!

Pub version 0.1.13

Depend upon mustache4dart and not upon mustache anymore!

Pub version 0.1.12+2

Small improvement on the view rendering part!

Pub version 0.1.12+1

Changed ../build/ folder to ../build/web/

Pub version 0.1.12

Check also view, template files in the build folder, so after pub build in the web folder!

Pub version 0.1.11+3

Better logging for view rendering!

Pub version 0.1.11+2

Implement getPostRawData, so you can get the raw posted data!

Pub version 0.1.11+1

Adapt getPostData to disable jsonifying the data!

Pub version 0.1.11

Adding asynchronous requests to the possibilities now!

Pub version 0.1.10

Fixing in @RequestMapping, the method part!

Pub version 0.1.9+4

Adding redirect functionality.

Pub version 0.1.9+3

Removing dependency on Uuid.

Pub version 0.1.9+2

Add HttpSession & HttpHeaders in possible arguments in a controller method

Pub version 0.1.9+1

Solve an issue with the code, please update!

Pub version 0.1.9

Adding @RequestParam, so you can add this annotation to the controller class if you want to have easy access to querystring parameters.

Pub version 0.1.8+3

Make static folder configurable and some small improvements on the regex expression.

Pub version 0.1.8+2

Static folder for serving static files to the client!

Pub version 0.1.8+1

Improved accesability of path variables.

Pub version 0.1.8

New ways of view rendering and getting the templates.

Pub version 0.1.7+2 & 0.1.7+3

Cleanup code webserver. Solving an issue!

Pub version 0.1.7+1

Updated this buildPath: '../build/web' to get it working in Dart 1.2

Pub version 0.1.7

Extend ForceRequest with getPostData and getPostParams to support post methods.

Pub version 0.1.6

Adding path variables to the mvc part.

Pub version 0.1.5

Serving .dart files much easier, putting it in the framework itself.

Pub version 0.1.4

Adding interceptors to the game, so you can write interceptor classes to intercept a request.

Pub version 0.1.3

Updating dependency on force mirrors, it solves a bug with invocation. Controller scanning, so you don't need to register a class, just annotate it with @Controller.

Pub version 0.1.2+4 & 0.1.2+5

Adding an improvement of force mirrors invoke.

Pub version 0.1.2+3

Solving issue with dependency management

Pub version 0.1.2+2

Add dependency to forcemirrors.

Pub version 0.1.2+1

Adding tests for mirrorhelpers and refactor code to improve annotation handling.

Pub version 0.1.2

Adding the ModelAttribute annotation into the mvc framework.

Pub version 0.1.0

Adding an abstraction ForceRequest, a wrapper around httprequest.

Pub version 0.1.0

Adding renderer and model to the mvc part of it. Adding mustache as a new dependency for the rendering part.

Pub version 0.0.6 & 0.0.7

Fixing issue with annotations of RequestMapping

Pub version 0.0.5

Introducing Simple Web Server

Pub version 0.0.5

Introduction of the model

Pub version 0.0.4

Update version of uuid

Pub version 0.0.3

Adding RequestMethod class into the project

Pub version 0.0.2

Adding documentation and solving issues.

Pub version 0.0.1

Setup of the project, moved basic_server.dart to this package and make it usable in the dart force main package.

Use this package as a library

1. Depend on it

Add this to your package's pubspec.yaml file:


dependencies:
  forcemvc: "^0.8.5"

2. Install it

You can install packages from the command line:

with pub:


$ pub get

Alternatively, your editor might support pub get. Check the docs for your editor to learn more.

3. Import it

Now in your Dart code, you can use:


      import 'package:forcemvc/force_mvc.dart';

      import 'package:forcemvc/test.dart';
  
Version Uploaded Documentation Archive
0.8.5 Jun 20, 2016 Go to the documentation of forcemvc 0.8.5 Download forcemvc 0.8.5 archive
0.8.4 Jun 20, 2016 Go to the documentation of forcemvc 0.8.4 Download forcemvc 0.8.4 archive
0.8.3 Jun 20, 2016 Go to the documentation of forcemvc 0.8.3 Download forcemvc 0.8.3 archive
0.8.2 Jun 20, 2016 Go to the documentation of forcemvc 0.8.2 Download forcemvc 0.8.2 archive
0.8.1 Mar 29, 2016 Go to the documentation of forcemvc 0.8.1 Download forcemvc 0.8.1 archive
0.8.0 Feb 7, 2016 Go to the documentation of forcemvc 0.8.0 Download forcemvc 0.8.0 archive
0.7.3 Oct 11, 2015 Go to the documentation of forcemvc 0.7.3 Download forcemvc 0.7.3 archive
0.7.2 May 18, 2015 Go to the documentation of forcemvc 0.7.2 Download forcemvc 0.7.2 archive
0.7.1+1 Mar 15, 2015 Go to the documentation of forcemvc 0.7.1+1 Download forcemvc 0.7.1+1 archive
0.7.1 Feb 15, 2015 Go to the documentation of forcemvc 0.7.1 Download forcemvc 0.7.1 archive

All 110 versions...

Analysis

We analyzed this package on Jun 15, 2018, and provided a score, details, and suggestions below. Analysis was completed with status completed using:

  • Dart: 2.0.0-dev.60.0
  • pana: 0.11.3

Scores

Popularity:
Describes how popular the package is relative to other packages. [more]
30 / 100
Health:
Code health derived from static analysis. [more]
89 / 100
Maintenance:
Reflects how tidy and up-to-date the package is. [more]
1 / 100
Overall score:
Weighted score of the above. [more]
42
Learn more about scoring.

Platforms

Detected platforms: unsure

Error(s) prevent platform classification:

Error(s) in lib/test.dart: Target of URI doesn't exist: 'package:mock/mock.dart'.

Suggestions

  • Fix platform conflicts.

    Error(s) prevent platform classification:

    Error(s) in lib/test.dart: Target of URI doesn't exist: 'package:mock/mock.dart'.

  • Running dartdoc failed.

    Make sure dartdoc runs without any issues.

  • Fix analysis and formatting issues.

    Analysis or formatting checks reported 13 errors 52 hints.

    Make sure that the imported libraries are not in conflict. Error(s) in lib/test.dart: Target of URI doesn't exist: 'package:mock/mock.dart'.

    Strong-mode analysis of lib/converters/text_http_message_converter.dart failed with the following error:

    line: 13 col: 82
    The element type 'String' can't be assigned to the list type 'MediaType'.

    Similar analysis of the following files failed:

    • lib/http/media_type.dart (error)
    • lib/security/no_security_strategy.dart (error)
    • lib/server/force_request.dart (error)
    • lib/server/serving_assistent.dart (error)
    • lib/annotations/helpers.dart (hint)
    • lib/annotations/metadata.dart (hint)
    • lib/converters/abstract_message_converter.dart (hint)
    • lib/converters/csv_message_converter.dart (hint)
    • lib/converters/http_message_converter.dart (hint)
    • lib/converters/json_http_message_converter.dart (hint)
    • lib/error/handler_exception_resolver.dart (hint)
    • lib/error/simple_exception_resolver.dart (hint)
    • lib/http/http_headers_wrapper.dart (hint)
    • lib/http/http_input_message.dart (hint)
    • lib/http/http_message.dart (hint)
    • lib/http/http_message_regulator.dart (hint)
    • lib/http/http_method.dart (hint)
    • lib/http/http_output_message.dart (hint)
    • lib/http/mime_type.dart (hint)
    • lib/i18n/accept_header_locale_resolver.dart (hint)
    • lib/i18n/cookie_locale_resolver.dart (hint)
    • lib/i18n/default_locale_resolver.dart (hint)
    • lib/i18n/fixed_locale_resolver.dart (hint)
    • lib/i18n/locale_resolver.dart (hint)
    • lib/manager/cookie_holder_manager.dart (hint)
    • lib/render/mustache_render.dart (hint)
    • lib/render/view_render.dart (hint)
    • lib/security/security_context_holder.dart (hint)
    • lib/security/security_strategy.dart (hint)
    • lib/server/handler_interceptor.dart (hint)
    • lib/server/http_request_streamer.dart (hint)
    • lib/server/interceptors_collection.dart (hint)
    • lib/server/model.dart (hint)
    • lib/server/mvc_typedefs.dart (hint)
    • lib/server/path_analyzer.dart (hint)
    • lib/server/registry.dart (hint)
    • lib/server/request_method.dart (hint)
    • lib/server/response_hooks.dart (hint)
    • lib/server/serving_files.dart (hint)
    • lib/server/simple_web_server.dart (hint)
    • lib/server/web_application.dart (hint)
    • lib/utils/mime_type_utils.dart (hint)
  • Package is getting outdated.

    The package was released 103 weeks ago.

  • The description is too short.

    Add more detail about the package, what it does and what is its target use case. Try to write at least 60 characters.

  • Package is pre-v1 release.

    While there is nothing inherently wrong with versions of 0.*.*, it usually means that the author is still experimenting with the general direction API.

  • Maintain an example.

    None of the files in your example/ directory matches a known example patterns. Common file name patterns include: main.dart, example.dart or you could also use forcemvc.dart.

Dependencies

Package Constraint Resolved Available
Direct dependencies
Dart SDK >=1.9.0 <2.0.0
http_server >=0.9.0 <0.10.0 0.9.7
jsonify >=0.0.1 <0.0.2 0.0.1
locale >=0.1.1+2 <0.1.2 0.1.1+2
logging >=0.11.0 <0.12.0 0.11.3+1
mustache4dart >=1.0.0 <1.1.0 1.0.12 2.1.2
route >=0.4.0 <0.5.0 0.4.6
wired >=0.4.5 <0.4.6 0.4.5
Transitive dependencies
browser 0.10.0+3
charcode 1.1.1
collection 1.14.10
mime 0.9.6+1
mirrorme 0.2.2
path 1.6.0 1.6.1
source_span 1.4.0
string_scanner 1.0.2
yaml 2.1.14
Dev dependencies
mock >=0.11.0 <0.11.1
test >=0.12.1 <0.13.0