精华内容
下载资源
问答
  • 2021-12-11 11:29:37

    web服务器:

    负责处理http请求,响应静态文件,常见的有Apache,Nginx以及微软的IIS.

    应用服务器:

    负责处理逻辑的服务器。比如php、python的代码,是不能直接通过nginx这种web服务器来处理的,只能通过应用服务器来处理,常见的应用服务器有uwsgi、tomcat等。

    web应用框架:

    一般使用某种语言,封装了常用的web功能的框架就是web应用框架,flask、Django以及Java中的SSH(Structs2+Spring3+Hibernate3)框架都是web应用框架。

    更多相关内容
  • 《 关于“第十三届蓝桥杯全国软件和信息技术专业人才大赛个人赛 (软件类)Web 应用开发组竞赛”》 赛事必知: 有关于组别: 具有正式学籍的在校全日制研究生、本科、高职高专及中职中专学生(以报名时状态为准)...

     👻偷偷告诉读者朋友们一个秘密:蓝桥杯大赛最新一届赛事新增了web应用开发科目,搞前端的小伙伴们快点来参与起来鸭!👻

     😜为了让想要报名参加本赛项的小伙伴们充分了解本赛事,在赛前做好充足的准备,我特意去看了官方web应用开发备赛讲座的直播回放,整理了一些干货。本篇博文就这样诞生了!😜


    主标题:
    《 关于“第十三届蓝桥杯全国软件和信息技术专业人才大赛个人赛 (软件类)Web 应用开发组竞赛”》

    赛事必知:

    1. 有关于组别:
      具有正式学籍的在校全日制研究生、本科、高职高专及中职中专学生(以报名时状态为准),以个人为单位进行比赛。该专业方向设大学组和职业院校组。 研究生和本科生只能报大学组。 其它高职高专、中职中专院校可自行选择报任意组别。

    简单谈一谈这个组别:
    可能有人会疑惑为啥分大学组和职业院校组。这俩有啥区别?
    其实也很容易理解——组别分为大学组和职业院校组是为了区分题型难易(下面我会细细讲一下这两个组别分别考察的题型范围),如果你备战很充分,想要挑战下自己,那么我建议你选大学组(要勇于挑战自我~)

    1. 竞赛赛程:
      预赛(省赛)时长:4 小时。
      决赛时长:4 小时。
      详细赛程安排以组委会公布信息为准。

    4个小时,时间完全充足,一定不要急:认真审题,认真审题,认真审题(重要的事情说三遍!)

    1. 竞赛形式:
      个人赛,一人一机,全程机考。 选手机器通过局域网连接到各个赛场的竞赛服务器。 选手答题过程中无法访问互联网,也不允许使用本机以外的资源(如 USB 连接)。 竞赛系统以“服务器-浏览器”方式发放试题、回收选手答案。

    这条规则就告诉我们平时学习的时候一定要熟能生巧,熟记于心。比赛的时候可不存在什么忘了查下文档之类的哦!
    备赛一定要充分哦!!!

    1. 参赛选手机器环境:
      选手机器配置:
      X86 兼容机器,内存不小于 4G,硬盘不小于 60G
      操作系统:Windows7、Windows8 或 Windows10
      显示器:分辨率 1024*768 像素或以上
      Web 前端开发环境:
      1. Google Chrome 浏览器(正式版,v1.36 以上版本),
        官方下载: https://www.google.cn/chrome
      2. Visual Studio Code 代码编辑器(正式版,v80 以上版本),
        官方下载: https://code.visualstudio.com
      3. 任意支持压缩 .zip 压缩包的压缩软件。
        推荐使用免费开源软件: https://www.7-zip.org

    具体比赛时候用自己电脑还是比赛地点提供的统一电脑以组委会公布信息为准~
    如果平时不用vs code的话,可以花点时间配置一个用哦(许多公司也都是使用的vs code哦!)~

    1. 试题形式:
      试题均为场景实战题(编程实操),选手根据需求说明,通过完善程序代码、配置和管 理项目的形式排除程序错误或完成预期需求。

      场景实战题:
      场景实战题目均包含完整的题面 PDF 文档(Google Chrome 支持浏览 PDF)和基础源代 码压缩包。题面文档中会详细说明题目的背景、需求、目标。选手需认真读题,结合题目给 出的基础源代码,通过修改、新增代码来实现题目给出的最终目标。 部分题目可能包含前序准备步骤。例如解压缩相应的资源文件,在浏览器中预览网页效 果等。大部分情况下,我们默认选手已经掌握了前端开发过程中可能涉及的基础知识和方法, 不会给予单独的提示。同时,题目不会给予 IDE 开发工具的使用方法提示。 特别地,基础源代码在无明确说明的情况下,请勿随意修改文件名称、文件夹名称、文 件存放结构。务必严格规范根据题意操作,否则可能会影响最终阅卷的准确性

    所以,一定要认真查看场景实战题提供的完整的题面PDF文档!!!一定要认真查看。
    有同学做模拟题,题拿到手就开始敲代码,闷着头就敲CSS代码,敲了将近一个小时终于敲完了,结果发现别人一两分钟就做完了!
    为啥呢?那位同学题往下一滑,发现提供的有CSS文件,只需要修改即可,这不难受了!

    1. 答案提交:
      选手只有在比赛时间内提交的答案内容是可以用来评测的,比赛之后的任何提交均无 效。选手应使用考试指定的网页来提交代码,任何其他方式的提交(如邮件、U 盘)都不 作为评测依据。
      选手可在比赛中的任何时间查看自己之前提交的代码,也可以重新提交任何题目的答 案,对于每个试题,仅有最后的一次提交被保存并作为评测的依据。
      在比赛中,评测结果不会显示给选手,选手应当在没有反馈的情况下自行调试。
      最后,由于题目考察内容的差异,每道题目最终需提交的资料和步骤均会在题面 PDF 文档中详细说明,请严格按照相应要求进行操作

    2. 评分:
      全部题目将使用前端自动化测试技术完成机器自动评分。
      对于功能实现类型的题目,我们会基于单独的测评数据来测试功能实现的完整性。
      对于页面布局类型的题目,我们会基于最终效果和目标效果的相似度进行评分。

    所以,这里又要强调一下,小伙伴们一定要认真审题,审题,再审题。
    如果没让你更改文件名就一定不要更改;如果是让你在现有的文件内进行修改,就一定不要新建文件答题…

    试题考查范围:

    试题考查选手解决实际问题的能力,侧重考查选手阅读、分析、理解需求,实现功能性 需求(静态、动态页面效果,API 开发与调用),实现非功能性需求(如兼容性、安全性、 性能),产品交付(打包、部署)等方面的能力。知识范围包括但不限于:
    在这里插入图片描述

    仔细看看,你可能会说这大学组就比职业院校组多了个Node.js和webpack两个技术栈。
    表面看来,确实是这样,但是真正赛题还会就出题深度及广度进行设计两个组别的题目哦~

    下面列出的是此赛事考察知识范围的具体各个知识点,小伙伴们可以对着查漏补缺一下,看看自己缺乏什么技术栈,或者什么技术栈不是很熟,偷偷努力一把,攻破它们!

    在这里插入图片描述
    在这里插入图片描述

    样题实战分析:

    样题 A:网站修复

    背景介绍:

    HTML5 与 CSS3 已经成为前端开发工程师的必备技能。本题提供了使用 HTML5 + CSS3 实现的 单页面网站,因存在页面布局问题需要修复。

    准备步骤:

    开始答题前,首先需要解压题目包含的压缩包 exam01.zip,并将其中的 index.html 文件拖动 到 Google Chrome 浏览器中打开网站主页,效果如下(不包括黑框,示例页面显示宽度为 1920 px):
    在这里插入图片描述

    题目要求:

    如上所示的 index.html 布局不符合最终要求。请检查 exam01 下的各个文件,找到并修复项 目存在的 Bug,使宣传页面正常显示,效果如下(不包括黑色边框,页面显示宽度 1920 px):
    在这里插入图片描述

    答案提交:

    本题请勿新增、修改基础源代码中的文件名称、文件夹名称、文件存放层级结构。最后将答 题后的 exam01 文件夹压缩成 .zip 压缩包(请务必使用.zip 格式,其他压缩包格式无法正常 判卷)后提交。

    题目分析:

    • 其实,如果你是个老练的前端程序猿,一眼就能看出问题所在,题目中页面展示效果很明显是缺少了样式的渲染,所以这道题就属于那种一两分钟就可以做完的!

    • 但是,后面据不少做了模拟题(里面也有类似的题哦~)的同学反馈说:他们写这种题写了将近一个小时才完工!为什么呢?

    • 这就是我上面再三强调的一定要注意审题(如下图所标~),题目中很清楚的说了是“找到并修复项目存在的bug”,没有让你自己写个CSS!!!
      在这里插入图片描述

    题目解答:

    • 本题文档结构如下:
      在这里插入图片描述

    • 但是,定位到index.html里css文件的引入,会发现,存在的样式表名为“style.css”,而这引入的是css文件夹下的"index.css"文件,这就是为什么题目里的页面效果明显没有样式渲染。
      在这里插入图片描述

    • 所以,本题很直接,更改正确的css文件路径即可!

    在这里插入图片描述

    样卷线上模拟:

    样卷线上模拟请于 10 月 20 日后登录蓝桥云课首页 (www.lanqiao.cn)查看,访问线上模拟地址:https://www.lanqiao.cn/contests/cup-s1

    1.访问线上模拟地址:(总共有十道模拟题哦~)
    在这里插入图片描述
    2. 以第一道模拟题为例——点击“开始挑战”:
    在这里插入图片描述
    3. 然后按照页面左侧的准备步骤一步步做即可查看题目实现的效果;
    4. 最后,按照左侧的考试需求进行答题即可~

    本人感受:

    蓝桥杯官方也是第一次增加了web科目,可能会有搞前端的小伙伴怕准备不足,或者说是没有历年真题壮胆而犹豫该不该参赛。上面给了一道样题实战分析,大家看完后是不是感觉信心倍增,你们要相信自己,认真备赛,把上面所涉及技术栈琢磨透&&把官方提供的十道线上模拟题练练!得奖机会还是很大的~

    本赛事官方报名地址:https://dasai.lanqiao.cn/

    想要报名的童鞋可以跟着我的前端专栏《前端系列教程》学习(专栏持续更新,争取有朝一日给上述考察知识范围涉及的技术栈都讲一遍!),各位小伙伴们,冲啊!

    专栏简介:

    本专栏面向广大非前端程序猿,为的是大家快速入门并掌握前端基础知识【HTML,JavaScript,CSS】,同时穿插有前端小设计习题,巩固学习。 (原价99.9 限时7天19.9🔥火爆订阅中!)

        专栏文章介绍:《前端系列教程》目录
        专栏地址:  《前端系列教程》

    愿意加入蓝桥杯冲奖的人,评论区评论:我要参加蓝桥杯!寒寒带我!
    左侧扫码联系我,人多我就创建一个蓝桥杯web应用开发科目交流群——为各位备赛的小伙伴们答疑解惑。

    展开全文
  • 基于Spring springMVC mybatis三种开源框架,构建java web应用
  • Web应用程序开发课程总结

    千次阅读 2020-06-06 20:36:24
    Web应用程序的定义: 顾名思义,Web应用是运行在Web上的应用程序。但是反过来,运行在Web上的应用程序都是Web应用吗?答案是否定的。这里所说的Web应用是指运行在网络上,以浏览器作为通用客户端的应用程序,在许多...

    Web应用程序的定义:

    顾名思义,Web应用是运行在Web上的应用程序。但是反过来,运行在Web上的应用程序都是Web应用吗?答案是否定的。这里所说的Web应用是指运行在网络上,以浏览器作为通用客户端的应用程序,在许多地方又被称为B/S(Browser/Server,浏览器-服务器)模式的应用。例如我们身边的教务系统,选课系统,都是基于浏览器进行访问的Web应用程序。

    Web应用程序的开发方法及应用范围:

    Java

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点 。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。

    Python

    Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。目前Python典型的Web开发框架有Django、Flask、Tornado等。

    ASP

    ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境,可用来创建动态交互式网页并建立强大的web应用程序。当服务器收到对ASP文件的请求时,它会处理包含在用于构建发送给浏览器的HTML(Hyper Text Markup Language,超文本置标语言)网页文件中的服务器端脚本代码。除服务器端脚本代码外,ASP文件也可以包含文本、HTML(包括相关的客户端脚本)和com组件调用。ASP简单、易于维护 , 是小型页面应用程序的选择,在使用DCOM (Distributed Component Object Model)和 MTS(Microsoft Transaction Server)的情况下,ASP甚至可以实现中等规模的企业应用程序。

    JSP

    我们这学期采用的就是JSP做前端模板,Java作为后端的开发形式。JSP(全称Java Server Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。

    PHP

    PHP原始为Personal Home Page的缩写,已经正式更名为 “PHP: Hypertext Preprocessor”,即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法,利于学习,使用广泛,主要适用于Web开发领域。PHP 语言作为当今最热门的网站程序开发语言,它具有成本低、速度快、可移植性好、 内置丰富的函数库等优点,因此被越来越多的企业应用于网站开发中。但随着互联网的不断更新换代,PHP语言也出现了不少问题。 根据动态网站要求,PHP语言作为一种语言程序,其专用性逐渐在应用过程中显现,其技术水平的优劣与否将直接影响网站的运行效率。其特点是具有公开的源代码, 在程序设计上与通用型语言,如C语言相似性较高,因此在操作过程中简单易懂,可操作性强。同时,PHP语言具有较高的数据传送处理水平和输出水平,可以广泛应用在Windows系统及各类Web服务器中。如果数据量较大,PHP语言还可以拓宽链接面,与各种数据库相连,缓解数据存储、检索及维护压力。随着技术的发展,PHP 语言搜索引擎还可以量体裁衣,实行个性化服务,如根据客户的喜好进行分类收集储存,极大提高了数据运行效率。

    学习心得

    这学期,基于一个电商网站的web应用程序。我开始了我的web应用程序开发之路,接触到了很多的新知识,当然也有对很多旧知识的复用。比如Java就是,新一次的学习,不光学习到了新的知识,对Java的理解仿佛也更加深刻了,这可能就是老师督促我们反复学习的原因所在。前端采用JSP模板,利用JSP这门脚本语言,动态的内嵌Java代码,形成了前端页面。当然,也要对CSS,HTML的运用得心应手。否则是出不来漂亮的页面的。还有Servlet,过滤器,监听,EL表达式等等,需要有自己的理解才能用的得心应手。当然,合理的开发模式也是必不可少的,我采用的就是MVC模式。将后端分成三层,合理分工,各司其职。做到程序的低耦合性,提高我们代码的健壮性。下面写一下自己的一点知识理解。

    MVC开发模式

    Java的开发模式也是历经周折,几次转变,才有了现在的三层架构。在最开始的时候,单纯的只有一个Servlet模块来作为衔接数据库和前端的程序。后来代码逻辑的复杂,使得有了JavaEE Model1版本,分成了JSP(C和V)和JavaBean(M),由JavaBean来和数据库交互再交给JSP。再后来不得不将JSP分开,分成了Servlet(C)、JSP(V)和JavaBean(M)。这样就有了最开始的MVC模型。M(Model,模型层):负责数据的操作,数据库的访问,数据的封装。也就是我们的JavaBean。V(视图层,View):负责生成视图的内容,和用户进行交互。也就是我们的JSP。C(Controller,控制器层):负责调度M和V,进行程序的控制。也即是我们的Servlet。再后来对数据封装的业务逻辑不断复杂,为了降低耦合度,我们又将JavaBean进行了拆分,分成了DAO持久层(负责进行数据库访问,也称Repository)和Service(负责数据的封装)两层,此时的JavaBean只是作为实体类来封装对象,在层与层之间产生作用。也就是我们现在使用的流水线式开发模式,各司其职,互不干扰。画了一幅图可以更好地加深理解。20200504181813

    Servlet

    浏览器内核中有通信模块,来和我们的服务器中的通信模块首先建立连接。当用户产生操作后,通信模块生成请求数据包,由浏览器发送给服务器,服务器收到后解析数据包,写入request,创建Servlet,由Servlet来读取request。经过Servlet的逻辑处理后,写入response,交由服务器通信模块来读取response,读取成功后会销毁request对象和response对象,并且生成响应数据包。发送给浏览器,浏览器解析响应数据包后,展示给用户。这就是完成的从用户产生操作到和用户产生交互的完整过程。

    其中Servlet的内部及其发展是这样的:

    • 为了保证服务器模块和开发者提供的代码判断能够正确的配合到一起,Sun公司设计了Servlet接口。
    • 其中init(ServletConfig)方法:当一个Servlet对象被创建后,我们的服务器,会马上调用该对象的init方法,实现初始化的逻辑。我们如果希望哪些逻辑希望在Servlet对象在被创建后立即执行,可以放入init方法。
    • destroy()方法:当服务器准备销毁一个Servlet对象之前,会主动调用该对象的destroy方法。我们如果希望哪些逻辑在Servlet对象销毁之前调用,可以放入destroy方法内。
    • service()方法:当服务器收到一份Servlet来响应用户的请求时,会调用该Servlet的service方法。处理用户的请求的逻辑应该放入service方法中。
    • init方法,destroy方法,service方法在一个Servlet的生命周期中分别会被调用1次,1次,多次。
    • 还有getServletInfo()方法和ServletConfig()方法目前的开发中一般不会应用到。
    • 并且,在实际开发中。我们一般仅仅只需要写service方法中的逻辑。
    • 因此,Sun公司对此重新定义了GenericServlet抽象类,该类实现了Servlet接口,和其他四个方法的空实现。我们现在的实际开发中,只需要继承GenericServlet抽象类即可。
    • 但是,浏览器访问服务器存在HTTP协议和HTTPS协议,GenericServlet是面向两种协议的协议,没有对HTTP协议的特殊支持。
    • 所以,Sun公司又开发了面向HTTP协议的HTTPServlet,继承了GenericServlet,并提供了很多处理HTTP协议请求的
    展开全文
  • 如何使用Flutter开发web应用

    万次阅读 2019-06-21 22:48:53
    端的流程,至于实际的应用场景大家可以根据自己的需要自行开发。 开发环境配置 Flutter 1.5 及更高的版本才支持 Web 端部署,这主要指的是将 Dart 编译为 JavaScript ,所以,必须要确保我们本地的 Flutter SDK ...

    前言:Flutter系列的文章我应该会持续更新,从User Interface(UI)到数据相关(文件、数据库、网络)再到Flutter进阶(平台特定代码编写、测试、插件开发等),欢迎感兴趣的读者持续关注(可以扫描左边栏二维码或者搜索”IT工匠“关注微信公众号/头条号(微信公众号和头条号同名),会同步推送)。

    众所周知Google对于Flutter的期望是全平台统一UI开发,号称要做一套**“一份代码、全平台部署”**的UI框架,这一点在移动端已经很成熟了,国内有很多成功的案例,典型的像阿里的闲鱼客户端,但是Flutter所声称的桌面端和Web端的相关案例还很少,之前我写过一篇文章介绍如何将Flutter代码部署成为桌面端程序,那么本文就该介绍如何将Flutter部署为Web应用了。

    本文将会以一个实例来带大家一步一步探寻如何将Flutter应用程序部署到web端,我们先来看一下最终的效果:

    image-20190621195055828

    可以看到,就是一个简单的登录界面,没有太复杂的逻辑,旨在帮助大家走通Flutter部署到Web端的流程,至于实际的应用场景大家可以根据自己的需要自行开发。

    开发环境配置

    Flutter 1.5及更高的版本才支持Web端部署,这主要指的是将Dart编译为JavaScript,所以,必须要确保我们本地的Flutter SDK的版本在v1.5.4以上,建议直接使用命令flutter upgrade更新到最新版即可。

    安装flutter_web编译工具

    要想将Flutter代码编译为Web端可部署的应用程序,必须安装flutter_web,这是一个Flutter官方为我们开发并维护的编译工具,直接使用以下命令安装即可:

    flutter pub global activate webdev
    

    安装完成后,需要配置环境变量,直接将$HOME/.pub-cache/bin加入到你的环境变量中即可,由于电脑不同的操作系统配置环境变量的方式不同,这里就不一一展开赘述了,以mac操作系统为例:

    cd
    vim .bash_profile
    

    然后添加一行:

     export PATH="$PATH":"$HOME/Flutter/flutter/.pub-cache/bin"
    

    退出并保存,使用如下命令使其生效:

    source .bash_profile
    

    至此,我们的开发环境就搭建好了,可以看出,只要我们本地的Flutter环境配置的没有问题,配置Flutter for web只是多装了一个flutter_web编译工具而已,非常简单。

    创建项目

    区别于普通的Flutter项目,由于Flutterweb的支持目前还没有完全完成,相当于是一个供大家尝鲜的作品,所以创建Flutter for web项目和普通Flutter项目不一样,这里建议大家使用idea,我这里也以idea为例进行说明:

    创建Dart项目,而不是Flutter项目

    直接在Idea中新建项目,如下图所示:

    image-20190621200652154

    注意三点:

    1. 选择Dart项目,而不是新建Flutter项目
    2. 正确设置自己dart sdk的位置
    3. 选择Generate sample content中的Flutter Web App选项

    创建完成后我们的项目就默认支持部署到Web了,在Idea中应该可以直接点击运行按钮进行运行,或者可以在Idea的终端中输入:

    webdev serve
    

    进行运行,初次编译可能会下一些本项目所依赖的包,需要一分多钟,后面编译会快很多,编译完成后会弹出一个浏览器的窗口(注意,这里建议使用Chrome浏览器,其他浏览器笔者没有测试过,按照官方的说法,目前支持最好的应该是Chrome浏览器)如下图:

    image-20190621202310684

    我们来看看项目结构:

    image-20190621202725911

    可以看到,大体的项目结构了普通的Flutter项目差不多,知识多了一个web文件夹,下面是一些和web相关的文件和资源,后面我会具体讲其用处。

    编写代码

    创建好项目之后,我们就可以着手代码的编写了,这里不再详细叙述代码怎么写,和普通Flutter编写代码的规则是一模一样的,这里我在lib文件夹下新建了一个pages文件夹,然后新建了login_page.dart文件,编写登录界面的代码,完成后代码如下:

    import 'package:flutter_web/material.dart';
    
    class LoginPage extends StatefulWidget {
      @override
      State<StatefulWidget> createState() => new _LoginState();
    }
    
    class _LoginState extends State<LoginPage> {
      static final GlobalKey<ScaffoldState> _scaffoldKey =
          new GlobalKey<ScaffoldState>();
    
      final TextEditingController _phoneController = new TextEditingController();
      final TextEditingController _passwordController = new TextEditingController();
    
      bool _correctPhone = true;
      bool _correctPassword = true;
    
      bool showProgress = false;
    
      void _checkInput() {
        if (_phoneController.text.isNotEmpty) {
          _correctPhone = true;
        } else {
          _correctPhone = false;
        }
        if (_passwordController.text.isNotEmpty) {
          _correctPassword = true;
        } else {
          _correctPassword = false;
        }
        setState(() {});
      }
    
      _handleSubmitted(int flag) async {
        /**
         * flag=0:管理员登录
         * flag=1:用户登录
         */
        _checkInput();
        if (!_correctPassword || !_correctPhone) {
          return;
        }
      }
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
            key: _scaffoldKey,
            resizeToAvoidBottomPadding: false,
            body: new Stack(children: <Widget>[
              new Container(
                decoration: new BoxDecoration(
                    image: new DecorationImage(
                        image: new AssetImage('images/bg.jpeg'),
                        fit: BoxFit.cover)),
              ),
              new GestureDetector(
                onTap: () {
                  FocusScope.of(context).requestFocus(new FocusNode());
                },
              ),
              _buildLogInWidgets(),
            ]));
      }
    
      _buildLogInWidgets() {
        Color mainColor = Colors.black;
        return new Column(
          mainAxisAlignment: MainAxisAlignment.spaceEvenly, //垂直方向对其方式
          crossAxisAlignment: CrossAxisAlignment.start, //水平方向对其方式
    
          children: <Widget>[
            Center(
              child: new Container(
                child: Center(
                  child: new CircleAvatar(
                      backgroundImage: AssetImage("images/iron_man_icon.png")),
                ),
              ),
            ),
            new Center(
              child: new Container(
                width: MediaQuery.of(context).size.width * 0.5,
                child: new Column(
                    mainAxisAlignment: MainAxisAlignment.center,
                    crossAxisAlignment: CrossAxisAlignment.center,
                    children: <Widget>[
                      new Container(
                        padding: const EdgeInsets.only(top: 32.0),
                        child: new TextField(
                          style: TextStyle(color: Colors.black),
                          cursorColor: mainColor,
                          controller: _phoneController,
                          keyboardType: TextInputType.text,
                          decoration: new InputDecoration(
                            hintText: '用户名',
                            hintStyle: TextStyle(color: mainColor),
                            errorText: _correctPhone ? null : '用户名不可为空!',
                            errorStyle: TextStyle(color: Colors.teal),
                            icon: new Icon(Icons.people, color: mainColor),
                            focusedBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                            enabledBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                            errorBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                          ),
                          onSubmitted: (value) {
                            _checkInput();
                          },
                        ),
                      ),
                      new Container(
                        padding: const EdgeInsets.only(top: 32.0),
                        child: new TextField(
                          style: TextStyle(color: Colors.black),
                          cursorColor: mainColor,
                          controller: _passwordController,
                          obscureText: true,
                          keyboardType: TextInputType.text,
                          decoration: new InputDecoration(
                            hintText: '密码',
                            hintStyle: TextStyle(color: mainColor),
                            errorText: _correctPassword ? null : '密码不可为空!',
                            errorStyle: TextStyle(color: Colors.teal),
                            icon: new Icon(Icons.lock_outline, color: mainColor),
                            focusedBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                            enabledBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                            errorBorder: UnderlineInputBorder(
                                borderSide: BorderSide(color: mainColor)),
                          ),
                          onSubmitted: (value) {
                            _checkInput();
                          },
                        ),
                      )
                    ]),
              ),
            ),
            new Center(
                child: new Column(
              children: <Widget>[
                new Container(
                  width: MediaQuery.of(context).size.width * 0.2,
                  child: new Material(
                    child: new FlatButton(
                      child: new Container(
                        child: new Center(
                            child: new Text(
                          "登录",
                          textScaleFactor: 1.5,
                          style: new TextStyle(
                              color: Colors.white, fontFamily: "Roboto"),
                        )),
                      ),
                      onPressed: () {
                        _handleSubmitted(0);
                      },
                    ),
                    color: Colors.teal,
                    borderRadius: BorderRadius.circular(10.0),
                    elevation: 5.0,
                  ),
                ),
                new Center(
                    child: Container(
                  margin: EdgeInsets.only(top: 20),
                  child: new FlatButton(
                    child: new Text("没有帐户? 注册",
                        style: new TextStyle(color: Colors.teal)),
                  ),
                )),
              ],
            )),
          ],
        );
      }
    }
    
    

    可以看到,代码和普通Flutter代码是一样的,只是需要注意以下几点:

    包的使用

    细心的同学可能会发现,我们这里导入的包是:

    import 'package:flutter_web/material.dart';
    

    而普通Flutter项目导入的是:

    import 'package:flutter/material.dart';
    

    原则就是原来的 package:flutter 改为 package:flutter_web ,原来的 dart:ui 改为 package:flutter_web_ui/ui.dart,当然,这些你只需要知道就好了,实际生产的时候直接快捷键按下,编辑器会自动帮我们导入正确的包。

    资源的使用

    我们之前使用资源文件(比如图片)的方式是在根目录下新建一个资源文件夹,然后将资源文件放在资源文件夹下,然后在pubspec.yaml文件中进行文件路径的声明,然后就可以使用了,在Flutter for web中,我们需要将原来的资源文件夹从之前的项目根目录迁移到web文件夹下,就像这样:

    image-20190621203620933

    然后就可以正常使用了,这也是迄今为止我发现的Flutter for web和普通Flutter项目的不同之处了。

    编写完布局文件后我们将main.dart稍作修改,引入我们的LoginPage

    import 'package:flutter_web/material.dart';
    import 'package:flutter_web_demo/pages/login_page.dart';
    
    void main() => runApp(MyApp());
    
    class MyApp extends StatelessWidget {
      // This widget is the root of your application.
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Demo',
          theme: ThemeData(
            primarySwatch: Colors.blue,
          ),
          home: MyHomePage(title: 'Flutter Demo Home Page22'),
        );
      }
    }
    
    class MyHomePage extends StatelessWidget {
      MyHomePage({Key key, this.title}) : super(key: key);
    
      final String title;
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
            body: LoginPage());
      }
    }
    
    

    然后我们就可以运行起来看效果了:

    image-20190621195055828

    和开篇的效果图一样,不再赘述。

    总结

    本文我们通过一个简单的实例带大家走了一遍Flutterweb端部署的流程,可以看到,目前FlutterWeb上的部署已经没有任何压力了,只是由于生态还不完整,很多库和包还不能用,所以目前还无法投入商用软件中,希望Flutter可以发展的越来越完善。同时,结合笔者个人的开发经验,建议大家开发Flutter项目时一定不要怕麻烦,多用像mvp这类的项目结构,这样可以大大提高开发效率。

    关于Flutter for web的更多资料,可以参考Flutter官方的仓库:https://github.com/flutter/flutter_web

    展开全文
  • Web 应用程序测试工具

    千次阅读 2022-01-27 22:09:00
    在任何情况下,规划一个非常适合大众的 Web 应用程序,并且没有限制和破坏计算机的组织,这不是儿戏,需要一个严格的规划和测试框架。 为什么要测试 Web 应用程序? 测试 Web 应用程序可以识别应用程序中的...
  • Web应用程序  (1)什么是Web应用程序  应用程序有两种模式C/S、B/S。C/S是客户端/服务器端程序,也就是说这类程序一般独立运行。而B/S就是浏览 器端/服务器端应用程序,这类应用程序一般借助浏览器来运行。 ...
  • Web 应用程序防火墙 (WAF)

    千次阅读 2021-12-24 09:47:25
    WAF 或 Web 应用程序防火墙通过过滤和监控Web 应用程序和 Internet 之间的HTTP流量...通过在Web应用程序前面部署WAF,在Web应用程序和互联网之间放置了一个屏蔽。代理服务器通过使用中介来保护客户端机器的身份,而 WAF
  • Web应用的测试内容

    千次阅读 2018-11-01 16:25:49
     链接是Web应用系统的一个主要特征,它是在页面之间切换和指导用户去一些不知道地址的页面的主要手段。链接测试可分为三个方面。首先,测试所有链接是否按指示的那样确实链接到了该链接的页面;其次,测试所链接的...
  • 不过别慌,蓝桥云课快马加鞭地推出了“第十三届蓝桥杯( Web 应用开发)线上模拟赛”,欢迎蓝桥杯参赛选手们踊跃参与进来~当然啦,如果你也对 web 应用开发感兴趣,也可以积极加入挑战~ (PS:第十三届蓝桥杯(Web ...
  • Tomcat 下构建 Web 应用时,常犯的一些通用错误

    万次阅读 多人点赞 2021-01-13 00:05:37
    Tomcat 下构建 Web 应用时,常犯的一些通用错误这些错误可以引发的问题常犯的通用错误 笔者报错时的运行环境: JDK 13.0.2 Maven 3.6.3 Tomcat 9.0.41(Servlet 4.0,JSP 2.3) IntelliJ IDEA 2020.1.2 (Ultimate ...
  • Web应用程序安全性测试指南

    千次阅读 2020-05-19 17:30:00
    由于存储在Web应用程序中的数据量巨大,并且Web上的事务数量增加,因此,对Web应用程序进行适当的安全测试正变得越来越重要。在本文中,我们将详细了解网站安全测试中使用的关键术语及其测试...
  • WEB应用防火墙(WAF启明设备)

    千次阅读 2022-04-04 14:49:40
    a) 桥模式串行部署于Web服务器前端,对应用层攻击行为进行精确识别和实时阻断,主动而有效的保护 Web应用不被攻击及篡改 b) 单臂代理模式部署于Web服务器前端,通过负载或策略路由方式把Web流量导流到WAF,可对应用...
  • Web网站和Web应用程序的区别

    千次阅读 2019-05-22 11:01:42
    Web应用程序 新建后 具体区别 1、添加“一般处理程序” Web网站建立的一般处理程序没有“命名空间” Web应用程序建立的一般处理程序有“命名空间” 为什么网站不需要命名空间?   命名空间就是为了区分类同名的...
  • 主流的Web应用程序平台

    千次阅读 2017-09-06 20:15:40
    主流的Web应用程序平台 动态网站应用程序平台的搭建需要使用Web服务器发布网页,而Web服务器软件又需要安装在操作系统上,并且动态网站都需要使用脚本语言对服务器端进行编程,所以也要在同一个服务器中为Web服务器...
  • 这里可以明显的看出来,之前我们创建的web应用中,resources目录下,都会有 static 和 templates 这两个目录,而这次创建的非web应用中,只有一个springboot的核心配置文件。 2.方式一 在 直接在 main 方法中,...
  • 今天我将使用 Wea​​ther 和 Unsplash API 以及倾斜效果和玻璃形态外观创建凉爽的天气应用程序 ⛅ Weather.io ☔⚓ 第 1 步 - 设置环境并收集所有资源 第 2 步 - 从 index.html 开始 第 3 步 - 设置索引文件的样式...
  • javaweb站点根目录和web应用根目录应用场景

    千次阅读 多人点赞 2019-02-23 18:05:11
    什么叫Web站点的根路径,什么叫Web应用的根路径,在对它们的 "/"应用场景中,到底是代表站点路径还是web应用路径开始路径, 恐怕是很多人在web开发时候经常被搞混的的问题。现在简单解答如下:  问题:...
  • web应用程序的部署

    千次阅读 2017-06-03 14:35:25
    一、配置任意目录下的web应用程序 一个Web容器可以运行多个web应用程序,每个web应用程序都有一个唯一的上下文根。对于Tomcat来说,%CATALINA_HOME(安装路径)%\webapps目录下的每一个子目录都是一个独立的Web应用...
  • Web应用程序测试工具Top20

    千次阅读 2018-07-31 20:18:19
    Web应用程序测试工具可提高可靠性,缩短周转时间并提高ROI。 它们是各种类型的工具,可以协助从需求捕获到测试管理等各种Web测试活动。以下是包含主要功能和下载链接的顶级Web测试工具的精选列表。 下面介绍了一些...
  • 漏洞修复:web应用服务器版本信息泄露方案一:建立错误机制,不要把真实的错误反馈给访问者方案二:Tomcat服务器隐藏版本信息 Web服务器未能正确处理异常请求导致Web服务器版本信息泄露,攻击者收集到服务器信息后...
  • Web应用框架汇总

    万次阅读 2018-03-05 14:23:17
    Web应用框架(Web application framework)是一种开发框架,用来支持动态网站、网络应用程序及网络服务的开发。其类型有基于请求的和基于组件的两种框架,Web应用框架有助于减轻网页开发时共通性活动的工作负荷,...
  • 用AngularJS开发下一代Web应用(中文)高清完整版PDF

    万次下载 热门讨论 2013-11-27 13:26:23
    完整英文版在这里:http://download.csdn.net/detail/zhouruitao/6548305, 此部分是中文版的,免费提供。
  • Web应用技能大赛,大学生看过来!

    千次阅读 2021-04-18 17:18:32
    技能大赛详细介绍,介意收藏观看! 江苏省职业院校技能大赛Web应用软件开发赛项 网址如下:
  • web应用存在的10大安全问题

    千次阅读 2018-11-04 22:00:27
    1 在web应用程序中是什么导致安全性问题呢?一般有以下几个原因 1、复杂应用系统代码量大、开发人员多、难免出现疏忽 2、系统屡次升级、人员频繁变更,导致代码不一致 3、历史遗留系统、试运行系统等多个Web系统...
  • 实验概述 越来越多的公司出于对成本和效率的考量,将业务部署在网站上。主机和网络的漏洞,给...阿里云推出的Web应用防火墙服务,正是为了有效阻止类似的非法访问,降低网络风险。本实验提供了一台开通了DNS云解析功能
  • 常用Web应用服务器

    千次阅读 2017-12-07 11:37:45
    常用Web应用服务器有: nginx、Apache、Tomcat、JBoss、WebSphere、WebLogic、Resin、Glassfish nginx介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由...
  • 一、Web应用程序简介 1、网络应用程序开发体系结构: 1)C/S体系结构:Client/Server的缩写,即客户端/服务器端结构 举例:QQ 英雄联盟 word、excel不是,因为不需要联网、登录 2)B/S体系结构:Browser/Server的...
  • Docker使用Nginx部署web应用

    千次阅读 2020-07-27 13:57:20
    1、运行如下命令获取Nginx镜像: docker pull nginx 2、运行 docker images 查看Nginx镜像是否获取成功,若为如下所示即为获取成功 docker images 3、在终端中运行如下命令,在本机8081端口运行Nginx服务器: ...
  • Web应用体系结构

    千次阅读 2017-06-03 22:33:32
    简单介绍Web应用的体系结构

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,295,105
精华内容 918,042
关键字:

web应用