gpt4 book ai didi

java - 使用通用 Controller 时,如何返回特定 Controller 固有的 View ?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:14:35 25 4
gpt4 key购买 nike

作为这个答案的结果:https://stackoverflow.com/a/10708026/694597 ,我想知道在使用通用 Controller 时如何返回特定 Controller 固有的 View 。

最佳答案

当您在 Controller 操作中呈现 View 时,您只需调用由模板引擎生成的普通函数:

public Application extends Controller {
public static Result index() {
return ok(views.html.index.render(42));
}
}

在这里,render是对象的方法 index其类型为 Template1<Integer, Html> .

现在的问题是:如何编写能够调用特定于另一个 Controller 的 View 的通用 Controller ?或者简单地说:如何抽象 View

我看到两个解决方案: inversion of control 反射

让我们看看如何在一个简单的用例中实现这两者。假设您有以下通用 Shower<T>能够计算包含任何类型值的 HTML 表示的 HTTP 响应的类 T :

public class Shower<T> {
public Result show(T value) {
// TODO return an HTML representation of `value`
}
}

控制反转

实现Shower<T>使用控制反转我们只需要注入(inject) Template1<T, Html>用于执行渲染的值:

public class Shower<T> {

public final Template1<T, Html> template;

public Shower(Template1<T, Html> template) {
this.template = template;
}

public Result show(T value) {
return ok(template.render(value));
}

}

要在 Controller 中使用它,请创建 Shower<T> 的静态实例并将其注入(inject)要使用的模板:

public class Application extends Controller {
public static Shower<Foo> foo = new Shower<Foo>(views.html.Foo.show.ref());
}

反射(reflection)

你可能会发现它太样板了,必须显式注入(inject)模板以用于 Shower<T> 的每个实例。 ,因此您可能会想根据命名约定通过反射来检索它,例如显示 Foo 类型的值, 只需查找名为 show 的对象在包裹中 views.html.Foo :

public class Shower<T> {

private final Class<T> clazz;

public Shower(Class<T> clazz) {
this.clazz = clazz;
}

public Result show(T value) throws Exception {
Class<?> object = Play.application().classLoader().loadClass("views.html." + clazz.getSimpleName() + ".show$");
Template1<T, Html> template = (Template1<T, Html>)object.getField("MODULE$").get(null);
return ok(template.render(value));
}
}

(这就是使用反射访问Scala对象的方式)

您可以在 Controller 中按如下方式使用它:

public class Application extends Controller {
public static Shower<Foo> foo = new Shower<Foo>(Foo.class);
}

优缺点

基于反射的解决方案在调用站点上需要较少的样板,但它依赖于命名约定的事实使其更脆弱。此外,此解决方案只会在失败时在运行时失败,而第一个解决方案会在编译时显示您丢失的模板。最后但同样重要的是,由于反射,基于反射的解决方案可能会增加一些性能开销

关于java - 使用通用 Controller 时,如何返回特定 Controller 固有的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10738182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com