使用通用控制器时,如何返回特定控制器固有的视图?

2023-12-26

这个答案的结果是:https://stackoverflow.com/a/10708026/694597 https://stackoverflow.com/a/10708026/694597,我想知道在使用通用控制器时如何返回特定控制器固有的视图。


当您在控制器操作中渲染视图时,您只需调用模板引擎生成的普通函数:

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

Here, render是对象的方法index其中有类型Template1<Integer, Html>.

现在的问题是:如何编写一个能够调用特定于另一个控制器的视图的通用控制器?或者简单地:如何抽象视图?

我看到两个解决方案:控制反转 http://en.wikipedia.org/wiki/Inversion_of_control and 反射.

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

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

控制反转

实施Shower<T>使用控制反转,我们只需要注入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));
  }

}

要在控制器中使用它,请创建一个静态实例Shower<T>并注入要使用的模板:

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

反射

您可能会发现它太样板了,必须显式注入要用于每个实例的模板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对象的方式)

您可以在控制器中按如下方式使用它:

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

优点和缺点

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用通用控制器时,如何返回特定控制器固有的视图? 的相关文章

随机推荐

  • 将焦点设置到 jQuery UI MultiSelect Widget 中的 Filter 输入

    我正在编写一个小脚本 它将焦点设置到多选 jquery 小部件的过滤器文本输入字段 根据文档 我可以像这样订阅小部件的单击事件 bind to event multiselect bind multiselectopen function
  • Angular 5:有条件地设置默认路由

    我有一个包含三个子菜单及其相应子路线的导航 现在 某些子菜单不可见 ngIf 具体取决于用户从服务器获得的声明 当单击主菜单时 我重定向到其中一个子菜单 但有时该子菜单无法访问 然后我想重定向到下一个同级菜单 path mymainmenu
  • MediaRecorder.stop() 与 Android 4.0 (ICS) 挂起

    打电话时stop 在我的视频捕捉活动中 软件有时会挂起并且无法恢复 只有通过点击 返回 来触发 ANR 才能让我终止该活动 在日志中 我看到以下行一遍又一遍地重复 W CameraSource YYYYY 等待传入摄像头视频超时 帧 XXX
  • JAX-RS 中等效的 Servlet init() 方法

    我正在开发一个在 Glassfish 上运行的应用程序 我应该使用 jax rs 和 jersey 将 servlet 转换为适当的静态内容 我一直在尝试寻找 init 方法的解决方法 但到目前为止我失败了 这是使用 servlet 的原始
  • 获取亚马逊 s3 存储桶大小的最快方法

    截至目前 我正在通过迭代所有对象并将单个对象的大小相加来计算亚马逊 s3 存储桶的大小 这是相当耗时的 我尝试并行操作并节省了一些时间 但即使这样也需要很多时间 我正在使用的系统 EC2 m1 large 是否有任何解决方法或更好的方法来找
  • 如何使用 Apache Commons 以多部分形式读取其他参数

    我有一个文件上传表单 正在发送回 servlet 使用多部分 表单数据编码 在 servlet 中 我尝试使用 Apache Commons 来处理上传 但是 我的表单中还有一些其他字段只是普通字段 如何从请求中读取这些参数 例如 在我的
  • 如何避免CodeIgniter中的SQL注入?

    有没有什么方法可以在配置文件中设置以避免SQL注入 我使用此代码来选择值 this gt db gt query SELECT FROM tablename WHERE var val1 这用于插入值 this gt db gt query
  • 在纱线集群上运行时引发 ClassNotFoundException

    my code import org apache spark SparkConf SparkContext object Run extends App val conf new SparkConf setMaster yarn clus
  • 如何保护用于让用户上传文件的文件夹的安全?

    我的 Web 服务器中有一个文件夹 供用户使用 ASP 页面上传照片 授予 IUSR 对该文件夹的写入权限是否足够安全 我必须确保其他东西吗 我担心黑客会绕过 ASP 页面 直接将内容上传到文件夹中 我在 Windows 2003 Serv
  • 原型有 hash.inspect() 方法。 jQuery 世界中的等价物是什么?

    我正在使用 jQuery 我正在处理 JSON 对象 并且需要一次又一次地查看数据 我做了警报 数据 但没有得到任何有用的东西 在原型世界中 他们有非常有用的检查方法 检查原型中的方法 http www tutorialspoint com
  • TensorFlow 2 自定义损失:“没有为任何变量提供梯度”错误

    我有一个图像分割问题必须在 TensorFlow 2 中解决 特别是 我有一个由航空图像及其各自的掩模配对组成的训练集 在蒙版中 地形为黑色 建筑物为白色 目的是预测测试集中图像的掩模 我使用带有最终 Conv2DTranspose 的 U
  • 从 UIImageView 中删除图像

    我加载一个UIImageView具有取决于用户交互的图像 当父视图最初显示时 没有选择任何图像 并且图像视图是黑色的 如果用户离开该视图并返回 图像仍然存在 我试过了 myImageView image nil 离开视图但图像仍然存在 我怎
  • 布尔值与可选 true [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 描述可以处于 选中 或 未选中 状态的某些标志的更好方法是什么 interface OperationResult success true i
  • Google Analytics (gtag.js):产品列表名称不显示,但其他字段显示

    我正在使用新的 GA 增强型电子商务gtag js图书馆 我想按照此处的文档发送有关产品印象和产品点击的信息 https developers google com analytics devguides collection gtagjs
  • Swift:将函数分配给变量

    我有一个 swift 类 其中包含以下变量 var pendingFunction Double Double gt Double 斯威夫特然后告诉我 类型名称后预期的成员名称或构造函数调用 它坚持要求我将代码更改为 var pending
  • Mongoimport 忽略 csv 中的前导零

    我有一个 CSV从 SQL Server 数据库导出文件 其中包含电话号码字段 数字类型 该字段值以前导零开头 CSV 文件中显示前导零 当我尝试将其 mongoimport 到数据库 字符串类型 时 我发现导入的数据没有前导零 目标字段编
  • 将新列附加到现有 parquet 文件

    有没有办法将新列附加到现有的镶木地板文件中 我目前正在参加 Kaggle 比赛 我已将所有数据转换为镶木地板文件 情况是这样的 我将 parquet 文件读入 pyspark DataFrame 进行了一些特征提取 并将新列附加到 Data
  • 如何登录 Azure Web 作业? [复制]

    这个问题在这里已经有答案了 所以我尝试过 Trace TraceInformation Trace Information Found message on queue Debug WriteLine Debug Found message
  • 调整缩略图大小 django Heroku,“后端不支持绝对路径”

    我已经使用 Django 在 Heroku 上部署了一个应用程序 到目前为止它似乎可以正常工作 但我在上传新缩略图时遇到问题 我安装了 Pillow 以便在上传图像时调整图像大小 并保存调整大小的缩略图 而不是原始图像 但是 每次上传时 都
  • 使用通用控制器时,如何返回特定控制器固有的视图?

    这个答案的结果是 https stackoverflow com a 10708026 694597 https stackoverflow com a 10708026 694597 我想知道在使用通用控制器时如何返回特定控制器固有的视图