朱杰兵blog

jonhney'blog
posts - 140, comments - 1, trackbacks - 0, articles - 0

2015年3月12日

解决办法:
在报错项目的idea路径下(示例路径,根据实际情况查找)D:\idea_workspace\demo\.idea\artifacts,找到错误提示中的模块名,此处示例为“ueditor”,应该会有两个文件(ueditor_war_exploded.xml 和 ueditor_war.xml),删除再重新编译即可。

posted @ 2018-02-24 10:46 朱杰兵 阅读(417) | 评论 (0)编辑 收藏

问题:idea使用过程中 

 报告  plugin error。   Error Loading Project: Cannot load 10 artifacts Details... 并且 tomcat不能配置。

 解决:打开setting>>plugins>>启用 application servers  View. 多次勾选后再取消,重启idea。安装插件

(本人打开plugin界面时,application server 为红色,点击两次enable就可以,当时以为报红是因为缺少插件,废了不少时间)



posted @ 2018-02-24 10:29 朱杰兵 阅读(324) | 评论 (0)编辑 收藏


 

Two modules in a project cannot share the same content root


根本的解决方法: 删除iml文件.

 

其实删了没用的iml重启下idea就可以,


posted @ 2018-02-24 10:27 朱杰兵 阅读(3767) | 评论 (0)编辑 收藏

posted @ 2018-02-24 10:25 朱杰兵 阅读(300) | 评论 (0)编辑 收藏

在使用idea开发的过程中,提交时遇到两个问题,一个是每次提交都需要输入用户名和密码,选择记住密码,依然提示;第二个是提交后,git账户名显示是Administrator,跟自己注册git时账号不一致,今天花了点时间,从网上找了下解决方案,记录一下。

    1.处理不用反复输入密码问题:

    打开git终端,或者idea中的插件终端,输入命令:

    git config--global credential.helper store

   

   

    执行上述命令后,在idea中第一次pull或push需要输入用户名和密码,之后就不用再输入了。

 

    2.git提交代码时,用户名显示为Administrator问题。自己注册完git后,设置的是自己的名称,但不知为什么,在idea上提交代码时,用户名显示的是Administrator,但是git网站上的日志记录却是正常的。

 

 

    自己怀疑idea里的git提交时,取的是本机名,因为自己的电脑机器名就是Administrator,就把电脑名改了,然后试了下,提交日志上还是显示Administrator,关掉idea重启,依然是,关机重启,还没改过来。上网找了下方案,说需要设置下git的全局用户名,打开git终端,修改了下用户名,然后idea中提交日志就显示正常了。

        

    解决方法:执行命令$ git config --global user.name "username"即可。

 

    Git的用户名和邮箱地址作用:用户名和邮箱地址是本地Git客户端的一个变量,不随git库而改变。每次commit都会用用户名和邮箱纪录。github的contributions统计就是按邮箱来统计的。


查看git用户名和邮箱地址命令:

$ git configuser.name

$ git configuser.email

修改用户名和邮箱地址:

$ git config--global user.name "username"

$ git config--global user.email "email"

当git注册时的邮箱发生变化后,可以通过config命令进行修改。

posted @ 2018-01-03 18:53 朱杰兵 阅读(3631) | 评论 (0)编辑 收藏

3######一、安装环境######
1、本机系统:Windows 10 Pro(64位)
2、Node.js:v6.9.2LTS(64位)

二、安装Node.js步骤######

1、下载对应你系统的Node.js版本:https://nodejs.org/en/download/
2、选安装目录进行安装
3、环境配置
4、测试

三、前期准备######

1、Node.js简介
简单的说 Node.js 就是运行在服务端的 JavaScript。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。Node.js 的包管理器 npm,是全球最大的开源库生态系统。
2、下载Node.js
打开官网下载链接:https://nodejs.org/en/download/ 我这里下载的是node-v6.9.2-x64.msi,如下图:

四、开始安装######

1、下载完成后,双击“node-v6.9.2-x64.msi”,开始安装Node.js


点击【Next】按钮


勾选复选框,点击【Next】按钮


修改好目录后,点击【Next】按钮


安装完后点击【Finish】按钮完成安装


至此Node.js已经安装完成,可以先进行下简单的测试安装是否成功了,后面还要进行环境配置
在键盘按下【win+R】键,输入cmd,然后回车,打开cmd窗口

安装完后的目录如下图所示:


此处说明下:新版的Node.js已自带npm,安装Node.js时会一起安装,npm的作用就是对Node.js依赖的包进行管理,也可以理解为用来安装/卸载Node.js需要装的东西

五、环境配置######

说明:这里的环境配置主要配置的是npm安装的全局模块所在的路径,以及缓存cache的路径,之所以要配置,是因为以后在执行类似:npm install express [-g] (后面的可选参数-g,g代表global全局安装的意思)的安装语句时,会将安装的模块安装到【C:\Users\用户名\AppData\Roaming\npm】路径中,占C盘空间。
例如:我希望将全模块所在路径和缓存路径放在我node.js安装的文件夹中,则在我安装的文件夹【D:\Develop\nodejs】下创建两个文件夹【node_global】及【node_cache】如下图:

创建完两个空文件夹之后,打开cmd命令窗口,输入

npm config set prefix "D:\Develop\nodejs\node_global" npm config set cache "D:\Develop\nodejs\node_cache" 

接下来设置环境变量,关闭cmd窗口,“我的电脑”-右键-“属性”-“高级系统设置”-“高级”-“环境变量”

进入环境变量对话框,在【系统变量】下新建【NODE_PATH】,输入【D:\Develop\nodejs\node_global\node_modules】,将【用户变量】下的【Path】修改为【D:\Develop\nodejs\node_global】

六、测试######

配置完后,安装个module测试下,我们就安装最常用的express模块,打开cmd窗口,
输入如下命令进行模块的全局安装:

npm install express -g     # -g是全局安装的意思 
补充#####

通过npm安装模块时都是去国外的镜像下载的,有的时候由于网络原因会导致安装模块失败,好在阿里有团队维护国内镜像:http://npm.taobao.org/ 上面有使用说明



作者:指間的Coding
链接:https://www.jianshu.com/p/03a76b2e7e00
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2018-01-03 18:51 朱杰兵 阅读(132) | 评论 (0)编辑 收藏

在使用 Intellij IDEA时,常常需要打开两个或更多的窗口,而之前的版本如下设置


新版本如下设置

posted @ 2018-01-03 18:49 朱杰兵 阅读(1148) | 评论 (0)编辑 收藏

启动 Java Web 项目

1)打开“Project Structure”


2)配置“Facets”


3)配置“Artifacts”


4) 启动“Edit Configurations”


5) Add New 'Tomcat Server' 配置


6) 配置Deplyment


7) 配置Server


   其结果如下:


8) 启动Web Server


现在可以通过Browser访问WebServer的页面了。


posted @ 2017-12-12 13:58 朱杰兵 阅读(165) | 评论 (0)编辑 收藏

posted @ 2017-12-10 18:21 朱杰兵 阅读(165) | 评论 (0)编辑 收藏

最近没啥事开始正式用Eclipse 转入 idea工具阵营,毕竟有70%的开发者在使用idea开发,所以它的魅力可想而知。刚上手大概有一天,就知道它为啥取名为 intelli(智能化)了,确实很智能,这还是一些小小的细节,当然idea也有它不足之处,就是我们今天要讲的“自定义方法注解模板”,类注解模板可以很简单的设置,这里我就不重复,而网上很多关于自定义方法注解模板的文章大多是抄袭获取转发根本自己就没有验证,本文经过自己亲自验证有效。


  1. File->settings->Editor->Live Templates



  2. 点击右上角的绿色+号,然后选择template group ,然后输入group的name,随便输入就好了:myGroup。然后点ok



  3. 选中刚才创建的myGroup,然后再次点击右侧的绿色+,这次选择的是第一个1. Live Template。取名为*,取名可以随便,只是个人觉得方便,你可以取别的。
     
    然后点击这里写图片描述
    然后选择Everywhere
    这里写图片描述 最后点击右下角的Edit variables 按钮,然后弹出一个窗口,如下:


  4. 配置模板,下面是我的模板,大家仔细看我的模板开头是*而不是/*,这就是关键所在。
    1. *  
    2.  *    
    3.  *   
    4.  * @author chenmc  
    5.  * @date $date$ $time$  
    6.  * @param $params$  
    7.  * @return $returns$  
    8.  */  
    注意只有当变量被$$包围是 右侧的Edit variables才可以点击哦。


  5. 再编辑好模板之后就只为参数添加$$添加变量,点击右侧的 Editor variables,



  6. 完成之后点击Apply然后点击OK,注意了,重点的地方,在你的方法上输入 /*然后加上模板的名称*,这就是我为什么不取字母而取名为*,因为这样很快速,再按Tab键(注意啊不是按Enter键,而是按Tab键)就会出现你想要的注释了,很多教程是直接输入模板名称按tab键,但是这种方法的@param和@return是获取不到的,再重复一遍正确的方式/** 然后按Tab键;如果你取名为abc那就是  /*abc 然后按Tab。效果如下:



  7. 但是还有一个问题,细心的读者会发现在@param这个参数上报错了,这是因为idea强大的检查功能,有两种解决办法:
    1. File->settings->Editor->Inspections->javadoc issues下面第四项将红色 Error改为黄色Warning即可  

    1. 第二种是点击idea的右下角的人头图像,然后选择高亮级别,调为Syntax模式即可  



    至此已大功告成了,希望能帮到大家!

posted @ 2017-12-07 21:27 朱杰兵 阅读(182) | 评论 (0)编辑 收藏

http://blog.csdn.net/duanlb_001/article/details/77651683
在线安装:在INSTALL NEW SOFTWAR中输入地址:http://download.eclipse.org/releases/juno,在加载出来的插件列表中,输入SUB来过滤出SVN插件。
eclipse-help-install new software-work with:  http://community.polarion.com/projects/subversive/download/eclipse/3.0/kepler-site/

posted @ 2017-11-30 14:16 朱杰兵 阅读(394) | 评论 (0)编辑 收藏

1)打开“Project Structure”


2)配置“Facets”


3)配置“Artifacts”


4) 启动“Edit Configurations”


5) Add New 'Tomcat Server' 配置


6) 配置Deplyment


7) 配置Server


   其结果如下:


8) 启动Web Server


现在可以通过Browser访问WebServer的页面了。

posted @ 2017-11-23 13:49 朱杰兵 阅读(92) | 评论 (0)编辑 收藏

一,JRebel 插件 获取与安装

直接在 IDEA 中操作获取 JRebel 插件


Paste_Image.png

Paste_Image.png


安装完成,记得重启 IDEA 使刚才安装的插件生效。

二,激活


Paste_Image.png

Paste_Image.png


http://idea.lanyus.com/ilanyu
lanyu19950316@gmail.com
在此感谢 IDEA开源社区 http://www.ideajava.org/


Paste_Image.png

Paste_Image.png

三:使用


Paste_Image.png

Paste_Image.png

Paste_Image.png

Paste_Image.png

配置完毕!


Paste_Image.png

启动项目之后
任意修改 java 代码,并 ctrl + s 保存 ,update classes and resources 一下。





当一个项目使用maven多模块开发时通过上面的配置, 只能自动加载webapp所在的模块, 若想改动其他模块的代码也要自动加载, 需在项目的根(父)pom.xml中加入下面的配置: 
这里写图片描述

 <plugin>     <groupId>org.zeroturnaround</groupId>     <artifactId>jrebel-maven-plugin</artifactId>     <version>1.1.5</version>     <configuration>         <addResourcesDirToRebelXml>true</addResourcesDirToRebelXml>         <alwaysGenerate>true</alwaysGenerate>         <showGenerated>true</showGenerated>     </configuration>     <executions>         <execution>             <id>generate-rebel-xml</id>             <phase>process-resources</phase>             <goals>                 <goal>generate</goal>             </goals>         </execution>     </executions> </plugin>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

运行mvn jrebel:generate, 生成rebel.xml文件.

这里写图片描述


posted @ 2017-11-23 13:45 朱杰兵 阅读(253) | 评论 (0)编辑 收藏

一:文件级别的注释
        文件级别的注释通过File--》Setting--》File and Code Template中来设置
二:方法级别的注释
1、点击File--》Setting--》Live Template,点击右侧的+号,选择Template Group
        2、输入MyGroup(你也可以输入其他自定义的名称),然后点击OK。
        3、选中MyGroup之后,再次点击右侧的+号,选择Live Template
 
        4、点击第四步的Define,选择EveryWhere
        5、点击右边的Edit variables
       6、点击OK,Apply,退出,大功告成。页面任意地方输入cmt,然后点击回车,进行体验吧

posted @ 2017-11-23 13:42 朱杰兵 阅读(1337) | 评论 (0)编辑 收藏

     摘要: 不严谨的写法,可能会报错:in (),这种情况不符合SQL的语法,导致程序报错。如果简单只做非空判断,这样也有可能会有问题:本来in一个空列表,应该是没有数据才对,却变成了获取全部数据!所以一个比较周全的方法是:12345678910111213<select id="findLastPoolTaskIdsForMo" resultMap="poolTaskResult"...  阅读全文

posted @ 2017-11-23 13:40 朱杰兵 阅读(486) | 评论 (0)编辑 收藏

My problem fixed after I added below dependency to my pom.xml and downgrade the spring-boot-starter-parent to version 1.5.2.RELEASE.

		<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-netflix-eureka-server</artifactId><version>1.1.6.RELEASE</version></dependency>

posted @ 2017-11-15 01:25 朱杰兵 阅读(2187) | 评论 (0)编辑 收藏

解决办法:找到tomcat目录的conf下的server.xml
<Context docBase="fms3" path="/fms3" reloadable="true" source="org.eclipse.jst.jee.server:fms3"/></Host>
工程右键properties下的web project setting的context root和上面的path,docbase保持一致

posted @ 2017-09-27 14:50 朱杰兵 阅读(367) | 评论 (0)编辑 收藏

第一步:下载jrebel

tomcat和eclipse的安装就不说了,打开eclipse,打开help-》Eclipse Marketplace,搜索jrebel,点击Installed安装。
安装jrebel插件

第二步:激活

打开help-》Jrebel Configuration-》Overview,点击Activate/Update License,

Open Help > JRebel Activation in your IDE 选中connect to license server 输入http://jrebel.scuxl.cn/xxx,随便输入一个邮箱


输入这个,马赛克部分随便填个邮箱

第三步:配置tomcat服务器

还是刚才的Jrebel Configuration配置页面,打开Startup栏,选择Run via IDE,选择servers:
选择tomcat

这里特别强调了Project-》Build Automatically要勾选上。

第四步:配置需要热部署的项目

还是刚才的Jrebel Configuration配置页面,打开Projects栏,勾选JR图标下的项目,这里会在项目里生成一个rebel.xml文件。
项目配置

第五步:编译项目,启动servers

在Servers拦下右击tomcat server选择start启动,更改代码测试一下你的热部署是不是即时的吧


------------------------------------------------------------------

另一种激活方式

 

方法2:

MyJrebel

登录这个网站,使用脸书或者推特登录(需要越墙),然后输入邮箱,会要求验证(登录邮箱验证,点击验证链接),在输入手机号,不需要验证手机号。之后会进入


把这个粘到开发工具里面也可以无限制使用。





 

posted @ 2017-08-18 00:49 朱杰兵 阅读(142) | 评论 (0)编辑 收藏

systemctl stop firewalld.service #停止firewall

posted @ 2017-06-16 17:17 朱杰兵 阅读(125) | 评论 (0)编辑 收藏

这要说到==和 equals 的区别了。

1. ==比较的是两个对象在内存中的地址值(栈中的内容)。

2.equals 是 Java.lang.Object 类的一个方法。equals 比较的是两个对象的内容(堆中的内容)。java 中所有的类都默认继承于 Object,所以所有的类都有这个方法。

但是 Long 是一个对象,是对 long 的封装。我们看一下 Long 对象的源码,里面的 equals 方法是这么写的:

1     public boolean equals(Object obj) { 2         if (obj instanceof Long) { 3             return value == ((Long)obj).longValue(); 4         } 5         return false; 6     }

所以两个 Long 类型的变量进行比较的话,要么用 equals,要么先调用longValue 方法,拿到里面的 long 值之后再进行==比较。

posted @ 2017-05-26 10:39 朱杰兵 阅读(164) | 评论 (0)编辑 收藏

通过HttpClient请求webService 

由于服务端是用webService开发的,android要调用webService服务获取数据,这里采用的是通过HttpClient发送post请求,获取webService数据。
 
服务端使用的webService框架是axis2,请求数据之前,要封装一个xml格式,再通过post请求,获取服务端数据。
请求的xml格式如下所示: 
1 <soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"xmlns:sam="http://user.service.xxx.com">
2    <soap:Header/>
3    <soap:Body>
4       <sam:getUserInfo>
5      <sam:userName>sunlightcs</sam:userName>
6       </sam:getUserInfo>
7    </soap:Body>
8 </soap:Envelope>
其中:getUserInfo是方法名,userName是参数名,当然,还可以加多个参数。
 
 
下面的代码是向webService发送请求,获取数据,返回的数据是xml形式的,android只要解析xml数据,就可以获得想要的数据了。 

01 import java.io.IOException;
02 import java.io.OutputStream;
03 import java.io.OutputStreamWriter;
04 import java.io.Writer;
05  
06 import org.apache.http.HttpResponse;
07 import org.apache.http.client.HttpClient;
08 import org.apache.http.client.methods.HttpPost;
09 import org.apache.http.entity.ContentProducer;
10 import org.apache.http.entity.EntityTemplate;
11 import org.apache.http.impl.client.DefaultHttpClient;
12 import org.apache.http.util.EntityUtils;
13  
14  
15 public class ClientTest {
16  
17     public static void main(String[] args) {
18         ClientTest.httpClientPost();
19     }
20      
21     private static void httpClientPost() {
22         HttpClient client = new DefaultHttpClient();
23         HttpPost post = newHttpPost("http://localhost:8080/xxx/services/userService");
24          
25         try {
26             ContentProducer cp = new ContentProducer() {
27                 public void writeTo(OutputStream outstream) throwsIOException {
28                     Writer writer = new OutputStreamWriter(outstream,"UTF-8");
29                      
30                     /**
31                      * 获取请求的xml格式数据
32                      */
33                     String requestXml = getRequestXml();
34                     writer.write(requestXml);
35                     writer.flush();
36                 }
37             };
38  
39             post.setEntity(new EntityTemplate(cp));
40             HttpResponse response = client.execute(post);
41              
42         //打印返回的xml数据
43             System.out.println(EntityUtils.toString(response.getEntity()));
44         catch (IOException e) {
45             e.printStackTrace();
46         }
47     }
48      
49      
50     private static String getRequestXml(){
51         StringBuilder sb = new StringBuilder("<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:sam=\"http://user.service.xxx.com\">");
52         sb.append("<soap:Header/>");
53         sb.append("<soap:Body>");
54         sb.append("<sam:getUserInfo>");
55         sb.append("<sam:userName>sunlightcs</sam:userName>");
56         sb.append("</sam:getUserInfo>");
57         sb.append("</soap:Body>");
58         sb.append("</soap:Envelope>");
59          
60         return sb.toString();
61     }
62  
63 }

返回的数据格式如下: 
1 <?xml version='1.0' encoding='UTF-8'?>
2 <soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
3     <soapenv:Body>
4         <ns:getUserInfoResponse xmlns:ns="http://user.service.xxx.com">
5             <ns:return>xxx</ns:return>
6         </ns:getUserInfoResponse>
7     </soapenv:Body>
8 </soapenv:Envelope>
其中,<ns:return>内的"xxx"可以是json数据,android只需解析标签<ns:return>里的json数据即可。 
转载 http://www.juziku.com/wiki/3919.htm

posted @ 2017-05-24 16:10 朱杰兵 阅读(1201) | 评论 (0)编辑 收藏

netstat -pan|grep 7001
找到进程号,kill -9杀死
打开启动路径
nohup ./startWeblogic.sh &
tail -f nohup.out看启动日志
---------------------------
csh   服务端运行
ps -ef | grep weblogic
kiss -9 sid(左边id)
(
查看后台web进程 
#ps -ef|grep java 如: 
     root 123456 2346546 
    root 1346464    64646464 
杀后台进程 :#kill -9 1346464 
)
cd 到。。。bin/startWebLogic.sh &    注意大小写

posted @ 2017-04-26 19:53 朱杰兵 阅读(89) | 评论 (0)编辑 收藏

java.lang.ClassCastException: weblogic.xml.jaxp.RegistryDocumentBuilderFactory

解决办法

删掉war包中的xml-apis.jar就可以了

posted @ 2017-04-14 16:06 朱杰兵 阅读(100) | 评论 (0)编辑 收藏

右键pom文件 run as --> maven build,  goals填入相应命令,点run

打包
goals 输入 clean package

安装jar到仓库
goals 输入 clean install

测试
goals 输入 clean test

编译
goals 输入 compile

清除
goals输入 clean

 clean  清除编译,compile  编译,test  编译并测试,install 打包并发送到本地仓库,package 只是打成jar包,并不会发送到本地仓库

posted @ 2017-04-13 14:16 朱杰兵 阅读(175) | 评论 (0)编辑 收藏

posted @ 2017-04-12 17:50 朱杰兵 阅读(2459) | 评论 (0)编辑 收藏

public enum MessageLevel {
    LOW {
        @Override
        public String getDesc() {
            return "低";
                    
        }

        @Override
        public String getCode() {
            return "L";
        }

        @Override
        public String getIcon() {
            return "medal_bronze_1.png";
        }

    },
    HEIGH {

        @Override
        public String getDesc() {
            return "高";
        }

        @Override
        public String getCode() {
            return "H";
        }

        @Override
        public String getIcon() {
            return "medal_gold_1.png";
        }

    },
    NORMAL {

        @Override
        public String getDesc() {
            return "中";
        }

        @Override
        public String getCode() {
            return "N";
        }

        @Override
        public String getIcon() {
            return "medal_silver_1.png";
        }

    };
    
    public abstract String getDesc();

    public abstract String getCode();

    public abstract String getIcon();
}

  1. public static void main(String[] args)  
  2.     {  
  3.         System.out.println(MessageLevel.LOW.getDesc());  
  4.         System.out.println(MessageLevel.LOW.getCode());
  5.         System.out.println(MessageLevel.LOW.getIcon());
  6.     } 
-----------------------------------------------------------------------------------------------
  1. public enum Operation   
  2. {  
  3.     PLUS  
  4.     {  
  5.         public double eval(double x,double y)  
  6.         {  
  7.             return x+y;  
  8.         }  
  9.     },  
  10.     MINUS  
  11.     {  
  12.         public double eval(double x,double y)  
  13.         {  
  14.             return x-y;  
  15.         }  
  16.     },  
  17.     TIMES  
  18.     {  
  19.         public double eval(double x,double y)  
  20.         {  
  21.             return x*y;  
  22.         }  
  23.     },  
  24.     DIVIDE  
  25.     {  
  26.         public double eval(double x,double y)  
  27.         {  
  28.             return x/y;  
  29.         }  
  30.     };  
  31.     //为枚举类定义一个抽象方法,这个抽象方法由不同的枚举值提供不同的实现。  
  32.     public abstract double eval(double x,double y);  
  33.     public static void main(String[] args)  
  34.     {  
  35.         System.out.println(Operation.PLUS.eval(3,4));  
  36.         System.out.println(Operation.MINUS.eval(5,4));  
  37.         System.out.println(Operation.TIMES.eval(5,4));  
  38.         System.out.println(Operation.DIVIDE.eval(5,4));  
  39.     }  

posted @ 2017-04-07 11:19 朱杰兵 阅读(85) | 评论 (0)编辑 收藏

classpath

首先 classpath是指编译过后的WEB-INF文件夹下的的classes目录

  • 对于maven的所有项目, 配置文件一般放在resources目录下, 当编译之后会自动复制到classes目录下
  • 非maven的所有项目, 一般放在src目录下, 编译之后也会自动复制到classes目录下面.
  • 所有的web-app项目, 例如web.xml, spring的配置文件等等,是放在webapp/WEB-INF下面的,
    如果想要引用resources或者src目录下的配置文件, 就在在配置文件的路径前加上classpath:, 例如MyBatis配置文件的引用.
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  <property name="dataSource" ref="dataSource"/>  <property name="configLocation" value="classpath:MybatisConfiguration.xml"/>  <property name="mapperLocations" value="classpath*:com/tenlee/mapper/UserMapper.xml"/> </bean>
  • 如果不加的的话,那么都要把配置文件放在WEB-INF/目录下面, 但这样不能单独运行java类进行调试了,必须要启动整个webapp, 比如这样
    <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/configs/mvc-dispatcher.xml</param-value> </init-param>

classpath classpath* 区别:

  • classpath:只会到你的classes路径中查找找文件
  • classpath* :不仅包含classes路径,还包括jar文件classes路径进行查找
  • classpath:classpath*:的区别在于,前者只会从第一个classpath中加载,而后者会从所有的classpath中加载 如果要加载的资源,不在当前ClassLoader的路径里,那么用classpath:前缀是找不到的,这种情况下就需要使用classpath*:前缀.
  • 另一种情况下,在多个classpath中存在同名资源,都需要加载,那么用classpath:只会加载第一个,这种情况下也需要用classpath*:前缀.
  • 可想而知,用classpath*:需要遍历所有的classpath,所以加载速度是很慢的,因此,在规划的时候,应该尽可能规划好资源文件所在的路径,尽量避免使用classpath*

posted @ 2017-04-06 14:32 朱杰兵 阅读(173) | 评论 (0)编辑 收藏

     摘要: 如果你经常需要在Eclipse里打开相关资源文件所在的文件夹,比较麻烦,要右键,属性,在Location一栏中把所在的文件夹拷贝一下,然后再去资源管理器里输入这个路径,回车,然后打开它,比较麻烦。下载地址:http://download.csdn.net/download/lang791534167/8585091eclipse3.6以下的版本将下载的jar包复制到plugins目录下3.6以上包...  阅读全文

posted @ 2017-04-05 09:32 朱杰兵 阅读(108) | 评论 (0)编辑 收藏

     摘要: 解决方法: 步骤一: 从http://maven.oschina.net/content/groups/public/org/apache/maven/archetypes/maven-archetype-quickstart/ 下载最新版maven-archetype-quickstart-1.1.jar 步骤二: 命令行到下载目录下执行 mvn install...  阅读全文

posted @ 2017-03-31 11:13 朱杰兵 阅读(2204) | 评论 (0)编辑 收藏

properties文件默认应该显示为unicode编码,如果安装propertiesEditor插件后可显示为中文

如果没有安装插件,但显示中文,则程序调用属性文件会出现乱码问题,这样就需要手动来将中文转为unicode

直接使用JDK自带的工具:native2ascii.exe

运行cmd,直接用命令的形式,找到文件对应的目录,输入以下命令,

命令格式:native2ascii -encoding UTF-8 源文件名.properties 目标文件名.properties

就可以将含有中文的源文件转为unicode编码的目标文件

posted @ 2017-03-29 14:11 朱杰兵 阅读(119) | 评论 (0)编辑 收藏

最近在研究dubbo,避免不了从最简单的开始。按照网上教程启动zookeeper,启动tomcat时总是报错,

ERROR context.ContextLoader - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'uriBrokerService': Cannot create inner bean '(inner bean)' of type [com.alibaba.citrus.service.uribroker.impl.URIBrokerServiceImpl$URIBrokerInfo] while setting bean property 'brokers' with key [0]; nested excepti on is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#25': Cannot create inner bean 'server' of type [com.alibaba.citrus.service.uribroker.uri.GenericURIBroker] while setting constructor argument; nested exception is org.springframework.beans.fact ory.BeanCreationException: Error creating bean with name 'server': Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'URIType' of bean class [com.alibaba.citrus.service.uribroker.uri.GenericURIBroker]: Bean property 'URIType' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?         at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:230)         at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:122)         at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveManagedList(BeanDefinitionValueResolver.java:287)

查了很久,终于发现问题所在,现在记录下


原来是我用的jdk版本太高,jdk8, dubbo默认用的spring版本比较旧,冲突导致,降低jdk版本为1.7即可

posted @ 2017-03-27 00:44 朱杰兵 阅读(1061) | 评论 (0)编辑 收藏

Linux下在防火墙中开启80端口、3306端口的方法
vi /etc/sysconfig/iptables

-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT(允许80端口通过防火墙)
-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT(允许3306端口通过防火墙)
特别提示:很多网友把这两条规则添加到防火墙配置的最后一行,导致防火墙启动失败,正确的应该是添加到默认的22端口这条规则的下面

添加好之后防火墙规则如下所示:
代码如下:
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT
-A INPUT -m state –state NEW -m tcp -p tcp –dport 3306 -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited
-A FORWARD -j REJECT –reject-with icmp-host-prohibited
COMMIT


然后重启一下防火墙

service iptables restart

搞定!



centos7不太一样


 

那怎么开启一个端口呢
添加
firewall-cmd --zone=public --add-port=8080/tcp --permanent    (--permanent永久生效,没有此参数重启后失效)
重新载入
firewall-cmd --reload
查看
firewall-cmd --query-port=8080/tcp
删除
firewall-cmd --zone= public --remove-port=80/tcp --permanent

 

posted @ 2017-03-20 15:54 朱杰兵 阅读(841) | 评论 (0)编辑 收藏

此时我们就可以通过 mysql -u root -p 命令来登录我们的mysql数据库了
授权法。

例如,你想用户root使用密码root从任何主机连接到mysql服务器的话。

先执行

mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;

再执行

mysql>FLUSH   PRIVILEGES;         
使修改生效

posted @ 2017-03-20 15:26 朱杰兵 阅读(245) | 评论 (0)编辑 收藏

Linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写;
用root帐号登录后,在/etc/my.cnf中的[mysqld]后添加添加lower_case_table_names=1,重启MYSQL服务,这时已设置成功:不区分表名的大小写;
lower_case_table_names参数详解:
lower_case_table_names=0
其中0:区分大小写,1:不区分大小写

posted @ 2017-03-20 15:23 朱杰兵 阅读(98) | 评论 (0)编辑 收藏

转载自

http://www.centoscn.com/mysql/2014/1211/4290.html

一、mysql简介

说到数据库,我们大多想到的是关系型数据库,比如mysql、oracle、sqlserver等等,这些数据库软件在windows上安装都非常的方便,在Linux上如果要安装数据库,咱不得不首先推荐的是mysql数据库了,而且Mysql数据库的第一个版本就是发行在Linux系统上的。

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策(本词条“授权政策”),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。由于其社区版的性能卓越,搭配PHP和Apache可组成良好的开发环境。

在Linux上安装mysql数据库,我们可以去其官网上下载mysql数据库的rpm包,http://dev.mysql.com/downloads/mysql/5.6.html#downloads,大家可以根据自己的操作系统去下载对应的数据库文件,目前最新的版本是5.6.10了。

在这里我是通过yum来进行mysql数据库的安装的,通过这种方式进行安装,可以将跟mysql相关的一些服务、jar包都给我们安装好,所以省去了很多不必要的麻烦!!!

二、卸载掉原有mysql

因为mysql数据库在Linux上实在是太流行了,所以目前下载的主流Linux系统版本基本上都集成了mysql数据库在里面,我们可以通过如下命令来查看我们的操作系统上是否已经安装了mysql数据库

[root@xiaoluo ~]# rpm -qa | grep mysql  // 这个命令就会查看该操作系统上是否已经安装了mysql数据库

有的话,我们就通过 rpm -e 命令 或者 rpm -e --nodeps 命令来卸载掉

[root@xiaoluo ~]# rpm -e mysql  // 普通删除模式 [root@xiaoluo ~]# rpm -e --nodeps mysql  // 强力删除模式,如果使用上面命令删除时,提示有依赖的其它文件,则用该命令可以对其进行强力删除

在删除完以后我们可以通过 rpm -qa | grep mysql 命令来查看mysql是否已经卸载成功!!

三、通过yum来进行mysql的安装

我是通过yum的方式来进行mysql的数据库安装,首先我们可以输入 yum list | grep mysql 命令来查看yum上提供的mysql数据库可下载的版本:

[root@xiaoluo ~]# yum list | grep mysql

就可以得到yum服务器上mysql数据库的可下载版本信息:

 

 

然后我们可以通过输入 yum install -y mysql-server mysql mysql-devel 命令将mysql mysql-server mysql-devel都安装好(注意:安装mysql时我们并不是安装了mysql客户端就相当于安装好了mysql数据库了,我们还需要安装mysql-server服务端才行)

 

[root@xiaoluo ~]# yum install -y mysql-server mysql mysql-devel

 

在等待了一番时间后,yum会帮我们选择好安装mysql数据库所需要的软件以及其它附属的一些软件

 

 

我们发现,通过yum方式安装mysql数据库省去了很多没必要的麻烦,当出现下面的结果时,就代表mysql数据库安装成功了

 

 

此时我们可以通过如下命令,查看刚安装好的mysql-server的版本

 

[root@xiaoluo ~]# rpm -qi mysql-server

 

我们安装的mysql-server并不是最新版本,如果你想尝试最新版本,那就去mysql官网下载rpm包安装就行了,至此我们的mysql数据库已经安装完成了。

四、mysql数据库的初始化及相关配置

我们在安装完mysql数据库以后,会发现会多出一个mysqld的服务,这个就是咱们的数据库服务,我们通过输入 service mysqld start 命令就可以启动我们的mysql服务。

注意:如果我们是第一次启动mysql服务,mysql服务器首先会进行初始化的配置,如:

复制代码
[root@xiaoluo ~]# service mysqld start  初始化 MySQL 数据库: WARNING: The host 'xiaoluo' could not be looked up with resolveip. This probably means that your libc libraries are not 100 % compatible with this binary MySQL version. The MySQL daemon, mysqld, should work normally with the exception that host name resolving will not work. This means that you should use IP addresses instead of hostnames when specifying MySQL privileges ! Installing MySQL system tables... OK Filling help tables... OK  To start mysqld at boot time you have to copy support-files/mysql.server to the right place for your system  PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands:  /usr/bin/mysqladmin -u root password 'new-password' /usr/bin/mysqladmin -u root -h xiaoluo password 'new-password'  Alternatively you can run: /usr/bin/mysql_secure_installation  which will also give you the option of removing the test databases and anonymous user created by default.  This is strongly recommended for production servers.  See the manual for more instructions.  You can start the MySQL daemon with: cd /usr ; /usr/bin/mysqld_safe &  You can test the MySQL daemon with mysql-test-run.pl cd /usr/mysql-test ; perl mysql-test-run.pl  Please report any problems with the /usr/bin/mysqlbug script!                                                             [确定] 正在启动 mysqld:                                            [确定]
复制代码

 

这时我们会看到第一次启动mysql服务器以后会提示非常多的信息,目的就是对mysql数据库进行初始化操作,当我们再次重新启动mysql服务时,就不会提示这么多信息了,如:

 

[root@xiaoluo ~]# service mysqld restart 停止 mysqld:                                             [确定] 正在启动 mysqld:                                          [确定]

 

我们在使用mysql数据库时,都得首先启动mysqld服务,我们可以 通过  chkconfig --list | grep mysqld 命令来查看mysql服务是不是开机自动启动,如:

 

[root@xiaoluo ~]# chkconfig --list | grep mysqld mysqld             0:关闭    1:关闭    2:关闭    3:关闭    4:关闭    5:关闭    6:关闭

 

我们发现mysqld服务并没有开机自动启动,我们当然可以通过 chkconfig mysqld on 命令来将其设置成开机启动,这样就不用每次都去手动启动了

 

[root@xiaoluo ~]# chkconfig mysqld on [root@xiaoluo ~]# chkconfig --list | grep mysql mysqld             0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭

 

mysql数据库安装完以后只会有一个root管理员账号,但是此时的root账号还并没有为其设置密码,在第一次启动mysql服务时,会进行数据库的一些初始化工作,在输出的一大串信息中,我们看到有这样一行信息 :

 

/usr/bin/mysqladmin -u root password 'new-password'  // 为root账号设置密码 

 

所以我们可以通过 该命令来给我们的root账号设置密码(注意这个root账号是mysql的root账号,非Linux的root账号)

 

[root@xiaoluo ~]# mysqladmin -u root password 'root'  // 通过该命令给root账号设置密码为 root

 

此时我们就可以通过 mysql -u root -p 命令来登录我们的mysql数据库了

 

五、mysql数据库的主要配置文件

1./etc/my.cnf 这是mysql的主配置文件

我们可以查看一下这个文件的一些信息

复制代码
[root@xiaoluo etc]# ls my.cnf  my.cnf  [root@xiaoluo etc]# cat my.cnf  [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock user=mysql # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0  [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid
复制代码

2./var/lib/mysql   mysql数据库的数据库文件存放位置

我们的mysql数据库的数据库文件通常是存放在了/ver/lib/mysql这个目录下

 

复制代码
[root@xiaoluo ~]# cd /var/lib/mysql/ [root@xiaoluo mysql]# ls -l 总用量 20488 -rw-rw----. 1 mysql mysql 10485760 4月   6 22:01 ibdata1 -rw-rw----. 1 mysql mysql  5242880 4月   6 22:01 ib_logfile0 -rw-rw----. 1 mysql mysql  5242880 4月   6 21:59 ib_logfile1 drwx------. 2 mysql mysql     4096 4月   6 21:59 mysql  // 这两个是mysql数据库安装时默认的两个数据库文件 srwxrwxrwx. 1 mysql mysql        0 4月   6 22:01 mysql.sock drwx------. 2 mysql mysql     4096 4月   6 21:59 test  // 这两个是mysql数据库安装时默认的两个数据库文件
复制代码

 

我们可以自己创建一个数据库,来验证一下该数据库文件的存放位置

 

复制代码
创建一个我们自己的数据库: mysql> create database xiaoluo; Query OK, 1 row affected (0.00 sec)  [root@xiaoluo mysql]# ls -l 总用量 20492 -rw-rw----. 1 mysql mysql 10485760 4月   6 22:01 ibdata1 -rw-rw----. 1 mysql mysql  5242880 4月   6 22:01 ib_logfile0 -rw-rw----. 1 mysql mysql  5242880 4月   6 21:59 ib_logfile1 drwx------. 2 mysql mysql     4096 4月   6 21:59 mysql srwxrwxrwx. 1 mysql mysql        0 4月   6 22:01 mysql.sock drwx------. 2 mysql mysql     4096 4月   6 21:59 test drwx------. 2 mysql mysql     4096 4月   6 22:15 xiaoluo  // 这个就是我们刚自己创建的xiaoluo数据库 [root@xiaoluo mysql]# cd xiaoluo/ [root@xiaoluo xiaoluo]# ls db.opt
复制代码

3./var/log mysql数据库的日志输出存放位置

我们的mysql数据库的一些日志输出存放位置都是在/var/log这个目录下

复制代码
[root@xiaoluo xiaoluo]# cd  [root@xiaoluo ~]# cd /var/log [root@xiaoluo log]# ls amanda                cron           maillog-20130331   spice-vdagent.log anaconda.ifcfg.log    cron-20130331  mcelog             spooler anaconda.log          cups           messages           spooler-20130331 anaconda.program.log  dirsrv         messages-20130331  sssd anaconda.storage.log  dmesg          mysqld.log         tallylog anaconda.syslog       dmesg.old      ntpstats           tomcat6 anaconda.xlog         dracut.log     piranha            wpa_supplicant.log anaconda.yum.log      gdm            pm-powersave.log   wtmp audit                 httpd          ppp                Xorg.0.log boot.log              ibacm.log      prelink            Xorg.0.log.old btmp                  lastlog        sa                 Xorg.1.log btmp-20130401         libvirt        samba              Xorg.2.log cluster               luci           secure             Xorg.9.log ConsoleKit            maillog        secure-20130331    yum.log
复制代码

 

其中mysqld.log 这个文件就是我们存放我们跟mysql数据库进行操作而产生的一些日志信息,通过查看该日志文件,我们可以从中获得很多信息

 

因为我们的mysql数据库是可以通过网络访问的,并不是一个单机版数据库,其中使用的协议是 tcp/ip 协议,我们都知道mysql数据库绑定的端口号是 3306 ,所以我们可以通过 netstat -anp 命令来查看一下,Linux系统是否在监听 3306 这个端口号:

结果如上所示,Linux系统监听的3306端口号就是我们的mysql数据库!!!!

posted @ 2017-03-20 15:21 朱杰兵 阅读(94) | 评论 (0)编辑 收藏

     摘要: run as --> run configuration  阅读全文

posted @ 2017-03-07 16:45 朱杰兵 阅读(202) | 评论 (0)编辑 收藏

1、下载源码,解压缩后编译源码。
$ wget http://download.redis.io/releases/redis-2.8.3.tar.gz 
$ tar xzf redis-2.8.3.tar.gz
$ cd redis
-2.8.3
$ make
make 的时候可能会遇到问题,
(1).缺少gcc,执行
yum -y install gcc ,解决
(2).error: jemalloc/jemalloc.h: No such file or directory解决方法
执行
make MALLOC=libc


2、编译完成后,在Src目录下,有三个可执行文件redis-server、redis-benchmark、redis-cli,以及根目录下有一个redis.conf。然后把这四个文件拷贝到一个目录下。
到src目录下执行命令
mkdir /usr/redis 
cp redis
-server /usr/redis
cp redis
-benchmark /usr/redis
cp redis
-cli /usr/redis
这里要切换到根目录
cp redis.conf
/usr/redis
cd
/usr/redis
3、启动Redis服务。
$ ./redis-server
会见到redis的logo
 4、然后用客户端测试一下是否启动成功。
$ ./redis-cli 
redis
> set foo bar
OK
redis
> get foo "bar"


-------------------------------------------------------------------------------------------------------------------------------
但是这样启动,如果关闭窗口,服务就会关闭
可为redis服务启动指定配置文件,配置文件 redis.conf 在Redis根目录下。
修改daemonize为yes,即默认以后台程序方式运行

这样就可以执行./redis-server ./redis.conf 进行后台启动

关闭redis服务 ./redis-cli shutdown

 

posted @ 2017-03-02 14:58 朱杰兵 阅读(135) | 评论 (0)编辑 收藏

今天学习在Linux上部署项目,用到了Mysql,因此想要下载适用于Linux的安装版本,在Mysql官网找了半天,终于找到怎样下载了,这里写出来,以后大家找的时候就好找了。
第一步:在百度输入Mysql,然后我们点击第一个链接,如下图所示。
第二步:点击上图的链接之后,我们会看到如下图所示的界面,我们点击“Download”子菜单中的"Community",如下图所示。
第三步:点击上图的"Community"之后,我们会看到如下图所示的界面,我们点击左侧菜单的"MySQL Community Server"。
第四步:点击上图左侧菜单中的"MySQL Community Server"之后,我们可以看到如下图所示的界面,默认是Windows系统下当前Mysql最高版本的安装包列表,如下图。

第五步:由于我们是要下载适合于Linux系统的.tar.gz类型的安装包,因此我们切换一下,我们切换成"Source Code",如下图所示。
      切换完之后,会看到如下图所示的界面,我们往下找,在倒数第二行有我们想要的mysql-5.7.16.tar.gz!!!我们下载就可以了。
     如果大家不想用最新版本的,想用5.6或5.5版本的,那么可以点击下图的"Looking for previous GA versions?"下面的"MySQL Community Server 5.6>"或"MySQLCommunity Server5.5>",然后Select Platform选择"Source Code",页面加载后在最后一行有我们想要的mysql-5.6.34.tar.gz安装包,我们就以下载mysql-5.6.34.tar.gz为例,我们点击它后面的"Download"按钮。如下图所示。
第六步:我们点击上图"mysql-5.6.34.tar.gz"后面的"Download"之后,会进入到如下图所示的界面,我们不注册,直接点击下面的“No thanks, just start my download.”链接,
第七步:点击上图的链接之后,便弹出下载对话框,我们点击“另存为”下载到我们想要的目录即可。

posted @ 2017-02-23 10:35 朱杰兵 阅读(172) | 评论 (0)编辑 收藏

进入超级用户模式。也就是输入"su -",系统会让你输入超级用户密码,输入密码后就进入了超级用户模式。

posted @ 2017-02-20 14:32 朱杰兵 阅读(82) | 评论 (0)编辑 收藏

vi /usr/profile

编辑完成后按esc键,并输入:wq 或者:x回车,就可以保存退出
如果不想保存,直接退出,则按下esc键,输入:q!,然后回车

一、插入文本
i  在当前字符前插入文本
I  在行首插入文本
a  在当前字符后添加文本 
A  在行末添加文本  
o  在当前行后面插入一空行 
O  在当前行前面插入一空行
二、移动光标
k、j、h、l——上、下、左、右光标移动命令。虽然您可以在Linux中使用键盘右边的4个光标键,但是记住这4个命令还是非常有用的。这4个键正是右手在键盘上放置的基本位置。
j或下箭头 向下移动一行  
k或上箭头 向上移动一行   
h或左箭头 左移一个字符  
l或右箭头 右移一个字符 

posted @ 2017-02-19 12:18 朱杰兵 阅读(109) | 评论 (0)编辑 收藏

使用link文件法
a.假设Eclipse的安装目录在C:\eclipse,在该文件夹下,新建这样的目录结构C:\eclipse\PluginsEclipse\jode\eclipse;
b.解压下载的eclipse 插件或者安装eclipse 插件到指定目录BB(如:C:\BB)文件夹,打开BB文件夹,然后把 BB文件夹里的两个文件夹features和plugins复制到刚新建好的,这样eclipse中就有了两个插件目录features and plugins下。
c.在C:\eclipse目录中新建links(C:\eclipse\links)目录,在links目录中建立一个以link为扩展名的文本文件如jode.link,内容如下path=C:/eclipse/PluginsEclipse/jode 或者path=C:\\eclipse\\PluginsEclipse\\jode(插件的目录),保存后重启eclipse插件就会安装完成。
注意:link文件中path=插件目录的path路径分隔要用\\或是/

posted @ 2017-02-16 16:55 朱杰兵 阅读(283) | 评论 (0)编辑 收藏

posted @ 2017-02-15 15:00 朱杰兵 阅读(65) | 评论 (0)编辑 收藏

     摘要: 第一步:第二部第三步第四步第五步第六步  阅读全文

posted @ 2017-02-14 14:38 朱杰兵 阅读(75) | 评论 (0)编辑 收藏

一、工具下载 
    jBPM 图形化流程设计器采用eclipse做为平台,我们可以先到jBPM官方网站下jBPM4.4,地址:http://sourceforge.net/projects/jbpm/files/,下载后的文件为jbpm-4.4.zip,目录结构如下: 
[attach]271[/attach][attach]271[/attach] 
这里面包含有jbpm-gdp-site.zip文件,就是我们需要的插件,我们可能通过运行ant构建和手动安装,本文主要说明手动安装,ant在这里不详述,可自行根据build.xml进行,手工安装,我们需要下载eclipse,可在eclipse网站下载eclipse Jave EE Galileo(3.5)版,下载地址:http://www.eclipse.org/downloads/packages/release/galileo/r,这里eclipse必须为Jave EE版本。 

二、安装 
这里需要使用eclipse升级机制安装,因为jbpm-gdp-site.zip包为更新站点(archived update site)的压缩包,这文件路径:./jbpm-4.4/install/src/gpd/jbpm-gdp-site.zip,安装步骤如下: 
选择eclipse的菜单 
Help->Install New Software...,出现Install对话框 
点击 add...按钮 
在Add Site对话框中点击”Archive“按钮 
选择/jbpm-4.4/install/src/gpd/jbpm-gdp-site.zip,点击打开按钮,返回Add Site对话框,点击OK按钮,返回Install对话框 
选择列表的出现的jPDL 4 GPD更新站点 
点击 Next... 直到“ Finish" 完成安装 
安装完成后会重启eclipse 

三、配置 
安装完成,需要配置jbpm运行位置,配置如下: 
选择 eclipse菜单:Window->references 
选择 JBoss jBPM -> Runtime Locations 
点击 Add... 
在 Add Location 对话框中,输入一个名字, 
在Browse For Folder对话框中,选择你的jbpm4.4解压根目录 
点击OK 
选择添加的内容,点击OK完成 
 


四、添加jBPM开发依赖库 
为了方便开发中添加依赖包,可在eclipse添加一个依赖库,如下: 
选择 eclipse菜单:Window->references 
选择 Java -> Build Path -> User Libraries 
点击 Add... 
在 New User Libernate 对话框中,输入一个名字,如:jBPM4.4 Library,点OK,关闭对话框 
点击 Add JARs...,打开对话框,选择你的jbpm4.4解压根目录lib目录,/jbpm-4.4/lib 
选择lib目录下的所有jar文件,点击打开,关闭对话框 
重新点击 Add JARs...,打开对话框,选择你的jbpm4.4解压根目录下的jbpm.jar,点击打开,关闭对话框 
如果你需要先可以关联jbpm源码,选择jbpm.jar,选择下面的Source attachment,双击它,选择解压目录 下的/jbpm-4.4/src,确定即可。 
点击OK完成 


五、指定jPDL4 Schema 
在eclipse中指定schema主要是为了方便直接编辑xml源码,当你编辑流程源码时,可以更好的帮助你编写代码。 
选择eclipse菜单:Window->references 
选择XML->XML Catalog 
点击Add...,打开Add XML Catalog Entry对话框,默认为Catalog Entry选项卡 
点击File System...按钮,打开文件选择框,选择解压目录下的/jbpm-4.4/src/jpdl-4.4.xsd文件 
点击打开,关闭所有对话框。


六。导入示例项目 

打开eclipse,导入示例项目: 
选择File->import 
选择General->Existing Projects into Workspace) 
点击Next,选择jbmp4.4目录下examples,点击OK 
示例工程会自动加载,点击Finish 
在配置好jBPM用户依赖库后,所示例子可以用JUnit测试运行了。在一个测试类上右击,选择“Run As -> JUnit Test"。现在就可以自由学习jbpm4了。

posted @ 2017-02-06 16:31 朱杰兵 阅读(170) | 评论 (0)编辑 收藏

     摘要: PropertiesEditor 拷贝出来用文本编辑器打开就是unicode编码 记事本打开就是Unicode  阅读全文

posted @ 2017-01-24 13:46 朱杰兵 阅读(73) | 评论 (0)编辑 收藏

最近在Eclipse中安装了一个插件,导致Eclipse使用的时候有些问题,就找了资料,原来Eclipse中的插件也是可以卸载的。

方法是点击菜单“Help”“Install New Software...”,在弹出的对话框中选择右下角的“already installed


然后就显示已经安装的插件:


选择要卸载的插件,然后点“Uninstall...”把它卸载掉。

posted @ 2017-01-23 14:34 朱杰兵 阅读(113) | 评论 (0)编辑 收藏

1111

posted @ 2017-01-23 10:12 朱杰兵 阅读(98) | 评论 (0)编辑 收藏

方法/步骤

  1. 想必大家都有过在Vmware里面运行Linux服务器的经验,总是觉得在虚拟机里面维护Linux非常不方便,总是需要通过Ctrl+Alt切换到真机,非常不方便,介绍SecureCRT作为客户端连接Linux服务器的方法。

    这是在虚拟机里面的Linux

    如何通过SecureCRT作为客户端连接Linux服务器
  2. 介绍SecureCRT,通过SSH2连接

    如何通过SecureCRT作为客户端连接Linux服务器
    如何通过SecureCRT作为客户端连接Linux服务器
    如何通过SecureCRT作为客户端连接Linux服务器
    如何通过SecureCRT作为客户端连接Linux服务器
  3. 当我们通过SecureCRT连接到Linux后,发现与Linux环境下的命令、颜色显示方式不同。

    如何通过SecureCRT作为客户端连接Linux服务器
  4. 需对SecureCRT进行调整,终端选择Linux,

    如何通过SecureCRT作为客户端连接Linux服务器
  5. 外观选择UTF-8,确定。

    如何通过SecureCRT作为客户端连接Linux服务器
  6. 通过修改后,发现与Linux环境下的命令显示方式一致,这样我们就会很方便的去维护Linux了。

    如何通过SecureCRT作为客户端连接Linux服务器

posted @ 2017-01-10 10:55 朱杰兵 阅读(125) | 评论 (0)编辑 收藏

Tomcat的安装
    解压缩
    # mkdir /usr/local/tomcat
    # cd /usr/local/tomcat
    # tar -zxvf /software/apache-tomcat-7.0.54.tar.gz
    生成链接以便版本升级
    # ln -s apache-tomcat-7.0.54 server


    启动Tomcat
    # cd /usr/local/tomcat/server/bin
    # ./startup.sh
    Using CATALINA_BASE: /usr/local/tomcat/server
    Using CATALINA_HOME: /usr/local/tomcat/server
    Using CATALINA_TEMDIR: /usr/local/tomcat/server/temp
    Using JRE_HOME: /usr/java/default
    Using CLASS_PATH: /usr/local/tomcat/server/bin/bootstrap.jar:/usr/local/tomcat/server/bin/tomcat-juli.jar
    Tomcat started.


    测试Tomcat:
    打开防火墙,使外部能访问
    # /sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
    # service iptables save
    # service iptables restart
    或直接修改文件/etc/sysconfig/iptables.
    # vi /etc/sysconfig/iptables
    -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT
    # service iptables restart
    在浏览器输入: http://192.168.16.133:8080
    如在本机可以输入: http://localhost:8080
    出现tomcat的页面表示安装成功.


    停止Tomcat
    # ./shutdown.sh

posted @ 2017-01-06 21:14 朱杰兵 阅读(83) | 评论 (0)编辑 收藏

JDK安装

  tar.gz为解压后就可以使用的版本,这里我将使用jdk-8u65-linux-x64.tar.gz版,安装到/usr/java/下

步骤一

  将文件jdk-8u65-linux-x64.gz移动到/usr/java/下,并解压:

  tar -xzvf  jdk-8u65-linux-x64.gz

      

步骤二

  在/etc/profile文件中,配置环境变量,是JDK在所有用户中生效:

  打开/etc/profile文件  vi /etc/profile

  

  编辑文件,在最后添加:

  export JAVA_HOME=/usr/java/jdk1.8.0_65
  export JRE_HOME=$JAVA_HOME/jre
  export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
  export PATH=$JAVA_HOME/bin:$PATH

  保存退出后,执行source /etc/profile是修改的环境变量生效

步骤三

  使用java -version命令测试是否成功

  

步骤四

  测试运行JAVA文件,使用javac 编译Test.java文件,使用java运行

  

  

  

posted @ 2017-01-06 20:51 朱杰兵 阅读(103) | 评论 (0)编辑 收藏

MA491-6NL5Q-AZAM0-ZH0N2-AAJ5A
5A6F6-88247-XZH59-HL0Q6-8CD2V
HF6QX-20187-2Z391-522NH-9AELT
5F29M-48312-8ZDF9-A8A5K-2AM0Z

posted @ 2017-01-06 16:25 朱杰兵 阅读(110) | 评论 (0)编辑 收藏

安装Vmware Tools后,系统桌面即会自动调整以适应当前的显示器。

1、在VMWare菜单VM下,install VMWare Tools

    系统自动加载VMWare Tools镜像,此时在ubuntu桌面能够看到,如下图所示。

双击打开光盘,里面有文件VMwareTools-8.8.2-590212.tar.gz,右键copy到桌面。如下图所示。

2、解压

  输入命令

  tar zxf /home/sunev/Desktop/VMwareTools-8.8.2-590212.tar.gz

  此时,桌面将出现一个名为 vmware-tools-distrib的文件夹,进入到该目录

  cd /home/sunev/Desktop/vmware-tools-distrib


3、安装

  执行安装命令

  sudo ./vmware-install.pl

  按提示安装即可,VMWare Tools安装完毕,在VMWare菜单View下Autosize选择Autofit Guest,重启一下ubuntu,这时,ubuntu的桌面占据了VMWare下的整个窗口。

posted @ 2017-01-06 16:22 朱杰兵 阅读(433) | 评论 (0)编辑 收藏

对于刚开始接触Linux系统的用户来说,先使用虚拟机Linux学习是不错的选择。但是在用虚拟机上网的时候,总是出现这样那样的错误,到底该怎么办呢?本文笔者和大家分享一下虚拟机Linux不能上网的简单有效的解决办法。我们一起开始吧!

工具/原料

  • 装有虚拟机Linux的电脑

1、Linux网络设置:

  1. 1

    依次单击【System】-->【Preferences】-->【Network Connections】,如下图所示: 

    虚拟机Linux不能上网简单有效的解决办法
  2. 2

    依次单击【Wired】-->【System eth0】-->【Edit】,如下图所示: 

    虚拟机Linux不能上网简单有效的解决办法
  3. 3

    勾选【Connect automaticlly】,然后点击【IPv4 Settings】,在下面的Method中选择【Automatic(DHCP)】,最后点击【Apply】,如下图所示:

    虚拟机Linux不能上网简单有效的解决办法
    END

2、恢复虚拟网络默认设置(在断网状态下):

  1. 1

    依次单击【编辑】-->【虚拟网络编辑器】,如下图所示:

    虚拟机Linux不能上网简单有效的解决办法
  2. 2

    点击【恢复默认设置】,如下图所示:

    虚拟机Linux不能上网简单有效的解决办法
    END

3、设置虚拟机上网方式为NAT:

  1. 在虚拟机关机状态下,双击【网络适配器】,如下图所示:

    虚拟机Linux不能上网简单有效的解决办法
  2. 勾选【启动时连接】,选中【NAT模式】,最后点击【确定】如下图所示:

    虚拟机Linux不能上网简单有效的解决办法
    END

4、见证成果:

1

在经过以上的设置之后,先在宿主机上联入互联网,然后启动虚拟机Linux,什么也不用做,直接打开Firefox就可以网上冲浪了。

posted @ 2017-01-06 16:20 朱杰兵 阅读(88) | 评论 (0)编辑 收藏

          
我在VMware虚拟机上安装完红帽Linux之后,使用ifconfig命令来看网卡的IP,但是,输入命令之后,eht0里面只有 inet6 addr 而没有 inet addr,不多说,上图。
解决办法
 1.vim /etc/sysconfig/network-scripts/ifcfg-eth0

    将里面的ONBOOT属性设置为 yes

    在执行service network restart 命令,就可以通过 ifconfig 查看eth0 的IP地址了

    重点是这样以后每次系统重启之后,都能自动获取IP 地址。所以问题解决了。

2.

 

解决办法如下:打开 虚拟机设置  /  硬件  / 网络适配器  将网络连接的方式设置为 NET:使用已共享的主机的IP地址(N),

 

然后重启虚拟机,输入密令ifconfig,便可拿到inter addr的地址


posted @ 2017-01-06 16:14 朱杰兵 阅读(661) | 评论 (0)编辑 收藏

直接干货:window-->preferences-->team-->Ignored Resource-->Add Pattern-->新建一个*/target/*-->ok,再次同步可见traget下所有文件已不在。

posted @ 2016-12-21 17:12 朱杰兵 阅读(315) | 评论 (0)编辑 收藏

     摘要: 使用Eclipse的maven构建一个web项目 1、选择建立Maven Project 选择File -> New -> Other,在New窗口中选择 Maven -> Maven Project;点击next          2、选择项目路径 Usedefault Workspace location默认...  阅读全文

posted @ 2016-12-18 16:33 朱杰兵 阅读(115) | 评论 (0)编辑 收藏

     摘要: 目前解决办法是导入以后,右键项目run as ,先maven clean再maven install Maven Install 错误:解决办法 :Eclipse Maven Clean -> Eclipse Maven Install或者Eclipse Project Clean -> Eclipse Maven Install-----...  阅读全文

posted @ 2016-12-15 13:18 朱杰兵 阅读(72) | 评论 (0)编辑 收藏

     摘要:   阅读全文

posted @ 2016-12-15 13:13 朱杰兵 阅读(102) | 评论 (0)编辑 收藏

     摘要: general--》content types   找到xml,下面框中add    *.zul   阅读全文

posted @ 2016-12-15 13:01 朱杰兵 阅读(156) | 评论 (0)编辑 收藏

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份

本章将系统地讲述Cookie与Session机制,并比较说明什么时候不能用Cookie,什么时候不能用Session。


1.1  Cookie机制

在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。

而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话即用户A购买了一件商品放入购物车内,当再次购买商品时服务器已经无法判断该购买行为是属于用户A的会话还是用户B的会话了。要跟踪该会话,必须引入一种机制。

Cookie就是这样的一种机制。它可以弥补HTTP协议无状态的不足。在Session出现之前,基本上所有的网站都采用Cookie来跟踪会话。

1.1.1  什么是Cookie

Cookie意为“甜饼”,是由W3C组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器如IE、Netscape、Firefox、Opera等都支持Cookie。

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理

Cookie实际上是一小段的文本信息。客户端请求服务器,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。



查看某个网站颁发的Cookie很简单。在浏览器地址栏输入JavaScript:alert (document. cookie)就可以了(需要有网才能查看)。JavaScript脚本会弹出一个对话框显示本网站颁发的所有Cookie的内容,如图1.1所示。


图1.1  Baidu网站颁发的Cookie


图1.1中弹出的对话框中显示的为Baidu网站的Cookie。其中第一行BAIDUID记录的就是笔者的身份helloweenvsfei,只是Baidu使用特殊的方法将Cookie信息加密了。


注意:Cookie功能需要浏览器的支持。

如果浏览器不支持Cookie(如大部分手机中的浏览器)或者把Cookie禁用了,Cookie功能就会失效。

不同的浏览器采用不同的方式保存Cookie。

IE浏览器会在“C:\Documents and Settings\你的用户名\Cookies”文件夹下以文本文件形式保存,一个文本文件保存一个Cookie。


1.1.2  记录用户访问次数

Java中把Cookie封装成了javax.servlet.http.Cookie类。每个Cookie都是该Cookie类的对象。服务器通过操作Cookie类对象对客户端Cookie进行操作。通过request.getCookie()获取客户端提交的所有Cookie(以Cookie[]数组形式返回),通过response.addCookie(Cookiecookie)向客户端设置Cookie。

Cookie对象使用key-value属性对的形式保存用户状态,一个Cookie对象保存一个属性对,一个request或者response同时使用多个Cookie。因为Cookie类位于包javax.servlet.http.*下面,所以JSP中不需要import该类。


1.1.3  Cookie的不可跨域名性

很多网站都会使用Cookie。例如,Google会向客户端颁发Cookie,Baidu也会向客户端颁发Cookie。那浏览器访问Google会不会也携带上Baidu颁发的Cookie呢?或者Google能不能修改Baidu颁发的Cookie呢?

答案是否定的。Cookie具有不可跨域名性根据Cookie规范,浏览器访问Google只会携带Google的Cookie,而不会携带Baidu的Cookie。Google也只能操作Google的Cookie,而不能操作Baidu的Cookie。

Cookie在客户端是由浏览器来管理的。浏览器能够保证Google只会操作Google的Cookie而不会操作Baidu的Cookie,从而保证用户的隐私安全。浏览器判断一个网站是否能操作另一个网站Cookie的依据是域名。Google与Baidu的域名不一样,因此Google不能操作Baidu的Cookie。

需要注意的是,虽然网站images.google.com与网站www.google.com同属于Google,但是域名不一样,二者同样不能互相操作彼此的Cookie。


注意:用户登录网站www.google.com之后会发现访问images.google.com时登录信息仍然有效,而普通的Cookie是做不到的。这是因为Google做了特殊处理。本章后面也会对Cookie做类似的处理。


1.1.4  Unicode编码:保存中文

中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对Unicode字符进行编码,否则会乱码。


提示:Cookie中保存中文只能编码。一般使用UTF-8编码即可。不推荐使用GBK等中文编码,因为浏览器不一定支持,而且JavaScript也不支持GBK编码。


1.1.5  BASE64编码:保存二进制图片

Cookie不仅可以使用ASCII字符与Unicode字符,还可以使用二进制数据。例如在Cookie中使用数字证书,提供安全度。使用二进制数据时也需要进行编码。

%注意:本程序仅用于展示Cookie中可以存储二进制内容,并不实用。由于浏览器每次请求服务器都会携带Cookie,因此Cookie内容不宜过多,否则影响速度。Cookie的内容应该少而精。


1.1.6  设置Cookie的所有属性

除了name与value之外,Cookie还具有其他几个常用的属性。每个属性对应一个getter方法与一个setter方法。Cookie类的所有属性如表1.1所示。

表1.1  Cookie常用属性

属  性  名

描    述

String name

该Cookie的名称。Cookie一旦创建,名称便不可更改

Object value

该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码

int maxAge

该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1

boolean secure

该Cookie是否仅被使用安全协议传输。安全协议。安全协议有HTTPS,SSL等,在网络上传输数据之前先将数据加密。默认为false

String path

该Cookie的使用路径。如果设置为“/sessionWeb/”,则只有contextPath为“/sessionWeb”的程序可以访问该Cookie。如果设置为“/”,则本域名下contextPath都可以访问该Cookie。注意最后一个字符必须为“/”

String domain

可以访问该Cookie的域名。如果设置为“.google.com”,则所有以“google.com”结尾的域名都可以访问该Cookie。注意第一个字符必须为“.”

String comment

该Cookie的用处说明。浏览器显示Cookie信息的时候显示该说明

int version

该Cookie使用的版本号。0表示遵循Netscape的Cookie规范,1表示遵循W3C的RFC 2109规范


1.1.7  Cookie的有效期

Cookie的maxAge决定着Cookie的有效期,单位为秒(Second)。Cookie中通过getMaxAge()方法与setMaxAge(int maxAge)方法来读写maxAge属性。

如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。


Cookie cookie = new Cookie("username","helloweenvsfei");   // 新建Cookie

cookie.setMaxAge(Integer.MAX_VALUE);           // 设置生命周期为MAX_VALUE

response.addCookie(cookie);                    // 输出到客户端


如果maxAge为负数,则表示该Cookie仅在本浏览器窗口以及本窗口打开的子窗口内有效,关闭窗口后该Cookie即失效。maxAge为负数的Cookie,为临时性Cookie,不会被持久化,不会被写到Cookie文件中。Cookie信息保存在浏览器内存中,因此关闭浏览器该Cookie就消失了。Cookie默认的maxAge值为–1。

如果maxAge为0,则表示删除该Cookie。Cookie机制没有提供删除Cookie的方法,因此通过设置该Cookie即时失效实现删除Cookie的效果。失效的Cookie会被浏览器从Cookie文件或者内存中删除,


例如:

Cookie cookie = new Cookie("username","helloweenvsfei");   // 新建Cookie

cookie.setMaxAge(0);                          // 设置生命周期为0,不能为负数

response.addCookie(cookie);                    // 必须执行这一句


response对象提供的Cookie操作方法只有一个添加操作add(Cookie cookie)。

要想修改Cookie只能使用一个同名的Cookie来覆盖原来的Cookie,达到修改的目的。删除时只需要把maxAge修改为0即可。


注意:从客户端读取Cookie时,包括maxAge在内的其他属性都是不可读的,也不会被提交。浏览器提交Cookie时只会提交name与value属性。maxAge属性只被浏览器用来判断Cookie是否过期。


1.1.8  Cookie的修改、删除

Cookie并不提供修改、删除操作。如果要修改某个Cookie,只需要新建一个同名的Cookie,添加到response中覆盖原来的Cookie。

如果要删除某个Cookie,只需要新建一个同名的Cookie,并将maxAge设置为0,并添加到response中覆盖原来的Cookie。注意是0而不是负数。负数代表其他的意义。读者可以通过上例的程序进行验证,设置不同的属性。


注意:修改、删除Cookie时,新建的Cookie除value、maxAge之外的所有属性,例如name、path、domain等,都要与原Cookie完全一样。否则,浏览器将视为两个不同的Cookie不予覆盖,导致修改、删除失败。


1.1.9  Cookie的域名

Cookie是不可跨域名的。域名www.google.com颁发的Cookie不会被提交到域名www.baidu.com去。这是由Cookie的隐私安全机制决定的。隐私安全机制能够禁止网站非法获取其他网站的Cookie。

正常情况下,同一个一级域名下的两个二级域名如www.helloweenvsfei.com和images.helloweenvsfei.com也不能交互使用Cookie,因为二者的域名并不严格相同。如果想所有helloweenvsfei.com名下的二级域名都可以使用该Cookie,需要设置Cookie的domain参数,例如:

Cookie cookie = new Cookie("time","20080808"); // 新建Cookie

cookie.setDomain(".helloweenvsfei.com");           // 设置域名

cookie.setPath("/");                              // 设置路径

cookie.setMaxAge(Integer.MAX_VALUE);               // 设置有效期

response.addCookie(cookie);                       // 输出到客户端


读者可以修改本机C:\WINDOWS\system32\drivers\etc下的hosts文件来配置多个临时域名,然后使用setCookie.jsp程序来设置跨域名Cookie验证domain属性。

注意:domain参数必须以点(".")开始。另外,name相同但domain不同的两个Cookie是两个不同的Cookie。如果想要两个域名完全不同的网站共有Cookie,可以生成两个Cookie,domain属性分别为两个域名,输出到客户端。


1.1.10  Cookie的路径

domain属性决定运行访问Cookie的域名,而path属性决定允许访问Cookie的路径(ContextPath)。例如,如果只允许/sessionWeb/下的程序使用Cookie,可以这么写:

Cookie cookie = new Cookie("time","20080808");     // 新建Cookie

cookie.setPath("/session/");                          // 设置路径

response.addCookie(cookie);                           // 输出到客户端

设置为“/”时允许所有路径使用Cookie。path属性需要使用符号“/”结尾。name相同但domain相同的两个Cookie也是两个不同的Cookie。


注意:页面只能获取它属于的Path的Cookie。例如/session/test/a.jsp不能获取到路径为/session/abc/的Cookie。使用时一定要注意。


1.1.11  Cookie的安全属性

HTTP协议不仅是无状态的,而且是不安全的。使用HTTP协议的数据不经过任何加密就直接在网络上传播,有被截获的可能。使用HTTP协议传输很机密的内容是一种隐患。如果不希望Cookie在HTTP等非安全协议中传输,可以设置Cookie的secure属性为true。浏览器只会在HTTPS和SSL等安全协议中传输此类Cookie。下面的代码设置secure属性为true:


Cookie cookie = new Cookie("time", "20080808"); // 新建Cookie

cookie.setSecure(true);                           // 设置安全属性

response.addCookie(cookie);                        // 输出到客户端


提示:secure属性并不能对Cookie内容加密,因而不能保证绝对的安全性。如果需要高安全性,需要在程序中对Cookie内容加密、解密,以防泄密。


1.1.12  JavaScript操作Cookie

Cookie是保存在浏览器端的,因此浏览器具有操作Cookie的先决条件。浏览器可以使用脚本程序如JavaScript或者VBScript等操作Cookie。这里以JavaScript为例介绍常用的Cookie操作。例如下面的代码会输出本页面所有的Cookie。

<script>document.write(document.cookie);</script>

由于JavaScript能够任意地读写Cookie,有些好事者便想使用JavaScript程序去窥探用户在其他网站的Cookie。不过这是徒劳的,W3C组织早就意识到JavaScript对Cookie的读写所带来的安全隐患并加以防备了,W3C标准的浏览器会阻止JavaScript读写任何不属于自己网站的Cookie。换句话说,A网站的JavaScript程序读写B网站的Cookie不会有任何结果。


1.1.13  案例:永久登录

如果用户是在自己家的电脑上上网,登录时就可以记住他的登录信息,下次访问时不需要再次登录,直接访问即可。实现方法是把登录信息如账号、密码等保存在Cookie中,并控制Cookie的有效期,下次访问时再验证Cookie中的登录信息即可。

保存登录信息有多种方案。最直接的是把用户名与密码都保持到Cookie中,下次访问时检查Cookie中的用户名与密码,与数据库比较。这是一种比较危险的选择,一般不把密码等重要信息保存到Cookie中

还有一种方案是把密码加密后保存到Cookie中,下次访问时解密并与数据库比较这种方案略微安全一些。如果不希望保存密码,还可以把登录的时间戳保存到Cookie与数据库中,到时只验证用户名与登录时间戳就可以了。

这几种方案验证账号时都要查询数据库。

本例将采用另一种方案,只在登录时查询一次数据库,以后访问验证登录信息时不再查询数据库。实现方式是把账号按照一定的规则加密后,连同账号一块保存到Cookie中。下次访问时只需要判断账号的加密规则是否正确即可本例把账号保存到名为account的Cookie中,把账号连同密钥用MD1算法加密后保存到名为ssid的Cookie中。验证时验证Cookie中的账号与密钥加密后是否与Cookie中的ssid相等。相关代码如下:

代码1.8 loginCookie.jsp

<%@ page language="java"pageEncoding="UTF-8" isErrorPage="false" %>

<%!                                                  // JSP方法

    private static final String KEY =":cookie@helloweenvsfei.com";
                                                     // 密钥 

    public final static String calcMD1(Stringss) { // MD1 加密算法

       String s = ss==null ?"" : ss;                  // 若为null返回空

       char hexDigits[] = { '0','1', '2', '3', '4', '1', '6', '7', '8', '9',
       'a', 'b', 'c', 'd', 'e', 'f' };                        // 字典

       try {

        byte[] strTemp =s.getBytes();                          // 获取字节

        MessageDigestmdTemp = MessageDigest.getInstance("MD1"); // 获取MD1

       mdTemp.update(strTemp);                                // 更新数据

        byte[] md =mdTemp.digest();                        // 加密

        int j =md.length;                                 // 加密后的长度

        char str[] = newchar[j * 2];                       // 新字符串数组

        int k =0;                                         // 计数器k

        for (int i = 0; i< j; i++) {                       // 循环输出

         byte byte0 =md[i];

         str[k++] =hexDigits[byte0 >>> 4 & 0xf];

         str[k++] =hexDigits[byte0 & 0xf];

        }

        return newString(str);                             // 加密后字符串

       } catch (Exception e){return null; }

    }

%>

<%

   request.setCharacterEncoding("UTF-8");             // 设置request编码

    response.setCharacterEncoding("UTF-8");        // 设置response编码

   

    String action =request.getParameter("action"); // 获取action参数

   

    if("login".equals(action)){                       // 如果为login动作

        String account =request.getParameter("account");
                                                     // 获取account参数

        String password =request.getParameter("password");
                                                     // 获取password参数

        int timeout = newInteger(request.getParameter("timeout"));
                                                     // 获取timeout参数

              

        String ssid =calcMD1(account + KEY); // 把账号、密钥使用MD1加密后保存

       

        CookieaccountCookie = new Cookie("account", account);
                                                     // 新建Cookie

       accountCookie.setMaxAge(timeout);              // 设置有效期

       

        Cookie ssidCookie =new Cookie("ssid", ssid);   // 新建Cookie

       ssidCookie.setMaxAge(timeout);                 // 设置有效期

       

       response.addCookie(accountCookie);             // 输出到客户端

       response.addCookie(ssidCookie);            // 输出到客户端

       

        // 重新请求本页面,参数中带有时间戳,禁止浏览器缓存页面内容

       response.sendRedirect(request.getRequestURI() + "?" + System.
        currentTimeMillis());

        return;

    }

    elseif("logout".equals(action)){                  // 如果为logout动作

       

        CookieaccountCookie = new Cookie("account", "");
                                                 // 新建Cookie,内容为空

       accountCookie.setMaxAge(0);                // 设置有效期为0,删除

              

        Cookie ssidCookie =new Cookie("ssid", ""); // 新建Cookie,内容为空

       ssidCookie.setMaxAge(0);                   // 设置有效期为0,删除

       response.addCookie(accountCookie);         // 输出到客户端

       response.addCookie(ssidCookie);         // 输出到客户端

        //重新请求本页面,参数中带有时间戳,禁止浏览器缓存页面内容

       response.sendRedirect(request.getRequestURI() + "?" + System.
        currentTimeMillis());

        return;

    }

    boolean login = false;                        // 是否登录

    String account = null;                        // 账号

    String ssid = null;                           // SSID标识

   

    if(request.getCookies() !=null){               // 如果Cookie不为空

        for(Cookie cookie :request.getCookies()){  // 遍历Cookie

           if(cookie.getName().equals("account"))  // 如果Cookie名为
                                                    account

               account = cookie.getValue();       // 保存account内容

           if(cookie.getName().equals("ssid")) // 如果为SSID

               ssid = cookie.getValue();          // 保存SSID内容

        }

    }

    if(account != null && ssid !=null){    // 如果account、SSID都不为空

        login =ssid.equals(calcMD1(account + KEY));
                                      // 如果加密规则正确, 则视为已经登录

    }

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">

       <legend><%= login ? "欢迎您回来" : "请先登录"%></legend>

        <% if(login){%>

            欢迎您, ${ cookie.account.value }. &nbsp;&nbsp;

           <a href="${ pageContext.request.requestURI }?action=logout">
            注销</a>

        <% } else {%>

        <formaction="${ pageContext.request.requestURI }?action=login"
        method="post">

           <table>

               <tr><td>账号: </td>

                   <td><input type="text"name="account" style="width:
                   200px; "></td>

               </tr>

               <tr><td>密码: </td>

                   <td><inputtype="password" name="password"></td>

               </tr>

               <tr>

                   <td>有效期: </td>

                   <td><inputtype="radio" name="timeout" value="-1"
                   checked> 关闭浏览器即失效 <br/> <input type="radio"
                   name="timeout" value="<%= 30 *24 * 60 * 60 %>"> 30天
                   内有效 <br/><input type="radio" name="timeout" value=
                   "<%= Integer.MAX_VALUE %>"> 永久有效 <br/> </td> </tr>

               <tr><td></td>

                   <td><input type="submit"value=" 登  录 " class=
                   "button"></td>

               </tr>

           </table>

        </form>

        <% } %>

登录时可以选择登录信息的有效期:关闭浏览器即失效、30天内有效与永久有效。通过设置Cookie的age属性来实现,注意观察代码。运行效果如图1.7所示。


图1.7  永久登录

提示:该加密机制中最重要的部分为算法与密钥。由于MD1算法的不可逆性,即使用户知道了账号与加密后的字符串,也不可能解密得到密钥。因此,只要保管好密钥与算法,该机制就是安全的。


1.2  Session机制

除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力

1.2.1  什么是Session

Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。

如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

1.2.2  实现用户登录

Session对应的类为javax.servlet.http.HttpSession类。每个来访者对应一个Session对象,所有该客户的状态信息都保存在这个Session对象里。Session对象是在客户端第一次请求服务器的时候创建的。Session也是一种key-value的属性对,通过getAttribute(Stringkey)和setAttribute(String key,Objectvalue)方法读写客户状态信息。Servlet里通过request.getSession()方法获取该客户的Session,

例如:

HttpSession session = request.getSession();       // 获取Session对象

session.setAttribute("loginTime", new Date());     // 设置Session中的属性

   

out.println("登录时间为:" +(Date)session.getAttribute("loginTime"));      // 获取Session属性

request还可以使用getSession(boolean create)来获取Session。区别是如果该客户的Session不存在,request.getSession()方法会返回null,而getSession(true)会先创建Session再将Session返回。

Servlet中必须使用request来编程式获取HttpSession对象,而JSP中内置了Session隐藏对象,可以直接使用。如果使用声明了<%@page session="false" %>,则Session隐藏对象不可用。下面的例子使用Session记录客户账号信息。

源代码如下:

代码1.9  session.jsp

<%@ page language="java" pageEncoding="UTF-8"%>

<jsp:directive.page import="com.helloweenvsfei.sessionWeb.bean.Person"/>

<jsp:directive.page import="java.text.SimpleDateFormat"/>

<jsp:directive.page import="java.text.DateFormat"/>

<jsp:directive.page import="java.util.Date"/>

<%!

    DateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd");         // 日期格式化器

%>

<%

    response.setCharacterEncoding("UTF-8");        // 设置request编码

    Person[] persons =

    {          

       // 基础数据,保存三个人的信息

        new Person("Liu Jinghua","password1", 34, dateFormat.parse
        ("1982-01-01")),

        new Person("Hello Kitty","hellokitty", 23, dateFormat.parse
        ("1984-02-21")),

        new Person("Garfield", "garfield_pass",23, dateFormat.parse
        ("1994-09-12")),

     };

   

    String message = "";                      // 要显示的消息

   

    if(request.getMethod().equals("POST"))

    {

        // 如果是POST登录       

        for(Person person :persons)

        {          

            // 遍历基础数据,验证账号、密码

            // 如果用户名正确且密码正确

           if(person.getName().equalsIgnoreCase(request.getParameter("username"))&&person.getPassword().equals(request.getParameter("password")))

           {              

               // 登录成功,设置将用户的信息以及登录时间保存到Session

               session.setAttribute("person", person);                   // 保存登录的Person

               session.setAttribute("loginTime", new Date());          // 保存登录的时间              

               response.sendRedirect(request.getContextPath() + "/welcome.jsp");

               return;

            }

        }      

        message = "用户名密码不匹配,登录失败。";       // 登录失败

    }

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">

<html>

    // ... HTML代码为一个FORM表单,代码略,请看随书光盘

</html>


登录界面验证用户登录信息,如果登录正确,就把用户信息以及登录时间保存进Session,然后转到欢迎页面welcome.jsp。welcome.jsp中从Session中获取信息,并将用户资料显示出来。

welcome.jsp代码如下:

代码1.10  welcome.jsp

<%@ page language="java" pageEncoding="UTF-8"%>

<jsp:directive.pageimport="com.helloweenvsfei.sessionWeb.bean.Person"/>

<jsp:directive.page import="java.text.SimpleDateFormat"/>

<jsp:directive.page import="java.text.DateFormat"/>

<jsp:directive.page import="java.util.Date"/>

<%!

    DateFormat dateFormat = newSimpleDateFormat("yyyy-MM-dd");         // 日期格式化器

%>

<%

    Person person =(Person)session.getAttribute("person");                       // 获取登录的person

    Date loginTime =(Date)session.getAttribute("loginTime");                     // 获取登录时间

%>

    // ... 部分HTML代码略

            <table>

               <tr><td>您的姓名:</td>

                   <td><%= person.getName()%></td>

               </tr>

               <tr><td>登录时间:</td>

                   <td><%= loginTime%></td>

               </tr>

               <tr><td>您的年龄:</td>

                   <td><%= person.getAge()%></td>

               </tr>

               <tr><td>您的生日:</td>

                   <td><%=dateFormat.format(person.getBirthday()) %></td>

               </tr>

            </table>

程序运行效果如图1.8所示。


图1.8  使用Session记录用户信息

注意程序中Session中直接保存了Person类对象与Date类对象,使用起来要比Cookie方便。

当多个客户端执行程序时,服务器会保存多个客户端的Session。获取Session的时候也不需要声明获取谁的Session。Session机制决定了当前客户只会获取到自己的Session,而不会获取到别人的Session。各客户的Session也彼此独立,互不可见


提示Session的使用比Cookie方便,但是过多的Session存储在服务器内存中,会对服务器造成压力。


1.2.3  Session的生命周期

Session保存在服务器端。为了获得更高的存取速度,服务器一般把Session放在内存里。每个用户都会有一个独立的Session。如果Session内容过于复杂,当大量客户访问服务器时可能会导致内存溢出。因此,Session里的信息应该尽量精简。

Session在用户第一次访问服务器的时候自动创建。需要注意只有访问JSP、Servlet等程序时才会创建Session,只访问HTML、IMAGE等静态资源并不会创建Session。如果尚未生成Session,也可以使用request.getSession(true)强制生成Session。

Session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,并维护该Session用户每访问服务器一次,无论是否读写Session,服务器都认为该用户的Session“活跃(active)”了一次。


1.2.4  Session的有效期

由于会有越来越多的用户访问服务器,因此Session也会越来越多。为防止内存溢出,服务器会把长时间内没有活跃的Session从内存删除。这个时间就是Session的超时时间。如果超过了超时时间没访问过服务器,Session就自动失效了。

Session的超时时间为maxInactiveInterval属性,可以通过对应的getMaxInactiveInterval()获取,通过setMaxInactiveInterval(longinterval)修改。

Session的超时时间也可以在web.xml中修改。另外,通过调用Session的invalidate()方法可以使Session失效。


1.2.5  Session的常用方法

Session中包括各种方法,使用起来要比Cookie方便得多。Session的常用方法如表1.2所示。

表1.2  HttpSession的常用方法

方  法  名

描    述

void setAttribute(String attribute, Object value)

设置Session属性。value参数可以为任何Java Object。通常为Java Bean。value信息不宜过大

String getAttribute(String attribute)

返回Session属性

Enumeration getAttributeNames()

返回Session中存在的属性名

void removeAttribute(String attribute)

移除Session属性

String getId()

返回Session的ID。该ID由服务器自动创建,不会重复

long getCreationTime()

返回Session的创建日期。返回类型为long,常被转化为Date类型,例如:Date createTime = new Date(session.get CreationTime())

long getLastAccessedTime()

返回Session的最后活跃时间。返回类型为long

int getMaxInactiveInterval()

返回Session的超时时间。单位为秒。超过该时间没有访问,服务器认为该Session失效

void setMaxInactiveInterval(int second)

设置Session的超时时间。单位为秒

void putValue(String attribute, Object value)

不推荐的方法。已经被setAttribute(String attribute, Object Value)替代

Object getValue(String attribute)

不被推荐的方法。已经被getAttribute(String attr)替代

boolean isNew()

返回该Session是否是新创建的

void invalidate()

使该Session失效

Tomcat中Session的默认超时时间为20分钟。通过setMaxInactiveInterval(int seconds)修改超时时间。可以修改web.xml改变Session的默认超时时间。例如修改为60分钟:

<session-config>

   <session-timeout>60</session-timeout>      <!-- 单位:分钟 -->

</session-config>


注意:<session-timeout>参数的单位为分钟,而setMaxInactiveInterval(int s)单位为秒。


1.2.6  Session对浏览器的要求

虽然Session保存在服务器,对客户端是透明的,它的正常运行仍然需要客户端浏览器的支持。这是因为Session需要使用Cookie作为识别标志。HTTP协议是无状态的,Session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为JSESSIONID的Cookie,它的值为该Session的id(也就是HttpSession.getId()的返回值)。Session依据该Cookie来识别是否为同一用户。

该Cookie为服务器自动生成的,它的maxAge属性一般为–1,表示仅当前浏览器内有效,并且各浏览器窗口间不共享,关闭浏览器就会失效。

因此同一机器的两个浏览器窗口访问服务器时,会生成两个不同的Session。但是由浏览器窗口内的链接、脚本等打开的新窗口(也就是说不是双击桌面浏览器图标等打开的窗口)除外。这类子窗口会共享父窗口的Cookie,因此会共享一个Session。


注意:新开的浏览器窗口会生成新的Session,但子窗口除外。子窗口会共用父窗口的Session。例如,在链接上右击,在弹出的快捷菜单中选择“在新窗口中打开”时,子窗口便可以访问父窗口的Session。

如果客户端浏览器将Cookie功能禁用,或者不支持Cookie怎么办?例如,绝大多数的手机浏览器都不支持Cookie。Java Web提供了另一种解决方案:URL地址重写。


1.2.7  URL地址重写

URL地址重写是对客户端不支持Cookie的解决方案。URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写,例如:

<td>

    <a href="<%=response.encodeURL("index.jsp?c=1&wd=Java") %>">
    Homepage</a>

</td>

该方法会自动判断客户端是否支持Cookie。如果客户端支持Cookie,会将URL原封不动地输出来。如果客户端不支持Cookie,则会将用户Session的id重写到URL中。重写后的输出可能是这样的:

<td>

    <ahref="index.jsp;jsessionid=0CCD096E7F8D97B0BE608AFDC3E1931E?c=
    1&wd=Java">Homepage</a>

</td>

即在文件名的后面,在URL参数的前面添加了字符串“;jsessionid=XXX”。其中XXX为Session的id。分析一下可以知道,增添的jsessionid字符串既不会影响请求的文件名,也不会影响提交的地址栏参数。用户单击这个链接的时候会把Session的id通过URL提交到服务器上,服务器通过解析URL地址获得Session的id。

如果是页面重定向(Redirection),URL地址重写可以这样写:

<%

    if(“administrator”.equals(userName))

    {

       response.sendRedirect(response.encodeRedirectURL(“administrator.jsp”));

        return;

    }

%>

效果跟response.encodeURL(String url)是一样的:如果客户端支持Cookie,生成原URL地址,如果不支持Cookie,传回重写后的带有jsessionid字符串的地址。

对于WAP程序,由于大部分的手机浏览器都不支持Cookie,WAP程序都会采用URL地址重写来跟踪用户会话。比如用友集团的移动商街等。


注意:TOMCAT判断客户端浏览器是否支持Cookie的依据是请求中是否含有Cookie。尽管客户端可能会支持Cookie,但是由于第一次请求时不会携带任何Cookie(因为并无任何Cookie可以携带),URL地址重写后的地址中仍然会带有jsessionid。当第二次访问时服务器已经在浏览器中写入Cookie了,因此URL地址重写后的地址中就不会带有jsessionid了。


1.2.8  Session中禁止使用Cookie

既然WAP上大部分的客户浏览器都不支持Cookie,索性禁止Session使用Cookie,统一使用URL地址重写会更好一些。Java Web规范支持通过配置的方式禁用Cookie。下面举例说一下怎样通过配置禁止使用Cookie。

打开项目sessionWeb的WebRoot目录下的META-INF文件夹(跟WEB-INF文件夹同级,如果没有则创建),打开context.xml(如果没有则创建),编辑内容如下:

代码1.11 /META-INF/context.xml

<?xml version='1.0' encoding='UTF-8'?>

<Context path="/sessionWeb"cookies="false">

</Context>


或者修改Tomcat全局的conf/context.xml,修改内容如下:

代码1.12  context.xml

<!-- The contents of this file will be loaded for eachweb application -->

<Context cookies="false">

    <!-- ... 中间代码略 -->

</Context>

部署后TOMCAT便不会自动生成名JSESSIONID的Cookie,Session也不会以Cookie为识别标志,而仅仅以重写后的URL地址为识别标志了。


注意:该配置只是禁止Session使用Cookie作为识别标志,并不能阻止其他的Cookie读写。也就是说服务器不会自动维护名为JSESSIONID的Cookie了,但是程序中仍然可以读写其他的Cookie。

posted @ 2016-11-02 16:07 朱杰兵 阅读(126) | 评论 (0)编辑 收藏

     摘要: window--》preference  阅读全文

posted @ 2016-10-25 10:30 朱杰兵 阅读(124) | 评论 (0)编辑 收藏

     摘要: 项目右键--》build path --》configura build path--》included是包括,exclude是屏蔽,点击edit屏蔽package后,下面的java文件变成了  阅读全文

posted @ 2016-10-21 14:17 朱杰兵 阅读(128) | 评论 (0)编辑 收藏

     摘要: http://www.tuicool.com/articles/zUjiIb  阅读全文

posted @ 2016-07-25 17:00 朱杰兵 阅读(126) | 评论 (0)编辑 收藏

1.原始库执行export user objects导出表结构(包括存储过程)的sql。
2.通过dblink同步数据
3.用insert into select 复制数据
insert into DC_FLIGHT_FLOW SELECT * FROM NATSRS.DC_FLIGHT_FLOW@DBLINK_NATSRS_TEST1

posted @ 2016-07-08 17:25 朱杰兵 阅读(361) | 评论 (0)编辑 收藏

A connect to B
1.登录A库,在database links菜单new

connect to 填B库的信息。
view sql:
create database link DBLINK_NATSRS_TEST1
  connect to NATSRS
  using '172.28.16.79:1530/NATSRS';
这样就可以查看
select * from  NATSRS.dc_flight@DBLINK_NATSRS_TEST1

---------------------------------------------------------------------------
报错权限不足,解决办法:
登录sys,执行
grant CREATE PUBLIC DATABASE LINK,DROP PUBLIC DATABASE LINK to natsrs_test1;
grant create database link to natsrs_test1;

资料:
赋予创建dblink的权限有三种:
grant create database link to user ; --只有user用户能使用的dblink
grant create public database link to user ;--所有用户都可以使用的dblink
grant drop public database link to user; --删除dblink的权限

select * from user_sys_privs t
  where t.privilege like upper('%link%');
  1 SYS CREATE DATABASE LINK NO
  2 SYS DROP PUBLIC DATABASE LINK NO
  3 SYS CREATE PUBLIC DATABASE LINK NO

posted @ 2016-07-07 12:12 朱杰兵 阅读(614) | 评论 (0)编辑 收藏

     摘要: 1.步骤:tools ->export user object 选择选项,导出.sql文件  导出的是建表语句(包括存储结构)2.登录目标库,打开command window ,把sql文件内容copy进去,自动执行。找资料--------------------------------------------------------------------------------...  阅读全文

posted @ 2016-07-06 15:58 朱杰兵 阅读(609) | 评论 (0)编辑 收藏

Eclipse中的svn冲突解决办法:

1.        点击提交,报错——‘SVN提交’has encountered a problem.

2.        选中无法提交的文件,点击更新操作。多出三个文件,分别是:“.mine”“r(xxx+1)”“r(xxx)”其中xxx为版本号。“.mine”是我要提交的文件,“.r(xxx)”是我是在这个版本文件基础上修改后产生冲突的。“r(xxx+1)”是目前svn服务器最新版本的内容是这样。

3.        我们通过手动处理源文件“.Java”,得到自己真实想要上传到svn的文件后。右击Team->标记为解决(Mark as Merged)。默认选择第一个“标记为冲突解决”,点击OK。刚才的三个文件将消失,剩下自己的源文件。

4.        编辑源文件为自己真正想要到svn服务器上的最新版本文件。右击Team->提交,冲突解决。

posted @ 2016-06-17 17:39 朱杰兵 阅读(1553) | 评论 (0)编辑 收藏

     摘要: 1、 新建PDM:选择菜单File->New Model,【Model type】选择Physical Data Model,【Model name】 自由命名,【DBMS】选择“ORACLE Version 10gR2”,OK。2、 选择DataBase->Configure Connections-->connection profiles,点击...  阅读全文

posted @ 2016-06-12 15:46 朱杰兵 阅读(131) | 评论 (0)编辑 收藏

     摘要: 1.将 (net.sf.jadclipse_3.3.0.jar)文件放入 ..\eclipse\dropins目录下2.将 (jad.exe)文件放入 ..\jdk\bin目录下 (其他class path 路径也行)3.重启eclipse  --> Window -->Preferences-->搜索 jad搜索的到说明安装成功path to decompiler 修...  阅读全文

posted @ 2016-06-03 10:30 朱杰兵 阅读(117) | 评论 (0)编辑 收藏

     摘要: Oracle中的四种时间类型DateTimestampTimestamp with local time zoneTimestamp with time zone这四种类型中,前两个与时区完全无关,它们的“行为”就像varchar2或者number类型一样,就是你插入时是什么值,那么存储的也是一样的值,同时查询出来的也是一样的值(包括你在.NET环境下用ADO.NET或者O...  阅读全文

posted @ 2016-05-06 17:13 朱杰兵 阅读(252) | 评论 (0)编辑 收藏

     摘要: package com.what21.service.demo02; import java.io.BufferedReader;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.HttpURLConnection;import java.net.URL; public cl...  阅读全文

posted @ 2016-04-26 13:06 朱杰兵 阅读(255) | 评论 (0)编辑 收藏

http://www.cnblogs.com/siqi/p/3475222.html
import java.io.InputStream; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; /**  * 通过UrlConnection调用Webservice服务  *  */ public class App {      public static void main(String[] args) throws Exception {         //服务的地址         URL wsUrl = new URL("http://192.168.1.100:6789/hello");                  HttpURLConnection conn = (HttpURLConnection) wsUrl.openConnection();                  conn.setDoInput(true);         conn.setDoOutput(true);         conn.setRequestMethod("POST");         conn.setRequestProperty("Content-Type", "text/xml;charset=UTF-8");                  OutputStream os = conn.getOutputStream();                  //请求体         String soap = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:q0=\"http://ws.itcast.cn/\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">" +                        "<soapenv:Body> <q0:sayHello><arg0>aaa</arg0>  </q0:sayHello> </soapenv:Body> </soapenv:Envelope>";                  os.write(soap.getBytes());                  InputStream is = conn.getInputStream();                  byte[] b = new byte[1024];         int len = 0;         String s = "";         while((len = is.read(b)) != -1){             String ss = new String(b,0,len,"UTF-8");             s += ss;         }         System.out.println(s);                  is.close();         os.close();         conn.disconnect();     } }

posted @ 2016-04-25 17:14 朱杰兵 阅读(105) | 评论 (0)编辑 收藏

isNotNull和isEmpty区别
<= 和>=需要关键字替代

posted @ 2016-04-14 10:13 朱杰兵 阅读(69) | 评论 (0)编辑 收藏

String time = DateUtils.formatDate(date, "yyyy-MM-dd HH:mm:ss");
月MM大写,分钟mm小写,HH小时大写

posted @ 2016-04-13 14:50 朱杰兵 阅读(93) | 评论 (0)编辑 收藏

t.dpt_time between to_date('2015/01/01','yyyy/mm/dd') and   
  to_date('2015/12/31','yyyy/mm/dd')
将取不到12月31日0点以后的数据
解决办法 trunc一下trunc(t.dpt_time)


posted @ 2016-04-13 13:23 朱杰兵 阅读(97) | 评论 (0)编辑 收藏

select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual;
select to_char(sysdate,'yyyy-mm-dd hh24:mm:ss') from dual;

'yyyy-mm-dd hh24:mi:ss':mi 分钟  'yyyy-mm-dd hh24:mm:ss':mm 月份 其中两个都是月份


posted @ 2016-03-07 11:12 朱杰兵 阅读(91) | 评论 (0)编辑 收藏

window-preference-java-code style-clean up 和formatter     导入
见worksoftware formate by eclipse plugin

posted @ 2016-01-14 16:39 朱杰兵 阅读(111) | 评论 (0)编辑 收藏

// File file=new File("F:\\top50.png");D:\worksoftware\apache-tomcat-7.0.27\apache-tomcat-7.0.27\webapps\jzbz\
File file=new File(path+"\\images\\ceairLogo.png");

HttpServletRequest request = (HttpServletRequest) Executions.getCurrent().getNativeRequest();
String path = request.getSession().getServletContext().getRealPath("/");

posted @ 2016-01-14 10:53 朱杰兵 阅读(92) | 评论 (0)编辑 收藏

varchar2(10) 可以存5个中文,10个字母

posted @ 2015-12-15 15:31 朱杰兵 阅读(107) | 评论 (0)编辑 收藏

如果让eclipse识别*.zul是xml格式文件呢:Window -->Preferences -->Generals --> Content Type -->Text --> xml --> 点击add按钮 -->输入*.zul -->Ok      这样*.zul扩展的文件eclipse会识别其为xml文件格式

posted @ 2015-10-22 09:41 朱杰兵 阅读(410) | 评论 (0)编辑 收藏

package cn.javase.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class BeforeDate {
 
 public static void main(String[] args) throws Exception {
  
  java.util.Date nowdate=new java.util.Date();
  String myString = "2008/09/02";
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd", Locale.CHINA);
  Date d = sdf.parse(myString);

  boolean flag = d.before(nowdate);
  if(flag){
   System.out.print("早于今天") ;
  }else{
   System.out.print("晚于今天") ;
  }
  
  
 }

}

posted @ 2015-10-15 12:31 朱杰兵 阅读(229) | 评论 (0)编辑 收藏

生活中经常可以看到这样的人,盖头、老虎T恤、豆豆鞋、大金链子小脚裤、胳肢窝夹一小包,大H皮带,扎起来虎虎的。泡澡唱K抱小妹,小费保底880,抽的是芙蓉王,搓的是一百块的麻,俨然过的是一种富逼的生活。有人管这类人叫社会炮子。
有人不禁就纳闷了,这些炮子,平时也没见他们上班,似乎也没啥产业,除了个别几个是二代,大部分的家里条件也不咋地,为啥这过的日子就这么滋润呢?哥就在这里给你们分析分析这些炮子是如何过日子的。
说 起炮子,很多人第一反应就是低学历盲流从事的一种不正当职业,或者说是边缘职业。说起他们的工作内容,第一反应也大多是敲诈勒索、砍人收账、放高利贷、拉 皮条、收保护费等黑社会主营业务。因为这种偏见,所以人们在现实生活中对炮子也是敬而远之,生怕在人群中多看了他几眼,回头脑袋就被削放屁。但其实炮子的 生存状态并不是人们想象中的这样,大多数的炮子虽说大字不识几个,但那些掉脑袋完犊子的事还是不会干的。那么他们究竟是怎么生存下来的,并且生活得比一般 小白领好呢?下面哥就给你们介绍几种炮子日常从事的工作。

1、放炮
     炮子炮子,顾名思义就得跟炮扯上点关系。从事放炮行 业的炮子,一般是高端炮子,属于炮子里边的金领。这类炮子普遍拖家带口,背上纹的圣斗士星矢因为岁月的侵袭早已经面瘫发福,腰围也基本告别了呼啦圈。作为 炮子里边唯一持有名片的一类人,他们出去多以金融行业工作者自居。这类人有固定的工作场所,比较常见的如“XX汽车租赁公司”、“XX投资咨询公司”等 等,放出去的款利息一般在5分到2毛之间,客户主要是小老板以及赌狗。公司的硬件配置简约商务又不失中国风,通常是一张老板桌加一台电脑,外加一套沙发茶 几和一套功夫茶具,三五个穿着虎头T恤的纹身男子每天的工作就是在那抠脚唠嗑摇微信,行情好的时候,月入几十万就跟放个屁一样不费吹灰之力。
     有 人要问了,这放高利贷不是风险挺大么?那只能说你不了解这个行业。早几年因为资金链断了的事,一帮炮子上了高速,这事情反响很恶劣。眼看这个行业就要垮 了,个别具有企业家责任感的炮子痛定思痛开始琢磨开始反思,终于研究出一套万无一失的放炮策略,重新确立了一套行业标准——比如你找我借钱,抵押物就得先 过户(抵押物价值必须大于本金),然后我再以租金的形式收你利息。这样就算上了公堂,你都赖不掉一个子儿。

2、收账
      这 个岗位主要是依托于“汽车租赁公司”、“投资咨询公司”以及“私家侦探工作室”。说是收账,其实就是讨债。借人钱的时候你是爷,问人要钱的时候就成了孙 子,相信有过这种感受的人不在少数。但这里说的收账,干的绝对不是孙子的事。有业内人士曾经跟我透露,一般出去收账都是三到五个人,盖头、运动装,有条件 的挂根链子。这些人不像人们想象中那样,动不动就上去把人扇蒙逼,不还钱就把人孩子手脚砍掉老婆抓去接客,那都是电影里瞎鸡巴扯淡。一般以骚扰恐吓等软暴 力为主,比如三五个人到人家里呆个几天,呆的时候还必须跟呆自己家一样随意,该干嘛就干嘛。又比如,挑个夜黑风高的晚上,瞄准人家玻璃窗用特制弹弓啾啾一 顿弹,弹到碎成渣。又比如遇到假装不在家不给开门的时候,就拉一麻袋蛇塞进去或者是放鞭炮。等等。
      这些人一般出勤一次在300到 500,提成在15个点左右。一般讨债公司的收费标准都是按照收款数层级提成,比如三十万以下的30% 、五十万以下的25% 、百万以下的20% 、百 万以上的15% 比如讨债公司接了一笔50万的单,按照行业平均水平,50万的一般提25%,那么就是125000,按照125000的15%算就是 18750,如果三个人出勤每人分到的就是6250。
业务能力出色的炮子,一个月能抓住一两单收入过万就妥妥的了,就算没收到账,光出勤费就足以傲视那些小白领了,吃喝抽还不用自己掏钱,炮界一半的好事都让他占尽了。

3、望风
     黄赌毒自建国以来就是脑袋挂裤裆的行业,野火烧不尽春风吹又生。为了配合行业发展需要,望风这个职业应运而生。因为毒的量刑尤其严重,一般进去了就是一辈子的事,所以机智的炮子们主要是配合黄和赌两个行业开展工作。
     望 风这个职业要求炮子们具备一定的反侦查能力,而且对长相气质也有一定的要求。一般从事这个职业的炮子大多都貌不惊人,属于走在人群中分分钟就被淹没的那 种。反过来说,你要看到三五成群浑身长膘光膀子褶子脑袋的在那扎堆,傻逼都知道那没好事吧?经过哥这么一分析,你有兴趣的话可以在晚上11、2点到你们那 小发廊扎堆的地儿留意观察一下,一般准有固定的那么一批人,分散开来在夜色中做唠嗑状。或是搬个小板凳在那佯装吹绿棒子,或是蹲树下面佯装玩酷跑。等你发 现他们的时候,你早就被他们狗眼扫了几万遍了。你再耐心一点,会发现他们隔段时间就会拿出对讲机快速地讲几句话。为啥用对讲机不用微信发语音?就为了不留 下任何证据,就算真出事了,炮子也容易脱身。方方面面都体现了炮子过人的职业智慧,让人不得不服。
     然后是赌。小赌基本不用望风,因为抓 进去也就罚个钱的事,有关系的话这事儿还能打个折,顶多就是拘留,权当在里面放空身心。真正需要望风的是那种大赌场。哥的老家有座山上曾经就有个大赌场, 现在端没被端掉不知道。这种规模的赌场不像那些小发廊,十来个炮子就够把一条街给盯住了,他需要的是一个加强连的炮子,也就是说约莫两百号人左右。一部分 兵力负责团团守在山的主要进出口,隔段时间便互相发信号确认安全,一部分兵力则隐蔽在附近公安局派出所的附近,一有风吹草动就对讲机通报。
     给发廊望风的炮子一般是500一天,也有按营业额抽水的。给赌场望风的炮子比较高端,因为危险性相对大一点,一般是800一天。

4、招聘
     KTV作为最接地气的娱乐场所,其实内部人员流动性非常大。一家KTV的生意好不好,除了看硬件,服务质量也是一个绝对不容忽视的因素,而小妹的质量在服 务这个环节里面占了很大的比重。就算你各方面关系再到位,如果50个小妹里面,有一半都是负分树墩子,那离关门喝西北风就不远了。所以KTV除了需要安排 专业老师给小妹做培训,还得保持小妹队伍常年保持一个奋发向上的精神面貌。对不服管理的、身材走样的、服务不到位的、挑拨离间的会坚决让她走人,同时引进 新鲜血液保持队伍的竞争力。
     说到引进人,那要如何引进呢?总不能去58同城、前程无忧那些破逼网站的挂个招聘吧?效果不好还容易惹上一 身骚。也有一些KTV去公交车站、公厕、网吧贴那种小广告的,但其实效果都差强人意。作为KTV的老板,那也是有经营头脑的,本着专业的人做专业的事这个 经营理念,果断地将招聘外包给了炮子们。业内把这种业务叫做RPO(Recruitment Process Outsourcing)。
     一 来炮子常年在社会走动,接触的都是三教九流的人,人脉和消息比一般人灵通,接触的女人档次自然也比较低,招起人来比KTV里边那些人是方便得多了。比如前 面说到的给小发廊望风的炮子,接触的就是这部分人群。通过这些人在中间的运作,常年保持着小发廊妹子和KTV妹子之间的双向流通。
     这个岗位因为是按人头提成的,具体提成每个KTV都差很多,所以目前还不是炮子们的全职工作,大部分时候是作为炮子的一种兼职。


     说了这么多,大家应该对炮子的生存方式有了一个大概的了解。有些哥没点到的,你可以接着补充。希望通过这番介绍,让刚断奶的大学狗能多条创业的思路,让天台上的赌狗和高中狗能多点活下去的希望。

     人生苦短,且炮且珍惜。

posted @ 2015-09-15 15:51 朱杰兵 阅读(265) | 评论 (0)编辑 收藏

当列需要重复项合并时,列的properties设置里把print repeated values 勾选去掉。
然后在外层添加一个frame,把textfiled copy 到frame下面去,边框线再调节一下,就ok了
如果和其它列边框线显示有误差,则把其它列也添加一个frame

posted @ 2015-08-28 10:26 朱杰兵 阅读(152) | 评论 (0)编辑 收藏

settings 里面找saved data   再clean all

posted @ 2015-08-12 17:07 朱杰兵 阅读(92) | 评论 (0)编辑 收藏

Aug 4, 2015 5:15:16 PM org.zkoss.zk.au.http.AuDynaMediar service:141
SEVERE: Failed to load media, /view/z_itx/iW4Q76/ctf/0/jzbz/report/jasper/crew_overseas_detail.html
>>net.sf.jasperreports.engine.util.JRFontNotFoundException: Font '宋体' is not available to the JVM. See the Javadoc for more details.
>>    at net.sf.jasperreports.engine.util.JRFontUtil.checkAwtFont(JRFontUtil.java:358)
>>    at net.sf.jasperreports.engine.util.JRStyledText.getAwtAttributedString(JRStyledText.java:225)
>>    at net.sf.jasperreports.engine.fill.TextMeasurer.measure(TextMeasurer.java:326)
>>    at net.sf.jasperreports.engine.fill.JRFillTextElement.chopTextElement(JRFillTextElement.java:1151)
>>    at net.sf.jasperreports.engine.fill.JRFillTextField.prepare(JRFillTextField.java:554)
>>...

posted @ 2015-08-04 17:16 朱杰兵 阅读(199) | 评论 (0)编辑 收藏

     摘要: 1.alt+/提示失效 解决办法:window——>preferences 2.只要输入代码就自动提示首先打开Eclipse开发软件,然后在工具栏的【Window】,点击后找到弹出列表中的【Preferences】选项,然后点击这个选项现在弹出的窗口就是JAVA开发人员常见的设置窗口了,我们依次点开【JAVA】>>>【Editor】>>&...  阅读全文

posted @ 2015-07-28 15:01 朱杰兵 阅读(168) | 评论 (0)编辑 收藏

     摘要: -Xms256m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=1024m-Xms512m -Xmx512m -XX:PermSize=256M -XX:MaxPermSize=256m-Xms256m -Xmx1024m -XX:PermSize=256M -XX:MaxPermSize=102...  阅读全文

posted @ 2015-07-27 13:56 朱杰兵 阅读(147) | 评论 (0)编辑 收藏

help---->myeclipse  configuration  center ---->software----->add  site--->
name:svn
url:http://subclipse.tigris.org/update_1.6.x/

posted @ 2015-07-23 23:28 朱杰兵 阅读(153) | 评论 (0)编辑 收藏

本文基于 Eclipse Luna 版本(eclipse-java-luna-SR1-win32-x86_64)。最新版的 Eclipse 默认支持 cvs、maven 甚至 git,却不支持 svn。
        1. 去官网选择你感兴趣的 Eclipse Subversive 插件压缩包 下载。作者下载的最新 Subversive-2.0.1.I20140907-1700.zip(可以去官网下载,也可以去作者的 csdn 资源里下载最新Eclipse Subversive插件Subversive-2.0.1.I20140907-1700);
        2. 启动 Eclipse,菜单栏里选择 Help 
        -> Help 对话框里选择 Install New Software... 
        -> 在弹出的 Available Software 对话框里点击 Work with: 输入框右侧的 Add... 按钮 
        -> 在弹出的 Add Repository 对话框里,Name 输入 Subversive;然后点击 Location 输入框右侧的 Archive... 按钮,找到你刚才下载的 Subversive-2.0.1.I20140907-1700.zip,点击 OK 按钮以关闭 Add Repository 对话框
选择 Subversive SVN Team Provider 一项
        ->  回到 Available Software 对话框,选择你感兴趣的 Subversive 项目(如果你只需要其 SVN 功能,只需选择 Subversive SVN Team Provider 一项即可,这是其核心功能)
        -> 点击 Available Software 对话框的 Next > 按钮,进入 Install Details 对话框
进入 Install Details 对话框
        -> 点击 Install Details 对话框的 Next > 按钮,进入 Review Licenses 对话框
进入 Review Licenses 对话框
        -> Review Licenses 对话框中选择 I accept the terms of the license agreement 选项,然后点击 Finish 按钮开始安装 SVN 插件
        -> 安装结束以后问你是否重启 Eclipse 以使安装生效,点击 Yes 按钮重启 Eclipse
        3. 重启 Eclipse 之后,Package Explorer 视图中选择右键菜单栏里的 Import... 选项,弹出的 Import 对话框中增加了 SVN 选项,证明 SVN 插件安装成功:
svn插件安装成功
        4. Package Explorer 视图中选择右键菜单栏里的 Import...
        -> SVN
        -> Project from SVN,点击 Next 按钮,
        这时候会弹出 Install Connectors,让你在线安装 SVN 连接器:
Install Connectors
        -> 选择 SVN Kit 1.8.6,点击 Finish 按钮,弹出安装选项窗口:
安装选项窗口
        -> 直接点击 Next 按钮,进入 Review 将要安装项目窗口
        -> 点击 Next 按钮,进入 Review Licenses 窗口
        -> 选择同意,点击 Finish 按钮开始安装(服务器在国外,如果超时重新尝试安装几次;而且还可能会弹出安全警告对话框,不用管它,点击 OK 继续)
        -> 安装结束以后问你是否重启 Eclipse 以使安装生效,点击 Yes 按钮重启 Eclipse
        5. 重启 Eclipse 之后,菜单栏选择 Help -> 选中 Installation Details,弹出的对话框中多出来 SVN Connectors 和 SVNKit 两项,证明安装成功:
SVN Connectors安装成功
        6. Package Explorer 视图中选择右键菜单栏里的 Import...
        -> SVN
        -> Project from SVN,点击 Next 按钮,弹出 Checkout from SVN 会话框
        -> URL 输入你的 svn 资源地址,User、Password 分别输入你的用户名和密码,然后选中 Save authentication,点击 Next
        然后找到你的项目,你就可以在原有版本基础上开发新功能了:
开发新项目
        1 - 3 步是安装 svn 插件,4 - 6 步是安装 svn 连接器。相对老版本的 svn 插件,新版本的必须另外安装连接器,而且还必须在线安装。在线安装不靠谱呢,需要远程下载,因为远程服务器在国外,有时需要重复安装几次才能成功。这样看 来,我还是喜欢老版本的 SVN 插件。

posted @ 2015-07-23 23:22 朱杰兵 阅读(252) | 评论 (0)编辑 收藏

当form只有一个输入框时,回车会默认提交,可以新增一个隐藏的输入框,就可以避免掉回车提交发生

posted @ 2015-07-17 11:36 朱杰兵 阅读(92) | 评论 (0)编辑 收藏

TreeMap<String, String> map = new TreeMap<String, String>(new Comparator<Object>(){  
              
            
              
           public int compare(Object o1,Object  o2) { 
               return 1;
           }     
       });  
        map.put("1", "erer");
        map.put("200", "erer");
        map.put("36", "erer");
        map.put("4", "erer");
        map.put("5", "erer");
        map.put("6", "erer");
        
        
        System.out.println(map);
            } 


posted @ 2015-07-17 11:35 朱杰兵 阅读(444) | 评论 (0)编辑 收藏

clean install -Pdev tomcat:run -Dmaven.tomcat.port=9090

clean tomcat:run

posted @ 2015-07-15 11:17 朱杰兵 阅读(145) | 评论 (0)编辑 收藏

全部一样的重复行取一

posted @ 2015-07-09 09:59 朱杰兵 阅读(129) | 评论 (0)编辑 收藏

var myObject = {   a: {     one: 1,      two: 2,      three: 3   },    b: [1,2,3] }; 
var recursiveEncoded = $.param(myObject);
var recursiveDecoded = decodeURIComponent($.param(myObject));//转成中文

posted @ 2015-07-07 17:32 朱杰兵 阅读(131) | 评论 (0)编辑 收藏

前台:

使用encodeURI()两次转码

var param = "中文";

get方式提交

var url = "aa.html?param="+ 

encodeURI(encodeURI(param));

后台:

String problem = new String(URLDecoder.decode(request
    .getParameter("param"), "utf-8"));

这样转码过后,输出来的值就不会出现乱码了。

posted @ 2015-07-07 17:29 朱杰兵 阅读(116) | 评论 (0)编辑 收藏

  dos命令进入文件夹
jar cvf text.jar *

posted @ 2015-06-16 10:51 朱杰兵 阅读(196) | 评论 (0)编辑 收藏

在myeclipse中点击 deploy 按钮,在弹出的Project Deployments筐中看不到刚导入的项目,无法部署!

  在以前的eclipse或者maven转成eclipse的项目的时候,导入myeclipse中,点击部署找不到项目。

  解决办法:右键点击项目名称->myeclipse->Add Web Project Capilities...,这样就可以deployment了。

posted @ 2015-06-14 17:49 朱杰兵 阅读(208) | 评论 (0)编辑 收藏

1.创建Maven项目:
点击“File”菜单,或者通过工具栏的“New”创建Project,如下图所示:



选择Maven-》Maven Project,弹出向导对话框,如下图所示:



选中Create a simple project……复选框,其它的设置不变,并点击Next,输入maven项目必须的信息(groupId,artifactid,version),如下图所示:



这里需要选择Packaging,web项目一般选择war即可。点击Finish,完成项目创建,下图为创建的项目结构(项目名称为:sample-webapp):



2.配置web项目:
右键点击sample-webapp项目,依次点击Properties-》Project Facets-》Convert to faceted form… ,如下图所示:



勾选Dynamic Web Module,并选择版本(这里使用2.5,由于3.0版本需要tomcat7),如下图所示:



点击OK,此时,项目结构树增加了WebContent文件夹,如下图所示:



将WebContent下的WEB-INF、META-INF文件夹copy到src/main/webapp目录下,并且删除WebContent目录,完成之后,如下图所示:



右键点击sample-webapp项目,依次点击Properties-》Deployment Assembly,如下图所示:



此时,通过Remove按钮删除/src/test/java、/src/test/resources、/WebContent,并且通过Add添加webapp与maven依赖,如下图所示:









首先Add-》Folder,选择webapp目录并Finish,再选择Java Build Path Entries-》Maven Dependencies
完成之后,如下图所示:



3.部署web项目:
添加tomcat server,并部署web项目,这里不描述,与非maven项目基本相同。





















posted @ 2015-06-04 11:29 朱杰兵 阅读(204) | 评论 (0)编辑 收藏

不可重复读

不可重复读的重点是修改:

同样的条件, 你读取过的数据, 再次读取出来发现值不一样了

例子:

在事务1中,Mary 读取了自己的工资为1000,操作并没有完成 

Java代码  收藏代码
  1. con1 = getConnection();  
  2. select salary from employee empId ="Mary";  


在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务. 
Java代码  收藏代码
  1. con2 = getConnection();  
  2. update employee set salary = 2000;  
  3. con2.commit();  


在事务1中,Mary 再次读取自己的工资时,工资变为了2000 
Java代码  收藏代码
  1. //con1  
  2. select salary from employee empId ="Mary";  


在一个事务中前后两次读取的结果并不致,导致了不可重复读。


幻读

幻读的重点在于新增或者删除

同样的条件, 第1次和第2次读出来的记录数不一样

例子:

目前工资为1000的员工有10人。 
事务1,读取所有工资为1000的员工。 

Java代码  收藏代码
  1. con1 = getConnection();  
  2. Select * from employee where salary =1000;  
共读取10条记录 

这时另一个事务向employee表插入了一条员工记录,工资也为1000 
Java代码  收藏代码
  1. con2 = getConnection();  
  2. Insert into employee(empId,salary) values("Lili",1000);  
  3. con2.commit();  


事务1再次读取所有工资为1000的员工 
Java代码  收藏代码
  1. //con1  
  2. select * from employee where salary =1000;  


共读取到了11条记录,这就产生了幻像读。

posted @ 2015-06-02 09:11 朱杰兵 阅读(212) | 评论 (0)编辑 收藏

对于处于持久层的对象因为通过delete而删除的情况,其实内存中还是存在此对象的id否则就不可能会出现在同一个事务中当一个对象呗删除之后使用saveOrUpdate()方法去处理的时候会报错的情况了。  

①.对于刚创建的一个对象,如果session中和数据库中都不存在该对象,那么该对象就是瞬时对象(Transient)

②.瞬时对象调用save方法,或者离线对象调用update方法可以使该对象变成持久化对象,如果对象是持久化对象时,那么对该对象的任何修改,都会在提交事务时才会与之进行比较,如果不同,则发送一条update语句,否则就不会发送语句

③.离线对象就是,数据库存在该对象,但是该对象又没有被session所托管

posted @ 2015-05-19 16:00 朱杰兵 阅读(76) | 评论 (0)编辑 收藏

Spring Web MVC 处理Http请求的大致过程: 一旦Http请求到来,DispatcherSevlet将负责将请求分发。DispatcherServlet可以认为是Spring提供的前端控制器,所有的请求都有经过它来统一分发。 在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。HandlerMapping是这样一种对象,它能够完成客户请求到Controller之间的映射。在Struts中,这种映射是通过struts-config.xml文件完成的。其中,Spring为Controller接口提供了若干实现,例如Spring默认使用的BeanNameUrlHandlerMapping。还有,SimpleUrlHandlerMapping,CommonsPathMapHandlerMapping。 Spring Controller将处理来自DispatcherServlet的请求。Spring的Controller类似于struts的Action,能够接受HttpServletRequest和HttpServletResponse。Spring为Controller接口提供了若干实现类,位于org.springframework.web.servlet.mvc包中。由于Controller需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。Controller将处理客户请求,这和Struts Action 扮演的角色是一致的。 一旦Controller处理完客户请求,则返回ModelAndView对象给DispatcherServlet前端控制器。ModelAndView中包含了模型(Model)和视图(View)。从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观角度考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型和视图。前端控制器返回的视图可以是视图的逻辑名,或者实现了View接口的对象。View对象能够渲染客户响应结果。其中,ModelAndView中的模型能够供渲染View时使用。借助于Map对象能够存储模型。 如果ModelAndView返回的视图只是逻辑名,则需要借助Spring提供的视图解析器(ViewResoler)在Web应用中查找View对象,从而将响应结果渲染给客户。 DispatcherServlet将View对象渲染出的结果返回个客户。

posted @ 2015-05-19 15:23 朱杰兵 阅读(314) | 评论 (0)编辑 收藏

方法/步骤

  1. 在系统变量里点击新建,变量名填写JAVA_HOME,变量值填写JDK的安装路径,在这里就填写“C:\Program Files\Java\jdk1.6.0_26”了。


  2. 在系统变量里点击新建变量名填写CLASSPATH,变量值填写“.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar”。注意不要忘记前面的点和中间的分号。


  3. 在系统变量里找到Path变量,这是系统自带的,不用新建。双击Path,由于原来的变量值已经存在,故应在已有的变量后加上“;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin”。注意前面的分号。


  4. 至此,应有的环境变量已经配置完毕。验证的方法:在运行框中输入cmd命令,回车后输入java,按回车出现以下画面


  5. 5

    输入javac,按回车出现以下画面,则表示设置成功。



posted @ 2015-05-12 10:52 朱杰兵 阅读(105) | 评论 (0)编辑 收藏

左外连接包含left join左表所有行,如果左表中某行在右表没有匹配,则结果中对应行右表的部分全部为空(NULL).

注:此时我们不能说结果的行数等于左表数据的行数。当然此处查询结果的行数等于左表数据的行数,因为左右两表此时为一对一关系。

**********************************************************************************
下面介绍一下当两表为多对多的时候我们该如何建表以及些SQL语句。

新建三表:

表A:  student 截图如下:

SQL多表连接查询

表B:  course 截图如下:

SQL多表连接查询

表C:  student_course 截图如下:

SQL多表连接查询

一个学生可以选择多门课程,一门课程可以被多个学生选择,因此学生表student和课程表course之间是多对多的关系。

当两表为多对多关系的时候,我们需要建立一个中间表student_course,中间表至少要有两表的主键,当然还可以有别的内容。

SQL 语句:select s.Name,C.Cname from student_course as sc left join student as s on s.Sno=sc.Sno left join course as c on c.Cno=sc.Cno

执行结果:

SQL多表连接查询

此条SQL执行的结果是学生选课的情况。

posted @ 2015-05-08 15:27 朱杰兵 阅读(106) | 评论 (0)编辑 收藏

boolean  1 字节
char 2 字节

整数类型 byte 1 字节
short 2 字节
int 4 字节
long 8 字节
浮点类型
float 4 字节
double 8 字节


java中,只要是字符,不管是数字还是英文还是汉字,都占两个字节,都是一个char。

java一个汉字占几个字节


在java中占两个字节,用char类型表示,因为是Unicode编码,
ps utf-8 的汉字占3个字节 gbk 是两个
看编码方式:utf-8码的中文都是3字节的,而 gbk/gbk18030 是2字节的。



posted @ 2015-05-05 16:35 朱杰兵 阅读(95) | 评论 (0)编辑 收藏

1.使用(String)转换,要注意类型不一致时会报类型转换异常CalssCastException,                  如果object是null的话,返回的也是null .    ((String)object == null)   ----->true
2.使用.toString(),要注意object为null的时候,会报空指针异常
3.String.valueOf(),源码是
public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); }
如果object为null的时候,返回"null"字符串,却避免了抛出空指针异常

posted @ 2015-04-28 16:19 朱杰兵 阅读(134) | 评论 (0)编辑 收藏

package cn.mysteel.wms.user.web;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;

public class Test
{

    public static void main(String[] args)
    {
        List<String> list = new ArrayList<String>();
        list.add("朱杰兵");
        list.add("zhujiebing");
        list.add("zhujiebing");
        list.add("22222");
        list.add("22222");
        
        List<String> newList = new ArrayList<String>();
        
        //第一种方式用set去重
        /*Set<String> set = new HashSet<String>();
        
        for(String str : list)
        {
            if(set.add(str))
            {
                newList.add(str);
            }
        }
        
        */
        
        
        //第二种方式用linkedhashset去重
        newList = new ArrayList<String>(new LinkedHashSet<String>(list));
        
        for(String str2 : newList)
        {
            System.out.println(str2);
        }
    }
}

posted @ 2015-04-16 15:49 朱杰兵 阅读(128) | 评论 (0)编辑 收藏

List<UserOutPlanItem> itemList = info.getItemList();//需要去重汇总的list
        
        List<UserOutAuditDTO> summary = new ArrayList<UserOutAuditDTO>();;
       
         //汇总到的map value为总数量和总重量
        Map<String, String> map = new HashMap<String, String>();

        if (ObjectUtils.notEmpty(itemList))
        {
            for (UserOutPlanItem item : itemList)
            {
                //这六个字段相同则汇成一条,并且把重量和数量累加
                String key = item.getBreedName()+"_"+item.getSpecName()+"_"+
                        item.getMaterialName()+"_"+item.getFactoryName()+"_"+
                        item.getNumUtil()+"_"+item.getWeightUtil();

                String num_weight = map.get(key);
                //当键不存在的时候汇一条
                if (StringUtils.isNull(num_weight))
                {
                    map.put(key, item.getNum()+"_"+item.getWeight());
                }
                //当key已经存在了,则累加
                else
                {
                    String[] arr = num_weight.split("_");
                    String thisNum = MoneyCalculateUtils.add(arr[0], item.getNum(), 0);
                    String thisWeight = MoneyCalculateUtils.add(arr[1], item.getWeight(), 4);
                    map.put(key, thisNum + "_" + thisWeight);
                }
            }
        }

        //重新解析map,把数据封装到summary
        if (ObjectUtils.notEmpty(map))
        {
            Set<String> ketSet = map.keySet();
            for (String str : ketSet)
            {
                String arr[] = str.split("_");
                UserOutAuditDTO dto = new UserOutAuditDTO();
                dto.setBreedName(arr[0]);
                dto.setSpec(arr[1]);
                dto.setMaterial(arr[2]);
                dto.setFactory(arr[3]);
                dto.setNumUtil(arr[4]);
                dto.setWeightUtil(arr[5]);
                
                String num_weight = map.get(str);
                String arr2[] = num_weight.split("_");
                dto.setSumNum(arr2[0]);
                dto.setSumWeight(arr2[1]);
                summary.add(dto);
            }
        }

posted @ 2015-04-16 15:22 朱杰兵 阅读(3062) | 评论 (0)编辑 收藏

Servlet用来控制流程跳转

posted @ 2015-04-16 10:09 朱杰兵 阅读(128) | 评论 (0)编辑 收藏

1.匹配一位小数 <input type="text" onkeyup="value=value.replace(/[^\d\.]/g, '').replace(/(\.\d).*/g, '$1')" value=""/>
在第二个replace 用 \d{2}  小数点后两位

2.匹配整数
.replace(/[^\d\\]/g,'');


posted @ 2015-04-13 21:22 朱杰兵 阅读(696) | 评论 (0)编辑 收藏

1.SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
2.
采用https的服务器必 须从CA (Certificate Authority)申请一个用于证明服务器用途类型的证书。该证书只有用于对应的服务器的时候,客户端才信任此主机。所以所有的银行系统网站,关键部分 应用都是https 的。客户通过信任该证书,从而信任了该主机。其实这样做效率很低,但是银行更侧重安全。



1. 一般意义上的https,就是服务器有一个证书。
a) 主要目的是保证服务器就是他声称的服务器,这个跟第一点一样。
b)服务端客户端之间的所有通讯,都是加密的。
i. 具体讲,是客户端产生一个对称的密钥,通过服务器的证书来交换密钥,即一般意义上的握手过程。
ii. 接下来所有的信息往来就都是加密的。第三方即使截获,也没有任何意义,因为他没有密钥,当然篡改也就没有什么意义了。
2. 少许对客户端有要求的情况下,会要求客户端也必须有一个证书。
a) 这里客户端证书,其实就类似表示个人信息的时候,除了用户名/密码,还有一个CA 认证过的身份。因为个人证书一般来说是别人无法模拟的,所有这样能够更深的确认自己的身份。
b) 目前大多数个人银行的专业版是这种做法,具体证书可能是拿U盘(即U盾)作为一个备份的载体。

应用于安全敏感通讯  例如交易支付

posted @ 2015-03-26 08:53 朱杰兵 阅读(225) | 评论 (0)编辑 收藏

sql

两张关联表,删除主表中已经在副表中没有的信息
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

删除重复记录
delete from tablename where id not in (select max(id) from tablename group by col1,col2,...)

posted @ 2015-03-12 13:53 朱杰兵 阅读(84) | 评论 (0)编辑 收藏