amaze ui还是很强大的,用的熟练的话工作效率是能有很大的提升,但是说实话,固定的样式是有点丑。

Amaze UI 中, 行 .am-g 的宽度被设置为 100%, 未限定最大宽度,会随着窗口自动缩放

.am-g {
     margin: 0 auto;
      width: 100%;
}

网格布局会形成左右内边距,可以在行 .am-g 上添加 .am-g-collapse,移除列的内边距(padding)。

[class*="am-u-"] {
  width: 100%;
  padding-left: 1rem;
  padding-right: 1rem;
  float: left;
  position: relative;
}
.am-g-collapse [class*="am-u-"] {
  padding-left: 0;
  padding-right: 0;
}

注意:如果am-u-xx-n中不足12等分,则最后一个am-u-xx-n向右浮动。

[class*="am-u-"] + [class*="am-u-"]:last-child {
      float: right;
}

因此,可以在最后一列加上.am-u-end使其左浮动

[class*="am-u-"] + [class*="am-u-"]:last-child {
      float: right;
}

列边距啪啪啪,添加 am-u-sm-offset-、am-u-sm-offset-、am-u-lg-offset- 设置列的左边距。am-u-sm-push-则相反

.am-u-sm-offset-1 {
     margin-left: 8.33333333%;
  }
.am-u-sm-push-11 {
     left: 91.66666667%;
}

单独使用.am-container形成容器,会产生左右内边距,注意:在手机端(<641px)为1rem

.am-container {
  -webkit-box-sizing: border-box;
  -moz-box-sizing: border-box;
  box-sizing: border-box;
  margin-left: auto;
  margin-right: auto;
  padding-left: 1rem;
  padding-right: 1rem;
  width: 100%;
  max-width: 1000px;
}
@media only screen and (min-width:641px) {
  .am-container {
    padding-left: 1.5rem;
    padding-right: 1.5rem;
  }
}

总结:Amaze UI使用通过am-g或与am-container形成不带最大宽度和带最大宽度为1000px的行布局,列布局则通过am-u-xx-n自定义布局

带最大宽度为1000px的行布局,可在行 .am-g 上添加 .am-g-collapse,    移除.am-container的内边距
<div class="am-container">
    <div class="am-g">
        <am-u-xx-n></am-u-xx-n> //自定义
    </div>
</div>

满屏铺满的行布局,已取消内边距。在行 .am-g 上添加 .am-g-collapse,移除列的内边距(padding)。
<div class="am-g am-g-collapse">
    <am-u-xx-n></am-u-xx-n> //自定义
</div>

浮动相关

am-fl 左浮动 .am-fr 右浮动 .am-center 水平居中 .am-cf 清除浮动

.am-align-xx浮动,与普通的左浮动右浮动相比较差不多,只不过是将浮动的元素加了自身浮动相反的外边距和底部边距

[class*='am-align-'] {
  margin-bottom: 1rem;
}
.am-align-left {
  margin-right: 1rem;
  float: left;
}
.am-align-right {
  margin-left: 1rem;
  float: right;
}

Amaze UI尺寸定于

-xs最小 -sm小 -default中等 -lg大 -xl超大

am-text-{size} 文字大小
am-btn-{size} 按钮大小
am-input-{size} 输入框文字大小,个人理解行高。只支持sm和lg(2.6版本)
am-icon-sm 放大150%
am-icon-md 放大 200% (不写默认)
am-icon-lg 放大 250%

Amaze UI定义了几个常见的颜色

default-默认;primary-蓝色;secondary-浅蓝色;success-绿色;warning-橙色;danger-红色;link-透明

am-text-{color} 设置文字颜色
am-btn-{color} 按钮设置颜色

通过上面的尺寸、颜色就能很快的定义一个amaze ui的button,例如

<button type="button" class="am-btn am-btn-default am-radius">默认样式</button>

在按钮样式的基础上添加 .am-btn class表明这是amaze ui按钮,添加.am-btn-{color}设置颜色;添加.am-btn-{size}设置大小,不写默认;添加.am-radius创建圆角按钮。

块级按钮,添加 .am-btn-block class。

.am-btn-block {
  display: block;
  width: 100%;
  padding-left: 0;
  padding-right: 0;
}

源码可见:button为块级元素,取消内边距,宽度100%,铺满整个div。

带有Icon图标的按钮

<button class="am-btn am-btn-default">
  <i class="am-icon-cog"></i>
  设置
</button>

跟本身的按钮使用方式是一模一样的,通过在内部加i标签,形成icon图标。

注意:button按钮点击会产生border,假如用了link样式就出现白底蓝边,用a标签可以解决

button JS交互 loading状态

<button type="button" class="am-btn am-btn-primary btn-loading-example" 
    data-am-loading="{spinner: 'circle-o-notch', loadingText: '加载中...', resetText: '加载过了'}">
    按钮 - button 元素
</button>

spinner 加载动画图标,适用于支持 CSS3 动画、非 input 元素,写图标名称即可
loadingText 加载时显示的文字, 默认为 loading
resetText 重置以后的显示的文字,默认为原来的内容

js调用

$('.btn-loading-example').click(function () {
      var $btn = $(this)
      $btn.button('loading');//loading状态    
    $btn.button('reset');//复原
});

Amaze UI内外边距辅助类

Amaze UI在设计中,horizontal表示水平方向;scrollable表示垂直方向。

水平滚动:内容超出容器宽度时显示水平滚动条

am-scrollable-horizontal

垂直滚动: 内容超过设置的高度以后显示滚动条,默认设置的高度为 240px

am-scrollable -vertical

四周外边距:

.am-margin
.am-margin-{size}

水平方向外边距:

.am-margin-horizontal
.am-margin-horizontal-{size}

垂直方向外边距:

.am-margin-vertical
.am-margin-vertical-{size}

左外边距:

.am-margin-left
.am-margin-left-{size}

其padding同理可得

Amaze UI给img定义了一些简单的样式,去掉图片原本的边框线,所以img元素中展示的其本身大小,可以通过.am-img-responsive满屏撑满

.am-img-responsive {
    display: block;
    max-width: 100%;
    height: auto;
}

也可以通过.am-img-thumbnail添加边宽线

在Amaze UI使用表单时,需要在容器上添加 .am-form class,容器里的子元素才会应用 Amaze UI 定义的样式。

表单水平排列。在form表单中添加 .am-form-horizontal class 并结合网格系统使用

<form class="am-form am-form-horizontal">
      <div class="am-form-group">
        <label for="doc-ipt-3" class="am-u-sm-2 am-form-label">电子邮件</label>
        <div class="am-u-sm-10">
              <input type="email" id="doc-ipt-3" placeholder="输入你的电子邮件">
        </div>
      </div>
</form>

简答的来说,am-form-group中的元素会一行内排列

行内排列,在外围容器上添加 .am-form-inline。 注意: 行内排列的元素并没有设置右边距,默认使用 inline-block 元素的间距,压缩 HTML 后行内表单元素的右边距会消失,需要自行处理。

<form class="am-form-inline" role="form">
    <div class="am-form-group">
        <input type="email" class="am-form-field" placeholder="电子邮件">
    </div>
    <div class="am-form-group">
        <input type="password" class="am-form-field" placeholder="密码">
    </div>
</form>

简答的来说,am-form-group中的元素会从左往右进行排列

建议所有的input框全部放在am-form中,因为amaze ui已经帮我们封装好了。

.am-form select,
.am-form textarea,
.am-form input[type="text"],
.am-form input[type="password"],
.am-form input[type="datetime"],
.am-form input[type="datetime-local"],
.am-form input[type="date"],
.am-form input[type="month"],
.am-form input[type="time"],
.am-form input[type="week"],
.am-form input[type="number"],
.am-form input[type="email"],
.am-form input[type="url"],
.am-form input[type="search"],
.am-form input[type="tel"],
.am-form input[type="color"],
.am-form-field {
  display: block;
  width: 100%;
  padding: 0.5em;
  font-size: 1.6rem;
  line-height: 1.2;
  color: #555555;
  vertical-align: middle;
  background-color: #ffffff;
  background-image: none;
  border: 1px solid #cccccc;
  border-radius: 0;
  -webkit-appearance: none;
  -webkit-transition: border-color 0.15s ease-in-out, -webkit-box-shadow 0.15s ease-in-out;
          transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}

表格

Amaze UI通过给table添加.am-table设置基本样式;通过添加 .am-table-bordered 类生成边框线通过添加;通过添加 .am-table-radius 类生成外层圆角边宽;通过添加 .am-table-striped 类生成斑马线效果;通过添加 .am-table-hover 类生成hover 效果;

<table class="am-table am-table-bordered am-table-radius am-table-striped am-table-hover">
    <thead>
        <tr>
            <th>网站名称</th>
            <th>网址</th>
            <th>创建时间</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Amaze UI</td>
            <td>http://amazeui.org</td>
            <td>2012-10-01</td>
        </tr>
    </tbody>
</table>

模拟弹窗

下面就是Amaze UI一个常见的弹窗,官方文档中.am-modal后面还跟了.am-modal-alert或.am-modal-confirm,经过个人研究得出,没有实际用处,只是语义化而已。

//模拟弹窗开关
<button type="button" id='btn'></button>

//模拟弹窗
<div class="am-modal" tabindex="-1" id="modal">
  <div class="am-modal-dialog">
    <div class="am-modal-hd">//模拟弹窗头部
          <a href="javascript: void(0)" class="am-close am-close-spin" data-am-modal-close>&times;</a>
        //a标签表示可以关闭当前弹窗的按钮
    </div>
    <div class="am-modal-bd">
          //模拟弹窗内容区
    </div>
    <div class="am-modal-footer">
        //模拟弹窗底部,底部一般放按钮,在一行等比例显示
        <span class="am-modal-btn" data-am-modal-cancel>取消</span>
          <span class="am-modal-btn" data-am-modal-confirm>提交</span>
    </div>
  </div>
</div>

//js调用,通过按钮点击事件触发

$('#btn').onclick = function(){
    $('#model').modal({
        width: number    //可不写,
        height: number //可不写,
        onConfirm:function(options){
            //对应点击事件 <span class="am-modal-btn" data-am-modal-confirm>提交</span>
        }
        onCancel:function(options){
            //对应点击事件 <span class="am-modal-btn" data-am-modal-cancel>取消</span>
        }
    })
}

angular2-bootstrap

angular2引入ng-bootstrap

ng-bootstrap 使用 bootstrap 4.0 alpha2 , 因此需要先下载 bootstrap , 推荐使用 npm 包的形式

npm install bootstrap@4.0.0-alpha.2 –save

接着下载 ng-bootstrap , 同样使用 npm 包的形式

npm install @ng-bootstrap/ng-bootstrap –save

angular2-install

/**
 * 从github上下载angular2项目
 * npm install国内有可能出错,我反正报错了。改为cnpm install
 * 安装依赖
 */
git clone https://github.com/angular/quickstart.git quickstart
cd quickstart
npm install

npm install //ERR

npm ERR! sha1-/viqIjkh97QLu71MPtQwL2/QqBM= integrity checksum failed when using sha1: wanted sha1-/viqIjkh97QLu71MPtQwL2/QqBM= 
but got sha1-QC6Yy3j8txJhU5Qkszs8/6/o6Is=. (474949 bytes)

Windows删除不必要的文件

for /f %i in (non-essential-files.txt) do del %i /F /S /Q
rd .git /s /q
rd e2e /s /q

最后本地启动anular2工程

npm start

quickstart/.editorconfig详解

/**
 * EditorConfig帮助开发人员在不同的编辑器和IDE之间定义和维护一致的编码风格。
 * *  匹配除/之外的任意字符串 [*]表示所有
 * ** 匹配任意字符串
 * ?  匹配任意单个字符
 * [name]  匹配name字符
 * [!name] 匹配非name字符
 * {s1,s2,s3} 匹配任意给定的字符串(since 0.11.0)
 * @param root: 表明是最顶层的配置文件,发现设为true时,才会停止查找.editorconfig文件。
 * @param indent_style: 设置缩进风格,tab或者空格。tab是hard tabs,space为soft tabs(4个space)。
 * @param indent_size: 缩进的宽度,即列数,整数。如果indent_style为tab,则此属性默认为tab_width。
 * @param tab_width: 设置tab的列数。默认是indent_size。
 * @param end_of_line: 换行符,lf、cr和crlf
 * @param charset: 编码,latin1、utf-8、utf-8-bom、utf-16be和utf-16le,不建议使用utf-8-bom。
 * @param trim_trailing_whitespace: 设为true表示会除去换行行首的任意空白字符。
 * @param insert_final_newline: 设为true表明使文件以一个空白行结尾
 */
# http://editorconfig.org
root = true

[*]
charset = utf-8
indent_style = space
indent_size = 2
insert_final_newline = true
trim_trailing_whitespace = true


[*.md]
max_line_length = 0
trim_trailing_whitespace = false

# Indentation override
#[lib/**.js]
#[{package.json,.travis.yml}]
#[**/**.js]

quickstart/bs-config.json 指定工程启动的根目录,例如这里是src

{
  "server": {
    "baseDir": "src",
    "routes": {
      "/node_modules": "node_modules"
    }
  }
}

https://segmentfault.com/a/1190000008563619

SpringMVC-Shiro-ContextLoaderListene

/**
 * Web容器加载顺序ServletContext--context-param--listener--filter--servlet
 * context-param用来声明应用范围(整个WEB项目)内的上下文初始化参数。
 * @param param-name 设定上下文的参数名称。必须是唯一名称
 * @param param-value  设定的参数名称的值
 */
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:application-context.xml</param-value> 
</context-param>

/**
 * 此监听器出用于主要为了解决java.beans.Introspector导致内存泄漏的问题 
 * 此监听器应该配置在web.xml中与Spring相关监听器中的第一个位置(也要在ContextLoaderListener的前面) 
 */
<listener>  
    <listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>  
</listener> 

/**
 * 实例化Spring容器
 * 应用启动时,该监听器被执行,它会读取Spring相关配置文件,其默认会到WEB-INF中查找applicationContext.xml
 */
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

/**
 * 配置Shiro过滤器,先让Shiro过滤系统接收到的请求
 * 这里filter-name必须对应applicationContext.xml中定义的<bean id="shiroFilter"/>
 * 使用[/*]匹配所有请求,保证所有的可控请求都经过Shiro的过滤
 * 通常会将此filter-mapping放置到最前面(即其他filter-mapping前面),以保证它是过滤器链中第一个起作用的
 * @param param-value 该值缺省为false,表示生命周期由SpringApplicationContext管理 设置为true则表示由ServletContainer管理
 */
<filter>  
    <filter-name>shiroFilter</filter-name>  
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
    <init-param>  
        <param-name>targetFilterLifecycle</param-name>  
        <param-value>true</param-value>  
    </init-param>  
</filter>  
<filter-mapping>  
    <filter-name>shiroFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping> 

maven-web-xml

首先,maven工程中的web.xml配置文件不是必须的。

<?xml version="1.0" encoding="UTF-8"?> //xml的版本号为1.0,字符编码为utf-8
    <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd http://java.sun.com/xml/ns/javaee ">
    /**
     * ContextLoaderListener加载内容
     * context-param用来声明应用范围(整个WEB项目)内的上下文初始化参数。
     * @param param-name 设定上下文的参数名称。必须是唯一名称
     * @param param-value  设定的参数名称的值
     */
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value> 
    </context-param>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    /**
     * DispatcherServlt加载内容
     * 
     */
    <servlet>
        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/servlet-context.xml</param-value>
        </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>


    //指定欢迎页面(个人理解这不是首页吗,欢迎页其实我一点都不欢迎你来访问)
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>  //javaweb项目默认index.html是首页
        ......
        //可设置多个页面,从上往下,依次查找,找到就显示,结束这次任务
        <welcome-file>user/index.html</welcome-file>
        //可对不同的文件设置自身的首页
    </welcome-file-list>

    //错误编码,跳转自定义页面
    <error-page>
        <error-code>404</error-code>
        <location>/user/8888.html</location>
    </error-page>

    //抛异常
    <error-page>
        <exception-type>java.lang.Exception<exception-type>
        <location>/exception.html<location>
    </error-page>

    //过滤器解决spring编码问题,只对post请求有效
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
</web-app>

win7下小菜鸡安装ionic1.x,呵呵哒辣

本以为不就是装个ionic吗,应该是很简单,装到我后面我发现这真的是个笑话,沮麻烦,沮恶心,沮痛苦的…

尤其还没有完整的安装教程,错误也是千奇百怪,不记下来,等下次在安装,那不是第二次头皮发麻吗。

ionic start yxsh blank –type=ionic1

安装空白页面的ionic1.x,第一部就给我报错辣,怎么不去吃屎去,别说我,我去还不行吗,别给我报错了。

Error:unable to verify the first certificate

原因:win7下还需要配置一个环境变量。系统环境变量中新建NODE_TLS_REJECT_UNAUTHORIZED,其值为0

变量名:NODE_TLS_REJECT_UNAUTHORIZED
变量值:0(阿拉伯数字0)

cd yxsh

ionic cordova platform add android

注:在/platforms/android/res/values/包里面打开strings.xml 文件在resources 标签里面添加

tools:ignore="MissingTranslation" xmlns:tools="http://schemas.android.com/tools"  

接下来的就是最恶心的环节,就是装装装,设设设,下下下…

ionic build android

这里我是报错辣

Error:the platform command has been renamed.To find out more, run:

ionic cordova platform --help

由于ionic 3.x的版本ionic platform 命令已经重命名,所以照着它的提示敲。

ionic cordova platform add android

其他类似错误就不一一解答,解决方法都是ionic cordova代替ionic

在这里,需要我们装jdk,apache-ant,android-sdk,gradle,以上这些东西都能百度得到,就不一一细讲辣。

android-sdk中的Android SDK Manager可以看看这篇博客 http://blog.csdn.net/xushuai0616/article/details/55802725

Android SDK Manager Log报错

Failed to fetch URL http://dl.google.com/android/repository/addons_list-2.xml, reason: Unknown Host HTTP Proxy server

大牛的回答

在Android SDK Manager Setting 窗口设置HTTP Proxy server和HTTP Proxy Port这个2个参数,

分别设置为: HTTP Proxy server:mirrors.neusoft.edu.cn HTTP Proxy Port:80 

然后把下面的Force ..hxxxxxxxxxxxxxxxxxx勾上

因为我是直接在真机上测试

ionic cordova run android 代替 ionic cordova build android 和 ionic cordova emulate android

在这里要说以下,build是生成apk,而在手机上测试需要将apk装到手机上,所以手机必须开启“你傻逼”的功能。而我的手机开启辣傻逼模式还是没有发现设备。

adb devices

List of devices attached 

adb devices找不到设备?原来是我的电脑没有安装Android Device,然后在adb_usb.ini文件中写入VID数值,百度教程http://jingyan.baidu.com/article/ce09321b5b76642bff858f31.html

这样,你的app就能在手机上调试辣。

chrome://inspect/#devices

手机usb连接,并且开启开发者模式,就能进入WebView调试界面,手机上打开app,在pc端就会显示如下:

WebView in io.ionic.starter (33.0.0.0)
app名字 file://android_asset/www/index.htm
inspect

点击inspect就能进入调试。

注:WebView调试只支持debug.apk调试,不支持已签名的apk

ionic修改app名字,只需要在项目根目录下的config.xml文件修改以下就可以辣

<name>项目名称</name>

ionic生成图标及其启动图片,\resources\android\icon是存放android图标的地方。在\resources文件夹中都放入icon.png(ionic图标是1024*1024,所以大家懂的)

ionic cordova resources –icon

会帮你自动生产各种大小的图片。

启动图片根图标的生成方式是一模一样的,系统自带的是2732*2732()

ionic cordova resources –splash

一步到位

ionic cordova resources

注:这种生成的图片方式还是是裁剪,而不是等比例缩放,所以建议大家还是自己作图,如果有更好的方式可以给我分享

1028784495@qq.com  

一般在C盘 Users/用户/.android包里面;找到debug.keystore查看keystore 详细信息获得别名 android 为 keystore 的默认密码

keytool -list -v -keystore debug.keystore -storepass android

在当前目录下生成 my-release-key.keystore 签名信息(validity 签名有效天数)

keytool -genkey -v -keystore my-release-key.keystore -alias androiddebugkey -keyalg RSA -keysize 2048 -validity 20000    

ionic App生成无签名apk

cordova build android –release

编译成功之后;会在platforms\android\build\outputs\apk包里面生成一个android-release-unsigned.apk文件

将android-release-unsigned.apk文件移动至C:\Users.android的文件的根目录下(和my-release-key.keystore放在一起)

签名

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore android-release-unsigned.apk androiddebugkey  

最后放上我借鉴的网址

ionic Deploying

http://ionicframework.com/docs/intro/deploying/

IONIC 发布正式版本打包步骤 - dailuwen的专栏 - CSDN博客

http://blog.csdn.net/dailuwen/article/details/53907735

签署您的应用 | Android Studio(有点小卡)

https://developer.android.com/studio/publish/app-signing.html#setup

Mac安装ionic

sudo npm install -g cordova ionic

第一部就报了一个很常见的错误,无法验证的签名。

code UNABLE_TO_VERIFY_LEAF_SIGNATURE

这里只需关闭代理即可

npm config set strict-ssl false

开启代理

npm config set strict-ssl true

但是麻花的事情是,这货关闭了代理也不行,回想当初win7也报了个错误,它的解决方法是新建一个环境变量,将其的值赋值为”0”

vi .bash_profile

export NODE_TLS_REJECT_UNAUTHORIZED=0

最可恨的还是不行,见鬼辣,最后是换辣镜像文件就可以辣

npm config set registry http://registry.cnpmjs.org/

npm config set registry http://registry.npm.taobao.org/

另外,mac开发ionic时,需要安装Xcode,接着配置Xcode,

  1. Open Xcode preferences (Xcode > Preferences…)
  2. Click the ‘Accounts’ tab
  3. Login with your Apple ID (+ > Add Apple ID…)

appid is not on any development teams

解决方法,删除appid,再重新登下appid就可以了。

接着:

>ionic cordova build ios

中途报了个错误,如下:

xcode-seect:error:tool 'xcodebuild' requires Xcode,but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance

解决措施,重新定义一下xcode的路径,例如我的

sudo xcode-select –switch /Applications/Xcode.app

mac ionic真机调试还需要装iOS-deploy,iOS-deploy是一个使用命令行安装ios app到连接的设备的工具,原理是根据os x命令行工程调用系统底层函数,获取连接的设备、查询/安装/卸载app。

npm install -g ios-deploy

spring mvc 流程简单介绍

http发送请求,action层(类)接收请求,在这层主要实现具体的方法和处理请求,是管理业务(service)调度和管理跳转的。

服务层server,xxxSV.java声明一个方法,xxxSVImpl.java实现这个方法。

dao层只完成CRUD,但是无论多么复杂的查询,dao层只是封装,至于CRUD如何去实现一个功能,dao层是不管的。

Action像是服务员,顾客点什么菜,菜上给几号桌,都是ta的职责;Service是厨师,action送来的菜单上的菜全是ta做的;Dao是厨房的小工,和原材料打交道的事情全是ta管。相互关系是,小工(dao)的工作是要满足厨师(service)的要求,厨师要满足服务员(action)转达的客户(页面用户)的要求,服务员自然就是为客户服务喽。

xm文件删除,dao层及其新增的CRUD语句复制,其他自动追加。

java-file-upload

代码微微有点长,java部分就自己犯下的错误记录以下,代码就不贴辣,我放在来我的github上,有需要的可以自己去看看(其实写的炒鸡辣鸡)https://github.com/chenfm-outlook/java-file-upload

前端部分

由于我用的是原生file控件,样式是很丑的,所以我就用大众的方法,将其隐藏掉,通过点击button的方式去触发file。

$scope.submit = function(){
    $('#file').trigger('click');
    //当按钮点击时,触发file控件的点击事件
}

取消file的确定事件(长得丑就别出来)

$('input[type="file"]').on('change',doUpload);
function doUpload(){
     var data = (new FormData($('#form')[0]));
     $.ajax({
       url:'/AppFileUploadAction/fileUpload.do',
       type:'post',
       data: new FormData($('#form')),
       ……
    })
}

值得注意的是data属性别忘记加上去,要吃亏的。

data: new FormData($(‘#form’))

最最麻花的东西就要出现辣,恶心辣我一下午。

<form method="post" id="form" enctype="multipart/form-data" style="display: none">
    <input type="file" id="file" name="file">
</form>

主要我菜,一开始没加name=”file”这个属性,图片上传功能死活不工作,真的是麻花,换辣N种方法,发现还是不对(内心是痛苦的)

name=”file”

所以说,名字很重要,真TMD的重要。

java部分

为了项目的结构好看,我将图片的路径按当前时间(yy-mm-dd)创建文件夹

File file =new File(path);
if(!file .exists()  && !file .isDirectory()){
    System.out.println("//不存在");
    file .mkdir();
}else{
    System.out.println("//目录存在");
}

获取当前项目根目录

String webBase = req.getSession().getServletContext().getRealPath(“/“); //获取项目根目录