1. 重写Controller类的构造方法
public abstract class Controller extends com.jfinal.core.Controller {
public Controller(){
Field[] fields =this.getClass().getDeclaredFields();
for (int i=0;i < fields.length; i++){
Field field = fields[i];
Class clazz = field.getType();
if(Service.class.isAssignableFrom(clazz) && clazz != Service.class){
try {
field.set(this, Service.getInstance(clazz, this));
} catch (IllegalAccessException e) {
Log.e(e);
}
}
}
}
}
public abstract class Service {
protected Controller controller;
private static Map<Class<? extends Service>, Service> INSTANCE_MAP = new HashMap<Class<? extends Service>, Service>();
public static <Ser extends Service> Ser getInstance(Class<Ser> clazz, Controller controller){
Ser service = (Ser) INSTANCE_MAP.get(clazz);
if (service == null){
try {
service = clazz.newInstance();
INSTANCE_MAP.put(clazz, service);
} catch (InstantiationException e) {
Log.e(e);
} catch (IllegalAccessException e) {
Log.e(e);
}
}
service.controller = controller;
return service;
}
public User currentUser(){
return controller.getSessionAttr("user");
}
}
public class AccountService extends Service{
public User register(){
User user = registerByUsername();
if (user == null){
user = registerByNumber();
}
if (user == null){
user = registerByEmail();
}
if (user != null){
user.addRole("USER");
controller.setSessionAttr("user", user);
}
return user;
}
public User registerByNumber(){
String number = controller.getPara("number");
if (number == null) return null;
User user = new User();
user.set("username", "User_" + number)
.set("number", number)
.setPassword(controller.getPara("password"));
user.save();
return user;
}
public User registerByEmail(){
String email = controller.getPara("email");
if (email == null) return null;
User user = new User();
user.set("username", email.substring(0, email.indexOf("@")))
.set("email", email)
.setPassword(controller.getPara("password"));
user.save();
return user;
}
public User registerByUsername(){
String username = controller.getPara("username");
if(username == null) return null;
User user = new User();
user.set("username", username).setPassword(controller.getPara("password"));
user.save();
return user;
}
}
AccountService accountService;
@ActionKey("/register")
public void register(){
if(getRequest().getMethod() == "POST"){
User user = accountService.register();
}
render("/account/register.ftl");
}