目录 style="font-size: 14pt;">前言 style="font-size: 14pt;">1 准备干活 style="font-size: 14pt;">2 具体已毕 Struts 优缺点 优点:   落到实处 MVC 形式,结构清晰,使开发者只关注工作逻辑的完成. 2.有加上的 tag 可以用 ,Struts 的标记库(Taglib),如能灵活选择,则能大大进步..." />

Java框架中Struts框架的利害

by admin on 2019年2月14日

style=”font-size: 18pt;”>目录

style=”font-size: 14pt;”>前言

style=”font-size: 14pt;”>1
准备干活

style=”font-size: 14pt;”>2
具体已毕

Struts 优缺点
优点:

 

  1. 落到实处 MVC 形式,结构清晰,使开发者只关注工作逻辑的完成.
    2.有加上的 tag 可以用 ,Struts 的标记库(Taglib),如能灵活选择,则能大大进步开发作用
  2. 页面导航
    使系统的系统尤其清晰。通过三个配备文件,即可把握总体连串各部分之间的关联,
    那对于后期的护卫有着中度的便宜。特别是当另一批开发者接手这么些类型时,那种优势突显
    得更其明显。
  3. 提供 Exception 处理机制 .
  4. 多少库链接池管理
  5. 支持 I18N
    缺点
    一、 转到显示层时,要求配置 forward,假使有十个显示层的 jsp,要求配备拾肆次 struts,
            而且还不包蕴有时候目录、文件变更,须求再一次修改 forward,注意,每一趟修改配置之后,
            须求重新安插整个项目,而 tomcate 那样的服务器,还必须另行启航服务器
    二、 Struts 的 Action 必需是 thread-safe 格局,它可是允许1个实例去处理全数
            的请求。所以 action 用到的富有的财富都必不可少统一联合,那么些就引起了线程安全的题材。
    三、 测试不方便. Struts 的各种 Action 都同 Web 层耦合在联合,这样它的测试依赖于
            Web 容器,单元测试也很难落成。但是有1个 Junit 的恢弘工具 Struts TestCase 可以兑现
            它的单元测试。
    四、 类型的转换. Struts 的 FormBean 把具备的多少都看成 String
    类型,它可以使用工
            具 Commons-Beanutils 举行项目转化。但它的转会都以在 Class 级别,而且转化的项目是
            不可配置的。类型转化时的错误消息再次回到给用户也是老大困难的。
    五、 对 Servlet 的依靠过强. Struts 处理 Action 时必需求借助 ServletRequest

            ServletResponse,全数它摆脱不了 Servlet
    容器。
    六、 前端表明式语言方面.Struts 集成了 JSTL,所以它根本选用 JSTL 的表达式语言来
            获取数据。但是 JSTL 的表明式语言在 Collection
    和索引属性方面处理显得很弱。
    七、 对 Action 执行的支配困难. Struts 成立三个 Action,如若想操纵它的实施顺序将会
            极度艰苦。甚至你要重复去写 Servlet
    来完结您的这几个功能须求。
    八、 对 Action 执行前和后的处理. Struts
    处理 Action 的时候是基于 class 的 hierarchies,
            很难在 action 处理前和后举办操作。
    九、 对事件协理不够.在
    struts 中,实际是二个表单 Form
    对应贰个 Action 类(或
           DispatchAction),换一句话说:在 Struts
    中实际上是一个表单只好对应3个轩然大波, struts 那种
          事件措施叫做 application event, application event 和 component event 相比较是一种粗粒度
          的事件

 


前言

不久前在捣鼓怎么样利用阿里云服务器搭建几个回顾的基于Flask框架的后端接口,刚初叶为了图方便,就径直买了多少个Windows
Server 二〇〇八种类服务器,那也埋下了不小的坑。

 

劳务买下来后,会给你贰个公网IP和内网IP,由于是率先次学习搭建后端接口,对于如何正确行使阿里云服务器,来拍卖好公网IP和内网IP之间的关联埋下了不小的坑,真是对应的一句话:技术的成材往往是一步2个坑。

 

上边简单说一下搭建Flask服务器端遭逢的题材:

先是,Flask自带了三个服务器,直接选择很便利,不过那一个服务器的习性太低,然则对于调试和学习恐怕绰绰有余。刚先导把代码放到阿里云服务器上,并跑通后,测试接口时公网IP不大概访问,那时自个儿认为是Flask自带服务器的题材,即因为Flask自带服务器原因促成力不从心利用公网IP访问。

 

那么,难点出现了,就要寻找消除办法吧,网上查找资料交给参照意见:使用nginx
+gunicorn来配置Flask相关服务,能够防止公网IP无法访问难点。然后,小编就去找资料,安装gunicorn,结果运行测试时一直报错,最后发现gunicorn不援救Windows系统,那也太坑了,早知道我当时买服务器时就不应当图便宜,间接买多个基于Linux的种类了。

 

当今,新的难题又来了,既然不或者采纳nginx
+gunicorn来陈设Flask相关服务,那就要利用其余措施来解决呢,网上资料参照结果:使用tornado。好,那么我又来查看学习tornado布置应用开发文档,依据支付文档陈设完结后,在服务器上跑通后,发现如故无法应用公网IP举行接口访问和测试。

 

到了此处,就让笔者反省,这一个难道真是Flask安顿应用服务器难题呢?后来,就在网上找到了一篇有关阿里云公网IP不大概访问难题的稿子,发现那一个须要协调去阿里云官网上去配置安装。

 

即以上遭逢的难题,压根就不是Flask陈设服务器难点,是上下一心不曾搞掌握阿里云服务器怎样使用的标题……

 

切实安顿安装情势见:阿里云服务器 ECS 访问不了公网 ip 只怕的由来及消除方法

附:

 图片 1

 

 


1 准备工作

导入Flask及连锁扩大:

pip
install flask

pip
install flask-pymongo

pip
install
tornado(此处可选可不选。如若不采用,直接动用Flask自带的服务器安插即可;如若选取,可以使用tornado安插)

 

MongoDB数据库绑定服务ip地址设置(PS:假使不实行下述设置,私行认同ip为本机127.0.0.壹个人置):

开拓CMD,进入MongoDB安装的bin文件夹下,例如作者的安装目录为:C:\Program
Files\MongoDB\Server\3.2\bin

然后在CMD中输入mongod.exe
–bind_ip yourIPadress

中间参数–bind_ip意思:绑定服务IP,若绑定127.0.0.1,则不得不本机访问,不指定暗许本地全数IP。(注意:其中yourIPadress填写自身搭建服务器的内网ip地址)

实际如下图:

 图片 2

图片 3

 

开启Flask自带的服务器,一般拔取app.run(),其中一般采用如下多少个参数:host(指定ip地址,若是不填写,默许为127.0.0.1)、port(指定使用的端口,若是不点名,暗许为五千端口)、debug(开启调试格局,私下认同值为Flase,即不开启调试形式,如要开启则足以安装为True)。

 

一经在服务器上搭建Flask接口相关服务,设置其中host=’0.0.0.0’表示在公网ip下的同三个局域网段全部ip都足以访问那么些服务,假设把host指定为其中二个内网ip地址,则那个局域网下全部用户可以因此拜访那几个指定的ip地址访问Flask服务。

 

前边介绍可以稍微看看,也相当于是询问一下nginx
+gunicorn以及tornado的基本概念。也得以忽略,直接查看2
具体贯彻

 

动用nginx
+gunicorn来配置Flask相关服务,即不应用Flask自带的服务器。

 

看到上面的配备情势,作为初学者,不免会有新的疑问,什么是nginx和gunicorn呢?

自身要好也是新接触的,查看了一下网上资料,大约精通了一晃。

 

什么是nginx呢?

摘要自百度百科(https://baike.baidu.com/item/nginx/3817705?fr=aladdin)的一段解释:Nginx是一款[轻量级](https://baike.baidu.com/item/%E8%BD%BB%E9%87%8F%E7%BA%A7/10002835)的[Web](https://baike.baidu.com/item/Web/150564) 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在三个BSD-like
协议下发行。其特征是占有内存少,并发力量强,事实上nginx的产出能力确实在同品种的网页服务器中显现较好,中国次大陆使用nginx网站用户有:百度、京东、新浪、天涯论坛、腾讯、Tmall等。

 

什么是gunicorn呢?

摘要自网上五回小说(http://www.pythontip.com/blog/post/5155/)一段解释:Gunicorn“绿色独角兽”是一个被广泛使用的高性能的Python
WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork
worker方式,具有应用相当不难,轻量级的能源消耗,以及高品质等本性。

Gunicorn
服务器作为wsgi
app的容器,可以与各类Web框架包容(flask,django等),得益于gevent等技能,使用Gunicorn能够在着力不更改wsgi
app代码的前提下,大幅度升高wsgi app的性质。

 

总的来看上边的化解办法,试着搭建安装,发现gunicorn不协理Windows系统,坑啊,早领会这么就买贰个Linux服务器。

使用gunicorn报错音讯:

Traceback (most recent call last):

  File "d:\program files (x86)\python27\Lib\runpy.py", line 174, in _run_module_as_main

    "__main__", fname, loader, pkg_name)

  File "d:\program files (x86)\python27\Lib\runpy.py", line 72, in _run_code

    exec code in run_globals

  File "E:\WorkPlace\Git_python\liu_demo\venv\Scripts\gunicorn.exe\__main__.py", line 5, in <module>

  File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\app\wsgiapp.py", line 10, in <module>

    from gunicorn.app.base import Application

  File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\app\base.py", line 12, in <module>

    from gunicorn import util

  File "e:\workplace\git_python\liu_demo\venv\lib\site-packages\gunicorn\util.py", line 9, in <module>

    import fcntl

ImportError: No module named fcntl

 

 图片 4

 

而是我的服务器仍然是Windows版本,Flask服务器环境如故要搭建,那么得利用什么样方案吧?

那里推荐应用tornado。

那就是说怎么样是tornado呢?

摘抄至网上一篇作品http://www.tornadoweb.cn/)介绍:Tornado 是 FriendFeed 使用的可伸张的非阻塞式
web 服务器及其相关工具的开源版本。那一个 Web
框架看起来有些像 web.py 或者 Google 的
webapp
,可是为了能立见功用运用非阻塞式服务器环境,那一个Web 框架还含有了一部分相关的实用工具 和优化。

Tornado
和当今的主流 Web 服务器框架(包含大多数 Python
的框架)有着强烈的分别:它是非阻塞式服务器,而且速度分外快。得利于其
非阻塞的法门和对 epoll 的应用,Tornado
每秒可以拍卖数以千计的延续,那象征对于实时 Web 服务以来,Tornado
是1个美妙的 Web 框架。大家付出那些 Web 服务器的重中之重目标就是为了处理
FriendFeed 的实时功用 ——在 FriendFeed
的行使里每贰个平移用户都会维持着3个服务器连接。(关于怎么样扩容
服务器,以拍卖数以千计的客户端的延续的标题,请参阅 C10K
problem
。)

 

至于具体怎么采纳,可以查阅上边作品介绍,也可以瞻仰下文的现实使用代码。

 

 


2 具体达成

看到上边具体贯彻代码,会让大家感慨,Python的确是三个美妙的言语,Flask框架也确实是对应小而又轻量级的框架美称呀。使用MongoDB数据库,操作数据库也变得颇为简约。

 

在看上面代码此前,必要简单说一下REST的着力考虑原理,也一定于是笔者要好尤其加剧印象吧。下边解释应用自阮一峰博客的一个评价,我觉得那样讲述的很合理。

 

REST八个大旨条件:
1.使用HTTP动词:GET
POST PUT DELETE;
2.无状态连接,服务器端不应保存过多上下文状态,即每种请求都以独自的;
3.为各样财富设置U帕杰罗I;
4.经过XML
JSON进行数据传递;
贯彻上述原则的架构即可称为RESTFul架构。
1.网络环境下,任何利用的架构和API可以被高速驾驭;
2.分布式环境下,任何请求都得以被发送到任意服务器;
3.异构环境下,任何能源的造访和使用方式都合并;

 

看看地方介绍,既然说了REST情势使用HTTP动词GET
POST PUT DELETE来落到实处相关操作。

这就是说下边代码就回顾完毕一下那三个动词的具体操作功效。

GET:落成从服务器后台获取数据功效,例如登陆接口功效已毕;

POST:已毕向服务器后台提交数据功用,例如登记接口效率达成;

PUT:完成修改服务器后台已有数量功能;

DELETE:已毕删除服务器后台已有数量成效。

 

看完上边介绍,下边就请看代码:

假诺不使用tornado,直接利用上面三个mongo.py文件中代码即可完成本文标题所述功效:

#coding=utf-8
#mongo.py
from flask import Flask,abort
from flask import jsonify
from flask import request
from flask_pymongo import PyMongo


app = Flask(__name__)

app.config['MONGO_DBNAME'] = 'rest'
app.config['MONGO_URI'] = 'mongodb://172.18.252.20:27017/rest'  #如果部署在本上,其中ip地址可填127.0.0.1

mongo = PyMongo(app)

@app.route('/login', methods=['GET'])
def get_all_users():
  star = mongo.db.userInfo.find()
  output = []
  for s in star:
    output.append({'name' : s['name'], 'pwd' : s['pwd']})
  return jsonify({'result' : output})


@app.route('/register', methods=['POST'])
def add_user():
  star = mongo.db.userInfo
  name = request.json['name']
  pwd = request.json['pwd']
  star_id = star.insert({'name': name, 'pwd': pwd})
  new_star = star.find_one({'_id': star_id })
  output = {'name' : new_star['name'], 'pwd' : new_star['pwd']}
  return jsonify({'result' : output})

@app.route('/modify/<string:name>', methods=['PUT'])
def update_user(name):
    user = mongo.db.userInfo.find({"name":name})
    output = []
    for s in user:
      output.append({'name': s['name'], 'pwd': s['pwd']})
    if len(output) == 0:
      abort(404)
    mongo.db.userInfo.update({"name":name},{'$set':{"name":"LZ111"}})
    return jsonify({'result': output})

@app.route('/delete/<string:name>', methods=['DELETE'])
def delete_user(name):
    user = mongo.db.userInfo.find({"name": name})
    output = []
    for s in user:
      output.append({'name': s['name'], 'pwd': s['pwd']})
    if len(output) == 0:
      abort(404)
    mongo.db.userInfo.remove({'name': name})
    return jsonify({'result': True})



if __name__ == '__main__':
    # app.run(host = '0.0.0.0', port = 80, debug = True)
    app.run()

 

假设选择tornado,新建1个tornado_server.py文件,添加以下代码,作为Flask服务运维布署,也可以兑现相关职能:

#coding=utf-8
#tornado_server.py
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop

from mongo import app


http_server = HTTPServer(WSGIContainer(app))
# http_server.listen(9000)  #此时,开启端口9000,默认本机127.0.0.1的IP地址
http_server.bind(80, "172.18.252.20")# 开启端口为9000,172.18.252.20为内网ip地址,也可以设置为0.0.0.0,
http_server.start(1)
IOLoop.instance().start()

 

看完上边代码,点击运营,即可兑现相关接口功效了。既然是接口,GET格局幸而说,尽管是POST方式,使用浏览器就不那么好操作了,此时大家须求使用一款接口测试软件,在那边小编引进应用Postman(PS:Postman百度经验介绍Postman官网下载链接),假设有同学利用基于Linux相关系统,推荐使用CU奥德赛L来达成。

 

上面就规范启幕应用Postman测试Get、Post、Put和Delete形式接口:

Get情势,选中下图中下拉框GET方式,直接输入U途乐L,然后点击Send巴黎绿按钮即可取得请求数据。

 图片 5

 

Post方式,选中下拉框中Post格局,那里由于要发送数据,需求有些设置一下。

先是,在下图中Headers中要采取Content-Type的数码情势,那里自身选拔的是json格式:

 图片 6

然后,点开下图中Body,采纳raw,添加要存入的json格式数据,如下:

 图片 7

最终,点击Send按钮,在最上边出现有关指示音信后,即可查看Post请求结果。

 

Put格局操作和Get形式一样,不一样的是急需选中操作方法为Put,具体如下图:

 图片 8

 

Delete形式和Put请求大致一致,区其他是2个履行修改操作,二个履行删除操作而已,具体如下图:

 图片 9

 

基本操作就那样,看完上边代码,发现接纳FLask+MongoDB写后端接口是还是不是特意简单?

 

 

参考资料:
1.Designing a
RESTful API with Python and
Flask
(PS:附加1个中文版,不过里面代码有bug)

2.理解RESTful架构

3.MONGODB
RESTFUL API WITH
FLASK

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图