常用技术

Activiti工作流

Activiti5框架说明:     

Activiti5工作流引擎框架: 它实际上是一个javaEE的半成品项目(企业一般用它来做二次开发).

-- dao层.

-- service层.

-- 它有数据库表(24表). Activiti5.18 (2015.7.31)

-- Activiti5底层用得持久层框架是MyBatis3,

它有自己的数据库表,提供了七个核心业务服务类.

Activiti5工作流引擎下载与安装:

-- 它的官方网站:http://www.activiti.org

-- 下载: activiti-5.18.0.zip(2015.7.31)

-- 解压:

database : (数据库相关)存放了Activiti框架的sql语句.

docs: api文档、用户指南、xsd

libs: 存放了自己所有的jar.

wars: web应用.

-- 离线安装:

装备好activiti-designer插件安装包拷贝到eclipse安装目录dropins下.

eclipse\dropins\activiti-plugin

安装数据库表:

第一种方式:(通过sql语句)

-- mysql(版本5.5以下)activiti-5.18.0\database\create\:

-- activiti.mysql.create.engine.sql

-- activiti.mysql.create.history.sql

-- activiti.mysql.create.identity.sql

-- mysql(版本5.5或以上)

-- activiti.mysql55.create.engine.sql

-- activiti.mysql55.create.history.sql

-- activiti.mysql.create.identity.sql

第二种方式:编程方式(硬编码方式)

-- 拷贝jar(required文件夹中所有的jar).

-- 编程步骤:

第一步:创建流程引擎配置信息对象(ProcessEngineConfiguration).

/** 创建流程引擎配置信息对象 */

ProcessEngineConfiguration pec = ProcessEngineConfiguration

.createStandaloneProcessEngineConfiguration();

/**############# 为流程引擎配置信息对象设置信息  ##############*/

/** 设置数据库的类型 */

pec.setDatabaseType("mysql");

/**

* 设置创建数据库表的方式

* ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE (true): 如果没有数据库表就会创建数据库表,有的话会修改表结构

* ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE (false): 不会创建数据库表.

* ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP (create-drop): 先创建数据库表,再删除表

* */

pec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);

/** 设置数据库驱动 */

pec.setJdbcDriver("com.mysql.jdbc.Driver");

/** 设置连接数据库URL */

pec.setJdbcUrl("jdbc:mysql://localhost:3306/activiti?useUnicode=true&characterEncoding=utf-8");

/** 设置连接数据库用户名 */

pec.setJdbcUsername("root");

/** 设置连接数据库密码 */

pec.setJdbcPassword("root");

第二步:创建流程引擎(ProcessEngine).

ProcessEngine pe = pec.buildProcessEngine();

Activity工作流表说明(重点)

-- activiti5.18 : 24表.

表的设计:项目名_模块名_持久化类名(hibernate|jpa).

a. act_ge_*(activiti_general_*): 2张表.

-- 全局通用数据.

对应获取:RepositoryService仓储服务

b. act_hi_*(activiti_history_*): 8张表.

-- ‘HI‘ 历史的数据: 过期流程实例, 过期流程变量, 过期任务等.

对应获取: HistoryService 历史服务

c. act_id_*(activiti_identity_*): 4张表.

-- ‘ID‘ 权限管理数据:用户、组等.

对应获取: IdentityService权限服务

d. act_re_*(activiti_repository_*): 3张表.

-- ‘RE‘ 仓储数据: 流程定义、流程资源信息 (如图片资源、规则等).

对应获取:RepositoryService仓储服务.

e. act_ru_*(activiti_runtime_*): 6张表.

-- ‘RU‘ 运行过程中的流程数据:流程实例、用户任务、流程变量、调度任务等.

对应获取:RuntimeService运行服务

f. act_evt_log(activiti_event_logging) : 1张表.

核心api说明:

ProcessEngineConfiguration.流程引擎配置信息类.

属性的设置、构建流程引擎.

ProcessEngine: 流程引擎.

获取七个业务处理类.

1. RepositoryService仓储服务:

对应表:act_re_*、act_ge_*

2. RuntimeService运行时服务

对应表:act_ru_*

3. TaskService任务服务

对应表:act_ru_*

4. FormService表单服务

5. IdentityService身份服务

对应表:act_id_*

6. HistoryService历史服务

对应表:act_hi_*

7. ManagementService管理服务.

对应表:act_id_*、act_evt_log

主要方法查询APi

Maven

Maven简介

  • 下载网址

–      http://maven.apache.org/download.cgi

–      下载版本 3.2.3 (最新:3.3.9)

l  Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具

l  Maven是一个项目管理工具,它包含:

l  一个项目对象模型 (Project Object Model)

l  一组标准集合

l  一个项目生命周期(Project Lifecycle)

清理、编译、测试、报告、打包、部署

l  一个依赖管理系统(Dependency Management System)

使用前提:

当通过配置文件确定依赖关系之后,maven将自动从指定的位置(互联网)下载需要项目(jar包)。第一次使用maven,需要联网。

思想:

约定优于配置的思想

Maven提供相应的插件完成以上流程,上面对应的每个都是插件。

Maven安装

配置 MAVEN_HOME = maven压缩包解压目录(必须放在JAVA_HOME后面)

在path环境变量中 增加 %MAVEN_HOME%\bin

在cmd窗口测试  mvn –v 显示如下就成功

配置本地仓库

打开maven解压目录进入conf文件夹F:\apache-maven-3.2.3\conf

打开setting.xml配置文件修改(输入需要存放的本地仓库)

setting.xml中可以设置的属性

l  <localRepository> 配置本地仓库的目录

l  <interactiveMode>是否需要和用户交互以获得输入。如果Maven需要和用户交互以获得输入,则设置成true,反之则应为false。默认为true

l  <offline> 是否需要在离线模式下运行

l  <pluginGroups> 插件组。默认情况下该列表包含了org.apache.maven.plugins

l  <proxies>通过代理访问外部库

l  <servers> 配置服务端的设置。例如:安全认证

l  <mirrors> 镜像库。确定使用的仓库

l  <profiles> 根据环境参数来调整构建配置的列表。为pom.xml的profile简化版。需要激活才可生效

l  <activeProfiles>手动激活profiles的列表

注意:必须与<profile><id>名称一致

Maven常用指令:

在eclipse中可以省略mvn不写

在cmd下使用命令,必须在项目的根下进行的,及可以看到pom.xml

l  编译

n  mvn compile

l  测试

n  mvn test  //运行测试、mvn test -Dtest=${类名} //单独运行测试类

l  清除

n  mvn clean  //将清除原来编译的结果

l  打包

n  mvn package、mvn package –Dmaven.test.skip=true //打包时不执行测试

l  安装发布

n  mvn install //将项目打包成构件安装到本地仓库

n  mvn deploy  //发布到本地仓库或服务器(例如Tomcat、Jboss)

其它命令:

转换Eclipse工程 (在pom.xml目录执行)

mvn eclipse:eclipse

mvn eclipse:clean  //清除Eclipse设置信息

转换成IDEA 工程(在pom.xml目录执行)

mvn idea:idea

mvn idea:clean //清除idea设置信息

显示一个插件的详细信息(configuration, goals等):

mvn help:describe -Dplugin=pluginName -Ddetail

注意点:

1:第一次使用指令需要联网下载插件

2:想部署到服务器上,必须先运行命令mvn install安装到本地仓库

Maven声明周期

  • validate
  • generate-sources
  • process-sources
  • generate-resources
  • process-resources     复制并处理资源文件,至目标目录,准备打包。
  • compile     编译项目的源代码。
  • process-classes
  • generate-test-sources
  • process-test-sources
  • generate-test-resources
  • process-test-resources     复制并处理资源文件,至目标测试目录。
  • test-compile     编译测试源代码。
  • process-test-classes
  • test     使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。
  • prepare-package
  • package     接受编译好的代码,打包成可发布的格式,如 JAR 。
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install     将包安装至本地仓库,以让其它项目依赖。
  • deploy     将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

生命周期从上往下执行,到执行到指定生命周期时,前面自动完成。

pom.xml文件解析(重点)

coordinates-坐标

在仓库中唯一标识项目位置三个参数

<groupId> 组

<artifactId> 标识

<version>  版本号

如下:

<groupId>cn.itcast.parent</groupId>

<artifactId>parent</artifactId>

<version>0.0.1-SNAPSHOT</version>

示例:仓库\cn\itcast\maven\demojava\0.0.1-SNAPSHOT

dependencies-依赖

依赖具有传递性

一个项目依赖在编译或运行等阶段另一个项目

1:可以右键maven-add dependency输入需要的jar包复制坐标进行添加

2:可以进入http://www.mvnrepository.com/artifact/org.springframework/spring-core网站查找坐标

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>${junit.version}</version>

<scope>test</scope>

</dependency>

<!-- 6 json lib -->

<dependency>

<groupId>net.sf.json-lib</groupId>

<artifactId>json-lib</artifactId>

<version>${json-lib.version}</version>

<classifier>jdk15</classifier>

</dependency>

</dependencies>

scope-依赖范围

compile:编译范围,默认scope,在classpath中存在

provided:已提供范围,比如容器提供Servlet API

runtime:运行时范围,编译不需要,接口与实现分离

test:测试范围,单元测试环境需要

system:系统范围,自定义构件,指定systemPath

依赖冲突:

如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准(就近原则)

如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准(就近原则)

依赖排除:

点击eclipse下方窗口Declaration

Aggregation-聚合

将项目分解为多个不同模块,快速构建项目

运行结果:

inheritance-继承

都具有这个属性:

<parent>

<groupId>cn.itcast.parent</groupId>

<artifactId>parent</artifactId>

<version>0.0.1-SNAPSHOT</version>

</parent>

模块:将一个项目拆分成多个子项目。

继承:子项目与父项目之间关系。

项目之间继承,实现POM复用,依赖管理,锁定版本号

父类maven项目:

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${spring.version}</version>

</dependency>

</dependencies>

</dependencyManagement>

子类maven项目(继承了父类):写下父类的坐标

<parent>

<groupId>cn.itcast.parent</groupId>

<artifactId>parent</artifactId>

<version>0.0.1-SNAPSHOT</version>

</parent>

然后在依赖中可以不指定与父类同jar包的版本

<dependencies>

<!-- 1.1 spring context -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

</dependency>

</dependencies>

Pom.xml核心配置

  • pom.xml是Maven项目的核心配置文件,位于每个工程的根目录,指示Maven工作的元数据文件
  • <project > :文件的根节点 .

    <modelversion > :
    pom.xml使用的对象模型版本
    .

    <groupId > :创建项目的组织或团体的唯一 Id.

    <artifactId > :项目的唯一 Id, 可视为项目名 .

    <version > :产品的版本号 .

<packaging > :打包类型,一般有jar、war、pom 等

<name > :项目的显示名,常用于
Maven 生成的文档。

<description > :项目描述,常用于 Maven
生成的文档

常见maven错误

启动服务器报错

Artifact Project3:war exploded: Error
during artifact deployment. See server log for details

依赖了多个maven
jar
包冲突

需要在依赖中排除:

典型:极光推送

<dependency>

<groupId>cn.jpush.api</groupId>

<artifactId>jpush-client</artifactId>

<version>3.2.11</version>

<exclusions>

<exclusion>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-release-plugin</artifactId>

</exclusion>

</exclusions>

</dependency>

Maven打包方式

<build>

<finalName>bg-platform-web</finalName>

<outputDirectory>${basedir}/src/main/webapp/WEB-INF/classes</outputDirectory>

<plugins>

<!-- 打包插件 -->

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-jar-plugin</artifactId>

<version>2.5</version>

</plugin>

<!-- 编译插件 -->

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.2</version>

<configuration>

<source>${java.version}</source>

<target>${java.version}</target>

</configuration>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-dependency-plugin</artifactId>

<version>2.9</version>

<executions>

<execution>

<id>copy</id>

<phase>package</phase>

<goals>

<goal>copy-dependencies</goal>

</goals>

<configuration>

<outputDirectory>${project.build.directory}/lib</outputDirectory>

</configuration>

</execution>

</executions>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-antrun-plugin</artifactId>

<executions>

<execution>

<id>pushPackage</id>

<phase>run</phase>

<configuration>

<target name="push service">

<!--<echo
message="${basedir}" />-->

<copy todir="${project.build.directory}/classes">

<fileset dir="${basedir}/src/main/webapp/WEB-INF/classes">

<include name="**/*" />

</fileset>

</copy>

<!-- 打整个程序运行包 -->

<copy todir="${project.build.directory}/release/config">

<fileset dir="${project.build.directory}/classes">

<include name="*.*"/>

<include name="mappers/*.xml"/>

</fileset>

</copy>

<copy todir="${project.build.directory}/release/lib">

<fileset dir="${project.build.directory}/lib"
/>

</copy>

<pathconvert pathsep=" " property="mf.classpath">

<chainedmapper>

<flattenmapper />

<globmapper
from="*" to="lib/*" />

</chainedmapper>

<path id="classpath">

<fileset dir="${project.build.directory}/release/lib">

<include
name="**/*" />

</fileset>

</path>

</pathconvert>

<!--打包推送服务-->

<jar

destfile="${project.build.directory}/release/bagtree-push-${project.version}.jar"

basedir="${project.build.directory}/classes">

<include name="com/bagtree/common/**"/>

<include name="com/bagtree/push/**"/>

<include name="com/bagtree/sms/**"/>

<include name="com/bagtree/mapper/**"/>

<include name="com/bagtree/model/**"/>

<include name="com/bagtree/service/**"/>

<include name="com/bagtree/vo/**"/>

<manifest>

<attribute name="Built-By" value="${user.name}" />

<attribute name="Main-Class"

value="com.bagtree.push.Main" />

<attribute name="Class-Path" value="config/ . ${mf.classpath}" />

</manifest>

<metainf dir="${project.build.directory}/classes">

<include name="spring/*" />

<include name="mappers/*" />

</metainf>

</jar>

<!--启动sms线程-->

<jar

destfile="${project.build.directory}/release/bagtree-start-${project.version}.jar"

basedir="${project.build.directory}/classes">

<include name="com/bagtree/common/**"/>

<include name="com/bagtree/send/**"/>

<include name="com/bagtree/sms/**"/>

<include name="com/bagtree/mapper/**"/>

<include name="com/bagtree/model/**"/>

<include name="com/bagtree/service/**"/>

<include name="com/bagtree/vo/**"/>

<manifest>

<attribute name="Built-By" value="${user.name}" />

<attribute name="Main-Class"

value="com.bagtree.send.Main" />

<attribute name="Class-Path" value="config/ . ${mf.classpath}" />

</manifest>

<metainf dir="${project.build.directory}/classes">

<include name="spring/*" />

<include name="mappers/*" />

</metainf>

</jar>

</target>

</configuration>

<goals>

<goal>run</goal>

</goals>

</execution>

</executions>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-resources-plugin</artifactId>

<version>2.7</version>

<configuration>

<encoding>UTF-8</encoding>

</configuration>

</plugin>

<!-- 单元测试插件 -->

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-surefire-plugin</artifactId>

<version>2.18.1</version>

<configuration>

<argLine>-Dfile.encoding=UTF-8</argLine>

<skipTests>true</skipTests>

</configuration>

</plugin>

<!-- 源码插件 发布时自动将源码同时发布的配置 -->

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-source-plugin</artifactId>

<version>2.4</version>

<executions>

<execution>

<phase>package</phase>

<goals>

<goal>jar-no-fork</goal>

</goals>

</execution>

</executions>

</plugin>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-antrun-plugin</artifactId>

<version>1.8</version>

</plugin>

<plugin>

<groupId>org.eclipse.jetty</groupId>

<artifactId>jetty-maven-plugin</artifactId>

<version>9.3.8.v20160314</version>

<configuration>

<webApp>

<contextPath>/</contextPath>

<defaultsDescriptor>${basedir}/src/main/webapp/WEB-INF/lib/webdefault.xml</defaultsDescriptor>

</webApp>

<webAppSourceDirectory>src/main/webapp</webAppSourceDirectory>

<stopKey>stop</stopKey>

<stopPort>8089</stopPort>

</configuration>

</plugin>

<plugin>

<groupId>com.evergrande.mybatis.generator</groupId>

<artifactId>mybatis-generator-maven-plugin</artifactId>

<version>1.3.2.1-SNAPSHOT</version>

<configuration>

<configurationFile>${basedir}/src/main/resources/mybatis-generator/generatorConfig.xml</configurationFile>

<verbose>true</verbose>

<overwrite>true</overwrite>

</configuration>

<executions>

<!-- mvn mybatis-generator:generate -e
-->

<execution>

<id>Generate MyBatis Artifacts</id>

<phase>generate</phase>

<goals>

<goal>generate</goal>

</goals>

</execution>

</executions>

<dependencies>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>${mysqlcj.version}</version>

</dependency>

</dependencies>

</plugin>

</plugins>

</build>

<packaging>war</packaging>

Redis缓存

Redis使用命令查询地址http://redis.readthedocs.io/en/2.4/index.html

Redis常用的命令

判断是否存在key: exists

Boolean exists = jedis.exists(serializeKey(key));

模糊查询keys(需要模糊查询的值打*号)

jedis.keys("SE_push_*_"+key);

map集合类型存放hset

jedis.hset(serializeKey(key),serializeValue(ltUser),serializeValue(ltPass));

map集合类型取值:hget

byte[]
value = jedis.hget(serializeKey(key), field.getBytes());

Redis特殊用处场景

Redis队列

入队列:lpush

jedis.lpush(serializeKey(key), serializeValue(value));

出队列:brpop

List<byte[]>
list = jedis.brpop(0,serializeKey(key));

两个出队列:

List<byte[]>
list = jedis.brpop(0,serializeKey(key),serializeKey(key2));

Redis排名

添加有序元素:zadd
(value
为数值)

jedis.zadd(serializeKey(key),value,serializeValue(name));

返回指定key值有序排名:zrank

Long zrank = jedis.zrank(serializeKey(key), serializeValue(name));

返回指定集合的基数:zcard

Long zrank = jedis.zcard(serializeKey(key));

算出排名

System.out.println("超越了百分之几 "+(float) (名次)/(基数)*100);

IOS原生推送

Maven依赖:

<notnoop.version>1.0.0.Beta6</notnoop.version>

<dependency>

<groupId>com.notnoop.apns</groupId>

<artifactId>apns</artifactId>

<version>${notnoop.version}</version>

</dependency>

Ios原生推送主要配置:

1:APNS推送需要的证书

2:APNS证书密码

3:指定设备的token例如:4719f6c7 bb1839d7
d543fcd2 d1edba47 a283ea0f d73e9aba d40cb43b dcbe7129 长度固定

ApnsService service = APNS.newService().withCert(p12Path, IosPushPassWord).asPool(IosCapacity).withAppleDestination(IosProduction).build();

withCert() 需要开发者的证书与密码

asPool() 设置连接池

withAppleDestination() 是否为开发环境false可发送

最后以build()方法结尾

创建推送参数

PayloadBuilder payloadBuilder = APNS.newPayload();

设置推送标示符: (可以不设置)

customFields() //可以传入map集合

customField() //可以传入key value键值对

设置消息体:传入需要推送的消息

alertBody()

设置app右上角的数字消息数量:

badge()

设置推送消息的铃声:

sound()

发送消息:

service.push(pushToken, payload);

极光推送

Maven依赖:

注意:

极光推送maven依赖如果项目中引用了maven插件需要进行排除,否则项目启动将报错。

<dependency>

<groupId>cn.jpush.api</groupId>

<artifactId>jpush-client</artifactId>

<version>${jpush.version}</version>

<exclusions>

<exclusion>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-release-plugin</artifactId>

</exclusion>

</exclusions>

</dependency>

极光推送推送类配置

需要开发者账号的appKey
Secret

创建推送类

JPushClient jPushClient = new JPushClient(masterSecret,appKey);

发送消息:

PushResult result = jPushClient.sendPush(payload);

创建推送参数类

PushPayload payload = PushPayload.newBuilder()

设置推送平台:(例如推送给安卓个人用户,设置)

setPlatform(Platform.android_winphone())

设置推送对象:

setAudience(Audience.registrationId("100d8559094fbc0efd4"))

设置通知属性:

setNotification(Notification.newBuilder()
        .setAlert(notification)
        .addPlatformNotification(AndroidNotification.newBuilder()
                .setTitle(title).addExtras(null).build())
        .build())

推送消息内容: setAlert()

添加推送平台通知 例如:设置安卓平台AndroidNotification.newBuilder()

addPlatformNotification(AndroidNotification.newBuilder())

设置标题: setTitle()

添加推送标示符:addExtras() 可以放入map集合 addExtra() 可以放入key value键值对

注意:

推送的主方法中,一般以那个方法的名字开头例如:setNotification(Notification.newBuilder(),以build()方法为结尾。

kaptcha验证码生成

maven依赖

<!-- kaptcha验证码 -->

<dependency>

<groupId>com.github.axet</groupId>

<artifactId>kaptcha</artifactId>

<version>0.0.9</version>

</dependency>

或者(底下需要自己写)

  1. <dependency>
  2. <groupId>com.google.code.kaptcha</groupId>
  3. <artifactId>kaptcha</artifactId>
  4. <version>2.3.2</version>
  5. </dependency>

配置web.xml

上面说了,kaptcha都是在web.xml中配置,我们必须在web.xml中配置kaptcha的servlet,具体如下:

<servlet>

<servlet-name>kaptcha</servlet-name>

<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>

<init-param>

<param-name>kaptcha.border</param-name>

<param-value>no</param-value>

</init-param>

<init-param>

<param-name>kaptcha.border.color</param-name>

<param-value>105,179,90</param-value>

</init-param>

<init-param>

<param-name>kaptcha.textproducer.font.color</param-name>

<param-value>red</param-value>

</init-param>

<init-param>

<param-name>kaptcha.image.width</param-name>

<param-value>250</param-value>

</init-param>

<init-param>

<param-name>kaptcha.image.height</param-name>

<param-value>90</param-value>

</init-param>

<init-param>

<param-name>kaptcha.textproducer.font.size</param-name>

<param-value>70</param-value>

</init-param>

<!--验证码长度-->

<init-param>

<param-name>kaptcha.textproducer.char.length</param-name>

<param-value>4</param-value>

</init-param>

<init-param>

<param-name>kaptcha.textproducer.font.names</param-name>

<param-value>宋体,楷体,微软雅黑</param-value>

</init-param>

<!-- 全是数字 -->

<init-param>

<param-name>kaptcha.textproducer.char.string</param-name>

<param-value>0123456789abcdefghijklmnopqrstuvwxyz</param-value>

</init-param>

<!-- 去掉干扰线 -->

<!--<init-param>-->

<!--<param-name>kaptcha.noise.impl</param-name>-->

<!--<param-value>com.google.code.kaptcha.impl.NoNoise
</param-value>-->

<!--</init-param>-->

</servlet>

在jsp页码中:

document.getElementById("img_captcha").src="${ctx}/static/images/kaptcha.jpg?t=" + Math.random();

时间: 2024-10-03 14:05:52

常用技术的相关文章

Android无线开发的几种常用技术(阿里巴巴资深工程师原创分享)

本文由阿里巴巴移动安全客户端.YunOS资深工程师Hao(嵌入式企鹅圈原创团队成员)撰写,是Hao在嵌入式企鹅圈发表的第一篇原创文章,对Android无线开发的几种常用技术进行综述. 嵌入式企鹅圈现拥有七个专栏(Linux内核驱动情景分析.资源紧缺型SOC嵌入式架构设计.嵌入式交叉工具链及其应用.嵌入式设计和编程.微信硬件平台和物联网解决方案.Android开发.开发资源共享).更多Android.Linux.嵌入式和物联网原创技术分享敬请关注微信公众号:嵌入式企鹅圈.我们百分百原创,资深工程师

日志存储系统常用技术方案介绍

日志存储系统常用技术方案有两种:一是log4j/logback+mongodb的方式,一种是基于ELK的日志存储系统. 日志一般存储在数据库和文件系统中.日志数据要和生产正式库分开存储,否则会影响正式库的运行,带来隐患.另外,为了防止日志存储性能问题,后期可以考虑采用异步的消息队列形式进行存储. 下面详细讲解. 1.便捷的日志存储方式log4j+mongodb 1)安装和配置简介 需要引入的jar包有:Mongo Java driver.Log4J(1.2.16以上版本).log4mongo-j

DHTMLX 常用技术

GRID的行设置前景色和背景色 $dataItem->set_row_color("red"); // 设置背景色 $dataItem->set_row_style("color:red"); // 设置前景色 GRID支持多行显示 mygrid.enableMultiline(true); TREE节点提示文字 $dataItem->set_attribute("tooltip", "这是提示"); TRE

javaWeb常用技术语法总结

HTML: 1.html:超文本标记语言. 标记(标签.节点): <标记名>标记内容(标记体)</标记名称> 九成双标记 个别单标记 2.html文件写法和基本结构: 3.常用标记.p/div/span/ul/ol/center/b/i/sub/sup/a 4.表格:网页布局 table thead tbody th td tr 5.表单:手机客户信息. form:name/method/action 表单元素:input:type=text/password/readio/che

互联网常用技术名词大全

Internet(国际互联网) Internet是一个由各种不相同类型和规划的独立运转和办理的核算机网络构成的全球规模的核算机网络,构成Internet的核算机网络包含局域网(LAN).城域网(MAN)以及大规划的广域网(WAN)等.这些网络经过一般电话线.高速率专用线路.卫星.微波和光缆等通讯线路把不相同国家的大学.公司.科研组织以及军事和政府等安排的网络连接起来.Internet网络互连选用的根本协议是TCP/IP.Internet 用户能够运用Internet 所供给的运用体系去查询和获取

可伸缩性架构常用技术——之数据切分

可伸缩性架构常用技术 ——之数据切分(Data Sharding/Partition) 1 简介 本来想写一篇可伸缩性架构方面的文章,发现东西太多了,久久未能下笔,这里首先把大家最关注的数据切分(Partition/Sharding)方面的内容先写完,给大家参考. 我们知道,为了应对不断增长的数据,我们对数据进行切分,存储在不同的数据库里,本文提到的数据库在非特定指明的情况下,均指一个逻辑数据库(是一组数据库,比如Master-Slave),而非单一各个物理数据库. 其主要有两种方式: 垂直切分

页面优化常用技术

1. 页面缓存+URL缓存+对象缓存 2. 页面静态化,前后端分离 3. 静态资源优化 4. CDN优化 ### 1.页面缓存 1. 取缓存 2. 手动渲染模板 3. 结果输出 解决数据及时性`页面缓存有效时间比较短` ### 2.URL缓存 1. 带额外参数的页面缓存 `注意` ``` 适用于变化不大的页面 ``` ### 3.对象级缓存 缓存力度比较大,比如分布式session中存储的有用户信息的token ### 4.页面静态化(前后端分离技术) 1. 常用技术AngularJS.Vue.

必知干货:Web前端应用十种常用技术你全都知道吗?

Web前端应用十种常用技术,随着JS与XHTML的应用普及,越来越多的web界面应用技术出现在网站上,比如我们常见的日历控件,搜索下拉框等,这些web界面应用技术大大的丰富了网站的表现形式,本文将为您精心推荐十种最常见的web界面应用技术. Web应用程序的界面设计,其核心就是网页设计 ,但它的重点主要是在功能方面.要超越桌面应用程序, Web应用程序必须提供简单.直观和即时响应的用户界面,让他们的用户花更少的精力和时间去完成事情. 以前,我们并没有注意到web应用程序这个方式,但是现在是时候仔

Linux运维常用技术论坛博客网站

Linux运维常用技术论坛博客网站Linux中国开源社区: https://linux.cn/Infoq: https://www.infoq.cn/51CTO: http://www.51cto.com/掘金: https://juejin.im/CSDN: https://www.csdn.net/运维派: http://www.yunweipai.com/开源中国: https://www.oschina.net/ 原文地址:https://blog.51cto.com/13293070/

分布式锁1 Java常用技术方案

前言:       由于在平时的工作中,线上服务器是分布式多台部署的,经常会面临解决分布式场景下数据一致性的问题,那么就要利用分布式锁来解决这些问题.所以自己结合实际工作中的一些经验和网上看到的一些资料,做一个讲解和总结.希望这篇文章可以方便自己以后查阅,同时要是能帮助到他人那也是很好的. ===============================================================长长的分割线===================================