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,一经查实,立即删除!

相关文章

【渝粤教育】 国家开放大学2020年春季 2071美学与美育 参考试题

试卷代号&#xff1a;2083 2 0 2 0年春季学期期末统一考试 信息技术与教育技术(2) 试题&#xff08;开卷&#xff09; 2020年7月 一、单选题&#xff08;每小题4分&#xff0c;共6小题.24分&#xff09; 1.下面哪一项不是程序教学法的特点&#xff1f;&#xff08; &#xff09…

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

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

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

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

【渝粤教育】 国家开放大学2020年春季 2136管理会计 参考试题

试卷代号&#xff1a;2180 座位号□□ 2 0 2 0年春季学期期末统一考试 办公室管理 试题 2020年7月 一、单项选择题&#xff08;请将正确答案的字母序号填在括号内&#xff0c;每小题2分&#xff0c; 共10分&#xff09; 1&#xff0e;办公室管理的第一要义是( )。 A&#xff0e…

html代二级菜单的实例,jquery实现树形二级菜单实例代码

jquery实现的树形列表菜单(Menu Tree) .padding {height:300px;}This copyright notice must be kept untouched in the stylesheet atall times.The original version of this stylesheet and the associated (x)htmlis available at http://www.jb51.netCopyright (c) 2005-2…

【渝粤教育】 国家开放大学2020年春季 2246社会工作概论 参考试题

试卷代号&#xff1a;2302 2 0 2 0年春季学期期末统一考试 供应链管理 试题 2020年7月 一、单项选择题&#xff08;每小题2分&#xff0c;共20分&#xff0c;将正确答案填入括号内&#xff09; 1&#xff0e;供应链管理是一种全新的管理理念和方法&#xff0c;其核心是强调运用…

每个Java学习者都会犯的10大常见错误1

据说&#xff1a;“您的朋友会吞下您的错误&#xff0c;您的敌人会将它们呈现在盘子上”。 我绝对不是你的敌人&#xff0c;但我想向您介绍一些针对每个Java初学者的错误&#xff0c;我将在此博客“标牌”上就此做错。 当然只有我从CodeGym.cc课程分析系统收集的内容。 如果您还…

mac os 开启redis_Mac下配置Redis服务器(自启动、后台运行) | 学步园

Redis服务器在从诸多文章上看来&#xff0c;是个极为优秀的Key-value数据库软件。其NB之处可以从这篇文章中略知一二。主要参考首先是安装&#xff0c;它会默认安装到/usr/local/bin下cd /tmpwget http://redis.googlecode.com/files/redis-2.6.9.tar.gztar -zxf redis-2.6.9.t…

光端机使用时出现了故障怎样定位和处理

光端机&#xff0c;就是光信号传输的终端设备&#xff0c;但是客户在使用光端机的过程中难免会碰到一些问题&#xff0c;那么&#xff0c;我们在使用光端机时出现了故障该怎样定位和处理呢&#xff1f;接下来就由杭州飞畅科技的小编来为大家详细介绍下光端机出现故障时该怎样分…

【渝粤教育】 国家开放大学2020年春季 2412基础写作 参考试题

试卷代号&#xff1a;2437 座位号 2 0 2 0年春季学期期末统一考试 微积分基础 试题 2020年7月 附表 导数基本公式&#xff1a; 积分基本公式&#xff1a; 一、单项选择题&#xff08;每小题4分&#xff0c;共20分&#xff09; 1&#xff0e;函数的定义域为( )&#xff0e; A&a…

使用计算机时 开关机顺序会,电脑如何正确开关机

电脑如何正确开关机要使用电脑必须启动它&#xff0c;要停用电脑的时候必须要关闭&#xff0c;电脑如何正确开关机呢&#xff1f;下面是小编分享的经验&#xff0c;一起来看一下吧。电脑开机正确步骤1、先把总电源打开。就是接通主机与显示器的总电源。一般是一个插排&#xff…

【渝粤教育】 国家开放大学2020年春季 2542行政组织学 参考试题

试卷代号&#xff1a;2588 座位号 2 0 2 0年春季学期期末统一考试 管理线性规划入门 试题 2020年7月 一、单项选择题&#xff08;每小题6分&#xff0c;共30分&#xff09; 1&#xff0e;下列( )为单位矩阵。 A&#xff0e; B&#xff0e; C&#xff0e; D&#xff0e; 2&#…

cpythonjavagolang_cpython:列表对象(PyListObject)的扩容机制

list object可变对象头ob_item: 指向分配的空间&#xff0c;元素是指针allocated: 真实容量.Objects/listobjects.c/* Ensure ob_item has room for at least newsize elements, and set* ob_size to newsize. If newsize > ob_size on entry, the content* of the new slot…

【渝粤教育】 国家开放大学2020年春季 2716动物营养基础 参考试题

试卷代号&#xff1a;2721 座位号 2 0 2 0年春季学期期末统一考试 乡镇行政管理试题 2020年7月 一、单项选择题&#xff08;每小题1分&#xff0c;共10分&#xff0c;每小题只有一项答案正确&#xff0c;请将正确答案的序号填在括号内&#xff09; 1&#xff0e; 1926年出版了世…

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

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

【渝粤教育】 国家开放大学2020年春季 2773特种动物养殖 参考试题

试卷代号&#xff1a;2779 座位号 2 0 2 0年春季学期期末统一考试 植物病虫害防治基础 试题 2020年7月 一、单项选择题&#xff08;每小题3分&#xff0c;共60分&#xff09; 1&#xff0e;非传染性病害与传染性病害诊断程序的不同在于( )。 A&#xff0e;田间观察 B&#xff0…

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

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

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

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

【渝粤教育】 国家开放大学2020年春季 3962金融营销基础 参考试题

试卷代号&#xff1a;3983 座位号口口 2 0 2 0年春季学期期末统一考试 品牌管理 试题 2020年7月 一、单项选择题&#xff08;在各题的备选答案中&#xff0c;只有1项是正确的&#xff0c;请将正确答案的序号填写在题中的括号内&#xff0c;每个小题2分&#xff0c;共20分&#…

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

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