当前位置: 首页 > news >正文

如何做网站新手个人教程网页设计与网站建设案例课堂

如何做网站新手个人教程,网页设计与网站建设案例课堂,半路出家去学计算机网站开发,一建 专业代表#xff1a;被选中或当选为他人投票或代表他人的人– Merriam-Webster 。 委托模式#xff1a;在软件工程中#xff0c;委托模式是面向对象编程中的一种设计模式#xff0c;其中#xff0c;一个对象而不是执行其声明的任务之一#xff0c;而是将该任务委托给一个关联… 代表被选中或当选为他人投票或代表他人的人– Merriam-Webster 。 委托模式在软件工程中委托模式是面向对象编程中的一种设计模式其中一个对象而不是执行其声明的任务之一而是将该任务委托给一个关联的辅助对象Wikipedia 。 让事情尽可能简单但不要简单- 爱因斯坦 Albert Einstein释义 。 Spring Batch是Enterprise Java工具箱中的重要工具。 它提供了开箱即用的强大功能尤其是从不同来源读取和写入数据时。 我们在此博客中提供了几篇介绍Spring Batch的文章。 如果您不熟悉Spring Batch和ReaderProcessorWriter Tasklet请花点时间回顾一下。 我上面使用的措辞对我来说很重要。 我尝试做的一件事就是保持我提供的代码尽可能可维护。 我希望它能正常工作但是我今天签入的代码将在以后某个日期由某些人维护。 保持代码尽可能简单是确保代码易于维护的一种方法。 那么当您必须处理复杂的数据源时会发生什么呢 我们发现经常要处理的输入文件并不像每行一个记录那么简单。 通常文件中有多行仅描述一条记录。 例如 HKaren Traviss LAB00KW3VG2G LI0345478274 LI0345511131 F00000003 HJim Butcher LI0451457811 F00000001 HDave Duncan LI0380791277 LI0345352912 F00000002 HRik Scarborough LI9999999999 F00000001 在这里我们有一个文件其中包含十五行中的四个记录。 每条记录均以页眉行开头包含一个或多个正文行并以页脚结尾。 标头包含线型标头为H和名称。 该行还包含线型L查找类型在此示例中为ISBN或Amazon代码以及查找书本的键。 页脚再次包含线型和此块中的记录数。 使用标准的读取器将读取每一行然后传递给处理器然后处理器必须确定处理的是哪种类型的行。 然后处理程序在处理每条正文行时处理程序将必须保留来自每个标头的信息直到处理了页脚。 然后编写者将必须知道处理器发送的每一行以及是否应将其写入。 这很复杂部分是因为多个对象必须知道如何读取文件而不是处理器仅关心单个对象而编写器仅关心编写给出的内容。 相反让我们将Delegate模式引入Reader并让其处理创建整个记录的过程。 由于我们具有来自多行的信息以及用于创建每个记录的页眉和页脚因此我们必须将记录列表传递给处理程序。 你们当中的观察者会注意到每个记录都包含一个ISBN或Amazon图书符号并且可以用来查找作者也包含在标题中。 在现实生活中这种冗余可能也不会发生。 让我们将输出包装在另一个对象中以使其更易于使用。 public class OrderReaderStep implements ItemReaderOrderList {private static final Logger logger LoggerFactory.getLogger(OrderReaderStep.class);private FlatFileItemReader FieldSet delegate;private static final String FOOTER F*;private static final String BODY L*;private static final String HEADER H*;BeforeSteppublic void beforeStep(StepExecution stepExecution) {delegate new FlatFileItemReader();delegate.setResource(new ClassPathResource(orders.txt));final DefaultLineMapper FieldSet defaultLineMapper new DefaultLineMapper();final PatternMatchingCompositeLineTokenizer orderFileTokenizer new PatternMatchingCompositeLineTokenizer();final MapString, LineTokenizer tokenizers new HashMap();tokenizers.put(HEADER, buildHeaderTokenizer());tokenizers.put(BODY, buildBodyTokenizer());tokenizers.put(FOOTER, buildFooterTokenizer());orderFileTokenizer.setTokenizers(tokenizers);defaultLineMapper.setLineTokenizer(orderFileTokenizer);defaultLineMapper.setFieldSetMapper(new PassThroughFieldSetMapper());delegate.setLineMapper(defaultLineMapper);delegate.open(stepExecution.getExecutionContext());}AfterSteppublic void afterStep(StepExecution stepExecution) {delegate.close();}Overridepublic OrderList read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {logger.info(start read);OrderList record null;FieldSet line;ListOrder bodyList new ArrayList();while ((line delegate.read()) ! null) {String prefix line.readString(lineType);if (prefix.equals(H)) {record new OrderList();record.setName(line.readString(name));} else if (prefix.equals(L)) {Order order new Order();order.setLookup(line.readString(lookupKey));order.setLookupType(line.readString(keyType));bodyList.add(order);} else if (prefix.equals(F)) {if (record ! null) {if (line.readLong(count) ! bodyList.size()) {throw new ValidationException(Size does not match file count);}record.setOrders(bodyList);}break;}}logger.info(end read);return record;}private LineTokenizer buildBodyTokenizer() {FixedLengthTokenizer tokenizer new FixedLengthTokenizer();tokenizer.setColumns(new Range[]{ //new Range(1, 1), // lineTypenew Range(2, 2), // keyTypenew Range(3, 12) // lookup key});tokenizer.setNames(new String[]{ //lineType,keyType,lookupKey}); //tokenizer.setStrict(false);return tokenizer;}private LineTokenizer buildFooterTokenizer() {FixedLengthTokenizer tokenizer new FixedLengthTokenizer();tokenizer.setColumns(new Range[]{ //new Range(1, 1), // lineTypenew Range(2, 9) // count});tokenizer.setNames(new String[]{ //lineType,count}); //tokenizer.setStrict(false);return tokenizer;}private LineTokenizer buildHeaderTokenizer() {FixedLengthTokenizer tokenizer new FixedLengthTokenizer();tokenizer.setColumns(new Range[]{ //new Range(1, 1), // lineTypenew Range(2, 20), // name});tokenizer.setNames(new String[]{ //lineType,name}); //tokenizer.setStrict(false);return tokenizer;}} 此Reader实现ItemReader接口。 这为我们提供了一个由作业调用的read方法直到它返回null或发生错误时引发异常。 在我们的Reader中我们声明另一个Reader这是一个FlatFileItemReader。 这是我们的代表即为我们执行功能所选择的对象。 我们的read方法将以委托的读取为循环直到读取Footer。 然后它将整个记录捆绑到其包装器中并将其传递给处理器。 必须先打开委托阅读器然后才完成使用。 我必须在此处将它初始化并在此处进行设置因此在BeforeStep中在此处打开它。 我也可以将包含的阅读器实现为ItemStreamReader并使用Interface给我们的openclose以及update方法。 将简化的对象返回给Processor可以使我们大大简化Processor Override public ListBookList process(OrderList orderList) throws Exception {logger.info(process);ListBookList books new ArrayList();for (Order order : orderList.getOrders()) {BookList bl doProcessing(orderList.getName(), order);books.add(bl);}return books; } doProcessing方法可以包含此Job的业务逻辑并且需要创建一个有效的BookList对象。 由于我们正在处理多个记录因此该过程将创建多个可返回的BookList并将其传递给Writer。 我将留给您填写该对象的其余部分但这只是一个标准的ItemProcessor。 处理器不必在调用之间保留记录信息因此程序员可以专注于业务逻辑。 我们的编写器实现ItemStreamWriter。 这为我们提供了比ItemWriter更多的方法但是如果您喜欢使用ItemWriter类似于我们阅读器的方法请确保在BeforeStep中打开Delegate在AfterStep中将其关闭。 在Writer中使用委托使我们能够遍历Writer从Reader和Process收到的List。 public class ListWriter implements ItemStreamWriterListBookList {private static final Logger logger LoggerFactory.getLogger(ListWriter.class);private FlatFileItemWriterBookList delegate;BeforeSteppublic void beforeStep(StepExecution stepExecution) {delegate new FlatFileItemWriter();delegate.setResource(new FileSystemResource(booklist.csv));delegate.setShouldDeleteIfEmpty(true);delegate.setAppendAllowed(true);DelimitedLineAggregatorBookList dla new DelimitedLineAggregator();dla.setDelimiter(,);BeanWrapperFieldExtractorBookList fieldExtractor new BeanWrapperFieldExtractor();fieldExtractor.setNames(new String[]{bookName, author});dla.setFieldExtractor(fieldExtractor);delegate.setLineAggregator(dla);}Overridepublic void close() throws ItemStreamException {delegate.close();}Overridepublic void open(ExecutionContext ec) throws ItemStreamException {delegate.open(ec);}Overridepublic void update(ExecutionContext ec) throws ItemStreamException {delegate.update(ec);}Overridepublic void write(List? extends ListBookList list) throws Exception {logger.info(write);for (ListBookList bookList : list) {delegate.write(bookList);}}} 这为我们提供了以下输出 Going Grey,Karen Traviss Hard Contact,Karen Traviss 501st,Karen Traviss Storm Front,Jim Butcher Lord of the Fire Lands,Dave Duncan The Reluctant Swordsman,Dave Duncan Wolfbrander Series Unpublished,Rik Scarborough 那么如果稍微复杂一些并且输入文件不包含页脚会发生什么呢 逻辑记录仍然从标题行开始但在下一个标题之前的行结束。 在我们之前的示例中系统必须先读取下一行然后才能知道已完成然后具有一些复杂的逻辑来保留该信息以进行下一个遍历。 HKaren Traviss LAB00KW3VG2G LI0345478274 LI0345511131 HJim Butcher LI0451457811 HDave Duncan LI0380791277 LI0345352912 HRik Scarborough LI9999999999 要求我们当前的作者在下一次电话会议之前先阅读并保留该记录是不必要的复杂操作这会导致维护麻烦。 但是我们可以使用PeekableItemReader简化此过程 class OrderReaderStep2 implements ItemStreamReaderOrderList {private static final String BODY L*;private static final String HEADER H*;private static final Logger logger LoggerFactory.getLogger(OrderReaderStep2.class);private SingleItemPeekableItemReader FieldSet delegate;BeforeSteppublic void beforeStep(StepExecution stepExecution) {FlatFileItemReader fileReader new FlatFileItemReader();fileReader.setResource(new ClassPathResource(orders2.txt));final DefaultLineMapper FieldSet defaultLineMapper new DefaultLineMapper();final PatternMatchingCompositeLineTokenizer orderFileTokenizer new PatternMatchingCompositeLineTokenizer();final MapString, LineTokenizer tokenizers new HashMap();tokenizers.put(HEADER, buildHeaderTokenizer());tokenizers.put(BODY, buildBodyTokenizer());orderFileTokenizer.setTokenizers(tokenizers);defaultLineMapper.setLineTokenizer(orderFileTokenizer);defaultLineMapper.setFieldSetMapper(new PassThroughFieldSetMapper());fileReader.setLineMapper(defaultLineMapper);delegate new SingleItemPeekableItemReader();delegate.setDelegate(fileReader);}Overridepublic void close() throws ItemStreamException {delegate.close();}Overridepublic void open(ExecutionContext ec) throws ItemStreamException {delegate.open(ec);}Overridepublic OrderList read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {logger.info(start read);OrderList record null;FieldSet line;ListOrder bodyList new ArrayList();while ((line delegate.read()) ! null) {String prefix line.readString(lineType);if (prefix.equals(H)) {record new OrderList();record.setName(line.readString(name));} else if (prefix.equals(L)) {Order order new Order();order.setLookup(line.readString(lookupKey));order.setLookupType(line.readString(keyType));bodyList.add(order);}FieldSet nextLine delegate.peek();if (nextLine null || nextLine.readString(lineType).equals(H)) {record.setOrders(bodyList);break;}}logger.info(end read);return record;}Overridepublic void update(ExecutionContext ec) throws ItemStreamException {delegate.update(ec);}private LineTokenizer buildBodyTokenizer() {FixedLengthTokenizer tokenizer new FixedLengthTokenizer();tokenizer.setColumns(new Range[]{ //new Range(1, 1), // lineTypenew Range(2, 2), // keyTypenew Range(3, 12) // lookup key});tokenizer.setNames(new String[]{ //lineType,keyType,lookupKey}); //tokenizer.setStrict(false);return tokenizer;}private LineTokenizer buildHeaderTokenizer() {FixedLengthTokenizer tokenizer new FixedLengthTokenizer();tokenizer.setColumns(new Range[]{ //new Range(1, 1), // lineTypenew Range(2, 20), // name});tokenizer.setNames(new String[]{ //lineType,name}); //tokenizer.setStrict(false);return tokenizer;}} 这次我确实将包含的Reader实现为ItemStreamReader以向您展示它们之间的区别。 可以像上一个一样将其实现为ItemReader。 PeekableItemReader允许我们向前查看下一条记录以查看是否到达记录的末尾或文件的末尾。 然后可以使用相同的处理器和写入器来产生与以前相同的输出。 最后的想法 乍一看委托模式似乎不像使用单个读取器或写入器那么简单。 这两个对象都有更多的配置。 但是我最喜欢的释义是说要尽可能简单而且再简单不过。 稍微复杂一点的Reader和Writer将使您的Processor更加简单并有助于后续维护。 代码很好我的朋友。 翻译自: https://www.javacodegeeks.com/2016/03/introducing-delegate-pattern.html
http://www.zqtcl.cn/news/37103/

相关文章:

  • 网站建设的公司系统规划方案济南最新防疫政策调整
  • 陕西建设部网站厦门网站建设培训费用
  • 用scala做的网站阿里云服务器 多个网站
  • 支付宝网站开发文档dz论坛怎么做视频网站吗
  • 徐州网站建设公司哪个好电商网站合作
  • 免费微网站_自助建站十大app排行榜
  • 港巢网站建设网络规划设计师希赛
  • 商田科技网站河源网站制作
  • 昆明城乡建设网站php做的网站处理速度怎么样
  • 西宁网站建设最好的公司地方门户网站赚钱吗
  • 上海行业门户网站建设工具wordpress去掉google字体
  • php是网站开发语言吗网站出现乱码的原因
  • 深圳手机网站建设价格乐陵seo网站优化
  • 珍岛网站模板网站建设维护学习
  • 基于php网站建设设计域名怎么起
  • 石景山富阳网站建设创业大赛网站建设
  • 汕头网站建设推广价格seo软件资源
  • 08 iis创建网站wordpress 批量导入用户名
  • 做新得网站可以换到原来得域名嘛南阳做做网站
  • 免费甜点网站模板下载财务管理做的好的门户网站
  • 如何保证网站安全小说推广关键词怎么弄
  • 网站推广seo是什么东营+网站建设
  • 官方网站搭建采集网站图片
  • 重庆免费建站公司地址重庆在线课程平台
  • vps 网站发布黄骅贴吧二手房
  • 搜狐视频网站联盟怎么做做酒店经理的一些网站
  • 部署iis网站去黄山旅游的攻略
  • 赛门博网站建设培训心得体会1000字通用
  • 网站开发vsc网络推广的概念
  • 深圳营销型网站建设电话网络平台建站