js webapp://_Project Student:维护Webapp(只读)

js webapp://

这是Project Student的一部分。 其他职位包括具有Jersey的 Web服务 客户端,具有Jersey的 Web服务服务器 , 业务层 , 具有Spring数据的持久性 ,分片集成测试数据 , Webservice集成和JPA标准查询 。

当我开始这个项目时,我有四个目标。 他们没有特别的顺序:

  • 了解jQuery和其他AJAX技术。 为此,我需要一个了解的REST服务器,
  • 捕获最近获得的有关球衣和挂毯的知识,
  • 创建一个我可以用来了解其他技术(例如spring MVC,restlet,netty)的框架,以及
  • 在工作面试中有什么要讨论的

如果对其他人有用–太好了! 这就是为什么它在Apache许可下可用。

(不言而喻,可接受的用途不包括在没有适当归因的情况下将“ Project Student”变成学生项目!)

学习AJAX的问题是,我一开始会不确定问题的根源。 jQuery不好吗? 不良的REST服务? 还有吗 广泛的单元和集成测试是一个好的开始,但是始终会存在一些不确定性。

另一个考虑因素是,在现实世界中,我们经常需要对数据库的基本视图。 它不会供公众使用-当我们遇到WTF时刻时仅供内部使用。 它也可以用来维护我们不想通过公共界面管理的信息,例如下拉菜单中的值。

对此可以稍作调整,以提供适度的可伸缩性。 将大型服务器用于数据库和REST服务,然后让N台前端服务器运行常规的Web应用程序,充当用户和REST服务之间的中介。 前端服务器可以是相当轻量的,并且可以根据需要旋转。 将缓存服务器放置在前端和REST服务器之间的加分点,因为将读取压倒性的点击量。

这种方法无法扩展到Amazon或Facebook的规模,但是对于许多站点来说已经足够了。

维护Webapp

这将我们带到了webapp onion的可选层–一个常规的webapp,充当REST服务的前端。 由于各种原因,我在应用程序中使用Tapestry 5 ,但这是一个任意决定,我不会花很多时间研究Tapestry特定的代码。

您可以使用创建新的挂毯项目

$ mvn archetype:generate -DarchetypeCatalog=http://tapestry.apache.org

我已经在http://jumpstart.doublenegative.com.au/jumpstart/examples/找到了有价值的示例。 在适当的地方,我会注明出处。

稍后,我还将创建webapp的第二个可选层–使用Selenium和WebDriver (即Selenium 2.0)进行功能和回归测试。

局限性

只读 –分解webapp需要进行大量工作,因此初始版本将仅提供对简单表的只读访问。 没有更新,没有一对多映射。

用户身份验证 –尚未进行身份验证的工作。

加密 -尚未对通信进行加密。

数据库锁 –我们在Hibernate版本中使用机会锁定,而不是显式数据库锁定。 安全说明:根据最少公开的原则,除非需要,否则我们不想使该版本可见。 一个好的规则是,您将看到它是否请求一个特定的对象,但看不到列表中的对象。

REST客户端 -每种类型的默认GET处理程序非常粗糙-仅返回对象列表。 我们需要一个更复杂的响应(例如,记录数,开始和结束索引,状态码等),并将让UI驱动它。 目前,我们真正需要的只是一个计数,我们可以只请求列表并计数元素的数量。

目标

我们需要一个列出数据库中所有课程的页面。 它不必担心分页,排序等问题。它应该具有用于​​编辑和删除记录的链接(可能是无效的)。 它不需要添加新课程的链接。

该页面应如下所示:

项目维护

课程模板

Tapestry页面上列出的课程很简单–它基本上只是修饰的值网格

(有关Layout.tml等信息,请参见挂毯原型。)

<html t:type="layout" title="Course List"t:sidebarTitle="Framework Version"xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd"xmlns:p="tapestry:parameter"><!-- Most of the page content, including <head>, <body>, etc. tags, comes from Layout.tml --><t:zone t:id="zone">   <p>"Course" page</p><t:grid source="courses" row="course" include="uuid,name,creationdate" add="edit,delete"><p:name><t:pagelink page="CourseEditor" context="course.uuid">${course.name}</t:pagelink></p:name><p:editcell><t:actionlink t:id="edit" context="course.uuid">Edit</t:actionlink></p:editcell><p:deletecell><t:actionlink t:id="delete" context="course.uuid">Delete</t:actionlink></p:deletecell><p:empty><p>There are no courses to display; you can <t:pagelink page="Course/Editor" parameters="{ 'mode':'create', 'courseUuid':null }">add some</t:pagelink>.</p></p:empty></t:grid></t:zone><p:sidebar><p>[<t:pagelink page="Index">Index</t:pagelink>]<br/>[<t:pagelink page="Course/List">Courses</t:pagelink>]</p></p:sidebar>
</html>

具有的属性文件

title=Courses
delete-course=Delete course?

我已经包括了用于编辑和删除的操作链接,但是它们不起作用。

GridDataSources

我们的页面需要显示值的来源。 这需要两个类。 第一个定义了上面使用的课程属性。

package com.invariantproperties.sandbox.student.maintenance.web.tables;import com.invariantproperties.sandbox.student.business.CourseFinderService;public class GridDataSources {// Screen fields@Propertyprivate GridDataSource courses;// Generally useful bits and pieces@Injectprivate CourseFinderService courseFinderService;@InjectComponentprivate Grid grid;// The codevoid setupRender() {courses = new CoursePagedDataSource(courseFinderService);}
}

实际的实现是

package com.invariantproperties.sandbox.student.maintenance.web.tables;import com.invariantproperties.sandbox.student.business.CourseFinderService;
import com.invariantproperties.sandbox.student.domain.Course;
import com.invariantproperties.sandbox.student.maintenance.query.SortCriterion;
import com.invariantproperties.sandbox.student.maintenance.query.SortDirection;public class CoursePagedDataSource implements GridDataSource {private int startIndex;private List<Course> preparedResults;private final CourseFinderService courseFinderService;public CoursePagedDataSource(CourseFinderService courseFinderService) {this.courseFinderService = courseFinderService;}@Overridepublic int getAvailableRows() {long count = courseFinderService.count();return (int) count;}@Overridepublic void prepare(final int startIndex, final int endIndex, final List<SortConstraint> sortConstraints) {// Get a page of courses - ask business service to find them (from the// database)// List<SortCriterion> sortCriteria = toSortCriteria(sortConstraints);// preparedResults = courseFinderService.findCourses(startIndex,// endIndex - startIndex + 1, sortCriteria);preparedResults = courseFinderService.findAllCourses();this.startIndex = startIndex;}@Overridepublic Object getRowValue(final int index) {return preparedResults.get(index - startIndex);}@Overridepublic Class<Course> getRowType() {return Course.class;}/*** Converts a list of Tapestry's SortConstraint to a list of our business* tier's SortCriterion. The business tier does not use SortConstraint* because that would create a dependency on Tapestry.*/private List<SortCriterion> toSortCriteria(List<SortConstraint> sortConstraints) {List<SortCriterion> sortCriteria = new ArrayList<>();for (SortConstraint sortConstraint : sortConstraints) {String propertyName = sortConstraint.getPropertyModel().getPropertyName();SortDirection sortDirection = SortDirection.UNSORTED;switch (sortConstraint.getColumnSort()) {case ASCENDING:sortDirection = SortDirection.ASCENDING;break;case DESCENDING:sortDirection = SortDirection.DESCENDING;break;default:}SortCriterion sortCriterion = new SortCriterion(propertyName, sortDirection);sortCriteria.add(sortCriterion);}return sortCriteria;}
}

应用模块

现在有了GridDataSource,我们可以看到它的需求– CourseFinderService。 虽然存在Tapestry-Spring集成,但我们希望保持维护Webapp尽可能薄,所以现在我们使用标准Tapestry注入。

package com.invariantproperties.sandbox.student.maintenance.web.services;import com.invariantproperties.sandbox.student.business.CourseFinderService;
import com.invariantproperties.sandbox.student.business.CourseManagerService;
import com.invariantproperties.sandbox.student.maintenance.service.impl.CourseFinderServiceTapestryImpl;
import com.invariantproperties.sandbox.student.maintenance.service.impl.CourseManagerServiceTapestryImpl;/*** This module is automatically included as part of the Tapestry IoC Registry,* it's a good place to configure and extend Tapestry, or to place your own* service definitions.*/
public class AppModule {public static void bind(ServiceBinder binder) {binder.bind(CourseFinderService.class, CourseFinderServiceTapestryImpl.class);binder.bind(CourseManagerService.class, CourseManagerServiceTapestryImpl.class);}....
}

请注意,我们正在将标准CourseFinderService接口与挂毯特定的实现一起使用。 这意味着我们可以直接使用标准实现,只需要对配置文件进行一点改动即可!

CourseFinderServiceTapestryImpl

CourseFinderService接口的本地实现必须使用REST客户端而不是Spring Data实现。 使用较早使用的由外而内的方法,Tapestry模板的需求应驱动服务实现的需求,进而驱动REST客户端和服务器的需求。

package com.invariantproperties.sandbox.student.maintenance.service.impl;public class CourseFinderServiceTapestryImpl implements CourseFinderService {private final CourseFinderRestClient finder;public CourseFinderServiceTapestryImpl() {// resource should be loaded as tapestry resourcefinal String resource = "http://localhost:8080/student-ws-webapp/rest/course/";finder = new CourseFinderRestClientImpl(resource);// load some initial datainitCache(new CourseManagerRestClientImpl(resource));}@Overridepublic long count() {// FIXME: grossly inefficient but good enough for now.return finder.getAllCourses().length;}@Overridepublic long countByTestRun(TestRun testRun) {// FIXME: grossly inefficient but good enough for now.return finder.getAllCourses().length;}@Overridepublic Course findCourseById(Integer id) {// unsupported operation!throw new ObjectNotFoundException(id);}@Overridepublic Course findCourseByUuid(String uuid) {return finder.getCourse(uuid);}@Overridepublic List<Course> findAllCourses() {return Arrays.asList(finder.getAllCourses());}@Overridepublic List<Course> findCoursesByTestRun(TestRun testRun) {return Collections.emptyList();}// method to load some test data into the database.private void initCache(CourseManagerRestClient manager) {manager.createCourse("physics 101");manager.createCourse("physics 201");manager.createCourse("physics 202");}
}

我们的JPA Criteria查询可以快速计数,但是我们的REST客户端尚不支持。

结语

完成艰苦的工作后,我们将获得一个维护文件.war。 我们可以使用webservice .war在我们的应用服务器上部署它,也可以不部署。 除了Web服务的临时硬编码URL外,这两个.war文件没有理由必须位于同一系统上。

我们首先应该去http:// localhost:8080 / student-maintenance-webapp / course / list。 我们应该看到如上所示的简短课程列表。 (在那种情况下,我已经重新启动了webapp三次,因此每个条目都会重复三倍。)

现在,我们应该访问位于http:// localhost:8080 / student-ws-webapp / rest / course的webservice webapp,并验证我们是否也可以通过浏览器获取数据。 经过一些清理后,我们应该看到:

{"course":[{"creationDate":"2013-12-28T14:40:21.369-07:00","uuid":"500069e4-444d-49bc-80f0-4894c2d13f6a","version":"0","name":"physics 101"},{"creationDate":"2013-12-28T14:40:21.777-07:00","uuid":"54001b2a-abbb-4a75-a289-e1f09173fa04","version":"0","name":"physics 201"},{"creationDate":"2013-12-28T14:40:21.938-07:00","uuid":"cfaf892b-7ead-4d64-8659-8f87756bed62","version":"0","name":"physics 202"},{"creationDate":"2013-12-28T16:17:54.608-07:00","uuid":"d29735ff-f614-4979-a0de-e1d134e859f4","version":"0","name":"physics 101"},....]
}

源代码

  • 源代码位于https://github.com/beargiles/project-student [github]和http://beargiles.github.io/project-student/ [github页面]。

参考: 项目学生: Invariant Properties博客上来自JCG合作伙伴 Bear Giles的Maintenance Webapp(只读) 。

翻译自: https://www.javacodegeeks.com/2014/01/project-student-maintenance-webapp-read-only.html

js webapp://

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/343670.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

光端机安装调试需注意的几大因素

安装光端机时要做好现场的防护措施&#xff0c;防潮、防水、防尘&#xff0c;同时注意现场的实际操作&#xff0c;必须配备合适的光纤使用&#xff0c;不能使用残缺故障的光纤&#xff0c;如果不匹配&#xff0c;则会严重影响光端机传输质量&#xff0c;涉及光缆熔接时&#xf…

catia钣金根据线段折弯_钣金折弯加工注意事项有哪些?钣金折弯要点介绍

钣金折弯时金属加工中常用到的一道工序&#xff0c;它的用途十分广泛&#xff0c;是通过折弯机把一种板材加工成各种角度&#xff0c;加上数控功能后&#xff0c;钣金折弯有效地提高了加工精度和生产效率。然而&#xff0c;在钣金折弯过程中存在着一些注意事项和要点&#xff0…

开关量光端机产品特点及应用范围介绍

飞畅科技生产的开关量光端机为纯开关量(告警量)光端机提供1-7路开关量在光纤中传输&#xff0c;该产品解决了电磁干扰、地环干扰和雷电破坏的难题&#xff0c;提高了数据通讯的可靠性、安全性和保密性&#xff0c;可广泛用于各种工业控制、过程控制和交通控制等场合&#xff0c…

计算机网络系统什么组成,计算机网络系统是由什么组成的

计算机网络系统是由网络硬件和网络软件组成的。在网络系统中&#xff0c;硬件的选择对网络起着决定的作用&#xff0c;而网络软件则是挖掘网络潜力的工具。一般是指极端机设备、传输介质、和网络连接设备。至2011年&#xff0c;网络连接设备有很多&#xff0c;功能不一&#xf…

ds1302典型应用原理图_不同类型的光纤激光器,在工业中有哪些典型应用

激光器根据材料分类可分为光纤激光器、半导体激光器、固体激光器与C02激光器等。而在整个激光器的工业应用中&#xff0c;光纤激光器独树一帜&#xff0c;近几年发展速度最快。目前光纤激光器的种类越来越多&#xff0c;根据激光输出时域特性的不同&#xff0c;可以将光纤激光器…

webapp文本编辑器_Project Student:维护Webapp(可编辑)

webapp文本编辑器这是Project Student的一部分。 其他职位包括带有Jersey的 Web服务 客户端&#xff0c;带有Jersey的 Web服务服务器 &#xff0c; 业务层 &#xff0c; 带有Spring数据的持久性 &#xff0c;分片集成测试数据 &#xff0c; Webservice集成 &#xff0c; JPA标准…

交换机的端口结构及端口类型

交换机在同一时刻可进行多个端口对之间的数据传输。每一端口都可视为独立的物理网段&#xff08;注&#xff1a;非IP网段&#xff09;&#xff0c;连接在其上的网络设备独自享有全部的带宽&#xff0c;无须同其他设备竞争使用。那么&#xff0c;你对于交换机的端口结构及端口类…

前9个免费的Java进程监视工具以及如何选择一种

这样就可以运行Java代码了。 也许它甚至可以在生产服务器上运行。 在您完成出色工作之后&#xff0c;我们得到了好消息和令人讨厌的消息。 令人讨厌的消息是&#xff0c;现在开始调试。 就是调试和应用程序性能监视。 这意味着您不仅需要查看编写的代码&#xff0c;还可以查看…

redisson的锁的类型_厉害了,中间件Redisson原来这么好用!

点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐]作者&#xff1a;bravoban原文&#xff1a;http://tech.lede.com/2017/03/08/rd/server/Redisson/针对项目中使用的分布式锁进行简单的示例配置以及源码解析&#xff0c;并列举源码中使用到的一些基础知识点&#xff0c;但…

探探自动配对PHP_CentOS7 - 安装Apache HTTP Server和PHP

安装Apache HTTP Server和PHP你可能听说过LAMP的缩写&#xff0c;它代表Linux&#xff0c;Apache&#xff0c;MySQL和PHP。 它指的是用于提供网站和Web应用程序的流行技术配对。 本文教您如何安装Apache HTTP Server(简称Apache)并将其配置为与PHP一起使用以提供动态Web内容.Ap…

网管型交换机比普通交换机有哪些明显优势

现在网络这么普及&#xff0c;对于交换机的需求也就越发的重要了&#xff0c;而市面上交换机的型号这么多&#xff0c;之前我们也分析过按照不同的情况怎么区分交换机&#xff0c;但浏览名称的时候我们也会发现&#xff0c;许多交换机的简介都会写着网管型交换机和非网管型交换…

cryptojs支持rsa加密_新特性解读 | 从 wireshark 看 MySQL 8.0 加密连接

作者&#xff1a;秦福朗爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问题排查。热爱 IT&#xff0c;喜欢在互联网里畅游&#xff0c;擅长摄影、厨艺&#xff0c;不会厨艺的 DBA 不是好司机&#xff0c;didi~本文来源&#xff1a;原创投稿*爱可生开源社区出品…

sap-erp实施心得_实施动态代理-比较

sap-erp实施心得有时需要拦截某些方法调用&#xff0c;以便每次调用被拦截方法时都执行自己的逻辑。 如果您不属于Java EE的CDI领域&#xff0c;并且不想使用诸如Aspectj之类的AOP框架&#xff0c;那么您将有一个简单而有效的替代方法。 从1.5版开始&#xff0c;JDK附带了类ja…

保存点云数据_PCL入门系列三——PCL进行数据读写

本节课我们将了解到以下内容&#xff1a;基本的PCL中的数据类型&#xff1b;使用PCL进行简单编程&#xff1a;写文件与读文件。一、PCL库基本数据类型上一节课&#xff0c;我们使用PCL库在本地写入了一个名为test_pcd.pcd的文件。我们划分一下程序的任务步骤&#xff1a;构造pc…

win8系统的计算机共享在哪里设置方法,win10系统设置与win8系统局域网文件共享的方案...

win10系统使用久了&#xff0c;好多网友反馈说关于对win10系统设置与win8.1系统局域网文件共享设置的方法&#xff0c;在使用win10系统的过程中经常不知道如何去对win10系统设置与win8.1系统局域网文件共享进行设置&#xff0c;有什么好的办法去设置win10系统设置与win8.1系统局…

光端机的使用方法

光端机是一种不仅可以传输视频信号&#xff0c;还能传输音频、电话、网络、和很多种控制信号的以太网介质传输设备&#xff0c;目前主要使用安防监控行业。那么&#xff0c;光端机是怎么使用的&#xff0c;接下来就由飞畅科技的小编来为大家详细介绍下光端机的使用方法吧&#…

用香港服务器建收费网站,使用香港站群服务器搭建网站的好处有哪些?

香港站群服务器搭建网站的作用&#xff1a;1、香港站群服务器有利于提高网站被搜索引擎收录情况;2、搭建站群能够有效降低网站被封的风险;3、当网站遭受攻击时&#xff0c;可快速通过带有独立IP的网站来查出问题所在&#xff0c;从而有效提高服务器的维护。香港站群服务器搭建站…

分数化简_分数应用题七讲 (一) 图示法解分数应用题

一、今日一讲图示法就是用线段图(或其它图形)把题目中的已知条件和问题表示出来&#xff0c;这样可以把抽象的数量关系具体化&#xff0c;往往可以从图中找到解题的突破口。运用图示法教学应用题&#xff0c;是培养思维能力的有效方法之一。图示法不仅可以形象地、直观地反映分…

发送广播_DHCP服务器什么时候发送?为什么request要广播发送?那还不看?

动态主机配置协议&#xff1a;DHCP 用来集中管理、分配IP地址&#xff0c;使网络环境中的主机能够动态获取IP地址、网关地址、DNS服务器地址等信息&#xff1b;DHCP采用客户端服务器模式&#xff0c;端口号&#xff1a;客户端为68(中继模式下67)&#xff0c;服务器端为67版本一…

开关量光端机指示灯说明及常见故障问题处理方法

开关量光端机可以使开关量信号通过光缆在光纤上传输双向控制。全数字光传输通道&#xff0c;确保高质量的信号传输。面板上有电源指示灯、光信号指示灯数据信号指示灯&#xff0c;可以直观的检测电源、光信号、数据信号状态。单向系列开关量光端机是高性能&#xff0c;高可靠性…