使用Intellij IDEA搭建Ext JsMVC web项目

由于自己从android开发转来学习web开发,最近在学习Jsp,之前接触过一点Extjs,所以用jsp来配合ext试试。

Ext JS介绍

extjs是一个javascript框架,它的好处就是有它自己的界面和事件处理。我们根据它的语法就可以实现我们想要的功能,具体我就不介绍了,自己百度。

Ext MVC结构介绍

不管任何时候,做一个大项目总是很烦的。因为大,所以开发的时候很难去组织,维护的时候就更别说了。随着业务增长肯定更头疼了。Ext的MVC和你在其它地方了解到的所以MVC的功能一样,它的目的就是:
1、组织你的代码,让它易于维护
2、减少你的代码量

Ext MVC结构组成

  • Model 就是字段和数据,类似于java当中的实体bean
  • View 看名字你就爱猜到了,对,没错,用来显示的组件。
  • Controllers Controllers一般就是做一些操作的地方。

MVC文件结构

先来看一下官方文档给出的一张图

使用Intellij IDEA搭建Ext JsMVC web项目

好了,先有个大概的认识,接下来开始实际操作。

本例演示用的开发工具是Intellij idea

项目搭建

无论用什么工具,最开始的一步当然是创建一个web项目了

1、创建一个web项目

1、打开intellij创建一个新项目,之后勾选JavaEE下的Web application,选择自己的项目目录一个项目就创建完毕了。

使用Intellij IDEA搭建Ext JsMVC web项目

2、创建完毕后,项目目录如下

使用Intellij IDEA搭建Ext JsMVC web项目
src里放的就是java代码,web就是我们的项目根目录。此时还需要配置你的Tomcat容器,指定你的项目web路径。具体如下

3、点击IDE右上角的三角形editConfigurations,之后在左边点击+,寻找Tomcat Server,然后点击Local。这样一个Tomcat配置项就出现了

使用Intellij IDEA搭建Ext JsMVC web项目

4、Tomcat配置项添加之后还需要指定Tomcat的目录,和web项目的目录,只需要选定你的Tomcat目录和你项目的web文件夹。

使用Intellij IDEA搭建Ext JsMVC web项目

使用Intellij IDEA搭建Ext JsMVC web项目

这样一个web项目就可以运行了,点击右上角run,在浏览器里输入localhost:8080可以访问就到下一步。

2、集成Ext Js

1、ext作为一个javascript框架,我们只需要在页面简单的通过引入javascript的方式就可以使用了。

在web文件夹新建一个js文件夹,把extjs的sdk放入,然后在首页引入
index.jsp代码如下

@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>extjsDemotitle>
    <link rel="stylesheet" type="text/css" href="js/extjs/resources/css/ext-all.css">
    <script type="text/javascript" src="js/extjs/ext-all.js">script>
    <script type="text/javascript" src="js/extjs/locale/ext-lang-zh_CN.js">script>
    <script type="text/javascript" src="app/appjs/app.js">script>
  head>
  <body>

  body>
html>

这样index.jsp就能够使用ext了,注意最后一行script饮用了app.js,这是ext应用的开始的地方。

在文章开始说到ext官网给出的MVC文件结构都是在app文件夹之后的,所以在web下新建一个app文件夹

3、使用Ext Js的MVC结构

在app.js里创建应用

没个ext js 4应用都以一个Application类开始。Application包含了应用文件夹的设置,以及一个启动函数,在Application启动之后会调用。所以我们在app文件夹创建app.js,当然名字你可以随便取,我们在里面写一个Application

Ext.application({
    requires: ['Ext.container.Viewport'],
    name: 'AM',

    appFolder: 'app',

    launch: function() {
        Ext.create('Ext.container.Viewport', {
            layout: 'fit',
            items: [
                {
                    xtype: 'panel',
                    title: 'Users',
                    html : 'List of users will go here'
                }
            ]
        });
    }
});
上面的代码通过Ext.application创建了一个名叫AM 的Application类,并且指定了应用的文件夹为app,launch函数,在加载完毕之前会调用,这里可以看到创建了一个Viewport类,items就是它包含的内容,包含了一个panel,里面简单的设置了一段文字。

此时你再刷新index.jsp,效果是这样了,完全没写什么样式,是不是很酷,而且你可以根据皮肤换效果

使用Intellij IDEA搭建Ext JsMVC web项目

定义一个Controller

ext中的Controllers一般都和application一起使用,用来监听处理事件。下面代码创建了一个简单的控制器,记得创建在controller文件夹下。

Ext.define('AM.controller.Users', {
    extend: 'Ext.app.Controller',

    init: function() {
        console.log('Initialized Users! This happens before the Application launch function is called');
    }
});

创建之后还要在application中引用

javascript;gutter:true; Ext.application({ ...</p> <pre><code>controllers: [ 'Users' ], ... </code></pre> <p>});</p> <pre><code> 当在浏览器中访问index.jsp的时候,由于在applicaton在指定了controller,所以controller会自动加载,controller中的 init函数会在Application类的lauch函数之前调用。 打开浏览器打开console 控制台会发现输出了Initialized Users! This happens before the Application launch function is called Controller的init函数通常会调用-control()来设置事件监听。 如下: </code></pre> <p>Ext.define('AM.controller.Users', { extend: 'Ext.app.Controller',</p> <pre><code>init: function() { this.control({ 'viewport > panel': { render: this.onPanelRendered } }); }, onPanelRendered: function() { console.log('The panel was rendered'); } </code></pre> <p>});</p> <pre><code> 在init函数中调用了control,查找viewport类下的任何panel类, render表示显示事件,即当panel显示是输出The panel was rendered 修改为上面代码,再刷新,console控制台就打印了。 看到这里,基本的事件处理就演示了,在深入了解之后就可以做更多事件了,哈哈。好了,下面来看view #### 定义一个Controller ext含有很多view组件,下面是一个简单的例子,我们在view文件夹下建立List.js代表用户列表,代码 </code></pre> <p>Ext.define('AM.view.user.List' ,{ extend: 'Ext.grid.Panel', alias: 'widget.userlist',//别名,在其他地方引用可以直接用userlist</p> <pre><code>title: 'All Users', initComponent: function() { this.store = { fields: ['name', 'email'], data : [ {name: 'Ed', email: 'ed@sencha.com'}, {name: 'Tommy', email: 'tommy@sencha.com'} ] }; //做演示,这是指定了数据 this.columns = [ {header: 'Name', dataIndex: 'name', flex: 1}, {header: 'Email', dataIndex: 'email', flex: 1} ];//用来grid显示的列,会将store中name相同的数据显示 this.callParent(arguments); } </code></pre> <p>});</p> <pre><code> 注意这里define之后的名字,'AM.view.user.List',AM是我们创建application时指定的 name,view对呀mvc的view,也就是view文件夹下user文件夹下的 List,其他所有文件都是按照这个模式的,就是mvc。 view创建好之后,需要在Controller里引用,由于用了weight.userlist来作为alias别名,所以在Controller中可以直接使用别名引用 </code></pre> <p>Ext.define('AM.controller.Users', { extend: 'Ext.app.Controller',</p> <pre><code>views: [ 'user.List' ], init: ... onPanelRendered: ... </code></pre> <p>});</p> <pre><code> 还记得之前在application中在launch之后直接显示了一个 panel吗,现在有了自己的view,我们就不用panel了,直接将view添加到application </code></pre> <p>Ext.application({ ...</p> <pre><code>launch: function() { Ext.create('Ext.container.Viewport', { layout: 'fit', items: { xtype: 'userlist' } }); } </code></pre> <p>});</p> <pre><code> 这样在启动之后就会加载view了,重新刷新浏览器,效果如图: ![](//img-blog.csdn.net/20160505233623659) 简单的设置了数据源指定grid的columns就可以显示了是不是很酷,可惜现在的数据不是真实数据。 之前在controller中监听了panel的render事件,不过由于是显示事件所以可能感觉不爽。结下来我们操作grid。 #### Controller中操作grid 通过双击在console控制台输出一条信息,看controller代码 </code></pre> <p>Ext.define('AM.controller.Users', { extend: 'Ext.app.Controller',</p> <pre><code>views: [ 'user.List' ], init: function() { this.control({ 'userlist': { itemdblclick: this.editUser } }); }, editUser: function(grid, record) { console.log('Double clicked on ' + record.get('name')); } </code></pre> <p>});</p> <pre><code> 只是简单的修改了control中的代码,监听userlist,itemdbclick代表的是双击事件,指向了editUser,监听的输入了Double clicked on ' + record.get('name') 再次刷新,双击 ![](//img-blog.csdn.net/20160505234418162) 那我们要是想直接编辑gird呢 编辑的时候肯定需要一个form,来看代码 </code></pre> <p>Ext.define('AM.view.user.Edit', { extend: 'Ext.window.Window', alias: 'widget.useredit',</p> <pre><code>title: 'Edit User', layout: 'fit', autoShow: true, initComponent: function() { this.items = [ { xtype: 'form',// form表单 items: [ { xtype: 'textfield', name : 'name', fieldLabel: 'Name' }, { xtype: 'textfield', name : 'email', fieldLabel: 'Email' } ] } ]; this.buttons = [ { text: 'Save', action: 'save' }, { text: 'Cancel', scope: this, handler: this.close } ]; this.callParent(arguments); } </code></pre> <p>});</p> <pre><code> 上面代码定义了一个用来显示的window,其中包含了一个form表单和两个按钮。 那么我们要contoller里肯定需要在双击的时候显示window,将原始数据填入 form。 好了,上代码 </code></pre> <p>Ext.define('AM.controller.Users', { extend: 'Ext.app.Controller',</p> <pre><code>views: [ 'user.List', 'user.Edit' ], init: ... editUser: function(grid, record) { var view = Ext.widget('useredit');//找到window view.down('form').loadRecord(record);window下的 form,回填数据。 } </code></pre> <p>});</p> <pre><code> ![](//img-blog.csdn.net/20160506001721956) #### 创建Model和Store 之前我们在创建view的时候直接将数据写在了view里,其实可以在 view中引用Store,store是封装数据的地方,可以从服务器加载也可以本地配置。 </code></pre> <p>Ext.define('AM.store.Users', { extend: 'Ext.data.Store', fields: ['name', 'email'], data: [ {name: 'Ed', email: 'ed@sencha.com'}, {name: 'Tommy', email: 'tommy@sencha.com'} ] //简单的指定了本地数据 });</p> <pre><code> 需要在Controller中引用stores </code></pre> <p>Ext.define('AM.controller.Users', { extend: 'Ext.app.Controller', stores: [ 'Users' ], ...</p> <p>});</p> <pre><code> 这样在view里我们就可以直接使用store </code></pre> <p>Ext.define('AM.view.user.List' ,{ extend: 'Ext.grid.Panel', alias: 'widget.userlist', title: 'All Users',</p> <pre><code>// we no longer define the Users store in the method store: 'Users', initComponent: function() { this.columns = [ ... </code></pre> <p>});</p> <pre><code> 接下来到model </code></pre> <p>Ext.define('AM.model.User', { extend: 'Ext.data.Model', fields: ['name', 'email'] });</p> <pre><code> store和controller里需要引用model, </code></pre> <p>Ext.define('AM.store.Users', { extend: 'Ext.data.Store', model: 'AM.model.User',</p> <pre><code>data: [ {name: 'Ed', email: 'ed@sencha.com'}, {name: 'Tommy', email: 'tommy@sencha.com'} ] </code></pre> <p>});</p> <p>Ext.define('AM.controller.Users', { extend: 'Ext.app.Controller', stores: ['Users'], models: ['User'], ...</p> <p>});

这样和之前的效果一样。
store能够从服务端加载数据用来显示在view中。由于篇幅有限就暂时不做介绍了。这里主要讲解Ext js的MVC。

其实就是以Ext.application为开始,指定了项目名之后,
命名就以 项目名.view或controller或store或model.文件名。
中间你可以加根据功能区分的文件夹,这样就很好管理和维护了。
最后附上一下demo的文件结构

使用Intellij IDEA搭建Ext JsMVC web项目

哈哈,extjs的mvc是不是很好理解了,如何在src也用上MVC就更好了。点个赞呗。

源码下载

Original: https://www.cnblogs.com/yangqiangyu/p/5463936.html
Author: So,Cool
Title: 使用Intellij IDEA搭建Ext JsMVC web项目

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/608764/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 一文理解Hadoop分布式存储和计算框架入门基础

    @ 概述 定义 发展历史 发行版本 优势 生态项目 架构 组成模块 HDFS架构 YARN架构 部署 部署规划 前置条件 部署步骤 下载文件(三台都执行) 创建目录(三台都执行) …

    Java 2023年6月5日
    073
  • 数据库-mysql索引篇

    点赞再看,养成习惯,微信搜索「 小大白日志」关注这个搬砖人。 文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。 mysql的索引类型? mysql中有5种索引:普…

    Java 2023年6月8日
    082
  • Java 多线程共享模型之管程(上)

    主线程与守护线程 默认情况下,Java 进程需要等待所有线程都运行结束,才会结束。有一种特殊的线程叫做守护线程,只要其它非守护线程运行结束了,即使守护线程的代码没有执行完,也会强制…

    Java 2023年6月9日
    0102
  • echarts X轴 或者 Y轴 添加标识线

    1、X轴添加标示线效果图 代码 option = { xAxis: { data : [‘aaa’,’bbb’] }, yAxis: {}, series: [{ symbolSi…

    Java 2023年6月8日
    099
  • Redis基本数据结构ZipList

    为什么要有ziplist 有两点原因: 普通的双向链表,会有两个指针,在存储数据很小的情况下,我们存储的实际数据的大小可能还没有指针占用的内存大,是不是有点得不偿失?而且Redis…

    Java 2023年6月7日
    094
  • Feign源码解析系列-核心初始化

    开始 初始化Feign客户端当然是整个过程中的核心部分,毕竟初始化完毕就等着调用了,初始化时候准备的什么,流程就走什么。 内容 从上一篇中,我们已经知道,对于扫描到的每一个有@Fe…

    Java 2023年6月13日
    089
  • resultMap的用法以及关联结果集映射

    resultTyperesultType可以把查询结果封装到pojo类型中,但必须pojo类的属性名和查询到的数据库表的字段名一致。如果sql查询到的字段与pojo的属性名不一致,…

    Java 2023年6月5日
    083
  • RabbMQ

    RabbitMQ基本概念 Broker: 简单来说就是消息队列服务器实体 Exchange: 消息交换机,它指定消息按什么规则,路由到哪个队列 Queue: 消息队列载体,每个消息…

    Java 2023年6月13日
    049
  • JavaScript基本语法

    JavaScript(js)注释 js的注释非常简单,就和java一样, //, /**/,分别对应多行注释和单行注释,当然要在 <script>….</sc…

    Java 2023年6月5日
    091
  • Spring使用注解开发及使用java类进行配置bean

    Spring使用注解开发 说明 在spring4之后,想要使用注解形式,必须得要引入aop的包 在配置文件当中,还得要引入一个context约束 <?xml version=…

    Java 2023年6月15日
    082
  • Vulnhub-DC-5靶机实战

    前言 靶机下载地址:https://www.vulnhub.com/entry/dc-5,314/ KALI地址:192.168.16.109靶机地址:192.168.16.1 一…

    Java 2023年6月13日
    087
  • .net 自动摘要等算法 HanLP.net

    参考资料: 在CSharp中调用HanLP 目前自动摘要算法似乎没有.net 版本,而以java,python 居多 自动摘要算法一般使用textrank算法 比如java开源的:…

    Java 2023年6月8日
    077
  • Java中的基本数据类型

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月5日
    083
  • Nginx log 日志分割

    Nginx日志不处理的话,会一直追加,文件会变得很大 方法1:给日志文件名加上日期 推荐 log_format access-upstream ‘$time_iso8601|$re…

    Java 2023年6月14日
    084
  • Doug Lea文章阅读记录-JUC系列

    3.3 QueuesThe heart of the framework is maintenance of queues of blocked threads, which ar…

    Java 2023年6月13日
    081
  • 【java多线程】线程的状态示意以及线程方法讲解

    一、java线程的状态 public enum State { /** * Thread state for a thread which has not yet started….

    Java 2023年5月29日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球