swagger配置

1.maven依赖
(第一个后台/v2/api-do,第二个UI页面引用的jar包,版本2.6.1)
       <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.6.1</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.6.1</version>
        </dependency>
2.Swagger配置文件
@Configuration    // 配置注解,自动在本类上下文加载一些环境变量信息
@EnableSwagger2   // 使swagger2生效
@EnableWebMvc
@ComponentScan(basePackages = {“com.enation.app.javashop.xiaochengxu.action.api”})  //需要扫描的包路径
public class SwaggerConfig extends WebMvcConfigurationSupport {
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.SWAGGER_2)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}
3.web.xml配置说明
(说明:Springmvc前端控制器扫描路径增加“/v2/api-docs”,用于扫描Swagger的 /v2/api-docs,否则 /v2/api-docs无法生效,备注spring的映射一定要是/,否则swagger2中需要引入相关静态资源可能会因为找不到而导致页面加载失败。)
<servlet-mapping>
        <servlet-name>spring-servlet</servlet-name>
        <url-pattern>/swagger-resources</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>spring-servlet</servlet-name>
        <url-pattern>/v2/api-docs</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>spring-servlet</servlet-name>
        <url-pattern>/swagger-resources/configuration/ui</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>spring-servlet</servlet-name>
        <url-pattern>/swagger-resources/configuration/security</url-pattern>
    </servlet-mapping>
4.spring-mvc.xml 增加自动扫描Swagger
<!– 配置Swagger相关静态资源 –>
(Spring的url-pattern映射关系为 /:映射到classpath:/META-INF/resources/下的一个jar里面有swagger-ui.html,用于springmvc自动扫描那个模板和相关js)
<mvc:resources location=”classpath:/META-INF/resources/” mapping=”swagger-ui.html”/>
    <mvc:resources location=”classpath:/META-INF/resources/webjars/” mapping=”/webjars/**”/>
5.freemarker拦截的处理办法
// 前台处理器
 if (uri.endsWith(“.html”) && !(uri.indexOf(“swagger”) >= 0)){
        eopProcessor = new FacadeProcessor();
 }
6.Controller中使用注解添加API文档
@RestController
@RequestMapping(“/api/xcx/adv”)
@Api(description = “获取首页广告接口”)
@Validated
public class AdvApiController {
@Autowired
private IAdvManager advManager;@ApiOperation(value = “根据某个广告id获取广告信息接口”, notes = “根据某个广告id获取广告信息”)
@ApiImplicitParams({ @ApiImplicitParam(name = “advid”, value = “广告id”, required = true, paramType = “path”, dataType = “Long”), })
@RequestMapping(value = “/{advid}”, method = RequestMethod.GET)
public Adv detail(@PathVariable Long advid) {return this.advManager.getAdvDetail(advid);

}

}

sql server 注意事项(二)

sql server与mysql最主要的区别是 sql server对sql的语法要求非常严格 ,而mysql对sql的语法容错较好。

因此当我们在写一些包含分组(group by)的语句时 ,select 后面的字段 必须包含在group by子句或者聚合函数中.

select * from es_order group by member_id;

在mysql中可以正确执行;而在sqlserver中,则会报错:

因此我们在写sql语句时,为了更好的兼容性,一定要写的严谨一些;而多数情况下,不兼容多是因为sql语句不够严禁造成的。

另外,mysql、oracle、sqlserver不兼容也有可能是各自的内置函数不同导致,例如:

mysql和oracle共同支持instr()函数,而sqlserver不支持此方法,如果需要使用按指定字段、指定顺序排序的话,则需要使用charindex函数

服务器tomcat自动停止问题

Linux下面有个机制叫OOM killer(Out Of Memory killer,这个东西会在系统内存耗尽或者即将耗尽的情况下跳出来执行,选择性的干掉一些进程以求释放一些内存。

可能会出现的问题就是,某天tomcat无缘无故停掉了,或者是 某天机器突然登不上了,能ping通,但是ssh死活连不了。原因是tomcat/sshd进程被OOM killer干掉了。在系统的日志中通常会有下面的打印日志:Out of memory: kill process 959 (sshd) score 55 or a child。 

1.       OOM什么时候出现?

我们在用户空间申请内存时,一般使用的是malloc,是不是当malloc返回为空时,没有可以申请的内存空间了就会返回呢?答案是否定的。在关于malloc的申请内存的机制中有下面的一段描述:

By default, Linux follows an optimistic memory allocation strategy. This means that when malloc() returns non-NULL there is no guarantee that the memory really is available. This is a really bad bug. In case it turns out that the system is out of memory, one or more processes will be killed by the infamous OOM killer. In case Linux is employed under circumstances where it would be less desirable to suddenly lose some randomly picked processes, and moreover the kernel version is sufficiently recent, one can switch off this overcommitting behavior using a command like:

上面的描述中说明了在Linux中当malloc返回的是非空时,并不代表有可以使用的内存空间。Linux系统允许程序申请比系统可用内存更多的内存空间,这个特性叫做overcommit特性,这样做可能是为了系统的优化,因为不是所有的程序申请了内存就会立刻使用,当真正的使用时,系统可能已经回收了一下内存。但是,当你使用时Linux系统没有内存可以使用时,OOM Killer就会出来让一些进程退出。

Linux下有3种Overcommit的策略(参考内核文档:vm/overcommit-accounting),可以在/proc/sys/vm/overcommit_memory配置(取0,1和2三个值,默认是0)。

(1)0:启发式策略,比较严重的Overcommit将不能得逞,比如你突然申请了128TB的内存。而轻微的overcommit将被允许。另外,root能Overcommit的值比普通用户要稍微多

(2)永远允许overcommit,这种策略适合那些不能承受内存分配失败的应用,比如某些科学计算应用。

(3)永远禁止overcommit,在这个情况下,系统所能分配的内存不会超过swap+RAM*系数(/proc/sys/vm/overcmmit_ratio,默认50%,你可以调整),如果这么多资源已经用光,那么后面任何尝试申请内存的行为都会返回错误,这通常意味着此时没法运行任何新程序。

/proc/sys/vm # cat overcommit_ratio

50

当然我可以修改proc//oom_adj的值,这里的默认值为0,当我们设置为-17时,对于该进程来说,就不会触发OOM机制,被杀掉。

echo -17 > /proc/$(pidof sshd)/oom_adj

这里为什么是-17呢?这和Linux的实现有关系。在Linux内核中的oom.h文件中,可以看到下面的定义:

/* /proc//oom_adj set to -17 protects from the oom-killer */

#define OOM_DISABLE (-17)

/* inclusive */

#define OOM_ADJUST_MIN (-16)

#define OOM_ADJUST_MAX 15

这个oom_adj中的变量的范围为15到-16之间。越大越容易被kill。oom_score就是它计算出来的一个值,就是根据这个值来选择哪些进程被kill掉的。

总之,通过上面的分析可知,满足下面的条件后,就是启动OOM机制。

1) VM里面分配不出更多的page(注意linux kernel是延迟分配page策略,及用到的时候才alloc;所以malloc + memset才有效)。

2) 用户地址空间不足,这种情况在32bit机器上及user space超过了3GB,在64bit机器上不太可能发生。

2     当该机制被触发后,会让什么样的进程退出?

只要存在overcommit,就可能会有OOM killer。 Linux系统的选择策略也一直在不断的演化。我们可以通过设置一些值来影响OOM killer做出决策。Linux下每个进程都有个OOM权重,在/proc//oom_adj里面,取值是-17到+15,取值越高,越容易被干掉。  最终OOM killer是通过/proc//oom_score这个值来决定哪个进程被干掉的。这个值是系统综合进程的内存消耗量、CPU时间(utime + stime)、存活时间(uptime – start time)和oom_adj计算出的,消耗内存越多分越高,存活时间越长分越低。总之,总的策略是:损失最少的工作,释放最大的内存同时不伤及无辜的用了很大内存的进程,并且杀掉的进程数尽量少。  另外,Linux在计算进程的内存消耗的时候,会将子进程所耗内存的一半同时算到父进程中。

最后还是说一下使用需要注意的事项:

1、内存首先要足够基本进程的正常运行,以防被无缘无故kill

2、要对tomcat的设置进行优化,尤其是对内存的控制

javashop v6.2 或将移除组件的component.xml文件,采用注解代替

链接

注解说明:移步 == 》 http://www.javamall.com.cn/blog/archives/311

首先说明一下已有组件的原理:

❤️在系统启动,spring加载时,我们判定一个即将实例化到spring容器中的对象否实现组件接口,如果实现则将其写入组件上下文(ComponentContext)的静态变量集合中,并且加载component.xml文件,生成ComponentView(组件视图)和PluginVIew(插件视图)

❤️自定义的监听器(EopContextLoaderListener)执行时,启动组件。根据ComponentView和PluginView正确生成可以正确调用插件的插件桩

修改后的逻辑

❤️在系统启动,spring加载时,我们判定一个即将实例化到spring容器中的对象否实现特定接口,如果实现 组件借口(IComponent) 则将其写入组件上下文(ComponentContext)的静态变量集合中,如果实现了插件接口(IPlugin)则将其写入插件上下文(PluginContext)

❤️自定义的监听器(EopContextLoaderListener)执行时,获取组件上下文中所有的组件,循环遍历从插件上下文中获取到组件对应的插件集合,根据每个组件和插件的注解,映射出正确的ComponentView(组件视图)和PluginVIew(插件视图)。随后,启动组件,根据ComponentView和PluginView正确生成可以正确调用插件的插件桩。

注解类讲解:

插件注解

CustomPlugin(自定义插件注解)

 插件名称 public String name() default “默认插件”;

 组件 public String component() default “组件id”;

 插件 public String plugin() default “插件id”; 

 执行优先级(保留字段 控制执行顺序) public int sort() default 10;

  插件桩集合 public String[] bundle() default “”;

CustomComponent(自定义组件注解)

 组件名称 public String name() default “默认组件”;

 组件id public String beanid() default “”;

 版本 public String version() default “1.0″;

 javashop版本 public String javashop_version() default “3.0.0″;

 作者 public String author() default “javashop”; 

描述 public String description() default “默认描述”;

属性字段基本和component.xml的配置具体参数没什么区别, 所以修改为注解的形式没有大的改动,只是更改了生成 ComponentView和PluginView的方式。

注解使用

在组件插件具体的类上,声明注解即可。

以上是对注解方式的组件的具体使用解释,接下来讲解连带的其它变更

1、组件加载

ComponentLoader(组件加载)在bean实例化之前的方法中,加入了插件上下文(PluginContext)的注册。

新增的插件上下文主要包含一个静态Map类型,key存组件的beanid,value存该组件的插件集合。

2、组件注册

ComponentContext(组件上下文)的注册组件方法中原本加载组件视图的方法被移除

3、组件启动

EopContextLoadListener(Eop上下文启动监听器)中,组件启动前,获取组件上下文中所有的组件视图,然后执行组件加载视图方法。(也就是在组件注册时的方法被延后执行)

随后执行原本的组件启动方法。

*********************************************主要修改部分************************************************

ComponentContext组件上下文核心方法loadComponent修改,为了兼容老版本的组件机制,这里对Bean是否声明了组件注解进行判定:

如果没有声明,那么按照传统的方法获取component.xml生成组件插件视图。

如果有声明,则获取注解信息进行组件和插件视图的生成。

*********************************************************************************************************

为什么组件机制使用注解实现

spring用注解的方式来管理容器中bean的关系,是所有人看的到到优点,使用注解之前,采用在xml中配置文件的繁琐程度不言而喻。使用注解唯一的缺点不外乎是管理松散,不能概括的了解组件、插件和插件桩的关系。但是只要项目结构足够合理,我相信这个问题是可以避免的。

抛开这些不说,作为一个程序员,喜欢看起来可以装X的代码,抛弃xml配置文件才用注解在个人看来是一个提升逼格的方法。哈哈哈哈

javashop 图片缩放浏览插件使用指南

一、概述

Javashop 图片缩放浏览插件是一款基于jquery插件的图片浏览插件。

可用于一张、一组或多组的图片进行缩放浏览,有如下特点:

  • 基于jquery插件的风格,只需引入一个插件脚本,其它不用关心,生成方便灵活
  • 提供丰富配置参数

效果预览:

二、使用说明

  1. 首先需要在相应的html页面引入js和css文件,如下图:
  2. 接下来用<a></a>标签包住要浏览的图片,并向<a>标签添加data-lightbox=”自定义”属性或rel=”lightbox[自定义]“属性,如下图:
  3. 如果是图片组,也是按上述步骤进行,只是需要注意的是,如果是多个图片组,我们需要保证同组的图片的所有<a>标签的data-lightbox=”自定义”属性或rel=”lightbox[自定义]“属性的自定义部分相同并和其他图片的中的不同,这样是保证在进行图片缩放浏览时可以一组一组的进行浏览。如下图:
  4. 参数配置。所有的参数组都不是必须设置的,它们都有默认值,可以根据不同的需求来进行设置:
  • albumLabel:设置显示的图片文本内容
  • alwaysShowNavOnTouchDevices:在使用支持触摸设备查看图片时(手机、iPad等),如果设置为true,也会显示左右翻页的导航箭头,默认false
  • fadeDuration:图片缩放淡出和淡入的时间,以毫秒为单位,默认500
  • fitImagesInViewport:如果设置为true,图片缩放就会基于maxWidth和maxHeight来进行缩放,否则就会按照图片原始比例进行缩放
  • maxWidth:设置显示图片弹出框的最大宽度(图片会基于此宽度按比例缩放),默认为图片原始宽度
  • maxHeight:设置显示图片弹出框的最大高度(图片会基于此高度按比例缩放),默认为图片原始高度
  • positionFromTop:设置图片缩放弹出框到屏幕顶部的距离,默认为50
  • resizeDuration:设置图片显示的加载时间(毫秒),默认为700
  • showImageNumberLabel:设置是否显示图片文本内容,默认为true
  • wrapAround:设置是否可以循环查看图片,默认为false
  • disableScrolling:禁止图片浏览框随页面上下左右滚动,true为禁止,默认为false
  • 如下图:

Javashop 图片上传插件使用指南

一、概述

Javashop 图片上传插件是一款基于WebUploader插件所封装的上传图片插件。

可用于快速生成上传图片页面,有如下特点:

  •  基于freemarker指令模式所编写,只需一个指令,并且添加相关的配置,其它不用关心,生成方便灵活
  • 多配置,灵活性较高
  • 支持拖拽排序,操作体验提升

效果预览

二、使用说明

上传图片插件会使用ajax上传图片,上传图片后生成一个的input。剩下就可以按照你自己的业务逻辑进行处理。

1.基本使用指南

1. freemarker指令,写在你想生成的html的位置

<@imageuploader/>

2. 配置

参数说明:

imageName   :   【必填】生成input的name

subFolder   :   【必填】服务器存放目录

showImgs :   【必填,数组】已有的图片作为显示用的比如www.a.com/a.png.  没有其他作用

actualImgs : 【必填,数组】已有图片实际的值,这个看你自己的逻辑,会生成input提交

fileNumLimit : 【选填】限制上传数量,不填默认20个

按照以上配置后,即可实现上传图片功能。

注:暂不支持一个页面多个上传图片空间,1.1版本考虑支持

Javashop Tab页jQuery插件使用指南

一、概述

Javashop Tab页jQuery插件是一款基于jquery插件的Tab页生成器。

可用于快速生成Tab页面,有如下特点:

  •  基于jquery插件的风格,只需引入一个插件脚本和按照规格格式编写HTML,其它不用关心,生成方便灵活
  •  同个页面可生成多个Tab页,互不干扰

效果预览

 

 

二、使用说明

1.基本使用指南

1.引入选器插件:

<script type="text/javascript" 
src="/adminthemes/new/js/jquery.Tab.js"></script>

2.编写HTML:

<div id="test_tab" style="margin:20px;">
    <div class="contentTab">
        <ul class="tab">
            <li tabid="one" class="active" >第一</li>
            <li tabid="two" >第二</li>
        </ul>
    </div>

    <div class="tab-page">
        <div tabid="one" class="tab-panel" >
            <h1>我是第一个内容</h1>
        </div>
        <div tabid="two" class="tab-panel" style="display: none;" >
             <h1>我是第二个内容</h1>
        </div>
    </div>
</div>

这里需要注意的是,这个HTML格式并不是全部规定死的。只要有ul 和 class为tab-page的div,其他元素可随意增加,样式随意写。

3.调用插件生成选择器(选择需要悬浮的元素)

<script type="text/javascript">

$(function(){

    $("#test_tab").Tab();

});

</script>

如上代码在id为test_tab的div中实现了tab页。

Javashop 自动悬浮jQuery插件使用指南

一、概述

Javashop 自动悬浮jQuery插件是一款基于jquery插件的自动悬浮器。可在元素不在可视范围内时自动悬浮到页面底部。

可用于快速自动悬浮元素,有如下特点:

  •  基于jquery插件的风格,只需引入一个插件脚本,其它不用关心,生成方便灵活
  •  同个页面悬浮多个元素,互不干扰

效果预览

图1: 测试div不在可视范围内,自动悬浮到浏览器底部。

图2:测试div初始位置已在可视范围内,则显示它,不悬浮。

二、使用说明

1.基本使用指南

1.引入选器插件:

<script type="text/javascript" 
src="/themes/b2b2cv2/js/jquery.autoFloat.js"></script>

2.调用插件生成选择器(选择需要悬浮的元素)

<script type="text/javascript">

$(function(){

    $("xxx").autoFloat();

});

</script>

如上代码已实现元素自动悬浮。

Javashop 商品选择器jquery插件使用指南

一、概述

Javashop 商品选择器jquery插件是一款基于jquery插件的商品选择器,目前1.0的版本基于easyui,适用于javashop 5.2及以上版本。

可用于在后台快速生成一个或多个商品选择器,有如下特点:

  •  基于jquery插件的风格,只需引入一个插件脚本,其它不用关心,生成方便灵活
  •  同个页面可生成多个选择器,互相不干扰
  • 提供丰富配置参数和接口,可插入多样的业务中

效果预览

二、使用说明

1.基本使用指南

1.引入选器插件:

<script type="text/javascript" src="/shop/admin/js/jquery.goodsSelector.js"> </script>

2.声明需要生成选器的元素(同时也指定了要在哪生成)

<div class="floor_goods"></div>

3.调用插件生成选择器

<script type="text/javascript">

$(function(){

$(".floor_goods").goodsSelector();

});

</script>

如上代码但在样式为floor_goods的div中生成了商品选择器。

上述情况一般用于添加页面,也就是还没有已经选商品。

可以指定selected_data_url参数,即:当前已选中的商品grid的json地址。

<script type="text/javascript">

$(function(){

var options ={

selected_data_url:ctx+'/shop/admin/floorGoods!listGoodsJson.do?floorid=1'

}

$(".floor_goods").goodsSelector(options);

});

</script>

也就是你的业务中已经选中商品的json 地址,其格式为easyui的grid json格式,举例如下:

{“total”:2,”rows”:[
{"goods_id":285,"sn":"201511243123","name":"xxxx","price":300,"store":444},{"goods_id":284,"sn":"2015112400656","name":"xxx","price":270,"store":666}]}
一般用于修改页面

2.参数说明

  可选参数

  •  selected_data_url:

指定已经选中的grid的商品数据json URL

  •   selector_data_url

选器商品Grid的商品数据 json url,默认为:/shop/admin/goodsSelect!listGoodsById.do

  •  select_btn_text: 选择按钮的文字
  •  un_select_btn_text:取消选择按钮的文字
  •  selected_text:已选中的文字
  • goodsid_name:向后台post的商品id名字,默认为:goods_id_array

特别请注意goodsid_name的参数,此参数是向后台提交的已经选中的商品id的数组的name,是一组hidden的name,在默认时此hidden的name为goods_id_array,此时post的参数效果为:

我们更改goodsid_name参数,例如:

var options ={

selected_data_url:ctx+'/shop/admin/floorGoods!listGoodsJson.do?floorid=1'
,goodsid_name:'myname'
}

$(".floor_goods").goodsSelector(options);
此时post参数的效果为:

memcached集群配置文档

一、 Memcached的安装
1. linux下memchached的安装,请参考网络
2. windows下memcahced的安装:
在命令行中进入memcached目录,执行以下命令
memcached.exe –d install
memcached.exe –d start

二、 将lib目录中所有Jar复制到tomcat/lib目录
三、 配置虚拟目录:
<Context  path=”/”

docBase=”Z:/workspace/runtime/v4/wtpwebapps/javamall” debug=”0″>

<Manager className=”de.javakaffee.web.msm.MemcachedBackupSessionManager”

memcachedNodes=”n1:localhost:11211″

sticky=”false”

sessionBackupAsync=”false”

lockingMode=”auto”

requestUriIgnorePattern=”.*\.(ico|png|gif|jpg|css|js)$”

transcoderFactoryClass=”de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory”  />

</Context>

其中红色部分是需要改为你本地相应的javashop应用所在路径和memcached服务器地址,如果是本地则为localhost,如果是其它服务器请写ip

本配置是用的kryo做为序列化,其它配置可参考

https://code.google.com/p/memcached-session-manager/wiki/SetupAndConfiguration

 

文档所需jar及memcached 的windows版本请至这里下载:

http://pan.baidu.com/s/1qWzAl8w
——————————————————————————————————–
javashop-迄今为止国内最好的Java网店系统
基于Spring3 + Struts2 +Freemarker框架
丰富的API、插件式架构极容易的二次开发
丰富的API、组件式架构、丰富的标签库,快速打造精美模板

有单用户商城和多用户商城两个版本,欢迎试用:

—————单店系统—————–
前台:

http://www.javamall.com.cn/version4/

后台:

http://www.javamall.com.cn/version4/admin

用户名和密码都是admin
—————————————

—————多用户商城系统———————
前台:

http://www.javamall.com.cn/b2b2c/index.html

后台:

http://www.javamall.com.cn/b2b2c/admin

用户名和密码都是admin
—————————————————

javashop做最好的Java网店系统

Java b2b2c系统

Java 多用户商城

Java 多店铺商城

Java 多店铺系统

Java CMS系统

Java O2O系统

Java 商城APP

官网请访问:www.javamall.com.cn